@workflow/cli 5.0.0-beta.27 → 5.0.0-beta.29
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/base.d.ts.map +1 -1
- package/dist/base.js +8 -2
- package/dist/commands/cancel.d.ts.map +1 -1
- package/dist/commands/cancel.js +52 -9
- package/dist/commands/inspect.d.ts +2 -0
- package/dist/commands/inspect.d.ts.map +1 -1
- package/dist/commands/inspect.js +23 -3
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +8 -3
- package/dist/lib/config/types.d.ts +4 -0
- package/dist/lib/config/types.d.ts.map +1 -1
- package/dist/lib/config/types.js +1 -1
- package/dist/lib/inspect/env.d.ts +1 -1
- package/dist/lib/inspect/env.js +2 -2
- package/dist/lib/inspect/errors.d.ts +3 -0
- package/dist/lib/inspect/errors.d.ts.map +1 -0
- package/dist/lib/inspect/errors.js +27 -0
- package/dist/lib/inspect/output.d.ts +2 -2
- package/dist/lib/inspect/output.d.ts.map +1 -1
- package/dist/lib/inspect/output.js +253 -130
- package/dist/lib/inspect/output.test.js +403 -3
- package/dist/lib/inspect/pagination.d.ts +10 -1
- package/dist/lib/inspect/pagination.d.ts.map +1 -1
- package/dist/lib/inspect/pagination.js +20 -4
- package/dist/lib/inspect/run.d.ts.map +1 -1
- package/dist/lib/inspect/run.js +32 -9
- package/dist/lib/inspect/setup.d.ts.map +1 -1
- package/dist/lib/inspect/setup.js +42 -6
- package/dist/lib/inspect/time-window.d.ts +28 -0
- package/dist/lib/inspect/time-window.d.ts.map +1 -0
- package/dist/lib/inspect/time-window.js +61 -0
- package/dist/lib/inspect/time-window.test.d.ts +2 -0
- package/dist/lib/inspect/time-window.test.d.ts.map +1 -0
- package/dist/lib/inspect/time-window.test.js +58 -0
- package/package.json +9 -9
|
@@ -6,7 +6,9 @@ import chalk from 'chalk';
|
|
|
6
6
|
import { formatDistance } from 'date-fns';
|
|
7
7
|
import Table from 'easy-table';
|
|
8
8
|
import { logger } from '../config/log.js';
|
|
9
|
+
import { getObservabilityUpgradeRequiredMessage, isObservabilityUpgradeRequiredError, } from './errors.js';
|
|
9
10
|
import { hydrateResourceIO, isEncryptedRef, isExpiredRef, } from './hydration.js';
|
|
11
|
+
import { resolveTimeWindow } from './time-window.js';
|
|
10
12
|
/**
|
|
11
13
|
* Create an EncryptionKeyResolver from a World instance.
|
|
12
14
|
* Returns null if decrypt is false — encrypted data will show as a placeholder.
|
|
@@ -31,7 +33,7 @@ function createResolver(world, decrypt) {
|
|
|
31
33
|
return cached;
|
|
32
34
|
};
|
|
33
35
|
}
|
|
34
|
-
import { setupListPagination } from './pagination.js';
|
|
36
|
+
import { setupListPagination, } from './pagination.js';
|
|
35
37
|
import { streamToConsole } from './stream.js';
|
|
36
38
|
import { formatISODate, formatStatus as formatStatusAbbrev, getDisplaySettings, getTerminalWidth, isCI, } from './terminal-utils.js';
|
|
37
39
|
const DEFAULT_PAGE_SIZE = 20;
|
|
@@ -84,6 +86,7 @@ const STATUS_COLORS = {
|
|
|
84
86
|
failed: chalk.red,
|
|
85
87
|
cancelled: chalk.strikethrough.yellow,
|
|
86
88
|
pending: chalk.blue,
|
|
89
|
+
waiting: chalk.blue,
|
|
87
90
|
};
|
|
88
91
|
const isStreamId = (value) => {
|
|
89
92
|
return typeof value === 'string' && value.startsWith('strm_');
|
|
@@ -96,6 +99,7 @@ const showStatusLegend = () => {
|
|
|
96
99
|
'failed',
|
|
97
100
|
'cancelled',
|
|
98
101
|
'pending',
|
|
102
|
+
'waiting',
|
|
99
103
|
];
|
|
100
104
|
const legendItems = statuses.map((status) => {
|
|
101
105
|
const colorFunc = STATUS_COLORS[status];
|
|
@@ -133,11 +137,23 @@ const extractErrorMessage = (err) => {
|
|
|
133
137
|
}
|
|
134
138
|
return undefined;
|
|
135
139
|
};
|
|
140
|
+
const getPageInfo = (result) => {
|
|
141
|
+
if (typeof result !== 'object' ||
|
|
142
|
+
result === null ||
|
|
143
|
+
!('pageInfo' in result)) {
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
return result.pageInfo;
|
|
147
|
+
};
|
|
136
148
|
const handleApiError = (error, backend) => {
|
|
137
149
|
// First check for Vercel access errors
|
|
138
150
|
if (checkAndHandleVercelAccessError(error, backend)) {
|
|
139
151
|
return true;
|
|
140
152
|
}
|
|
153
|
+
if (isObservabilityUpgradeRequiredError(error)) {
|
|
154
|
+
logger.error(getObservabilityUpgradeRequiredMessage());
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
141
157
|
// Handle other HTTP errors
|
|
142
158
|
if (error && typeof error === 'object') {
|
|
143
159
|
const err = error;
|
|
@@ -166,6 +182,7 @@ const getStatusText = (status) => {
|
|
|
166
182
|
const statusTexts = {
|
|
167
183
|
400: 'Bad Request',
|
|
168
184
|
401: 'Unauthorized',
|
|
185
|
+
402: 'Payment Required',
|
|
169
186
|
403: 'Forbidden',
|
|
170
187
|
404: 'Not Found',
|
|
171
188
|
429: 'Too Many Requests',
|
|
@@ -229,7 +246,7 @@ export const formatTableValue = (prop, value, opts = {}, displaySettings, item)
|
|
|
229
246
|
}
|
|
230
247
|
if (prop === 'status') {
|
|
231
248
|
const status = value;
|
|
232
|
-
const colorFunc = STATUS_COLORS[status];
|
|
249
|
+
const colorFunc = STATUS_COLORS[status] ?? ((formatted) => formatted);
|
|
233
250
|
const formattedStatus = displaySettings?.abbreviateStatus
|
|
234
251
|
? formatStatusAbbrev(status, true)
|
|
235
252
|
: status;
|
|
@@ -305,6 +322,14 @@ const showJson = (data) => {
|
|
|
305
322
|
const json = JSON.stringify(data, null, 2);
|
|
306
323
|
process.stdout.write(`${json}\n`);
|
|
307
324
|
};
|
|
325
|
+
const showJsonPage = (page) => {
|
|
326
|
+
showJson({
|
|
327
|
+
data: page.data,
|
|
328
|
+
cursor: page.cursor,
|
|
329
|
+
hasMore: page.hasMore,
|
|
330
|
+
...(page.pageInfo ? { pageInfo: page.pageInfo } : {}),
|
|
331
|
+
});
|
|
332
|
+
};
|
|
308
333
|
/**
|
|
309
334
|
* In tables, we want to show a shorter timestamp, YYYY-MM-DD HH:MM:SS
|
|
310
335
|
*/
|
|
@@ -418,31 +443,81 @@ const inlineFormatIO = (io, topLevel = true) => {
|
|
|
418
443
|
}
|
|
419
444
|
return value;
|
|
420
445
|
};
|
|
446
|
+
/**
|
|
447
|
+
* List views surface metadata only. When the active backend exposes the
|
|
448
|
+
* optional `world.analytics` read namespace we read list pages from it
|
|
449
|
+
* (metadata-only — no payload resolution); otherwise we fall back to the
|
|
450
|
+
* runtime storage APIs with `resolveData: 'none'`.
|
|
451
|
+
*
|
|
452
|
+
* `--withData` forces the runtime path so payloads can be resolved into the
|
|
453
|
+
* table. It is deprecated for list views: view payloads per-resource with
|
|
454
|
+
* `workflow inspect <resource> <id>`.
|
|
455
|
+
*/
|
|
456
|
+
const warnWithDataDeprecatedForList = (singular) => {
|
|
457
|
+
logger.warn(`'--withData' is deprecated for list views and will be removed in a future release. Use 'workflow inspect ${singular} <id>' to view payloads for a single ${singular}.`);
|
|
458
|
+
};
|
|
421
459
|
export const listRuns = async (world, opts = {}) => {
|
|
422
460
|
const resolveKey = createResolver(world, opts?.decrypt ?? false);
|
|
423
461
|
if (opts.stepId || opts.runId) {
|
|
424
462
|
logger.warn('Filtering by step-id or run-id is not supported in list calls, ignoring filter.');
|
|
425
463
|
}
|
|
464
|
+
if (opts.withData) {
|
|
465
|
+
warnWithDataDeprecatedForList('run');
|
|
466
|
+
}
|
|
467
|
+
const useAnalytics = !opts.withData && Boolean(world.analytics);
|
|
426
468
|
const resolveData = opts.withData ? 'all' : 'none';
|
|
469
|
+
const status = opts.status;
|
|
470
|
+
// Resolve --since/--until into an explicit listing window. Only the
|
|
471
|
+
// analytics read path supports one; the runtime storage APIs have no time
|
|
472
|
+
// filter. Without the flags the backend applies its default window
|
|
473
|
+
// (trailing 24h on the Vercel backend).
|
|
474
|
+
const timeWindow = resolveTimeWindow(opts);
|
|
475
|
+
if (timeWindow && !useAnalytics) {
|
|
476
|
+
logger.warn('--since/--until require the analytics read path and are ignored by this backend.');
|
|
477
|
+
}
|
|
427
478
|
// Determine which props to show based on withData flag
|
|
428
479
|
const props = opts.withData
|
|
429
480
|
? WORKFLOW_RUN_LISTED_PROPS
|
|
430
481
|
: WORKFLOW_RUN_LISTED_PROPS.filter((prop) => !WORKFLOW_RUN_IO_PROPS.includes(prop));
|
|
482
|
+
const fetchRunsPage = async (cursor) => {
|
|
483
|
+
const pagination = {
|
|
484
|
+
sortOrder: opts.sort || 'desc',
|
|
485
|
+
cursor,
|
|
486
|
+
limit: opts.limit || DEFAULT_PAGE_SIZE,
|
|
487
|
+
};
|
|
488
|
+
if (useAnalytics && world.analytics) {
|
|
489
|
+
const runs = await world.analytics.runs.list({
|
|
490
|
+
workflowName: opts.workflowName,
|
|
491
|
+
status,
|
|
492
|
+
...(timeWindow ?? {}),
|
|
493
|
+
pagination,
|
|
494
|
+
});
|
|
495
|
+
return {
|
|
496
|
+
data: runs.data,
|
|
497
|
+
cursor: runs.cursor,
|
|
498
|
+
hasMore: runs.hasMore,
|
|
499
|
+
pageInfo: getPageInfo(runs),
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
const runs = await world.runs.list({
|
|
503
|
+
workflowName: opts.workflowName,
|
|
504
|
+
status,
|
|
505
|
+
pagination,
|
|
506
|
+
resolveData,
|
|
507
|
+
});
|
|
508
|
+
const data = await Promise.all(runs.data.map((r) => hydrateResourceIO(r, resolveKey)));
|
|
509
|
+
return {
|
|
510
|
+
data: data,
|
|
511
|
+
cursor: runs.cursor,
|
|
512
|
+
hasMore: runs.hasMore,
|
|
513
|
+
pageInfo: getPageInfo(runs),
|
|
514
|
+
};
|
|
515
|
+
};
|
|
431
516
|
// For JSON output, just fetch once and return
|
|
432
517
|
if (opts.json) {
|
|
433
518
|
try {
|
|
434
|
-
const
|
|
435
|
-
|
|
436
|
-
status: opts.status,
|
|
437
|
-
pagination: {
|
|
438
|
-
sortOrder: opts.sort || 'desc',
|
|
439
|
-
cursor: opts.cursor,
|
|
440
|
-
limit: opts.limit || DEFAULT_PAGE_SIZE,
|
|
441
|
-
},
|
|
442
|
-
resolveData,
|
|
443
|
-
});
|
|
444
|
-
const runsWithHydratedIO = await Promise.all(runs.data.map((r) => hydrateResourceIO(r, resolveKey)));
|
|
445
|
-
showJson({ ...runs, data: runsWithHydratedIO });
|
|
519
|
+
const page = await fetchRunsPage(opts.cursor);
|
|
520
|
+
showJsonPage(page);
|
|
446
521
|
return;
|
|
447
522
|
}
|
|
448
523
|
catch (error) {
|
|
@@ -457,21 +532,7 @@ export const listRuns = async (world, opts = {}) => {
|
|
|
457
532
|
interactive: opts.interactive,
|
|
458
533
|
fetchPage: async (cursor) => {
|
|
459
534
|
try {
|
|
460
|
-
|
|
461
|
-
workflowName: opts.workflowName,
|
|
462
|
-
status: opts.status,
|
|
463
|
-
pagination: {
|
|
464
|
-
sortOrder: opts.sort || 'desc',
|
|
465
|
-
cursor,
|
|
466
|
-
limit: opts.limit || DEFAULT_PAGE_SIZE,
|
|
467
|
-
},
|
|
468
|
-
resolveData,
|
|
469
|
-
});
|
|
470
|
-
return {
|
|
471
|
-
data: runs.data,
|
|
472
|
-
cursor: runs.cursor,
|
|
473
|
-
hasMore: runs.hasMore,
|
|
474
|
-
};
|
|
535
|
+
return await fetchRunsPage(cursor);
|
|
475
536
|
}
|
|
476
537
|
catch (error) {
|
|
477
538
|
if (handleApiError(error, opts.backend)) {
|
|
@@ -481,8 +542,7 @@ export const listRuns = async (world, opts = {}) => {
|
|
|
481
542
|
}
|
|
482
543
|
},
|
|
483
544
|
displayPage: async (runs) => {
|
|
484
|
-
|
|
485
|
-
logger.log(showTable(runsWithHydratedIO, props, opts));
|
|
545
|
+
logger.log(showTable(runs, props, opts));
|
|
486
546
|
},
|
|
487
547
|
});
|
|
488
548
|
};
|
|
@@ -547,26 +607,53 @@ export const listSteps = async (world, opts = {
|
|
|
547
607
|
logger.error('No run found.');
|
|
548
608
|
return;
|
|
549
609
|
}
|
|
610
|
+
if (opts.withData) {
|
|
611
|
+
warnWithDataDeprecatedForList('step');
|
|
612
|
+
}
|
|
613
|
+
const useAnalytics = !opts.withData && Boolean(world.analytics);
|
|
550
614
|
const resolveData = opts.withData ? 'all' : 'none';
|
|
551
615
|
// Determine which props to show based on withData flag
|
|
552
616
|
const props = opts.withData
|
|
553
617
|
? STEP_LISTED_PROPS
|
|
554
618
|
: STEP_LISTED_PROPS.filter((prop) => !STEP_IO_PROPS.includes(prop));
|
|
619
|
+
const fetchStepsPage = async (cursor) => {
|
|
620
|
+
logger.debug(`Fetching steps for run ${runId}`);
|
|
621
|
+
const pagination = {
|
|
622
|
+
sortOrder: opts.sort || 'desc',
|
|
623
|
+
cursor,
|
|
624
|
+
limit: opts.limit || DEFAULT_PAGE_SIZE,
|
|
625
|
+
};
|
|
626
|
+
if (useAnalytics && world.analytics) {
|
|
627
|
+
const steps = await world.analytics.steps.list({ runId, pagination });
|
|
628
|
+
const page = {
|
|
629
|
+
data: steps.data,
|
|
630
|
+
cursor: steps.cursor,
|
|
631
|
+
hasMore: steps.hasMore,
|
|
632
|
+
pageInfo: getPageInfo(steps),
|
|
633
|
+
};
|
|
634
|
+
if (cursor || page.data.length > 0 || page.hasMore) {
|
|
635
|
+
return page;
|
|
636
|
+
}
|
|
637
|
+
logger.debug(`No analytics steps found for run ${runId}; falling back to storage`);
|
|
638
|
+
}
|
|
639
|
+
const stepChunks = await world.steps.list({
|
|
640
|
+
runId,
|
|
641
|
+
pagination,
|
|
642
|
+
resolveData,
|
|
643
|
+
});
|
|
644
|
+
const data = await Promise.all(stepChunks.data.map((s) => hydrateResourceIO(s, resolveKey)));
|
|
645
|
+
return {
|
|
646
|
+
data: data,
|
|
647
|
+
cursor: stepChunks.cursor,
|
|
648
|
+
hasMore: stepChunks.hasMore,
|
|
649
|
+
pageInfo: getPageInfo(stepChunks),
|
|
650
|
+
};
|
|
651
|
+
};
|
|
555
652
|
// For JSON output, just fetch once and return
|
|
556
653
|
if (opts.json) {
|
|
557
|
-
logger.debug(`Fetching steps for run ${runId}`);
|
|
558
654
|
try {
|
|
559
|
-
const
|
|
560
|
-
|
|
561
|
-
pagination: {
|
|
562
|
-
sortOrder: opts.sort || 'desc',
|
|
563
|
-
cursor: opts.cursor,
|
|
564
|
-
limit: opts.limit || DEFAULT_PAGE_SIZE,
|
|
565
|
-
},
|
|
566
|
-
resolveData,
|
|
567
|
-
});
|
|
568
|
-
const stepsWithHydratedIO = await Promise.all(stepChunks.data.map((s) => hydrateResourceIO(s, resolveKey)));
|
|
569
|
-
showJson(stepsWithHydratedIO);
|
|
655
|
+
const page = await fetchStepsPage(opts.cursor);
|
|
656
|
+
showJson(page.data);
|
|
570
657
|
return;
|
|
571
658
|
}
|
|
572
659
|
catch (error) {
|
|
@@ -580,22 +667,8 @@ export const listSteps = async (world, opts = {
|
|
|
580
667
|
initialCursor: opts.cursor,
|
|
581
668
|
interactive: opts.interactive,
|
|
582
669
|
fetchPage: async (cursor) => {
|
|
583
|
-
logger.debug(`Fetching steps for run ${runId}`);
|
|
584
670
|
try {
|
|
585
|
-
|
|
586
|
-
runId,
|
|
587
|
-
pagination: {
|
|
588
|
-
sortOrder: opts.sort || 'desc',
|
|
589
|
-
cursor,
|
|
590
|
-
limit: opts.limit || DEFAULT_PAGE_SIZE,
|
|
591
|
-
},
|
|
592
|
-
resolveData,
|
|
593
|
-
});
|
|
594
|
-
return {
|
|
595
|
-
data: stepChunks.data,
|
|
596
|
-
cursor: stepChunks.cursor,
|
|
597
|
-
hasMore: stepChunks.hasMore,
|
|
598
|
-
};
|
|
671
|
+
return await fetchStepsPage(cursor);
|
|
599
672
|
}
|
|
600
673
|
catch (error) {
|
|
601
674
|
if (handleApiError(error, opts.backend)) {
|
|
@@ -605,8 +678,7 @@ export const listSteps = async (world, opts = {
|
|
|
605
678
|
}
|
|
606
679
|
},
|
|
607
680
|
displayPage: async (steps) => {
|
|
608
|
-
|
|
609
|
-
logger.log(showTable(stepsWithHydratedIO, props, opts));
|
|
681
|
+
logger.log(showTable(steps, props, opts));
|
|
610
682
|
showInspectInfoBox('step');
|
|
611
683
|
},
|
|
612
684
|
});
|
|
@@ -730,40 +802,60 @@ export const listEvents = async (world, opts = {}) => {
|
|
|
730
802
|
logger.error('No run found.');
|
|
731
803
|
return;
|
|
732
804
|
}
|
|
805
|
+
if (opts.withData) {
|
|
806
|
+
warnWithDataDeprecatedForList('event');
|
|
807
|
+
}
|
|
808
|
+
const useAnalytics = !opts.withData && Boolean(world.analytics);
|
|
733
809
|
const correlationIdFilter = opts.hookId || opts.stepId;
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
810
|
+
// Determine which props to show based on withData flag
|
|
811
|
+
const props = opts.withData
|
|
812
|
+
? EVENT_LISTED_PROPS
|
|
813
|
+
: EVENT_LISTED_PROPS.filter((prop) => !EVENT_IO_PROPS.includes(prop));
|
|
814
|
+
const fetchEventsPage = async (cursor) => {
|
|
815
|
+
logger.debug(`Fetching events for run ${runId}`);
|
|
816
|
+
const pagination = {
|
|
737
817
|
sortOrder: opts.sort || 'desc',
|
|
738
|
-
cursor
|
|
818
|
+
cursor,
|
|
739
819
|
limit: opts.limit || DEFAULT_PAGE_SIZE,
|
|
740
|
-
}
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
820
|
+
};
|
|
821
|
+
if (useAnalytics && world.analytics) {
|
|
822
|
+
const events = await world.analytics.events.list({
|
|
823
|
+
runId,
|
|
824
|
+
correlationId: correlationIdFilter,
|
|
825
|
+
pagination,
|
|
826
|
+
});
|
|
827
|
+
const page = {
|
|
828
|
+
data: events.data,
|
|
829
|
+
cursor: events.cursor,
|
|
830
|
+
hasMore: events.hasMore,
|
|
831
|
+
pageInfo: getPageInfo(events),
|
|
752
832
|
};
|
|
833
|
+
if (cursor || page.data.length > 0 || page.hasMore) {
|
|
834
|
+
return page;
|
|
835
|
+
}
|
|
836
|
+
logger.debug(`No analytics events found for run ${runId}; falling back to storage`);
|
|
753
837
|
}
|
|
754
|
-
|
|
838
|
+
const result = await world.events.list({
|
|
839
|
+
runId,
|
|
840
|
+
pagination,
|
|
841
|
+
resolveData: opts.withData ? 'all' : 'none',
|
|
842
|
+
});
|
|
843
|
+
const filtered = correlationIdFilter
|
|
844
|
+
? result.data.filter((e) => e.correlationId === correlationIdFilter)
|
|
845
|
+
: result.data;
|
|
846
|
+
const data = await Promise.all(filtered.map((e) => hydrateResourceIO(e, resolveKey)));
|
|
847
|
+
return {
|
|
848
|
+
data: data,
|
|
849
|
+
cursor: result.cursor,
|
|
850
|
+
hasMore: result.hasMore,
|
|
851
|
+
pageInfo: getPageInfo(result),
|
|
852
|
+
};
|
|
755
853
|
};
|
|
756
|
-
// Determine which props to show based on withData flag
|
|
757
|
-
const props = opts.withData
|
|
758
|
-
? EVENT_LISTED_PROPS
|
|
759
|
-
: EVENT_LISTED_PROPS.filter((prop) => !EVENT_IO_PROPS.includes(prop));
|
|
760
854
|
// For JSON output, just fetch once and return
|
|
761
855
|
if (opts.json) {
|
|
762
|
-
logger.debug(`Fetching events for run ${runId}`);
|
|
763
856
|
try {
|
|
764
|
-
const
|
|
765
|
-
|
|
766
|
-
showJson(hydratedEvents);
|
|
857
|
+
const page = await fetchEventsPage(opts.cursor);
|
|
858
|
+
showJson(page.data);
|
|
767
859
|
return;
|
|
768
860
|
}
|
|
769
861
|
catch (error) {
|
|
@@ -777,14 +869,8 @@ export const listEvents = async (world, opts = {}) => {
|
|
|
777
869
|
initialCursor: opts.cursor,
|
|
778
870
|
interactive: opts.interactive,
|
|
779
871
|
fetchPage: async (cursor) => {
|
|
780
|
-
logger.debug(`Fetching events for run ${runId}`);
|
|
781
872
|
try {
|
|
782
|
-
|
|
783
|
-
return {
|
|
784
|
-
data: events.data,
|
|
785
|
-
cursor: events.cursor,
|
|
786
|
-
hasMore: events.hasMore,
|
|
787
|
-
};
|
|
873
|
+
return await fetchEventsPage(cursor);
|
|
788
874
|
}
|
|
789
875
|
catch (error) {
|
|
790
876
|
if (handleApiError(error, opts.backend)) {
|
|
@@ -794,8 +880,7 @@ export const listEvents = async (world, opts = {}) => {
|
|
|
794
880
|
}
|
|
795
881
|
},
|
|
796
882
|
displayPage: async (events) => {
|
|
797
|
-
|
|
798
|
-
logger.log(showTable(hydratedEvents, props, opts));
|
|
883
|
+
logger.log(showTable(events, props, opts));
|
|
799
884
|
showInspectInfoBox('event');
|
|
800
885
|
},
|
|
801
886
|
});
|
|
@@ -810,26 +895,35 @@ export const listHooks = async (world, opts = {}) => {
|
|
|
810
895
|
}
|
|
811
896
|
const runId = opts.runId;
|
|
812
897
|
const resolveData = opts.withData ? 'all' : 'none';
|
|
813
|
-
//
|
|
814
|
-
|
|
898
|
+
// Hooks always read from the runtime storage API. Unlike runs/steps/events,
|
|
899
|
+
// the analytics read path omits `ownerId` (and the secret hook token used by
|
|
900
|
+
// resume/copy-token surfaces), so hook listing stays on the canonical APIs.
|
|
901
|
+
const fetchHooksPage = async (cursor) => {
|
|
815
902
|
if (!runId) {
|
|
816
903
|
logger.debug('Fetching all hooks');
|
|
817
904
|
}
|
|
818
905
|
else {
|
|
819
906
|
logger.debug(`Fetching hooks for run ${runId}`);
|
|
820
907
|
}
|
|
908
|
+
const pagination = {
|
|
909
|
+
sortOrder: opts.sort || 'desc',
|
|
910
|
+
cursor,
|
|
911
|
+
limit: opts.limit || DEFAULT_PAGE_SIZE,
|
|
912
|
+
};
|
|
913
|
+
const hooks = await world.hooks.list({ runId, pagination, resolveData });
|
|
914
|
+
const data = await Promise.all(hooks.data.map((h) => hydrateResourceIO(h, resolveKey)));
|
|
915
|
+
return {
|
|
916
|
+
data: data,
|
|
917
|
+
cursor: hooks.cursor,
|
|
918
|
+
hasMore: hooks.hasMore,
|
|
919
|
+
pageInfo: getPageInfo(hooks),
|
|
920
|
+
};
|
|
921
|
+
};
|
|
922
|
+
// For JSON output, just fetch once and return
|
|
923
|
+
if (opts.json) {
|
|
821
924
|
try {
|
|
822
|
-
const
|
|
823
|
-
|
|
824
|
-
pagination: {
|
|
825
|
-
sortOrder: opts.sort || 'desc',
|
|
826
|
-
cursor: opts.cursor,
|
|
827
|
-
limit: opts.limit || DEFAULT_PAGE_SIZE,
|
|
828
|
-
},
|
|
829
|
-
resolveData,
|
|
830
|
-
});
|
|
831
|
-
const hydratedHooks = await Promise.all(hooks.data.map((h) => hydrateResourceIO(h, resolveKey)));
|
|
832
|
-
showJson({ ...hooks, data: hydratedHooks });
|
|
925
|
+
const page = await fetchHooksPage(opts.cursor);
|
|
926
|
+
showJsonPage(page);
|
|
833
927
|
return;
|
|
834
928
|
}
|
|
835
929
|
catch (error) {
|
|
@@ -844,27 +938,8 @@ export const listHooks = async (world, opts = {}) => {
|
|
|
844
938
|
initialCursor: opts.cursor,
|
|
845
939
|
interactive: opts.interactive,
|
|
846
940
|
fetchPage: async (cursor) => {
|
|
847
|
-
if (!runId) {
|
|
848
|
-
logger.debug('Fetching all hooks');
|
|
849
|
-
}
|
|
850
|
-
else {
|
|
851
|
-
logger.debug(`Fetching hooks for run ${runId}`);
|
|
852
|
-
}
|
|
853
941
|
try {
|
|
854
|
-
|
|
855
|
-
runId,
|
|
856
|
-
pagination: {
|
|
857
|
-
sortOrder: opts.sort || 'desc',
|
|
858
|
-
cursor,
|
|
859
|
-
limit: opts.limit || DEFAULT_PAGE_SIZE,
|
|
860
|
-
},
|
|
861
|
-
resolveData,
|
|
862
|
-
});
|
|
863
|
-
return {
|
|
864
|
-
data: hooks.data,
|
|
865
|
-
cursor: hooks.cursor,
|
|
866
|
-
hasMore: hooks.hasMore,
|
|
867
|
-
};
|
|
942
|
+
return await fetchHooksPage(cursor);
|
|
868
943
|
}
|
|
869
944
|
catch (error) {
|
|
870
945
|
if (handleApiError(error, opts.backend)) {
|
|
@@ -874,8 +949,7 @@ export const listHooks = async (world, opts = {}) => {
|
|
|
874
949
|
}
|
|
875
950
|
},
|
|
876
951
|
displayPage: async (hooks) => {
|
|
877
|
-
|
|
878
|
-
logger.log(showTable(hydratedHooks, HOOK_LISTED_PROPS, opts));
|
|
952
|
+
logger.log(showTable(hooks, HOOK_LISTED_PROPS, opts));
|
|
879
953
|
showInspectInfoBox('hook');
|
|
880
954
|
},
|
|
881
955
|
});
|
|
@@ -908,6 +982,42 @@ export const showHook = async (world, hookId, opts = {}) => {
|
|
|
908
982
|
throw error;
|
|
909
983
|
}
|
|
910
984
|
};
|
|
985
|
+
/**
|
|
986
|
+
* List waits/sleeps via the analytics read path. The analytics wait shape is
|
|
987
|
+
* keyed by `waitId`/`status` rather than the `correlationId`/`eventId` columns
|
|
988
|
+
* reconstructed from the event stream in the fallback path.
|
|
989
|
+
*/
|
|
990
|
+
const listSleepsViaAnalytics = async (analytics, opts) => {
|
|
991
|
+
const fetchSleepsPage = async (cursor) => {
|
|
992
|
+
const waits = await analytics.waits.list({
|
|
993
|
+
runId: opts.runId,
|
|
994
|
+
pagination: {
|
|
995
|
+
sortOrder: opts.sort || 'desc',
|
|
996
|
+
cursor,
|
|
997
|
+
limit: opts.limit || DEFAULT_PAGE_SIZE,
|
|
998
|
+
},
|
|
999
|
+
});
|
|
1000
|
+
return {
|
|
1001
|
+
data: waits.data,
|
|
1002
|
+
cursor: waits.cursor,
|
|
1003
|
+
hasMore: waits.hasMore,
|
|
1004
|
+
pageInfo: getPageInfo(waits),
|
|
1005
|
+
};
|
|
1006
|
+
};
|
|
1007
|
+
if (opts.json) {
|
|
1008
|
+
const page = await fetchSleepsPage(opts.cursor);
|
|
1009
|
+
showJson(page.data);
|
|
1010
|
+
return;
|
|
1011
|
+
}
|
|
1012
|
+
await setupListPagination({
|
|
1013
|
+
initialCursor: opts.cursor,
|
|
1014
|
+
interactive: opts.interactive,
|
|
1015
|
+
fetchPage: fetchSleepsPage,
|
|
1016
|
+
displayPage: async (waits) => {
|
|
1017
|
+
logger.log(showTable(waits, ['waitId', 'status', 'createdAt', 'resumeAt', 'completedAt'], { ...opts, disableRelativeDates: true }));
|
|
1018
|
+
},
|
|
1019
|
+
});
|
|
1020
|
+
};
|
|
911
1021
|
export const listSleeps = async (world, opts = {}) => {
|
|
912
1022
|
if (!opts.runId) {
|
|
913
1023
|
logger.error('run-id is required for listing sleeps. Usage: `workflow inspect sleeps --runId=<id>`');
|
|
@@ -922,6 +1032,19 @@ export const listSleeps = async (world, opts = {}) => {
|
|
|
922
1032
|
if (opts.withData) {
|
|
923
1033
|
logger.warn('`withData` flag is ignored when listing sleeps');
|
|
924
1034
|
}
|
|
1035
|
+
// Prefer the analytics read path for wait/sleep listing when available.
|
|
1036
|
+
if (world.analytics) {
|
|
1037
|
+
try {
|
|
1038
|
+
await listSleepsViaAnalytics(world.analytics, opts);
|
|
1039
|
+
return;
|
|
1040
|
+
}
|
|
1041
|
+
catch (error) {
|
|
1042
|
+
if (handleApiError(error, opts.backend)) {
|
|
1043
|
+
process.exit(1);
|
|
1044
|
+
}
|
|
1045
|
+
throw error;
|
|
1046
|
+
}
|
|
1047
|
+
}
|
|
925
1048
|
try {
|
|
926
1049
|
// Fetch all events for the run with resolveData='all' to get wait eventData
|
|
927
1050
|
const events = await world.events.list({
|
|
@@ -997,4 +1120,4 @@ export const listSleeps = async (world, opts = {}) => {
|
|
|
997
1120
|
throw error;
|
|
998
1121
|
}
|
|
999
1122
|
};
|
|
1000
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9pbnNwZWN0L291dHB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdEQsT0FBTyxFQUVMLG9CQUFvQixFQUNwQixtQkFBbUIsR0FDcEIsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFZOUUsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRTFCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDMUMsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUxQyxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxZQUFZLEdBQ2IsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4Qjs7Ozs7O0dBTUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxLQUFZLEVBQUUsT0FBZ0I7SUFDcEQsSUFBSSxDQUFDLE9BQU87UUFBRSxPQUFPLElBQUksQ0FBQztJQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQjtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQy9DLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxFQUEyQyxDQUFDO0lBQ2pFLE9BQU8sQ0FBQyxLQUFhLEVBQUUsRUFBRTtRQUN2QixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSTtpQkFDaEIsR0FBRyxDQUFDLEtBQUssQ0FBQztpQkFD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QUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbXBvcnRLZXkgfSBmcm9tICdAd29ya2Zsb3cvY29yZS9lbmNyeXB0aW9uJztcbmltcG9ydCB7XG4gIHR5cGUgRW5jcnlwdGlvbktleVBhcmFtLFxuICBnZXREZXNlcmlhbGl6ZVN0cmVhbSxcbiAgZ2V0RXh0ZXJuYWxSZXZpdmVycyxcbn0gZnJvbSAnQHdvcmtmbG93L2NvcmUvc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgeyBWRVJDRUxfNDAzX0VSUk9SX01FU1NBR0UgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IHBhcnNlU3RlcE5hbWUsIHBhcnNlV29ya2Zsb3dOYW1lIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzL3BhcnNlLW5hbWUnO1xuaW1wb3J0IHR5cGUge1xuICBFdmVudCxcbiAgSG9vayxcbiAgTGlzdEV2ZW50c1BhcmFtcyxcbiAgUGFnaW5hdGlvbk9wdGlvbnMsXG4gIFN0ZXAsXG4gIFN0ZXBXaXRob3V0RGF0YSxcbiAgV29ya2Zsb3dSdW4sXG4gIFdvcmtmbG93UnVuV2l0aG91dERhdGEsXG4gIFdvcmxkLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcblxuaW1wb3J0IHsgZm9ybWF0RGlzdGFuY2UgfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgVGFibGUgZnJvbSAnZWFzeS10YWJsZSc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9jb25maWcvbG9nLmpzJztcbmltcG9ydCB0eXBlIHsgSW5zcGVjdENMSU9wdGlvbnMgfSBmcm9tICcuLi9jb25maWcvdHlwZXMuanMnO1xuaW1wb3J0IHtcbiAgdHlwZSBFbmNyeXB0aW9uS2V5UmVzb2x2ZXIsXG4gIGh5ZHJhdGVSZXNvdXJjZUlPLFxuICBpc0VuY3J5cHRlZFJlZixcbiAgaXNFeHBpcmVkUmVmLFxufSBmcm9tICcuL2h5ZHJhdGlvbi5qcyc7XG5cbi8qKlxuICogQ3JlYXRlIGFuIEVuY3J5cHRpb25LZXlSZXNvbHZlciBmcm9tIGEgV29ybGQgaW5zdGFuY2UuXG4gKiBSZXR1cm5zIG51bGwgaWYgZGVjcnlwdCBpcyBmYWxzZSDigJQgZW5jcnlwdGVkIGRhdGEgd2lsbCBzaG93IGFzIGEgcGxhY2Vob2xkZXIuXG4gKlxuICogVGhlIHJlc29sdmVyIGZldGNoZXMgdGhlIGZ1bGwgV29ya2Zsb3dSdW4gKGNhY2hlZCBwZXIgcnVuSWQpIHNvIHRoYXQgdGhlXG4gKiBXb3JsZCBjYW4gaW5zcGVjdCBkZXBsb3ltZW50LXNwZWNpZmljIGZpZWxkcyBmb3Iga2V5IHJlc29sdXRpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJlc29sdmVyKHdvcmxkOiBXb3JsZCwgZGVjcnlwdDogYm9vbGVhbik6IEVuY3J5cHRpb25LZXlSZXNvbHZlciB7XG4gIGlmICghZGVjcnlwdCkgcmV0dXJuIG51bGw7XG4gIGlmICghd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bikgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8VWludDhBcnJheSB8IHVuZGVmaW5lZD4+KCk7XG4gIHJldHVybiAocnVuSWQ6IHN0cmluZykgPT4ge1xuICAgIGxldCBjYWNoZWQgPSBjYWNoZS5nZXQocnVuSWQpO1xuICAgIGlmICghY2FjaGVkKSB7XG4gICAgICBjYWNoZWQgPSB3b3JsZC5ydW5zXG4gICAgICAgIC5nZXQocnVuSWQpXG4gICAgICAgIC50aGVuKChydW4pID0+IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4hKHJ1bikpO1xuICAgICAgY2FjaGUuc2V0KHJ1bklkLCBjYWNoZWQpO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkO1xuICB9O1xufVxuXG5pbXBvcnQgeyBzZXR1cExpc3RQYWdpbmF0aW9uIH0gZnJvbSAnLi9wYWdpbmF0aW9uLmpzJztcbmltcG9ydCB7IHN0cmVhbVRvQ29uc29sZSB9IGZyb20gJy4vc3RyZWFtLmpzJztcbmltcG9ydCB7XG4gIGZvcm1hdElTT0RhdGUsXG4gIGZvcm1hdFN0YXR1cyBhcyBmb3JtYXRTdGF0dXNBYmJyZXYsXG4gIGdldERpc3BsYXlTZXR0aW5ncyxcbiAgZ2V0VGVybWluYWxXaWR0aCxcbiAgaXNDSSxcbn0gZnJvbSAnLi90ZXJtaW5hbC11dGlscy5qcyc7XG5cbmNvbnN0IERFRkFVTFRfUEFHRV9TSVpFID0gMjA7XG5sZXQgVEFCTEVfVFJVTkNBVEVfSU9fTEVOR1RIID0gMTU7IC8vIFdpbGwgYmUgYWRqdXN0ZWQgYmFzZWQgb24gdGVybWluYWwgd2lkdGhcblxuY29uc3QgV09SS0ZMT1dfUlVOX0lPX1BST1BTOiAoa2V5b2YgV29ya2Zsb3dSdW4pW10gPSBbJ2lucHV0JywgJ291dHB1dCddO1xuXG5jb25zdCBTVEVQX0lPX1BST1BTOiAoa2V5b2YgU3RlcClbXSA9IFsnaW5wdXQnLCAnb3V0cHV0J107XG5cbmNvbnN0IFdPUktGTE9XX1JVTl9MSVNURURfUFJPUFM6IChrZXlvZiBXb3JrZmxvd1J1bilbXSA9IFtcbiAgJ3J1bklkJyxcbiAgJ3dvcmtmbG93TmFtZScsXG4gICdzdGF0dXMnLFxuICAnc3RhcnRlZEF0JyxcbiAgJ2NvbXBsZXRlZEF0JyxcbiAgLi4uV09SS0ZMT1dfUlVOX0lPX1BST1BTLFxuXTtcblxuY29uc3QgU1RFUF9MSVNURURfUFJPUFM6IChrZXlvZiBTdGVwKVtdID0gW1xuICAncnVuSWQnLFxuICAnc3RlcElkJyxcbiAgJ3N0ZXBOYW1lJyxcbiAgJ3N0YXR1cycsXG4gICdzdGFydGVkQXQnLFxuICAnY29tcGxldGVkQXQnLFxuICAuLi5TVEVQX0lPX1BST1BTLFxuXTtcblxuY29uc3QgRVZFTlRfSU9fUFJPUFM6IChrZXlvZiBFdmVudCB8ICdldmVudERhdGEnKVtdID0gWydldmVudERhdGEnXTtcblxuY29uc3QgRVZFTlRfTElTVEVEX1BST1BTOiAoa2V5b2YgRXZlbnQgfCAnZXZlbnREYXRhJylbXSA9IFtcbiAgJ2V2ZW50SWQnLFxuICAnZXZlbnRUeXBlJyxcbiAgJ2NvcnJlbGF0aW9uSWQnLFxuICAnY3JlYXRlZEF0JyxcbiAgLi4uRVZFTlRfSU9fUFJPUFMsXG5dO1xuXG4vLyBjb25zdCBIT09LX0RBVEFfUFJPUFM6IChrZXlvZiBIb29rIHwgJ2hhc1Jlc3BvbnNlJylbXSA9IFsnaGFzUmVzcG9uc2UnXTtcblxuY29uc3QgSE9PS19MSVNURURfUFJPUFM6IChrZXlvZiBIb29rIHwgJ2hhc1Jlc3BvbnNlJylbXSA9IFtcbiAgJ3J1bklkJyxcbiAgJ2hvb2tJZCcsXG4gICdvd25lcklkJyxcbiAgJ2NyZWF0ZWRBdCcsXG4gIC8vIC4uLkhPT0tfREFUQV9QUk9QUyxcbl07XG5cbmludGVyZmFjZSBTbGVlcCB7XG4gIGNvcnJlbGF0aW9uSWQ6IHN0cmluZztcbiAgcnVuSWQ6IHN0cmluZztcbiAgZXZlbnRJZDogc3RyaW5nO1xuICBjcmVhdGVkQXQ6IERhdGU7XG4gIHJlc3VtZUF0OiBEYXRlIHwgdW5kZWZpbmVkO1xuICBjb21wbGV0ZWRBdDogRGF0ZSB8IHVuZGVmaW5lZDtcbn1cblxuY29uc3QgV0FJVF9MSVNURURfUFJPUFM6IChrZXlvZiBTbGVlcClbXSA9IFtcbiAgJ2NvcnJlbGF0aW9uSWQnLFxuICAnZXZlbnRJZCcsXG4gICdjcmVhdGVkQXQnLFxuICAncmVzdW1lQXQnLFxuICAnY29tcGxldGVkQXQnLFxuXTtcblxuY29uc3QgU1RBVFVTX0NPTE9SUzogUmVjb3JkPFxuICBXb3JrZmxvd1J1blsnc3RhdHVzJ10gfCBTdGVwWydzdGF0dXMnXSxcbiAgKHZhbHVlOiBzdHJpbmcpID0+IHN0cmluZ1xuPiA9IHtcbiAgcnVubmluZzogY2hhbGsuYmx1ZSxcbiAgY29tcGxldGVkOiBjaGFsay5ncmVlbixcbiAgZmFpbGVkOiBjaGFsay5yZWQsXG4gIGNhbmNlbGxlZDogY2hhbGsuc3RyaWtldGhyb3VnaC55ZWxsb3csXG4gIHBlbmRpbmc6IGNoYWxrLmJsdWUsXG59O1xuXG5jb25zdCBpc1N0cmVhbUlkID0gKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuc3RhcnRzV2l0aCgnc3RybV8nKTtcbn07XG5cbmNvbnN0IHNob3dTdGF0dXNMZWdlbmQgPSAoKSA9PiB7XG4gIGxvZ2dlci5sb2coJ1xcblN0YXR1cyBMZWdlbmQ6Jyk7XG4gIGNvbnN0IHN0YXR1c2VzOiBBcnJheTxXb3JrZmxvd1J1blsnc3RhdHVzJ10gfCBTdGVwWydzdGF0dXMnXT4gPSBbXG4gICAgJ3J1bm5pbmcnLFxuICAgICdjb21wbGV0ZWQnLFxuICAgICdmYWlsZWQnLFxuICAgICdjYW5jZWxsZWQnLFxuICAgICdwZW5kaW5nJyxcbiAgXTtcblxuICBjb25zdCBsZWdlbmRJdGVtcyA9IHN0YXR1c2VzLm1hcCgoc3RhdHVzKSA9PiB7XG4gICAgY29uc3QgY29sb3JGdW5jID0gU1RBVFVTX0NPTE9SU1tzdGF0dXNdO1xuICAgIGNvbnN0IGFiYnJldiA9IGZvcm1hdFN0YXR1c0FiYnJldihzdGF0dXMsIHRydWUpO1xuICAgIHJldHVybiBgJHtjb2xvckZ1bmMoYWJicmV2KX0gPSAke3N0YXR1c31gO1xuICB9KTtcblxuICBsb2dnZXIubG9nKGAgICR7bGVnZW5kSXRlbXMuam9pbignICAnKX1gKTtcbiAgbG9nZ2VyLmxvZygnJyk7XG59O1xuXG5jb25zdCBpc1NsZWVwU3RlcCA9IChzdGVwTmFtZTogc3RyaW5nKSA9PiB7XG4gIHJldHVybiBzdGVwTmFtZS5pbmNsdWRlcygnLXNsZWVwJyk7XG59O1xuXG5jb25zdCBjaGVja0FuZEhhbmRsZVZlcmNlbEFjY2Vzc0Vycm9yID0gKFxuICBlcnJvcjogdW5rbm93bixcbiAgYmFja2VuZD86IHN0cmluZ1xuKTogYm9vbGVhbiA9PiB7XG4gIGlmIChiYWNrZW5kID09PSAndmVyY2VsJyAmJiBlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgZXJyID0gZXJyb3IgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKGVyci5zdGF0dXMgPT09IDQwMykge1xuICAgICAgbG9nZ2VyLmVycm9yKFZFUkNFTF80MDNfRVJST1JfTUVTU0FHRSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuY29uc3QgZXh0cmFjdEVycm9yTWVzc2FnZSA9IChcbiAgZXJyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKGVyci5tZXNzYWdlICYmIHR5cGVvZiBlcnIubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZXJyLm1lc3NhZ2U7XG4gIH1cblxuICBpZiAoZXJyLmJvZHkgJiYgdHlwZW9mIGVyci5ib2R5ID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IGJvZHkgPSBlcnIuYm9keSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAoYm9keS5tZXNzYWdlICYmIHR5cGVvZiBib2R5Lm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gYm9keS5tZXNzYWdlO1xuICAgIH1cbiAgICBpZiAoYm9keS5lcnJvciAmJiB0eXBlb2YgYm9keS5lcnJvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBib2R5LmVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG5jb25zdCBoYW5kbGVBcGlFcnJvciA9IChlcnJvcjogdW5rbm93biwgYmFja2VuZD86IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAvLyBGaXJzdCBjaGVjayBmb3IgVmVyY2VsIGFjY2VzcyBlcnJvcnNcbiAgaWYgKGNoZWNrQW5kSGFuZGxlVmVyY2VsQWNjZXNzRXJyb3IoZXJyb3IsIGJhY2tlbmQpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBIYW5kbGUgb3RoZXIgSFRUUCBlcnJvcnNcbiAgaWYgKGVycm9yICYmIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBlcnIgPSBlcnJvciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgIC8vIEhhbmRsZSA0MDAgQmFkIFJlcXVlc3RcbiAgICBpZiAoZXJyLnN0YXR1cyA9PT0gNDAwKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0JhZCBSZXF1ZXN0OiBUaGUgcmVxdWVzdCB3YXMgaW52YWxpZC4nKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBleHRyYWN0RXJyb3JNZXNzYWdlKGVycik7XG4gICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYERldGFpbHM6ICR7bWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBvdGhlciBIVFRQIGVycm9ycyAoNDA0LCA1MDAsIGV0Yy4pXG4gICAgaWYgKHR5cGVvZiBlcnIuc3RhdHVzID09PSAnbnVtYmVyJyAmJiBlcnIuc3RhdHVzID49IDQwMCkge1xuICAgICAgbG9nZ2VyLmVycm9yKGBIVFRQIEVycm9yICR7ZXJyLnN0YXR1c306ICR7Z2V0U3RhdHVzVGV4dChlcnIuc3RhdHVzKX1gKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBleHRyYWN0RXJyb3JNZXNzYWdlKGVycik7XG4gICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYERldGFpbHM6ICR7bWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmNvbnN0IGdldFN0YXR1c1RleHQgPSAoc3RhdHVzOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBzdGF0dXNUZXh0czogUmVjb3JkPG51bWJlciwgc3RyaW5nPiA9IHtcbiAgICA0MDA6ICdCYWQgUmVxdWVzdCcsXG4gICAgNDAxOiAnVW5hdXRob3JpemVkJyxcbiAgICA0MDM6ICdGb3JiaWRkZW4nLFxuICAgIDQwNDogJ05vdCBGb3VuZCcsXG4gICAgNDI5OiAnVG9vIE1hbnkgUmVxdWVzdHMnLFxuICAgIDUwMDogJ0ludGVybmFsIFNlcnZlciBFcnJvcicsXG4gICAgNTAyOiAnQmFkIEdhdGV3YXknLFxuICAgIDUwMzogJ1NlcnZpY2UgVW5hdmFpbGFibGUnLFxuICB9O1xuICByZXR1cm4gc3RhdHVzVGV4dHNbc3RhdHVzXSB8fCAnVW5rbm93biBFcnJvcic7XG59O1xuXG5jb25zdCB0cnVuY2F0ZU5hbWVJZk5lZWRlZCA9IChuYW1lOiBzdHJpbmcsIG1heExlbmd0aDogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgcmV0dXJuIG1heExlbmd0aCA8IG5hbWUubGVuZ3RoID8gYCR7bmFtZS5zdWJzdHJpbmcoMCwgbWF4TGVuZ3RoKX0uLi5gIDogbmFtZTtcbn07XG5cbmNvbnN0IGZvcm1hdE5hbWVGaWVsZCA9IChcbiAgbmFtZU5vblVuaXF1ZTogc3RyaW5nLFxuICB0cnVuY2F0ZUxlbmd0aDogbnVtYmVyLFxuICBpc1NsZWVwOiBib29sZWFuXG4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCB0cnVuY2F0ZWROYW1lID0gdHJ1bmNhdGVOYW1lSWZOZWVkZWQobmFtZU5vblVuaXF1ZSwgdHJ1bmNhdGVMZW5ndGgpO1xuICBpZiAoaXNTbGVlcCkge1xuICAgIHJldHVybiBjaGFsay55ZWxsb3dCcmlnaHQodHJ1bmNhdGVkTmFtZSk7XG4gIH1cbiAgcmV0dXJuIGNoYWxrLmJsdWUuYmx1ZUJyaWdodCh0cnVuY2F0ZWROYW1lKTtcbn07XG5cbmNvbnN0IGZvcm1hdElkRmllbGQgPSAoXG4gIHByb3A6IHN0cmluZyxcbiAgdmFsdWU6IHVua25vd24sXG4gIHNob3VsZFRydW5jYXRlSWRzOiBib29sZWFuXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCB2YWx1ZVN0ciA9IFN0cmluZyh2YWx1ZSk7XG4gIGNvbnN0IGlkU3RyID0gc2hvdWxkVHJ1bmNhdGVJZHMgPyB0cnVuY2F0ZUlkVG9MYXN0Q2hhcnModmFsdWVTdHIpIDogdmFsdWVTdHI7XG4gIGlmIChwcm9wID09PSAnc3RyZWFtSWQnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmdyZWVuKGlkU3RyKTtcbiAgfVxuICByZXR1cm4gaWRTdHI7XG59O1xuXG5leHBvcnQgY29uc3QgZm9ybWF0VGFibGVWYWx1ZSA9IChcbiAgcHJvcDogc3RyaW5nLFxuICB2YWx1ZTogdW5rbm93bixcbiAgb3B0czogSW5zcGVjdENMSU9wdGlvbnMgPSB7fSxcbiAgZGlzcGxheVNldHRpbmdzPzogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0RGlzcGxheVNldHRpbmdzPixcbiAgaXRlbT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pID0+IHtcbiAgY29uc3QgbmFtZXNUcnVuY2F0ZSA9IGRpc3BsYXlTZXR0aW5ncz8ubmFtZXNUcnVuY2F0ZUxlbmd0aCA/PyA0MDtcbiAgY29uc3Qgc2hvdWxkVHJ1bmNhdGVJZHMgPSBkaXNwbGF5U2V0dGluZ3M/LnRydW5jYXRlSWRzVG9MYXN0Q2hhcnMgPz8gZmFsc2U7XG5cbiAgLy8gSGFuZGxlIElEcyB3aXRoIHBvdGVudGlhbCB0cnVuY2F0aW9uXG4gIGlmIChcbiAgICBbXG4gICAgICAnc3RyZWFtSWQnLFxuICAgICAgJ3J1bklkJyxcbiAgICAgICdzdGVwSWQnLFxuICAgICAgJ2hvb2tJZCcsXG4gICAgICAnZXZlbnRJZCcsXG4gICAgICAnY29ycmVsYXRpb25JZCcsXG4gICAgICAnb3duZXJJZCcsXG4gICAgXS5pbmNsdWRlcyhwcm9wKVxuICApIHtcbiAgICByZXR1cm4gZm9ybWF0SWRGaWVsZChwcm9wLCB2YWx1ZSwgc2hvdWxkVHJ1bmNhdGVJZHMpO1xuICB9XG5cbiAgLy8gSGFuZGxlIG5hbWVzIHdpdGggdHJ1bmNhdGlvblxuICBpZiAocHJvcCA9PT0gJ3N0ZXBOYW1lJykge1xuICAgIGNvbnN0IG5hbWVOb25VbmlxdWUgPSBwYXJzZVN0ZXBOYW1lKFN0cmluZyh2YWx1ZSkpPy5zaG9ydE5hbWUgfHwgJz8nO1xuICAgIHJldHVybiBmb3JtYXROYW1lRmllbGQoXG4gICAgICBuYW1lTm9uVW5pcXVlLFxuICAgICAgbmFtZXNUcnVuY2F0ZSxcbiAgICAgIGlzU2xlZXBTdGVwKFN0cmluZyh2YWx1ZSkpXG4gICAgKTtcbiAgfVxuXG4gIGlmIChwcm9wID09PSAnd29ya2Zsb3dOYW1lJykge1xuICAgIGNvbnN0IG5hbWVOb25VbmlxdWUgPSBwYXJzZVdvcmtmbG93TmFtZShTdHJpbmcodmFsdWUpKT8uc2hvcnROYW1lIHx8ICc/JztcbiAgICBjb25zdCB0cnVuY2F0ZWROYW1lID0gdHJ1bmNhdGVOYW1lSWZOZWVkZWQobmFtZU5vblVuaXF1ZSwgbmFtZXNUcnVuY2F0ZSk7XG4gICAgcmV0dXJuIGNoYWxrLmJsdWUuYmx1ZUJyaWdodCh0cnVuY2F0ZWROYW1lKTtcbiAgfVxuXG4gIGlmIChwcm9wID09PSAnb3V0cHV0JyB8fCBwcm9wID09PSAnaW5wdXQnIHx8IHByb3AgPT09ICdlcnJvcicpIHtcbiAgICBpZiAoXG4gICAgICBpdGVtICYmXG4gICAgICAnZXhwaXJlZEF0JyBpbiBpdGVtICYmXG4gICAgICBpdGVtLmV4cGlyZWRBdCAhPSBudWxsICYmXG4gICAgICBuZXcgRGF0ZShpdGVtLmV4cGlyZWRBdCBhcyBzdHJpbmcgfCBudW1iZXIgfCBEYXRlKSA8IG5ldyBEYXRlKClcbiAgICApIHtcbiAgICAgIHJldHVybiBFWFBJUkVEX0RBVEFfTUVTU0FHRTtcbiAgICB9XG4gICAgcmV0dXJuIGlubGluZUZvcm1hdElPKHZhbHVlKTtcbiAgfVxuXG4gIGlmIChwcm9wID09PSAnc3RhdHVzJykge1xuICAgIGNvbnN0IHN0YXR1cyA9IHZhbHVlIGFzIFdvcmtmbG93UnVuWydzdGF0dXMnXSB8IFN0ZXBbJ3N0YXR1cyddO1xuICAgIGNvbnN0IGNvbG9yRnVuYyA9IFNUQVRVU19DT0xPUlNbc3RhdHVzXTtcbiAgICBjb25zdCBmb3JtYXR0ZWRTdGF0dXMgPSBkaXNwbGF5U2V0dGluZ3M/LmFiYnJldmlhdGVTdGF0dXNcbiAgICAgID8gZm9ybWF0U3RhdHVzQWJicmV2KHN0YXR1cywgdHJ1ZSlcbiAgICAgIDogc3RhdHVzO1xuICAgIHJldHVybiBjb2xvckZ1bmMoZm9ybWF0dGVkU3RhdHVzKTtcbiAgfVxuXG4gIGlmIChwcm9wID09PSAnZXZlbnREYXRhJykge1xuICAgIHJldHVybiB0cnVuY2F0ZVN0cmluZyhKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICB9XG5cbiAgaWYgKHByb3AgPT09ICdoYXNSZXNwb25zZScpIHtcbiAgICByZXR1cm4gdmFsdWUgPyBjaGFsay5ncmVlbigndHJ1ZScpIDogY2hhbGsuZ3JheSgnZmFsc2UnKTtcbiAgfVxuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gZm9ybWF0VGFibGVUaW1lc3RhbXAodmFsdWUsIG9wdHMsIGRpc3BsYXlTZXR0aW5ncyk7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59O1xuXG5jb25zdCBnZXRWaXNpYmxlUHJvcHMgPSAoXG4gIHByb3BzOiBzdHJpbmdbXSxcbiAgZGlzcGxheVNldHRpbmdzOiBSZXR1cm5UeXBlPHR5cGVvZiBnZXREaXNwbGF5U2V0dGluZ3M+XG4pOiBzdHJpbmdbXSA9PiB7XG4gIGlmIChkaXNwbGF5U2V0dGluZ3MuaGlkZUNvbXBsZXRlZEF0KSB7XG4gICAgcmV0dXJuIHByb3BzLmZpbHRlcigocHJvcCkgPT4gcHJvcCAhPT0gJ2NvbXBsZXRlZEF0Jyk7XG4gIH1cbiAgcmV0dXJuIHByb3BzO1xufTtcblxuY29uc3Qgc2hvd1RhYmxlID0gKFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLFxuICBwcm9wczogc3RyaW5nW10sXG4gIG9wdHM6IEluc3BlY3RDTElPcHRpb25zID0ge31cbikgPT4ge1xuICAvLyBHZXQgZGlzcGxheSBzZXR0aW5ncyBiYXNlZCBvbiB0ZXJtaW5hbCB3aWR0aFxuICBjb25zdCB0ZXJtaW5hbFdpZHRoID0gZ2V0VGVybWluYWxXaWR0aCgpO1xuICBjb25zdCBkaXNwbGF5U2V0dGluZ3MgPSBnZXREaXNwbGF5U2V0dGluZ3MoXG4gICAgdGVybWluYWxXaWR0aCxcbiAgICBvcHRzLndpdGhEYXRhIHx8IGZhbHNlLFxuICAgIHByb3BzLmluY2x1ZGVzKCdydW5OYW1lJylcbiAgKTtcblxuICAvLyBGaWx0ZXIgb3V0IGNvbXBsZXRlZEF0IGNvbHVtbiBpZiBuZWVkZWRcbiAgY29uc3QgdmlzaWJsZVByb3BzID0gZ2V0VmlzaWJsZVByb3BzKHByb3BzLCBkaXNwbGF5U2V0dGluZ3MpO1xuXG4gIC8vIFVwZGF0ZSB0cnVuY2F0ZSBsZW5ndGggZm9yIElPIGZpZWxkc1xuICBjb25zdCBvcmlnaW5hbFRydW5jYXRlTGVuZ3RoID0gVEFCTEVfVFJVTkNBVEVfSU9fTEVOR1RIO1xuICBUQUJMRV9UUlVOQ0FURV9JT19MRU5HVEggPSBkaXNwbGF5U2V0dGluZ3MuZGF0YUZpZWxkV2lkdGg7XG5cbiAgLy8gU2hvdyBzdGF0dXMgbGVnZW5kIGlmIHVzaW5nIGFiYnJldmlhdGVkIHN0YXR1c1xuICBpZiAoXG4gICAgZGF0YS5sZW5ndGggPiAwICYmXG4gICAgZGlzcGxheVNldHRpbmdzLmFiYnJldmlhdGVTdGF0dXMgJiZcbiAgICB2aXNpYmxlUHJvcHMuaW5jbHVkZXMoJ3N0YXR1cycpXG4gICkge1xuICAgIHNob3dTdGF0dXNMZWdlbmQoKTtcbiAgfVxuXG4gIC8vIENyZWF0ZSBoZWFkZXIgbWFwcGluZyBmb3IgYWJicmV2aWF0ZWQgc3RhdHVzXG4gIGNvbnN0IGhlYWRlck1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBpZiAoZGlzcGxheVNldHRpbmdzLmFiYnJldmlhdGVTdGF0dXMgJiYgdmlzaWJsZVByb3BzLmluY2x1ZGVzKCdzdGF0dXMnKSkge1xuICAgIGhlYWRlck1hcFsnc3RhdHVzJ10gPSAnUyc7XG4gIH1cblxuICAvLyBBZGQgYSBibGFuayBsaW5lIGJlZm9yZSBhbnkgdGFibGVcbiAgY29uc3QgdGFibGUgPSBuZXcgVGFibGUoKTtcbiAgaWYgKGRhdGEgJiYgZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICBsb2dnZXIud2FybignTm8gZGF0YSBmb3VuZCBmb3IgdGhpcyBxdWVyeSBhbmQgcmVzb3VyY2UuXFxuJyk7XG4gICAgZm9yIChjb25zdCBwcm9wIG9mIHZpc2libGVQcm9wcykge1xuICAgICAgY29uc3QgaGVhZGVyID0gaGVhZGVyTWFwW3Byb3BdIHx8IHByb3A7XG4gICAgICB0YWJsZS5jZWxsKGhlYWRlciwgJ04vQScpO1xuICAgIH1cbiAgICB0YWJsZS5uZXdSb3coKTtcbiAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIHRydW5jYXRlIGxlbmd0aFxuICAgIFRBQkxFX1RSVU5DQVRFX0lPX0xFTkdUSCA9IG9yaWdpbmFsVHJ1bmNhdGVMZW5ndGg7XG4gICAgcmV0dXJuIHRhYmxlLnRvU3RyaW5nKCk7XG4gIH0gZWxzZSBpZiAoIWRhdGEpIHtcbiAgICBsb2dnZXIud2FybignRXhwZWN0aW5nIGFuIGFycmF5IG9mIGRhdGEsIGJ1dCBnb3QgbnVsbC5cXG4nKTtcbiAgfVxuICBsb2dnZXIubG9nKCcnKTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIGRhdGEpIHtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgdmlzaWJsZVByb3BzKSB7XG4gICAgICBjb25zdCBoZWFkZXIgPSBoZWFkZXJNYXBbcHJvcF0gfHwgcHJvcDtcbiAgICAgIGNvbnN0IHZhbHVlID0gaXRlbVtwcm9wXTtcbiAgICAgIHRhYmxlLmNlbGwoXG4gICAgICAgIGhlYWRlcixcbiAgICAgICAgZm9ybWF0VGFibGVWYWx1ZShwcm9wLCB2YWx1ZSwgb3B0cywgZGlzcGxheVNldHRpbmdzLCBpdGVtKVxuICAgICAgKTtcbiAgICB9XG4gICAgdGFibGUubmV3Um93KCk7XG4gIH1cblxuICAvLyBSZXN0b3JlIG9yaWdpbmFsIHRydW5jYXRlIGxlbmd0aFxuICBUQUJMRV9UUlVOQ0FURV9JT19MRU5HVEggPSBvcmlnaW5hbFRydW5jYXRlTGVuZ3RoO1xuICByZXR1cm4gdGFibGUudG9TdHJpbmcoKTtcbn07XG5cbmNvbnN0IHNob3dKc29uID0gKGRhdGE6IHVua25vd24pID0+IHtcbiAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpO1xuICBwcm9jZXNzLnN0ZG91dC53cml0ZShgJHtqc29ufVxcbmApO1xufTtcblxuLyoqXG4gKiBJbiB0YWJsZXMsIHdlIHdhbnQgdG8gc2hvdyBhIHNob3J0ZXIgdGltZXN0YW1wLCBZWVlZLU1NLUREIEhIOk1NOlNTXG4gKi9cbmNvbnN0IGZvcm1hdFRhYmxlVGltZXN0YW1wID0gKFxuICB2YWx1ZTogRGF0ZSxcbiAgb3B0czogSW5zcGVjdENMSU9wdGlvbnMgPSB7fSxcbiAgZGlzcGxheVNldHRpbmdzPzogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0RGlzcGxheVNldHRpbmdzPlxuKSA9PiB7XG4gIC8vIEZvcm1hdCBJU08gdGltZSB3aXRob3V0IFQgYW5kIFpcbiAgY29uc3QgaXNvVGltZSA9IGZvcm1hdElTT0RhdGUodmFsdWUpO1xuXG4gIC8vIFNob3cgcmVsYXRpdmUgdGltZSBvbmx5IGlmOlxuICAvLyAtIE5vdCBpbiBDSSBtb2RlXG4gIC8vIC0gRGlzcGxheSBzZXR0aW5ncyBhbGxvdyBpdCAoYmFzZWQgb24gdGVybWluYWwgd2lkdGgpXG4gIC8vIC0gd2l0aERhdGEgaXMgZGlzYWJsZWQgKG1vcmUgc3BhY2UgYXZhaWxhYmxlKVxuICAvLyAtIE5vdCBpbiBKU09OIG1vZGVcbiAgLy8gLSBkaXNhYmxlUmVsYXRpdmVEYXRlcyBpcyBub3Qgc2V0XG4gIGNvbnN0IHNob3VsZFNob3dSZWxhdGl2ZSA9XG4gICAgIWlzQ0koKSAmJlxuICAgIGRpc3BsYXlTZXR0aW5ncz8uc2hvd1JlbGF0aXZlRGF0ZXMgIT09IGZhbHNlICYmXG4gICAgIW9wdHMud2l0aERhdGEgJiZcbiAgICAhb3B0cy5qc29uICYmXG4gICAgIW9wdHMuZGlzYWJsZVJlbGF0aXZlRGF0ZXM7XG5cbiAgaWYgKHNob3VsZFNob3dSZWxhdGl2ZSkge1xuICAgIGNvbnN0IHJlbGF0aXZlID0gZm9ybWF0RGlzdGFuY2UodmFsdWUsIG5ldyBEYXRlKCksIHsgYWRkU3VmZml4OiB0cnVlIH0pO1xuICAgIHJldHVybiBgJHtpc29UaW1lfSAoJHtyZWxhdGl2ZX0pYDtcbiAgfVxuXG4gIHJldHVybiBpc29UaW1lO1xufTtcblxuY29uc3QgdHJ1bmNhdGVTdHJpbmcgPSAoXG4gIHN0cjogc3RyaW5nLFxuICBtYXhMZW5ndGg6IG51bWJlciA9IFRBQkxFX1RSVU5DQVRFX0lPX0xFTkdUSFxuKSA9PiB7XG4gIHJldHVybiBzdHIgJiYgc3RyLmxlbmd0aCA+IG1heExlbmd0aFxuICAgID8gYCR7c3RyLnN1YnN0cmluZygwLCBtYXhMZW5ndGgpfS4uLmBcbiAgICA6IHN0cjtcbn07XG5cbmNvbnN0IHRydW5jYXRlSWRUb0xhc3RDaGFycyA9IChpZDogc3RyaW5nLCBjaGFyczogbnVtYmVyID0gNCk6IHN0cmluZyA9PiB7XG4gIGlmICghaWQgfHwgaWQubGVuZ3RoIDw9IGNoYXJzKSByZXR1cm4gaWQ7XG4gIHJldHVybiBgLi4uJHtpZC5zdWJzdHJpbmcoaWQubGVuZ3RoIC0gY2hhcnMpfWA7XG59O1xuXG5jb25zdCBzaG93SW5zcGVjdEluZm9Cb3ggPSAocmVzb3VyY2U6IHN0cmluZykgPT4ge1xuICBsb2dnZXIuaW5mbyhcbiAgICBgVG8gdmlldyBkZXRhaWxzIGZvciBhICR7cmVzb3VyY2V9LCB1c2UgXFxgd29ya2Zsb3cgaW5zcGVjdCAke3Jlc291cmNlfVxcYCA8aWQ+YFxuICApO1xuICBsb2dnZXIuaW5mbyhcbiAgICBgVG8gdmlldyB0aGUgY29udGVudCBvZiBhbnkgc3RyZWFtLCB1c2UgXFxgd29ya2Zsb3cgaW5zcGVjdCBzdHJlYW0gPHN0cmVhbS1pZD5cXGBgXG4gICk7XG59O1xuXG5jb25zdCBFWFBJUkVEX0RBVEFfTUVTU0FHRSA9IGNoYWxrLmdyYXkoJzxkYXRhIGV4cGlyZWQ+Jyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcnVuIGhhcyBleHBpcmVkIGRhdGEgc3RvcmFnZSAocnVuLWxldmVsIGV4cGlyZWRBdCBmaWVsZCkuXG4gKiBPbmx5IHJldHVybnMgdHJ1ZSB3aGVuIGBleHBpcmVkQXRgIGlzIGluIHRoZSBwYXN0LlxuICovXG5leHBvcnQgY29uc3QgaGFzRXhwaXJlZERhdGEgPSAocnVuOiBXb3JrZmxvd1J1bik6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gKFxuICAgICdleHBpcmVkQXQnIGluIHJ1biAmJlxuICAgIHJ1bi5leHBpcmVkQXQgIT0gbnVsbCAmJlxuICAgIG5ldyBEYXRlKHJ1bi5leHBpcmVkQXQpIDwgbmV3IERhdGUoKVxuICApO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYW55IGRhdGEgZmllbGQgaW4gYSBoeWRyYXRlZCByZXNvdXJjZSBoYXMgYmVlbiByZXBsYWNlZCB3aXRoIGFuXG4gKiBleHBpcmVkIHBsYWNlaG9sZGVyLiBXb3JrcyBmb3IgcnVucywgc3RlcHMsIGhvb2tzLCBhbmQgZXZlbnRzIOKAlCB1bmxpa2VcbiAqIGBoYXNFeHBpcmVkRGF0YWAgd2hpY2ggb25seSBjaGVja3MgdGhlIHJ1bi1sZXZlbCBgZXhwaXJlZEF0YCBmaWVsZC5cbiAqL1xuY29uc3QgaGFzRXhwaXJlZEZpZWxkcyA9IChyZXNvdXJjZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBib29sZWFuID0+IHtcbiAgcmV0dXJuIFsnaW5wdXQnLCAnb3V0cHV0JywgJ2Vycm9yJywgJ21ldGFkYXRhJ10uc29tZSgoa2V5KSA9PlxuICAgIGlzRXhwaXJlZFJlZihyZXNvdXJjZVtrZXldKVxuICApO1xufTtcblxuLyoqXG4gKiBUYWtlcyBoeWRyYXRlZCBzdGVwL3dvcmtmbG93IGlucHV0L291dHB1dCBhbmQgc2VyaWFsaXplcyBpdCBmb3IgaW5saW5lIGRpc3BsYXkuXG4gKi9cbmNvbnN0IGlubGluZUZvcm1hdElPID0gPFQ+KGlvOiBULCB0b3BMZXZlbDogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB0eXBlID0gdHlwZW9mIGlvO1xuICBsZXQgdmFsdWUgPSAnJztcbiAgaWYgKGlvID09PSB1bmRlZmluZWQpIHtcbiAgICB2YWx1ZSA9ICc8ZW1wdHk+JztcbiAgfSBlbHNlIGlmIChpbyA9PT0gbnVsbCkge1xuICAgIHZhbHVlID0gJzxudWxsPic7XG4gIH0gZWxzZSBpZiAoaXNFbmNyeXB0ZWRSZWYoaW8pKSB7XG4gICAgdmFsdWUgPSBjaGFsay5kaW0ueWVsbG93KCdcXHV7MUY1MTJ9IEVuY3J5cHRlZCcpO1xuICB9IGVsc2UgaWYgKGlzRXhwaXJlZFJlZihpbykpIHtcbiAgICB2YWx1ZSA9IGNoYWxrLmdyYXkoJzxkYXRhIGV4cGlyZWQ+Jyk7XG4gIH0gZWxzZSBpZiAoaW8gJiYgQXJyYXkuaXNBcnJheShpbykpIHtcbiAgICBpZiAoaW8ubGVuZ3RoID09PSAwKSB7XG4gICAgICB2YWx1ZSA9ICc8ZW1wdHk+JztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3RyaW5naWZpZWQgPSBpb1xuICAgICAgICAubWFwKChpdGVtKSA9PiBpbmxpbmVGb3JtYXRJTyhpdGVtLCBmYWxzZSkpXG4gICAgICAgIC5qb2luKCcsJyk7XG4gICAgICBpZiAoc3RyaW5naWZpZWQubGVuZ3RoID4gVEFCTEVfVFJVTkNBVEVfSU9fTEVOR1RIICYmIHRvcExldmVsKSB7XG4gICAgICAgIHZhbHVlID0gY2hhbGsueWVsbG93KGAke2lvLmxlbmd0aH0gYXJnc2ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSBzdHJpbmdpZmllZDtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAoaW8gaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICB2YWx1ZSA9IGlvLnRvSVNPU3RyaW5nKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gdHJ1bmNhdGVTdHJpbmcoSlNPTi5zdHJpbmdpZnkoaW8pKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoWydzdHJpbmcnLCAnbnVtYmVyJywgJ2Jvb2xlYW4nXS5pbmNsdWRlcyh0eXBlKSkge1xuICAgIGlmIChpc1N0cmVhbUlkKGlvIGFzIHN0cmluZykpIHtcbiAgICAgIHZhbHVlID0gaW8udG9TdHJpbmcoKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIChpbyBhcyBzdHJpbmcpLmluY2x1ZGVzKCdzdHJtXycpKSB7XG4gICAgICB2YWx1ZSA9IGlvIGFzIHN0cmluZztcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgPSB0cnVuY2F0ZVN0cmluZyhTdHJpbmcoaW8pKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSBgPCR7dHlwZX0+YDtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59O1xuXG5leHBvcnQgY29uc3QgbGlzdFJ1bnMgPSBhc3luYyAod29ybGQ6IFdvcmxkLCBvcHRzOiBJbnNwZWN0Q0xJT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHJlc29sdmVLZXkgPSBjcmVhdGVSZXNvbHZlcih3b3JsZCwgb3B0cz8uZGVjcnlwdCA/PyBmYWxzZSk7XG5cbiAgaWYgKG9wdHMuc3RlcElkIHx8IG9wdHMucnVuSWQpIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgICdGaWx0ZXJpbmcgYnkgc3RlcC1pZCBvciBydW4taWQgaXMgbm90IHN1cHBvcnRlZCBpbiBsaXN0IGNhbGxzLCBpZ25vcmluZyBmaWx0ZXIuJ1xuICAgICk7XG4gIH1cblxuICBjb25zdCByZXNvbHZlRGF0YSA9IG9wdHMud2l0aERhdGEgPyAnYWxsJyA6ICdub25lJztcblxuICAvLyBEZXRlcm1pbmUgd2hpY2ggcHJvcHMgdG8gc2hvdyBiYXNlZCBvbiB3aXRoRGF0YSBmbGFnXG4gIGNvbnN0IHByb3BzID0gb3B0cy53aXRoRGF0YVxuICAgID8gV09SS0ZMT1dfUlVOX0xJU1RFRF9QUk9QU1xuICAgIDogV09SS0ZMT1dfUlVOX0xJU1RFRF9QUk9QUy5maWx0ZXIoXG4gICAgICAgIChwcm9wKSA9PiAhV09SS0ZMT1dfUlVOX0lPX1BST1BTLmluY2x1ZGVzKHByb3ApXG4gICAgICApO1xuXG4gIC8vIEZvciBKU09OIG91dHB1dCwganVzdCBmZXRjaCBvbmNlIGFuZCByZXR1cm5cbiAgaWYgKG9wdHMuanNvbikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBydW5zID0gYXdhaXQgd29ybGQucnVucy5saXN0KHtcbiAgICAgICAgd29ya2Zsb3dOYW1lOiBvcHRzLndvcmtmbG93TmFtZSxcbiAgICAgICAgc3RhdHVzOiBvcHRzLnN0YXR1cyBhcyBhbnksXG4gICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICBzb3J0T3JkZXI6IG9wdHMuc29ydCB8fCAnZGVzYycsXG4gICAgICAgICAgY3Vyc29yOiBvcHRzLmN1cnNvcixcbiAgICAgICAgICBsaW1pdDogb3B0cy5saW1pdCB8fCBERUZBVUxUX1BBR0VfU0laRSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzb2x2ZURhdGEsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJ1bnNXaXRoSHlkcmF0ZWRJTyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBydW5zLmRhdGEubWFwKChyKSA9PiBoeWRyYXRlUmVzb3VyY2VJTyhyLCByZXNvbHZlS2V5KSlcbiAgICAgICk7XG4gICAgICBzaG93SnNvbih7IC4uLnJ1bnMsIGRhdGE6IHJ1bnNXaXRoSHlkcmF0ZWRJTyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGhhbmRsZUFwaUVycm9yKGVycm9yLCBvcHRzLmJhY2tlbmQpKSB7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGF3YWl0IHNldHVwTGlzdFBhZ2luYXRpb248V29ya2Zsb3dSdW4gfCBXb3JrZmxvd1J1bldpdGhvdXREYXRhPih7XG4gICAgaW5pdGlhbEN1cnNvcjogb3B0cy5jdXJzb3IsXG4gICAgaW50ZXJhY3RpdmU6IG9wdHMuaW50ZXJhY3RpdmUsXG4gICAgZmV0Y2hQYWdlOiBhc3luYyAoY3Vyc29yKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBydW5zID0gYXdhaXQgd29ybGQucnVucy5saXN0KHtcbiAgICAgICAgICB3b3JrZmxvd05hbWU6IG9wdHMud29ya2Zsb3dOYW1lLFxuICAgICAgICAgIHN0YXR1czogb3B0cy5zdGF0dXMgYXMgYW55LFxuICAgICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICAgIHNvcnRPcmRlcjogb3B0cy5zb3J0IHx8ICdkZXNjJyxcbiAgICAgICAgICAgIGN1cnNvcixcbiAgICAgICAgICAgIGxpbWl0OiBvcHRzLmxpbWl0IHx8IERFRkFVTFRfUEFHRV9TSVpFLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzb2x2ZURhdGEsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGE6IHJ1bnMuZGF0YSxcbiAgICAgICAgICBjdXJzb3I6IHJ1bnMuY3Vyc29yLFxuICAgICAgICAgIGhhc01vcmU6IHJ1bnMuaGFzTW9yZSxcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChoYW5kbGVBcGlFcnJvcihlcnJvciwgb3B0cy5iYWNrZW5kKSkge1xuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRpc3BsYXlQYWdlOiBhc3luYyAocnVucykgPT4ge1xuICAgICAgY29uc3QgcnVuc1dpdGhIeWRyYXRlZElPID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHJ1bnMubWFwKChyKSA9PiBoeWRyYXRlUmVzb3VyY2VJTyhyLCByZXNvbHZlS2V5KSlcbiAgICAgICk7XG4gICAgICBsb2dnZXIubG9nKHNob3dUYWJsZShydW5zV2l0aEh5ZHJhdGVkSU8sIHByb3BzLCBvcHRzKSk7XG4gICAgfSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVjZW50UnVuID0gYXN5bmMgKFxuICB3b3JsZDogV29ybGQsXG4gIG9wdHM6IEluc3BlY3RDTElPcHRpb25zID0ge31cbikgPT4ge1xuICBjb25zdCByZXNvbHZlS2V5ID0gY3JlYXRlUmVzb2x2ZXIod29ybGQsIG9wdHM/LmRlY3J5cHQgPz8gZmFsc2UpO1xuXG4gIGxvZ2dlci53YXJuKGBObyBydW5JZCBwcm92aWRlZCwgZmV0Y2hpbmcgZGF0YSBmb3IgbGF0ZXN0IHJ1biBpbnN0ZWFkLmApO1xuICB0cnkge1xuICAgIGNvbnN0IHJ1bnMgPSBhd2FpdCB3b3JsZC5ydW5zLmxpc3Qoe1xuICAgICAgcGFnaW5hdGlvbjogeyBsaW1pdDogMSwgc29ydE9yZGVyOiBvcHRzLnNvcnQgfHwgJ2Rlc2MnIH0sXG4gICAgICByZXNvbHZlRGF0YTogJ25vbmUnLCAvLyBEb24ndCBuZWVkIGRhdGEgZm9yIGp1c3QgZ2V0dGluZyB0aGUgSURcbiAgICB9KTtcbiAgICBydW5zLmRhdGEgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHJ1bnMuZGF0YS5tYXAoKHIpID0+IGh5ZHJhdGVSZXNvdXJjZUlPKHIsIHJlc29sdmVLZXkpKVxuICAgICk7XG4gICAgcmV0dXJuIHJ1bnMuZGF0YVswXTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaGFuZGxlQXBpRXJyb3IoZXJyb3IsIG9wdHMuYmFja2VuZCkpIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzaG93UnVuID0gYXN5bmMgKFxuICB3b3JsZDogV29ybGQsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIG9wdHM6IEluc3BlY3RDTElPcHRpb25zID0ge31cbikgPT4ge1xuICBjb25zdCByZXNvbHZlS2V5ID0gY3JlYXRlUmVzb2x2ZXIod29ybGQsIG9wdHM/LmRlY3J5cHQgPz8gZmFsc2UpO1xuXG4gIGlmIChvcHRzLndpdGhEYXRhKSB7XG4gICAgbG9nZ2VyLndhcm4oJ2B3aXRoRGF0YWAgZmxhZyBpcyBpZ25vcmVkIHdoZW4gc2hvd2luZyBpbmRpdmlkdWFsIHJlc291cmNlcycpO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgcnVuID0gYXdhaXQgd29ybGQucnVucy5nZXQocnVuSWQsIHsgcmVzb2x2ZURhdGE6ICdhbGwnIH0pO1xuICAgIGNvbnN0IHJ1bldpdGhIeWRyYXRlZElPID0gYXdhaXQgaHlkcmF0ZVJlc291cmNlSU8ocnVuLCByZXNvbHZlS2V5KTtcbiAgICBpZiAob3B0cy5qc29uKSB7XG4gICAgICBzaG93SnNvbihydW5XaXRoSHlkcmF0ZWRJTyk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChoYXNFeHBpcmVkRGF0YShydW4pKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIFwiVGhpcyBydW4ncyBkYXRhIChpbnB1dC9vdXRwdXQvZXJyb3IpIGhhcyBleHBpcmVkIGFuZCBpcyBubyBsb25nZXIgYXZhaWxhYmxlLlwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsb2dnZXIubG9nKHJ1bldpdGhIeWRyYXRlZElPKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGhhbmRsZUFwaUVycm9yKGVycm9yLCBvcHRzLmJhY2tlbmQpKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgbGlzdFN0ZXBzID0gYXN5bmMgKFxuICB3b3JsZDogV29ybGQsXG4gIG9wdHM6IEluc3BlY3RDTElPcHRpb25zID0ge1xuICAgIHJ1bklkOiB1bmRlZmluZWQsXG4gIH1cbikgPT4ge1xuICBjb25zdCByZXNvbHZlS2V5ID0gY3JlYXRlUmVzb2x2ZXIod29ybGQsIG9wdHM/LmRlY3J5cHQgPz8gZmFsc2UpO1xuXG4gIGlmIChvcHRzLnN0ZXBJZCkge1xuICAgIGxvZ2dlci53YXJuKFxuICAgICAgJ0ZpbHRlcmluZyBieSBzdGVwLWlkIGlzIG5vdCBzdXBwb3J0ZWQgaW4gbGlzdCBjYWxscywgaWdub3JpbmcgZmlsdGVyLidcbiAgICApO1xuICB9XG4gIGlmIChvcHRzLndvcmtmbG93TmFtZSkge1xuICAgIGxvZ2dlci53YXJuKFxuICAgICAgJ0ZpbHRlcmluZyBieSB3b3JrZmxvdy1uYW1lIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHN0ZXBzLCBpZ25vcmluZyBmaWx0ZXIuJ1xuICAgICk7XG4gIH1cblxuICBjb25zdCBydW5JZCA9IG9wdHMucnVuSWRcbiAgICA/IG9wdHMucnVuSWRcbiAgICA6IChhd2FpdCBnZXRSZWNlbnRSdW4od29ybGQsIG9wdHMpKT8ucnVuSWQ7XG4gIGlmICghcnVuSWQpIHtcbiAgICBsb2dnZXIuZXJyb3IoJ05vIHJ1biBmb3VuZC4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCByZXNvbHZlRGF0YSA9IG9wdHMud2l0aERhdGEgPyAnYWxsJyA6ICdub25lJztcblxuICAvLyBEZXRlcm1pbmUgd2hpY2ggcHJvcHMgdG8gc2hvdyBiYXNlZCBvbiB3aXRoRGF0YSBmbGFnXG4gIGNvbnN0IHByb3BzID0gb3B0cy53aXRoRGF0YVxuICAgID8gU1RFUF9MSVNURURfUFJPUFNcbiAgICA6IFNURVBfTElTVEVEX1BST1BTLmZpbHRlcigocHJvcCkgPT4gIVNURVBfSU9fUFJPUFMuaW5jbHVkZXMocHJvcCkpO1xuXG4gIC8vIEZvciBKU09OIG91dHB1dCwganVzdCBmZXRjaCBvbmNlIGFuZCByZXR1cm5cbiAgaWYgKG9wdHMuanNvbikge1xuICAgIGxvZ2dlci5kZWJ1ZyhgRmV0Y2hpbmcgc3RlcHMgZm9yIHJ1biAke3J1bklkfWApO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGVwQ2h1bmtzID0gYXdhaXQgd29ybGQuc3RlcHMubGlzdCh7XG4gICAgICAgIHJ1bklkLFxuICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgc29ydE9yZGVyOiBvcHRzLnNvcnQgfHwgJ2Rlc2MnLFxuICAgICAgICAgIGN1cnNvcjogb3B0cy5jdXJzb3IsXG4gICAgICAgICAgbGltaXQ6IG9wdHMubGltaXQgfHwgREVGQVVMVF9QQUdFX1NJWkUsXG4gICAgICAgIH0sXG4gICAgICAgIHJlc29sdmVEYXRhLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBzdGVwc1dpdGhIeWRyYXRlZElPID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHN0ZXBDaHVua3MuZGF0YS5tYXAoKHMpID0+IGh5ZHJhdGVSZXNvdXJjZUlPKHMsIHJlc29sdmVLZXkpKVxuICAgICAgKTtcbiAgICAgIHNob3dKc29uKHN0ZXBzV2l0aEh5ZHJhdGVkSU8pO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaGFuZGxlQXBpRXJyb3IoZXJyb3IsIG9wdHMuYmFja2VuZCkpIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgc2V0dXBMaXN0UGFnaW5hdGlvbjxTdGVwIHwgU3RlcFdpdGhvdXREYXRhPih7XG4gICAgaW5pdGlhbEN1cnNvcjogb3B0cy5jdXJzb3IsXG4gICAgaW50ZXJhY3RpdmU6IG9wdHMuaW50ZXJhY3RpdmUsXG4gICAgZmV0Y2hQYWdlOiBhc3luYyAoY3Vyc29yKSA9PiB7XG4gICAgICBsb2dnZXIuZGVidWcoYEZldGNoaW5nIHN0ZXBzIGZvciBydW4gJHtydW5JZH1gKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0ZXBDaHVua3MgPSBhd2FpdCB3b3JsZC5zdGVwcy5saXN0KHtcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgICBzb3J0T3JkZXI6IG9wdHMuc29ydCB8fCAnZGVzYycsXG4gICAgICAgICAgICBjdXJzb3IsXG4gICAgICAgICAgICBsaW1pdDogb3B0cy5saW1pdCB8fCBERUZBVUxUX1BBR0VfU0laRSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc29sdmVEYXRhLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiBzdGVwQ2h1bmtzLmRhdGEsXG4gICAgICAgICAgY3Vyc29yOiBzdGVwQ2h1bmtzLmN1cnNvcixcbiAgICAgICAgICBoYXNNb3JlOiBzdGVwQ2h1bmtzLmhhc01vcmUsXG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoaGFuZGxlQXBpRXJyb3IoZXJyb3IsIG9wdHMuYmFja2VuZCkpIHtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSxcbiAgICBkaXNwbGF5UGFnZTogYXN5bmMgKHN0ZXBzKSA9PiB7XG4gICAgICBjb25zdCBzdGVwc1dpdGhIeWRyYXRlZElPID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHN0ZXBzLm1hcCgocykgPT4gaHlkcmF0ZVJlc291cmNlSU8ocywgcmVzb2x2ZUtleSkpXG4gICAgICApO1xuICAgICAgbG9nZ2VyLmxvZyhzaG93VGFibGUoc3RlcHNXaXRoSHlkcmF0ZWRJTywgcHJvcHMsIG9wdHMpKTtcbiAgICAgIHNob3dJbnNwZWN0SW5mb0JveCgnc3RlcCcpO1xuICAgIH0sXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHNob3dTdGVwID0gYXN5bmMgKFxuICB3b3JsZDogV29ybGQsXG4gIHN0ZXBJZDogc3RyaW5nLFxuICBvcHRzOiBJbnNwZWN0Q0xJT3B0aW9ucyA9IHt9XG4pID0+IHtcbiAgY29uc3QgcmVzb2x2ZUtleSA9IGNyZWF0ZVJlc29sdmVyKHdvcmxkLCBvcHRzPy5kZWNyeXB0ID8/IGZhbHNlKTtcblxuICBpZiAob3B0cy53aXRoRGF0YSkge1xuICAgIGxvZ2dlci53YXJuKCdgd2l0aERhdGFgIGZsYWcgaXMgaWdub3JlZCB3aGVuIHNob3dpbmcgaW5kaXZpZHVhbCByZXNvdXJjZXMnKTtcbiAgfVxuICBpZiAob3B0cy5zdGVwSWQpIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgICdGaWx0ZXJpbmcgYnkgc3RlcC1pZCBpcyBub3Qgc3VwcG9ydGVkIGluIGdldCBjYWxscywgaWdub3JpbmcgZmlsdGVyLidcbiAgICApO1xuICB9XG5cbiAgY29uc3QgcnVuSWQgPSBvcHRzLnJ1bklkID8/IChhd2FpdCBnZXRSZWNlbnRSdW4od29ybGQsIG9wdHMpKT8ucnVuSWQ7XG4gIGlmICghcnVuSWQpIHtcbiAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAncnVuLWlkIGlzIHJlcXVpcmVkIGZvciBzaG93aW5nIGEgc3RlcC4gVXNhZ2U6IGB3b3JrZmxvdyBpbnNwZWN0IHN0ZXAgPFNURVBfSUQ+IC0tcnVuSWQ9PFJVTl9JRD5gJ1xuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzdGVwID0gYXdhaXQgd29ybGQuc3RlcHMuZ2V0KHJ1bklkLCBzdGVwSWQsIHtcbiAgICAgIHJlc29sdmVEYXRhOiAnYWxsJyxcbiAgICB9KTtcbiAgICBjb25zdCBzdGVwV2l0aEh5ZHJhdGVkSU8gPSBhd2FpdCBoeWRyYXRlUmVzb3VyY2VJTyhzdGVwLCByZXNvbHZlS2V5KTtcbiAgICBpZiAob3B0cy5qc29uKSB7XG4gICAgICBzaG93SnNvbihzdGVwV2l0aEh5ZHJhdGVkSU8pO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoXG4gICAgICAgIGhhc0V4cGlyZWRGaWVsZHMoXG4gICAgICAgICAgc3RlcFdpdGhIeWRyYXRlZElPIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIFwiVGhpcyBzdGVwJ3MgZGF0YSAoaW5wdXQvb3V0cHV0L2Vycm9yKSBoYXMgZXhwaXJlZCBhbmQgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZS5cIlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmxvZyhzdGVwV2l0aEh5ZHJhdGVkSU8pO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaGFuZGxlQXBpRXJyb3IoZXJyb3IsIG9wdHMuYmFja2VuZCkpIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzaG93U3RyZWFtID0gYXN5bmMgKFxuICB3b3JsZDogV29ybGQsXG4gIHN0cmVhbUlkOiBzdHJpbmcsXG4gIG9wdHM6IEluc3BlY3RDTElPcHRpb25zID0ge31cbikgPT4ge1xuICBpZiAob3B0cy5zdGVwSWQpIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgICdGaWx0ZXJpbmcgYnkgc3RlcC1pZCBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gc2hvd2luZyBhIHN0cmVhbSwgaWdub3JpbmcgZmlsdGVyLidcbiAgICApO1xuICB9XG4gIGlmICghb3B0cy5ydW5JZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignLS1ydW4gaXMgcmVxdWlyZWQgd2hlbiBzaG93aW5nIGEgc3RyZWFtJyk7XG4gIH1cbiAgY29uc3QgcmF3U3RyZWFtID0gYXdhaXQgd29ybGQuc3RyZWFtcy5nZXQob3B0cy5ydW5JZCwgc3RyZWFtSWQpO1xuXG4gIC8vIE9ubHkgcmVzb2x2ZSB0aGUgZW5jcnlwdGlvbiBrZXkgd2hlbiAtLWRlY3J5cHQgaXMgcGFzc2VkIGFuZCAtLXJ1biBpcyBwcm92aWRlZC5cbiAgLy8gV2UgZmV0Y2ggdGhlIGZ1bGwgV29ya2Zsb3dSdW4gb2JqZWN0IHNvIHRoYXQgZ2V0RW5jcnlwdGlvbktleUZvclJ1biBoYXNcbiAgLy8gYWNjZXNzIHRvIHRoZSBkZXBsb3ltZW50SWQgKG5lZWRlZCBmb3IgQVBJLWJhc2VkIGtleSByZXNvbHV0aW9uKS5cbiAgbGV0IGVuY3J5cHRpb25LZXk6IEVuY3J5cHRpb25LZXlQYXJhbTtcbiAgaWYgKG9wdHMuZGVjcnlwdCAmJiBvcHRzLnJ1bklkKSB7XG4gICAgZW5jcnlwdGlvbktleSA9IChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBydW4gPSBhd2FpdCB3b3JsZC5ydW5zLmdldChvcHRzLnJ1bklkISk7XG4gICAgICBjb25zdCByYXdLZXkgPSBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4ocnVuKTtcbiAgICAgIHJldHVybiByYXdLZXkgPyBhd2FpdCBpbXBvcnRLZXkocmF3S2V5KSA6IHVuZGVmaW5lZDtcbiAgICB9KSgpO1xuICB9IGVsc2UgaWYgKG9wdHMuZGVjcnlwdCAmJiAhb3B0cy5ydW5JZCkge1xuICAgIGxvZ2dlci53YXJuKFxuICAgICAgJ0Nhbm5vdCBkZWNyeXB0IHN0cmVhbSBjb250ZW50IHdpdGhvdXQgYSBydW4gSUQuIFVzZSAtLXJ1bj08cnVuLWlkPiB3aXRoIC0tZGVjcnlwdC4nXG4gICAgKTtcbiAgfVxuXG4gIC8vIERlc2VyaWFsaXplIHRoZSBzdHJlYW0gdG8gZ2V0IEphdmFTY3JpcHQgb2JqZWN0c1xuICBjb25zdCByZXZpdmVycyA9IGdldEV4dGVybmFsUmV2aXZlcnMoXG4gICAgZ2xvYmFsVGhpcyxcbiAgICBbXSxcbiAgICBvcHRzLnJ1bklkID8/ICcnLFxuICAgIGVuY3J5cHRpb25LZXlcbiAgKTtcbiAgY29uc3QgdHJhbnNmb3JtID0gZ2V0RGVzZXJpYWxpemVTdHJlYW0ocmV2aXZlcnMsIGVuY3J5cHRpb25LZXkpO1xuICBjb25zdCBzdHJlYW0gPSByYXdTdHJlYW0ucGlwZVRocm91Z2godHJhbnNmb3JtKTtcblxuICBsb2dnZXIuaW5mbygnU3RyZWFtaW5nIHRvIHN0ZG91dCwgcHJlc3MgQ1RSTCtDIHRvIGFib3J0LicpO1xuICBsb2dnZXIuaW5mbyhcbiAgICAnVXNlIC0tanNvbiB0byBvdXRwdXQgdGhlIHN0cmVhbSBhcyBuZXdsaW5lLWRlbGltaXRlZCBKU09OIHdpdGhvdXQgaW5mbyBsb2dzLlxcbidcbiAgKTtcbiAgYXdhaXQgc3RyZWFtVG9Db25zb2xlKHN0cmVhbSwgc3RyZWFtSWQsIG9wdHMpO1xufTtcblxuLyoqXG4gKiBMaXN0aW5nIHN0cmVhbXMgb25seSBsaXN0cyBhdmFpbGFibGUgc3RyZWFtIElEcyBiYXNlZCBvbiBydW4vc3RlcCBwYXNzZWQsXG4gKiBhbmQgZG9lc24ndCByZWFkIGFueSBkYXRhIGZyb20gdGhlIHN0cmVhbXMuXG4gKi9cbmV4cG9ydCBjb25zdCBsaXN0U3RyZWFtc0J5UnVuSWQgPSBhc3luYyAoXG4gIHdvcmxkOiBXb3JsZCxcbiAgb3B0czogSW5zcGVjdENMSU9wdGlvbnMgPSB7fVxuKSA9PiB7XG4gIGlmIChvcHRzLndpdGhEYXRhKSB7XG4gICAgbG9nZ2VyLndhcm4oJ2B3aXRoRGF0YWAgZmxhZyBpcyBpZ25vcmVkIHdoZW4gbGlzdGluZyBzdHJlYW1zJyk7XG4gIH1cbiAgaWYgKG9wdHMud29ya2Zsb3dOYW1lKSB7XG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICAnRmlsdGVyaW5nIGJ5IHdvcmtmbG93LW5hbWUgaXMgbm90IHN1cHBvcnRlZCBmb3Igc3RyZWFtcywgaWdub3JpbmcgZmlsdGVyLidcbiAgICApO1xuICB9XG4gIGlmIChvcHRzLnN0ZXBJZCkge1xuICAgIGxvZ2dlci53YXJuKFxuICAgICAgJ0ZpbHRlcmluZyBieSBzdGVwLWlkIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHN0cmVhbXMsIGlnbm9yaW5nIGZpbHRlci4nXG4gICAgKTtcbiAgfVxuXG4gIGxldCBydW5JZCA9IG9wdHMucnVuSWQ7XG4gIGlmICghcnVuSWQpIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgICdObyBydW4taWQgcHJvdmlkZWQuIExpc3Rpbmcgc3RyZWFtcyBmb3IgbGF0ZXN0IHJ1biBpbnN0ZWFkLicsXG4gICAgICAnVXNlIC0tcnVuPTxydW4taWQ+IHRvIGZpbHRlciBzdHJlYW1zIGJ5IHJ1bi4nXG4gICAgKTtcbiAgICBjb25zdCBydW4gPSBhd2FpdCBnZXRSZWNlbnRSdW4od29ybGQsIG9wdHMpO1xuICAgIGlmICghcnVuKSB7XG4gICAgICBsb2dnZXIud2FybignTm8gcnVucyBmb3VuZC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcnVuSWQgPSBydW4ucnVuSWQ7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHN0cmVhbUlkcyA9IGF3YWl0IHdvcmxkLnN0cmVhbXMubGlzdChydW5JZCk7XG4gICAgY29uc3QgbWF0Y2hpbmdTdHJlYW1zID0gc3RyZWFtSWRzLm1hcCgoc3RyZWFtSWQpID0+ICh7XG4gICAgICBydW5JZCxcbiAgICAgIHN0cmVhbUlkLFxuICAgIH0pKTtcblxuICAgIGlmIChvcHRzLmpzb24pIHtcbiAgICAgIHNob3dKc29uKG1hdGNoaW5nU3RyZWFtcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxvZ2dlci5sb2coc2hvd1RhYmxlKG1hdGNoaW5nU3RyZWFtcywgWydydW5JZCcsICdzdHJlYW1JZCddKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGhhbmRsZUFwaUVycm9yKGVycm9yLCBvcHRzLmJhY2tlbmQpKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgbGlzdEV2ZW50cyA9IGFzeW5jIChcbiAgd29ybGQ6IFdvcmxkLFxuICBvcHRzOiBJbnNwZWN0Q0xJT3B0aW9ucyA9IHt9XG4pID0+IHtcbiAgY29uc3QgcmVzb2x2ZUtleSA9IGNyZWF0ZVJlc29sdmVyKHdvcmxkLCBvcHRzPy5kZWNyeXB0ID8/IGZhbHNlKTtcbiAgaWYgKG9wdHMud29ya2Zsb3dOYW1lKSB7XG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICAnRmlsdGVyaW5nIGJ5IHdvcmtmbG93LW5hbWUgaXMgbm90IHN1cHBvcnRlZCBmb3IgZXZlbnRzLCBpZ25vcmluZyBmaWx0ZXIuJ1xuICAgICk7XG4gIH1cblxuICBjb25zdCBydW5JZCA9IG9wdHMucnVuSWQgPz8gKGF3YWl0IGdldFJlY2VudFJ1bih3b3JsZCwgb3B0cykpPy5ydW5JZDtcbiAgaWYgKCFydW5JZCkge1xuICAgIGxvZ2dlci5lcnJvcignTm8gcnVuIGZvdW5kLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNvcnJlbGF0aW9uSWRGaWx0ZXIgPSBvcHRzLmhvb2tJZCB8fCBvcHRzLnN0ZXBJZDtcbiAgY29uc3QgcGFyYW1zOiBMaXN0RXZlbnRzUGFyYW1zID0ge1xuICAgIHJ1bklkLFxuICAgIHBhZ2luYXRpb246IHtcbiAgICAgIHNvcnRPcmRlcjogb3B0cy5zb3J0IHx8ICdkZXNjJyxcbiAgICAgIGN1cnNvcjogb3B0cy5jdXJzb3IsXG4gICAgICBsaW1pdDogb3B0cy5saW1pdCB8fCBERUZBVUxUX1BBR0VfU0laRSxcbiAgICB9LFxuICAgIHJlc29sdmVEYXRhOiBvcHRzLndpdGhEYXRhID8gJ2FsbCcgOiAnbm9uZScsXG4gIH07XG4gIGNvbnN0IGxpc3RDYWxsID0gYXN5bmMgKHBhZ2luYXRpb246IFBhZ2luYXRpb25PcHRpb25zKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd29ybGQuZXZlbnRzLmxpc3Qoe1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgcGFnaW5hdGlvbjogeyAuLi5wYXJhbXMucGFnaW5hdGlvbiwgLi4ucGFnaW5hdGlvbiB9LFxuICAgIH0pO1xuICAgIGlmIChjb3JyZWxhdGlvbklkRmlsdGVyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgIGRhdGE6IHJlc3VsdC5kYXRhLmZpbHRlcihcbiAgICAgICAgICAoZSkgPT4gZS5jb3JyZWxhdGlvbklkID09PSBjb3JyZWxhdGlvbklkRmlsdGVyXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8vIERldGVybWluZSB3aGljaCBwcm9wcyB0byBzaG93IGJhc2VkIG9uIHdpdGhEYXRhIGZsYWdcbiAgY29uc3QgcHJvcHMgPSBvcHRzLndpdGhEYXRhXG4gICAgPyBFVkVOVF9MSVNURURfUFJPUFNcbiAgICA6IEVWRU5UX0xJU1RFRF9QUk9QUy5maWx0ZXIoKHByb3ApID0+ICFFVkVOVF9JT19QUk9QUy5pbmNsdWRlcyhwcm9wKSk7XG5cbiAgLy8gRm9yIEpTT04gb3V0cHV0LCBqdXN0IGZldGNoIG9uY2UgYW5kIHJldHVyblxuICBpZiAob3B0cy5qc29uKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBGZXRjaGluZyBldmVudHMgZm9yIHJ1biAke3J1bklkfWApO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBldmVudHMgPSBhd2FpdCBsaXN0Q2FsbCh7fSk7XG4gICAgICBjb25zdCBoeWRyYXRlZEV2ZW50cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBldmVudHMuZGF0YS5tYXAoKGUpID0+IGh5ZHJhdGVSZXNvdXJjZUlPKGUsIHJlc29sdmVLZXkpKVxuICAgICAgKTtcbiAgICAgIHNob3dKc29uKGh5ZHJhdGVkRXZlbnRzKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGhhbmRsZUFwaUVycm9yKGVycm9yLCBvcHRzLmJhY2tlbmQpKSB7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGF3YWl0IHNldHVwTGlzdFBhZ2luYXRpb248RXZlbnQ+KHtcbiAgICBpbml0aWFsQ3Vyc29yOiBvcHRzLmN1cnNvcixcbiAgICBpbnRlcmFjdGl2ZTogb3B0cy5pbnRlcmFjdGl2ZSxcbiAgICBmZXRjaFBhZ2U6IGFzeW5jIChjdXJzb3IpID0+IHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgRmV0Y2hpbmcgZXZlbnRzIGZvciBydW4gJHtydW5JZH1gKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGV2ZW50cyA9IGF3YWl0IGxpc3RDYWxsKHsgY3Vyc29yIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGE6IGV2ZW50cy5kYXRhLFxuICAgICAgICAgIGN1cnNvcjogZXZlbnRzLmN1cnNvcixcbiAgICAgICAgICBoYXNNb3JlOiBldmVudHMuaGFzTW9yZSxcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChoYW5kbGVBcGlFcnJvcihlcnJvciwgb3B0cy5iYWNrZW5kKSkge1xuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRpc3BsYXlQYWdlOiBhc3luYyAoZXZlbnRzKSA9PiB7XG4gICAgICBjb25zdCBoeWRyYXRlZEV2ZW50cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBldmVudHMubWFwKChlKSA9PiBoeWRyYXRlUmVzb3VyY2VJTyhlLCByZXNvbHZlS2V5KSlcbiAgICAgICk7XG4gICAgICBsb2dnZXIubG9nKHNob3dUYWJsZShoeWRyYXRlZEV2ZW50cywgcHJvcHMsIG9wdHMpKTtcbiAgICAgIHNob3dJbnNwZWN0SW5mb0JveCgnZXZlbnQnKTtcbiAgICB9LFxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBsaXN0SG9va3MgPSBhc3luYyAod29ybGQ6IFdvcmxkLCBvcHRzOiBJbnNwZWN0Q0xJT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHJlc29sdmVLZXkgPSBjcmVhdGVSZXNvbHZlcih3b3JsZCwgb3B0cz8uZGVjcnlwdCA/PyBmYWxzZSk7XG5cbiAgaWYgKG9wdHMud29ya2Zsb3dOYW1lKSB7XG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICAnRmlsdGVyaW5nIGJ5IHdvcmtmbG93LW5hbWUgaXMgbm90IHN1cHBvcnRlZCBmb3IgaG9va3MsIGlnbm9yaW5nIGZpbHRlci4nXG4gICAgKTtcbiAgfVxuICBpZiAob3B0cy5zdGVwSWQpIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgICdGaWx0ZXJpbmcgYnkgc3RlcC1pZCBpcyBub3Qgc3VwcG9ydGVkIGZvciBob29rcywgaWdub3JpbmcgZmlsdGVyLidcbiAgICApO1xuICB9XG5cbiAgY29uc3QgcnVuSWQgPSBvcHRzLnJ1bklkO1xuICBjb25zdCByZXNvbHZlRGF0YSA9IG9wdHMud2l0aERhdGEgPyAnYWxsJyA6ICdub25lJztcblxuICAvLyBGb3IgSlNPTiBvdXRwdXQsIGp1c3QgZmV0Y2ggb25jZSBhbmQgcmV0dXJuXG4gIGlmIChvcHRzLmpzb24pIHtcbiAgICBpZiAoIXJ1bklkKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ0ZldGNoaW5nIGFsbCBob29rcycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2dnZXIuZGVidWcoYEZldGNoaW5nIGhvb2tzIGZvciBydW4gJHtydW5JZH1gKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGhvb2tzID0gYXdhaXQgd29ybGQuaG9va3MubGlzdCh7XG4gICAgICAgIHJ1bklkLFxuICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgc29ydE9yZGVyOiBvcHRzLnNvcnQgfHwgJ2Rlc2MnLFxuICAgICAgICAgIGN1cnNvcjogb3B0cy5jdXJzb3IsXG4gICAgICAgICAgbGltaXQ6IG9wdHMubGltaXQgfHwgREVGQVVMVF9QQUdFX1NJWkUsXG4gICAgICAgIH0sXG4gICAgICAgIHJlc29sdmVEYXRhLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBoeWRyYXRlZEhvb2tzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGhvb2tzLmRhdGEubWFwKChoKSA9PiBoeWRyYXRlUmVzb3VyY2VJTyhoLCByZXNvbHZlS2V5KSlcbiAgICAgICk7XG4gICAgICBzaG93SnNvbih7IC4uLmhvb2tzLCBkYXRhOiBoeWRyYXRlZEhvb2tzIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaGFuZGxlQXBpRXJyb3IoZXJyb3IsIG9wdHMuYmFja2VuZCkpIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLy8gU2V0dXAgcGFnaW5hdGlvbiB3aXRoIG5ldyBtZWNoYW5pc21cbiAgYXdhaXQgc2V0dXBMaXN0UGFnaW5hdGlvbjxIb29rPih7XG4gICAgaW5pdGlhbEN1cnNvcjogb3B0cy5jdXJzb3IsXG4gICAgaW50ZXJhY3RpdmU6IG9wdHMuaW50ZXJhY3RpdmUsXG4gICAgZmV0Y2hQYWdlOiBhc3luYyAoY3Vyc29yKSA9PiB7XG4gICAgICBpZiAoIXJ1bklkKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnRmV0Y2hpbmcgYWxsIGhvb2tzJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZGVidWcoYEZldGNoaW5nIGhvb2tzIGZvciBydW4gJHtydW5JZH1gKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhvb2tzID0gYXdhaXQgd29ybGQuaG9va3MubGlzdCh7XG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICAgICAgc29ydE9yZGVyOiBvcHRzLnNvcnQgfHwgJ2Rlc2MnLFxuICAgICAgICAgICAgY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHMubGltaXQgfHwgREVGQVVMVF9QQUdFX1NJWkUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNvbHZlRGF0YSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YTogaG9va3MuZGF0YSxcbiAgICAgICAgICBjdXJzb3I6IGhvb2tzLmN1cnNvcixcbiAgICAgICAgICBoYXNNb3JlOiBob29rcy5oYXNNb3JlLFxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGhhbmRsZUFwaUVycm9yKGVycm9yLCBvcHRzLmJhY2tlbmQpKSB7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0sXG4gICAgZGlzcGxheVBhZ2U6IGFzeW5jIChob29rcykgPT4ge1xuICAgICAgY29uc3QgaHlkcmF0ZWRIb29rcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBob29rcy5tYXAoKGgpID0+IGh5ZHJhdGVSZXNvdXJjZUlPKGgsIHJlc29sdmVLZXkpKVxuICAgICAgKTtcbiAgICAgIGxvZ2dlci5sb2coc2hvd1RhYmxlKGh5ZHJhdGVkSG9va3MsIEhPT0tfTElTVEVEX1BST1BTLCBvcHRzKSk7XG4gICAgICBzaG93SW5zcGVjdEluZm9Cb3goJ2hvb2snKTtcbiAgICB9LFxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBzaG93SG9vayA9IGFzeW5jIChcbiAgd29ybGQ6IFdvcmxkLFxuICBob29rSWQ6IHN0cmluZyxcbiAgb3B0czogSW5zcGVjdENMSU9wdGlvbnMgPSB7fVxuKSA9PiB7XG4gIGNvbnN0IHJlc29sdmVLZXkgPSBjcmVhdGVSZXNvbHZlcih3b3JsZCwgb3B0cz8uZGVjcnlwdCA/PyBmYWxzZSk7XG5cbiAgaWYgKG9wdHMud2l0aERhdGEpIHtcbiAgICBsb2dnZXIud2FybignYHdpdGhEYXRhYCBmbGFnIGlzIGlnbm9yZWQgd2hlbiBzaG93aW5nIGluZGl2aWR1YWwgcmVzb3VyY2VzJyk7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBob29rID0gYXdhaXQgd29ybGQuaG9va3MuZ2V0KGhvb2tJZCwge1xuICAgICAgcmVzb2x2ZURhdGE6ICdhbGwnLFxuICAgIH0pO1xuICAgIGNvbnN0IGh5ZHJhdGVkSG9vayA9IGF3YWl0IGh5ZHJhdGVSZXNvdXJjZUlPKGhvb2ssIHJlc29sdmVLZXkpO1xuICAgIGlmIChvcHRzLmpzb24pIHtcbiAgICAgIHNob3dKc29uKGh5ZHJhdGVkSG9vayk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChcbiAgICAgICAgaGFzRXhwaXJlZEZpZWxkcyhoeWRyYXRlZEhvb2sgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgICkge1xuICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICBcIlRoaXMgaG9vaydzIGRhdGEgKG1ldGFkYXRhKSBoYXMgZXhwaXJlZCBhbmQgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZS5cIlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmxvZyhoeWRyYXRlZEhvb2spO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaGFuZGxlQXBpRXJyb3IoZXJyb3IsIG9wdHMuYmFja2VuZCkpIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBsaXN0U2xlZXBzID0gYXN5bmMgKFxuICB3b3JsZDogV29ybGQsXG4gIG9wdHM6IEluc3BlY3RDTElPcHRpb25zID0ge31cbikgPT4ge1xuICBpZiAoIW9wdHMucnVuSWQpIHtcbiAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAncnVuLWlkIGlzIHJlcXVpcmVkIGZvciBsaXN0aW5nIHNsZWVwcy4gVXNhZ2U6IGB3b3JrZmxvdyBpbnNwZWN0IHNsZWVwcyAtLXJ1bklkPTxpZD5gJ1xuICAgICk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKG9wdHMuc3RlcElkKSB7XG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICAnRmlsdGVyaW5nIGJ5IHN0ZXAtaWQgaXMgbm90IHN1cHBvcnRlZCBmb3Igc2xlZXBzLCBpZ25vcmluZyBmaWx0ZXIuJ1xuICAgICk7XG4gIH1cbiAgaWYgKG9wdHMud29ya2Zsb3dOYW1lKSB7XG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICAnRmlsdGVyaW5nIGJ5IHdvcmtmbG93LW5hbWUgaXMgbm90IHN1cHBvcnRlZCBmb3Igc2xlZXBzLCBpZ25vcmluZyBmaWx0ZXIuJ1xuICAgICk7XG4gIH1cbiAgaWYgKG9wdHMud2l0aERhdGEpIHtcbiAgICBsb2dnZXIud2FybignYHdpdGhEYXRhYCBmbGFnIGlzIGlnbm9yZWQgd2hlbiBsaXN0aW5nIHNsZWVwcycpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBGZXRjaCBhbGwgZXZlbnRzIGZvciB0aGUgcnVuIHdpdGggcmVzb2x2ZURhdGE9J2FsbCcgdG8gZ2V0IHdhaXQgZXZlbnREYXRhXG4gICAgY29uc3QgZXZlbnRzID0gYXdhaXQgd29ybGQuZXZlbnRzLmxpc3Qoe1xuICAgICAgcnVuSWQ6IG9wdHMucnVuSWQsXG4gICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgIHNvcnRPcmRlcjogb3B0cy5zb3J0IHx8ICdkZXNjJyxcbiAgICAgICAgbGltaXQ6IDEwMDAsXG4gICAgICB9LFxuICAgICAgcmVzb2x2ZURhdGE6ICdhbGwnLFxuICAgIH0pO1xuXG4gICAgLy8gU2hvdyBpbmZvIG1lc3NhZ2UgaWYgdGhlcmUgbWlnaHQgYmUgbW9yZSBzbGVlcHNcbiAgICBpZiAoZXZlbnRzLmhhc01vcmUpIHtcbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAnV2FybmluZzogVGhpcyBydW4gaGFzIG1vcmUgdGhhbiAxMDAwIGV2ZW50cy4gU29tZSBzbGVlcHMgbWlnaHQgbm90IGJlIHNob3duLiBQbGVhc2UgdXNlIHRoZSB3ZWIgVUkgdG8gZW5zdXJlIGdldHRpbmcgYSBjb21wbGV0ZSBsaXN0LidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gR3JvdXAgd2FpdCBldmVudHMgYnkgY29ycmVsYXRpb25JZFxuICAgIGNvbnN0IHdhaXRFdmVudHNCeUNvcnJlbGF0aW9uID0gbmV3IE1hcDxzdHJpbmcsIEV2ZW50W10+KCk7XG4gICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMuZGF0YSkge1xuICAgICAgaWYgKGV2ZW50LmNvcnJlbGF0aW9uSWQ/LnN0YXJ0c1dpdGgoJ3dhaXRfJykpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSB3YWl0RXZlbnRzQnlDb3JyZWxhdGlvbi5nZXQoZXZlbnQuY29ycmVsYXRpb25JZCkgPz8gW107XG4gICAgICAgIGV4aXN0aW5nLnB1c2goZXZlbnQpO1xuICAgICAgICB3YWl0RXZlbnRzQnlDb3JyZWxhdGlvbi5zZXQoZXZlbnQuY29ycmVsYXRpb25JZCwgZXhpc3RpbmcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3YWl0RXZlbnRzQnlDb3JyZWxhdGlvbi5zaXplID09PSAwKSB7XG4gICAgICBsb2dnZXIud2FybignTm8gc2xlZXBzIGZvdW5kIGZvciB0aGlzIHJ1bi4nKTtcbiAgICAgIGlmIChvcHRzLmpzb24pIHtcbiAgICAgICAgc2hvd0pzb24oW10pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmxvZyhcbiAgICAgICAgICBzaG93VGFibGUoW10gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSwgV0FJVF9MSVNURURfUFJPUFMsIHtcbiAgICAgICAgICAgIC4uLm9wdHMsXG4gICAgICAgICAgICBkaXNhYmxlUmVsYXRpdmVEYXRlczogdHJ1ZSxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIHNsZWVwcyBmcm9tIGdyb3VwZWQgd2FpdCBldmVudHNcbiAgICBjb25zdCBzbGVlcHM6IFNsZWVwW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtjb3JyZWxhdGlvbklkLCBjb3JyZWxhdGlvbkV2ZW50c10gb2Ygd2FpdEV2ZW50c0J5Q29ycmVsYXRpb24pIHtcbiAgICAgIC8vIFN0aXRjaCB1cCB3YWl0X2NyZWF0ZWQgYW5kIHdhaXRfY29tcGxldGVkIGV2ZW50c1xuICAgICAgY29uc3Qgd2FpdENyZWF0ZWQgPSBjb3JyZWxhdGlvbkV2ZW50cy5maW5kKFxuICAgICAgICAoZTogRXZlbnQpID0+IGUuZXZlbnRUeXBlID09PSAnd2FpdF9jcmVhdGVkJ1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHdhaXRDb21wbGV0ZWQgPSBjb3JyZWxhdGlvbkV2ZW50cy5maW5kKFxuICAgICAgICAoZTogRXZlbnQpID0+IGUuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnXG4gICAgICApO1xuXG4gICAgICBpZiAod2FpdENyZWF0ZWQpIHtcbiAgICAgICAgY29uc3Qgc2xlZXA6IFNsZWVwID0ge1xuICAgICAgICAgIGNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgcnVuSWQ6IHdhaXRDcmVhdGVkLnJ1bklkLFxuICAgICAgICAgIGV2ZW50SWQ6IHdhaXRDcmVhdGVkLmV2ZW50SWQsXG4gICAgICAgICAgY3JlYXRlZEF0OiB3YWl0Q3JlYXRlZC5jcmVhdGVkQXQsXG4gICAgICAgICAgcmVzdW1lQXQ6XG4gICAgICAgICAgICB3YWl0Q3JlYXRlZC5ldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnXG4gICAgICAgICAgICAgID8gd2FpdENyZWF0ZWQuZXZlbnREYXRhLnJlc3VtZUF0XG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGNvbXBsZXRlZEF0OiB3YWl0Q29tcGxldGVkPy5jcmVhdGVkQXQsXG4gICAgICAgIH07XG4gICAgICAgIHNsZWVwcy5wdXNoKHNsZWVwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTb3J0IHNsZWVwcyBieSBjcmVhdGVkQXRcbiAgICBzbGVlcHMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgdGltZUEgPSBhLmNyZWF0ZWRBdC5nZXRUaW1lKCk7XG4gICAgICBjb25zdCB0aW1lQiA9IGIuY3JlYXRlZEF0LmdldFRpbWUoKTtcbiAgICAgIHJldHVybiBvcHRzLnNvcnQgPT09ICdhc2MnID8gdGltZUEgLSB0aW1lQiA6IHRpbWVCIC0gdGltZUE7XG4gICAgfSk7XG5cbiAgICBpZiAob3B0cy5qc29uKSB7XG4gICAgICBzaG93SnNvbihzbGVlcHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZ2dlci5sb2coXG4gICAgICBzaG93VGFibGUoXG4gICAgICAgIHNsZWVwcyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+W10sXG4gICAgICAgIFdBSVRfTElTVEVEX1BST1BTLFxuICAgICAgICB7IC4uLm9wdHMsIGRpc2FibGVSZWxhdGl2ZURhdGVzOiB0cnVlIH1cbiAgICAgIClcbiAgICApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChoYW5kbGVBcGlFcnJvcihlcnJvciwgb3B0cy5iYWNrZW5kKSkge1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcbiJdfQ==
|
|
1123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9pbnNwZWN0L291dHB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdEQsT0FBTyxFQUVMLG9CQUFvQixFQUNwQixtQkFBbUIsR0FDcEIsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFOUUsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRTFCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDMUMsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUxQyxPQUFPLEVBQ0wsc0NBQXNDLEVBQ3RDLG1DQUFtQyxHQUNwQyxNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxZQUFZLEdBQ2IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVyRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxLQUFZLEVBQUUsT0FBZ0I7SUFDcEQsSUFBSSxDQUFDLE9BQU87UUFBRSxPQUFPLElBQUksQ0FBQztJQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQjtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQy9DLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxFQUEyQyxDQUFDO0lBQ2pFLE9BQU8sQ0FBQyxLQUFhLEVBQUUsRUFBRTtRQUN2QixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUss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O1lBQ3BDLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDcEMsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUM3RCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2QsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxDQUFDLEdBQUcsQ0FDUixTQUFTLENBQ1AsTUFBOEMsRUFDOUMsaUJBQWlCLEVBQ2pCLEVBQUUsR0FBRyxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLENBQ3hDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsSUFBSSxjQUFjLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEIsQ0FBQztRQUNELE1BQU0sS0FBSyxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGltcG9ydEtleSB9IGZyb20gJ0B3b3JrZmxvdy9jb3JlL2VuY3J5cHRpb24nO1xuaW1wb3J0IHtcbiAgdHlwZSBFbmNyeXB0aW9uS2V5UGFyYW0sXG4gIGdldERlc2VyaWFsaXplU3RyZWFtLFxuICBnZXRFeHRlcm5hbFJldml2ZXJzLFxufSBmcm9tICdAd29ya2Zsb3cvY29yZS9zZXJpYWxpemF0aW9uJztcbmltcG9ydCB7IFZFUkNFTF80MDNfRVJST1JfTUVTU0FHRSB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgcGFyc2VTdGVwTmFtZSwgcGFyc2VXb3JrZmxvd05hbWUgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvcGFyc2UtbmFtZSc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50LCBIb29rLCBTdGVwLCBXb3JrZmxvd1J1biwgV29ybGQgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcblxuaW1wb3J0IHsgZm9ybWF0RGlzdGFuY2UgfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgVGFibGUgZnJvbSAnZWFzeS10YWJsZSc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9jb25maWcvbG9nLmpzJztcbmltcG9ydCB0eXBlIHsgSW5zcGVjdENMSU9wdGlvbnMgfSBmcm9tICcuLi9jb25maWcvdHlwZXMuanMnO1xuaW1wb3J0IHtcbiAgZ2V0T2JzZXJ2YWJpbGl0eVVwZ3JhZGVSZXF1aXJlZE1lc3NhZ2UsXG4gIGlzT2JzZXJ2YWJpbGl0eVVwZ3JhZGVSZXF1aXJlZEVycm9yLFxufSBmcm9tICcuL2Vycm9ycy5qcyc7XG5pbXBvcnQge1xuICB0eXBlIEVuY3J5cHRpb25LZXlSZXNvbHZlcixcbiAgaHlkcmF0ZVJlc291cmNlSU8sXG4gIGlzRW5jcnlwdGVkUmVmLFxuICBpc0V4cGlyZWRSZWYsXG59IGZyb20gJy4vaHlkcmF0aW9uLmpzJztcbmltcG9ydCB7IHJlc29sdmVUaW1lV2luZG93IH0gZnJvbSAnLi90aW1lLXdpbmRvdy5qcyc7XG5cbi8qKlxuICogQ3JlYXRlIGFuIEVuY3J5cHRpb25LZXlSZXNvbHZlciBmcm9tIGEgV29ybGQgaW5zdGFuY2UuXG4gKiBSZXR1cm5zIG51bGwgaWYgZGVjcnlwdCBpcyBmYWxzZSDigJQgZW5jcnlwdGVkIGRhdGEgd2lsbCBzaG93IGFzIGEgcGxhY2Vob2xkZXIuXG4gKlxuICogVGhlIHJlc29sdmVyIGZldGNoZXMgdGhlIGZ1bGwgV29ya2Zsb3dSdW4gKGNhY2hlZCBwZXIgcnVuSWQpIHNvIHRoYXQgdGhlXG4gKiBXb3JsZCBjYW4gaW5zcGVjdCBkZXBsb3ltZW50LXNwZWNpZmljIGZpZWxkcyBmb3Iga2V5IHJlc29sdXRpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJlc29sdmVyKHdvcmxkOiBXb3JsZCwgZGVjcnlwdDogYm9vbGVhbik6IEVuY3J5cHRpb25LZXlSZXNvbHZlciB7XG4gIGlmICghZGVjcnlwdCkgcmV0dXJuIG51bGw7XG4gIGlmICghd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bikgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8VWludDhBcnJheSB8IHVuZGVmaW5lZD4+KCk7XG4gIHJldHVybiAocnVuSWQ6IHN0cmluZykgPT4ge1xuICAgIGxldCBjYWNoZWQgPSBjYWNoZS5nZXQocnVuSWQpO1xuICAgIGlmICghY2FjaGVkKSB7XG4gICAgICBjYWNoZWQgPSB3b3JsZC5ydW5zXG4gICAgICAgIC5nZXQocnVuSWQpXG4gICAgICAgIC50aGVuKChydW4pID0+IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4hKHJ1bikpO1xuICAgICAgY2FjaGUuc2V0KHJ1bklkLCBjYWNoZWQpO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkO1xuICB9O1xufVxuXG5pbXBvcnQge1xuICB0eXBlIEFuYWx5dGljc1BhZ2VJbmZvLFxuICB0eXBlIFBhZ2VEYXRhLFxuICBzZXR1cExpc3RQYWdpbmF0aW9uLFxufSBmcm9tICcuL3BhZ2luYXRpb24uanMnO1xuaW1wb3J0IHsgc3RyZWFtVG9Db25zb2xlIH0gZnJvbSAnLi9zdHJlYW0uanMnO1xuaW1wb3J0IHtcbiAgZm9ybWF0SVNPRGF0ZSxcbiAgZm9ybWF0U3RhdHVzIGFzIGZvcm1hdFN0YXR1c0FiYnJldixcbiAgZ2V0RGlzcGxheVNldHRpbmdzLFxuICBnZXRUZXJtaW5hbFdpZHRoLFxuICBpc0NJLFxufSBmcm9tICcuL3Rlcm1pbmFsLXV0aWxzLmpzJztcblxuY29uc3QgREVGQVVMVF9QQUdFX1NJWkUgPSAyMDtcbmxldCBUQUJMRV9UUlVOQ0FURV9JT19MRU5HVEggPSAxNTsgLy8gV2lsbCBiZSBhZGp1c3RlZCBiYXNlZCBvbiB0ZXJtaW5hbCB3aWR0aFxuXG5jb25zdCBXT1JLRkxPV19SVU5fSU9fUFJPUFM6IChrZXlvZiBXb3JrZmxvd1J1bilbXSA9IFsnaW5wdXQnLCAnb3V0cHV0J107XG5cbmNvbnN0IFNURVBfSU9fUFJPUFM6IChrZXlvZiBTdGVwKVtdID0gWydpbnB1dCcsICdvdXRwdXQnXTtcblxuY29uc3QgV09SS0ZMT1dfUlVOX0xJU1RFRF9QUk9QUzogKGtleW9mIFdvcmtmbG93UnVuKVtdID0gW1xuICAncnVuSWQnLFxuICAnd29ya2Zsb3dOYW1lJyxcbiAgJ3N0YXR1cycsXG4gICdzdGFydGVkQXQnLFxuICAnY29tcGxldGVkQXQnLFxuICAuLi5XT1JLRkxPV19SVU5fSU9fUFJPUFMsXG5dO1xuXG5jb25zdCBTVEVQX0xJU1RFRF9QUk9QUzogKGtleW9mIFN0ZXApW10gPSBbXG4gICdydW5JZCcsXG4gICdzdGVwSWQnLFxuICAnc3RlcE5hbWUnLFxuICAnc3RhdHVzJyxcbiAgJ3N0YXJ0ZWRBdCcsXG4gICdjb21wbGV0ZWRBdCcsXG4gIC4uLlNURVBfSU9fUFJPUFMsXG5dO1xuXG5jb25zdCBFVkVOVF9JT19QUk9QUzogKGtleW9mIEV2ZW50IHwgJ2V2ZW50RGF0YScpW10gPSBbJ2V2ZW50RGF0YSddO1xuXG5jb25zdCBFVkVOVF9MSVNURURfUFJPUFM6IChrZXlvZiBFdmVudCB8ICdldmVudERhdGEnKVtdID0gW1xuICAnZXZlbnRJZCcsXG4gICdldmVudFR5cGUnLFxuICAnY29ycmVsYXRpb25JZCcsXG4gICdjcmVhdGVkQXQnLFxuICAuLi5FVkVOVF9JT19QUk9QUyxcbl07XG5cbi8vIGNvbnN0IEhPT0tfREFUQV9QUk9QUzogKGtleW9mIEhvb2sgfCAnaGFzUmVzcG9uc2UnKVtdID0gWydoYXNSZXNwb25zZSddO1xuXG5jb25zdCBIT09LX0xJU1RFRF9QUk9QUzogKGtleW9mIEhvb2sgfCAnaGFzUmVzcG9uc2UnKVtdID0gW1xuICAncnVuSWQnLFxuICAnaG9va0lkJyxcbiAgJ293bmVySWQnLFxuICAnY3JlYXRlZEF0JyxcbiAgLy8gLi4uSE9PS19EQVRBX1BST1BTLFxuXTtcblxuaW50ZXJmYWNlIFNsZWVwIHtcbiAgY29ycmVsYXRpb25JZDogc3RyaW5nO1xuICBydW5JZDogc3RyaW5nO1xuICBldmVudElkOiBzdHJpbmc7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbiAgcmVzdW1lQXQ6IERhdGUgfCB1bmRlZmluZWQ7XG4gIGNvbXBsZXRlZEF0OiBEYXRlIHwgdW5kZWZpbmVkO1xufVxuXG5jb25zdCBXQUlUX0xJU1RFRF9QUk9QUzogKGtleW9mIFNsZWVwKVtdID0gW1xuICAnY29ycmVsYXRpb25JZCcsXG4gICdldmVudElkJyxcbiAgJ2NyZWF0ZWRBdCcsXG4gICdyZXN1bWVBdCcsXG4gICdjb21wbGV0ZWRBdCcsXG5dO1xuXG5jb25zdCBTVEFUVVNfQ09MT1JTOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IHN0cmluZykgPT4gc3RyaW5nPiA9IHtcbiAgcnVubmluZzogY2hhbGsuYmx1ZSxcbiAgY29tcGxldGVkOiBjaGFsay5ncmVlbixcbiAgZmFpbGVkOiBjaGFsay5yZWQsXG4gIGNhbmNlbGxlZDogY2hhbGsuc3RyaWtldGhyb3VnaC55ZWxsb3csXG4gIHBlbmRpbmc6IGNoYWxrLmJsdWUsXG4gIHdhaXRpbmc6IGNoYWxrLmJsdWUsXG59O1xuXG5jb25zdCBpc1N0cmVhbUlkID0gKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuc3RhcnRzV2l0aCgnc3RybV8nKTtcbn07XG5cbmNvbnN0IHNob3dTdGF0dXNMZWdlbmQgPSAoKSA9PiB7XG4gIGxvZ2dlci5sb2coJ1xcblN0YXR1cyBMZWdlbmQ6Jyk7XG4gIGNvbnN0IHN0YXR1c2VzID0gW1xuICAgICdydW5uaW5nJyxcbiAgICAnY29tcGxldGVkJyxcbiAgICAnZmFpbGVkJyxcbiAgICAnY2FuY2VsbGVkJyxcbiAgICAncGVuZGluZycsXG4gICAgJ3dhaXRpbmcnLFxuICBdO1xuXG4gIGNvbnN0IGxlZ2VuZEl0ZW1zID0gc3RhdHVzZXMubWFwKChzdGF0dXMpID0+IHtcbiAgICBjb25zdCBjb2xvckZ1bmMgPSBTVEFUVVNfQ09MT1JTW3N0YXR1c107XG4gICAgY29uc3QgYWJicmV2ID0gZm9ybWF0U3RhdHVzQWJicmV2KHN0YXR1cywgdHJ1ZSk7XG4gICAgcmV0dXJuIGAke2NvbG9yRnVuYyhhYmJyZXYpfSA9ICR7c3RhdHVzfWA7XG4gIH0pO1xuXG4gIGxvZ2dlci5sb2coYCAgJHtsZWdlbmRJdGVtcy5qb2luKCcgICcpfWApO1xuICBsb2dnZXIubG9nKCcnKTtcbn07XG5cbmNvbnN0IGlzU2xlZXBTdGVwID0gKHN0ZXBOYW1lOiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIHN0ZXBOYW1lLmluY2x1ZGVzKCctc2xlZXAnKTtcbn07XG5cbmNvbnN0IGNoZWNrQW5kSGFuZGxlVmVyY2VsQWNjZXNzRXJyb3IgPSAoXG4gIGVycm9yOiB1bmtub3duLFxuICBiYWNrZW5kPzogc3RyaW5nXG4pOiBib29sZWFuID0+IHtcbiAgaWYgKGJhY2tlbmQgPT09ICd2ZXJjZWwnICYmIGVycm9yICYmIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBlcnIgPSBlcnJvciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAoZXJyLnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoVkVSQ0VMXzQwM19FUlJPUl9NRVNTQUdFKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5jb25zdCBleHRyYWN0RXJyb3JNZXNzYWdlID0gKFxuICBlcnI6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoZXJyLm1lc3NhZ2UgJiYgdHlwZW9mIGVyci5tZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBlcnIubWVzc2FnZTtcbiAgfVxuXG4gIGlmIChlcnIuYm9keSAmJiB0eXBlb2YgZXJyLmJvZHkgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgYm9keSA9IGVyci5ib2R5IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGlmIChib2R5Lm1lc3NhZ2UgJiYgdHlwZW9mIGJvZHkubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBib2R5Lm1lc3NhZ2U7XG4gICAgfVxuICAgIGlmIChib2R5LmVycm9yICYmIHR5cGVvZiBib2R5LmVycm9yID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGJvZHkuZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IGdldFBhZ2VJbmZvID0gKHJlc3VsdDogdW5rbm93bik6IEFuYWx5dGljc1BhZ2VJbmZvIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKFxuICAgIHR5cGVvZiByZXN1bHQgIT09ICdvYmplY3QnIHx8XG4gICAgcmVzdWx0ID09PSBudWxsIHx8XG4gICAgISgncGFnZUluZm8nIGluIHJlc3VsdClcbiAgKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gKHJlc3VsdCBhcyB7IHBhZ2VJbmZvPzogQW5hbHl0aWNzUGFnZUluZm8gfSkucGFnZUluZm87XG59O1xuXG5jb25zdCBoYW5kbGVBcGlFcnJvciA9IChlcnJvcjogdW5rbm93biwgYmFja2VuZD86IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAvLyBGaXJzdCBjaGVjayBmb3IgVmVyY2VsIGFjY2VzcyBlcnJvcnNcbiAgaWYgKGNoZWNrQW5kSGFuZGxlVmVyY2VsQWNjZXNzRXJyb3IoZXJyb3IsIGJhY2tlbmQpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoaXNPYnNlcnZhYmlsaXR5VXBncmFkZVJlcXVpcmVkRXJyb3IoZXJyb3IpKSB7XG4gICAgbG9nZ2VyLmVycm9yKGdldE9ic2VydmFiaWxpdHlVcGdyYWRlUmVxdWlyZWRNZXNzYWdlKCkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gSGFuZGxlIG90aGVyIEhUVFAgZXJyb3JzXG4gIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgZXJyID0gZXJyb3IgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAvLyBIYW5kbGUgNDAwIEJhZCBSZXF1ZXN0XG4gICAgaWYgKGVyci5zdGF0dXMgPT09IDQwMCkge1xuICAgICAgbG9nZ2VyLmVycm9yKCdCYWQgUmVxdWVzdDogVGhlIHJlcXVlc3Qgd2FzIGludmFsaWQuJyk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXh0cmFjdEVycm9yTWVzc2FnZShlcnIpO1xuICAgICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBEZXRhaWxzOiAke21lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgb3RoZXIgSFRUUCBlcnJvcnMgKDQwNCwgNTAwLCBldGMuKVxuICAgIGlmICh0eXBlb2YgZXJyLnN0YXR1cyA9PT0gJ251bWJlcicgJiYgZXJyLnN0YXR1cyA+PSA0MDApIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgSFRUUCBFcnJvciAke2Vyci5zdGF0dXN9OiAke2dldFN0YXR1c1RleHQoZXJyLnN0YXR1cyl9YCk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXh0cmFjdEVycm9yTWVzc2FnZShlcnIpO1xuICAgICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBEZXRhaWxzOiAke21lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5jb25zdCBnZXRTdGF0dXNUZXh0ID0gKHN0YXR1czogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgY29uc3Qgc3RhdHVzVGV4dHM6IFJlY29yZDxudW1iZXIsIHN0cmluZz4gPSB7XG4gICAgNDAwOiAnQmFkIFJlcXVlc3QnLFxuICAgIDQwMTogJ1VuYXV0aG9yaXplZCcsXG4gICAgNDAyOiAnUGF5bWVudCBSZXF1aXJlZCcsXG4gICAgNDAzOiAnRm9yYmlkZGVuJyxcbiAgICA0MDQ6ICdOb3QgRm91bmQnLFxuICAgIDQyOTogJ1RvbyBNYW55IFJlcXVlc3RzJyxcbiAgICA1MDA6ICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InLFxuICAgIDUwMjogJ0JhZCBHYXRld2F5JyxcbiAgICA1MDM6ICdTZXJ2aWNlIFVuYXZhaWxhYmxlJyxcbiAgfTtcbiAgcmV0dXJuIHN0YXR1c1RleHRzW3N0YXR1c10gfHwgJ1Vua25vd24gRXJyb3InO1xufTtcblxuY29uc3QgdHJ1bmNhdGVOYW1lSWZOZWVkZWQgPSAobmFtZTogc3RyaW5nLCBtYXhMZW5ndGg6IG51bWJlcik6IHN0cmluZyA9PiB7XG4gIHJldHVybiBtYXhMZW5ndGggPCBuYW1lLmxlbmd0aCA/IGAke25hbWUuc3Vic3RyaW5nKDAsIG1heExlbmd0aCl9Li4uYCA6IG5hbWU7XG59O1xuXG5jb25zdCBmb3JtYXROYW1lRmllbGQgPSAoXG4gIG5hbWVOb25VbmlxdWU6IHN0cmluZyxcbiAgdHJ1bmNhdGVMZW5ndGg6IG51bWJlcixcbiAgaXNTbGVlcDogYm9vbGVhblxuKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdHJ1bmNhdGVkTmFtZSA9IHRydW5jYXRlTmFtZUlmTmVlZGVkKG5hbWVOb25VbmlxdWUsIHRydW5jYXRlTGVuZ3RoKTtcbiAgaWYgKGlzU2xlZXApIHtcbiAgICByZXR1cm4gY2hhbGsueWVsbG93QnJpZ2h0KHRydW5jYXRlZE5hbWUpO1xuICB9XG4gIHJldHVybiBjaGFsay5ibHVlLmJsdWVCcmlnaHQodHJ1bmNhdGVkTmFtZSk7XG59O1xuXG5jb25zdCBmb3JtYXRJZEZpZWxkID0gKFxuICBwcm9wOiBzdHJpbmcsXG4gIHZhbHVlOiB1bmtub3duLFxuICBzaG91bGRUcnVuY2F0ZUlkczogYm9vbGVhblxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgdmFsdWVTdHIgPSBTdHJpbmcodmFsdWUpO1xuICBjb25zdCBpZFN0ciA9IHNob3VsZFRydW5jYXRlSWRzID8gdHJ1bmNhdGVJZFRvTGFzdENoYXJzKHZhbHVlU3RyKSA6IHZhbHVlU3RyO1xuICBpZiAocHJvcCA9PT0gJ3N0cmVhbUlkJykge1xuICAgIHJldHVybiBjaGFsay5ncmVlbihpZFN0cik7XG4gIH1cbiAgcmV0dXJuIGlkU3RyO1xufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdFRhYmxlVmFsdWUgPSAoXG4gIHByb3A6IHN0cmluZyxcbiAgdmFsdWU6IHVua25vd24sXG4gIG9wdHM6IEluc3BlY3RDTElPcHRpb25zID0ge30sXG4gIGRpc3BsYXlTZXR0aW5ncz86IFJldHVyblR5cGU8dHlwZW9mIGdldERpc3BsYXlTZXR0aW5ncz4sXG4gIGl0ZW0/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKSA9PiB7XG4gIGNvbnN0IG5hbWVzVHJ1bmNhdGUgPSBkaXNwbGF5U2V0dGluZ3M/Lm5hbWVzVHJ1bmNhdGVMZW5ndGggPz8gNDA7XG4gIGNvbnN0IHNob3VsZFRydW5jYXRlSWRzID0gZGlzcGxheVNldHRpbmdzPy50cnVuY2F0ZUlkc1RvTGFzdENoYXJzID8/IGZhbHNlO1xuXG4gIC8vIEhhbmRsZSBJRHMgd2l0aCBwb3RlbnRpYWwgdHJ1bmNhdGlvblxuICBpZiAoXG4gICAgW1xuICAgICAgJ3N0cmVhbUlkJyxcbiAgICAgICdydW5JZCcsXG4gICAgICAnc3RlcElkJyxcbiAgICAgICdob29rSWQnLFxuICAgICAgJ2V2ZW50SWQnLFxuICAgICAgJ2NvcnJlbGF0aW9uSWQnLFxuICAgICAgJ293bmVySWQnLFxuICAgIF0uaW5jbHVkZXMocHJvcClcbiAgKSB7XG4gICAgcmV0dXJuIGZvcm1hdElkRmllbGQocHJvcCwgdmFsdWUsIHNob3VsZFRydW5jYXRlSWRzKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBuYW1lcyB3aXRoIHRydW5jYXRpb25cbiAgaWYgKHByb3AgPT09ICdzdGVwTmFtZScpIHtcbiAgICBjb25zdCBuYW1lTm9uVW5pcXVlID0gcGFyc2VTdGVwTmFtZShTdHJpbmcodmFsdWUpKT8uc2hvcnROYW1lIHx8ICc/JztcbiAgICByZXR1cm4gZm9ybWF0TmFtZUZpZWxkKFxuICAgICAgbmFtZU5vblVuaXF1ZSxcbiAgICAgIG5hbWVzVHJ1bmNhdGUsXG4gICAgICBpc1NsZWVwU3RlcChTdHJpbmcodmFsdWUpKVxuICAgICk7XG4gIH1cblxuICBpZiAocHJvcCA9PT0gJ3dvcmtmbG93TmFtZScpIHtcbiAgICBjb25zdCBuYW1lTm9uVW5pcXVlID0gcGFyc2VXb3JrZmxvd05hbWUoU3RyaW5nKHZhbHVlKSk/LnNob3J0TmFtZSB8fCAnPyc7XG4gICAgY29uc3QgdHJ1bmNhdGVkTmFtZSA9IHRydW5jYXRlTmFtZUlmTmVlZGVkKG5hbWVOb25VbmlxdWUsIG5hbWVzVHJ1bmNhdGUpO1xuICAgIHJldHVybiBjaGFsay5ibHVlLmJsdWVCcmlnaHQodHJ1bmNhdGVkTmFtZSk7XG4gIH1cblxuICBpZiAocHJvcCA9PT0gJ291dHB1dCcgfHwgcHJvcCA9PT0gJ2lucHV0JyB8fCBwcm9wID09PSAnZXJyb3InKSB7XG4gICAgaWYgKFxuICAgICAgaXRlbSAmJlxuICAgICAgJ2V4cGlyZWRBdCcgaW4gaXRlbSAmJlxuICAgICAgaXRlbS5leHBpcmVkQXQgIT0gbnVsbCAmJlxuICAgICAgbmV3IERhdGUoaXRlbS5leHBpcmVkQXQgYXMgc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSkgPCBuZXcgRGF0ZSgpXG4gICAgKSB7XG4gICAgICByZXR1cm4gRVhQSVJFRF9EQVRBX01FU1NBR0U7XG4gICAgfVxuICAgIHJldHVybiBpbmxpbmVGb3JtYXRJTyh2YWx1ZSk7XG4gIH1cblxuICBpZiAocHJvcCA9PT0gJ3N0YXR1cycpIHtcbiAgICBjb25zdCBzdGF0dXMgPSB2YWx1ZSBhcyBXb3JrZmxvd1J1blsnc3RhdHVzJ10gfCBTdGVwWydzdGF0dXMnXTtcbiAgICBjb25zdCBjb2xvckZ1bmMgPVxuICAgICAgU1RBVFVTX0NPTE9SU1tzdGF0dXNdID8/ICgoZm9ybWF0dGVkOiBzdHJpbmcpID0+IGZvcm1hdHRlZCk7XG4gICAgY29uc3QgZm9ybWF0dGVkU3RhdHVzID0gZGlzcGxheVNldHRpbmdzPy5hYmJyZXZpYXRlU3RhdHVzXG4gICAgICA/IGZvcm1hdFN0YXR1c0FiYnJldihzdGF0dXMsIHRydWUpXG4gICAgICA6IHN0YXR1cztcbiAgICByZXR1cm4gY29sb3JGdW5jKGZvcm1hdHRlZFN0YXR1cyk7XG4gIH1cblxuICBpZiAocHJvcCA9PT0gJ2V2ZW50RGF0YScpIHtcbiAgICByZXR1cm4gdHJ1bmNhdGVTdHJpbmcoSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgfVxuXG4gIGlmIChwcm9wID09PSAnaGFzUmVzcG9uc2UnKSB7XG4gICAgcmV0dXJuIHZhbHVlID8gY2hhbGsuZ3JlZW4oJ3RydWUnKSA6IGNoYWxrLmdyYXkoJ2ZhbHNlJyk7XG4gIH1cblxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuIGZvcm1hdFRhYmxlVGltZXN0YW1wKHZhbHVlLCBvcHRzLCBkaXNwbGF5U2V0dGluZ3MpO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuY29uc3QgZ2V0VmlzaWJsZVByb3BzID0gKFxuICBwcm9wczogc3RyaW5nW10sXG4gIGRpc3BsYXlTZXR0aW5nczogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0RGlzcGxheVNldHRpbmdzPlxuKTogc3RyaW5nW10gPT4ge1xuICBpZiAoZGlzcGxheVNldHRpbmdzLmhpZGVDb21wbGV0ZWRBdCkge1xuICAgIHJldHVybiBwcm9wcy5maWx0ZXIoKHByb3ApID0+IHByb3AgIT09ICdjb21wbGV0ZWRBdCcpO1xuICB9XG4gIHJldHVybiBwcm9wcztcbn07XG5cbmNvbnN0IHNob3dUYWJsZSA9IChcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSxcbiAgcHJvcHM6IHN0cmluZ1tdLFxuICBvcHRzOiBJbnNwZWN0Q0xJT3B0aW9ucyA9IHt9XG4pID0+IHtcbiAgLy8gR2V0IGRpc3BsYXkgc2V0dGluZ3MgYmFzZWQgb24gdGVybWluYWwgd2lkdGhcbiAgY29uc3QgdGVybWluYWxXaWR0aCA9IGdldFRlcm1pbmFsV2lkdGgoKTtcbiAgY29uc3QgZGlzcGxheVNldHRpbmdzID0gZ2V0RGlzcGxheVNldHRpbmdzKFxuICAgIHRlcm1pbmFsV2lkdGgsXG4gICAgb3B0cy53aXRoRGF0YSB8fCBmYWxzZSxcbiAgICBwcm9wcy5pbmNsdWRlcygncnVuTmFtZScpXG4gICk7XG5cbiAgLy8gRmlsdGVyIG91dCBjb21wbGV0ZWRBdCBjb2x1bW4gaWYgbmVlZGVkXG4gIGNvbnN0IHZpc2libGVQcm9wcyA9IGdldFZpc2libGVQcm9wcyhwcm9wcywgZGlzcGxheVNldHRpbmdzKTtcblxuICAvLyBVcGRhdGUgdHJ1bmNhdGUgbGVuZ3RoIGZvciBJTyBmaWVsZHNcbiAgY29uc3Qgb3JpZ2luYWxUcnVuY2F0ZUxlbmd0aCA9IFRBQkxFX1RSVU5DQVRFX0lPX0xFTkdUSDtcbiAgVEFCTEVfVFJVTkNBVEVfSU9fTEVOR1RIID0gZGlzcGxheVNldHRpbmdzLmRhdGFGaWVsZFdpZHRoO1xuXG4gIC8vIFNob3cgc3RhdHVzIGxlZ2VuZCBpZiB1c2luZyBhYmJyZXZpYXRlZCBzdGF0dXNcbiAgaWYgKFxuICAgIGRhdGEubGVuZ3RoID4gMCAmJlxuICAgIGRpc3BsYXlTZXR0aW5ncy5hYmJyZXZpYXRlU3RhdHVzICYmXG4gICAgdmlzaWJsZVByb3BzLmluY2x1ZGVzKCdzdGF0dXMnKVxuICApIHtcbiAgICBzaG93U3RhdHVzTGVnZW5kKCk7XG4gIH1cblxuICAvLyBDcmVhdGUgaGVhZGVyIG1hcHBpbmcgZm9yIGFiYnJldmlhdGVkIHN0YXR1c1xuICBjb25zdCBoZWFkZXJNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgaWYgKGRpc3BsYXlTZXR0aW5ncy5hYmJyZXZpYXRlU3RhdHVzICYmIHZpc2libGVQcm9wcy5pbmNsdWRlcygnc3RhdHVzJykpIHtcbiAgICBoZWFkZXJNYXBbJ3N0YXR1cyddID0gJ1MnO1xuICB9XG5cbiAgLy8gQWRkIGEgYmxhbmsgbGluZSBiZWZvcmUgYW55IHRhYmxlXG4gIGNvbnN0IHRhYmxlID0gbmV3IFRhYmxlKCk7XG4gIGlmIChkYXRhICYmIGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgbG9nZ2VyLndhcm4oJ05vIGRhdGEgZm91bmQgZm9yIHRoaXMgcXVlcnkgYW5kIHJlc291cmNlLlxcbicpO1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiB2aXNpYmxlUHJvcHMpIHtcbiAgICAgIGNvbnN0IGhlYWRlciA9IGhlYWRlck1hcFtwcm9wXSB8fCBwcm9wO1xuICAgICAgdGFibGUuY2VsbChoZWFkZXIsICdOL0EnKTtcbiAgICB9XG4gICAgdGFibGUubmV3Um93KCk7XG4gICAgLy8gUmVzdG9yZSBvcmlnaW5hbCB0cnVuY2F0ZSBsZW5ndGhcbiAgICBUQUJMRV9UUlVOQ0FURV9JT19MRU5HVEggPSBvcmlnaW5hbFRydW5jYXRlTGVuZ3RoO1xuICAgIHJldHVybiB0YWJsZS50b1N0cmluZygpO1xuICB9IGVsc2UgaWYgKCFkYXRhKSB7XG4gICAgbG9nZ2VyLndhcm4oJ0V4cGVjdGluZyBhbiBhcnJheSBvZiBkYXRhLCBidXQgZ290IG51bGwuXFxuJyk7XG4gIH1cbiAgbG9nZ2VyLmxvZygnJyk7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBkYXRhKSB7XG4gICAgZm9yIChjb25zdCBwcm9wIG9mIHZpc2libGVQcm9wcykge1xuICAgICAgY29uc3QgaGVhZGVyID0gaGVhZGVyTWFwW3Byb3BdIHx8IHByb3A7XG4gICAgICBjb25zdCB2YWx1ZSA9IGl0ZW1bcHJvcF07XG4gICAgICB0YWJsZS5jZWxsKFxuICAgICAgICBoZWFkZXIsXG4gICAgICAgIGZvcm1hdFRhYmxlVmFsdWUocHJvcCwgdmFsdWUsIG9wdHMsIGRpc3BsYXlTZXR0aW5ncywgaXRlbSlcbiAgICAgICk7XG4gICAgfVxuICAgIHRhYmxlLm5ld1JvdygpO1xuICB9XG5cbiAgLy8gUmVzdG9yZSBvcmlnaW5hbCB0cnVuY2F0ZSBsZW5ndGhcbiAgVEFCTEVfVFJVTkNBVEVfSU9fTEVOR1RIID0gb3JpZ2luYWxUcnVuY2F0ZUxlbmd0aDtcbiAgcmV0dXJuIHRhYmxlLnRvU3RyaW5nKCk7XG59O1xuXG5jb25zdCBzaG93SnNvbiA9IChkYXRhOiB1bmtub3duKSA9PiB7XG4gIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKTtcbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoYCR7anNvbn1cXG5gKTtcbn07XG5cbmNvbnN0IHNob3dKc29uUGFnZSA9IDxUPihwYWdlOiBQYWdlRGF0YTxUPikgPT4ge1xuICBzaG93SnNvbih7XG4gICAgZGF0YTogcGFnZS5kYXRhLFxuICAgIGN1cnNvcjogcGFnZS5jdXJzb3IsXG4gICAgaGFzTW9yZTogcGFnZS5oYXNNb3JlLFxuICAgIC4uLihwYWdlLnBhZ2VJbmZvID8geyBwYWdlSW5mbzogcGFnZS5wYWdlSW5mbyB9IDoge30pLFxuICB9KTtcbn07XG5cbi8qKlxuICogSW4gdGFibGVzLCB3ZSB3YW50IHRvIHNob3cgYSBzaG9ydGVyIHRpbWVzdGFtcCwgWVlZWS1NTS1ERCBISDpNTTpTU1xuICovXG5jb25zdCBmb3JtYXRUYWJsZVRpbWVzdGFtcCA9IChcbiAgdmFsdWU6IERhdGUsXG4gIG9wdHM6IEluc3BlY3RDTElPcHRpb25zID0ge30sXG4gIGRpc3BsYXlTZXR0aW5ncz86IFJldHVyblR5cGU8dHlwZW9mIGdldERpc3BsYXlTZXR0aW5ncz5cbikgPT4ge1xuICAvLyBGb3JtYXQgSVNPIHRpbWUgd2l0aG91dCBUIGFuZCBaXG4gIGNvbnN0IGlzb1RpbWUgPSBmb3JtYXRJU09EYXRlKHZhbHVlKTtcblxuICAvLyBTaG93IHJlbGF0aXZlIHRpbWUgb25seSBpZjpcbiAgLy8gLSBOb3QgaW4gQ0kgbW9kZVxuICAvLyAtIERpc3BsYXkgc2V0dGluZ3MgYWxsb3cgaXQgKGJhc2VkIG9uIHRlcm1pbmFsIHdpZHRoKVxuICAvLyAtIHdpdGhEYXRhIGlzIGRpc2FibGVkIChtb3JlIHNwYWNlIGF2YWlsYWJsZSlcbiAgLy8gLSBOb3QgaW4gSlNPTiBtb2RlXG4gIC8vIC0gZGlzYWJsZVJlbGF0aXZlRGF0ZXMgaXMgbm90IHNldFxuICBjb25zdCBzaG91bGRTaG93UmVsYXRpdmUgPVxuICAgICFpc0NJKCkgJiZcbiAgICBkaXNwbGF5U2V0dGluZ3M/LnNob3dSZWxhdGl2ZURhdGVzICE9PSBmYWxzZSAmJlxuICAgICFvcHRzLndpdGhEYXRhICYmXG4gICAgIW9wdHMuanNvbiAmJlxuICAgICFvcHRzLmRpc2FibGVSZWxhdGl2ZURhdGVzO1xuXG4gIGlmIChzaG91bGRTaG93UmVsYXRpdmUpIHtcbiAgICBjb25zdCByZWxhdGl2ZSA9IGZvcm1hdERpc3RhbmNlKHZhbHVlLCBuZXcgRGF0ZSgpLCB7IGFkZFN1ZmZpeDogdHJ1ZSB9KTtcbiAgICByZXR1cm4gYCR7aXNvVGltZX0gKCR7cmVsYXRpdmV9KWA7XG4gIH1cblxuICByZXR1cm4gaXNvVGltZTtcbn07XG5cbmNvbnN0IHRydW5jYXRlU3RyaW5nID0gKFxuICBzdHI6IHN0cmluZyxcbiAgbWF4TGVuZ3RoOiBudW1iZXIgPSBUQUJMRV9UUlVOQ0FURV9JT19MRU5HVEhcbikgPT4ge1xuICByZXR1cm4gc3RyICYmIHN0ci5sZW5ndGggPiBtYXhMZW5ndGhcbiAgICA/IGAke3N0ci5zdWJzdHJpbmcoMCwgbWF4TGVuZ3RoKX0uLi5gXG4gICAgOiBzdHI7XG59O1xuXG5jb25zdCB0cnVuY2F0ZUlkVG9MYXN0Q2hhcnMgPSAoaWQ6IHN0cmluZywgY2hhcnM6IG51bWJlciA9IDQpOiBzdHJpbmcgPT4ge1xuICBpZiAoIWlkIHx8IGlkLmxlbmd0aCA8PSBjaGFycykgcmV0dXJuIGlkO1xuICByZXR1cm4gYC4uLiR7aWQuc3Vic3RyaW5nKGlkLmxlbmd0aCAtIGNoYXJzKX1gO1xufTtcblxuY29uc3Qgc2hvd0luc3BlY3RJbmZvQm94ID0gKHJlc291cmNlOiBzdHJpbmcpID0+IHtcbiAgbG9nZ2VyLmluZm8oXG4gICAgYFRvIHZpZXcgZGV0YWlscyBmb3IgYSAke3Jlc291cmNlfSwgdXNlIFxcYHdvcmtmbG93IGluc3BlY3QgJHtyZXNvdXJjZX1cXGAgPGlkPmBcbiAgKTtcbiAgbG9nZ2VyLmluZm8oXG4gICAgYFRvIHZpZXcgdGhlIGNvbnRlbnQgb2YgYW55IHN0cmVhbSwgdXNlIFxcYHdvcmtmbG93IGluc3BlY3Qgc3RyZWFtIDxzdHJlYW0taWQ+XFxgYFxuICApO1xufTtcblxuY29uc3QgRVhQSVJFRF9EQVRBX01FU1NBR0UgPSBjaGFsay5ncmF5KCc8ZGF0YSBleHBpcmVkPicpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIHJ1biBoYXMgZXhwaXJlZCBkYXRhIHN0b3JhZ2UgKHJ1bi1sZXZlbCBleHBpcmVkQXQgZmllbGQpLlxuICogT25seSByZXR1cm5zIHRydWUgd2hlbiBgZXhwaXJlZEF0YCBpcyBpbiB0aGUgcGFzdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGhhc0V4cGlyZWREYXRhID0gKHJ1bjogV29ya2Zsb3dSdW4pOiBib29sZWFuID0+IHtcbiAgcmV0dXJuIChcbiAgICAnZXhwaXJlZEF0JyBpbiBydW4gJiZcbiAgICBydW4uZXhwaXJlZEF0ICE9IG51bGwgJiZcbiAgICBuZXcgRGF0ZShydW4uZXhwaXJlZEF0KSA8IG5ldyBEYXRlKClcbiAgKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFueSBkYXRhIGZpZWxkIGluIGEgaHlkcmF0ZWQgcmVzb3VyY2UgaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCBhblxuICogZXhwaXJlZCBwbGFjZWhvbGRlci4gV29ya3MgZm9yIHJ1bnMsIHN0ZXBzLCBob29rcywgYW5kIGV2ZW50cyDigJQgdW5saWtlXG4gKiBgaGFzRXhwaXJlZERhdGFgIHdoaWNoIG9ubHkgY2hlY2tzIHRoZSBydW4tbGV2ZWwgYGV4cGlyZWRBdGAgZmllbGQuXG4gKi9cbmNvbnN0IGhhc0V4cGlyZWRGaWVsZHMgPSAocmVzb3VyY2U6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiBbJ2lucHV0JywgJ291dHB1dCcsICdlcnJvcicsICdtZXRhZGF0YSddLnNvbWUoKGtleSkgPT5cbiAgICBpc0V4cGlyZWRSZWYocmVzb3VyY2Vba2V5XSlcbiAgKTtcbn07XG5cbi8qKlxuICogVGFrZXMgaHlkcmF0ZWQgc3RlcC93b3JrZmxvdyBpbnB1dC9vdXRwdXQgYW5kIHNlcmlhbGl6ZXMgaXQgZm9yIGlubGluZSBkaXNwbGF5LlxuICovXG5jb25zdCBpbmxpbmVGb3JtYXRJTyA9IDxUPihpbzogVCwgdG9wTGV2ZWw6IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdHlwZSA9IHR5cGVvZiBpbztcbiAgbGV0IHZhbHVlID0gJyc7XG4gIGlmIChpbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsdWUgPSAnPGVtcHR5Pic7XG4gIH0gZWxzZSBpZiAoaW8gPT09IG51bGwpIHtcbiAgICB2YWx1ZSA9ICc8bnVsbD4nO1xuICB9IGVsc2UgaWYgKGlzRW5jcnlwdGVkUmVmKGlvKSkge1xuICAgIHZhbHVlID0gY2hhbGsuZGltLnllbGxvdygnXFx1ezFGNTEyfSBFbmNyeXB0ZWQnKTtcbiAgfSBlbHNlIGlmIChpc0V4cGlyZWRSZWYoaW8pKSB7XG4gICAgdmFsdWUgPSBjaGFsay5ncmF5KCc8ZGF0YSBleHBpcmVkPicpO1xuICB9IGVsc2UgaWYgKGlvICYmIEFycmF5LmlzQXJyYXkoaW8pKSB7XG4gICAgaWYgKGlvLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdmFsdWUgPSAnPGVtcHR5Pic7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gaW9cbiAgICAgICAgLm1hcCgoaXRlbSkgPT4gaW5saW5lRm9ybWF0SU8oaXRlbSwgZmFsc2UpKVxuICAgICAgICAuam9pbignLCcpO1xuICAgICAgaWYgKHN0cmluZ2lmaWVkLmxlbmd0aCA+IFRBQkxFX1RSVU5DQVRFX0lPX0xFTkdUSCAmJiB0b3BMZXZlbCkge1xuICAgICAgICB2YWx1ZSA9IGNoYWxrLnllbGxvdyhgJHtpby5sZW5ndGh9IGFyZ3NgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gc3RyaW5naWZpZWQ7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKGlvIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgdmFsdWUgPSBpby50b0lTT1N0cmluZygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IHRydW5jYXRlU3RyaW5nKEpTT04uc3RyaW5naWZ5KGlvKSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKFsnc3RyaW5nJywgJ251bWJlcicsICdib29sZWFuJ10uaW5jbHVkZXModHlwZSkpIHtcbiAgICBpZiAoaXNTdHJlYW1JZChpbyBhcyBzdHJpbmcpKSB7XG4gICAgICB2YWx1ZSA9IGlvLnRvU3RyaW5nKCk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiAoaW8gYXMgc3RyaW5nKS5pbmNsdWRlcygnc3RybV8nKSkge1xuICAgICAgdmFsdWUgPSBpbyBhcyBzdHJpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gdHJ1bmNhdGVTdHJpbmcoU3RyaW5nKGlvKSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhbHVlID0gYDwke3R5cGV9PmA7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuLyoqXG4gKiBMaXN0IHZpZXdzIHN1cmZhY2UgbWV0YWRhdGEgb25seS4gV2hlbiB0aGUgYWN0aXZlIGJhY2tlbmQgZXhwb3NlcyB0aGVcbiAqIG9wdGlvbmFsIGB3b3JsZC5hbmFseXRpY3NgIHJlYWQgbmFtZXNwYWNlIHdlIHJlYWQgbGlzdCBwYWdlcyBmcm9tIGl0XG4gKiAobWV0YWRhdGEtb25seSDigJQgbm8gcGF5bG9hZCByZXNvbHV0aW9uKTsgb3RoZXJ3aXNlIHdlIGZhbGwgYmFjayB0byB0aGVcbiAqIHJ1bnRpbWUgc3RvcmFnZSBBUElzIHdpdGggYHJlc29sdmVEYXRhOiAnbm9uZSdgLlxuICpcbiAqIGAtLXdpdGhEYXRhYCBmb3JjZXMgdGhlIHJ1bnRpbWUgcGF0aCBzbyBwYXlsb2FkcyBjYW4gYmUgcmVzb2x2ZWQgaW50byB0aGVcbiAqIHRhYmxlLiBJdCBpcyBkZXByZWNhdGVkIGZvciBsaXN0IHZpZXdzOiB2aWV3IHBheWxvYWRzIHBlci1yZXNvdXJjZSB3aXRoXG4gKiBgd29ya2Zsb3cgaW5zcGVjdCA8cmVzb3VyY2U+IDxpZD5gLlxuICovXG5jb25zdCB3YXJuV2l0aERhdGFEZXByZWNhdGVkRm9yTGlzdCA9IChzaW5ndWxhcjogc3RyaW5nKTogdm9pZCA9PiB7XG4gIGxvZ2dlci53YXJuKFxuICAgIGAnLS13aXRoRGF0YScgaXMgZGVwcmVjYXRlZCBmb3IgbGlzdCB2aWV3cyBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuIFVzZSAnd29ya2Zsb3cgaW5zcGVjdCAke3Npbmd1bGFyfSA8aWQ+JyB0byB2aWV3IHBheWxvYWRzIGZvciBhIHNpbmdsZSAke3Npbmd1bGFyfS5gXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgbGlzdFJ1bnMgPSBhc3luYyAod29ybGQ6IFdvcmxkLCBvcHRzOiBJbnNwZWN0Q0xJT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHJlc29sdmVLZXkgPSBjcmVhdGVSZXNvbHZlcih3b3JsZCwgb3B0cz8uZGVjcnlwdCA/PyBmYWxzZSk7XG5cbiAgaWYgKG9wdHMuc3RlcElkIHx8IG9wdHMucnVuSWQpIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgICdGaWx0ZXJpbmcgYnkgc3RlcC1pZCBvciBydW4taWQgaXMgbm90IHN1cHBvcnRlZCBpbiBsaXN0IGNhbGxzLCBpZ25vcmluZyBmaWx0ZXIuJ1xuICAgICk7XG4gIH1cblxuICBpZiAob3B0cy53aXRoRGF0YSkge1xuICAgIHdhcm5XaXRoRGF0YURlcHJlY2F0ZWRGb3JMaXN0KCdydW4nKTtcbiAgfVxuXG4gIGNvbnN0IHVzZUFuYWx5dGljcyA9ICFvcHRzLndpdGhEYXRhICYmIEJvb2xlYW4od29ybGQuYW5hbHl0aWNzKTtcbiAgY29uc3QgcmVzb2x2ZURhdGEgPSBvcHRzLndpdGhEYXRhID8gJ2FsbCcgOiAnbm9uZSc7XG4gIGNvbnN0IHN0YXR1cyA9IG9wdHMuc3RhdHVzIGFzIFdvcmtmbG93UnVuWydzdGF0dXMnXSB8IHVuZGVmaW5lZDtcblxuICAvLyBSZXNvbHZlIC0tc2luY2UvLS11bnRpbCBpbnRvIGFuIGV4cGxpY2l0IGxpc3Rpbmcgd2luZG93LiBPbmx5IHRoZVxuICAvLyBhbmFseXRpY3MgcmVhZCBwYXRoIHN1cHBvcnRzIG9uZTsgdGhlIHJ1bnRpbWUgc3RvcmFnZSBBUElzIGhhdmUgbm8gdGltZVxuICAvLyBmaWx0ZXIuIFdpdGhvdXQgdGhlIGZsYWdzIHRoZSBiYWNrZW5kIGFwcGxpZXMgaXRzIGRlZmF1bHQgd2luZG93XG4gIC8vICh0cmFpbGluZyAyNGggb24gdGhlIFZlcmNlbCBiYWNrZW5kKS5cbiAgY29uc3QgdGltZVdpbmRvdyA9IHJlc29sdmVUaW1lV2luZG93KG9wdHMpO1xuICBpZiAodGltZVdpbmRvdyAmJiAhdXNlQW5hbHl0aWNzKSB7XG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICAnLS1zaW5jZS8tLXVudGlsIHJlcXVpcmUgdGhlIGFuYWx5dGljcyByZWFkIHBhdGggYW5kIGFyZSBpZ25vcmVkIGJ5IHRoaXMgYmFja2VuZC4nXG4gICAgKTtcbiAgfVxuXG4gIC8vIERldGVybWluZSB3aGljaCBwcm9wcyB0byBzaG93IGJhc2VkIG9uIHdpdGhEYXRhIGZsYWdcbiAgY29uc3QgcHJvcHMgPSBvcHRzLndpdGhEYXRhXG4gICAgPyBXT1JLRkxPV19SVU5fTElTVEVEX1BST1BTXG4gICAgOiBXT1JLRkxPV19SVU5fTElTVEVEX1BST1BTLmZpbHRlcihcbiAgICAgICAgKHByb3ApID0+ICFXT1JLRkxPV19SVU5fSU9fUFJPUFMuaW5jbHVkZXMocHJvcClcbiAgICAgICk7XG5cbiAgY29uc3QgZmV0Y2hSdW5zUGFnZSA9IGFzeW5jIChcbiAgICBjdXJzb3I6IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiBQcm9taXNlPFBhZ2VEYXRhPFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4gPT4ge1xuICAgIGNvbnN0IHBhZ2luYXRpb24gPSB7XG4gICAgICBzb3J0T3JkZXI6IG9wdHMuc29ydCB8fCAnZGVzYycsXG4gICAgICBjdXJzb3IsXG4gICAgICBsaW1pdDogb3B0cy5saW1pdCB8fCBERUZBVUxUX1BBR0VfU0laRSxcbiAgICB9O1xuICAgIGlmICh1c2VBbmFseXRpY3MgJiYgd29ybGQuYW5hbHl0aWNzKSB7XG4gICAgICBjb25zdCBydW5zID0gYXdhaXQgd29ybGQuYW5hbHl0aWNzLnJ1bnMubGlzdCh7XG4gICAgICAgIHdvcmtmbG93TmFtZTogb3B0cy53b3JrZmxvd05hbWUsXG4gICAgICAgIHN0YXR1cyxcbiAgICAgICAgLi4uKHRpbWVXaW5kb3cgPz8ge30pLFxuICAgICAgICBwYWdpbmF0aW9uLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiBydW5zLmRhdGEgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLFxuICAgICAgICBjdXJzb3I6IHJ1bnMuY3Vyc29yLFxuICAgICAgICBoYXNNb3JlOiBydW5zLmhhc01vcmUsXG4gICAgICAgIHBhZ2VJbmZvOiBnZXRQYWdlSW5mbyhydW5zKSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHJ1bnMgPSBhd2FpdCB3b3JsZC5ydW5zLmxpc3Qoe1xuICAgICAgd29ya2Zsb3dOYW1lOiBvcHRzLndvcmtmbG93TmFtZSxcbiAgICAgIHN0YXR1cyxcbiAgICAgIHBhZ2luYXRpb24sXG4gICAgICByZXNvbHZlRGF0YSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBydW5zLmRhdGEubWFwKChyKSA9PiBoeWRyYXRlUmVzb3VyY2VJTyhyLCByZXNvbHZlS2V5KSlcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiBkYXRhIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSxcbiAgICAgIGN1cnNvcjogcnVucy5jdXJzb3IsXG4gICAgICBoYXNNb3JlOiBydW5zLmhhc01vcmUsXG4gICAgICBwYWdlSW5mbzogZ2V0UGFnZUluZm8ocnVucyksXG4gICAgfTtcbiAgfTtcblxuICAvLyBGb3IgSlNPTiBvdXRwdXQsIGp1c3QgZmV0Y2ggb25jZSBhbmQgcmV0dXJuXG4gIGlmIChvcHRzLmpzb24pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IGZldGNoUnVuc1BhZ2Uob3B0cy5jdXJzb3IpO1xuICAgICAgc2hvd0pzb25QYWdlKHBhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaGFuZGxlQXBpRXJyb3IoZXJyb3IsIG9wdHMuYmFja2VuZCkpIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgc2V0dXBMaXN0UGFnaW5hdGlvbjxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oe1xuICAgIGluaXRpYWxDdXJzb3I6IG9wdHMuY3Vyc29yLFxuICAgIGludGVyYWN0aXZlOiBvcHRzLmludGVyYWN0aXZlLFxuICAgIGZldGNoUGFnZTogYXN5bmMgKGN1cnNvcikgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZldGNoUnVuc1BhZ2UoY3Vyc29yKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChoYW5kbGVBcGlFcnJvcihlcnJvciwgb3B0cy5iYWNrZW5kKSkge1xuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRpc3BsYXlQYWdlOiBhc3luYyAocnVucykgPT4ge1xuICAgICAgbG9nZ2VyLmxvZyhzaG93VGFibGUocnVucywgcHJvcHMsIG9wdHMpKTtcbiAgICB9LFxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZWNlbnRSdW4gPSBhc3luYyAoXG4gIHdvcmxkOiBXb3JsZCxcbiAgb3B0czogSW5zcGVjdENMSU9wdGlvbnMgPSB7fVxuKSA9PiB7XG4gIGNvbnN0IHJlc29sdmVLZXkgPSBjcmVhdGVSZXNvbHZlcih3b3JsZCwgb3B0cz8uZGVjcnlwdCA/PyBmYWxzZSk7XG5cbiAgbG9nZ2VyLndhcm4oYE5vIHJ1bklkIHByb3ZpZGVkLCBmZXRjaGluZyBkYXRhIGZvciBsYXRlc3QgcnVuIGluc3RlYWQuYCk7XG4gIHRyeSB7XG4gICAgY29uc3QgcnVucyA9IGF3YWl0IHdvcmxkLnJ1bnMubGlzdCh7XG4gICAgICBwYWdpbmF0aW9uOiB7IGxpbWl0OiAxLCBzb3J0T3JkZXI6IG9wdHMuc29ydCB8fCAnZGVzYycgfSxcbiAgICAgIHJlc29sdmVEYXRhOiAnbm9uZScsIC8vIERvbid0IG5lZWQgZGF0YSBmb3IganVzdCBnZXR0aW5nIHRoZSBJRFxuICAgIH0pO1xuICAgIHJ1bnMuZGF0YSA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgcnVucy5kYXRhLm1hcCgocikgPT4gaHlkcmF0ZVJlc291cmNlSU8ociwgcmVzb2x2ZUtleSkpXG4gICAgKTtcbiAgICByZXR1cm4gcnVucy5kYXRhWzBdO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChoYW5kbGVBcGlFcnJvcihlcnJvciwgb3B0cy5iYWNrZW5kKSkge1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNob3dSdW4gPSBhc3luYyAoXG4gIHdvcmxkOiBXb3JsZCxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgb3B0czogSW5zcGVjdENMSU9wdGlvbnMgPSB7fVxuKSA9PiB7XG4gIGNvbnN0IHJlc29sdmVLZXkgPSBjcmVhdGVSZXNvbHZlcih3b3JsZCwgb3B0cz8uZGVjcnlwdCA/PyBmYWxzZSk7XG5cbiAgaWYgKG9wdHMud2l0aERhdGEpIHtcbiAgICBsb2dnZXIud2FybignYHdpdGhEYXRhYCBmbGFnIGlzIGlnbm9yZWQgd2hlbiBzaG93aW5nIGluZGl2aWR1YWwgcmVzb3VyY2VzJyk7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBydW4gPSBhd2FpdCB3b3JsZC5ydW5zLmdldChydW5JZCwgeyByZXNvbHZlRGF0YTogJ2FsbCcgfSk7XG4gICAgY29uc3QgcnVuV2l0aEh5ZHJhdGVkSU8gPSBhd2FpdCBoeWRyYXRlUmVzb3VyY2VJTyhydW4sIHJlc29sdmVLZXkpO1xuICAgIGlmIChvcHRzLmpzb24pIHtcbiAgICAgIHNob3dKc29uKHJ1bldpdGhIeWRyYXRlZElPKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGhhc0V4cGlyZWREYXRhKHJ1bikpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgXCJUaGlzIHJ1bidzIGRhdGEgKGlucHV0L291dHB1dC9lcnJvcikgaGFzIGV4cGlyZWQgYW5kIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5sb2cocnVuV2l0aEh5ZHJhdGVkSU8pO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaGFuZGxlQXBpRXJyb3IoZXJyb3IsIG9wdHMuYmFja2VuZCkpIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBsaXN0U3RlcHMgPSBhc3luYyAoXG4gIHdvcmxkOiBXb3JsZCxcbiAgb3B0czogSW5zcGVjdENMSU9wdGlvbnMgPSB7XG4gICAgcnVuSWQ6IHVuZGVmaW5lZCxcbiAgfVxuKSA9PiB7XG4gIGNvbnN0IHJlc29sdmVLZXkgPSBjcmVhdGVSZXNvbHZlcih3b3JsZCwgb3B0cz8uZGVjcnlwdCA/PyBmYWxzZSk7XG5cbiAgaWYgKG9wdHMuc3RlcElkKSB7XG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICAnRmlsdGVyaW5nIGJ5IHN0ZXAtaWQgaXMgbm90IHN1cHBvcnRlZCBpbiBsaXN0IGNhbGxzLCBpZ25vcmluZyBmaWx0ZXIuJ1xuICAgICk7XG4gIH1cbiAgaWYgKG9wdHMud29ya2Zsb3dOYW1lKSB7XG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICAnRmlsdGVyaW5nIGJ5IHdvcmtmbG93LW5hbWUgaXMgbm90IHN1cHBvcnRlZCBmb3Igc3RlcHMsIGlnbm9yaW5nIGZpbHRlci4nXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHJ1bklkID0gb3B0cy5ydW5JZFxuICAgID8gb3B0cy5ydW5JZFxuICAgIDogKGF3YWl0IGdldFJlY2VudFJ1bih3b3JsZCwgb3B0cykpPy5ydW5JZDtcbiAgaWYgKCFydW5JZCkge1xuICAgIGxvZ2dlci5lcnJvcignTm8gcnVuIGZvdW5kLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChvcHRzLndpdGhEYXRhKSB7XG4gICAgd2FybldpdGhEYXRhRGVwcmVjYXRlZEZvckxpc3QoJ3N0ZXAnKTtcbiAgfVxuXG4gIGNvbnN0IHVzZUFuYWx5dGljcyA9ICFvcHRzLndpdGhEYXRhICYmIEJvb2xlYW4od29ybGQuYW5hbHl0aWNzKTtcbiAgY29uc3QgcmVzb2x2ZURhdGEgPSBvcHRzLndpdGhEYXRhID8gJ2FsbCcgOiAnbm9uZSc7XG5cbiAgLy8gRGV0ZXJtaW5lIHdoaWNoIHByb3BzIHRvIHNob3cgYmFzZWQgb24gd2l0aERhdGEgZmxhZ1xuICBjb25zdCBwcm9wcyA9IG9wdHMud2l0aERhdGFcbiAgICA/IFNURVBfTElTVEVEX1BST1BTXG4gICAgOiBTVEVQX0xJU1RFRF9QUk9QUy5maWx0ZXIoKHByb3ApID0+ICFTVEVQX0lPX1BST1BTLmluY2x1ZGVzKHByb3ApKTtcblxuICBjb25zdCBmZXRjaFN0ZXBzUGFnZSA9IGFzeW5jIChcbiAgICBjdXJzb3I6IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiBQcm9taXNlPFBhZ2VEYXRhPFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4gPT4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhgRmV0Y2hpbmcgc3RlcHMgZm9yIHJ1biAke3J1bklkfWApO1xuICAgIGNvbnN0IHBhZ2luYXRpb24gPSB7XG4gICAgICBzb3J0T3JkZXI6IG9wdHMuc29ydCB8fCAnZGVzYycsXG4gICAgICBjdXJzb3IsXG4gICAgICBsaW1pdDogb3B0cy5saW1pdCB8fCBERUZBVUxUX1BBR0VfU0laRSxcbiAgICB9O1xuICAgIGlmICh1c2VBbmFseXRpY3MgJiYgd29ybGQuYW5hbHl0aWNzKSB7XG4gICAgICBjb25zdCBzdGVwcyA9IGF3YWl0IHdvcmxkLmFuYWx5dGljcy5zdGVwcy5saXN0KHsgcnVuSWQsIHBhZ2luYXRpb24gfSk7XG4gICAgICBjb25zdCBwYWdlID0ge1xuICAgICAgICBkYXRhOiBzdGVwcy5kYXRhIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSxcbiAgICAgICAgY3Vyc29yOiBzdGVwcy5jdXJzb3IsXG4gICAgICAgIGhhc01vcmU6IHN0ZXBzLmhhc01vcmUsXG4gICAgICAgIHBhZ2VJbmZvOiBnZXRQYWdlSW5mbyhzdGVwcyksXG4gICAgICB9O1xuICAgICAgaWYgKGN1cnNvciB8fCBwYWdlLmRhdGEubGVuZ3RoID4gMCB8fCBwYWdlLmhhc01vcmUpIHtcbiAgICAgICAgcmV0dXJuIHBhZ2U7XG4gICAgICB9XG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgIGBObyBhbmFseXRpY3Mgc3RlcHMgZm91bmQgZm9yIHJ1biAke3J1bklkfTsgZmFsbGluZyBiYWNrIHRvIHN0b3JhZ2VgXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBzdGVwQ2h1bmtzID0gYXdhaXQgd29ybGQuc3RlcHMubGlzdCh7XG4gICAgICBydW5JZCxcbiAgICAgIHBhZ2luYXRpb24sXG4gICAgICByZXNvbHZlRGF0YSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBzdGVwQ2h1bmtzLmRhdGEubWFwKChzKSA9PiBoeWRyYXRlUmVzb3VyY2VJTyhzLCByZXNvbHZlS2V5KSlcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiBkYXRhIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSxcbiAgICAgIGN1cnNvcjogc3RlcENodW5rcy5jdXJzb3IsXG4gICAgICBoYXNNb3JlOiBzdGVwQ2h1bmtzLmhhc01vcmUsXG4gICAgICBwYWdlSW5mbzogZ2V0UGFnZUluZm8oc3RlcENodW5rcyksXG4gICAgfTtcbiAgfTtcblxuICAvLyBGb3IgSlNPTiBvdXRwdXQsIGp1c3QgZmV0Y2ggb25jZSBhbmQgcmV0dXJuXG4gIGlmIChvcHRzLmpzb24pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IGZldGNoU3RlcHNQYWdlKG9wdHMuY3Vyc29yKTtcbiAgICAgIHNob3dKc29uKHBhZ2UuZGF0YSk7XG4gICAgICByZXR1cm47XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChoYW5kbGVBcGlFcnJvcihlcnJvciwgb3B0cy5iYWNrZW5kKSkge1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBhd2FpdCBzZXR1cExpc3RQYWdpbmF0aW9uPFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih7XG4gICAgaW5pdGlhbEN1cnNvcjogb3B0cy5jdXJzb3IsXG4gICAgaW50ZXJhY3RpdmU6IG9wdHMuaW50ZXJhY3RpdmUsXG4gICAgZmV0Y2hQYWdlOiBhc3luYyAoY3Vyc29yKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgZmV0Y2hTdGVwc1BhZ2UoY3Vyc29yKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChoYW5kbGVBcGlFcnJvcihlcnJvciwgb3B0cy5iYWNrZW5kKSkge1xuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRpc3BsYXlQYWdlOiBhc3luYyAoc3RlcHMpID0+IHtcbiAgICAgIGxvZ2dlci5sb2coc2hvd1RhYmxlKHN0ZXBzLCBwcm9wcywgb3B0cykpO1xuICAgICAgc2hvd0luc3BlY3RJbmZvQm94KCdzdGVwJyk7XG4gICAgfSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2hvd1N0ZXAgPSBhc3luYyAoXG4gIHdvcmxkOiBXb3JsZCxcbiAgc3RlcElkOiBzdHJpbmcsXG4gIG9wdHM6IEluc3BlY3RDTElPcHRpb25zID0ge31cbikgPT4ge1xuICBjb25zdCByZXNvbHZlS2V5ID0gY3JlYXRlUmVzb2x2ZXIod29ybGQsIG9wdHM/LmRlY3J5cHQgPz8gZmFsc2UpO1xuXG4gIGlmIChvcHRzLndpdGhEYXRhKSB7XG4gICAgbG9nZ2VyLndhcm4oJ2B3aXRoRGF0YWAgZmxhZyBpcyBpZ25vcmVkIHdoZW4gc2hvd2luZyBpbmRpdmlkdWFsIHJlc291cmNlcycpO1xuICB9XG4gIGlmIChvcHRzLnN0ZXBJZCkge1xuICAgIGxvZ2dlci53YXJuKFxuICAgICAgJ0ZpbHRlcmluZyBieSBzdGVwLWlkIGlzIG5vdCBzdXBwb3J0ZWQgaW4gZ2V0IGNhbGxzLCBpZ25vcmluZyBmaWx0ZXIuJ1xuICAgICk7XG4gIH1cblxuICBjb25zdCBydW5JZCA9IG9wdHMucnVuSWQgPz8gKGF3YWl0IGdldFJlY2VudFJ1bih3b3JsZCwgb3B0cykpPy5ydW5JZDtcbiAgaWYgKCFydW5JZCkge1xuICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICdydW4taWQgaXMgcmVxdWlyZWQgZm9yIHNob3dpbmcgYSBzdGVwLiBVc2FnZTogYHdvcmtmbG93IGluc3BlY3Qgc3RlcCA8U1RFUF9JRD4gLS1ydW5JZD08UlVOX0lEPmAnXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHN0ZXAgPSBhd2FpdCB3b3JsZC5zdGVwcy5nZXQocnVuSWQsIHN0ZXBJZCwge1xuICAgICAgcmVzb2x2ZURhdGE6ICdhbGwnLFxuICAgIH0pO1xuICAgIGNvbnN0IHN0ZXBXaXRoSHlkcmF0ZWRJTyA9IGF3YWl0IGh5ZHJhdGVSZXNvdXJjZUlPKHN0ZXAsIHJlc29sdmVLZXkpO1xuICAgIGlmIChvcHRzLmpzb24pIHtcbiAgICAgIHNob3dKc29uKHN0ZXBXaXRoSHlkcmF0ZWRJTyk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChcbiAgICAgICAgaGFzRXhwaXJlZEZpZWxkcyhcbiAgICAgICAgICBzdGVwV2l0aEh5ZHJhdGVkSU8gYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgXCJUaGlzIHN0ZXAncyBkYXRhIChpbnB1dC9vdXRwdXQvZXJyb3IpIGhhcyBleHBpcmVkIGFuZCBpcyBubyBsb25nZXIgYXZhaWxhYmxlLlwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsb2dnZXIubG9nKHN0ZXBXaXRoSHlkcmF0ZWRJTyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChoYW5kbGVBcGlFcnJvcihlcnJvciwgb3B0cy5iYWNrZW5kKSkge1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNob3dTdHJlYW0gPSBhc3luYyAoXG4gIHdvcmxkOiBXb3JsZCxcbiAgc3RyZWFtSWQ6IHN0cmluZyxcbiAgb3B0czogSW5zcGVjdENMSU9wdGlvbnMgPSB7fVxuKSA9PiB7XG4gIGlmIChvcHRzLnN0ZXBJZCkge1xuICAgIGxvZ2dlci53YXJuKFxuICAgICAgJ0ZpbHRlcmluZyBieSBzdGVwLWlkIGlzIG5vdCBzdXBwb3J0ZWQgd2hlbiBzaG93aW5nIGEgc3RyZWFtLCBpZ25vcmluZyBmaWx0ZXIuJ1xuICAgICk7XG4gIH1cbiAgaWYgKCFvcHRzLnJ1bklkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCctLXJ1biBpcyByZXF1aXJlZCB3aGVuIHNob3dpbmcgYSBzdHJlYW0nKTtcbiAgfVxuICBjb25zdCByYXdTdHJlYW0gPSBhd2FpdCB3b3JsZC5zdHJlYW1zLmdldChvcHRzLnJ1bklkLCBzdHJlYW1JZCk7XG5cbiAgLy8gT25seSByZXNvbHZlIHRoZSBlbmNyeXB0aW9uIGtleSB3aGVuIC0tZGVjcnlwdCBpcyBwYXNzZWQgYW5kIC0tcnVuIGlzIHByb3ZpZGVkLlxuICAvLyBXZSBmZXRjaCB0aGUgZnVsbCBXb3JrZmxvd1J1biBvYmplY3Qgc28gdGhhdCBnZXRFbmNyeXB0aW9uS2V5Rm9yUnVuIGhhc1xuICAvLyBhY2Nlc3MgdG8gdGhlIGRlcGxveW1lbnRJZCAobmVlZGVkIGZvciBBUEktYmFzZWQga2V5IHJlc29sdXRpb24pLlxuICBsZXQgZW5jcnlwdGlvbktleTogRW5jcnlwdGlvbktleVBhcmFtO1xuICBpZiAob3B0cy5kZWNyeXB0ICYmIG9wdHMucnVuSWQpIHtcbiAgICBlbmNyeXB0aW9uS2V5ID0gKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJ1biA9IGF3YWl0IHdvcmxkLnJ1bnMuZ2V0KG9wdHMucnVuSWQhKTtcbiAgICAgIGNvbnN0IHJhd0tleSA9IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/LihydW4pO1xuICAgICAgcmV0dXJuIHJhd0tleSA/IGF3YWl0IGltcG9ydEtleShyYXdLZXkpIDogdW5kZWZpbmVkO1xuICAgIH0pKCk7XG4gIH0gZWxzZSBpZiAob3B0cy5kZWNyeXB0ICYmICFvcHRzLnJ1bklkKSB7XG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICAnQ2Fubm90IGRlY3J5cHQgc3RyZWFtIGNvbnRlbnQgd2l0aG91dCBhIHJ1biBJRC4gVXNlIC0tcnVuPTxydW4taWQ+IHdpdGggLS1kZWNyeXB0LidcbiAgICApO1xuICB9XG5cbiAgLy8gRGVzZXJpYWxpemUgdGhlIHN0cmVhbSB0byBnZXQgSmF2YVNjcmlwdCBvYmplY3RzXG4gIGNvbnN0IHJldml2ZXJzID0gZ2V0RXh0ZXJuYWxSZXZpdmVycyhcbiAgICBnbG9iYWxUaGlzLFxuICAgIFtdLFxuICAgIG9wdHMucnVuSWQgPz8gJycsXG4gICAgZW5jcnlwdGlvbktleVxuICApO1xuICBjb25zdCB0cmFuc2Zvcm0gPSBnZXREZXNlcmlhbGl6ZVN0cmVhbShyZXZpdmVycywgZW5jcnlwdGlvbktleSk7XG4gIGNvbnN0IHN0cmVhbSA9IHJhd1N0cmVhbS5waXBlVGhyb3VnaCh0cmFuc2Zvcm0pO1xuXG4gIGxvZ2dlci5pbmZvKCdTdHJlYW1pbmcgdG8gc3Rkb3V0LCBwcmVzcyBDVFJMK0MgdG8gYWJvcnQuJyk7XG4gIGxvZ2dlci5pbmZvKFxuICAgICdVc2UgLS1qc29uIHRvIG91dHB1dCB0aGUgc3RyZWFtIGFzIG5ld2xpbmUtZGVsaW1pdGVkIEpTT04gd2l0aG91dCBpbmZvIGxvZ3MuXFxuJ1xuICApO1xuICBhd2FpdCBzdHJlYW1Ub0NvbnNvbGUoc3RyZWFtLCBzdHJlYW1JZCwgb3B0cyk7XG59O1xuXG4vKipcbiAqIExpc3Rpbmcgc3RyZWFtcyBvbmx5IGxpc3RzIGF2YWlsYWJsZSBzdHJlYW0gSURzIGJhc2VkIG9uIHJ1bi9zdGVwIHBhc3NlZCxcbiAqIGFuZCBkb2Vzbid0IHJlYWQgYW55IGRhdGEgZnJvbSB0aGUgc3RyZWFtcy5cbiAqL1xuZXhwb3J0IGNvbnN0IGxpc3RTdHJlYW1zQnlSdW5JZCA9IGFzeW5jIChcbiAgd29ybGQ6IFdvcmxkLFxuICBvcHRzOiBJbnNwZWN0Q0xJT3B0aW9ucyA9IHt9XG4pID0+IHtcbiAgaWYgKG9wdHMud2l0aERhdGEpIHtcbiAgICBsb2dnZXIud2FybignYHdpdGhEYXRhYCBmbGFnIGlzIGlnbm9yZWQgd2hlbiBsaXN0aW5nIHN0cmVhbXMnKTtcbiAgfVxuICBpZiAob3B0cy53b3JrZmxvd05hbWUpIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgICdGaWx0ZXJpbmcgYnkgd29ya2Zsb3ctbmFtZSBpcyBub3Qgc3VwcG9ydGVkIGZvciBzdHJlYW1zLCBpZ25vcmluZyBmaWx0ZXIuJ1xuICAgICk7XG4gIH1cbiAgaWYgKG9wdHMuc3RlcElkKSB7XG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICAnRmlsdGVyaW5nIGJ5IHN0ZXAtaWQgaXMgbm90IHN1cHBvcnRlZCBmb3Igc3RyZWFtcywgaWdub3JpbmcgZmlsdGVyLidcbiAgICApO1xuICB9XG5cbiAgbGV0IHJ1bklkID0gb3B0cy5ydW5JZDtcbiAgaWYgKCFydW5JZCkge1xuICAgIGxvZ2dlci53YXJuKFxuICAgICAgJ05vIHJ1bi1pZCBwcm92aWRlZC4gTGlzdGluZyBzdHJlYW1zIGZvciBsYXRlc3QgcnVuIGluc3RlYWQuJyxcbiAgICAgICdVc2UgLS1ydW49PHJ1bi1pZD4gdG8gZmlsdGVyIHN0cmVhbXMgYnkgcnVuLidcbiAgICApO1xuICAgIGNvbnN0IHJ1biA9IGF3YWl0IGdldFJlY2VudFJ1bih3b3JsZCwgb3B0cyk7XG4gICAgaWYgKCFydW4pIHtcbiAgICAgIGxvZ2dlci53YXJuKCdObyBydW5zIGZvdW5kLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBydW5JZCA9IHJ1bi5ydW5JZDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3Qgc3RyZWFtSWRzID0gYXdhaXQgd29ybGQuc3RyZWFtcy5saXN0KHJ1bklkKTtcbiAgICBjb25zdCBtYXRjaGluZ1N0cmVhbXMgPSBzdHJlYW1JZHMubWFwKChzdHJlYW1JZCkgPT4gKHtcbiAgICAgIHJ1bklkLFxuICAgICAgc3RyZWFtSWQsXG4gICAgfSkpO1xuXG4gICAgaWYgKG9wdHMuanNvbikge1xuICAgICAgc2hvd0pzb24obWF0Y2hpbmdTdHJlYW1zKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbG9nZ2VyLmxvZyhzaG93VGFibGUobWF0Y2hpbmdTdHJlYW1zLCBbJ3J1bklkJywgJ3N0cmVhbUlkJ10pKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaGFuZGxlQXBpRXJyb3IoZXJyb3IsIG9wdHMuYmFja2VuZCkpIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBsaXN0RXZlbnRzID0gYXN5bmMgKFxuICB3b3JsZDogV29ybGQsXG4gIG9wdHM6IEluc3BlY3RDTElPcHRpb25zID0ge31cbikgPT4ge1xuICBjb25zdCByZXNvbHZlS2V5ID0gY3JlYXRlUmVzb2x2ZXIod29ybGQsIG9wdHM/LmRlY3J5cHQgPz8gZmFsc2UpO1xuICBpZiAob3B0cy53b3JrZmxvd05hbWUpIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgICdGaWx0ZXJpbmcgYnkgd29ya2Zsb3ctbmFtZSBpcyBub3Qgc3VwcG9ydGVkIGZvciBldmVudHMsIGlnbm9yaW5nIGZpbHRlci4nXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHJ1bklkID0gb3B0cy5ydW5JZCA/PyAoYXdhaXQgZ2V0UmVjZW50UnVuKHdvcmxkLCBvcHRzKSk/LnJ1bklkO1xuICBpZiAoIXJ1bklkKSB7XG4gICAgbG9nZ2VyLmVycm9yKCdObyBydW4gZm91bmQuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG9wdHMud2l0aERhdGEpIHtcbiAgICB3YXJuV2l0aERhdGFEZXByZWNhdGVkRm9yTGlzdCgnZXZlbnQnKTtcbiAgfVxuXG4gIGNvbnN0IHVzZUFuYWx5dGljcyA9ICFvcHRzLndpdGhEYXRhICYmIEJvb2xlYW4od29ybGQuYW5hbHl0aWNzKTtcbiAgY29uc3QgY29ycmVsYXRpb25JZEZpbHRlciA9IG9wdHMuaG9va0lkIHx8IG9wdHMuc3RlcElkO1xuXG4gIC8vIERldGVybWluZSB3aGljaCBwcm9wcyB0byBzaG93IGJhc2VkIG9uIHdpdGhEYXRhIGZsYWdcbiAgY29uc3QgcHJvcHMgPSBvcHRzLndpdGhEYXRhXG4gICAgPyBFVkVOVF9MSVNURURfUFJPUFNcbiAgICA6IEVWRU5UX0xJU1RFRF9QUk9QUy5maWx0ZXIoKHByb3ApID0+ICFFVkVOVF9JT19QUk9QUy5pbmNsdWRlcyhwcm9wKSk7XG5cbiAgY29uc3QgZmV0Y2hFdmVudHNQYWdlID0gYXN5bmMgKFxuICAgIGN1cnNvcjogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICk6IFByb21pc2U8UGFnZURhdGE8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+PiA9PiB7XG4gICAgbG9nZ2VyLmRlYnVnKGBGZXRjaGluZyBldmVudHMgZm9yIHJ1biAke3J1bklkfWApO1xuICAgIGNvbnN0IHBhZ2luYXRpb24gPSB7XG4gICAgICBzb3J0T3JkZXI6IG9wdHMuc29ydCB8fCAnZGVzYycsXG4gICAgICBjdXJzb3IsXG4gICAgICBsaW1pdDogb3B0cy5saW1pdCB8fCBERUZBVUxUX1BBR0VfU0laRSxcbiAgICB9O1xuICAgIGlmICh1c2VBbmFseXRpY3MgJiYgd29ybGQuYW5hbHl0aWNzKSB7XG4gICAgICBjb25zdCBldmVudHMgPSBhd2FpdCB3b3JsZC5hbmFseXRpY3MuZXZlbnRzLmxpc3Qoe1xuICAgICAgICBydW5JZCxcbiAgICAgICAgY29ycmVsYXRpb25JZDogY29ycmVsYXRpb25JZEZpbHRlcixcbiAgICAgICAgcGFnaW5hdGlvbixcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcGFnZSA9IHtcbiAgICAgICAgZGF0YTogZXZlbnRzLmRhdGEgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLFxuICAgICAgICBjdXJzb3I6IGV2ZW50cy5jdXJzb3IsXG4gICAgICAgIGhhc01vcmU6IGV2ZW50cy5oYXNNb3JlLFxuICAgICAgICBwYWdlSW5mbzogZ2V0UGFnZUluZm8oZXZlbnRzKSxcbiAgICAgIH07XG4gICAgICBpZiAoY3Vyc29yIHx8IHBhZ2UuZGF0YS5sZW5ndGggPiAwIHx8IHBhZ2UuaGFzTW9yZSkge1xuICAgICAgICByZXR1cm4gcGFnZTtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYE5vIGFuYWx5dGljcyBldmVudHMgZm91bmQgZm9yIHJ1biAke3J1bklkfTsgZmFsbGluZyBiYWNrIHRvIHN0b3JhZ2VgXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3b3JsZC5ldmVudHMubGlzdCh7XG4gICAgICBydW5JZCxcbiAgICAgIHBhZ2luYXRpb24sXG4gICAgICByZXNvbHZlRGF0YTogb3B0cy53aXRoRGF0YSA/ICdhbGwnIDogJ25vbmUnLFxuICAgIH0pO1xuICAgIGNvbnN0IGZpbHRlcmVkID0gY29ycmVsYXRpb25JZEZpbHRlclxuICAgICAgPyByZXN1bHQuZGF0YS5maWx0ZXIoKGUpID0+IGUuY29ycmVsYXRpb25JZCA9PT0gY29ycmVsYXRpb25JZEZpbHRlcilcbiAgICAgIDogcmVzdWx0LmRhdGE7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZmlsdGVyZWQubWFwKChlKSA9PiBoeWRyYXRlUmVzb3VyY2VJTyhlLCByZXNvbHZlS2V5KSlcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiBkYXRhIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSxcbiAgICAgIGN1cnNvcjogcmVzdWx0LmN1cnNvcixcbiAgICAgIGhhc01vcmU6IHJlc3VsdC5oYXNNb3JlLFxuICAgICAgcGFnZUluZm86IGdldFBhZ2VJbmZvKHJlc3VsdCksXG4gICAgfTtcbiAgfTtcblxuICAvLyBGb3IgSlNPTiBvdXRwdXQsIGp1c3QgZmV0Y2ggb25jZSBhbmQgcmV0dXJuXG4gIGlmIChvcHRzLmpzb24pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IGZldGNoRXZlbnRzUGFnZShvcHRzLmN1cnNvcik7XG4gICAgICBzaG93SnNvbihwYWdlLmRhdGEpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaGFuZGxlQXBpRXJyb3IoZXJyb3IsIG9wdHMuYmFja2VuZCkpIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgc2V0dXBMaXN0UGFnaW5hdGlvbjxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oe1xuICAgIGluaXRpYWxDdXJzb3I6IG9wdHMuY3Vyc29yLFxuICAgIGludGVyYWN0aXZlOiBvcHRzLmludGVyYWN0aXZlLFxuICAgIGZldGNoUGFnZTogYXN5bmMgKGN1cnNvcikgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZldGNoRXZlbnRzUGFnZShjdXJzb3IpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGhhbmRsZUFwaUVycm9yKGVycm9yLCBvcHRzLmJhY2tlbmQpKSB7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0sXG4gICAgZGlzcGxheVBhZ2U6IGFzeW5jIChldmVudHMpID0+IHtcbiAgICAgIGxvZ2dlci5sb2coc2hvd1RhYmxlKGV2ZW50cywgcHJvcHMsIG9wdHMpKTtcbiAgICAgIHNob3dJbnNwZWN0SW5mb0JveCgnZXZlbnQnKTtcbiAgICB9LFxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBsaXN0SG9va3MgPSBhc3luYyAod29ybGQ6IFdvcmxkLCBvcHRzOiBJbnNwZWN0Q0xJT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHJlc29sdmVLZXkgPSBjcmVhdGVSZXNvbHZlcih3b3JsZCwgb3B0cz8uZGVjcnlwdCA/PyBmYWxzZSk7XG5cbiAgaWYgKG9wdHMud29ya2Zsb3dOYW1lKSB7XG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICAnRmlsdGVyaW5nIGJ5IHdvcmtmbG93LW5hbWUgaXMgbm90IHN1cHBvcnRlZCBmb3IgaG9va3MsIGlnbm9yaW5nIGZpbHRlci4nXG4gICAgKTtcbiAgfVxuICBpZiAob3B0cy5zdGVwSWQpIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgICdGaWx0ZXJpbmcgYnkgc3RlcC1pZCBpcyBub3Qgc3VwcG9ydGVkIGZvciBob29rcywgaWdub3JpbmcgZmlsdGVyLidcbiAgICApO1xuICB9XG5cbiAgY29uc3QgcnVuSWQgPSBvcHRzLnJ1bklkO1xuICBjb25zdCByZXNvbHZlRGF0YSA9IG9wdHMud2l0aERhdGEgPyAnYWxsJyA6ICdub25lJztcbiAgLy8gSG9va3MgYWx3YXlzIHJlYWQgZnJvbSB0aGUgcnVudGltZSBzdG9yYWdlIEFQSS4gVW5saWtlIHJ1bnMvc3RlcHMvZXZlbnRzLFxuICAvLyB0aGUgYW5hbHl0aWNzIHJlYWQgcGF0aCBvbWl0cyBgb3duZXJJZGAgKGFuZCB0aGUgc2VjcmV0IGhvb2sgdG9rZW4gdXNlZCBieVxuICAvLyByZXN1bWUvY29weS10b2tlbiBzdXJmYWNlcyksIHNvIGhvb2sgbGlzdGluZyBzdGF5cyBvbiB0aGUgY2Fub25pY2FsIEFQSXMuXG4gIGNvbnN0IGZldGNoSG9va3NQYWdlID0gYXN5bmMgKFxuICAgIGN1cnNvcjogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICk6IFByb21pc2U8UGFnZURhdGE8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+PiA9PiB7XG4gICAgaWYgKCFydW5JZCkge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdGZXRjaGluZyBhbGwgaG9va3MnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBGZXRjaGluZyBob29rcyBmb3IgcnVuICR7cnVuSWR9YCk7XG4gICAgfVxuICAgIGNvbnN0IHBhZ2luYXRpb24gPSB7XG4gICAgICBzb3J0T3JkZXI6IG9wdHMuc29ydCB8fCAnZGVzYycsXG4gICAgICBjdXJzb3IsXG4gICAgICBsaW1pdDogb3B0cy5saW1pdCB8fCBERUZBVUxUX1BBR0VfU0laRSxcbiAgICB9O1xuICAgIGNvbnN0IGhvb2tzID0gYXdhaXQgd29ybGQuaG9va3MubGlzdCh7IHJ1bklkLCBwYWdpbmF0aW9uLCByZXNvbHZlRGF0YSB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBob29rcy5kYXRhLm1hcCgoaCkgPT4gaHlkcmF0ZVJlc291cmNlSU8oaCwgcmVzb2x2ZUtleSkpXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgZGF0YTogZGF0YSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+W10sXG4gICAgICBjdXJzb3I6IGhvb2tzLmN1cnNvcixcbiAgICAgIGhhc01vcmU6IGhvb2tzLmhhc01vcmUsXG4gICAgICBwYWdlSW5mbzogZ2V0UGFnZUluZm8oaG9va3MpLFxuICAgIH07XG4gIH07XG5cbiAgLy8gRm9yIEpTT04gb3V0cHV0LCBqdXN0IGZldGNoIG9uY2UgYW5kIHJldHVyblxuICBpZiAob3B0cy5qc29uKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCBmZXRjaEhvb2tzUGFnZShvcHRzLmN1cnNvcik7XG4gICAgICBzaG93SnNvblBhZ2UocGFnZSk7XG4gICAgICByZXR1cm47XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChoYW5kbGVBcGlFcnJvcihlcnJvciwgb3B0cy5iYWNrZW5kKSkge1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvLyBTZXR1cCBwYWdpbmF0aW9uIHdpdGggbmV3IG1lY2hhbmlzbVxuICBhd2FpdCBzZXR1cExpc3RQYWdpbmF0aW9uPFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih7XG4gICAgaW5pdGlhbEN1cnNvcjogb3B0cy5jdXJzb3IsXG4gICAgaW50ZXJhY3RpdmU6IG9wdHMuaW50ZXJhY3RpdmUsXG4gICAgZmV0Y2hQYWdlOiBhc3luYyAoY3Vyc29yKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgZmV0Y2hIb29rc1BhZ2UoY3Vyc29yKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChoYW5kbGVBcGlFcnJvcihlcnJvciwgb3B0cy5iYWNrZW5kKSkge1xuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRpc3BsYXlQYWdlOiBhc3luYyAoaG9va3MpID0+IHtcbiAgICAgIGxvZ2dlci5sb2coc2hvd1RhYmxlKGhvb2tzLCBIT09LX0xJU1RFRF9QUk9QUywgb3B0cykpO1xuICAgICAgc2hvd0luc3BlY3RJbmZvQm94KCdob29rJyk7XG4gICAgfSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2hvd0hvb2sgPSBhc3luYyAoXG4gIHdvcmxkOiBXb3JsZCxcbiAgaG9va0lkOiBzdHJpbmcsXG4gIG9wdHM6IEluc3BlY3RDTElPcHRpb25zID0ge31cbikgPT4ge1xuICBjb25zdCByZXNvbHZlS2V5ID0gY3JlYXRlUmVzb2x2ZXIod29ybGQsIG9wdHM/LmRlY3J5cHQgPz8gZmFsc2UpO1xuXG4gIGlmIChvcHRzLndpdGhEYXRhKSB7XG4gICAgbG9nZ2VyLndhcm4oJ2B3aXRoRGF0YWAgZmxhZyBpcyBpZ25vcmVkIHdoZW4gc2hvd2luZyBpbmRpdmlkdWFsIHJlc291cmNlcycpO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgaG9vayA9IGF3YWl0IHdvcmxkLmhvb2tzLmdldChob29rSWQsIHtcbiAgICAgIHJlc29sdmVEYXRhOiAnYWxsJyxcbiAgICB9KTtcbiAgICBjb25zdCBoeWRyYXRlZEhvb2sgPSBhd2FpdCBoeWRyYXRlUmVzb3VyY2VJTyhob29rLCByZXNvbHZlS2V5KTtcbiAgICBpZiAob3B0cy5qc29uKSB7XG4gICAgICBzaG93SnNvbihoeWRyYXRlZEhvb2spO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoXG4gICAgICAgIGhhc0V4cGlyZWRGaWVsZHMoaHlkcmF0ZWRIb29rIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgXCJUaGlzIGhvb2sncyBkYXRhIChtZXRhZGF0YSkgaGFzIGV4cGlyZWQgYW5kIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5sb2coaHlkcmF0ZWRIb29rKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGhhbmRsZUFwaUVycm9yKGVycm9yLCBvcHRzLmJhY2tlbmQpKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuXG4vKipcbiAqIExpc3Qgd2FpdHMvc2xlZXBzIHZpYSB0aGUgYW5hbHl0aWNzIHJlYWQgcGF0aC4gVGhlIGFuYWx5dGljcyB3YWl0IHNoYXBlIGlzXG4gKiBrZXllZCBieSBgd2FpdElkYC9gc3RhdHVzYCByYXRoZXIgdGhhbiB0aGUgYGNvcnJlbGF0aW9uSWRgL2BldmVudElkYCBjb2x1bW5zXG4gKiByZWNvbnN0cnVjdGVkIGZyb20gdGhlIGV2ZW50IHN0cmVhbSBpbiB0aGUgZmFsbGJhY2sgcGF0aC5cbiAqL1xuY29uc3QgbGlzdFNsZWVwc1ZpYUFuYWx5dGljcyA9IGFzeW5jIChcbiAgYW5hbHl0aWNzOiBOb25OdWxsYWJsZTxXb3JsZFsnYW5hbHl0aWNzJ10+LFxuICBvcHRzOiBJbnNwZWN0Q0xJT3B0aW9uc1xuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGZldGNoU2xlZXBzUGFnZSA9IGFzeW5jIChcbiAgICBjdXJzb3I6IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiBQcm9taXNlPFBhZ2VEYXRhPFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4gPT4ge1xuICAgIGNvbnN0IHdhaXRzID0gYXdhaXQgYW5hbHl0aWNzLndhaXRzLmxpc3Qoe1xuICAgICAgcnVuSWQ6IG9wdHMucnVuSWQgYXMgc3RyaW5nLFxuICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICBzb3J0T3JkZXI6IG9wdHMuc29ydCB8fCAnZGVzYycsXG4gICAgICAgIGN1cnNvcixcbiAgICAgICAgbGltaXQ6IG9wdHMubGltaXQgfHwgREVGQVVMVF9QQUdFX1NJWkUsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGE6IHdhaXRzLmRhdGEgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLFxuICAgICAgY3Vyc29yOiB3YWl0cy5jdXJzb3IsXG4gICAgICBoYXNNb3JlOiB3YWl0cy5oYXNNb3JlLFxuICAgICAgcGFnZUluZm86IGdldFBhZ2VJbmZvKHdhaXRzKSxcbiAgICB9O1xuICB9O1xuXG4gIGlmIChvcHRzLmpzb24pIHtcbiAgICBjb25zdCBwYWdlID0gYXdhaXQgZmV0Y2hTbGVlcHNQYWdlKG9wdHMuY3Vyc29yKTtcbiAgICBzaG93SnNvbihwYWdlLmRhdGEpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IHNldHVwTGlzdFBhZ2luYXRpb248UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KHtcbiAgICBpbml0aWFsQ3Vyc29yOiBvcHRzLmN1cnNvcixcbiAgICBpbnRlcmFjdGl2ZTogb3B0cy5pbnRlcmFjdGl2ZSxcbiAgICBmZXRjaFBhZ2U6IGZldGNoU2xlZXBzUGFnZSxcbiAgICBkaXNwbGF5UGFnZTogYXN5bmMgKHdhaXRzKSA9PiB7XG4gICAgICBsb2dnZXIubG9nKFxuICAgICAgICBzaG93VGFibGUoXG4gICAgICAgICAgd2FpdHMsXG4gICAgICAgICAgWyd3YWl0SWQnLCAnc3RhdHVzJywgJ2NyZWF0ZWRBdCcsICdyZXN1bWVBdCcsICdjb21wbGV0ZWRBdCddLFxuICAgICAgICAgIHsgLi4ub3B0cywgZGlzYWJsZVJlbGF0aXZlRGF0ZXM6IHRydWUgfVxuICAgICAgICApXG4gICAgICApO1xuICAgIH0sXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGxpc3RTbGVlcHMgPSBhc3luYyAoXG4gIHdvcmxkOiBXb3JsZCxcbiAgb3B0czogSW5zcGVjdENMSU9wdGlvbnMgPSB7fVxuKSA9PiB7XG4gIGlmICghb3B0cy5ydW5JZCkge1xuICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICdydW4taWQgaXMgcmVxdWlyZWQgZm9yIGxpc3Rpbmcgc2xlZXBzLiBVc2FnZTogYHdvcmtmbG93IGluc3BlY3Qgc2xlZXBzIC0tcnVuSWQ9PGlkPmAnXG4gICAgKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBpZiAob3B0cy5zdGVwSWQpIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgICdGaWx0ZXJpbmcgYnkgc3RlcC1pZCBpcyBub3Qgc3VwcG9ydGVkIGZvciBzbGVlcHMsIGlnbm9yaW5nIGZpbHRlci4nXG4gICAgKTtcbiAgfVxuICBpZiAob3B0cy53b3JrZmxvd05hbWUpIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgICdGaWx0ZXJpbmcgYnkgd29ya2Zsb3ctbmFtZSBpcyBub3Qgc3VwcG9ydGVkIGZvciBzbGVlcHMsIGlnbm9yaW5nIGZpbHRlci4nXG4gICAgKTtcbiAgfVxuICBpZiAob3B0cy53aXRoRGF0YSkge1xuICAgIGxvZ2dlci53YXJuKCdgd2l0aERhdGFgIGZsYWcgaXMgaWdub3JlZCB3aGVuIGxpc3Rpbmcgc2xlZXBzJyk7XG4gIH1cblxuICAvLyBQcmVmZXIgdGhlIGFuYWx5dGljcyByZWFkIHBhdGggZm9yIHdhaXQvc2xlZXAgbGlzdGluZyB3aGVuIGF2YWlsYWJsZS5cbiAgaWYgKHdvcmxkLmFuYWx5dGljcykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBsaXN0U2xlZXBzVmlhQW5hbHl0aWNzKHdvcmxkLmFuYWx5dGljcywgb3B0cyk7XG4gICAgICByZXR1cm47XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChoYW5kbGVBcGlFcnJvcihlcnJvciwgb3B0cy5iYWNrZW5kKSkge1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICB0cnkge1xuICAgIC8vIEZldGNoIGFsbCBldmVudHMgZm9yIHRoZSBydW4gd2l0aCByZXNvbHZlRGF0YT0nYWxsJyB0byBnZXQgd2FpdCBldmVudERhdGFcbiAgICBjb25zdCBldmVudHMgPSBhd2FpdCB3b3JsZC5ldmVudHMubGlzdCh7XG4gICAgICBydW5JZDogb3B0cy5ydW5JZCxcbiAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgc29ydE9yZGVyOiBvcHRzLnNvcnQgfHwgJ2Rlc2MnLFxuICAgICAgICBsaW1pdDogMTAwMCxcbiAgICAgIH0sXG4gICAgICByZXNvbHZlRGF0YTogJ2FsbCcsXG4gICAgfSk7XG5cbiAgICAvLyBTaG93IGluZm8gbWVzc2FnZSBpZiB0aGVyZSBtaWdodCBiZSBtb3JlIHNsZWVwc1xuICAgIGlmIChldmVudHMuaGFzTW9yZSkge1xuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICdXYXJuaW5nOiBUaGlzIHJ1biBoYXMgbW9yZSB0aGFuIDEwMDAgZXZlbnRzLiBTb21lIHNsZWVwcyBtaWdodCBub3QgYmUgc2hvd24uIFBsZWFzZSB1c2UgdGhlIHdlYiBVSSB0byBlbnN1cmUgZ2V0dGluZyBhIGNvbXBsZXRlIGxpc3QuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBHcm91cCB3YWl0IGV2ZW50cyBieSBjb3JyZWxhdGlvbklkXG4gICAgY29uc3Qgd2FpdEV2ZW50c0J5Q29ycmVsYXRpb24gPSBuZXcgTWFwPHN0cmluZywgRXZlbnRbXT4oKTtcbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cy5kYXRhKSB7XG4gICAgICBpZiAoZXZlbnQuY29ycmVsYXRpb25JZD8uc3RhcnRzV2l0aCgnd2FpdF8nKSkge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHdhaXRFdmVudHNCeUNvcnJlbGF0aW9uLmdldChldmVudC5jb3JyZWxhdGlvbklkKSA/PyBbXTtcbiAgICAgICAgZXhpc3RpbmcucHVzaChldmVudCk7XG4gICAgICAgIHdhaXRFdmVudHNCeUNvcnJlbGF0aW9uLnNldChldmVudC5jb3JyZWxhdGlvbklkLCBleGlzdGluZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdhaXRFdmVudHNCeUNvcnJlbGF0aW9uLnNpemUgPT09IDApIHtcbiAgICAgIGxvZ2dlci53YXJuKCdObyBzbGVlcHMgZm91bmQgZm9yIHRoaXMgcnVuLicpO1xuICAgICAgaWYgKG9wdHMuanNvbikge1xuICAgICAgICBzaG93SnNvbihbXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIubG9nKFxuICAgICAgICAgIHNob3dUYWJsZShbXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLCBXQUlUX0xJU1RFRF9QUk9QUywge1xuICAgICAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgICAgIGRpc2FibGVSZWxhdGl2ZURhdGVzOiB0cnVlLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgc2xlZXBzIGZyb20gZ3JvdXBlZCB3YWl0IGV2ZW50c1xuICAgIGNvbnN0IHNsZWVwczogU2xlZXBbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2NvcnJlbGF0aW9uSWQsIGNvcnJlbGF0aW9uRXZlbnRzXSBvZiB3YWl0RXZlbnRzQnlDb3JyZWxhdGlvbikge1xuICAgICAgLy8gU3RpdGNoIHVwIHdhaXRfY3JlYXRlZCBhbmQgd2FpdF9jb21wbGV0ZWQgZXZlbnRzXG4gICAgICBjb25zdCB3YWl0Q3JlYXRlZCA9IGNvcnJlbGF0aW9uRXZlbnRzLmZpbmQoXG4gICAgICAgIChlOiBFdmVudCkgPT4gZS5ldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnXG4gICAgICApO1xuICAgICAgY29uc3Qgd2FpdENvbXBsZXRlZCA9IGNvcnJlbGF0aW9uRXZlbnRzLmZpbmQoXG4gICAgICAgIChlOiBFdmVudCkgPT4gZS5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCdcbiAgICAgICk7XG5cbiAgICAgIGlmICh3YWl0Q3JlYXRlZCkge1xuICAgICAgICBjb25zdCBzbGVlcDogU2xlZXAgPSB7XG4gICAgICAgICAgY29ycmVsYXRpb25JZCxcbiAgICAgICAgICBydW5JZDogd2FpdENyZWF0ZWQucnVuSWQsXG4gICAgICAgICAgZXZlbnRJZDogd2FpdENyZWF0ZWQuZXZlbnRJZCxcbiAgICAgICAgICBjcmVhdGVkQXQ6IHdhaXRDcmVhdGVkLmNyZWF0ZWRBdCxcbiAgICAgICAgICByZXN1bWVBdDpcbiAgICAgICAgICAgIHdhaXRDcmVhdGVkLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY3JlYXRlZCdcbiAgICAgICAgICAgICAgPyB3YWl0Q3JlYXRlZC5ldmVudERhdGEucmVzdW1lQXRcbiAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgY29tcGxldGVkQXQ6IHdhaXRDb21wbGV0ZWQ/LmNyZWF0ZWRBdCxcbiAgICAgICAgfTtcbiAgICAgICAgc2xlZXBzLnB1c2goc2xlZXApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNvcnQgc2xlZXBzIGJ5IGNyZWF0ZWRBdFxuICAgIHNsZWVwcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCB0aW1lQSA9IGEuY3JlYXRlZEF0LmdldFRpbWUoKTtcbiAgICAgIGNvbnN0IHRpbWVCID0gYi5jcmVhdGVkQXQuZ2V0VGltZSgpO1xuICAgICAgcmV0dXJuIG9wdHMuc29ydCA9PT0gJ2FzYycgPyB0aW1lQSAtIHRpbWVCIDogdGltZUIgLSB0aW1lQTtcbiAgICB9KTtcblxuICAgIGlmIChvcHRzLmpzb24pIHtcbiAgICAgIHNob3dKc29uKHNsZWVwcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9nZ2VyLmxvZyhcbiAgICAgIHNob3dUYWJsZShcbiAgICAgICAgc2xlZXBzIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSxcbiAgICAgICAgV0FJVF9MSVNURURfUFJPUFMsXG4gICAgICAgIHsgLi4ub3B0cywgZGlzYWJsZVJlbGF0aXZlRGF0ZXM6IHRydWUgfVxuICAgICAgKVxuICAgICk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGhhbmRsZUFwaUVycm9yKGVycm9yLCBvcHRzLmJhY2tlbmQpKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuIl19
|