gitlab-ci-local 4.26.4 → 4.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -0
- package/package.json +7 -7
- package/src/cache-entry.js +21 -0
- package/src/handler.js +5 -5
- package/src/index.js +6 -1
- package/src/job-expanders.js +2 -18
- package/src/job.js +159 -98
- package/src/mutex.js +24 -0
- package/src/parser-includes.js +2 -2
- package/src/parser.js +9 -8
- package/src/types/job-options.js +1 -1
- package/src/types/parser-options.js +1 -1
- package/src/utils.js +3 -3
- package/src/variables-from-files.js +103 -0
- package/src/home-variables.js +0 -100
package/src/job.js
CHANGED
|
@@ -32,6 +32,8 @@ const camelcase_1 = __importDefault(require("camelcase"));
|
|
|
32
32
|
const exit_error_1 = require("./types/exit-error");
|
|
33
33
|
const utils_1 = require("./utils");
|
|
34
34
|
const asserts_1 = require("./asserts");
|
|
35
|
+
const cache_entry_1 = require("./cache-entry");
|
|
36
|
+
const mutex_1 = require("./mutex");
|
|
35
37
|
class Job {
|
|
36
38
|
constructor(opt) {
|
|
37
39
|
this._prescriptsExitCode = null;
|
|
@@ -39,17 +41,17 @@ class Job {
|
|
|
39
41
|
this._coveragePercent = null;
|
|
40
42
|
this._running = false;
|
|
41
43
|
this._containerId = null;
|
|
42
|
-
this._serviceIds = [];
|
|
43
44
|
this._serviceNetworkId = null;
|
|
44
|
-
this._artifactsContainerId = null;
|
|
45
45
|
this._containerVolumeNames = [];
|
|
46
46
|
this._longRunningSilentTimeout = -1;
|
|
47
47
|
this._producers = null;
|
|
48
|
+
this._containersToClean = [];
|
|
48
49
|
const jobData = opt.data;
|
|
49
50
|
const gitData = opt.gitData;
|
|
50
51
|
const globals = opt.globals;
|
|
51
|
-
const
|
|
52
|
-
const
|
|
52
|
+
const variablesFromFiles = opt.variablesFromFiles;
|
|
53
|
+
const cliVariables = opt.cliVariables;
|
|
54
|
+
this.mountCache = opt.mountCache;
|
|
53
55
|
this.extraHosts = opt.extraHosts;
|
|
54
56
|
this.volumes = opt.volumes;
|
|
55
57
|
this.writeStreams = opt.writeStreams;
|
|
@@ -63,11 +65,9 @@ class Job {
|
|
|
63
65
|
this.shellIsolation = opt.shellIsolation;
|
|
64
66
|
this.when = jobData.when || "on_success";
|
|
65
67
|
this.allowFailure = jobData.allow_failure ?? false;
|
|
66
|
-
this._needs = jobData.needs || null;
|
|
67
68
|
this.dependencies = jobData.dependencies || null;
|
|
68
69
|
this.rules = jobData.rules || null;
|
|
69
70
|
this.environment = typeof jobData.environment === "string" ? { name: jobData.environment } : jobData.environment;
|
|
70
|
-
this.cache = jobData.cache || [];
|
|
71
71
|
let CI_PROJECT_DIR = `${this.cwd}`;
|
|
72
72
|
if (this.imageName) {
|
|
73
73
|
CI_PROJECT_DIR = `/builds/${this.safeJobName}`;
|
|
@@ -116,10 +116,10 @@ class Job {
|
|
|
116
116
|
GITLAB_CI: "false",
|
|
117
117
|
};
|
|
118
118
|
// Create expanded variables
|
|
119
|
-
const envs = { ...predefinedVariables, ...globals.variables || {}, ...jobData.variables || {}, ...
|
|
119
|
+
const envs = { ...predefinedVariables, ...globals.variables || {}, ...jobData.variables || {}, ...variablesFromFiles, ...cliVariables };
|
|
120
120
|
const expandedGlobalVariables = utils_1.Utils.expandVariables(globals.variables || {}, envs);
|
|
121
121
|
const expandedJobVariables = utils_1.Utils.expandVariables(jobData.variables || {}, envs);
|
|
122
|
-
this.expandedVariables = { ...predefinedVariables, ...expandedGlobalVariables, ...expandedJobVariables, ...
|
|
122
|
+
this.expandedVariables = { ...predefinedVariables, ...expandedGlobalVariables, ...expandedJobVariables, ...variablesFromFiles, ...cliVariables };
|
|
123
123
|
// Set {when, allowFailure} based on rules result
|
|
124
124
|
if (this.rules) {
|
|
125
125
|
const ruleResult = utils_1.Utils.getRulesResult(this.rules, this.expandedVariables);
|
|
@@ -132,14 +132,16 @@ class Job {
|
|
|
132
132
|
if (this.injectSSHAgent && this.imageName === null) {
|
|
133
133
|
throw new exit_error_1.ExitError(`${this.chalkJobName} @InjectSSHAgent can only be used with image:`);
|
|
134
134
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
135
|
+
if (this.imageName && this.mountCache) {
|
|
136
|
+
for (const c of this.cache) {
|
|
137
|
+
c.paths.forEach((p) => {
|
|
138
|
+
const path = utils_1.Utils.expandText(p, this.expandedVariables);
|
|
139
|
+
if (path.includes("*")) {
|
|
140
|
+
throw new exit_error_1.ExitError(`${this.name} cannot have * in cache paths, when --mount-cache is enabled`);
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
}
|
|
139
144
|
}
|
|
140
|
-
return "md-" + await utils_1.Utils.checksumFiles(cacheEntry.key.files.map(f => {
|
|
141
|
-
return `${cwd}/${utils_1.Utils.expandText(f, expandedVariables)}`;
|
|
142
|
-
}));
|
|
143
145
|
}
|
|
144
146
|
get artifactsToSource() {
|
|
145
147
|
return this.jobData["artifactsToSource"] == null ? true : this.jobData["artifactsToSource"];
|
|
@@ -151,10 +153,11 @@ class Job {
|
|
|
151
153
|
return utils_1.Utils.getSafeJobName(this.name);
|
|
152
154
|
}
|
|
153
155
|
get needs() {
|
|
154
|
-
|
|
156
|
+
const needs = this.jobData["needs"];
|
|
157
|
+
if (!needs)
|
|
155
158
|
return null;
|
|
156
159
|
const list = [];
|
|
157
|
-
|
|
160
|
+
needs.forEach((need) => {
|
|
158
161
|
list.push({
|
|
159
162
|
job: typeof need === "string" ? need : need.job,
|
|
160
163
|
artifacts: typeof need === "string" ? true : need.artifacts,
|
|
@@ -162,6 +165,29 @@ class Job {
|
|
|
162
165
|
});
|
|
163
166
|
return list;
|
|
164
167
|
}
|
|
168
|
+
get cache() {
|
|
169
|
+
let cacheData = this.jobData["cache"];
|
|
170
|
+
const cacheList = [];
|
|
171
|
+
if (!cacheData)
|
|
172
|
+
return [];
|
|
173
|
+
cacheData = Array.isArray(cacheData) ? cacheData : [cacheData];
|
|
174
|
+
cacheData.forEach((c) => {
|
|
175
|
+
const key = c["key"];
|
|
176
|
+
const policy = c["policy"] ?? "pull-push";
|
|
177
|
+
if (!["pull", "push", "pull-push"].includes(policy)) {
|
|
178
|
+
throw new exit_error_1.ExitError("cache policy is not 'pull', 'push' or 'pull-push'");
|
|
179
|
+
}
|
|
180
|
+
const paths = c["paths"] ?? [];
|
|
181
|
+
cacheList.push(new cache_entry_1.CacheEntry(key, paths, policy));
|
|
182
|
+
});
|
|
183
|
+
return cacheList;
|
|
184
|
+
}
|
|
185
|
+
get buildVolumeName() {
|
|
186
|
+
return `gcl-${this.safeJobName}-${this.jobId}-build`;
|
|
187
|
+
}
|
|
188
|
+
get tmpVolumeName() {
|
|
189
|
+
return `gcl-${this.safeJobName}-${this.jobId}-tmp`;
|
|
190
|
+
}
|
|
165
191
|
get imageName() {
|
|
166
192
|
const image = this.jobData["image"];
|
|
167
193
|
if (!image) {
|
|
@@ -278,20 +304,9 @@ class Job {
|
|
|
278
304
|
async cleanupResources() {
|
|
279
305
|
const writeStreams = this.writeStreams;
|
|
280
306
|
clearTimeout(this._longRunningSilentTimeout);
|
|
281
|
-
|
|
307
|
+
for (const id of this._containersToClean) {
|
|
282
308
|
try {
|
|
283
|
-
await utils_1.Utils.spawn(`docker rm -f ${
|
|
284
|
-
}
|
|
285
|
-
catch (e) {
|
|
286
|
-
(0, asserts_1.assert)(e instanceof Error, "e is not instanceof Error");
|
|
287
|
-
writeStreams.stderr((0, chalk_1.default) `{yellow ${e.message}}`);
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
if (this._serviceIds) {
|
|
291
|
-
try {
|
|
292
|
-
for (const serviceId of this._serviceIds) {
|
|
293
|
-
await utils_1.Utils.spawn(`docker rm -f ${serviceId}`);
|
|
294
|
-
}
|
|
309
|
+
await utils_1.Utils.spawn(`docker rm -f ${id}`);
|
|
295
310
|
}
|
|
296
311
|
catch (e) {
|
|
297
312
|
(0, asserts_1.assert)(e instanceof Error, "e is not instanceof Error");
|
|
@@ -307,15 +322,6 @@ class Job {
|
|
|
307
322
|
writeStreams.stderr((0, chalk_1.default) `{yellow ${e.message}}`);
|
|
308
323
|
}
|
|
309
324
|
}
|
|
310
|
-
if (this._artifactsContainerId) {
|
|
311
|
-
try {
|
|
312
|
-
await utils_1.Utils.spawn(`docker rm -f ${this._artifactsContainerId}`);
|
|
313
|
-
}
|
|
314
|
-
catch (e) {
|
|
315
|
-
(0, asserts_1.assert)(e instanceof Error, "e is not instanceof Error");
|
|
316
|
-
writeStreams.stderr((0, chalk_1.default) `{yellow ${e.message}}`);
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
325
|
if (this._containerVolumeNames.length > 0) {
|
|
320
326
|
try {
|
|
321
327
|
for (const containerVolume of this._containerVolumeNames) {
|
|
@@ -350,11 +356,26 @@ class Job {
|
|
|
350
356
|
});
|
|
351
357
|
return cmd;
|
|
352
358
|
}
|
|
359
|
+
async mountCacheCmd(safeJobName, writeStreams) {
|
|
360
|
+
if (this.imageName && !this.mountCache)
|
|
361
|
+
return "";
|
|
362
|
+
let cmd = "";
|
|
363
|
+
for (const c of this.cache) {
|
|
364
|
+
const uniqueCacheName = await c.getUniqueCacheName(this.cwd, this.expandedVariables);
|
|
365
|
+
c.paths.forEach((p) => {
|
|
366
|
+
const path = utils_1.Utils.expandText(p, this.expandedVariables);
|
|
367
|
+
writeStreams.stdout((0, chalk_1.default) `${this.chalkJobName} {magentaBright mounting cache} for path ${path}\n`);
|
|
368
|
+
const cacheMount = `gcl-${this.expandedVariables.CI_PROJECT_PATH_SLUG}-${uniqueCacheName}`;
|
|
369
|
+
cmd += `-v ${cacheMount}:/builds/${safeJobName}/${path} `;
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
return cmd;
|
|
373
|
+
}
|
|
353
374
|
async execScripts(scripts, privileged) {
|
|
354
375
|
const safeJobName = this.safeJobName;
|
|
355
376
|
const outputFilesPath = `${this.cwd}/.gitlab-ci-local/output/${safeJobName}.log`;
|
|
356
|
-
const buildVolumeName =
|
|
357
|
-
const tmpVolumeName =
|
|
377
|
+
const buildVolumeName = this.buildVolumeName;
|
|
378
|
+
const tmpVolumeName = this.tmpVolumeName;
|
|
358
379
|
const writeStreams = this.writeStreams;
|
|
359
380
|
const reportsDotenvVariables = await this.initProducerReportsDotenvVariables(writeStreams);
|
|
360
381
|
let time;
|
|
@@ -424,7 +445,7 @@ class Job {
|
|
|
424
445
|
for (const [key, value] of Object.entries(reportsDotenvVariables)) {
|
|
425
446
|
dockerCmd += `-e ${key}='${String(value).trim()}' `;
|
|
426
447
|
}
|
|
427
|
-
dockerCmd += await this.
|
|
448
|
+
dockerCmd += await this.mountCacheCmd(safeJobName, writeStreams);
|
|
428
449
|
dockerCmd += `${this.imageName} sh -c "\n`;
|
|
429
450
|
dockerCmd += "if [ -x /usr/local/bin/bash ]; then\n";
|
|
430
451
|
dockerCmd += "\texec /usr/local/bin/bash \n";
|
|
@@ -446,6 +467,7 @@ class Job {
|
|
|
446
467
|
dockerCmd += "fi\n\"";
|
|
447
468
|
const { stdout: containerId } = await utils_1.Utils.spawn(dockerCmd, this.cwd);
|
|
448
469
|
this._containerId = containerId.replace(/\r?\n/g, "");
|
|
470
|
+
this._containersToClean.push(this._containerId);
|
|
449
471
|
time = process.hrtime();
|
|
450
472
|
// Copy source files into container.
|
|
451
473
|
await utils_1.Utils.spawn(`docker cp .gitlab-ci-local/builds/.docker/. ${this._containerId}:/builds/${safeJobName}`, this.cwd);
|
|
@@ -459,9 +481,10 @@ class Job {
|
|
|
459
481
|
endTime = process.hrtime(time);
|
|
460
482
|
writeStreams.stdout((0, chalk_1.default) `${this.chalkJobName} {magentaBright copied to container} in {magenta ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
|
|
461
483
|
}
|
|
484
|
+
await this.copyCacheIn(writeStreams);
|
|
462
485
|
await this.copyArtifactsIn(writeStreams);
|
|
463
486
|
if (this.imageName) {
|
|
464
|
-
//
|
|
487
|
+
// Files in docker-executor build folder must be root owned.
|
|
465
488
|
await utils_1.Utils.spawn(`docker run --rm -w /app/ -v ${buildVolumeName}:/app/ firecow/gitlab-ci-local-util bash -c "chown 0:0 -R . && chmod a+rw -R ."`);
|
|
466
489
|
}
|
|
467
490
|
let cmd = "set -eo pipefail\n";
|
|
@@ -508,7 +531,10 @@ class Job {
|
|
|
508
531
|
cp.stdin.end(`./.gitlab-ci-local/scripts/${safeJobName}`);
|
|
509
532
|
}
|
|
510
533
|
});
|
|
511
|
-
|
|
534
|
+
if (exitCode == 0) {
|
|
535
|
+
await this.copyCacheOut(writeStreams);
|
|
536
|
+
await this.copyArtifactsOut(writeStreams);
|
|
537
|
+
}
|
|
512
538
|
return exitCode;
|
|
513
539
|
}
|
|
514
540
|
async pullImage(writeStreams, imageToPull) {
|
|
@@ -548,78 +574,112 @@ class Job {
|
|
|
548
574
|
}
|
|
549
575
|
return producerReportsEnvs;
|
|
550
576
|
}
|
|
551
|
-
async
|
|
552
|
-
if (
|
|
577
|
+
async copyCacheIn(writeStreams) {
|
|
578
|
+
if (this.mountCache && this.imageName)
|
|
553
579
|
return;
|
|
554
|
-
|
|
555
|
-
if (!this.producers || this.producers.length === 0) {
|
|
580
|
+
if ((!this.imageName && !this.shellIsolation) || this.cache.length === 0)
|
|
556
581
|
return;
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
582
|
+
for (const c of this.cache) {
|
|
583
|
+
if (!["pull", "pull-push"].includes(c.policy))
|
|
584
|
+
return;
|
|
585
|
+
const time = process.hrtime();
|
|
586
|
+
const cacheName = await c.getUniqueCacheName(this.cwd, this.expandedVariables);
|
|
587
|
+
const cacheFolder = `${this.cwd}/.gitlab-ci-local/cache/${cacheName}`;
|
|
588
|
+
if (!await fs.pathExists(cacheFolder)) {
|
|
589
|
+
continue;
|
|
562
590
|
}
|
|
563
|
-
|
|
564
|
-
|
|
591
|
+
await mutex_1.Mutex.exclusive(cacheName, async () => {
|
|
592
|
+
await this.copyIn(cacheFolder);
|
|
593
|
+
});
|
|
594
|
+
const endTime = process.hrtime(time);
|
|
595
|
+
writeStreams.stdout((0, chalk_1.default) `${this.chalkJobName} {magentaBright imported cache '${cacheName}'} in {magenta ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
async copyArtifactsIn(writeStreams) {
|
|
599
|
+
if ((!this.imageName && !this.shellIsolation) || (this.producers ?? []).length === 0)
|
|
600
|
+
return;
|
|
565
601
|
const time = process.hrtime();
|
|
566
602
|
const promises = [];
|
|
567
|
-
for (const producer of this.producers) {
|
|
603
|
+
for (const producer of this.producers ?? []) {
|
|
568
604
|
const producerSafeName = utils_1.Utils.getSafeJobName(producer.name);
|
|
569
605
|
const artifactFolder = `${this.cwd}/.gitlab-ci-local/artifacts/${producerSafeName}`;
|
|
570
606
|
if (!await fs.pathExists(artifactFolder)) {
|
|
571
607
|
throw new exit_error_1.ExitError(`${artifactFolder} doesn't exist, did you forget --needs`);
|
|
572
608
|
}
|
|
573
|
-
promises.push(
|
|
609
|
+
promises.push(this.copyIn(artifactFolder));
|
|
574
610
|
}
|
|
575
611
|
await Promise.all(promises);
|
|
576
612
|
const endTime = process.hrtime(time);
|
|
577
|
-
|
|
578
|
-
writeStreams.stdout((0, chalk_1.default) `${this.chalkJobName} {magentaBright copied artifacts to ${targetText}} in {magenta ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
|
|
613
|
+
writeStreams.stdout((0, chalk_1.default) `${this.chalkJobName} {magentaBright imported artifacts} in {magenta ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
|
|
579
614
|
}
|
|
580
|
-
|
|
615
|
+
copyIn(source) {
|
|
581
616
|
const safeJobName = this.safeJobName;
|
|
582
|
-
if (!this.
|
|
617
|
+
if (!this.imageName && this.shellIsolation) {
|
|
618
|
+
return utils_1.Utils.spawn(`rsync -a ${source}/. ${this.cwd}/.gitlab-ci-local/builds/${safeJobName}`);
|
|
619
|
+
}
|
|
620
|
+
return utils_1.Utils.spawn(`docker cp ${source}/. ${this._containerId}:/builds/${safeJobName}`);
|
|
621
|
+
}
|
|
622
|
+
async copyCacheOut(writeStreams) {
|
|
623
|
+
if (this.mountCache && this.imageName)
|
|
583
624
|
return;
|
|
625
|
+
if ((!this.imageName && !this.shellIsolation) || this.cache.length === 0)
|
|
626
|
+
return;
|
|
627
|
+
let time, endTime;
|
|
628
|
+
for (const c of this.cache) {
|
|
629
|
+
if (!["push", "pull-push"].includes(c.policy))
|
|
630
|
+
return;
|
|
631
|
+
const cacheName = await c.getUniqueCacheName(this.cwd, this.expandedVariables);
|
|
632
|
+
for (const path of c.paths) {
|
|
633
|
+
time = process.hrtime();
|
|
634
|
+
const expandedPath = utils_1.Utils.expandText(path, this.expandedVariables);
|
|
635
|
+
let cmd = "shopt -s globstar nullglob dotglob\n";
|
|
636
|
+
cmd += `mkdir -p ../../cache/${cacheName}\n`;
|
|
637
|
+
cmd += `rsync -Ra ${expandedPath} ../../cache/${cacheName}/. || true\n`;
|
|
638
|
+
await mutex_1.Mutex.exclusive(cacheName, async () => {
|
|
639
|
+
await this.copyOut(cmd, "cache", []);
|
|
640
|
+
});
|
|
641
|
+
endTime = process.hrtime(time);
|
|
642
|
+
const readdir = await fs.readdir(`${this.cwd}/.gitlab-ci-local/cache/${cacheName}`);
|
|
643
|
+
if (readdir.length === 0) {
|
|
644
|
+
writeStreams.stdout((0, chalk_1.default) `${this.chalkJobName} {yellow !! no cache was copied for ${path} !!}\n`);
|
|
645
|
+
}
|
|
646
|
+
else {
|
|
647
|
+
writeStreams.stdout((0, chalk_1.default) `${this.chalkJobName} {magentaBright exported cache ${expandedPath} '${cacheName}'} in {magenta ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
|
|
648
|
+
}
|
|
649
|
+
}
|
|
584
650
|
}
|
|
651
|
+
}
|
|
652
|
+
async copyArtifactsOut(writeStreams) {
|
|
653
|
+
const safeJobName = this.safeJobName;
|
|
654
|
+
if (!this.shellIsolation && !this.imageName || !this.artifacts)
|
|
655
|
+
return;
|
|
585
656
|
let time, endTime;
|
|
586
657
|
let cpCmd = "shopt -s globstar nullglob dotglob\n";
|
|
587
658
|
cpCmd += `mkdir -p ../../artifacts/${safeJobName}\n`;
|
|
588
659
|
for (const artifactPath of this.artifacts?.paths ?? []) {
|
|
589
660
|
const expandedPath = utils_1.Utils.expandText(artifactPath, this.expandedVariables);
|
|
590
|
-
cpCmd += `
|
|
591
|
-
cpCmd += `rsync -Ra ${expandedPath} ../../artifacts/${safeJobName}/.\n`;
|
|
592
|
-
cpCmd += `echo Done copying ${expandedPath} to ../../artifacts/${safeJobName}\n`;
|
|
661
|
+
cpCmd += `rsync -Ra ${expandedPath} ../../artifacts/${safeJobName}/. || true\n`;
|
|
593
662
|
}
|
|
594
663
|
for (const artifactExcludePath of this.artifacts?.exclude ?? []) {
|
|
595
664
|
const expandedPath = utils_1.Utils.expandText(artifactExcludePath, this.expandedVariables);
|
|
596
|
-
cpCmd += `echo Started removing exclude '${expandedPath}' from ../../artifacts/${safeJobName}\n`;
|
|
597
665
|
cpCmd += `ls -1d '../../artifacts/${safeJobName}/${expandedPath}' | xargs -n1 rm -rf || true\n`;
|
|
598
|
-
cpCmd += `echo Done removing exclude '${expandedPath}' from ../../artifacts/${safeJobName}\n`;
|
|
599
666
|
}
|
|
600
667
|
const reportDotenv = this.artifacts.reports?.dotenv ?? null;
|
|
601
668
|
if (reportDotenv != null) {
|
|
602
669
|
cpCmd += `mkdir -p ../../artifacts/${safeJobName}/.gitlab-ci-reports/dotenv\n`;
|
|
603
|
-
cpCmd += `echo Started copying ${reportDotenv} to ../../artifacts/${safeJobName}/.gitlab-ci-reports/dotenv\n`;
|
|
604
670
|
cpCmd += `rsync -Ra ${reportDotenv} ../../artifacts/${safeJobName}/.gitlab-ci-reports/dotenv/.\n`;
|
|
605
|
-
cpCmd += `echo Done copying ${reportDotenv} to ../../artifacts/${safeJobName}/.gitlab-ci-reports/dotenv\n`;
|
|
606
671
|
}
|
|
607
672
|
time = process.hrtime();
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
await utils_1.Utils.spawn(`docker start ${this._artifactsContainerId} --attach`);
|
|
615
|
-
await utils_1.Utils.spawn(`docker cp ${this._artifactsContainerId}:/artifacts/. .gitlab-ci-local/artifacts/.`, this.cwd);
|
|
673
|
+
const dockerCmdExtras = this.mountCache ? [await this.mountCacheCmd(this.safeJobName, writeStreams)] : [];
|
|
674
|
+
await this.copyOut(cpCmd, "artifacts", dockerCmdExtras);
|
|
675
|
+
endTime = process.hrtime(time);
|
|
676
|
+
const readdir = await fs.readdir(`${this.cwd}/.gitlab-ci-local/artifacts/${safeJobName}`);
|
|
677
|
+
if (readdir.length === 0) {
|
|
678
|
+
writeStreams.stdout((0, chalk_1.default) `${this.chalkJobName} {yellow !! no artifacts was copied !!}\n`);
|
|
616
679
|
}
|
|
617
|
-
else
|
|
618
|
-
|
|
619
|
-
await utils_1.Utils.spawn(`bash -e -c "${cpCmd}"`, `${this.cwd}/.gitlab-ci-local/builds/${safeJobName}`);
|
|
680
|
+
else {
|
|
681
|
+
writeStreams.stdout((0, chalk_1.default) `${this.chalkJobName} {magentaBright exported artifacts} in {magenta ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
|
|
620
682
|
}
|
|
621
|
-
endTime = process.hrtime(time);
|
|
622
|
-
writeStreams.stdout((0, chalk_1.default) `${this.chalkJobName} {magentaBright saved artifacts} in {magenta ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
|
|
623
683
|
if (this.artifactsToSource) {
|
|
624
684
|
time = process.hrtime();
|
|
625
685
|
await utils_1.Utils.spawn(`rsync --exclude=/.gitlab-ci-reports/ -a ${this.cwd}/.gitlab-ci-local/artifacts/${safeJobName}/. ${this.cwd}`);
|
|
@@ -630,6 +690,21 @@ class Job {
|
|
|
630
690
|
writeStreams.stdout((0, chalk_1.default) `${this.chalkJobName} {magentaBright copied artifacts to cwd} in {magenta ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
|
|
631
691
|
}
|
|
632
692
|
}
|
|
693
|
+
async copyOut(cmd, type, dockerCmdExtras) {
|
|
694
|
+
const safeJobName = this.safeJobName;
|
|
695
|
+
const buildVolumeName = this.buildVolumeName;
|
|
696
|
+
await fs.mkdirp(`${this.cwd}/.gitlab-ci-local/${type}`);
|
|
697
|
+
if (this.imageName) {
|
|
698
|
+
const { stdout: cid } = await utils_1.Utils.spawn(`docker create -i ${dockerCmdExtras.join(" ")} -v ${buildVolumeName}:/builds/${safeJobName}/ -w /builds/${safeJobName}/ firecow/gitlab-ci-local-util bash -c "${cmd}"`, this.cwd);
|
|
699
|
+
const containerId = cid.replace(/\r?\n/g, "");
|
|
700
|
+
this._containersToClean.push(containerId);
|
|
701
|
+
await utils_1.Utils.spawn(`docker start ${containerId} --attach`);
|
|
702
|
+
await utils_1.Utils.spawn(`docker cp ${containerId}:/${type}/. .gitlab-ci-local/${type}/.`, this.cwd);
|
|
703
|
+
}
|
|
704
|
+
else if (this.shellIsolation) {
|
|
705
|
+
await utils_1.Utils.spawn(`bash -eo pipefail -c "${cmd}"`, `${this.cwd}/.gitlab-ci-local/builds/${safeJobName}`);
|
|
706
|
+
}
|
|
707
|
+
}
|
|
633
708
|
refreshLongRunningSilentTimeout(writeStreams) {
|
|
634
709
|
clearTimeout(this._longRunningSilentTimeout);
|
|
635
710
|
this._longRunningSilentTimeout = setTimeout(() => {
|
|
@@ -653,20 +728,6 @@ class Job {
|
|
|
653
728
|
const { stdout: networkId } = await utils_1.Utils.spawn(`docker network create ${networkName}`);
|
|
654
729
|
this._serviceNetworkId = networkId.replace(/\r?\n/g, "");
|
|
655
730
|
}
|
|
656
|
-
async createCacheDockerVolumeMounts(safeJobName, writeStreams) {
|
|
657
|
-
let cmd = "";
|
|
658
|
-
for (const entry of this.cache) {
|
|
659
|
-
const uniqueCacheName = await Job.getUniqueCacheName(this.cwd, entry, this.expandedVariables);
|
|
660
|
-
entry.paths.forEach((p) => {
|
|
661
|
-
const path = utils_1.Utils.expandText(p, this.expandedVariables);
|
|
662
|
-
writeStreams.stdout((0, chalk_1.default) `${this.chalkJobName} {magentaBright mounting cache} for path ${path}\n`);
|
|
663
|
-
const cachedir = `/tmp/gitlab-ci-local/cache/${uniqueCacheName}/${path}`;
|
|
664
|
-
fs.ensureDirSync(cachedir);
|
|
665
|
-
cmd += `-v ${cachedir}:/builds/${safeJobName}/${path} `;
|
|
666
|
-
});
|
|
667
|
-
}
|
|
668
|
-
return cmd;
|
|
669
|
-
}
|
|
670
731
|
async startService(writeStreams, service, privileged) {
|
|
671
732
|
let dockerCmd = `docker run -d --network gitlab-ci-local-${this.jobId} `;
|
|
672
733
|
if (privileged) {
|
|
@@ -695,7 +756,7 @@ class Job {
|
|
|
695
756
|
}
|
|
696
757
|
const time = process.hrtime();
|
|
697
758
|
const { stdout: containerId } = await utils_1.Utils.spawn(dockerCmd, this.cwd);
|
|
698
|
-
this.
|
|
759
|
+
this._containersToClean.push(containerId.replace(/\r?\n/g, ""));
|
|
699
760
|
this.refreshLongRunningSilentTimeout(writeStreams);
|
|
700
761
|
const endTime = process.hrtime(time);
|
|
701
762
|
writeStreams.stdout((0, chalk_1.default) `${this.chalkJobName} {magentaBright started service image: ${serviceName} with aliases: ${aliases.join(", ")}} in {magenta ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
|
|
@@ -720,7 +781,7 @@ class Job {
|
|
|
720
781
|
dockerCmd += ` willwill/wait-for-it "${aliases[0]}:${portNum}" -t 30`;
|
|
721
782
|
const time = process.hrtime();
|
|
722
783
|
const { status: result, stdout } = await utils_1.Utils.spawn(dockerCmd, this.cwd);
|
|
723
|
-
this.
|
|
784
|
+
this._containersToClean.push(stdout.replace(/\r?\n/g, ""));
|
|
724
785
|
const endTime = process.hrtime(time);
|
|
725
786
|
if (result == 0) {
|
|
726
787
|
writeStreams.stdout((0, chalk_1.default) `${this.chalkJobName} {greenBright service image: ${serviceName} healthcheck passed: ${aliases[0]}:${portNum}} in {green ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
|
|
@@ -738,4 +799,4 @@ Job.illegalJobNames = [
|
|
|
738
799
|
"stages", "pages", "types", "before_script", "default",
|
|
739
800
|
"after_script", "variables", "cache", "workflow",
|
|
740
801
|
];
|
|
741
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9iLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiam9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrREFBMEI7QUFDMUIsK0NBQWlDO0FBQ2pDLDREQUE4QztBQUM5Qyw2Q0FBK0I7QUFDL0Isa0VBQXlDO0FBQ3pDLDBEQUFrQztBQUNsQyxtREFBNkM7QUFDN0MsbUNBQThCO0FBSzlCLHVDQUFpQztBQUVqQyxNQUFhLEdBQUc7SUF5Q1osWUFBWSxHQUFlO1FBbEJuQix3QkFBbUIsR0FBa0IsSUFBSSxDQUFDO1FBQzFDLDBCQUFxQixHQUFHLENBQUMsQ0FBQztRQUMxQixxQkFBZ0IsR0FBa0IsSUFBSSxDQUFDO1FBQ3ZDLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsaUJBQVksR0FBa0IsSUFBSSxDQUFDO1FBQ25DLGdCQUFXLEdBQWEsRUFBRSxDQUFDO1FBQzNCLHNCQUFpQixHQUFrQixJQUFJLENBQUM7UUFDeEMsMEJBQXFCLEdBQWtCLElBQUksQ0FBQztRQUM1QywwQkFBcUIsR0FBYSxFQUFFLENBQUM7UUFDckMsOEJBQXlCLEdBQW1CLENBQUMsQ0FBUSxDQUFDO1FBQ3RELGVBQVUsR0FBcUQsSUFBSSxDQUFDO1FBU3hFLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDekIsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQztRQUM1QixNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDO1FBQzVCLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUM7UUFDeEMsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsZ0JBQWdCLENBQUM7UUFFOUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQztRQUMzQixJQUFJLENBQUMsWUFBWSxH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LHdCQUF3QixPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxhQUFhLElBQUEsdUJBQVksRUFBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQy9LO2FBQ0o7U0FDSjtJQUNMLENBQUM7O0FBdDBCTCxrQkF1MEJDO0FBcjBCbUIsbUJBQWUsR0FBRztJQUM5QixTQUFTLEVBQUUscUJBQXFCLEVBQUUsT0FBTyxFQUFFLFVBQVU7SUFDckQsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVM7SUFDdEQsY0FBYyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsVUFBVTtDQUNuRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0ICogYXMgZG90ZW52IGZyb20gXCJkb3RlbnZcIjtcbmltcG9ydCAqIGFzIGNoaWxkUHJvY2VzcyBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzLWV4dHJhXCI7XG5pbXBvcnQgcHJldHR5SHJ0aW1lIGZyb20gXCJwcmV0dHktaHJ0aW1lXCI7XG5pbXBvcnQgY2FtZWxDYXNlIGZyb20gXCJjYW1lbGNhc2VcIjtcbmltcG9ydCB7RXhpdEVycm9yfSBmcm9tIFwiLi90eXBlcy9leGl0LWVycm9yXCI7XG5pbXBvcnQge1V0aWxzfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHtKb2JPcHRpb25zfSBmcm9tIFwiLi90eXBlcy9qb2Itb3B0aW9uc1wiO1xuaW1wb3J0IHtXcml0ZVN0cmVhbXN9IGZyb20gXCIuL3R5cGVzL3dyaXRlLXN0cmVhbXNcIjtcbmltcG9ydCB7U2VydmljZX0gZnJvbSBcIi4vc2VydmljZVwiO1xuaW1wb3J0IHtHaXREYXRhfSBmcm9tIFwiLi9naXQtZGF0YVwiO1xuaW1wb3J0IHthc3NlcnR9IGZyb20gXCIuL2Fzc2VydHNcIjtcblxuZXhwb3J0IGNsYXNzIEpvYiB7XG5cbiAgICBzdGF0aWMgcmVhZG9ubHkgaWxsZWdhbEpvYk5hbWVzID0gW1xuICAgICAgICBcImluY2x1ZGVcIiwgXCJsb2NhbF9jb25maWd1cmF0aW9uXCIsIFwiaW1hZ2VcIiwgXCJzZXJ2aWNlc1wiLFxuICAgICAgICBcInN0YWdlc1wiLCBcInBhZ2VzXCIsIFwidHlwZXNcIiwgXCJiZWZvcmVfc2NyaXB0XCIsIFwiZGVmYXVsdFwiLFxuICAgICAgICBcImFmdGVyX3NjcmlwdFwiLCBcInZhcmlhYmxlc1wiLCBcImNhY2hlXCIsIFwid29ya2Zsb3dcIixcbiAgICBdO1xuXG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGpvYk5hbWVQYWQ6IG51bWJlcjtcbiAgICByZWFkb25seSBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdIHwgbnVsbDtcbiAgICByZWFkb25seSBlbnZpcm9ubWVudD86IHsgbmFtZTogc3RyaW5nOyB1cmw6IHN0cmluZyB8IG51bGwgfTtcbiAgICByZWFkb25seSBqb2JJZDogbnVtYmVyO1xuICAgIHJlYWRvbmx5IGN3ZDogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHJ1bGVzPzogeyBpZjogc3RyaW5nOyB3aGVuOiBzdHJpbmc7IGFsbG93X2ZhaWx1cmU6IGJvb2xlYW4gfVtdO1xuICAgIHJlYWRvbmx5IGV4cGFuZGVkVmFyaWFibGVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICAgIHJlYWRvbmx5IGFsbG93RmFpbHVyZTogYm9vbGVhbjtcbiAgICByZWFkb25seSB3aGVuOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgcGlwZWxpbmVJaWQ6IG51bWJlcjtcbiAgICByZWFkb25seSBjYWNoZTogeyBrZXk6IHN0cmluZyB8IHsgZmlsZXM6IHN0cmluZ1tdIH07IHBhdGhzOiBzdHJpbmdbXSB9W107XG4gICAgcmVhZG9ubHkgZ2l0RGF0YTogR2l0RGF0YTtcbiAgICByZWFkb25seSBzaGVsbElzb2xhdGlvbjogYm9vbGVhbjtcblxuICAgIHByaXZhdGUgX3ByZXNjcmlwdHNFeGl0Q29kZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBfYWZ0ZXJTY3JpcHRzRXhpdENvZGUgPSAwO1xuICAgIHByaXZhdGUgX2NvdmVyYWdlUGVyY2VudDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBfcnVubmluZyA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2NvbnRhaW5lcklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIF9zZXJ2aWNlSWRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHByaXZhdGUgX3NlcnZpY2VOZXR3b3JrSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX2FydGlmYWN0c0NvbnRhaW5lcklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIF9jb250YWluZXJWb2x1bWVOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICBwcml2YXRlIF9sb25nUnVubmluZ1NpbGVudFRpbWVvdXQ6IE5vZGVKUy5UaW1lb3V0ID0gLTEgYXMgYW55O1xuICAgIHByaXZhdGUgX3Byb2R1Y2VyczogeyBuYW1lOiBzdHJpbmc7IGRvdGVudjogc3RyaW5nIHwgbnVsbCB9W10gfCBudWxsID0gbnVsbDtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgX25lZWRzOiB7IGpvYjogc3RyaW5nOyBhcnRpZmFjdHM6IHRydWUgfVtdIHwgc3RyaW5nW10gfCBudWxsO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgam9iRGF0YTogYW55O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgd3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXM7XG4gICAgcHJpdmF0ZSByZWFkb25seSBleHRyYUhvc3RzOiBzdHJpbmdbXTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZvbHVtZXM6IHN0cmluZ1tdO1xuXG4gICAgY29uc3RydWN0b3Iob3B0OiBKb2JPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGpvYkRhdGEgPSBvcHQuZGF0YTtcbiAgICAgICAgY29uc3QgZ2l0RGF0YSA9IG9wdC5naXREYXRhO1xuICAgICAgICBjb25zdCBnbG9iYWxzID0gb3B0Lmdsb2JhbHM7XG4gICAgICAgIGNvbnN0IGhvbWVWYXJpYWJsZXMgPSBvcHQuaG9tZVZhcmlhYmxlcztcbiAgICAgICAgY29uc3QgcHJvamVjdFZhcmlhYmxlcyA9IG9wdC5wcm9qZWN0VmFyaWFibGVzO1xuXG4gICAgICAgIHRoaXMuZXh0cmFIb3N0cyA9IG9wdC5leHRyYUhvc3RzO1xuICAgICAgICB0aGlzLnZvbHVtZXMgPSBvcHQudm9sdW1lcztcbiAgICAgICAgdGhpcy53cml0ZVN0cmVhbXMgPSBvcHQud3JpdGVTdHJlYW1zO1xuICAgICAgICB0aGlzLmpvYk5hbWVQYWQgPSBvcHQubmFtZVBhZDtcbiAgICAgICAgdGhpcy5naXREYXRhID0gb3B0LmdpdERhdGE7XG4gICAgICAgIHRoaXMubmFtZSA9IG9wdC5uYW1lO1xuICAgICAgICB0aGlzLmN3ZCA9IG9wdC5jd2Q7XG4gICAgICAgIHRoaXMuam9iSWQgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwKTtcbiAgICAgICAgdGhpcy5qb2JEYXRhID0gb3B0LmRhdGE7XG4gICAgICAgIHRoaXMucGlwZWxpbmVJaWQgPSBvcHQucGlwZWxpbmVJaWQ7XG4gICAgICAgIHRoaXMuc2hlbGxJc29sYXRpb24gPSBvcHQuc2hlbGxJc29sYXRpb247XG5cbiAgICAgICAgdGhpcy53aGVuID0gam9iRGF0YS53aGVuIHx8IFwib25fc3VjY2Vzc1wiO1xuICAgICAgICB0aGlzLmFsbG93RmFpbHVyZSA9IGpvYkRhdGEuYWxsb3dfZmFpbHVyZSA/PyBmYWxzZTtcbiAgICAgICAgdGhpcy5fbmVlZHMgPSBqb2JEYXRhLm5lZWRzIHx8IG51bGw7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gam9iRGF0YS5kZXBlbmRlbmNpZXMgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5ydWxlcyA9IGpvYkRhdGEucnVsZXMgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudCA9IHR5cGVvZiBqb2JEYXRhLmVudmlyb25tZW50ID09PSBcInN0cmluZ1wiID8ge25hbWU6IGpvYkRhdGEuZW52aXJvbm1lbnR9IDogam9iRGF0YS5lbnZpcm9ubWVudDtcbiAgICAgICAgdGhpcy5jYWNoZSA9IGpvYkRhdGEuY2FjaGUgfHwgW107XG5cbiAgICAgICAgbGV0IENJX1BST0pFQ1RfRElSID0gYCR7dGhpcy5jd2R9YDtcbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VOYW1lKSB7XG4gICAgICAgICAgICBDSV9QUk9KRUNUX0RJUiA9IGAvYnVpbGRzLyR7dGhpcy5zYWZlSm9iTmFtZX1gO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2hlbGxJc29sYXRpb24pIHtcbiAgICAgICAgICAgIENJX1BST0pFQ1RfRElSID0gYCR7dGhpcy5jd2R9Ly5naXRsYWItY2ktbG9jYWwvYnVpbGRzLyR7dGhpcy5zYWZlSm9iTmFtZX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJlZGVmaW5lZFZhcmlhYmxlcyA9IHtcbiAgICAgICAgICAgIEdJVExBQl9VU0VSX0xPR0lOOiBnaXREYXRhLnVzZXJbXCJHSVRMQUJfVVNFUl9MT0dJTlwiXSxcbiAgICAgICAgICAgIEdJVExBQl9VU0VSX0VNQUlMOiBnaXREYXRhLnVzZXJbXCJHSVRMQUJfVVNFUl9FTUFJTFwiXSxcbiAgICAgICAgICAgIEdJVExBQl9VU0VSX05BTUU6IGdpdERhdGEudXNlcltcIkdJVExBQl9VU0VSX05BTUVcIl0sXG4gICAgICAgICAgICBHSVRMQUJfVVNFUl9JRDogZ2l0RGF0YS51c2VyW1wiR0lUTEFCX1VTRVJfSURcIl0sXG4gICAgICAgICAgICBDSV9DT01NSVRfU0hPUlRfU0hBOiBnaXREYXRhLmNvbW1pdC5TSE9SVF9TSEEsIC8vIENoYW5nZXNcbiAgICAgICAgICAgIENJX0NPTU1JVF9TSEE6IGdpdERhdGEuY29tbWl0LlNIQSxcbiAgICAgICAgICAgIENJX1BST0pFQ1RfRElSLFxuICAgICAgICAgICAgQ0lfUFJPSkVDVF9OQU1FOiBnaXREYXRhLnJlbW90ZS5wcm9qZWN0LFxuICAgICAgICAgICAgQ0lfUFJPSkVDVF9USVRMRTogYCR7Y2FtZWxDYXNlKGdpdERhdGEucmVtb3RlLnByb2plY3QpfWAsXG4gICAgICAgICAgICBDSV9QUk9KRUNUX1BBVEg6IGdpdERhdGEuQ0lfUFJPSkVDVF9QQVRILFxuICAgICAgICAgICAgQ0lfUFJPSkVDVF9QQVRIX1NMVUc6IGdpdERhdGEuQ0lfUFJPSkVDVF9QQVRIX1NMVUcsXG4gICAgICAgICAgICBDSV9QUk9KRUNUX05BTUVTUEFDRTogYCR7Z2l0RGF0YS5yZW1vdGUuZ3JvdXB9YCxcbiAgICAgICAgICAgIENJX1BST0pFQ1RfVklTSUJJTElUWTogXCJpbnRlcm5hbFwiLFxuICAgICAgICAgICAgQ0lfUFJPSkVDVF9JRDogXCIxMjE3XCIsXG4gICAgICAgICAgICBDSV9DT01NSVRfUkVGX1BST1RFQ1RFRDogXCJmYWxzZVwiLFxuICAgICAgICAgICAgQ0lfQ09NTUlUX0JSQU5DSDogZ2l0RGF0YS5jb21taXQuUkVGX05BTUUsIC8vIE5vdCBhdmFpbGFibGUgaW4gbWVyZ2UgcmVxdWVzdCBvciB0YWcgcGlwZWxpbmVzXG4gICAgICAgICAgICBDSV9DT01NSVRfUkVGX05BTUU6IGdpdERhdGEuY29tbWl0LlJFRl9OQU1FLCAvLyBUYWcgb3IgYnJhbmNoIG5hbWVcbiAgICAgICAgICAgIENJX0NPTU1JVF9SRUZfU0xVRzogZ2l0RGF0YS5jb21taXQuUkVGX05BTUUucmVwbGFjZSgvW15hLXowLTldKy9pZywgXCItXCIpLnJlcGxhY2UoL14tLywgXCJcIikucmVwbGFjZSgvLSQvLCBcIlwiKS5zbGljZSgwLCA2MykudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgIENJX0NPTU1JVF9USVRMRTogXCJDb21taXQgVGl0bGVcIiwgLy8gRmlyc3QgbGluZSBvZiBjb21taXQgbWVzc2FnZS5cbiAgICAgICAgICAgIENJX0NPTU1JVF9NRVNTQUdFOiBcIkNvbW1pdCBUaXRsZVxcbk1vcmUgY29tbWl0IHRleHRcIiwgLy8gRnVsbCBjb21taXQgbWVzc2FnZVxuICAgICAgICAgICAgQ0lfQ09NTUlUX0RFU0NSSVBUSU9OOiBcIk1vcmUgY29tbWl0IHRleHRcIixcbiAgICAgICAgICAgIENJX1BJUEVMSU5FX1NPVVJDRTogXCJwdXNoXCIsXG4gICAgICAgICAgICBDSV9KT0JfSUQ6IGAke3RoaXMuam9iSWR9YCxcbiAgICAgICAgICAgIENJX1BJUEVMSU5FX0lEOiBgJHt0aGlzLnBpcGVsaW5lSWlkICsgMTAwMH1gLFxuICAgICAgICAgICAgQ0lfUElQRUxJTkVfSUlEOiBgJHt0aGlzLnBpcGVsaW5lSWlkfWAsXG4gICAgICAgICAgICBDSV9TRVJWRVJfSE9TVDogYCR7Z2l0RGF0YS5yZW1vdGUuaG9zdH1gLFxuICAgICAgICAgICAgQ0lfU0VSVkVSX1BPUlQ6IGAke2dpdERhdGEucmVtb3RlLnBvcnR9YCxcbiAgICAgICAgICAgIENJX1NFUlZFUl9VUkw6IGBodHRwczovLyR7Z2l0RGF0YS5yZW1vdGUuaG9zdH06NDQzYCxcbiAgICAgICAgICAgIENJX1NFUlZFUl9QUk9UT0NPTDogXCJodHRwc1wiLFxuICAgICAgICAgICAgQ0lfQVBJX1Y0X1VSTDogYGh0dHBzOi8vJHtnaXREYXRhLnJlbW90ZS5ob3N0fS9hcGkvdjRgLFxuICAgICAgICAgICAgQ0lfUFJPSkVDVF9VUkw6IGBodHRwczovLyR7Z2l0RGF0YS5yZW1vdGUuaG9zdH0vJHtnaXREYXRhLnJlbW90ZS5ncm91cH0vJHtnaXREYXRhLnJlbW90ZS5wcm9qZWN0fWAsXG4gICAgICAgICAgICBDSV9KT0JfVVJMOiBgaHR0cHM6Ly8ke2dpdERhdGEucmVtb3RlLmhvc3R9LyR7Z2l0RGF0YS5yZW1vdGUuZ3JvdXB9LyR7Z2l0RGF0YS5yZW1vdGUucHJvamVjdH0vLS9qb2JzLyR7dGhpcy5qb2JJZH1gLCAvLyBDaGFuZ2VzIG9uIHJlcnVuLlxuICAgICAgICAgICAgQ0lfUElQRUxJTkVfVVJMOiBgaHR0cHM6Ly8ke2dpdERhdGEucmVtb3RlLmhvc3R9LyR7Z2l0RGF0YS5yZW1vdGUuZ3JvdXB9LyR7Z2l0RGF0YS5yZW1vdGUucHJvamVjdH0vcGlwZWxpbmVzLyR7dGhpcy5waXBlbGluZUlpZH1gLFxuICAgICAgICAgICAgQ0lfSk9CX05BTUU6IGAke3RoaXMubmFtZX1gLFxuICAgICAgICAgICAgQ0lfSk9CX1NUQUdFOiBgJHt0aGlzLnN0YWdlfWAsXG4gICAgICAgICAgICBDSV9SRUdJU1RSWTogZ2l0RGF0YS5DSV9SRUdJU1RSWSxcbiAgICAgICAgICAgIENJX1JFR0lTVFJZX0lNQUdFOiBnaXREYXRhLkNJX1JFR0lTVFJZX0lNQUdFLFxuICAgICAgICAgICAgR0lUTEFCX0NJOiBcImZhbHNlXCIsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gQ3JlYXRlIGV4cGFuZGVkIHZhcmlhYmxlc1xuICAgICAgICBjb25zdCBlbnZzID0gey4uLnByZWRlZmluZWRWYXJpYWJsZXMsIC4uLmdsb2JhbHMudmFyaWFibGVzIHx8IHt9LCAuLi5qb2JEYXRhLnZhcmlhYmxlcyB8fCB7fSwgLi4uaG9tZVZhcmlhYmxlcywgLi4ucHJvamVjdFZhcmlhYmxlc307XG4gICAgICAgIGNvbnN0IGV4cGFuZGVkR2xvYmFsVmFyaWFibGVzID0gVXRpbHMuZXhwYW5kVmFyaWFibGVzKGdsb2JhbHMudmFyaWFibGVzIHx8IHt9LCBlbnZzKTtcbiAgICAgICAgY29uc3QgZXhwYW5kZWRKb2JWYXJpYWJsZXMgPSBVdGlscy5leHBhbmRWYXJpYWJsZXMoam9iRGF0YS52YXJpYWJsZXMgfHwge30sIGVudnMpO1xuICAgICAgICB0aGlzLmV4cGFuZGVkVmFyaWFibGVzID0gey4uLnByZWRlZmluZWRWYXJpYWJsZXMsIC4uLmV4cGFuZGVkR2xvYmFsVmFyaWFibGVzLCAuLi5leHBhbmRlZEpvYlZhcmlhYmxlcywgLi4uaG9tZVZhcmlhYmxlcywgLi4ucHJvamVjdFZhcmlhYmxlc307XG5cbiAgICAgICAgLy8gU2V0IHt3aGVuLCBhbGxvd0ZhaWx1cmV9IGJhc2VkIG9uIHJ1bGVzIHJlc3VsdFxuICAgICAgICBpZiAodGhpcy5ydWxlcykge1xuICAgICAgICAgICAgY29uc3QgcnVsZVJlc3VsdCA9IFV0aWxzLmdldFJ1bGVzUmVzdWx0KHRoaXMucnVsZXMsIHRoaXMuZXhwYW5kZWRWYXJpYWJsZXMpO1xuICAgICAgICAgICAgdGhpcy53aGVuID0gcnVsZVJlc3VsdC53aGVuO1xuICAgICAgICAgICAgdGhpcy5hbGxvd0ZhaWx1cmUgPSBydWxlUmVzdWx0LmFsbG93RmFpbHVyZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmludGVyYWN0aXZlICYmICh0aGlzLndoZW4gIT09IFwibWFudWFsXCIgfHwgdGhpcy5pbWFnZU5hbWUgIT09IG51bGwpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXhpdEVycm9yKGAke3RoaXMuY2hhbGtKb2JOYW1lfSBASW50ZXJhY3RpdmUgZGVjb3JhdG9yIGNhbm5vdCBoYXZlIGltYWdlOiBhbmQgbXVzdCBiZSB3aGVuOm1hbnVhbGApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW5qZWN0U1NIQWdlbnQgJiYgdGhpcy5pbWFnZU5hbWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFeGl0RXJyb3IoYCR7dGhpcy5jaGFsa0pvYk5hbWV9IEBJbmplY3RTU0hBZ2VudCBjYW4gb25seSBiZSB1c2VkIHdpdGggaW1hZ2U6YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgZ2V0VW5pcXVlQ2FjaGVOYW1lKGN3ZDogc3RyaW5nLCBjYWNoZUVudHJ5OiB7IGtleTogc3RyaW5nIHwgeyBmaWxlczogc3RyaW5nW10gfTsgcGF0aHM6IHN0cmluZ1tdIH0sIGV4cGFuZGVkVmFyaWFibGVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2FjaGVFbnRyeS5rZXkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBVdGlscy5leHBhbmRUZXh0KGNhY2hlRW50cnkua2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJtZC1cIiArIGF3YWl0IFV0aWxzLmNoZWNrc3VtRmlsZXMoY2FjaGVFbnRyeS5rZXkuZmlsZXMubWFwKGYgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAke2N3ZH0vJHtVdGlscy5leHBhbmRUZXh0KGYsIGV4cGFuZGVkVmFyaWFibGVzKX1gO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgZ2V0IGFydGlmYWN0c1RvU291cmNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2JEYXRhW1wiYXJ0aWZhY3RzVG9Tb3VyY2VcIl0gPT0gbnVsbCA/IHRydWUgOiB0aGlzLmpvYkRhdGFbXCJhcnRpZmFjdHNUb1NvdXJjZVwiXTtcbiAgICB9XG5cbiAgICBnZXQgY2hhbGtKb2JOYW1lKCkge1xuICAgICAgICByZXR1cm4gY2hhbGtge2JsdWVCcmlnaHQgJHt0aGlzLm5hbWUucGFkRW5kKHRoaXMuam9iTmFtZVBhZCl9fWA7XG4gICAgfVxuXG4gICAgZ2V0IHNhZmVKb2JOYW1lKCkge1xuICAgICAgICByZXR1cm4gVXRpbHMuZ2V0U2FmZUpvYk5hbWUodGhpcy5uYW1lKTtcbiAgICB9XG5cbiAgICBnZXQgbmVlZHMoKToge2pvYjogc3RyaW5nOyBhcnRpZmFjdHM6IGJvb2xlYW59W10gfCBudWxsIHtcbiAgICAgICAgaWYgKCF0aGlzLl9uZWVkcykgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGxpc3Q6IHtqb2I6IHN0cmluZzsgYXJ0aWZhY3RzOiBib29sZWFufVtdID0gW107XG4gICAgICAgIHRoaXMuX25lZWRzPy5mb3JFYWNoKChuZWVkKSA9PiB7XG4gICAgICAgICAgICBsaXN0LnB1c2goe1xuICAgICAgICAgICAgICAgIGpvYjogdHlwZW9mIG5lZWQgPT09IFwic3RyaW5nXCIgPyBuZWVkIDogbmVlZC5qb2IsXG4gICAgICAgICAgICAgICAgYXJ0aWZhY3RzOiB0eXBlb2YgbmVlZCA9PT0gXCJzdHJpbmdcIiA/IHRydWUgOiBuZWVkLmFydGlmYWN0cyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuXG5cbiAgICBnZXQgaW1hZ2VOYW1lKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBjb25zdCBpbWFnZSA9IHRoaXMuam9iRGF0YVtcImltYWdlXCJdO1xuICAgICAgICBpZiAoIWltYWdlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGltYWdlTmFtZSA9IFV0aWxzLmV4cGFuZFRleHQoaW1hZ2UubmFtZSwgdGhpcy5leHBhbmRlZFZhcmlhYmxlcyk7XG4gICAgICAgIHJldHVybiBpbWFnZU5hbWUuaW5jbHVkZXMoXCI6XCIpID8gaW1hZ2VOYW1lIDogYCR7aW1hZ2VOYW1lfTpsYXRlc3RgO1xuICAgIH1cblxuICAgIGdldCBpbWFnZUVudHJ5cG9pbnQoKTogc3RyaW5nW10gfCBudWxsIHtcbiAgICAgICAgY29uc3QgaW1hZ2UgPSB0aGlzLmpvYkRhdGFbXCJpbWFnZVwiXTtcblxuICAgICAgICBpZiAoIWltYWdlIHx8ICFpbWFnZS5lbnRyeXBvaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGltYWdlLmVudHJ5cG9pbnQgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFeGl0RXJyb3IoXCJpbWFnZTplbnRyeXBvaW50IG11c3QgYmUgYW4gYXJyYXlcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGltYWdlLmVudHJ5cG9pbnQ7XG4gICAgfVxuXG4gICAgZ2V0IHNlcnZpY2VzKCk6IFNlcnZpY2VbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmpvYkRhdGFbXCJzZXJ2aWNlc1wiXTtcbiAgICB9XG5cbiAgICBnZXQgcHJvZHVjZXJzKCk6IHsgbmFtZTogc3RyaW5nOyBkb3RlbnY6IHN0cmluZyB8IG51bGwgfVtdIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9kdWNlcnM7XG4gICAgfVxuXG4gICAgc2V0IHByb2R1Y2Vycyhwcm9kdWNlcnM6IHsgbmFtZTogc3RyaW5nOyBkb3RlbnY6IHN0cmluZyB8IG51bGwgfVtdIHwgbnVsbCkge1xuICAgICAgICBhc3NlcnQodGhpcy5fcHJvZHVjZXJzID09IG51bGwsIFwidGhpcy5fcHJvZHVjZXJzIGNhbiBvbmx5IGJlIHNldCBvbmNlXCIpO1xuICAgICAgICB0aGlzLl9wcm9kdWNlcnMgPSBwcm9kdWNlcnM7XG4gICAgfVxuXG4gICAgZ2V0IHN0YWdlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmpvYkRhdGFbXCJzdGFnZVwiXSB8fCBcInRlc3RcIjtcbiAgICB9XG5cbiAgICBnZXQgaW50ZXJhY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmpvYkRhdGFbXCJpbnRlcmFjdGl2ZVwiXSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXQgaW5qZWN0U1NIQWdlbnQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmpvYkRhdGFbXCJpbmplY3RTU0hBZ2VudFwiXSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam9iRGF0YVtcImRlc2NyaXB0aW9uXCJdID8/IFwiXCI7XG4gICAgfVxuXG4gICAgZ2V0IGFydGlmYWN0cygpOiB7IHBhdGhzPzogc3RyaW5nW107IGV4Y2x1ZGU/OiBzdHJpbmdbXTsgcmVwb3J0cz86IHsgZG90ZW52Pzogc3RyaW5nIH0gfXxudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam9iRGF0YVtcImFydGlmYWN0c1wiXTtcbiAgICB9XG5cbiAgICBnZXQgYmVmb3JlU2NyaXB0cygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmpvYkRhdGFbXCJiZWZvcmVfc2NyaXB0XCJdIHx8IFtdO1xuICAgIH1cblxuICAgIGdldCBhZnRlclNjcmlwdHMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2JEYXRhW1wiYWZ0ZXJfc2NyaXB0XCJdIHx8IFtdO1xuICAgIH1cblxuICAgIGdldCBzY3JpcHRzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam9iRGF0YVtcInNjcmlwdFwiXTtcbiAgICB9XG5cbiAgICBnZXQgcHJlU2NyaXB0c0V4aXRDb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJlc2NyaXB0c0V4aXRDb2RlO1xuICAgIH1cblxuICAgIGdldCBhZnRlclNjcmlwdHNFeGl0Q29kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FmdGVyU2NyaXB0c0V4aXRDb2RlO1xuICAgIH1cblxuICAgIGdldCBydW5uaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVubmluZztcbiAgICB9XG5cbiAgICBnZXQgc3RhcnRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bm5pbmcgfHwgdGhpcy5fcHJlc2NyaXB0c0V4aXRDb2RlICE9PSBudWxsO1xuICAgIH1cblxuICAgIGdldCBmaW5pc2hlZCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9ydW5uaW5nICYmIHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZSAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgY292ZXJhZ2VQZXJjZW50KCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fY292ZXJhZ2VQZXJjZW50O1xuICAgIH1cblxuICAgIGFzeW5jIHN0YXJ0KHByaXZpbGVnZWQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcbiAgICAgICAgY29uc3Qgd3JpdGVTdHJlYW1zID0gdGhpcy53cml0ZVN0cmVhbXM7XG4gICAgICAgIGNvbnN0IHNhZmVKb2JuYW1lID0gdGhpcy5zYWZlSm9iTmFtZTtcblxuICAgICAgICB0aGlzLl9ydW5uaW5nID0gdHJ1ZTtcblxuICAgICAgICBhd2FpdCBmcy5lbnN1cmVGaWxlKGAke3RoaXMuY3dkfS8uZ2l0bGFiLWNpLWxvY2FsL291dHB1dC8ke3NhZmVKb2JuYW1lfS5sb2dgKTtcbiAgICAgICAgYXdhaXQgZnMudHJ1bmNhdGUoYCR7dGhpcy5jd2R9Ly5naXRsYWItY2ktbG9jYWwvb3V0cHV0LyR7c2FmZUpvYm5hbWV9LmxvZ2ApO1xuXG4gICAgICAgIGlmICghdGhpcy5pbnRlcmFjdGl2ZSkge1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuY2hhbGtKb2JOYW1lfSB7bWFnZW50YUJyaWdodCBzdGFydGluZ30gJHt0aGlzLmltYWdlTmFtZSA/PyBcInNoZWxsXCJ9ICh7eWVsbG93ICR7dGhpcy5zdGFnZX19KVxcbmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJlc2NyaXB0cyA9IHRoaXMuYmVmb3JlU2NyaXB0cy5jb25jYXQodGhpcy5zY3JpcHRzKTtcbiAgICAgICAgdGhpcy5fcHJlc2NyaXB0c0V4aXRDb2RlID0gYXdhaXQgdGhpcy5leGVjU2NyaXB0cyhwcmVzY3JpcHRzLCBwcml2aWxlZ2VkKTtcbiAgICAgICAgaWYgKHRoaXMuYWZ0ZXJTY3JpcHRzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLl9wcmVzY3JpcHRzRXhpdENvZGUgPiAwICYmICF0aGlzLmFsbG93RmFpbHVyZSkge1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZGVycihgJHt0aGlzLmdldEV4aXRlZFN0cmluZyhzdGFydFRpbWUsIHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZSwgZmFsc2UpfVxcbmApO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jbGVhbnVwUmVzb3VyY2VzKCk7XG4gICAgICAgICAgICB0aGlzLl9ydW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hZnRlclNjcmlwdHMubGVuZ3RoID09PSAwICYmIHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZSA+IDAgJiYgdGhpcy5hbGxvd0ZhaWx1cmUpIHtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRlcnIoYCR7dGhpcy5nZXRFeGl0ZWRTdHJpbmcoc3RhcnRUaW1lLCB0aGlzLl9wcmVzY3JpcHRzRXhpdENvZGUsIHRydWUpfVxcbmApO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jbGVhbnVwUmVzb3VyY2VzKCk7XG4gICAgICAgICAgICB0aGlzLl9ydW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fcHJlc2NyaXB0c0V4aXRDb2RlID4gMCAmJiB0aGlzLmFsbG93RmFpbHVyZSkge1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZGVycihgJHt0aGlzLmdldEV4aXRlZFN0cmluZyhzdGFydFRpbWUsIHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZSwgdHJ1ZSl9XFxuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fcHJlc2NyaXB0c0V4aXRDb2RlID4gMCAmJiAhdGhpcy5hbGxvd0ZhaWx1cmUpIHtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRlcnIoYCR7dGhpcy5nZXRFeGl0ZWRTdHJpbmcoc3RhcnRUaW1lLCB0aGlzLl9wcmVzY3JpcHRzRXhpdENvZGUsIGZhbHNlKX1cXG5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFmdGVyU2NyaXB0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9hZnRlclNjcmlwdHNFeGl0Q29kZSA9IGF3YWl0IHRoaXMuZXhlY1NjcmlwdHModGhpcy5hZnRlclNjcmlwdHMsIHByaXZpbGVnZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2FmdGVyU2NyaXB0c0V4aXRDb2RlID4gMCkge1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZGVycihgJHt0aGlzLmdldEV4aXRlZFN0cmluZyhzdGFydFRpbWUsIHRoaXMuX2FmdGVyU2NyaXB0c0V4aXRDb2RlLCB0cnVlLCBcIiBhZnRlcl9zY3JpcHRcIil9XFxuYCk7XG4gICAgICAgIH1cblxuICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGAke3RoaXMuZ2V0RmluaXNoZWRTdHJpbmcoc3RhcnRUaW1lKX1cXG5gKTtcblxuICAgICAgICBpZiAodGhpcy5qb2JEYXRhLmNvdmVyYWdlKSB7XG4gICAgICAgICAgICB0aGlzLl9jb3ZlcmFnZVBlcmNlbnQgPSBhd2FpdCBVdGlscy5nZXRDb3ZlcmFnZVBlcmNlbnQodGhpcy5jd2QsIHRoaXMuam9iRGF0YS5jb3ZlcmFnZSwgc2FmZUpvYm5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5jbGVhbnVwUmVzb3VyY2VzKCk7XG4gICAgICAgIHRoaXMuX3J1bm5pbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBhc3luYyBjbGVhbnVwUmVzb3VyY2VzKCkge1xuICAgICAgICBjb25zdCB3cml0ZVN0cmVhbXMgPSB0aGlzLndyaXRlU3RyZWFtcztcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2xvbmdSdW5uaW5nU2lsZW50VGltZW91dCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbnRhaW5lcklkKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKGBkb2NrZXIgcm0gLWYgJHt0aGlzLl9jb250YWluZXJJZH1gKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBhc3NlcnQoZSBpbnN0YW5jZW9mIEVycm9yLCBcImUgaXMgbm90IGluc3RhbmNlb2YgRXJyb3JcIik7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZGVycihjaGFsa2B7eWVsbG93ICR7ZS5tZXNzYWdlfX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9zZXJ2aWNlSWRzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc2VydmljZUlkIG9mIHRoaXMuX3NlcnZpY2VJZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oYGRvY2tlciBybSAtZiAke3NlcnZpY2VJZH1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGUgaW5zdGFuY2VvZiBFcnJvciwgXCJlIGlzIG5vdCBpbnN0YW5jZW9mIEVycm9yXCIpO1xuICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRlcnIoY2hhbGtge3llbGxvdyAke2UubWVzc2FnZX19YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fc2VydmljZU5ldHdvcmtJZCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihgZG9ja2VyIG5ldHdvcmsgcm0gJHt0aGlzLl9zZXJ2aWNlTmV0d29ya0lkfWApO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGFzc2VydChlIGluc3RhbmNlb2YgRXJyb3IsIFwiZSBpcyBub3QgaW5zdGFuY2VvZiBFcnJvclwiKTtcbiAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3RkZXJyKGNoYWxrYHt5ZWxsb3cgJHtlLm1lc3NhZ2V9fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2FydGlmYWN0c0NvbnRhaW5lcklkKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKGBkb2NrZXIgcm0gLWYgJHt0aGlzLl9hcnRpZmFjdHNDb250YWluZXJJZH1gKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBhc3NlcnQoZSBpbnN0YW5jZW9mIEVycm9yLCBcImUgaXMgbm90IGluc3RhbmNlb2YgRXJyb3JcIik7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZGVycihjaGFsa2B7eWVsbG93ICR7ZS5tZXNzYWdlfX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9jb250YWluZXJWb2x1bWVOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29udGFpbmVyVm9sdW1lIG9mIHRoaXMuX2NvbnRhaW5lclZvbHVtZU5hbWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKGBkb2NrZXIgdm9sdW1lIHJtICR7Y29udGFpbmVyVm9sdW1lfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBhc3NlcnQoZSBpbnN0YW5jZW9mIEVycm9yLCBcImUgaXMgbm90IGluc3RhbmNlb2YgRXJyb3JcIik7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZGVycihjaGFsa2B7eWVsbG93ICR7ZS5tZXNzYWdlfX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2VuZXJhdGVJbmplY3RTU0hBZ2VudE9wdGlvbnMoKSB7XG4gICAgICAgIGlmICghdGhpcy5pbmplY3RTU0hBZ2VudCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09IFwiZGFyd2luXCIgfHwgKHByb2Nlc3MuZW52Lk9TVFlQRT8ubWF0Y2goL15kYXJ3aW4vKSA/PyBudWxsKSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiLS1lbnYgU1NIX0FVVEhfU09DSz0vcnVuL2hvc3Qtc2VydmljZXMvc3NoLWF1dGguc29jayAtdiAvcnVuL2hvc3Qtc2VydmljZXMvc3NoLWF1dGguc29jazovcnVuL2hvc3Qtc2VydmljZXMvc3NoLWF1dGguc29ja1wiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgLS1lbnYgU1NIX0FVVEhfU09DSz0ke3Byb2Nlc3MuZW52LlNTSF9BVVRIX1NPQ0t9IC12ICR7cHJvY2Vzcy5lbnYuU1NIX0FVVEhfU09DS306JHtwcm9jZXNzLmVudi5TU0hfQVVUSF9TT0NLfWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZVNjcmlwdENvbW1hbmRzKHNjcmlwdHM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGxldCBjbWQgPSBcIlwiO1xuICAgICAgICBzY3JpcHRzLmZvckVhY2goKHNjcmlwdCkgPT4ge1xuICAgICAgICAgICAgLy8gUHJpbnQgY29tbWFuZCBlY2hvJ2VkIGluIGNvbG9yXG4gICAgICAgICAgICBjb25zdCBzcGxpdCA9IHNjcmlwdC5zcGxpdCgvXFxyP1xcbi8pO1xuICAgICAgICAgICAgY29uc3QgbXVsdGlsaW5lVGV4dCA9IHNwbGl0Lmxlbmd0aCA+IDEgPyBcIiAjIGNvbGxhcHNlZCBtdWx0aS1saW5lIGNvbW1hbmRcIiA6IFwiXCI7XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gc3BsaXRbMF0/LnJlcGxhY2UoL1tcXFxcXS9nLCBcIlxcXFxcXFxcXCIpLnJlcGxhY2UoL1tcIl0vZywgXCJcXFxcXFxcIlwiKS5yZXBsYWNlKC9bJF0vZywgXCJcXFxcJFwiKTtcbiAgICAgICAgICAgIGNtZCArPSBjaGFsa2BlY2hvIFwie2dyZWVuICQgJHt0ZXh0fSR7bXVsdGlsaW5lVGV4dH19XCJcXG5gO1xuXG4gICAgICAgICAgICAvLyBFeGVjdXRlIGFjdHVhbCBzY3JpcHRcbiAgICAgICAgICAgIGNtZCArPSBgJHtzY3JpcHR9XFxuYDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjbWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBleGVjU2NyaXB0cyhzY3JpcHRzOiBzdHJpbmdbXSwgcHJpdmlsZWdlZDogYm9vbGVhbik6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIGNvbnN0IHNhZmVKb2JOYW1lID0gdGhpcy5zYWZlSm9iTmFtZTtcbiAgICAgICAgY29uc3Qgb3V0cHV0RmlsZXNQYXRoID0gYCR7dGhpcy5jd2R9Ly5naXRsYWItY2ktbG9jYWwvb3V0cHV0LyR7c2FmZUpvYk5hbWV9LmxvZ2A7XG4gICAgICAgIGNvbnN0IGJ1aWxkVm9sdW1lTmFtZSA9IGBnY2wtJHt0aGlzLnNhZmVKb2JOYW1lfS0ke3RoaXMuam9iSWR9LWJ1aWxkYDtcbiAgICAgICAgY29uc3QgdG1wVm9sdW1lTmFtZSA9IGBnY2wtJHt0aGlzLnNhZmVKb2JOYW1lfS0ke3RoaXMuam9iSWR9LXRtcGA7XG4gICAgICAgIGNvbnN0IHdyaXRlU3RyZWFtcyA9IHRoaXMud3JpdGVTdHJlYW1zO1xuICAgICAgICBjb25zdCByZXBvcnRzRG90ZW52VmFyaWFibGVzID0gYXdhaXQgdGhpcy5pbml0UHJvZHVjZXJSZXBvcnRzRG90ZW52VmFyaWFibGVzKHdyaXRlU3RyZWFtcyk7XG4gICAgICAgIGxldCB0aW1lO1xuICAgICAgICBsZXQgZW5kVGltZTtcblxuICAgICAgICBpZiAoc2NyaXB0cy5sZW5ndGggPT09IDAgfHwgc2NyaXB0c1swXSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvcHkgZ2l0IHRyYWNrZWQgZmlsZXMgdG8gYnVpbGQgZm9sZGVyIGlmIHNoZWxsIGlzb2xhdGlvbiBlbmFibGVkLlxuICAgICAgICBpZiAoIXRoaXMuaW1hZ2VOYW1lICYmIHRoaXMuc2hlbGxJc29sYXRpb24pIHtcbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLnJzeW5jVHJhY2tlZEZpbGVzKHRoaXMuY3dkLCBgJHtzYWZlSm9iTmFtZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmludGVyYWN0aXZlKSB7XG4gICAgICAgICAgICBjb25zdCBpQ21kID0gdGhpcy5nZW5lcmF0ZVNjcmlwdENvbW1hbmRzKHNjcmlwdHMpO1xuICAgICAgICAgICAgY29uc3QgaW50ZXJhY3RpdmVDcCA9IGNoaWxkUHJvY2Vzcy5zcGF3bihpQ21kLCB7XG4gICAgICAgICAgICAgICAgc2hlbGw6IFwiYmFzaFwiLFxuICAgICAgICAgICAgICAgIHN0ZGlvOiBbXCJpbmhlcml0XCIsIFwiaW5oZXJpdFwiLCBcImluaGVyaXRcIl0sXG4gICAgICAgICAgICAgICAgY3dkOiB0aGlzLmN3ZCxcbiAgICAgICAgICAgICAgICBlbnY6IHsuLi50aGlzLmV4cGFuZGVkVmFyaWFibGVzLCAuLi5wcm9jZXNzLmVudn0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxudW1iZXI+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBpbnRlcmFjdGl2ZUNwLm9uKFwiZXhpdFwiLCAoY29kZSkgPT4gcmVzb2x2ZShjb2RlID8/IDApKTtcbiAgICAgICAgICAgICAgICBpbnRlcmFjdGl2ZUNwLm9uKFwiZXJyb3JcIiwgKGVycikgPT4gcmVqZWN0KGVycikpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlZnJlc2hMb25nUnVubmluZ1NpbGVudFRpbWVvdXQod3JpdGVTdHJlYW1zKTtcblxuICAgICAgICBpZiAodGhpcy5pbWFnZU5hbWUpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHVsbEltYWdlKHdyaXRlU3RyZWFtcywgdGhpcy5pbWFnZU5hbWUpO1xuXG4gICAgICAgICAgICBsZXQgZG9ja2VyQ21kID0gXCJcIjtcbiAgICAgICAgICAgIGlmIChwcml2aWxlZ2VkKSB7XG4gICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IGBkb2NrZXIgY3JlYXRlIC0tcHJpdmlsZWdlZCAtdSAwOjAgLWkgJHt0aGlzLmdlbmVyYXRlSW5qZWN0U1NIQWdlbnRPcHRpb25zKCl9IGA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRvY2tlckNtZCArPSBgZG9ja2VyIGNyZWF0ZSAtdSAwOjAgLWkgJHt0aGlzLmdlbmVyYXRlSW5qZWN0U1NIQWdlbnRPcHRpb25zKCl9IGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5zZXJ2aWNlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVEb2NrZXJOZXR3b3JrKGBnaXRsYWItY2ktbG9jYWwtJHt0aGlzLmpvYklkfWApO1xuICAgICAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLS1uZXR3b3JrIGdpdGxhYi1jaS1sb2NhbC0ke3RoaXMuam9iSWR9IGA7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzZXJ2aWNlIG9mIHRoaXMuc2VydmljZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wdWxsSW1hZ2Uod3JpdGVTdHJlYW1zLCBzZXJ2aWNlLmdldE5hbWUodGhpcy5leHBhbmRlZFZhcmlhYmxlcykpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN0YXJ0U2VydmljZSh3cml0ZVN0cmVhbXMsIHNlcnZpY2UsIHByaXZpbGVnZWQpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNlcnZpY2VIZWFsdGhDaGVjayh3cml0ZVN0cmVhbXMsIHNlcnZpY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgdm9sdW1lUHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICAgIHZvbHVtZVByb21pc2VzLnB1c2goVXRpbHMuc3Bhd24oYGRvY2tlciB2b2x1bWUgY3JlYXRlICR7YnVpbGRWb2x1bWVOYW1lfWAsIHRoaXMuY3dkKSk7XG4gICAgICAgICAgICB2b2x1bWVQcm9taXNlcy5wdXNoKFV0aWxzLnNwYXduKGBkb2NrZXIgdm9sdW1lIGNyZWF0ZSAke3RtcFZvbHVtZU5hbWV9YCwgdGhpcy5jd2QpKTtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLS12b2x1bWUgJHtidWlsZFZvbHVtZU5hbWV9Oi9idWlsZHMvJHtzYWZlSm9iTmFtZX0gYDtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLS12b2x1bWUgJHt0bXBWb2x1bWVOYW1lfTovdG1wLyBgO1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyVm9sdW1lTmFtZXMucHVzaChidWlsZFZvbHVtZU5hbWUpO1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyVm9sdW1lTmFtZXMucHVzaCh0bXBWb2x1bWVOYW1lKTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHZvbHVtZVByb21pc2VzKTtcblxuICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtLXdvcmtkaXIgL2J1aWxkcy8ke3NhZmVKb2JOYW1lfSBgO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHZvbHVtZSBvZiB0aGlzLnZvbHVtZXMpIHtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tdm9sdW1lICR7dm9sdW1lfSBgO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGV4dHJhSG9zdCBvZiB0aGlzLmV4dHJhSG9zdHMpIHtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tYWRkLWhvc3Q9JHtleHRyYUhvc3R9IGA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmltYWdlRW50cnlwb2ludCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW1hZ2VFbnRyeXBvaW50LmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtLWVudHJ5cG9pbnQgXCIke2V9XCIgYDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5leHBhbmRlZFZhcmlhYmxlcykpIHtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC1lICR7a2V5fT0nJHtTdHJpbmcodmFsdWUpLnRyaW0oKX0nIGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZXBvcnRzRG90ZW52VmFyaWFibGVzKSkge1xuICAgICAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLWUgJHtrZXl9PScke1N0cmluZyh2YWx1ZSkudHJpbSgpfScgYDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZG9ja2VyQ21kICs9IGF3YWl0IHRoaXMuY3JlYXRlQ2FjaGVEb2NrZXJWb2x1bWVNb3VudHMoc2FmZUpvYk5hbWUsIHdyaXRlU3RyZWFtcyk7XG5cbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBgJHt0aGlzLmltYWdlTmFtZX0gc2ggLWMgXCJcXG5gO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiaWYgWyAteCAvdXNyL2xvY2FsL2Jpbi9iYXNoIF07IHRoZW5cXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIlxcdGV4ZWMgL3Vzci9sb2NhbC9iaW4vYmFzaCBcXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcImVsaWYgWyAteCAvdXNyL2Jpbi9iYXNoIF07IHRoZW5cXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIlxcdGV4ZWMgL3Vzci9iaW4vYmFzaCBcXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcImVsaWYgWyAteCAvYmluL2Jhc2ggXTsgdGhlblxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiXFx0ZXhlYyAvYmluL2Jhc2ggXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJlbGlmIFsgLXggL3Vzci9sb2NhbC9iaW4vc2ggXTsgdGhlblxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiXFx0ZXhlYyAvdXNyL2xvY2FsL2Jpbi9zaCBcXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcImVsaWYgWyAteCAvdXNyL2Jpbi9zaCBdOyB0aGVuXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJcXHRleGVjIC91c3IvYmluL3NoIFxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiZWxpZiBbIC14IC9iaW4vc2ggXTsgdGhlblxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiXFx0ZXhlYyAvYmluL3NoIFxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiZWxpZiBbIC14IC9idXN5Ym94L3NoIF07IHRoZW5cXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIlxcdGV4ZWMgL2J1c3lib3gvc2ggXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJlbHNlXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJcXHRlY2hvIHNoZWxsIG5vdCBmb3VuZFxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiXFx0ZXhpdCAxXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJmaVxcblxcXCJcIjtcblxuICAgICAgICAgICAgY29uc3Qge3N0ZG91dDogY29udGFpbmVySWR9ID0gYXdhaXQgVXRpbHMuc3Bhd24oZG9ja2VyQ21kLCB0aGlzLmN3ZCk7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXJJZCA9IGNvbnRhaW5lcklkLnJlcGxhY2UoL1xccj9cXG4vZywgXCJcIik7XG5cbiAgICAgICAgICAgIHRpbWUgPSBwcm9jZXNzLmhydGltZSgpO1xuICAgICAgICAgICAgLy8gQ29weSBzb3VyY2UgZmlsZXMgaW50byBjb250YWluZXIuXG4gICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihgZG9ja2VyIGNwIC5naXRsYWItY2ktbG9jYWwvYnVpbGRzLy5kb2NrZXIvLiAke3RoaXMuX2NvbnRhaW5lcklkfTovYnVpbGRzLyR7c2FmZUpvYk5hbWV9YCwgdGhpcy5jd2QpO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoTG9uZ1J1bm5pbmdTaWxlbnRUaW1lb3V0KHdyaXRlU3RyZWFtcyk7XG5cbiAgICAgICAgICAgIC8vIENvcHkgZmlsZSB2YXJpYWJsZXMgaW50byBjb250YWluZXIuXG4gICAgICAgICAgICBjb25zdCBmaWxlVmFyaWFibGVzRm9sZGVyID0gYC90bXAvZ2l0bGFiLWNpLWxvY2FsLWZpbGUtdmFyaWFibGVzLSR7dGhpcy5naXREYXRhLkNJX1BST0pFQ1RfUEFUSF9TTFVHfS9gO1xuICAgICAgICAgICAgaWYgKGF3YWl0IGZzLnBhdGhFeGlzdHMoZmlsZVZhcmlhYmxlc0ZvbGRlcikpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihgZG9ja2VyIGNwICR7ZmlsZVZhcmlhYmxlc0ZvbGRlcn0gJHt0aGlzLl9jb250YWluZXJJZH06JHtmaWxlVmFyaWFibGVzRm9sZGVyfS9gLCB0aGlzLmN3ZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoTG9uZ1J1bm5pbmdTaWxlbnRUaW1lb3V0KHdyaXRlU3RyZWFtcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGVuZFRpbWUgPSBwcm9jZXNzLmhydGltZSh0aW1lKTtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmNoYWxrSm9iTmFtZX0ge21hZ2VudGFCcmlnaHQgY29waWVkIHRvIGNvbnRhaW5lcn0gaW4ge21hZ2VudGEgJHtwcmV0dHlIcnRpbWUoZW5kVGltZSl9fVxcbmApO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5jb3B5QXJ0aWZhY3RzSW4od3JpdGVTdHJlYW1zKTtcblxuICAgICAgICBpZiAodGhpcy5pbWFnZU5hbWUpIHtcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0cmFja2VkIGZpbGVzIGFuZCBhcnRpZmFjdHMgYXJlIHJvb3Qgb3duZWQgaW4gZG9ja2VyLWV4ZWN1dG9yIGpvYnMuXG4gICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihgZG9ja2VyIHJ1biAtLXJtIC13IC9hcHAvIC12ICR7YnVpbGRWb2x1bWVOYW1lfTovYXBwLyBmaXJlY293L2dpdGxhYi1jaS1sb2NhbC11dGlsIGJhc2ggLWMgXCJjaG93biAwOjAgLVIgLiAmJiBjaG1vZCBhK3J3IC1SIC5cImApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNtZCA9IFwic2V0IC1lbyBwaXBlZmFpbFxcblwiO1xuICAgICAgICBjbWQgKz0gXCJleGVjIDA8IC9kZXYvbnVsbFxcblwiO1xuXG4gICAgICAgIGlmICghdGhpcy5pbWFnZU5hbWUgJiYgdGhpcy5zaGVsbElzb2xhdGlvbikge1xuICAgICAgICAgICAgY21kICs9IGBjZCAuZ2l0bGFiLWNpLWxvY2FsL2J1aWxkcy8ke3NhZmVKb2JOYW1lfS9cXG5gO1xuICAgICAgICB9XG4gICAgICAgIGNtZCArPSB0aGlzLmdlbmVyYXRlU2NyaXB0Q29tbWFuZHMoc2NyaXB0cyk7XG5cbiAgICAgICAgY21kICs9IFwiZXhpdCAwXFxuXCI7XG5cbiAgICAgICAgYXdhaXQgZnMub3V0cHV0RmlsZShgJHt0aGlzLmN3ZH0vLmdpdGxhYi1jaS1sb2NhbC9zY3JpcHRzLyR7c2FmZUpvYk5hbWV9YCwgY21kLCBcInV0Zi04XCIpO1xuICAgICAgICBhd2FpdCBmcy5jaG1vZChgJHt0aGlzLmN3ZH0vLmdpdGxhYi1jaS1sb2NhbC9zY3JpcHRzLyR7c2FmZUpvYk5hbWV9YCwgXCIwNzU1XCIpO1xuXG4gICAgICAgIGlmICh0aGlzLmltYWdlTmFtZSkge1xuICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oYGRvY2tlciBjcCAuZ2l0bGFiLWNpLWxvY2FsL3NjcmlwdHMvLiAke3RoaXMuX2NvbnRhaW5lcklkfTovZ2NsLXNjcmlwdHMvYCwgdGhpcy5jd2QpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3AgPSBjaGlsZFByb2Nlc3Muc3Bhd24odGhpcy5fY29udGFpbmVySWQgPyBgZG9ja2VyIHN0YXJ0IC0tYXR0YWNoIC1pICR7dGhpcy5fY29udGFpbmVySWR9YCA6IFwiYmFzaFwiLCB7XG4gICAgICAgICAgICBzaGVsbDogXCJiYXNoXCIsXG4gICAgICAgICAgICBzdGRpbzogW1wicGlwZVwiLCBcInBpcGVcIiwgXCJwaXBlXCJdLFxuICAgICAgICAgICAgY3dkOiB0aGlzLmN3ZCxcbiAgICAgICAgICAgIGVudjogdGhpcy5pbWFnZU5hbWUgPyB7Li4ucHJvY2Vzcy5lbnZ9IDogey4uLnRoaXMuZXhwYW5kZWRWYXJpYWJsZXMsIC4uLnJlcG9ydHNEb3RlbnZWYXJpYWJsZXMsIC4uLnByb2Nlc3MuZW52fSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgb3V0RnVuYyA9IChlOiBhbnksIHN0cmVhbTogKHR4dDogc3RyaW5nKSA9PiB2b2lkLCBjb2xvcml6ZTogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaExvbmdSdW5uaW5nU2lsZW50VGltZW91dCh3cml0ZVN0cmVhbXMpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGAke2V9YC5zcGxpdCgvXFxyP1xcbi8pKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHN0cmVhbShgJHt0aGlzLmNoYWxrSm9iTmFtZX0gYCk7XG4gICAgICAgICAgICAgICAgaWYgKCFsaW5lLnN0YXJ0c1dpdGgoXCJcXHUwMDFiWzMybSRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtKGAke2NvbG9yaXplKFwiPlwiKX0gYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0cmVhbShgJHtsaW5lfVxcbmApO1xuICAgICAgICAgICAgICAgIGZzLmFwcGVuZEZpbGVTeW5jKG91dHB1dEZpbGVzUGF0aCwgYCR7bGluZX1cXG5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IG5ldyBQcm9taXNlPG51bWJlcj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY3Auc3Rkb3V0Lm9uKFwiZGF0YVwiLCAoZSkgPT4gb3V0RnVuYyhlLCB3cml0ZVN0cmVhbXMuc3Rkb3V0LmJpbmQod3JpdGVTdHJlYW1zKSwgKHMpID0+IGNoYWxrYHtncmVlbkJyaWdodCAke3N9fWApKTtcbiAgICAgICAgICAgIGNwLnN0ZGVyci5vbihcImRhdGFcIiwgKGUpID0+IG91dEZ1bmMoZSwgd3JpdGVTdHJlYW1zLnN0ZGVyci5iaW5kKHdyaXRlU3RyZWFtcyksIChzKSA9PiBjaGFsa2B7cmVkQnJpZ2h0ICR7c319YCkpO1xuXG4gICAgICAgICAgICBjcC5vbihcImV4aXRcIiwgKGNvZGUpID0+IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZShjb2RlID8/IDApLCAxMCkpO1xuICAgICAgICAgICAgY3Aub24oXCJlcnJvclwiLCAoZXJyKSA9PiBzZXRUaW1lb3V0KCgpID0+IHJlamVjdChlcnIpLCAxMCkpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pbWFnZU5hbWUpIHtcbiAgICAgICAgICAgICAgICBjcC5zdGRpbi5lbmQoYC9nY2wtc2NyaXB0cy8ke3NhZmVKb2JOYW1lfWApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjcC5zdGRpbi5lbmQoYC4vLmdpdGxhYi1jaS1sb2NhbC9zY3JpcHRzLyR7c2FmZUpvYk5hbWV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuY29weUFydGlmYWN0c091dCh3cml0ZVN0cmVhbXMsIGJ1aWxkVm9sdW1lTmFtZSk7XG5cbiAgICAgICAgcmV0dXJuIGV4aXRDb2RlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcHVsbEltYWdlKHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zLCBpbWFnZVRvUHVsbDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHRpbWUgPSBwcm9jZXNzLmhydGltZSgpO1xuICAgICAgICBsZXQgcHVsbENtZCA9IFwiXCI7XG4gICAgICAgIHB1bGxDbWQgKz0gYGRvY2tlciBpbWFnZSBscyAtLWZvcm1hdCAne3suUmVwb3NpdG9yeX19Ont7LlRhZ319JyB8IGdyZXAgLUUgJ14ke2ltYWdlVG9QdWxsfSQnXFxuYDtcbiAgICAgICAgcHVsbENtZCArPSBcImlmIFsgXFxcIiQ/XFxcIiAtbmUgMCBdOyB0aGVuXFxuXCI7XG4gICAgICAgIHB1bGxDbWQgKz0gYFxcdGVjaG8gXCJQdWxsaW5nICR7aW1hZ2VUb1B1bGx9XCJcXG5gO1xuICAgICAgICBwdWxsQ21kICs9IGBcXHRkb2NrZXIgcHVsbCAke2ltYWdlVG9QdWxsfVxcbmA7XG4gICAgICAgIHB1bGxDbWQgKz0gXCJmaVxcblwiO1xuICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihwdWxsQ21kLCB0aGlzLmN3ZCk7XG4gICAgICAgIHRoaXMucmVmcmVzaExvbmdSdW5uaW5nU2lsZW50VGltZW91dCh3cml0ZVN0cmVhbXMpO1xuICAgICAgICBjb25zdCBlbmRUaW1lID0gcHJvY2Vzcy5ocnRpbWUodGltZSk7XG4gICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmNoYWxrSm9iTmFtZX0ge21hZ2VudGFCcmlnaHQgcHVsbGVkfSAke2ltYWdlVG9QdWxsfSBpbiB7bWFnZW50YSAke3ByZXR0eUhydGltZShlbmRUaW1lKX19XFxuYCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBpbml0UHJvZHVjZXJSZXBvcnRzRG90ZW52VmFyaWFibGVzKHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zKSB7XG4gICAgICAgIGNvbnN0IHByb2R1Y2VycyA9IHRoaXMucHJvZHVjZXJzO1xuICAgICAgICBsZXQgcHJvZHVjZXJSZXBvcnRzRW52cyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHByb2R1Y2VyIG9mIHByb2R1Y2VycyA/PyBbXSkge1xuICAgICAgICAgICAgaWYgKHByb2R1Y2VyLmRvdGVudiA9PT0gbnVsbCkgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IHNhZmVQcm9kdWNlck5hbWUgPSBVdGlscy5nZXRTYWZlSm9iTmFtZShwcm9kdWNlci5uYW1lKTtcbiAgICAgICAgICAgIGxldCBkb3RlbnZGaWxlO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnNoZWxsSXNvbGF0aW9uICYmICF0aGlzLmltYWdlTmFtZSkge1xuICAgICAgICAgICAgICAgIGRvdGVudkZpbGUgPSBgJHt0aGlzLmN3ZH0vJHtwcm9kdWNlci5kb3RlbnZ9YDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZG90ZW52RmlsZSA9IGAke3RoaXMuY3dkfS8uZ2l0bGFiLWNpLWxvY2FsL2FydGlmYWN0cy8ke3NhZmVQcm9kdWNlck5hbWV9Ly5naXRsYWItY2ktcmVwb3J0cy9kb3RlbnYvJHtwcm9kdWNlci5kb3RlbnZ9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhd2FpdCBmcy5wYXRoRXhpc3RzKGRvdGVudkZpbGUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvZHVjZXJSZXBvcnRFbnYgPSBkb3RlbnYucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUoZG90ZW52RmlsZSkpO1xuICAgICAgICAgICAgICAgIHByb2R1Y2VyUmVwb3J0c0VudnMgPSB7Li4ucHJvZHVjZXJSZXBvcnRzRW52cywgLi4ucHJvZHVjZXJSZXBvcnRFbnZ9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3RkZXJyKGNoYWxrYCR7dGhpcy5jaGFsa0pvYk5hbWV9IHt5ZWxsb3cgJyR7cHJvZHVjZXIuZG90ZW52fScgcHJvZHVjZWQgYnkgJyR7cHJvZHVjZXIubmFtZX0nIGNvdWxkIG5vdCBiZSBmb3VuZH1cXG5gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9kdWNlclJlcG9ydHNFbnZzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY29weUFydGlmYWN0c0luKHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zKSB7XG4gICAgICAgIGlmICghdGhpcy5pbWFnZU5hbWUgJiYgIXRoaXMuc2hlbGxJc29sYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5wcm9kdWNlcnMgfHwgdGhpcy5wcm9kdWNlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzYWZlSm9iTmFtZSA9IHRoaXMuc2FmZUpvYk5hbWU7XG5cbiAgICAgICAgY29uc3QgY3BGdW5jID0gYXN5bmMgKGZvbGRlcjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaW1hZ2VOYW1lICYmIHRoaXMuc2hlbGxJc29sYXRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gVXRpbHMuc3Bhd24oYHJzeW5jIC1hICR7Zm9sZGVyfS8uICR7dGhpcy5jd2R9Ly5naXRsYWItY2ktbG9jYWwvYnVpbGRzLyR7c2FmZUpvYk5hbWV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gVXRpbHMuc3Bhd24oYGRvY2tlciBjcCAke2ZvbGRlcn0vLiAke3RoaXMuX2NvbnRhaW5lcklkfTovYnVpbGRzLyR7c2FmZUpvYk5hbWV9YCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgdGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcHJvZHVjZXIgb2YgdGhpcy5wcm9kdWNlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb2R1Y2VyU2FmZU5hbWUgPSBVdGlscy5nZXRTYWZlSm9iTmFtZShwcm9kdWNlci5uYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGFydGlmYWN0Rm9sZGVyID0gYCR7dGhpcy5jd2R9Ly5naXRsYWItY2ktbG9jYWwvYXJ0aWZhY3RzLyR7cHJvZHVjZXJTYWZlTmFtZX1gO1xuICAgICAgICAgICAgaWYgKCFhd2FpdCBmcy5wYXRoRXhpc3RzKGFydGlmYWN0Rm9sZGVyKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGl0RXJyb3IoYCR7YXJ0aWZhY3RGb2xkZXJ9IGRvZXNuJ3QgZXhpc3QsIGRpZCB5b3UgZm9yZ2V0IC0tbmVlZHNgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb21pc2VzLnB1c2goY3BGdW5jKGFydGlmYWN0Rm9sZGVyKSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgICBjb25zdCBlbmRUaW1lID0gcHJvY2Vzcy5ocnRpbWUodGltZSk7XG4gICAgICAgIGNvbnN0IHRhcmdldFRleHQgPSB0aGlzLmltYWdlTmFtZSA/IFwiY29udGFpbmVyXCIgOiBcImlzb2xhdGVkIHNoZWxsXCI7XG4gICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmNoYWxrSm9iTmFtZX0ge21hZ2VudGFCcmlnaHQgY29waWVkIGFydGlmYWN0cyB0byAke3RhcmdldFRleHR9fSBpbiB7bWFnZW50YSAke3ByZXR0eUhydGltZShlbmRUaW1lKX19XFxuYCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjb3B5QXJ0aWZhY3RzT3V0KHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zLCBidWlsZFZvbHVtZU5hbWU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBzYWZlSm9iTmFtZSA9IHRoaXMuc2FmZUpvYk5hbWU7XG5cbiAgICAgICAgaWYgKCF0aGlzLnNoZWxsSXNvbGF0aW9uICYmICF0aGlzLmltYWdlTmFtZSB8fCAhdGhpcy5hcnRpZmFjdHMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0aW1lLCBlbmRUaW1lO1xuICAgICAgICBsZXQgY3BDbWQgPSBcInNob3B0IC1zIGdsb2JzdGFyIG51bGxnbG9iIGRvdGdsb2JcXG5cIjtcbiAgICAgICAgY3BDbWQgKz0gYG1rZGlyIC1wIC4uLy4uL2FydGlmYWN0cy8ke3NhZmVKb2JOYW1lfVxcbmA7XG4gICAgICAgIGZvciAoY29uc3QgYXJ0aWZhY3RQYXRoIG9mIHRoaXMuYXJ0aWZhY3RzPy5wYXRocyA/PyBbXSkge1xuICAgICAgICAgICAgY29uc3QgZXhwYW5kZWRQYXRoID0gVXRpbHMuZXhwYW5kVGV4dChhcnRpZmFjdFBhdGgsIHRoaXMuZXhwYW5kZWRWYXJpYWJsZXMpO1xuICAgICAgICAgICAgY3BDbWQgKz0gYGVjaG8gU3RhcnRlZCBjb3B5aW5nICR7ZXhwYW5kZWRQYXRofSB0byAuLi8uLi9hcnRpZmFjdHMvJHtzYWZlSm9iTmFtZX1cXG5gO1xuICAgICAgICAgICAgY3BDbWQgKz0gYHJzeW5jIC1SYSAke2V4cGFuZGVkUGF0aH0gLi4vLi4vYXJ0aWZhY3RzLyR7c2FmZUpvYk5hbWV9Ly5cXG5gO1xuICAgICAgICAgICAgY3BDbWQgKz0gYGVjaG8gRG9uZSBjb3B5aW5nICR7ZXhwYW5kZWRQYXRofSB0byAuLi8uLi9hcnRpZmFjdHMvJHtzYWZlSm9iTmFtZX1cXG5gO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBhcnRpZmFjdEV4Y2x1ZGVQYXRoIG9mIHRoaXMuYXJ0aWZhY3RzPy5leGNsdWRlID8/IFtdKSB7XG4gICAgICAgICAgICBjb25zdCBleHBhbmRlZFBhdGggPSBVdGlscy5leHBhbmRUZXh0KGFydGlmYWN0RXhjbHVkZVBhdGgsIHRoaXMuZXhwYW5kZWRWYXJpYWJsZXMpO1xuICAgICAgICAgICAgY3BDbWQgKz0gYGVjaG8gU3RhcnRlZCByZW1vdmluZyBleGNsdWRlICcke2V4cGFuZGVkUGF0aH0nIGZyb20gLi4vLi4vYXJ0aWZhY3RzLyR7c2FmZUpvYk5hbWV9XFxuYDtcbiAgICAgICAgICAgIGNwQ21kICs9IGBscyAtMWQgJy4uLy4uL2FydGlmYWN0cy8ke3NhZmVKb2JOYW1lfS8ke2V4cGFuZGVkUGF0aH0nIHwgeGFyZ3MgLW4xIHJtIC1yZiB8fCB0cnVlXFxuYDtcbiAgICAgICAgICAgIGNwQ21kICs9IGBlY2hvIERvbmUgcmVtb3ZpbmcgZXhjbHVkZSAnJHtleHBhbmRlZFBhdGh9JyBmcm9tIC4uLy4uL2FydGlmYWN0cy8ke3NhZmVKb2JOYW1lfVxcbmA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXBvcnREb3RlbnYgPSB0aGlzLmFydGlmYWN0cy5yZXBvcnRzPy5kb3RlbnYgPz8gbnVsbDtcbiAgICAgICAgaWYgKHJlcG9ydERvdGVudiAhPSBudWxsKSB7XG4gICAgICAgICAgICBjcENtZCArPSBgbWtkaXIgLXAgLi4vLi4vYXJ0aWZhY3RzLyR7c2FmZUpvYk5hbWV9Ly5naXRsYWItY2ktcmVwb3J0cy9kb3RlbnZcXG5gO1xuICAgICAgICAgICAgY3BDbWQgKz0gYGVjaG8gU3RhcnRlZCBjb3B5aW5nICR7cmVwb3J0RG90ZW52fSB0byAuLi8uLi9hcnRpZmFjdHMvJHtzYWZlSm9iTmFtZX0vLmdpdGxhYi1jaS1yZXBvcnRzL2RvdGVudlxcbmA7XG4gICAgICAgICAgICBjcENtZCArPSBgcnN5bmMgLVJhICR7cmVwb3J0RG90ZW52fSAuLi8uLi9hcnRpZmFjdHMvJHtzYWZlSm9iTmFtZX0vLmdpdGxhYi1jaS1yZXBvcnRzL2RvdGVudi8uXFxuYDtcbiAgICAgICAgICAgIGNwQ21kICs9IGBlY2hvIERvbmUgY29weWluZyAke3JlcG9ydERvdGVudn0gdG8gLi4vLi4vYXJ0aWZhY3RzLyR7c2FmZUpvYk5hbWV9Ly5naXRsYWItY2ktcmVwb3J0cy9kb3RlbnZcXG5gO1xuICAgICAgICB9XG5cbiAgICAgICAgdGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgICAgIGlmICh0aGlzLmltYWdlTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgY2FjaGVNb3VudFN0ciA9IGF3YWl0IHRoaXMuY3JlYXRlQ2FjaGVEb2NrZXJWb2x1bWVNb3VudHMoc2FmZUpvYk5hbWUsIHdyaXRlU3RyZWFtcyk7XG4gICAgICAgICAgICBjb25zdCBkb2NrZXJDcmVhdGVDbWQgPSBgZG9ja2VyIGNyZWF0ZSAtaSAke2NhY2hlTW91bnRTdHJ9IC12ICR7YnVpbGRWb2x1bWVOYW1lfTovYnVpbGRzLyR7c2FmZUpvYk5hbWV9LyAtdyAvYnVpbGRzLyR7c2FmZUpvYk5hbWV9LyBmaXJlY293L2dpdGxhYi1jaS1sb2NhbC11dGlsIGJhc2ggLWMgXCIke2NwQ21kfVwiYDtcbiAgICAgICAgICAgIGNvbnN0IHtzdGRvdXQ6IGFydGlmYWN0c0NvbnRhaW5lcklkfSA9IGF3YWl0IFV0aWxzLnNwYXduKGRvY2tlckNyZWF0ZUNtZCwgdGhpcy5jd2QpO1xuICAgICAgICAgICAgdGhpcy5fYXJ0aWZhY3RzQ29udGFpbmVySWQgPSBhcnRpZmFjdHNDb250YWluZXJJZC5yZXBsYWNlKC9cXHI/XFxuL2csIFwiXCIpO1xuICAgICAgICAgICAgYXdhaXQgZnMubWtkaXJwKGAke3RoaXMuY3dkfS8uZ2l0bGFiLWNpLWxvY2FsL2FydGlmYWN0cy8ke3NhZmVKb2JOYW1lfWApO1xuICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oYGRvY2tlciBzdGFydCAke3RoaXMuX2FydGlmYWN0c0NvbnRhaW5lcklkfSAtLWF0dGFjaGApO1xuICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oYGRvY2tlciBjcCAke3RoaXMuX2FydGlmYWN0c0NvbnRhaW5lcklkfTovYXJ0aWZhY3RzLy4gLmdpdGxhYi1jaS1sb2NhbC9hcnRpZmFjdHMvLmAsIHRoaXMuY3dkKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoZWxsSXNvbGF0aW9uKSB7XG4gICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihgbWtkaXIgLXAgLi4vLi4vYXJ0aWZhY3RzLyR7c2FmZUpvYk5hbWV9YCwgYCR7dGhpcy5jd2R9Ly5naXRsYWItY2ktbG9jYWwvYnVpbGRzLyR7c2FmZUpvYk5hbWV9YCk7XG4gICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihgYmFzaCAtZSAtYyBcIiR7Y3BDbWR9XCJgLCBgJHt0aGlzLmN3ZH0vLmdpdGxhYi1jaS1sb2NhbC9idWlsZHMvJHtzYWZlSm9iTmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBlbmRUaW1lID0gcHJvY2Vzcy5ocnRpbWUodGltZSk7XG4gICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmNoYWxrSm9iTmFtZX0ge21hZ2VudGFCcmlnaHQgc2F2ZWQgYXJ0aWZhY3RzfSBpbiB7bWFnZW50YSAke3ByZXR0eUhydGltZShlbmRUaW1lKX19XFxuYCk7XG5cbiAgICAgICAgaWYgKHRoaXMuYXJ0aWZhY3RzVG9Tb3VyY2UpIHtcbiAgICAgICAgICAgIHRpbWUgPSBwcm9jZXNzLmhydGltZSgpO1xuICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oYHJzeW5jIC0tZXhjbHVkZT0vLmdpdGxhYi1jaS1yZXBvcnRzLyAtYSAke3RoaXMuY3dkfS8uZ2l0bGFiLWNpLWxvY2FsL2FydGlmYWN0cy8ke3NhZmVKb2JOYW1lfS8uICR7dGhpcy5jd2R9YCk7XG4gICAgICAgICAgICBpZiAocmVwb3J0RG90ZW52ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihgcnN5bmMgLWEgJHt0aGlzLmN3ZH0vLmdpdGxhYi1jaS1sb2NhbC9hcnRpZmFjdHMvJHtzYWZlSm9iTmFtZX0vLmdpdGxhYi1jaS1yZXBvcnRzL2RvdGVudi8uICR7dGhpcy5jd2R9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbmRUaW1lID0gcHJvY2Vzcy5ocnRpbWUodGltZSk7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5jaGFsa0pvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IGNvcGllZCBhcnRpZmFjdHMgdG8gY3dkfSBpbiB7bWFnZW50YSAke3ByZXR0eUhydGltZShlbmRUaW1lKX19XFxuYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZnJlc2hMb25nUnVubmluZ1NpbGVudFRpbWVvdXQod3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2xvbmdSdW5uaW5nU2lsZW50VGltZW91dCk7XG4gICAgICAgIHRoaXMuX2xvbmdSdW5uaW5nU2lsZW50VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuY2hhbGtKb2JOYW1lfSB7Z3JleSA+IHN0aWxsIHJ1bm5pbmcuLi59XFxuYCk7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hMb25nUnVubmluZ1NpbGVudFRpbWVvdXQod3JpdGVTdHJlYW1zKTtcbiAgICAgICAgfSwgMTAwMDApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RXhpdGVkU3RyaW5nKHN0YXJ0VGltZTogW251bWJlciwgbnVtYmVyXSwgY29kZTogbnVtYmVyLCB3YXJuaW5nID0gZmFsc2UsIHByZXBlbmRTdHJpbmcgPSBcIlwiKSB7XG4gICAgICAgIGNvbnN0IGZpbmlzaGVkU3RyID0gdGhpcy5nZXRGaW5pc2hlZFN0cmluZyhzdGFydFRpbWUpO1xuICAgICAgICBpZiAod2FybmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGNoYWxrYCR7ZmluaXNoZWRTdHJ9IHtibGFjay5iZ1llbGxvd0JyaWdodCAgV0FSTiAke2NvZGUudG9TdHJpbmcoKX0gfSR7cHJlcGVuZFN0cmluZ31gO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNoYWxrYCR7ZmluaXNoZWRTdHJ9IHtibGFjay5iZ1JlZCAgRkFJTCAke2NvZGUudG9TdHJpbmcoKX0gfSAke3ByZXBlbmRTdHJpbmd9YDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEZpbmlzaGVkU3RyaW5nKHN0YXJ0VGltZTogW251bWJlciwgbnVtYmVyXSkge1xuICAgICAgICBjb25zdCBlbmRUaW1lID0gcHJvY2Vzcy5ocnRpbWUoc3RhcnRUaW1lKTtcbiAgICAgICAgY29uc3QgdGltZVN0ciA9IHByZXR0eUhydGltZShlbmRUaW1lKTtcbiAgICAgICAgcmV0dXJuIGNoYWxrYCR7dGhpcy5jaGFsa0pvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IGZpbmlzaGVkfSBpbiB7bWFnZW50YSAke3RpbWVTdHJ9fWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVEb2NrZXJOZXR3b3JrKG5ldHdvcmtOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qge3N0ZG91dDogbmV0d29ya0lkfSA9IGF3YWl0IFV0aWxzLnNwYXduKGBkb2NrZXIgbmV0d29yayBjcmVhdGUgJHtuZXR3b3JrTmFtZX1gKTtcbiAgICAgICAgdGhpcy5fc2VydmljZU5ldHdvcmtJZCA9IG5ldHdvcmtJZC5yZXBsYWNlKC9cXHI/XFxuL2csIFwiXCIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY3JlYXRlQ2FjaGVEb2NrZXJWb2x1bWVNb3VudHMoc2FmZUpvYk5hbWU6IHN0cmluZywgd3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMpIHtcbiAgICAgICAgbGV0IGNtZCA9IFwiXCI7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgdGhpcy5jYWNoZSkge1xuICAgICAgICAgICAgY29uc3QgdW5pcXVlQ2FjaGVOYW1lID0gYXdhaXQgSm9iLmdldFVuaXF1ZUNhY2hlTmFtZSh0aGlzLmN3ZCwgZW50cnksIHRoaXMuZXhwYW5kZWRWYXJpYWJsZXMpO1xuICAgICAgICAgICAgZW50cnkucGF0aHMuZm9yRWFjaCgocCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBVdGlscy5leHBhbmRUZXh0KHAsIHRoaXMuZXhwYW5kZWRWYXJpYWJsZXMpO1xuICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmNoYWxrSm9iTmFtZX0ge21hZ2VudGFCcmlnaHQgbW91bnRpbmcgY2FjaGV9IGZvciBwYXRoICR7cGF0aH1cXG5gKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjYWNoZWRpciA9IGAvdG1wL2dpdGxhYi1jaS1sb2NhbC9jYWNoZS8ke3VuaXF1ZUNhY2hlTmFtZX0vJHtwYXRofWA7XG4gICAgICAgICAgICAgICAgZnMuZW5zdXJlRGlyU3luYyhjYWNoZWRpcik7XG4gICAgICAgICAgICAgICAgY21kICs9IGAtdiAke2NhY2hlZGlyfTovYnVpbGRzLyR7c2FmZUpvYk5hbWV9LyR7cGF0aH0gYDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzdGFydFNlcnZpY2Uod3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMsIHNlcnZpY2U6IFNlcnZpY2UsIHByaXZpbGVnZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgbGV0IGRvY2tlckNtZCA9IGBkb2NrZXIgcnVuIC1kIC0tbmV0d29yayBnaXRsYWItY2ktbG9jYWwtJHt0aGlzLmpvYklkfSBgO1xuXG4gICAgICAgIGlmIChwcml2aWxlZ2VkKSB7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCItLXByaXZpbGVnZWQgXCI7XG4gICAgICAgIH1cblxuICAgICAgICAoc2VydmljZS5nZXRFbnRyeXBvaW50KCkgPz8gW10pLmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLS1lbnRyeXBvaW50IFwiJHtlfVwiIGA7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBzZXJ2aWNlQWxpYXMgPSBzZXJ2aWNlLmdldEFsaWFzKHRoaXMuZXhwYW5kZWRWYXJpYWJsZXMpO1xuICAgICAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IHNlcnZpY2UuZ2V0TmFtZSh0aGlzLmV4cGFuZGVkVmFyaWFibGVzKTtcbiAgICAgICAgY29uc3Qgc2VydmljZU5hbWVXaXRob3V0VmVyc2lvbiA9IHNlcnZpY2VOYW1lLnJlcGxhY2UoLyguKikoOi4qKS8sIFwiJDFcIik7XG4gICAgICAgIGNvbnN0IGFsaWFzZXMgPSBbc2VydmljZU5hbWVXaXRob3V0VmVyc2lvbi5yZXBsYWNlKFwiL1wiLCBcIi1cIiksIHNlcnZpY2VOYW1lV2l0aG91dFZlcnNpb24ucmVwbGFjZShcIi9cIiwgXCJfX1wiKV07XG4gICAgICAgIGlmIChzZXJ2aWNlQWxpYXMpIHtcbiAgICAgICAgICAgIGFsaWFzZXMucHVzaChzZXJ2aWNlQWxpYXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yKGNvbnN0IGFsaWFzIG9mIGFsaWFzZXMpIHtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLS1uZXR3b3JrLWFsaWFzPSR7YWxpYXN9IGA7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmV4cGFuZGVkVmFyaWFibGVzKSkge1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtZSAke2tleX09XCIke1N0cmluZyh2YWx1ZSkudHJpbSgpfVwiIGA7XG4gICAgICAgIH1cblxuICAgICAgICBkb2NrZXJDbWQgKz0gYCR7c2VydmljZU5hbWV9YDtcbiAgICAgICAgY29uc3QgY29tbWFuZCA9IHNlcnZpY2UuZ2V0Q29tbWFuZCh0aGlzLmV4cGFuZGVkVmFyaWFibGVzKTtcbiAgICAgICAgaWYgKGNvbW1hbmQpIHtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBgICR7Y29tbWFuZH1gO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgICAgIGNvbnN0IHtzdGRvdXQ6IGNvbnRhaW5lcklkfSA9IGF3YWl0IFV0aWxzLnNwYXduKGRvY2tlckNtZCwgdGhpcy5jd2QpO1xuICAgICAgICB0aGlzLl9zZXJ2aWNlSWRzLnB1c2goY29udGFpbmVySWQucmVwbGFjZSgvXFxyP1xcbi9nLCBcIlwiKSk7XG4gICAgICAgIHRoaXMucmVmcmVzaExvbmdSdW5uaW5nU2lsZW50VGltZW91dCh3cml0ZVN0cmVhbXMpO1xuICAgICAgICBjb25zdCBlbmRUaW1lID0gcHJvY2Vzcy5ocnRpbWUodGltZSk7XG4gICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmNoYWxrSm9iTmFtZX0ge21hZ2VudGFCcmlnaHQgc3RhcnRlZCBzZXJ2aWNlIGltYWdlOiAke3NlcnZpY2VOYW1lfSB3aXRoIGFsaWFzZXM6ICR7YWxpYXNlcy5qb2luKFwiLCBcIil9fSBpbiB7bWFnZW50YSAke3ByZXR0eUhydGltZShlbmRUaW1lKX19XFxuYCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzZXJ2aWNlSGVhbHRoQ2hlY2sod3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMsIHNlcnZpY2U6IFNlcnZpY2UpIHtcbiAgICAgICAgY29uc3QgZG9ja2VySW5zcGVjdENtZCA9IGBkb2NrZXIgaW5zcGVjdCAke3NlcnZpY2UuZ2V0TmFtZSh0aGlzLmV4cGFuZGVkVmFyaWFibGVzKX1gO1xuICAgICAgICBjb25zdCB7c3Rkb3V0OiBpbWFnZURldGFpbHN9ID0gYXdhaXQgVXRpbHMuc3Bhd24oZG9ja2VySW5zcGVjdENtZCwgdGhpcy5jd2QpO1xuICAgICAgICBjb25zdCBpbWFnZURldGFpbE9iaiA9IEpTT04ucGFyc2UoaW1hZ2VEZXRhaWxzKTtcblxuICAgICAgICAvLyBDb3BpZWQgZnJvbSB0aGUgc3RhcnRTZXJ2aWNlIGJsb2NrLiBJbXBvcnRhbnQgdGhpbmcgaXMgdGhhdCB0aGUgYWxpYXNlcyBtYXRjaFxuICAgICAgICBjb25zdCBzZXJ2aWNlQWxpYXMgPSBzZXJ2aWNlLmdldEFsaWFzKHRoaXMuZXhwYW5kZWRWYXJpYWJsZXMpO1xuICAgICAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IHNlcnZpY2UuZ2V0TmFtZSh0aGlzLmV4cGFuZGVkVmFyaWFibGVzKTtcbiAgICAgICAgY29uc3Qgc2VydmljZU5hbWVXaXRob3V0VmVyc2lvbiA9IHNlcnZpY2VOYW1lLnJlcGxhY2UoLyguKikoOi4qKS8sIFwiJDFcIik7XG4gICAgICAgIGNvbnN0IGFsaWFzZXMgPSBbc2VydmljZU5hbWVXaXRob3V0VmVyc2lvbi5yZXBsYWNlKFwiL1wiLCBcIi1cIiksIHNlcnZpY2VOYW1lV2l0aG91dFZlcnNpb24ucmVwbGFjZShcIi9cIiwgXCJfX1wiKV07XG4gICAgICAgIGlmIChzZXJ2aWNlQWxpYXMpIHtcbiAgICAgICAgICAgIGFsaWFzZXMucHVzaChzZXJ2aWNlQWxpYXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGVhY2ggcG9ydCBkZWZpbmVkIGluIHRoZSBpbWFnZSwgYW5kIHRyeSB0byBjb25uZWN0IHRvIHRoZSBhbGlhc1xuICAgICAgICBmb3IoY29uc3QgcG9ydCBvZiBPYmplY3Qua2V5cyhpbWFnZURldGFpbE9ialswXS5Db250YWluZXJDb25maWcuRXhwb3NlZFBvcnRzKSkge1xuICAgICAgICAgICAgaWYocG9ydC5lbmRzV2l0aChcIi90Y3BcIikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwb3J0TnVtID0gcGFyc2VJbnQocG9ydC5yZXBsYWNlKFwiL3RjcFwiLCBcIlwiKSk7XG5cbiAgICAgICAgICAgICAgICBsZXQgZG9ja2VyQ21kID0gYGRvY2tlciBydW4gLWQgLS1uZXR3b3JrIGdpdGxhYi1jaS1sb2NhbC0ke3RoaXMuam9iSWR9IGA7XG5cbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYCB3aWxsd2lsbC93YWl0LWZvci1pdCBcIiR7YWxpYXNlc1swXX06JHtwb3J0TnVtfVwiIC10IDMwYDtcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB7c3RhdHVzOiByZXN1bHQsIHN0ZG91dH0gPSBhd2FpdCBVdGlscy5zcGF3bihkb2NrZXJDbWQsIHRoaXMuY3dkKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXJ2aWNlSWRzLnB1c2goc3Rkb3V0LnJlcGxhY2UoL1xccj9cXG4vZywgXCJcIikpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuZFRpbWUgPSBwcm9jZXNzLmhydGltZSh0aW1lKTtcbiAgICAgICAgICAgICAgICBpZihyZXN1bHQgPT0gMCl7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmNoYWxrSm9iTmFtZX0ge2dyZWVuQnJpZ2h0IHNlcnZpY2UgaW1hZ2U6ICR7c2VydmljZU5hbWV9IGhlYWx0aGNoZWNrIHBhc3NlZDogJHthbGlhc2VzWzBdfToke3BvcnROdW19fSBpbiB7Z3JlZW4gJHtwcmV0dHlIcnRpbWUoZW5kVGltZSl9fVxcbmApO1xuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5jaGFsa0pvYk5hbWV9IHtyZWRCcmlnaHQgc2VydmljZSBpbWFnZTogJHtzZXJ2aWNlTmFtZX0gaGVhbHRoY2hlY2sgZmFpbGVkOiAke2FsaWFzZXNbMF19OiR7cG9ydE51bX19IGluIHtyZWQgJHtwcmV0dHlIcnRpbWUoZW5kVGltZSl9fVxcbmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
|
|
802
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9iLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiam9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrREFBMEI7QUFDMUIsK0NBQWlDO0FBQ2pDLDREQUE4QztBQUM5Qyw2Q0FBK0I7QUFDL0Isa0VBQXlDO0FBQ3pDLDBEQUFrQztBQUNsQyxtREFBNkM7QUFDN0MsbUNBQThCO0FBSzlCLHVDQUFpQztBQUNqQywrQ0FBeUM7QUFDekMsbUNBQThCO0FBRTlCLE1BQWEsR0FBRztJQXdDWixZQUFZLEdBQWU7UUFqQm5CLHdCQUFtQixHQUFrQixJQUFJLENBQUM7UUFDMUMsMEJBQXFCLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLHFCQUFnQixHQUFrQixJQUFJLENBQUM7UUFDdkMsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFDbkMsc0JBQWlCLEdBQWtCLElBQUksQ0FBQztRQUN4QywwQkFBcUIsR0FBYSxFQUFFLENBQUM7UUFDckMsOEJBQXlCLEdBQW1CLENBQUMsQ0FBUSxDQUFDO1FBQ3RELGVBQVUsR0FBcUQsSUFBSSxDQUFDO1FBRXBFLHVCQUFrQixHQUFhLEVBQUUsQ0FBQztRQVF0QyxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ3pCLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDNUIsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQztRQUM1QixNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQztRQUNsRCxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDO1FBRXRDLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQztRQUNqQyxJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUM7UUFDakMsSUFBSSxDQUFDLE9BQU8sR0FB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QUEsdUJBQVksRUFBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQy9LO2FBQ0o7U0FDSjtJQUNMLENBQUM7O0FBbjRCTCxrQkFvNEJDO0FBbDRCbUIsbUJBQWUsR0FBRztJQUM5QixTQUFTLEVBQUUscUJBQXFCLEVBQUUsT0FBTyxFQUFFLFVBQVU7SUFDckQsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVM7SUFDdEQsY0FBYyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsVUFBVTtDQUNuRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0ICogYXMgZG90ZW52IGZyb20gXCJkb3RlbnZcIjtcbmltcG9ydCAqIGFzIGNoaWxkUHJvY2VzcyBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzLWV4dHJhXCI7XG5pbXBvcnQgcHJldHR5SHJ0aW1lIGZyb20gXCJwcmV0dHktaHJ0aW1lXCI7XG5pbXBvcnQgY2FtZWxDYXNlIGZyb20gXCJjYW1lbGNhc2VcIjtcbmltcG9ydCB7RXhpdEVycm9yfSBmcm9tIFwiLi90eXBlcy9leGl0LWVycm9yXCI7XG5pbXBvcnQge1V0aWxzfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHtKb2JPcHRpb25zfSBmcm9tIFwiLi90eXBlcy9qb2Itb3B0aW9uc1wiO1xuaW1wb3J0IHtXcml0ZVN0cmVhbXN9IGZyb20gXCIuL3R5cGVzL3dyaXRlLXN0cmVhbXNcIjtcbmltcG9ydCB7U2VydmljZX0gZnJvbSBcIi4vc2VydmljZVwiO1xuaW1wb3J0IHtHaXREYXRhfSBmcm9tIFwiLi9naXQtZGF0YVwiO1xuaW1wb3J0IHthc3NlcnR9IGZyb20gXCIuL2Fzc2VydHNcIjtcbmltcG9ydCB7Q2FjaGVFbnRyeX0gZnJvbSBcIi4vY2FjaGUtZW50cnlcIjtcbmltcG9ydCB7TXV0ZXh9IGZyb20gXCIuL211dGV4XCI7XG5cbmV4cG9ydCBjbGFzcyBKb2Ige1xuXG4gICAgc3RhdGljIHJlYWRvbmx5IGlsbGVnYWxKb2JOYW1lcyA9IFtcbiAgICAgICAgXCJpbmNsdWRlXCIsIFwibG9jYWxfY29uZmlndXJhdGlvblwiLCBcImltYWdlXCIsIFwic2VydmljZXNcIixcbiAgICAgICAgXCJzdGFnZXNcIiwgXCJwYWdlc1wiLCBcInR5cGVzXCIsIFwiYmVmb3JlX3NjcmlwdFwiLCBcImRlZmF1bHRcIixcbiAgICAgICAgXCJhZnRlcl9zY3JpcHRcIiwgXCJ2YXJpYWJsZXNcIiwgXCJjYWNoZVwiLCBcIndvcmtmbG93XCIsXG4gICAgXTtcblxuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgICByZWFkb25seSBqb2JOYW1lUGFkOiBudW1iZXI7XG4gICAgcmVhZG9ubHkgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSB8IG51bGw7XG4gICAgcmVhZG9ubHkgZW52aXJvbm1lbnQ/OiB7IG5hbWU6IHN0cmluZzsgdXJsOiBzdHJpbmcgfCBudWxsIH07XG4gICAgcmVhZG9ubHkgam9iSWQ6IG51bWJlcjtcbiAgICByZWFkb25seSBjd2Q6IHN0cmluZztcbiAgICByZWFkb25seSBydWxlcz86IHsgaWY6IHN0cmluZzsgd2hlbjogc3RyaW5nOyBhbGxvd19mYWlsdXJlOiBib29sZWFuIH1bXTtcbiAgICByZWFkb25seSBleHBhbmRlZFZhcmlhYmxlczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgICByZWFkb25seSBhbGxvd0ZhaWx1cmU6IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgd2hlbjogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHBpcGVsaW5lSWlkOiBudW1iZXI7XG4gICAgcmVhZG9ubHkgZ2l0RGF0YTogR2l0RGF0YTtcbiAgICByZWFkb25seSBzaGVsbElzb2xhdGlvbjogYm9vbGVhbjtcbiAgICByZWFkb25seSBtb3VudENhY2hlOiBib29sZWFuO1xuXG4gICAgcHJpdmF0ZSBfcHJlc2NyaXB0c0V4aXRDb2RlOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIF9hZnRlclNjcmlwdHNFeGl0Q29kZSA9IDA7XG4gICAgcHJpdmF0ZSBfY292ZXJhZ2VQZXJjZW50OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIF9ydW5uaW5nID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfY29udGFpbmVySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX3NlcnZpY2VOZXR3b3JrSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX2NvbnRhaW5lclZvbHVtZU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHByaXZhdGUgX2xvbmdSdW5uaW5nU2lsZW50VGltZW91dDogTm9kZUpTLlRpbWVvdXQgPSAtMSBhcyBhbnk7XG4gICAgcHJpdmF0ZSBfcHJvZHVjZXJzOiB7IG5hbWU6IHN0cmluZzsgZG90ZW52OiBzdHJpbmcgfCBudWxsIH1bXSB8IG51bGwgPSBudWxsO1xuXG4gICAgcHJpdmF0ZSBfY29udGFpbmVyc1RvQ2xlYW46IHN0cmluZ1tdID0gW107XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGpvYkRhdGE6IGFueTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZXh0cmFIb3N0czogc3RyaW5nW107XG4gICAgcHJpdmF0ZSByZWFkb25seSB2b2x1bWVzOiBzdHJpbmdbXTtcblxuICAgIGNvbnN0cnVjdG9yKG9wdDogSm9iT3B0aW9ucykge1xuICAgICAgICBjb25zdCBqb2JEYXRhID0gb3B0LmRhdGE7XG4gICAgICAgIGNvbnN0IGdpdERhdGEgPSBvcHQuZ2l0RGF0YTtcbiAgICAgICAgY29uc3QgZ2xvYmFscyA9IG9wdC5nbG9iYWxzO1xuICAgICAgICBjb25zdCB2YXJpYWJsZXNGcm9tRmlsZXMgPSBvcHQudmFyaWFibGVzRnJvbUZpbGVzO1xuICAgICAgICBjb25zdCBjbGlWYXJpYWJsZXMgPSBvcHQuY2xpVmFyaWFibGVzO1xuXG4gICAgICAgIHRoaXMubW91bnRDYWNoZSA9IG9wdC5tb3VudENhY2hlO1xuICAgICAgICB0aGlzLmV4dHJhSG9zdHMgPSBvcHQuZXh0cmFIb3N0cztcbiAgICAgICAgdGhpcy52b2x1bWVzID0gb3B0LnZvbHVtZXM7XG4gICAgICAgIHRoaXMud3JpdGVTdHJlYW1zID0gb3B0LndyaXRlU3RyZWFtcztcbiAgICAgICAgdGhpcy5qb2JOYW1lUGFkID0gb3B0Lm5hbWVQYWQ7XG4gICAgICAgIHRoaXMuZ2l0RGF0YSA9IG9wdC5naXREYXRhO1xuICAgICAgICB0aGlzLm5hbWUgPSBvcHQubmFtZTtcbiAgICAgICAgdGhpcy5jd2QgPSBvcHQuY3dkO1xuICAgICAgICB0aGlzLmpvYklkID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMDAwMCk7XG4gICAgICAgIHRoaXMuam9iRGF0YSA9IG9wdC5kYXRhO1xuICAgICAgICB0aGlzLnBpcGVsaW5lSWlkID0gb3B0LnBpcGVsaW5lSWlkO1xuICAgICAgICB0aGlzLnNoZWxsSXNvbGF0aW9uID0gb3B0LnNoZWxsSXNvbGF0aW9uO1xuXG4gICAgICAgIHRoaXMud2hlbiA9IGpvYkRhdGEud2hlbiB8fCBcIm9uX3N1Y2Nlc3NcIjtcbiAgICAgICAgdGhpcy5hbGxvd0ZhaWx1cmUgPSBqb2JEYXRhLmFsbG93X2ZhaWx1cmUgPz8gZmFsc2U7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gam9iRGF0YS5kZXBlbmRlbmNpZXMgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5ydWxlcyA9IGpvYkRhdGEucnVsZXMgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudCA9IHR5cGVvZiBqb2JEYXRhLmVudmlyb25tZW50ID09PSBcInN0cmluZ1wiID8ge25hbWU6IGpvYkRhdGEuZW52aXJvbm1lbnR9IDogam9iRGF0YS5lbnZpcm9ubWVudDtcblxuICAgICAgICBsZXQgQ0lfUFJPSkVDVF9ESVIgPSBgJHt0aGlzLmN3ZH1gO1xuICAgICAgICBpZiAodGhpcy5pbWFnZU5hbWUpIHtcbiAgICAgICAgICAgIENJX1BST0pFQ1RfRElSID0gYC9idWlsZHMvJHt0aGlzLnNhZmVKb2JOYW1lfWA7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zaGVsbElzb2xhdGlvbikge1xuICAgICAgICAgICAgQ0lfUFJPSkVDVF9ESVIgPSBgJHt0aGlzLmN3ZH0vLmdpdGxhYi1jaS1sb2NhbC9idWlsZHMvJHt0aGlzLnNhZmVKb2JOYW1lfWA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmVkZWZpbmVkVmFyaWFibGVzID0ge1xuICAgICAgICAgICAgR0lUTEFCX1VTRVJfTE9HSU46IGdpdERhdGEudXNlcltcIkdJVExBQl9VU0VSX0xPR0lOXCJdLFxuICAgICAgICAgICAgR0lUTEFCX1VTRVJfRU1BSUw6IGdpdERhdGEudXNlcltcIkdJVExBQl9VU0VSX0VNQUlMXCJdLFxuICAgICAgICAgICAgR0lUTEFCX1VTRVJfTkFNRTogZ2l0RGF0YS51c2VyW1wiR0lUTEFCX1VTRVJfTkFNRVwiXSxcbiAgICAgICAgICAgIEdJVExBQl9VU0VSX0lEOiBnaXREYXRhLnVzZXJbXCJHSVRMQUJfVVNFUl9JRFwiXSxcbiAgICAgICAgICAgIENJX0NPTU1JVF9TSE9SVF9TSEE6IGdpdERhdGEuY29tbWl0LlNIT1JUX1NIQSwgLy8gQ2hhbmdlc1xuICAgICAgICAgICAgQ0lfQ09NTUlUX1NIQTogZ2l0RGF0YS5jb21taXQuU0hBLFxuICAgICAgICAgICAgQ0lfUFJPSkVDVF9ESVIsXG4gICAgICAgICAgICBDSV9QUk9KRUNUX05BTUU6IGdpdERhdGEucmVtb3RlLnByb2plY3QsXG4gICAgICAgICAgICBDSV9QUk9KRUNUX1RJVExFOiBgJHtjYW1lbENhc2UoZ2l0RGF0YS5yZW1vdGUucHJvamVjdCl9YCxcbiAgICAgICAgICAgIENJX1BST0pFQ1RfUEFUSDogZ2l0RGF0YS5DSV9QUk9KRUNUX1BBVEgsXG4gICAgICAgICAgICBDSV9QUk9KRUNUX1BBVEhfU0xVRzogZ2l0RGF0YS5DSV9QUk9KRUNUX1BBVEhfU0xVRyxcbiAgICAgICAgICAgIENJX1BST0pFQ1RfTkFNRVNQQUNFOiBgJHtnaXREYXRhLnJlbW90ZS5ncm91cH1gLFxuICAgICAgICAgICAgQ0lfUFJPSkVDVF9WSVNJQklMSVRZOiBcImludGVybmFsXCIsXG4gICAgICAgICAgICBDSV9QUk9KRUNUX0lEOiBcIjEyMTdcIixcbiAgICAgICAgICAgIENJX0NPTU1JVF9SRUZfUFJPVEVDVEVEOiBcImZhbHNlXCIsXG4gICAgICAgICAgICBDSV9DT01NSVRfQlJBTkNIOiBnaXREYXRhLmNvbW1pdC5SRUZfTkFNRSwgLy8gTm90IGF2YWlsYWJsZSBpbiBtZXJnZSByZXF1ZXN0IG9yIHRhZyBwaXBlbGluZXNcbiAgICAgICAgICAgIENJX0NPTU1JVF9SRUZfTkFNRTogZ2l0RGF0YS5jb21taXQuUkVGX05BTUUsIC8vIFRhZyBvciBicmFuY2ggbmFtZVxuICAgICAgICAgICAgQ0lfQ09NTUlUX1JFRl9TTFVHOiBnaXREYXRhLmNvbW1pdC5SRUZfTkFNRS5yZXBsYWNlKC9bXmEtejAtOV0rL2lnLCBcIi1cIikucmVwbGFjZSgvXi0vLCBcIlwiKS5yZXBsYWNlKC8tJC8sIFwiXCIpLnNsaWNlKDAsIDYzKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgQ0lfQ09NTUlUX1RJVExFOiBcIkNvbW1pdCBUaXRsZVwiLCAvLyBGaXJzdCBsaW5lIG9mIGNvbW1pdCBtZXNzYWdlLlxuICAgICAgICAgICAgQ0lfQ09NTUlUX01FU1NBR0U6IFwiQ29tbWl0IFRpdGxlXFxuTW9yZSBjb21taXQgdGV4dFwiLCAvLyBGdWxsIGNvbW1pdCBtZXNzYWdlXG4gICAgICAgICAgICBDSV9DT01NSVRfREVTQ1JJUFRJT046IFwiTW9yZSBjb21taXQgdGV4dFwiLFxuICAgICAgICAgICAgQ0lfUElQRUxJTkVfU09VUkNFOiBcInB1c2hcIixcbiAgICAgICAgICAgIENJX0pPQl9JRDogYCR7dGhpcy5qb2JJZH1gLFxuICAgICAgICAgICAgQ0lfUElQRUxJTkVfSUQ6IGAke3RoaXMucGlwZWxpbmVJaWQgKyAxMDAwfWAsXG4gICAgICAgICAgICBDSV9QSVBFTElORV9JSUQ6IGAke3RoaXMucGlwZWxpbmVJaWR9YCxcbiAgICAgICAgICAgIENJX1NFUlZFUl9IT1NUOiBgJHtnaXREYXRhLnJlbW90ZS5ob3N0fWAsXG4gICAgICAgICAgICBDSV9TRVJWRVJfUE9SVDogYCR7Z2l0RGF0YS5yZW1vdGUucG9ydH1gLFxuICAgICAgICAgICAgQ0lfU0VSVkVSX1VSTDogYGh0dHBzOi8vJHtnaXREYXRhLnJlbW90ZS5ob3N0fTo0NDNgLFxuICAgICAgICAgICAgQ0lfU0VSVkVSX1BST1RPQ09MOiBcImh0dHBzXCIsXG4gICAgICAgICAgICBDSV9BUElfVjRfVVJMOiBgaHR0cHM6Ly8ke2dpdERhdGEucmVtb3RlLmhvc3R9L2FwaS92NGAsXG4gICAgICAgICAgICBDSV9QUk9KRUNUX1VSTDogYGh0dHBzOi8vJHtnaXREYXRhLnJlbW90ZS5ob3N0fS8ke2dpdERhdGEucmVtb3RlLmdyb3VwfS8ke2dpdERhdGEucmVtb3RlLnByb2plY3R9YCxcbiAgICAgICAgICAgIENJX0pPQl9VUkw6IGBodHRwczovLyR7Z2l0RGF0YS5yZW1vdGUuaG9zdH0vJHtnaXREYXRhLnJlbW90ZS5ncm91cH0vJHtnaXREYXRhLnJlbW90ZS5wcm9qZWN0fS8tL2pvYnMvJHt0aGlzLmpvYklkfWAsIC8vIENoYW5nZXMgb24gcmVydW4uXG4gICAgICAgICAgICBDSV9QSVBFTElORV9VUkw6IGBodHRwczovLyR7Z2l0RGF0YS5yZW1vdGUuaG9zdH0vJHtnaXREYXRhLnJlbW90ZS5ncm91cH0vJHtnaXREYXRhLnJlbW90ZS5wcm9qZWN0fS9waXBlbGluZXMvJHt0aGlzLnBpcGVsaW5lSWlkfWAsXG4gICAgICAgICAgICBDSV9KT0JfTkFNRTogYCR7dGhpcy5uYW1lfWAsXG4gICAgICAgICAgICBDSV9KT0JfU1RBR0U6IGAke3RoaXMuc3RhZ2V9YCxcbiAgICAgICAgICAgIENJX1JFR0lTVFJZOiBnaXREYXRhLkNJX1JFR0lTVFJZLFxuICAgICAgICAgICAgQ0lfUkVHSVNUUllfSU1BR0U6IGdpdERhdGEuQ0lfUkVHSVNUUllfSU1BR0UsXG4gICAgICAgICAgICBHSVRMQUJfQ0k6IFwiZmFsc2VcIixcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBDcmVhdGUgZXhwYW5kZWQgdmFyaWFibGVzXG4gICAgICAgIGNvbnN0IGVudnMgPSB7Li4ucHJlZGVmaW5lZFZhcmlhYmxlcywgLi4uZ2xvYmFscy52YXJpYWJsZXMgfHwge30sIC4uLmpvYkRhdGEudmFyaWFibGVzIHx8IHt9LCAuLi52YXJpYWJsZXNGcm9tRmlsZXMsIC4uLmNsaVZhcmlhYmxlc307XG4gICAgICAgIGNvbnN0IGV4cGFuZGVkR2xvYmFsVmFyaWFibGVzID0gVXRpbHMuZXhwYW5kVmFyaWFibGVzKGdsb2JhbHMudmFyaWFibGVzIHx8IHt9LCBlbnZzKTtcbiAgICAgICAgY29uc3QgZXhwYW5kZWRKb2JWYXJpYWJsZXMgPSBVdGlscy5leHBhbmRWYXJpYWJsZXMoam9iRGF0YS52YXJpYWJsZXMgfHwge30sIGVudnMpO1xuICAgICAgICB0aGlzLmV4cGFuZGVkVmFyaWFibGVzID0gey4uLnByZWRlZmluZWRWYXJpYWJsZXMsIC4uLmV4cGFuZGVkR2xvYmFsVmFyaWFibGVzLCAuLi5leHBhbmRlZEpvYlZhcmlhYmxlcywgLi4udmFyaWFibGVzRnJvbUZpbGVzLCAuLi5jbGlWYXJpYWJsZXN9O1xuXG4gICAgICAgIC8vIFNldCB7d2hlbiwgYWxsb3dGYWlsdXJlfSBiYXNlZCBvbiBydWxlcyByZXN1bHRcbiAgICAgICAgaWYgKHRoaXMucnVsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJ1bGVSZXN1bHQgPSBVdGlscy5nZXRSdWxlc1Jlc3VsdCh0aGlzLnJ1bGVzLCB0aGlzLmV4cGFuZGVkVmFyaWFibGVzKTtcbiAgICAgICAgICAgIHRoaXMud2hlbiA9IHJ1bGVSZXN1bHQud2hlbjtcbiAgICAgICAgICAgIHRoaXMuYWxsb3dGYWlsdXJlID0gcnVsZVJlc3VsdC5hbGxvd0ZhaWx1cmU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pbnRlcmFjdGl2ZSAmJiAodGhpcy53aGVuICE9PSBcIm1hbnVhbFwiIHx8IHRoaXMuaW1hZ2VOYW1lICE9PSBudWxsKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEV4aXRFcnJvcihgJHt0aGlzLmNoYWxrSm9iTmFtZX0gQEludGVyYWN0aXZlIGRlY29yYXRvciBjYW5ub3QgaGF2ZSBpbWFnZTogYW5kIG11c3QgYmUgd2hlbjptYW51YWxgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmluamVjdFNTSEFnZW50ICYmIHRoaXMuaW1hZ2VOYW1lID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXhpdEVycm9yKGAke3RoaXMuY2hhbGtKb2JOYW1lfSBASW5qZWN0U1NIQWdlbnQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGltYWdlOmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VOYW1lICYmIHRoaXMubW91bnRDYWNoZSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIHRoaXMuY2FjaGUpIHtcbiAgICAgICAgICAgICAgICBjLnBhdGhzLmZvckVhY2goKHApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IFV0aWxzLmV4cGFuZFRleHQocCwgdGhpcy5leHBhbmRlZFZhcmlhYmxlcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXRoLmluY2x1ZGVzKFwiKlwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4aXRFcnJvcihgJHt0aGlzLm5hbWV9IGNhbm5vdCBoYXZlICogaW4gY2FjaGUgcGF0aHMsIHdoZW4gLS1tb3VudC1jYWNoZSBpcyBlbmFibGVkYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBhcnRpZmFjdHNUb1NvdXJjZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam9iRGF0YVtcImFydGlmYWN0c1RvU291cmNlXCJdID09IG51bGwgPyB0cnVlIDogdGhpcy5qb2JEYXRhW1wiYXJ0aWZhY3RzVG9Tb3VyY2VcIl07XG4gICAgfVxuXG4gICAgZ2V0IGNoYWxrSm9iTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIGNoYWxrYHtibHVlQnJpZ2h0ICR7dGhpcy5uYW1lLnBhZEVuZCh0aGlzLmpvYk5hbWVQYWQpfX1gO1xuICAgIH1cblxuICAgIGdldCBzYWZlSm9iTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIFV0aWxzLmdldFNhZmVKb2JOYW1lKHRoaXMubmFtZSk7XG4gICAgfVxuXG4gICAgZ2V0IG5lZWRzKCk6IHtqb2I6IHN0cmluZzsgYXJ0aWZhY3RzOiBib29sZWFufVtdIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IG5lZWRzID0gdGhpcy5qb2JEYXRhW1wibmVlZHNcIl07XG4gICAgICAgIGlmICghbmVlZHMpIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBsaXN0OiB7am9iOiBzdHJpbmc7IGFydGlmYWN0czogYm9vbGVhbn1bXSA9IFtdO1xuICAgICAgICBuZWVkcy5mb3JFYWNoKChuZWVkOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGxpc3QucHVzaCh7XG4gICAgICAgICAgICAgICAgam9iOiB0eXBlb2YgbmVlZCA9PT0gXCJzdHJpbmdcIiA/IG5lZWQgOiBuZWVkLmpvYixcbiAgICAgICAgICAgICAgICBhcnRpZmFjdHM6IHR5cGVvZiBuZWVkID09PSBcInN0cmluZ1wiID8gdHJ1ZSA6IG5lZWQuYXJ0aWZhY3RzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbGlzdDtcbiAgICB9XG5cbiAgICBnZXQgY2FjaGUoKTogQ2FjaGVFbnRyeVtdIHtcbiAgICAgICAgbGV0IGNhY2hlRGF0YSA9IHRoaXMuam9iRGF0YVtcImNhY2hlXCJdO1xuICAgICAgICBjb25zdCBjYWNoZUxpc3Q6IENhY2hlRW50cnlbXSA9IFtdO1xuICAgICAgICBpZiAoIWNhY2hlRGF0YSkgcmV0dXJuIFtdO1xuXG4gICAgICAgIGNhY2hlRGF0YSA9IEFycmF5LmlzQXJyYXkoY2FjaGVEYXRhKSA/IGNhY2hlRGF0YSA6IFtjYWNoZURhdGFdO1xuICAgICAgICBjYWNoZURhdGEuZm9yRWFjaCgoYzogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBjW1wia2V5XCJdO1xuICAgICAgICAgICAgY29uc3QgcG9saWN5ID0gY1tcInBvbGljeVwiXSA/PyBcInB1bGwtcHVzaFwiO1xuICAgICAgICAgICAgaWYgKCFbXCJwdWxsXCIsIFwicHVzaFwiLCBcInB1bGwtcHVzaFwiXS5pbmNsdWRlcyhwb2xpY3kpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4aXRFcnJvcihcImNhY2hlIHBvbGljeSBpcyBub3QgJ3B1bGwnLCAncHVzaCcgb3IgJ3B1bGwtcHVzaCdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwYXRocyA9IGNbXCJwYXRoc1wiXSA/PyBbXTtcbiAgICAgICAgICAgIGNhY2hlTGlzdC5wdXNoKG5ldyBDYWNoZUVudHJ5KGtleSwgcGF0aHMsIHBvbGljeSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNhY2hlTGlzdDtcbiAgICB9XG5cbiAgICBnZXQgYnVpbGRWb2x1bWVOYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgZ2NsLSR7dGhpcy5zYWZlSm9iTmFtZX0tJHt0aGlzLmpvYklkfS1idWlsZGA7XG4gICAgfVxuXG4gICAgZ2V0IHRtcFZvbHVtZU5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGBnY2wtJHt0aGlzLnNhZmVKb2JOYW1lfS0ke3RoaXMuam9iSWR9LXRtcGA7XG4gICAgfVxuXG4gICAgZ2V0IGltYWdlTmFtZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgaW1hZ2UgPSB0aGlzLmpvYkRhdGFbXCJpbWFnZVwiXTtcbiAgICAgICAgaWYgKCFpbWFnZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbWFnZU5hbWUgPSBVdGlscy5leHBhbmRUZXh0KGltYWdlLm5hbWUsIHRoaXMuZXhwYW5kZWRWYXJpYWJsZXMpO1xuICAgICAgICByZXR1cm4gaW1hZ2VOYW1lLmluY2x1ZGVzKFwiOlwiKSA/IGltYWdlTmFtZSA6IGAke2ltYWdlTmFtZX06bGF0ZXN0YDtcbiAgICB9XG5cbiAgICBnZXQgaW1hZ2VFbnRyeXBvaW50KCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGltYWdlID0gdGhpcy5qb2JEYXRhW1wiaW1hZ2VcIl07XG5cbiAgICAgICAgaWYgKCFpbWFnZSB8fCAhaW1hZ2UuZW50cnlwb2ludCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBpbWFnZS5lbnRyeXBvaW50ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXhpdEVycm9yKFwiaW1hZ2U6ZW50cnlwb2ludCBtdXN0IGJlIGFuIGFycmF5XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbWFnZS5lbnRyeXBvaW50O1xuICAgIH1cblxuICAgIGdldCBzZXJ2aWNlcygpOiBTZXJ2aWNlW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2JEYXRhW1wic2VydmljZXNcIl07XG4gICAgfVxuXG4gICAgZ2V0IHByb2R1Y2VycygpOiB7IG5hbWU6IHN0cmluZzsgZG90ZW52OiBzdHJpbmcgfCBudWxsIH1bXSB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJvZHVjZXJzO1xuICAgIH1cblxuICAgIHNldCBwcm9kdWNlcnMocHJvZHVjZXJzOiB7IG5hbWU6IHN0cmluZzsgZG90ZW52OiBzdHJpbmcgfCBudWxsIH1bXSB8IG51bGwpIHtcbiAgICAgICAgYXNzZXJ0KHRoaXMuX3Byb2R1Y2VycyA9PSBudWxsLCBcInRoaXMuX3Byb2R1Y2VycyBjYW4gb25seSBiZSBzZXQgb25jZVwiKTtcbiAgICAgICAgdGhpcy5fcHJvZHVjZXJzID0gcHJvZHVjZXJzO1xuICAgIH1cblxuICAgIGdldCBzdGFnZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2JEYXRhW1wic3RhZ2VcIl0gfHwgXCJ0ZXN0XCI7XG4gICAgfVxuXG4gICAgZ2V0IGludGVyYWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2JEYXRhW1wiaW50ZXJhY3RpdmVcIl0gfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0IGluamVjdFNTSEFnZW50KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2JEYXRhW1wiaW5qZWN0U1NIQWdlbnRcIl0gfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmpvYkRhdGFbXCJkZXNjcmlwdGlvblwiXSA/PyBcIlwiO1xuICAgIH1cblxuICAgIGdldCBhcnRpZmFjdHMoKTogeyBwYXRocz86IHN0cmluZ1tdOyBleGNsdWRlPzogc3RyaW5nW107IHJlcG9ydHM/OiB7IGRvdGVudj86IHN0cmluZyB9IH18bnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmpvYkRhdGFbXCJhcnRpZmFjdHNcIl07XG4gICAgfVxuXG4gICAgZ2V0IGJlZm9yZVNjcmlwdHMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2JEYXRhW1wiYmVmb3JlX3NjcmlwdFwiXSB8fCBbXTtcbiAgICB9XG5cbiAgICBnZXQgYWZ0ZXJTY3JpcHRzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam9iRGF0YVtcImFmdGVyX3NjcmlwdFwiXSB8fCBbXTtcbiAgICB9XG5cbiAgICBnZXQgc2NyaXB0cygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmpvYkRhdGFbXCJzY3JpcHRcIl07XG4gICAgfVxuXG4gICAgZ2V0IHByZVNjcmlwdHNFeGl0Q29kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZTtcbiAgICB9XG5cbiAgICBnZXQgYWZ0ZXJTY3JpcHRzRXhpdENvZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZnRlclNjcmlwdHNFeGl0Q29kZTtcbiAgICB9XG5cbiAgICBnZXQgcnVubmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bm5pbmc7XG4gICAgfVxuXG4gICAgZ2V0IHN0YXJ0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ydW5uaW5nIHx8IHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZSAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgZmluaXNoZWQoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fcnVubmluZyAmJiB0aGlzLl9wcmVzY3JpcHRzRXhpdENvZGUgIT09IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IGNvdmVyYWdlUGVyY2VudCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvdmVyYWdlUGVyY2VudDtcbiAgICB9XG5cbiAgICBhc3luYyBzdGFydChwcml2aWxlZ2VkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgICAgIGNvbnN0IHdyaXRlU3RyZWFtcyA9IHRoaXMud3JpdGVTdHJlYW1zO1xuICAgICAgICBjb25zdCBzYWZlSm9ibmFtZSA9IHRoaXMuc2FmZUpvYk5hbWU7XG5cbiAgICAgICAgdGhpcy5fcnVubmluZyA9IHRydWU7XG5cbiAgICAgICAgYXdhaXQgZnMuZW5zdXJlRmlsZShgJHt0aGlzLmN3ZH0vLmdpdGxhYi1jaS1sb2NhbC9vdXRwdXQvJHtzYWZlSm9ibmFtZX0ubG9nYCk7XG4gICAgICAgIGF3YWl0IGZzLnRydW5jYXRlKGAke3RoaXMuY3dkfS8uZ2l0bGFiLWNpLWxvY2FsL291dHB1dC8ke3NhZmVKb2JuYW1lfS5sb2dgKTtcblxuICAgICAgICBpZiAoIXRoaXMuaW50ZXJhY3RpdmUpIHtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmNoYWxrSm9iTmFtZX0ge21hZ2VudGFCcmlnaHQgc3RhcnRpbmd9ICR7dGhpcy5pbWFnZU5hbWUgPz8gXCJzaGVsbFwifSAoe3llbGxvdyAke3RoaXMuc3RhZ2V9fSlcXG5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZXNjcmlwdHMgPSB0aGlzLmJlZm9yZVNjcmlwdHMuY29uY2F0KHRoaXMuc2NyaXB0cyk7XG4gICAgICAgIHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZSA9IGF3YWl0IHRoaXMuZXhlY1NjcmlwdHMocHJlc2NyaXB0cywgcHJpdmlsZWdlZCk7XG4gICAgICAgIGlmICh0aGlzLmFmdGVyU2NyaXB0cy5sZW5ndGggPT09IDAgJiYgdGhpcy5fcHJlc2NyaXB0c0V4aXRDb2RlID4gMCAmJiAhdGhpcy5hbGxvd0ZhaWx1cmUpIHtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRlcnIoYCR7dGhpcy5nZXRFeGl0ZWRTdHJpbmcoc3RhcnRUaW1lLCB0aGlzLl9wcmVzY3JpcHRzRXhpdENvZGUsIGZhbHNlKX1cXG5gKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xlYW51cFJlc291cmNlcygpO1xuICAgICAgICAgICAgdGhpcy5fcnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYWZ0ZXJTY3JpcHRzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLl9wcmVzY3JpcHRzRXhpdENvZGUgPiAwICYmIHRoaXMuYWxsb3dGYWlsdXJlKSB7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3RkZXJyKGAke3RoaXMuZ2V0RXhpdGVkU3RyaW5nKHN0YXJ0VGltZSwgdGhpcy5fcHJlc2NyaXB0c0V4aXRDb2RlLCB0cnVlKX1cXG5gKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xlYW51cFJlc291cmNlcygpO1xuICAgICAgICAgICAgdGhpcy5fcnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZSA+IDAgJiYgdGhpcy5hbGxvd0ZhaWx1cmUpIHtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRlcnIoYCR7dGhpcy5nZXRFeGl0ZWRTdHJpbmcoc3RhcnRUaW1lLCB0aGlzLl9wcmVzY3JpcHRzRXhpdENvZGUsIHRydWUpfVxcbmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZSA+IDAgJiYgIXRoaXMuYWxsb3dGYWlsdXJlKSB7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3RkZXJyKGAke3RoaXMuZ2V0RXhpdGVkU3RyaW5nKHN0YXJ0VGltZSwgdGhpcy5fcHJlc2NyaXB0c0V4aXRDb2RlLCBmYWxzZSl9XFxuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hZnRlclNjcmlwdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fYWZ0ZXJTY3JpcHRzRXhpdENvZGUgPSBhd2FpdCB0aGlzLmV4ZWNTY3JpcHRzKHRoaXMuYWZ0ZXJTY3JpcHRzLCBwcml2aWxlZ2VkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9hZnRlclNjcmlwdHNFeGl0Q29kZSA+IDApIHtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRlcnIoYCR7dGhpcy5nZXRFeGl0ZWRTdHJpbmcoc3RhcnRUaW1lLCB0aGlzLl9hZnRlclNjcmlwdHNFeGl0Q29kZSwgdHJ1ZSwgXCIgYWZ0ZXJfc2NyaXB0XCIpfVxcbmApO1xuICAgICAgICB9XG5cbiAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChgJHt0aGlzLmdldEZpbmlzaGVkU3RyaW5nKHN0YXJ0VGltZSl9XFxuYCk7XG5cbiAgICAgICAgaWYgKHRoaXMuam9iRGF0YS5jb3ZlcmFnZSkge1xuICAgICAgICAgICAgdGhpcy5fY292ZXJhZ2VQZXJjZW50ID0gYXdhaXQgVXRpbHMuZ2V0Q292ZXJhZ2VQZXJjZW50KHRoaXMuY3dkLCB0aGlzLmpvYkRhdGEuY292ZXJhZ2UsIHNhZmVKb2JuYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuY2xlYW51cFJlc291cmNlcygpO1xuICAgICAgICB0aGlzLl9ydW5uaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgYXN5bmMgY2xlYW51cFJlc291cmNlcygpIHtcbiAgICAgICAgY29uc3Qgd3JpdGVTdHJlYW1zID0gdGhpcy53cml0ZVN0cmVhbXM7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9sb25nUnVubmluZ1NpbGVudFRpbWVvdXQpO1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgdGhpcy5fY29udGFpbmVyc1RvQ2xlYW4pIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oYGRvY2tlciBybSAtZiAke2lkfWApO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGFzc2VydChlIGluc3RhbmNlb2YgRXJyb3IsIFwiZSBpcyBub3QgaW5zdGFuY2VvZiBFcnJvclwiKTtcbiAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3RkZXJyKGNoYWxrYHt5ZWxsb3cgJHtlLm1lc3NhZ2V9fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3NlcnZpY2VOZXR3b3JrSWQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oYGRvY2tlciBuZXR3b3JrIHJtICR7dGhpcy5fc2VydmljZU5ldHdvcmtJZH1gKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBhc3NlcnQoZSBpbnN0YW5jZW9mIEVycm9yLCBcImUgaXMgbm90IGluc3RhbmNlb2YgRXJyb3JcIik7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZGVycihjaGFsa2B7eWVsbG93ICR7ZS5tZXNzYWdlfX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9jb250YWluZXJWb2x1bWVOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29udGFpbmVyVm9sdW1lIG9mIHRoaXMuX2NvbnRhaW5lclZvbHVtZU5hbWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKGBkb2NrZXIgdm9sdW1lIHJtICR7Y29udGFpbmVyVm9sdW1lfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBhc3NlcnQoZSBpbnN0YW5jZW9mIEVycm9yLCBcImUgaXMgbm90IGluc3RhbmNlb2YgRXJyb3JcIik7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZGVycihjaGFsa2B7eWVsbG93ICR7ZS5tZXNzYWdlfX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2VuZXJhdGVJbmplY3RTU0hBZ2VudE9wdGlvbnMoKSB7XG4gICAgICAgIGlmICghdGhpcy5pbmplY3RTU0hBZ2VudCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09IFwiZGFyd2luXCIgfHwgKHByb2Nlc3MuZW52Lk9TVFlQRT8ubWF0Y2goL15kYXJ3aW4vKSA/PyBudWxsKSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiLS1lbnYgU1NIX0FVVEhfU09DSz0vcnVuL2hvc3Qtc2VydmljZXMvc3NoLWF1dGguc29jayAtdiAvcnVuL2hvc3Qtc2VydmljZXMvc3NoLWF1dGguc29jazovcnVuL2hvc3Qtc2VydmljZXMvc3NoLWF1dGguc29ja1wiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgLS1lbnYgU1NIX0FVVEhfU09DSz0ke3Byb2Nlc3MuZW52LlNTSF9BVVRIX1NPQ0t9IC12ICR7cHJvY2Vzcy5lbnYuU1NIX0FVVEhfU09DS306JHtwcm9jZXNzLmVudi5TU0hfQVVUSF9TT0NLfWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZVNjcmlwdENvbW1hbmRzKHNjcmlwdHM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGxldCBjbWQgPSBcIlwiO1xuICAgICAgICBzY3JpcHRzLmZvckVhY2goKHNjcmlwdCkgPT4ge1xuICAgICAgICAgICAgLy8gUHJpbnQgY29tbWFuZCBlY2hvJ2VkIGluIGNvbG9yXG4gICAgICAgICAgICBjb25zdCBzcGxpdCA9IHNjcmlwdC5zcGxpdCgvXFxyP1xcbi8pO1xuICAgICAgICAgICAgY29uc3QgbXVsdGlsaW5lVGV4dCA9IHNwbGl0Lmxlbmd0aCA+IDEgPyBcIiAjIGNvbGxhcHNlZCBtdWx0aS1saW5lIGNvbW1hbmRcIiA6IFwiXCI7XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gc3BsaXRbMF0/LnJlcGxhY2UoL1tcXFxcXS9nLCBcIlxcXFxcXFxcXCIpLnJlcGxhY2UoL1tcIl0vZywgXCJcXFxcXFxcIlwiKS5yZXBsYWNlKC9bJF0vZywgXCJcXFxcJFwiKTtcbiAgICAgICAgICAgIGNtZCArPSBjaGFsa2BlY2hvIFwie2dyZWVuICQgJHt0ZXh0fSR7bXVsdGlsaW5lVGV4dH19XCJcXG5gO1xuXG4gICAgICAgICAgICAvLyBFeGVjdXRlIGFjdHVhbCBzY3JpcHRcbiAgICAgICAgICAgIGNtZCArPSBgJHtzY3JpcHR9XFxuYDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjbWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBtb3VudENhY2hlQ21kKHNhZmVKb2JOYW1lOiBzdHJpbmcsIHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zKSB7XG4gICAgICAgIGlmICh0aGlzLmltYWdlTmFtZSAmJiAhdGhpcy5tb3VudENhY2hlKSByZXR1cm4gXCJcIjtcblxuICAgICAgICBsZXQgY21kID0gXCJcIjtcbiAgICAgICAgZm9yIChjb25zdCBjIG9mIHRoaXMuY2FjaGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZUNhY2hlTmFtZSA9IGF3YWl0IGMuZ2V0VW5pcXVlQ2FjaGVOYW1lKHRoaXMuY3dkLCB0aGlzLmV4cGFuZGVkVmFyaWFibGVzKTtcbiAgICAgICAgICAgIGMucGF0aHMuZm9yRWFjaCgocCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBVdGlscy5leHBhbmRUZXh0KHAsIHRoaXMuZXhwYW5kZWRWYXJpYWJsZXMpO1xuICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmNoYWxrSm9iTmFtZX0ge21hZ2VudGFCcmlnaHQgbW91bnRpbmcgY2FjaGV9IGZvciBwYXRoICR7cGF0aH1cXG5gKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjYWNoZU1vdW50ID0gYGdjbC0ke3RoaXMuZXhwYW5kZWRWYXJpYWJsZXMuQ0lfUFJPSkVDVF9QQVRIX1NMVUd9LSR7dW5pcXVlQ2FjaGVOYW1lfWA7XG4gICAgICAgICAgICAgICAgY21kICs9IGAtdiAke2NhY2hlTW91bnR9Oi9idWlsZHMvJHtzYWZlSm9iTmFtZX0vJHtwYXRofSBgO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNtZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGV4ZWNTY3JpcHRzKHNjcmlwdHM6IHN0cmluZ1tdLCBwcml2aWxlZ2VkOiBib29sZWFuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgY29uc3Qgc2FmZUpvYk5hbWUgPSB0aGlzLnNhZmVKb2JOYW1lO1xuICAgICAgICBjb25zdCBvdXRwdXRGaWxlc1BhdGggPSBgJHt0aGlzLmN3ZH0vLmdpdGxhYi1jaS1sb2NhbC9vdXRwdXQvJHtzYWZlSm9iTmFtZX0ubG9nYDtcbiAgICAgICAgY29uc3QgYnVpbGRWb2x1bWVOYW1lID0gdGhpcy5idWlsZFZvbHVtZU5hbWU7XG4gICAgICAgIGNvbnN0IHRtcFZvbHVtZU5hbWUgPSB0aGlzLnRtcFZvbHVtZU5hbWU7XG4gICAgICAgIGNvbnN0IHdyaXRlU3RyZWFtcyA9IHRoaXMud3JpdGVTdHJlYW1zO1xuICAgICAgICBjb25zdCByZXBvcnRzRG90ZW52VmFyaWFibGVzID0gYXdhaXQgdGhpcy5pbml0UHJvZHVjZXJSZXBvcnRzRG90ZW52VmFyaWFibGVzKHdyaXRlU3RyZWFtcyk7XG4gICAgICAgIGxldCB0aW1lO1xuICAgICAgICBsZXQgZW5kVGltZTtcblxuICAgICAgICBpZiAoc2NyaXB0cy5sZW5ndGggPT09IDAgfHwgc2NyaXB0c1swXSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvcHkgZ2l0IHRyYWNrZWQgZmlsZXMgdG8gYnVpbGQgZm9sZGVyIGlmIHNoZWxsIGlzb2xhdGlvbiBlbmFibGVkLlxuICAgICAgICBpZiAoIXRoaXMuaW1hZ2VOYW1lICYmIHRoaXMuc2hlbGxJc29sYXRpb24pIHtcbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLnJzeW5jVHJhY2tlZEZpbGVzKHRoaXMuY3dkLCBgJHtzYWZlSm9iTmFtZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmludGVyYWN0aXZlKSB7XG4gICAgICAgICAgICBjb25zdCBpQ21kID0gdGhpcy5nZW5lcmF0ZVNjcmlwdENvbW1hbmRzKHNjcmlwdHMpO1xuICAgICAgICAgICAgY29uc3QgaW50ZXJhY3RpdmVDcCA9IGNoaWxkUHJvY2Vzcy5zcGF3bihpQ21kLCB7XG4gICAgICAgICAgICAgICAgc2hlbGw6IFwiYmFzaFwiLFxuICAgICAgICAgICAgICAgIHN0ZGlvOiBbXCJpbmhlcml0XCIsIFwiaW5oZXJpdFwiLCBcImluaGVyaXRcIl0sXG4gICAgICAgICAgICAgICAgY3dkOiB0aGlzLmN3ZCxcbiAgICAgICAgICAgICAgICBlbnY6IHsuLi50aGlzLmV4cGFuZGVkVmFyaWFibGVzLCAuLi5wcm9jZXNzLmVudn0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxudW1iZXI+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBpbnRlcmFjdGl2ZUNwLm9uKFwiZXhpdFwiLCAoY29kZSkgPT4gcmVzb2x2ZShjb2RlID8/IDApKTtcbiAgICAgICAgICAgICAgICBpbnRlcmFjdGl2ZUNwLm9uKFwiZXJyb3JcIiwgKGVycikgPT4gcmVqZWN0KGVycikpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlZnJlc2hMb25nUnVubmluZ1NpbGVudFRpbWVvdXQod3JpdGVTdHJlYW1zKTtcblxuICAgICAgICBpZiAodGhpcy5pbWFnZU5hbWUpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHVsbEltYWdlKHdyaXRlU3RyZWFtcywgdGhpcy5pbWFnZU5hbWUpO1xuXG4gICAgICAgICAgICBsZXQgZG9ja2VyQ21kID0gXCJcIjtcbiAgICAgICAgICAgIGlmIChwcml2aWxlZ2VkKSB7XG4gICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IGBkb2NrZXIgY3JlYXRlIC0tcHJpdmlsZWdlZCAtdSAwOjAgLWkgJHt0aGlzLmdlbmVyYXRlSW5qZWN0U1NIQWdlbnRPcHRpb25zKCl9IGA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRvY2tlckNtZCArPSBgZG9ja2VyIGNyZWF0ZSAtdSAwOjAgLWkgJHt0aGlzLmdlbmVyYXRlSW5qZWN0U1NIQWdlbnRPcHRpb25zKCl9IGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5zZXJ2aWNlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVEb2NrZXJOZXR3b3JrKGBnaXRsYWItY2ktbG9jYWwtJHt0aGlzLmpvYklkfWApO1xuICAgICAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLS1uZXR3b3JrIGdpdGxhYi1jaS1sb2NhbC0ke3RoaXMuam9iSWR9IGA7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzZXJ2aWNlIG9mIHRoaXMuc2VydmljZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wdWxsSW1hZ2Uod3JpdGVTdHJlYW1zLCBzZXJ2aWNlLmdldE5hbWUodGhpcy5leHBhbmRlZFZhcmlhYmxlcykpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN0YXJ0U2VydmljZSh3cml0ZVN0cmVhbXMsIHNlcnZpY2UsIHByaXZpbGVnZWQpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNlcnZpY2VIZWFsdGhDaGVjayh3cml0ZVN0cmVhbXMsIHNlcnZpY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgdm9sdW1lUHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICAgIHZvbHVtZVByb21pc2VzLnB1c2goVXRpbHMuc3Bhd24oYGRvY2tlciB2b2x1bWUgY3JlYXRlICR7YnVpbGRWb2x1bWVOYW1lfWAsIHRoaXMuY3dkKSk7XG4gICAgICAgICAgICB2b2x1bWVQcm9taXNlcy5wdXNoKFV0aWxzLnNwYXduKGBkb2NrZXIgdm9sdW1lIGNyZWF0ZSAke3RtcFZvbHVtZU5hbWV9YCwgdGhpcy5jd2QpKTtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLS12b2x1bWUgJHtidWlsZFZvbHVtZU5hbWV9Oi9idWlsZHMvJHtzYWZlSm9iTmFtZX0gYDtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLS12b2x1bWUgJHt0bXBWb2x1bWVOYW1lfTovdG1wLyBgO1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyVm9sdW1lTmFtZXMucHVzaChidWlsZFZvbHVtZU5hbWUpO1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyVm9sdW1lTmFtZXMucHVzaCh0bXBWb2x1bWVOYW1lKTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHZvbHVtZVByb21pc2VzKTtcblxuICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtLXdvcmtkaXIgL2J1aWxkcy8ke3NhZmVKb2JOYW1lfSBgO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHZvbHVtZSBvZiB0aGlzLnZvbHVtZXMpIHtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tdm9sdW1lICR7dm9sdW1lfSBgO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGV4dHJhSG9zdCBvZiB0aGlzLmV4dHJhSG9zdHMpIHtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tYWRkLWhvc3Q9JHtleHRyYUhvc3R9IGA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmltYWdlRW50cnlwb2ludCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW1hZ2VFbnRyeXBvaW50LmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtLWVudHJ5cG9pbnQgXCIke2V9XCIgYDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5leHBhbmRlZFZhcmlhYmxlcykpIHtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC1lICR7a2V5fT0nJHtTdHJpbmcodmFsdWUpLnRyaW0oKX0nIGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZXBvcnRzRG90ZW52VmFyaWFibGVzKSkge1xuICAgICAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLWUgJHtrZXl9PScke1N0cmluZyh2YWx1ZSkudHJpbSgpfScgYDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZG9ja2VyQ21kICs9IGF3YWl0IHRoaXMubW91bnRDYWNoZUNtZChzYWZlSm9iTmFtZSwgd3JpdGVTdHJlYW1zKTtcblxuICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAke3RoaXMuaW1hZ2VOYW1lfSBzaCAtYyBcIlxcbmA7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJpZiBbIC14IC91c3IvbG9jYWwvYmluL2Jhc2ggXTsgdGhlblxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiXFx0ZXhlYyAvdXNyL2xvY2FsL2Jpbi9iYXNoIFxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiZWxpZiBbIC14IC91c3IvYmluL2Jhc2ggXTsgdGhlblxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiXFx0ZXhlYyAvdXNyL2Jpbi9iYXNoIFxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiZWxpZiBbIC14IC9iaW4vYmFzaCBdOyB0aGVuXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJcXHRleGVjIC9iaW4vYmFzaCBcXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcImVsaWYgWyAteCAvdXNyL2xvY2FsL2Jpbi9zaCBdOyB0aGVuXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJcXHRleGVjIC91c3IvbG9jYWwvYmluL3NoIFxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiZWxpZiBbIC14IC91c3IvYmluL3NoIF07IHRoZW5cXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIlxcdGV4ZWMgL3Vzci9iaW4vc2ggXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJlbGlmIFsgLXggL2Jpbi9zaCBdOyB0aGVuXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJcXHRleGVjIC9iaW4vc2ggXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJlbGlmIFsgLXggL2J1c3lib3gvc2ggXTsgdGhlblxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiXFx0ZXhlYyAvYnVzeWJveC9zaCBcXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcImVsc2VcXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIlxcdGVjaG8gc2hlbGwgbm90IGZvdW5kXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJcXHRleGl0IDFcXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcImZpXFxuXFxcIlwiO1xuXG4gICAgICAgICAgICBjb25zdCB7c3Rkb3V0OiBjb250YWluZXJJZH0gPSBhd2FpdCBVdGlscy5zcGF3bihkb2NrZXJDbWQsIHRoaXMuY3dkKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lcklkID0gY29udGFpbmVySWQucmVwbGFjZSgvXFxyP1xcbi9nLCBcIlwiKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lcnNUb0NsZWFuLnB1c2godGhpcy5fY29udGFpbmVySWQpO1xuXG4gICAgICAgICAgICB0aW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcbiAgICAgICAgICAgIC8vIENvcHkgc291cmNlIGZpbGVzIGludG8gY29udGFpbmVyLlxuICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oYGRvY2tlciBjcCAuZ2l0bGFiLWNpLWxvY2FsL2J1aWxkcy8uZG9ja2VyLy4gJHt0aGlzLl9jb250YWluZXJJZH06L2J1aWxkcy8ke3NhZmVKb2JOYW1lfWAsIHRoaXMuY3dkKTtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaExvbmdSdW5uaW5nU2lsZW50VGltZW91dCh3cml0ZVN0cmVhbXMpO1xuXG4gICAgICAgICAgICAvLyBDb3B5IGZpbGUgdmFyaWFibGVzIGludG8gY29udGFpbmVyLlxuICAgICAgICAgICAgY29uc3QgZmlsZVZhcmlhYmxlc0ZvbGRlciA9IGAvdG1wL2dpdGxhYi1jaS1sb2NhbC1maWxlLXZhcmlhYmxlcy0ke3RoaXMuZ2l0RGF0YS5DSV9QUk9KRUNUX1BBVEhfU0xVR30vYDtcbiAgICAgICAgICAgIGlmIChhd2FpdCBmcy5wYXRoRXhpc3RzKGZpbGVWYXJpYWJsZXNGb2xkZXIpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oYGRvY2tlciBjcCAke2ZpbGVWYXJpYWJsZXNGb2xkZXJ9ICR7dGhpcy5fY29udGFpbmVySWR9OiR7ZmlsZVZhcmlhYmxlc0ZvbGRlcn0vYCwgdGhpcy5jd2QpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaExvbmdSdW5uaW5nU2lsZW50VGltZW91dCh3cml0ZVN0cmVhbXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlbmRUaW1lID0gcHJvY2Vzcy5ocnRpbWUodGltZSk7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5jaGFsa0pvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IGNvcGllZCB0byBjb250YWluZXJ9IGluIHttYWdlbnRhICR7cHJldHR5SHJ0aW1lKGVuZFRpbWUpfX1cXG5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuY29weUNhY2hlSW4od3JpdGVTdHJlYW1zKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb3B5QXJ0aWZhY3RzSW4od3JpdGVTdHJlYW1zKTtcblxuICAgICAgICBpZiAodGhpcy5pbWFnZU5hbWUpIHtcbiAgICAgICAgICAgIC8vIEZpbGVzIGluIGRvY2tlci1leGVjdXRvciBidWlsZCBmb2xkZXIgbXVzdCBiZSByb290IG93bmVkLlxuICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oYGRvY2tlciBydW4gLS1ybSAtdyAvYXBwLyAtdiAke2J1aWxkVm9sdW1lTmFtZX06L2FwcC8gZmlyZWNvdy9naXRsYWItY2ktbG9jYWwtdXRpbCBiYXNoIC1jIFwiY2hvd24gMDowIC1SIC4gJiYgY2htb2QgYStydyAtUiAuXCJgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjbWQgPSBcInNldCAtZW8gcGlwZWZhaWxcXG5cIjtcbiAgICAgICAgY21kICs9IFwiZXhlYyAwPCAvZGV2L251bGxcXG5cIjtcblxuICAgICAgICBpZiAoIXRoaXMuaW1hZ2VOYW1lICYmIHRoaXMuc2hlbGxJc29sYXRpb24pIHtcbiAgICAgICAgICAgIGNtZCArPSBgY2QgLmdpdGxhYi1jaS1sb2NhbC9idWlsZHMvJHtzYWZlSm9iTmFtZX0vXFxuYDtcbiAgICAgICAgfVxuICAgICAgICBjbWQgKz0gdGhpcy5nZW5lcmF0ZVNjcmlwdENvbW1hbmRzKHNjcmlwdHMpO1xuXG4gICAgICAgIGNtZCArPSBcImV4aXQgMFxcblwiO1xuXG4gICAgICAgIGF3YWl0IGZzLm91dHB1dEZpbGUoYCR7dGhpcy5jd2R9Ly5naXRsYWItY2ktbG9jYWwvc2NyaXB0cy8ke3NhZmVKb2JOYW1lfWAsIGNtZCwgXCJ1dGYtOFwiKTtcbiAgICAgICAgYXdhaXQgZnMuY2htb2QoYCR7dGhpcy5jd2R9Ly5naXRsYWItY2ktbG9jYWwvc2NyaXB0cy8ke3NhZmVKb2JOYW1lfWAsIFwiMDc1NVwiKTtcblxuICAgICAgICBpZiAodGhpcy5pbWFnZU5hbWUpIHtcbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKGBkb2NrZXIgY3AgLmdpdGxhYi1jaS1sb2NhbC9zY3JpcHRzLy4gJHt0aGlzLl9jb250YWluZXJJZH06L2djbC1zY3JpcHRzL2AsIHRoaXMuY3dkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNwID0gY2hpbGRQcm9jZXNzLnNwYXduKHRoaXMuX2NvbnRhaW5lcklkID8gYGRvY2tlciBzdGFydCAtLWF0dGFjaCAtaSAke3RoaXMuX2NvbnRhaW5lcklkfWAgOiBcImJhc2hcIiwge1xuICAgICAgICAgICAgc2hlbGw6IFwiYmFzaFwiLFxuICAgICAgICAgICAgc3RkaW86IFtcInBpcGVcIiwgXCJwaXBlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgICAgIGN3ZDogdGhpcy5jd2QsXG4gICAgICAgICAgICBlbnY6IHRoaXMuaW1hZ2VOYW1lID8gey4uLnByb2Nlc3MuZW52fSA6IHsuLi50aGlzLmV4cGFuZGVkVmFyaWFibGVzLCAuLi5yZXBvcnRzRG90ZW52VmFyaWFibGVzLCAuLi5wcm9jZXNzLmVudn0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IG91dEZ1bmMgPSAoZTogYW55LCBzdHJlYW06ICh0eHQ6IHN0cmluZykgPT4gdm9pZCwgY29sb3JpemU6IChzdHI6IHN0cmluZykgPT4gc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hMb25nUnVubmluZ1NpbGVudFRpbWVvdXQod3JpdGVTdHJlYW1zKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBgJHtlfWAuc3BsaXQoL1xccj9cXG4vKSkge1xuICAgICAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzdHJlYW0oYCR7dGhpcy5jaGFsa0pvYk5hbWV9IGApO1xuICAgICAgICAgICAgICAgIGlmICghbGluZS5zdGFydHNXaXRoKFwiXFx1MDAxYlszMm0kXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbShgJHtjb2xvcml6ZShcIj5cIil9IGApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdHJlYW0oYCR7bGluZX1cXG5gKTtcbiAgICAgICAgICAgICAgICBmcy5hcHBlbmRGaWxlU3luYyhvdXRwdXRGaWxlc1BhdGgsIGAke2xpbmV9XFxuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBuZXcgUHJvbWlzZTxudW1iZXI+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNwLnN0ZG91dC5vbihcImRhdGFcIiwgKGUpID0+IG91dEZ1bmMoZSwgd3JpdGVTdHJlYW1zLnN0ZG91dC5iaW5kKHdyaXRlU3RyZWFtcyksIChzKSA9PiBjaGFsa2B7Z3JlZW5CcmlnaHQgJHtzfX1gKSk7XG4gICAgICAgICAgICBjcC5zdGRlcnIub24oXCJkYXRhXCIsIChlKSA9PiBvdXRGdW5jKGUsIHdyaXRlU3RyZWFtcy5zdGRlcnIuYmluZCh3cml0ZVN0cmVhbXMpLCAocykgPT4gY2hhbGtge3JlZEJyaWdodCAke3N9fWApKTtcblxuICAgICAgICAgICAgY3Aub24oXCJleGl0XCIsIChjb2RlKSA9PiBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoY29kZSA/PyAwKSwgMTApKTtcbiAgICAgICAgICAgIGNwLm9uKFwiZXJyb3JcIiwgKGVycikgPT4gc2V0VGltZW91dCgoKSA9PiByZWplY3QoZXJyKSwgMTApKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaW1hZ2VOYW1lKSB7XG4gICAgICAgICAgICAgICAgY3Auc3RkaW4uZW5kKGAvZ2NsLXNjcmlwdHMvJHtzYWZlSm9iTmFtZX1gKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY3Auc3RkaW4uZW5kKGAuLy5naXRsYWItY2ktbG9jYWwvc2NyaXB0cy8ke3NhZmVKb2JOYW1lfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoZXhpdENvZGUgPT0gMCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb3B5Q2FjaGVPdXQod3JpdGVTdHJlYW1zKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29weUFydGlmYWN0c091dCh3cml0ZVN0cmVhbXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV4aXRDb2RlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcHVsbEltYWdlKHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zLCBpbWFnZVRvUHVsbDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHRpbWUgPSBwcm9jZXNzLmhydGltZSgpO1xuICAgICAgICBsZXQgcHVsbENtZCA9IFwiXCI7XG4gICAgICAgIHB1bGxDbWQgKz0gYGRvY2tlciBpbWFnZSBscyAtLWZvcm1hdCAne3suUmVwb3NpdG9yeX19Ont7LlRhZ319JyB8IGdyZXAgLUUgJ14ke2ltYWdlVG9QdWxsfSQnXFxuYDtcbiAgICAgICAgcHVsbENtZCArPSBcImlmIFsgXFxcIiQ/XFxcIiAtbmUgMCBdOyB0aGVuXFxuXCI7XG4gICAgICAgIHB1bGxDbWQgKz0gYFxcdGVjaG8gXCJQdWxsaW5nICR7aW1hZ2VUb1B1bGx9XCJcXG5gO1xuICAgICAgICBwdWxsQ21kICs9IGBcXHRkb2NrZXIgcHVsbCAke2ltYWdlVG9QdWxsfVxcbmA7XG4gICAgICAgIHB1bGxDbWQgKz0gXCJmaVxcblwiO1xuICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihwdWxsQ21kLCB0aGlzLmN3ZCk7XG4gICAgICAgIHRoaXMucmVmcmVzaExvbmdSdW5uaW5nU2lsZW50VGltZW91dCh3cml0ZVN0cmVhbXMpO1xuICAgICAgICBjb25zdCBlbmRUaW1lID0gcHJvY2Vzcy5ocnRpbWUodGltZSk7XG4gICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmNoYWxrSm9iTmFtZX0ge21hZ2VudGFCcmlnaHQgcHVsbGVkfSAke2ltYWdlVG9QdWxsfSBpbiB7bWFnZW50YSAke3ByZXR0eUhydGltZShlbmRUaW1lKX19XFxuYCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBpbml0UHJvZHVjZXJSZXBvcnRzRG90ZW52VmFyaWFibGVzKHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zKSB7XG4gICAgICAgIGNvbnN0IHByb2R1Y2VycyA9IHRoaXMucHJvZHVjZXJzO1xuICAgICAgICBsZXQgcHJvZHVjZXJSZXBvcnRzRW52cyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHByb2R1Y2VyIG9mIHByb2R1Y2VycyA/PyBbXSkge1xuICAgICAgICAgICAgaWYgKHByb2R1Y2VyLmRvdGVudiA9PT0gbnVsbCkgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IHNhZmVQcm9kdWNlck5hbWUgPSBVdGlscy5nZXRTYWZlSm9iTmFtZShwcm9kdWNlci5uYW1lKTtcbiAgICAgICAgICAgIGxldCBkb3RlbnZGaWxlO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnNoZWxsSXNvbGF0aW9uICYmICF0aGlzLmltYWdlTmFtZSkge1xuICAgICAgICAgICAgICAgIGRvdGVudkZpbGUgPSBgJHt0aGlzLmN3ZH0vJHtwcm9kdWNlci5kb3RlbnZ9YDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZG90ZW52RmlsZSA9IGAke3RoaXMuY3dkfS8uZ2l0bGFiLWNpLWxvY2FsL2FydGlmYWN0cy8ke3NhZmVQcm9kdWNlck5hbWV9Ly5naXRsYWItY2ktcmVwb3J0cy9kb3RlbnYvJHtwcm9kdWNlci5kb3RlbnZ9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhd2FpdCBmcy5wYXRoRXhpc3RzKGRvdGVudkZpbGUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvZHVjZXJSZXBvcnRFbnYgPSBkb3RlbnYucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUoZG90ZW52RmlsZSkpO1xuICAgICAgICAgICAgICAgIHByb2R1Y2VyUmVwb3J0c0VudnMgPSB7Li4ucHJvZHVjZXJSZXBvcnRzRW52cywgLi4ucHJvZHVjZXJSZXBvcnRFbnZ9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3RkZXJyKGNoYWxrYCR7dGhpcy5jaGFsa0pvYk5hbWV9IHt5ZWxsb3cgJyR7cHJvZHVjZXIuZG90ZW52fScgcHJvZHVjZWQgYnkgJyR7cHJvZHVjZXIubmFtZX0nIGNvdWxkIG5vdCBiZSBmb3VuZH1cXG5gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9kdWNlclJlcG9ydHNFbnZzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY29weUNhY2hlSW4od3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMpIHtcbiAgICAgICAgaWYgKHRoaXMubW91bnRDYWNoZSAmJiB0aGlzLmltYWdlTmFtZSkgcmV0dXJuO1xuICAgICAgICBpZiAoKCF0aGlzLmltYWdlTmFtZSAmJiAhdGhpcy5zaGVsbElzb2xhdGlvbikgfHwgdGhpcy5jYWNoZS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5jYWNoZSkge1xuICAgICAgICAgICAgaWYgKCFbXCJwdWxsXCIsIFwicHVsbC1wdXNoXCJdLmluY2x1ZGVzKGMucG9saWN5KSkgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCB0aW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlTmFtZSA9IGF3YWl0IGMuZ2V0VW5pcXVlQ2FjaGVOYW1lKHRoaXMuY3dkLCB0aGlzLmV4cGFuZGVkVmFyaWFibGVzKTtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlRm9sZGVyID0gYCR7dGhpcy5jd2R9Ly5naXRsYWItY2ktbG9jYWwvY2FjaGUvJHtjYWNoZU5hbWV9YDtcbiAgICAgICAgICAgIGlmICghYXdhaXQgZnMucGF0aEV4aXN0cyhjYWNoZUZvbGRlcikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYXdhaXQgTXV0ZXguZXhjbHVzaXZlKGNhY2hlTmFtZSwgYXN5bmMoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jb3B5SW4oY2FjaGVGb2xkZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBlbmRUaW1lID0gcHJvY2Vzcy5ocnRpbWUodGltZSk7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5jaGFsa0pvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IGltcG9ydGVkIGNhY2hlICcke2NhY2hlTmFtZX0nfSBpbiB7bWFnZW50YSAke3ByZXR0eUhydGltZShlbmRUaW1lKX19XFxuYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNvcHlBcnRpZmFjdHNJbih3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcykge1xuICAgICAgICBpZiAoKCF0aGlzLmltYWdlTmFtZSAmJiAhdGhpcy5zaGVsbElzb2xhdGlvbikgfHwgKHRoaXMucHJvZHVjZXJzID8/IFtdKS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICBjb25zdCB0aW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9kdWNlciBvZiB0aGlzLnByb2R1Y2VycyA/PyBbXSkge1xuICAgICAgICAgICAgY29uc3QgcHJvZHVjZXJTYWZlTmFtZSA9IFV0aWxzLmdldFNhZmVKb2JOYW1lKHByb2R1Y2VyLm5hbWUpO1xuICAgICAgICAgICAgY29uc3QgYXJ0aWZhY3RGb2xkZXIgPSBgJHt0aGlzLmN3ZH0vLmdpdGxhYi1jaS1sb2NhbC9hcnRpZmFjdHMvJHtwcm9kdWNlclNhZmVOYW1lfWA7XG4gICAgICAgICAgICBpZiAoIWF3YWl0IGZzLnBhdGhFeGlzdHMoYXJ0aWZhY3RGb2xkZXIpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4aXRFcnJvcihgJHthcnRpZmFjdEZvbGRlcn0gZG9lc24ndCBleGlzdCwgZGlkIHlvdSBmb3JnZXQgLS1uZWVkc2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLmNvcHlJbihhcnRpZmFjdEZvbGRlcikpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgY29uc3QgZW5kVGltZSA9IHByb2Nlc3MuaHJ0aW1lKHRpbWUpO1xuICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5jaGFsa0pvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IGltcG9ydGVkIGFydGlmYWN0c30gaW4ge21hZ2VudGEgJHtwcmV0dHlIcnRpbWUoZW5kVGltZSl9fVxcbmApO1xuICAgIH1cblxuICAgIGNvcHlJbihzb3VyY2U6IHN0cmluZykge1xuICAgICAgICBjb25zdCBzYWZlSm9iTmFtZSA9IHRoaXMuc2FmZUpvYk5hbWU7XG4gICAgICAgIGlmICghdGhpcy5pbWFnZU5hbWUgJiYgdGhpcy5zaGVsbElzb2xhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIFV0aWxzLnNwYXduKGByc3luYyAtYSAke3NvdXJjZX0vLiAke3RoaXMuY3dkfS8uZ2l0bGFiLWNpLWxvY2FsL2J1aWxkcy8ke3NhZmVKb2JOYW1lfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBVdGlscy5zcGF3bihgZG9ja2VyIGNwICR7c291cmNlfS8uICR7dGhpcy5fY29udGFpbmVySWR9Oi9idWlsZHMvJHtzYWZlSm9iTmFtZX1gKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNvcHlDYWNoZU91dCh3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcykge1xuICAgICAgICBpZiAodGhpcy5tb3VudENhY2hlICYmIHRoaXMuaW1hZ2VOYW1lKSByZXR1cm47XG4gICAgICAgIGlmICgoIXRoaXMuaW1hZ2VOYW1lICYmICF0aGlzLnNoZWxsSXNvbGF0aW9uKSB8fCB0aGlzLmNhY2hlLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIGxldCB0aW1lLCBlbmRUaW1lO1xuICAgICAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5jYWNoZSkge1xuICAgICAgICAgICAgaWYgKCFbXCJwdXNoXCIsIFwicHVsbC1wdXNoXCJdLmluY2x1ZGVzKGMucG9saWN5KSkgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgY2FjaGVOYW1lID0gYXdhaXQgYy5nZXRVbmlxdWVDYWNoZU5hbWUodGhpcy5jd2QsIHRoaXMuZXhwYW5kZWRWYXJpYWJsZXMpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYXRoIG9mIGMucGF0aHMpIHtcbiAgICAgICAgICAgICAgICB0aW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBleHBhbmRlZFBhdGggPSBVdGlscy5leHBhbmRUZXh0KHBhdGgsIHRoaXMuZXhwYW5kZWRWYXJpYWJsZXMpO1xuICAgICAgICAgICAgICAgIGxldCBjbWQgPSBcInNob3B0IC1zIGdsb2JzdGFyIG51bGxnbG9iIGRvdGdsb2JcXG5cIjtcbiAgICAgICAgICAgICAgICBjbWQgKz0gYG1rZGlyIC1wIC4uLy4uL2NhY2hlLyR7Y2FjaGVOYW1lfVxcbmA7XG4gICAgICAgICAgICAgICAgY21kICs9IGByc3luYyAtUmEgJHtleHBhbmRlZFBhdGh9IC4uLy4uL2NhY2hlLyR7Y2FjaGVOYW1lfS8uIHx8IHRydWVcXG5gO1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgTXV0ZXguZXhjbHVzaXZlKGNhY2hlTmFtZSwgYXN5bmMoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29weU91dChjbWQsIFwiY2FjaGVcIiwgW10pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGVuZFRpbWUgPSBwcm9jZXNzLmhydGltZSh0aW1lKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWRkaXIgPSBhd2FpdCBmcy5yZWFkZGlyKGAke3RoaXMuY3dkfS8uZ2l0bGFiLWNpLWxvY2FsL2NhY2hlLyR7Y2FjaGVOYW1lfWApO1xuICAgICAgICAgICAgICAgIGlmIChyZWFkZGlyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5jaGFsa0pvYk5hbWV9IHt5ZWxsb3cgISEgbm8gY2FjaGUgd2FzIGNvcGllZCBmb3IgJHtwYXRofSAhIX1cXG5gKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5jaGFsa0pvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IGV4cG9ydGVkIGNhY2hlICR7ZXhwYW5kZWRQYXRofSAnJHtjYWNoZU5hbWV9J30gaW4ge21hZ2VudGEgJHtwcmV0dHlIcnRpbWUoZW5kVGltZSl9fVxcbmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY29weUFydGlmYWN0c091dCh3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcykge1xuICAgICAgICBjb25zdCBzYWZlSm9iTmFtZSA9IHRoaXMuc2FmZUpvYk5hbWU7XG5cbiAgICAgICAgaWYgKCF0aGlzLnNoZWxsSXNvbGF0aW9uICYmICF0aGlzLmltYWdlTmFtZSB8fCAhdGhpcy5hcnRpZmFjdHMpIHJldHVybjtcblxuICAgICAgICBsZXQgdGltZSwgZW5kVGltZTtcbiAgICAgICAgbGV0IGNwQ21kID0gXCJzaG9wdCAtcyBnbG9ic3RhciBudWxsZ2xvYiBkb3RnbG9iXFxuXCI7XG4gICAgICAgIGNwQ21kICs9IGBta2RpciAtcCAuLi8uLi9hcnRpZmFjdHMvJHtzYWZlSm9iTmFtZX1cXG5gO1xuICAgICAgICBmb3IgKGNvbnN0IGFydGlmYWN0UGF0aCBvZiB0aGlzLmFydGlmYWN0cz8ucGF0aHMgPz8gW10pIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cGFuZGVkUGF0aCA9IFV0aWxzLmV4cGFuZFRleHQoYXJ0aWZhY3RQYXRoLCB0aGlzLmV4cGFuZGVkVmFyaWFibGVzKTtcbiAgICAgICAgICAgIGNwQ21kICs9IGByc3luYyAtUmEgJHtleHBhbmRlZFBhdGh9IC4uLy4uL2FydGlmYWN0cy8ke3NhZmVKb2JOYW1lfS8uIHx8IHRydWVcXG5gO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBhcnRpZmFjdEV4Y2x1ZGVQYXRoIG9mIHRoaXMuYXJ0aWZhY3RzPy5leGNsdWRlID8/IFtdKSB7XG4gICAgICAgICAgICBjb25zdCBleHBhbmRlZFBhdGggPSBVdGlscy5leHBhbmRUZXh0KGFydGlmYWN0RXhjbHVkZVBhdGgsIHRoaXMuZXhwYW5kZWRWYXJpYWJsZXMpO1xuICAgICAgICAgICAgY3BDbWQgKz0gYGxzIC0xZCAnLi4vLi4vYXJ0aWZhY3RzLyR7c2FmZUpvYk5hbWV9LyR7ZXhwYW5kZWRQYXRofScgfCB4YXJncyAtbjEgcm0gLXJmIHx8IHRydWVcXG5gO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVwb3J0RG90ZW52ID0gdGhpcy5hcnRpZmFjdHMucmVwb3J0cz8uZG90ZW52ID8/IG51bGw7XG4gICAgICAgIGlmIChyZXBvcnREb3RlbnYgIT0gbnVsbCkge1xuICAgICAgICAgICAgY3BDbWQgKz0gYG1rZGlyIC1wIC4uLy4uL2FydGlmYWN0cy8ke3NhZmVKb2JOYW1lfS8uZ2l0bGFiLWNpLXJlcG9ydHMvZG90ZW52XFxuYDtcbiAgICAgICAgICAgIGNwQ21kICs9IGByc3luYyAtUmEgJHtyZXBvcnREb3RlbnZ9IC4uLy4uL2FydGlmYWN0cy8ke3NhZmVKb2JOYW1lfS8uZ2l0bGFiLWNpLXJlcG9ydHMvZG90ZW52Ly5cXG5gO1xuICAgICAgICB9XG5cbiAgICAgICAgdGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgICAgIGNvbnN0IGRvY2tlckNtZEV4dHJhcyA9IHRoaXMubW91bnRDYWNoZSA/IFthd2FpdCB0aGlzLm1vdW50Q2FjaGVDbWQodGhpcy5zYWZlSm9iTmFtZSwgd3JpdGVTdHJlYW1zKV0gOiBbXTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb3B5T3V0KGNwQ21kLCBcImFydGlmYWN0c1wiLCBkb2NrZXJDbWRFeHRyYXMpO1xuICAgICAgICBlbmRUaW1lID0gcHJvY2Vzcy5ocnRpbWUodGltZSk7XG5cbiAgICAgICAgY29uc3QgcmVhZGRpciA9IGF3YWl0IGZzLnJlYWRkaXIoYCR7dGhpcy5jd2R9Ly5naXRsYWItY2ktbG9jYWwvYXJ0aWZhY3RzLyR7c2FmZUpvYk5hbWV9YCk7XG4gICAgICAgIGlmIChyZWFkZGlyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuY2hhbGtKb2JOYW1lfSB7eWVsbG93ICEhIG5vIGFydGlmYWN0cyB3YXMgY29waWVkICEhfVxcbmApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuY2hhbGtKb2JOYW1lfSB7bWFnZW50YUJyaWdodCBleHBvcnRlZCBhcnRpZmFjdHN9IGluIHttYWdlbnRhICR7cHJldHR5SHJ0aW1lKGVuZFRpbWUpfX1cXG5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFydGlmYWN0c1RvU291cmNlKSB7XG4gICAgICAgICAgICB0aW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKGByc3luYyAtLWV4Y2x1ZGU9Ly5naXRsYWItY2ktcmVwb3J0cy8gLWEgJHt0aGlzLmN3ZH0vLmdpdGxhYi1jaS1sb2NhbC9hcnRpZmFjdHMvJHtzYWZlSm9iTmFtZX0vLiAke3RoaXMuY3dkfWApO1xuICAgICAgICAgICAgaWYgKHJlcG9ydERvdGVudiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oYHJzeW5jIC1hICR7dGhpcy5jd2R9Ly5naXRsYWItY2ktbG9jYWwvYXJ0aWZhY3RzLyR7c2FmZUpvYk5hbWV9Ly5naXRsYWItY2ktcmVwb3J0cy9kb3RlbnYvLiAke3RoaXMuY3dkfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW5kVGltZSA9IHByb2Nlc3MuaHJ0aW1lKHRpbWUpO1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuY2hhbGtKb2JOYW1lfSB7bWFnZW50YUJyaWdodCBjb3BpZWQgYXJ0aWZhY3RzIHRvIGN3ZH0gaW4ge21hZ2VudGEgJHtwcmV0dHlIcnRpbWUoZW5kVGltZSl9fVxcbmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjb3B5T3V0KGNtZDogc3RyaW5nLCB0eXBlOiBcImFydGlmYWN0c1wiIHwgXCJjYWNoZVwiLCBkb2NrZXJDbWRFeHRyYXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGNvbnN0IHNhZmVKb2JOYW1lID0gdGhpcy5zYWZlSm9iTmFtZTtcbiAgICAgICAgY29uc3QgYnVpbGRWb2x1bWVOYW1lID0gdGhpcy5idWlsZFZvbHVtZU5hbWU7XG5cbiAgICAgICAgYXdhaXQgZnMubWtkaXJwKGAke3RoaXMuY3dkfS8uZ2l0bGFiLWNpLWxvY2FsLyR7dHlwZX1gKTtcblxuICAgICAgICBpZiAodGhpcy5pbWFnZU5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHtzdGRvdXQ6IGNpZH0gPSBhd2FpdCBVdGlscy5zcGF3bihgZG9ja2VyIGNyZWF0ZSAtaSAke2RvY2tlckNtZEV4dHJhcy5qb2luKFwiIFwiKX0gLXYgJHtidWlsZFZvbHVtZU5hbWV9Oi9idWlsZHMvJHtzYWZlSm9iTmFtZX0vIC13IC9idWlsZHMvJHtzYWZlSm9iTmFtZX0vIGZpcmVjb3cvZ2l0bGFiLWNpLWxvY2FsLXV0aWwgYmFzaCAtYyBcIiR7Y21kfVwiYCwgdGhpcy5jd2QpO1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVySWQgPSBjaWQucmVwbGFjZSgvXFxyP1xcbi9nLCBcIlwiKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lcnNUb0NsZWFuLnB1c2goY29udGFpbmVySWQpO1xuICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oYGRvY2tlciBzdGFydCAke2NvbnRhaW5lcklkfSAtLWF0dGFjaGApO1xuICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oYGRvY2tlciBjcCAke2NvbnRhaW5lcklkfTovJHt0eXBlfS8uIC5naXRsYWItY2ktbG9jYWwvJHt0eXBlfS8uYCwgdGhpcy5jd2QpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2hlbGxJc29sYXRpb24pIHtcbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKGBiYXNoIC1lbyBwaXBlZmFpbCAtYyBcIiR7Y21kfVwiYCwgYCR7dGhpcy5jd2R9Ly5naXRsYWItY2ktbG9jYWwvYnVpbGRzLyR7c2FmZUpvYk5hbWV9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZnJlc2hMb25nUnVubmluZ1NpbGVudFRpbWVvdXQod3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2xvbmdSdW5uaW5nU2lsZW50VGltZW91dCk7XG4gICAgICAgIHRoaXMuX2xvbmdSdW5uaW5nU2lsZW50VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuY2hhbGtKb2JOYW1lfSB7Z3JleSA+IHN0aWxsIHJ1bm5pbmcuLi59XFxuYCk7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hMb25nUnVubmluZ1NpbGVudFRpbWVvdXQod3JpdGVTdHJlYW1zKTtcbiAgICAgICAgfSwgMTAwMDApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RXhpdGVkU3RyaW5nKHN0YXJ0VGltZTogW251bWJlciwgbnVtYmVyXSwgY29kZTogbnVtYmVyLCB3YXJuaW5nID0gZmFsc2UsIHByZXBlbmRTdHJpbmcgPSBcIlwiKSB7XG4gICAgICAgIGNvbnN0IGZpbmlzaGVkU3RyID0gdGhpcy5nZXRGaW5pc2hlZFN0cmluZyhzdGFydFRpbWUpO1xuICAgICAgICBpZiAod2FybmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGNoYWxrYCR7ZmluaXNoZWRTdHJ9IHtibGFjay5iZ1llbGxvd0JyaWdodCAgV0FSTiAke2NvZGUudG9TdHJpbmcoKX0gfSR7cHJlcGVuZFN0cmluZ31gO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNoYWxrYCR7ZmluaXNoZWRTdHJ9IHtibGFjay5iZ1JlZCAgRkFJTCAke2NvZGUudG9TdHJpbmcoKX0gfSAke3ByZXBlbmRTdHJpbmd9YDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEZpbmlzaGVkU3RyaW5nKHN0YXJ0VGltZTogW251bWJlciwgbnVtYmVyXSkge1xuICAgICAgICBjb25zdCBlbmRUaW1lID0gcHJvY2Vzcy5ocnRpbWUoc3RhcnRUaW1lKTtcbiAgICAgICAgY29uc3QgdGltZVN0ciA9IHByZXR0eUhydGltZShlbmRUaW1lKTtcbiAgICAgICAgcmV0dXJuIGNoYWxrYCR7dGhpcy5jaGFsa0pvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IGZpbmlzaGVkfSBpbiB7bWFnZW50YSAke3RpbWVTdHJ9fWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVEb2NrZXJOZXR3b3JrKG5ldHdvcmtOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qge3N0ZG91dDogbmV0d29ya0lkfSA9IGF3YWl0IFV0aWxzLnNwYXduKGBkb2NrZXIgbmV0d29yayBjcmVhdGUgJHtuZXR3b3JrTmFtZX1gKTtcbiAgICAgICAgdGhpcy5fc2VydmljZU5ldHdvcmtJZCA9IG5ldHdvcmtJZC5yZXBsYWNlKC9cXHI/XFxuL2csIFwiXCIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc3RhcnRTZXJ2aWNlKHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zLCBzZXJ2aWNlOiBTZXJ2aWNlLCBwcml2aWxlZ2VkOiBib29sZWFuKSB7XG4gICAgICAgIGxldCBkb2NrZXJDbWQgPSBgZG9ja2VyIHJ1biAtZCAtLW5ldHdvcmsgZ2l0bGFiLWNpLWxvY2FsLSR7dGhpcy5qb2JJZH0gYDtcblxuICAgICAgICBpZiAocHJpdmlsZWdlZCkge1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiLS1wcml2aWxlZ2VkIFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgKHNlcnZpY2UuZ2V0RW50cnlwb2ludCgpID8/IFtdKS5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tZW50cnlwb2ludCBcIiR7ZX1cIiBgO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgc2VydmljZUFsaWFzID0gc2VydmljZS5nZXRBbGlhcyh0aGlzLmV4cGFuZGVkVmFyaWFibGVzKTtcbiAgICAgICAgY29uc3Qgc2VydmljZU5hbWUgPSBzZXJ2aWNlLmdldE5hbWUodGhpcy5leHBhbmRlZFZhcmlhYmxlcyk7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VOYW1lV2l0aG91dFZlcnNpb24gPSBzZXJ2aWNlTmFtZS5yZXBsYWNlKC8oLiopKDouKikvLCBcIiQxXCIpO1xuICAgICAgICBjb25zdCBhbGlhc2VzID0gW3NlcnZpY2VOYW1lV2l0aG91dFZlcnNpb24ucmVwbGFjZShcIi9cIiwgXCItXCIpLCBzZXJ2aWNlTmFtZVdpdGhvdXRWZXJzaW9uLnJlcGxhY2UoXCIvXCIsIFwiX19cIildO1xuICAgICAgICBpZiAoc2VydmljZUFsaWFzKSB7XG4gICAgICAgICAgICBhbGlhc2VzLnB1c2goc2VydmljZUFsaWFzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcihjb25zdCBhbGlhcyBvZiBhbGlhc2VzKSB7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tbmV0d29yay1hbGlhcz0ke2FsaWFzfSBgO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5leHBhbmRlZFZhcmlhYmxlcykpIHtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLWUgJHtrZXl9PVwiJHtTdHJpbmcodmFsdWUpLnRyaW0oKX1cIiBgO1xuICAgICAgICB9XG5cbiAgICAgICAgZG9ja2VyQ21kICs9IGAke3NlcnZpY2VOYW1lfWA7XG4gICAgICAgIGNvbnN0IGNvbW1hbmQgPSBzZXJ2aWNlLmdldENvbW1hbmQodGhpcy5leHBhbmRlZFZhcmlhYmxlcyk7XG4gICAgICAgIGlmIChjb21tYW5kKSB7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gYCAke2NvbW1hbmR9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpbWUgPSBwcm9jZXNzLmhydGltZSgpO1xuICAgICAgICBjb25zdCB7c3Rkb3V0OiBjb250YWluZXJJZH0gPSBhd2FpdCBVdGlscy5zcGF3bihkb2NrZXJDbWQsIHRoaXMuY3dkKTtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyc1RvQ2xlYW4ucHVzaChjb250YWluZXJJZC5yZXBsYWNlKC9cXHI/XFxuL2csIFwiXCIpKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoTG9uZ1J1bm5pbmdTaWxlbnRUaW1lb3V0KHdyaXRlU3RyZWFtcyk7XG4gICAgICAgIGNvbnN0IGVuZFRpbWUgPSBwcm9jZXNzLmhydGltZSh0aW1lKTtcbiAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuY2hhbGtKb2JOYW1lfSB7bWFnZW50YUJyaWdodCBzdGFydGVkIHNlcnZpY2UgaW1hZ2U6ICR7c2VydmljZU5hbWV9IHdpdGggYWxpYXNlczogJHthbGlhc2VzLmpvaW4oXCIsIFwiKX19IGluIHttYWdlbnRhICR7cHJldHR5SHJ0aW1lKGVuZFRpbWUpfX1cXG5gKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHNlcnZpY2VIZWFsdGhDaGVjayh3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcywgc2VydmljZTogU2VydmljZSkge1xuICAgICAgICBjb25zdCBkb2NrZXJJbnNwZWN0Q21kID0gYGRvY2tlciBpbnNwZWN0ICR7c2VydmljZS5nZXROYW1lKHRoaXMuZXhwYW5kZWRWYXJpYWJsZXMpfWA7XG4gICAgICAgIGNvbnN0IHtzdGRvdXQ6IGltYWdlRGV0YWlsc30gPSBhd2FpdCBVdGlscy5zcGF3bihkb2NrZXJJbnNwZWN0Q21kLCB0aGlzLmN3ZCk7XG4gICAgICAgIGNvbnN0IGltYWdlRGV0YWlsT2JqID0gSlNPTi5wYXJzZShpbWFnZURldGFpbHMpO1xuXG4gICAgICAgIC8vIENvcGllZCBmcm9tIHRoZSBzdGFydFNlcnZpY2UgYmxvY2suIEltcG9ydGFudCB0aGluZyBpcyB0aGF0IHRoZSBhbGlhc2VzIG1hdGNoXG4gICAgICAgIGNvbnN0IHNlcnZpY2VBbGlhcyA9IHNlcnZpY2UuZ2V0QWxpYXModGhpcy5leHBhbmRlZFZhcmlhYmxlcyk7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VOYW1lID0gc2VydmljZS5nZXROYW1lKHRoaXMuZXhwYW5kZWRWYXJpYWJsZXMpO1xuICAgICAgICBjb25zdCBzZXJ2aWNlTmFtZVdpdGhvdXRWZXJzaW9uID0gc2VydmljZU5hbWUucmVwbGFjZSgvKC4qKSg6LiopLywgXCIkMVwiKTtcbiAgICAgICAgY29uc3QgYWxpYXNlcyA9IFtzZXJ2aWNlTmFtZVdpdGhvdXRWZXJzaW9uLnJlcGxhY2UoXCIvXCIsIFwiLVwiKSwgc2VydmljZU5hbWVXaXRob3V0VmVyc2lvbi5yZXBsYWNlKFwiL1wiLCBcIl9fXCIpXTtcbiAgICAgICAgaWYgKHNlcnZpY2VBbGlhcykge1xuICAgICAgICAgICAgYWxpYXNlcy5wdXNoKHNlcnZpY2VBbGlhcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgZWFjaCBwb3J0IGRlZmluZWQgaW4gdGhlIGltYWdlLCBhbmQgdHJ5IHRvIGNvbm5lY3QgdG8gdGhlIGFsaWFzXG4gICAgICAgIGZvcihjb25zdCBwb3J0IG9mIE9iamVjdC5rZXlzKGltYWdlRGV0YWlsT2JqWzBdLkNvbnRhaW5lckNvbmZpZy5FeHBvc2VkUG9ydHMpKSB7XG4gICAgICAgICAgICBpZihwb3J0LmVuZHNXaXRoKFwiL3RjcFwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvcnROdW0gPSBwYXJzZUludChwb3J0LnJlcGxhY2UoXCIvdGNwXCIsIFwiXCIpKTtcblxuICAgICAgICAgICAgICAgIGxldCBkb2NrZXJDbWQgPSBgZG9ja2VyIHJ1biAtZCAtLW5ldHdvcmsgZ2l0bGFiLWNpLWxvY2FsLSR7dGhpcy5qb2JJZH0gYDtcblxuICAgICAgICAgICAgICAgIGRvY2tlckNtZCArPSBgIHdpbGx3aWxsL3dhaXQtZm9yLWl0IFwiJHthbGlhc2VzWzBdfToke3BvcnROdW19XCIgLXQgMzBgO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWUgPSBwcm9jZXNzLmhydGltZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHtzdGF0dXM6IHJlc3VsdCwgc3Rkb3V0fSA9IGF3YWl0IFV0aWxzLnNwYXduKGRvY2tlckNtZCwgdGhpcy5jd2QpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lcnNUb0NsZWFuLnB1c2goc3Rkb3V0LnJlcGxhY2UoL1xccj9cXG4vZywgXCJcIikpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuZFRpbWUgPSBwcm9jZXNzLmhydGltZSh0aW1lKTtcbiAgICAgICAgICAgICAgICBpZihyZXN1bHQgPT0gMCl7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmNoYWxrSm9iTmFtZX0ge2dyZWVuQnJpZ2h0IHNlcnZpY2UgaW1hZ2U6ICR7c2VydmljZU5hbWV9IGhlYWx0aGNoZWNrIHBhc3NlZDogJHthbGlhc2VzWzBdfToke3BvcnROdW19fSBpbiB7Z3JlZW4gJHtwcmV0dHlIcnRpbWUoZW5kVGltZSl9fVxcbmApO1xuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5jaGFsa0pvYk5hbWV9IHtyZWRCcmlnaHQgc2VydmljZSBpbWFnZTogJHtzZXJ2aWNlTmFtZX0gaGVhbHRoY2hlY2sgZmFpbGVkOiAke2FsaWFzZXNbMF19OiR7cG9ydE51bX19IGluIHtyZWQgJHtwcmV0dHlIcnRpbWUoZW5kVGltZSl9fVxcbmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
|