@tscircuit/cli 0.1.31 → 0.1.33
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/bun.lock +214 -126
- package/cli/export/register.ts +18 -2
- package/cli/init/register.ts +4 -6
- package/dist/main.js +147 -104
- package/lib/shared/generate-gitignore-file.ts +35 -0
- package/lib/shared/generate-ts-config.ts +3 -8
- package/package.json +3 -1
- package/tests/cli/export/__snapshots__/pcb.snap.svg +13 -0
- package/tests/cli/export/__snapshots__/schematic.snap.svg +17 -0
- package/tests/cli/export/export.test.ts +62 -0
package/dist/main.js
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
import { Command } from "commander";
|
|
5
5
|
|
|
6
6
|
// cli/init/register.ts
|
|
7
|
-
import * as
|
|
8
|
-
import * as
|
|
7
|
+
import * as fs4 from "node:fs";
|
|
8
|
+
import * as path4 from "node:path";
|
|
9
9
|
|
|
10
10
|
// lib/shared/detect-pkg-manager.ts
|
|
11
11
|
import fs from "fs";
|
|
@@ -54,8 +54,20 @@ function setupTsciProject(directory = process.cwd(), dependencies = ["@types/rea
|
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
// lib/shared/generate-ts-config.ts
|
|
57
|
-
import path2 from "path";
|
|
57
|
+
import path2 from "node:path";
|
|
58
|
+
|
|
59
|
+
// lib/shared/write-file-if-not-exists.ts
|
|
58
60
|
import fs3 from "fs";
|
|
61
|
+
var writeFileIfNotExists = (filePath, content) => {
|
|
62
|
+
if (!fs3.existsSync(filePath)) {
|
|
63
|
+
fs3.writeFileSync(filePath, content.trimStart(), "utf-8");
|
|
64
|
+
console.info(`Created: ${filePath}`);
|
|
65
|
+
} else {
|
|
66
|
+
console.info(`Skipped: ${filePath} already exists`);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
// lib/shared/generate-ts-config.ts
|
|
59
71
|
var generateTsConfig = (dir) => {
|
|
60
72
|
const tsconfigPath = path2.join(dir, "tsconfig.json");
|
|
61
73
|
const tsconfigContent = JSON.stringify(
|
|
@@ -79,23 +91,41 @@ var generateTsConfig = (dir) => {
|
|
|
79
91
|
null,
|
|
80
92
|
2
|
|
81
93
|
);
|
|
82
|
-
|
|
83
|
-
fs3.writeFileSync(tsconfigPath, tsconfigContent.trimStart());
|
|
84
|
-
console.log(`Created: ${tsconfigPath}`);
|
|
85
|
-
} else {
|
|
86
|
-
console.log(`Skipped: ${tsconfigPath} already exists`);
|
|
87
|
-
}
|
|
94
|
+
writeFileIfNotExists(tsconfigPath, tsconfigContent);
|
|
88
95
|
};
|
|
89
96
|
|
|
90
|
-
// lib/shared/
|
|
91
|
-
import
|
|
92
|
-
var
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
97
|
+
// lib/shared/generate-gitignore-file.ts
|
|
98
|
+
import path3 from "node:path";
|
|
99
|
+
var generateGitIgnoreFile = (dir) => {
|
|
100
|
+
const gitignorePath = path3.join(dir, ".gitignore");
|
|
101
|
+
const gitignoreContent = `# Dependencies
|
|
102
|
+
node_modules/
|
|
103
|
+
|
|
104
|
+
# Build output
|
|
105
|
+
dist/
|
|
106
|
+
build/
|
|
107
|
+
|
|
108
|
+
# Environment variables
|
|
109
|
+
.env
|
|
110
|
+
.env.local
|
|
111
|
+
.env.*.local
|
|
112
|
+
|
|
113
|
+
# IDE files
|
|
114
|
+
.vscode/
|
|
115
|
+
.idea/
|
|
116
|
+
*.swp
|
|
117
|
+
*.swo
|
|
118
|
+
|
|
119
|
+
# OS files
|
|
120
|
+
.DS_Store
|
|
121
|
+
Thumbs.db
|
|
122
|
+
|
|
123
|
+
# Debug logs
|
|
124
|
+
npm-debug.log*
|
|
125
|
+
yarn-debug.log*
|
|
126
|
+
yarn-error.log*
|
|
127
|
+
`;
|
|
128
|
+
writeFileIfNotExists(gitignorePath, gitignoreContent);
|
|
99
129
|
};
|
|
100
130
|
|
|
101
131
|
// cli/init/register.ts
|
|
@@ -106,10 +136,10 @@ var registerInit = (program2) => {
|
|
|
106
136
|
"[directory]",
|
|
107
137
|
"Directory name (optional, defaults to current directory)"
|
|
108
138
|
).action((directory) => {
|
|
109
|
-
const projectDir = directory ?
|
|
110
|
-
|
|
139
|
+
const projectDir = directory ? path4.resolve(process.cwd(), directory) : process.cwd();
|
|
140
|
+
fs4.mkdirSync(projectDir, { recursive: true });
|
|
111
141
|
writeFileIfNotExists(
|
|
112
|
-
|
|
142
|
+
path4.join(projectDir, "index.tsx"),
|
|
113
143
|
`
|
|
114
144
|
import "@tscircuit/core";
|
|
115
145
|
|
|
@@ -123,7 +153,7 @@ export default () => (
|
|
|
123
153
|
`
|
|
124
154
|
);
|
|
125
155
|
writeFileIfNotExists(
|
|
126
|
-
|
|
156
|
+
path4.join(projectDir, ".npmrc"),
|
|
127
157
|
`
|
|
128
158
|
@tsci:registry=https://npm.tscircuit.com
|
|
129
159
|
`
|
|
@@ -134,12 +164,8 @@ export default () => (
|
|
|
134
164
|
console.error("Failed to install dependencies:", error);
|
|
135
165
|
process.exit(1);
|
|
136
166
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
} catch (error) {
|
|
140
|
-
console.error("Failed to generate tsconfig.json:", error);
|
|
141
|
-
process.exit(1);
|
|
142
|
-
}
|
|
167
|
+
generateTsConfig(projectDir);
|
|
168
|
+
generateGitIgnoreFile(projectDir);
|
|
143
169
|
console.info(
|
|
144
170
|
`\u{1F389} Initialization complete! Run ${directory ? `"cd ${directory}" & ` : ""}"tsci dev" to start developing.`
|
|
145
171
|
);
|
|
@@ -148,15 +174,15 @@ export default () => (
|
|
|
148
174
|
};
|
|
149
175
|
|
|
150
176
|
// cli/dev/register.ts
|
|
151
|
-
import * as
|
|
152
|
-
import * as
|
|
177
|
+
import * as path10 from "node:path";
|
|
178
|
+
import * as fs11 from "node:fs";
|
|
153
179
|
|
|
154
180
|
// lib/dependency-analysis/installNodeModuleTypesForSnippet.ts
|
|
155
|
-
import * as
|
|
156
|
-
import * as
|
|
181
|
+
import * as fs5 from "node:fs";
|
|
182
|
+
import * as path5 from "node:path";
|
|
157
183
|
import * as ts from "typescript";
|
|
158
184
|
async function installNodeModuleTypesForSnippet(snippetPath) {
|
|
159
|
-
const content =
|
|
185
|
+
const content = fs5.readFileSync(snippetPath, "utf-8");
|
|
160
186
|
const sourceFile = ts.createSourceFile(
|
|
161
187
|
snippetPath,
|
|
162
188
|
content,
|
|
@@ -177,12 +203,12 @@ async function installNodeModuleTypesForSnippet(snippetPath) {
|
|
|
177
203
|
ts.forEachChild(node, visit);
|
|
178
204
|
}
|
|
179
205
|
visit(sourceFile);
|
|
180
|
-
let projectRoot =
|
|
181
|
-
while (projectRoot !==
|
|
182
|
-
if (
|
|
206
|
+
let projectRoot = path5.dirname(snippetPath);
|
|
207
|
+
while (projectRoot !== path5.parse(projectRoot).root) {
|
|
208
|
+
if (fs5.existsSync(path5.join(projectRoot, "package.json"))) {
|
|
183
209
|
break;
|
|
184
210
|
}
|
|
185
|
-
projectRoot =
|
|
211
|
+
projectRoot = path5.dirname(projectRoot);
|
|
186
212
|
}
|
|
187
213
|
for (const importPath of imports) {
|
|
188
214
|
const [owner, name] = importPath.replace("@tsci/", "").split(".");
|
|
@@ -196,14 +222,14 @@ async function installNodeModuleTypesForSnippet(snippetPath) {
|
|
|
196
222
|
}
|
|
197
223
|
const data = await response.json();
|
|
198
224
|
if (data.snippet.dts) {
|
|
199
|
-
const packageDir =
|
|
225
|
+
const packageDir = path5.join(
|
|
200
226
|
projectRoot,
|
|
201
227
|
"node_modules",
|
|
202
228
|
"@tsci",
|
|
203
229
|
`${owner}.${name}`
|
|
204
230
|
);
|
|
205
|
-
|
|
206
|
-
|
|
231
|
+
fs5.mkdirSync(packageDir, { recursive: true });
|
|
232
|
+
fs5.writeFileSync(path5.join(packageDir, "index.d.ts"), data.snippet.dts);
|
|
207
233
|
}
|
|
208
234
|
} catch (error) {
|
|
209
235
|
console.warn(`Error fetching types for ${importPath}:`, error);
|
|
@@ -216,8 +242,8 @@ import ky2 from "ky";
|
|
|
216
242
|
|
|
217
243
|
// lib/server/createHttpServer.ts
|
|
218
244
|
import * as http from "node:http";
|
|
219
|
-
import * as
|
|
220
|
-
import * as
|
|
245
|
+
import * as fs6 from "node:fs";
|
|
246
|
+
import * as path6 from "node:path";
|
|
221
247
|
import { getNodeHandler } from "winterspec/adapters/node";
|
|
222
248
|
|
|
223
249
|
// package.json
|
|
@@ -225,7 +251,7 @@ var package_default = {
|
|
|
225
251
|
name: "@tscircuit/cli",
|
|
226
252
|
main: "dist/main.js",
|
|
227
253
|
type: "module",
|
|
228
|
-
version: "0.1.
|
|
254
|
+
version: "0.1.32",
|
|
229
255
|
bin: {
|
|
230
256
|
tsci: "./dist/main.js"
|
|
231
257
|
},
|
|
@@ -257,7 +283,9 @@ var package_default = {
|
|
|
257
283
|
"@tscircuit/eval": "^0.0.96",
|
|
258
284
|
"@tscircuit/file-server": "^0.0.13",
|
|
259
285
|
"@tscircuit/runframe": "^0.0.167",
|
|
286
|
+
"bun-match-svg": "^0.0.9",
|
|
260
287
|
chokidar: "4.0.1",
|
|
288
|
+
"circuit-to-svg": "^0.0.101",
|
|
261
289
|
commander: "^12.1.0",
|
|
262
290
|
configstore: "^7.0.0",
|
|
263
291
|
cosmiconfig: "^9.0.0",
|
|
@@ -296,13 +324,13 @@ var createHttpServer = async (port = 3020) => {
|
|
|
296
324
|
const server = http.createServer(async (req, res) => {
|
|
297
325
|
const url = new URL(req.url, `http://${req.headers.host}`);
|
|
298
326
|
if (url.pathname === "/standalone.min.js") {
|
|
299
|
-
const standaloneFilePath = process.env.RUNFRAME_STANDALONE_FILE_PATH ||
|
|
327
|
+
const standaloneFilePath = process.env.RUNFRAME_STANDALONE_FILE_PATH || path6.resolve(
|
|
300
328
|
process.cwd(),
|
|
301
329
|
"node_modules",
|
|
302
330
|
"@tscircuit/runframe/dist/standalone.min.js"
|
|
303
331
|
);
|
|
304
332
|
try {
|
|
305
|
-
const content =
|
|
333
|
+
const content = fs6.readFileSync(standaloneFilePath, "utf8");
|
|
306
334
|
res.writeHead(200, {
|
|
307
335
|
"Content-Type": "application/javascript; charset=utf-8"
|
|
308
336
|
});
|
|
@@ -391,19 +419,19 @@ var EventsWatcher = class extends EventEmitter {
|
|
|
391
419
|
};
|
|
392
420
|
|
|
393
421
|
// cli/dev/DevServer.ts
|
|
394
|
-
import
|
|
395
|
-
import
|
|
422
|
+
import path9 from "node:path";
|
|
423
|
+
import fs10 from "node:fs";
|
|
396
424
|
import * as chokidar from "chokidar";
|
|
397
425
|
|
|
398
426
|
// lib/dependency-analysis/FilesystemTypesHandler.ts
|
|
399
|
-
import * as
|
|
400
|
-
import * as
|
|
427
|
+
import * as fs8 from "node:fs";
|
|
428
|
+
import * as path7 from "node:path";
|
|
401
429
|
|
|
402
430
|
// lib/dependency-analysis/findImportsInSnippet.ts
|
|
403
|
-
import * as
|
|
431
|
+
import * as fs7 from "node:fs";
|
|
404
432
|
import * as ts2 from "typescript";
|
|
405
433
|
function findImportsInSnippet(snippetPath) {
|
|
406
|
-
const content =
|
|
434
|
+
const content = fs7.readFileSync(snippetPath, "utf-8");
|
|
407
435
|
const sourceFile = ts2.createSourceFile(
|
|
408
436
|
snippetPath,
|
|
409
437
|
content,
|
|
@@ -462,22 +490,22 @@ var FilesystemTypesHandler = class {
|
|
|
462
490
|
if (!importPath.startsWith("@tsci/")) return true;
|
|
463
491
|
const pathWithoutPrefix = importPath.replace("@tsci/", "");
|
|
464
492
|
const [owner, name] = pathWithoutPrefix.split(".");
|
|
465
|
-
const typePath =
|
|
493
|
+
const typePath = path7.join(
|
|
466
494
|
this.projectRoot,
|
|
467
495
|
"node_modules",
|
|
468
496
|
"@tsci",
|
|
469
497
|
`${owner}.${name}`,
|
|
470
498
|
"index.d.ts"
|
|
471
499
|
);
|
|
472
|
-
return
|
|
500
|
+
return fs8.existsSync(typePath);
|
|
473
501
|
}
|
|
474
502
|
findProjectRoot(startDir) {
|
|
475
|
-
let root =
|
|
476
|
-
while (root !==
|
|
477
|
-
if (
|
|
503
|
+
let root = path7.resolve(startDir);
|
|
504
|
+
while (root !== path7.parse(root).root) {
|
|
505
|
+
if (fs8.existsSync(path7.join(root, "package.json"))) {
|
|
478
506
|
return root;
|
|
479
507
|
}
|
|
480
|
-
root =
|
|
508
|
+
root = path7.dirname(root);
|
|
481
509
|
}
|
|
482
510
|
return startDir;
|
|
483
511
|
}
|
|
@@ -527,8 +555,8 @@ var getKy = () => {
|
|
|
527
555
|
};
|
|
528
556
|
|
|
529
557
|
// lib/shared/push-snippet.ts
|
|
530
|
-
import * as
|
|
531
|
-
import * as
|
|
558
|
+
import * as fs9 from "node:fs";
|
|
559
|
+
import * as path8 from "node:path";
|
|
532
560
|
import semver from "semver";
|
|
533
561
|
var pushSnippet = async ({
|
|
534
562
|
filePath,
|
|
@@ -543,10 +571,10 @@ var pushSnippet = async ({
|
|
|
543
571
|
}
|
|
544
572
|
let snippetFilePath = null;
|
|
545
573
|
if (filePath) {
|
|
546
|
-
snippetFilePath =
|
|
574
|
+
snippetFilePath = path8.resolve(filePath);
|
|
547
575
|
} else {
|
|
548
|
-
const defaultEntrypoint =
|
|
549
|
-
if (
|
|
576
|
+
const defaultEntrypoint = path8.resolve("index.tsx");
|
|
577
|
+
if (fs9.existsSync(defaultEntrypoint)) {
|
|
550
578
|
snippetFilePath = defaultEntrypoint;
|
|
551
579
|
onSuccess("No file provided. Using 'index.tsx' as the entrypoint.");
|
|
552
580
|
} else {
|
|
@@ -556,24 +584,24 @@ var pushSnippet = async ({
|
|
|
556
584
|
return onExit(1);
|
|
557
585
|
}
|
|
558
586
|
}
|
|
559
|
-
const packageJsonPath =
|
|
560
|
-
|
|
587
|
+
const packageJsonPath = path8.resolve(
|
|
588
|
+
path8.join(path8.dirname(snippetFilePath), "package.json")
|
|
561
589
|
);
|
|
562
590
|
let packageJson = {};
|
|
563
|
-
if (
|
|
591
|
+
if (fs9.existsSync(packageJsonPath)) {
|
|
564
592
|
try {
|
|
565
|
-
packageJson = JSON.parse(
|
|
593
|
+
packageJson = JSON.parse(fs9.readFileSync(packageJsonPath).toString());
|
|
566
594
|
} catch {
|
|
567
595
|
onError("Invalid package.json provided");
|
|
568
596
|
return onExit(1);
|
|
569
597
|
}
|
|
570
598
|
}
|
|
571
|
-
if (!
|
|
599
|
+
if (!fs9.existsSync(snippetFilePath)) {
|
|
572
600
|
onError(`File not found: ${snippetFilePath}`);
|
|
573
601
|
return onExit(1);
|
|
574
602
|
}
|
|
575
603
|
const ky3 = getKy();
|
|
576
|
-
const packageName = (packageJson.name ??
|
|
604
|
+
const packageName = (packageJson.name ?? path8.parse(snippetFilePath).name).replace(/^@/, "");
|
|
577
605
|
const packageAuthor = packageJson.author?.split(" ")[0] ?? cliConfig.get("githubUsername");
|
|
578
606
|
const packageIdentifier = `${packageAuthor}/${packageName}`;
|
|
579
607
|
let packageVersion = packageJson.version ?? await ky3.post("package_releases/list", {
|
|
@@ -592,7 +620,7 @@ var pushSnippet = async ({
|
|
|
592
620
|
if (packageJson.version) {
|
|
593
621
|
try {
|
|
594
622
|
packageJson.version = newVersion ?? `${packageVersion}`;
|
|
595
|
-
|
|
623
|
+
fs9.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
|
|
596
624
|
} catch (error) {
|
|
597
625
|
onError("Failed to update package.json version:" + error);
|
|
598
626
|
}
|
|
@@ -642,11 +670,11 @@ var pushSnippet = async ({
|
|
|
642
670
|
return onExit(1);
|
|
643
671
|
});
|
|
644
672
|
onSuccess("\n");
|
|
645
|
-
const directoryFiles =
|
|
673
|
+
const directoryFiles = fs9.readdirSync(path8.dirname(snippetFilePath));
|
|
646
674
|
for (const file of directoryFiles) {
|
|
647
|
-
const fileExtension =
|
|
675
|
+
const fileExtension = path8.extname(file).replace(".", "");
|
|
648
676
|
if (!["json", "tsx", "ts"].includes(fileExtension)) continue;
|
|
649
|
-
const fileContent =
|
|
677
|
+
const fileContent = fs9.readFileSync(path8.join(path8.dirname(snippetFilePath), file)).toString() ?? "";
|
|
650
678
|
await ky3.post("package_files/create", {
|
|
651
679
|
json: {
|
|
652
680
|
file_path: file,
|
|
@@ -702,7 +730,7 @@ var DevServer = class {
|
|
|
702
730
|
}) {
|
|
703
731
|
this.port = port;
|
|
704
732
|
this.componentFilePath = componentFilePath;
|
|
705
|
-
this.projectDir =
|
|
733
|
+
this.projectDir = path9.dirname(componentFilePath);
|
|
706
734
|
this.fsKy = ky2.create({
|
|
707
735
|
prefixUrl: `http://localhost:${port}`
|
|
708
736
|
});
|
|
@@ -737,7 +765,7 @@ var DevServer = class {
|
|
|
737
765
|
this.typesHandler?.handleInitialTypeDependencies(this.componentFilePath);
|
|
738
766
|
}
|
|
739
767
|
async addEntrypoint() {
|
|
740
|
-
const relativeComponentFilePath =
|
|
768
|
+
const relativeComponentFilePath = path9.relative(
|
|
741
769
|
this.projectDir,
|
|
742
770
|
this.componentFilePath
|
|
743
771
|
);
|
|
@@ -759,32 +787,32 @@ circuit.add(<MyCircuit />)
|
|
|
759
787
|
const { file } = await this.fsKy.get("api/files/get", {
|
|
760
788
|
searchParams: { file_path: ev.file_path }
|
|
761
789
|
}).json();
|
|
762
|
-
|
|
763
|
-
|
|
790
|
+
fs10.writeFileSync(
|
|
791
|
+
path9.join(this.projectDir, "manual-edits.json"),
|
|
764
792
|
file.text_content
|
|
765
793
|
);
|
|
766
794
|
}
|
|
767
795
|
}
|
|
768
796
|
async handleFileChangedOnFilesystem(absoluteFilePath) {
|
|
769
|
-
const relativeFilePath =
|
|
797
|
+
const relativeFilePath = path9.relative(this.projectDir, absoluteFilePath);
|
|
770
798
|
if (relativeFilePath.includes("manual-edits.json")) return;
|
|
771
799
|
await this.typesHandler?.handleFileTypeDependencies(absoluteFilePath);
|
|
772
800
|
console.log(`${relativeFilePath} saved. Applying changes...`);
|
|
773
801
|
await this.fsKy.post("api/files/upsert", {
|
|
774
802
|
json: {
|
|
775
803
|
file_path: relativeFilePath,
|
|
776
|
-
text_content:
|
|
804
|
+
text_content: fs10.readFileSync(absoluteFilePath, "utf-8"),
|
|
777
805
|
initiator: "filesystem_change"
|
|
778
806
|
}
|
|
779
807
|
}).json();
|
|
780
808
|
}
|
|
781
809
|
async upsertInitialFiles() {
|
|
782
|
-
const fileNames =
|
|
810
|
+
const fileNames = fs10.readdirSync(this.projectDir);
|
|
783
811
|
for (const fileName of fileNames) {
|
|
784
|
-
if (
|
|
812
|
+
if (fs10.statSync(path9.join(this.projectDir, fileName)).isDirectory())
|
|
785
813
|
continue;
|
|
786
|
-
const fileContent =
|
|
787
|
-
|
|
814
|
+
const fileContent = fs10.readFileSync(
|
|
815
|
+
path9.join(this.projectDir, fileName),
|
|
788
816
|
"utf-8"
|
|
789
817
|
);
|
|
790
818
|
await this.fsKy.post("api/files/upsert", {
|
|
@@ -843,14 +871,14 @@ var registerDev = (program2) => {
|
|
|
843
871
|
}
|
|
844
872
|
let absolutePath;
|
|
845
873
|
if (file) {
|
|
846
|
-
absolutePath =
|
|
874
|
+
absolutePath = path10.resolve(file);
|
|
847
875
|
if (!absolutePath.endsWith(".tsx")) {
|
|
848
876
|
console.error("Error: Only .tsx files are supported");
|
|
849
877
|
return;
|
|
850
878
|
}
|
|
851
879
|
} else {
|
|
852
|
-
const entrypointPath =
|
|
853
|
-
if (
|
|
880
|
+
const entrypointPath = path10.resolve("index.tsx");
|
|
881
|
+
if (fs11.existsSync(entrypointPath)) {
|
|
854
882
|
absolutePath = entrypointPath;
|
|
855
883
|
console.log("No file provided. Using 'index.tsx' as the entrypoint.");
|
|
856
884
|
} else {
|
|
@@ -860,7 +888,7 @@ var registerDev = (program2) => {
|
|
|
860
888
|
return;
|
|
861
889
|
}
|
|
862
890
|
}
|
|
863
|
-
const fileDir =
|
|
891
|
+
const fileDir = path10.dirname(absolutePath);
|
|
864
892
|
try {
|
|
865
893
|
console.log("Installing types for imported snippets...");
|
|
866
894
|
await installNodeModuleTypesForSnippet(absolutePath);
|
|
@@ -957,8 +985,8 @@ var registerConfigPrint = (program2) => {
|
|
|
957
985
|
};
|
|
958
986
|
|
|
959
987
|
// cli/clone/register.ts
|
|
960
|
-
import * as
|
|
961
|
-
import * as
|
|
988
|
+
import * as fs12 from "node:fs";
|
|
989
|
+
import * as path11 from "node:path";
|
|
962
990
|
var registerClone = (program2) => {
|
|
963
991
|
program2.command("clone").description("Clone a snippet from the registry").argument("<snippet>", "Snippet to clone (e.g. author/snippetName)").action(async (snippetPath) => {
|
|
964
992
|
const match = snippetPath.match(/^(?:@tsci\/)?([^/.]+)[/.](.+)$/);
|
|
@@ -989,13 +1017,13 @@ var registerClone = (program2) => {
|
|
|
989
1017
|
);
|
|
990
1018
|
process.exit(1);
|
|
991
1019
|
}
|
|
992
|
-
const dirPath =
|
|
993
|
-
|
|
1020
|
+
const dirPath = path11.resolve(`${author}.${snippetName}`);
|
|
1021
|
+
fs12.mkdirSync(dirPath, { recursive: true });
|
|
994
1022
|
for (const fileInfo of packageFileList.package_files) {
|
|
995
1023
|
const filePath = fileInfo.file_path.replace(/^\/|dist\//g, "");
|
|
996
1024
|
if (!filePath) continue;
|
|
997
|
-
const fullPath =
|
|
998
|
-
|
|
1025
|
+
const fullPath = path11.join(dirPath, filePath);
|
|
1026
|
+
fs12.mkdirSync(path11.dirname(fullPath), { recursive: true });
|
|
999
1027
|
try {
|
|
1000
1028
|
const fileContent = await ky3.post(
|
|
1001
1029
|
"package_files/get",
|
|
@@ -1012,7 +1040,7 @@ var registerClone = (program2) => {
|
|
|
1012
1040
|
|
|
1013
1041
|
${fileText}`;
|
|
1014
1042
|
}
|
|
1015
|
-
|
|
1043
|
+
fs12.writeFileSync(fullPath, fileText);
|
|
1016
1044
|
} catch (error) {
|
|
1017
1045
|
console.warn(
|
|
1018
1046
|
`Skipping ${filePath} due to error:`,
|
|
@@ -1020,15 +1048,15 @@ ${fileText}`;
|
|
|
1020
1048
|
);
|
|
1021
1049
|
}
|
|
1022
1050
|
}
|
|
1023
|
-
|
|
1024
|
-
|
|
1051
|
+
fs12.writeFileSync(
|
|
1052
|
+
path11.join(dirPath, ".npmrc"),
|
|
1025
1053
|
"@tsci:registry=https://npm.tscircuit.com"
|
|
1026
1054
|
);
|
|
1027
1055
|
generateTsConfig(dirPath);
|
|
1028
1056
|
setupTsciProject(dirPath);
|
|
1029
1057
|
console.log(`Successfully cloned to ${dirPath}/`);
|
|
1030
1058
|
console.log(
|
|
1031
|
-
`Run "cd ${
|
|
1059
|
+
`Run "cd ${path11.dirname(dirPath)} && tsci dev" to start developing.`
|
|
1032
1060
|
);
|
|
1033
1061
|
});
|
|
1034
1062
|
};
|
|
@@ -1041,8 +1069,12 @@ import semver2 from "semver";
|
|
|
1041
1069
|
import { createCircuitWebWorker } from "@tscircuit/eval";
|
|
1042
1070
|
import webWorkerBundleUrl from "@tscircuit/eval/blob-url";
|
|
1043
1071
|
import { getVirtualFileSystemFromDirPath } from "make-vfs";
|
|
1044
|
-
import
|
|
1045
|
-
import
|
|
1072
|
+
import path12 from "node:path";
|
|
1073
|
+
import fs13 from "node:fs";
|
|
1074
|
+
import {
|
|
1075
|
+
convertCircuitJsonToSchematicSvg,
|
|
1076
|
+
convertCircuitJsonToPcbSvg
|
|
1077
|
+
} from "circuit-to-svg";
|
|
1046
1078
|
var ALLOWED_FORMATS = [
|
|
1047
1079
|
"json",
|
|
1048
1080
|
"circuit-json",
|
|
@@ -1074,13 +1106,13 @@ Supported formats: ${ALLOWED_FORMATS.join(",")}`
|
|
|
1074
1106
|
);
|
|
1075
1107
|
}
|
|
1076
1108
|
if (!output) {
|
|
1077
|
-
output =
|
|
1109
|
+
output = path12.basename(file).replace(/\.[^.]+$/, "");
|
|
1078
1110
|
}
|
|
1079
1111
|
const worker = await createCircuitWebWorker({
|
|
1080
1112
|
webWorkerUrl: webWorkerBundleUrl
|
|
1081
1113
|
});
|
|
1082
|
-
const projectDir =
|
|
1083
|
-
const relativeComponentPath =
|
|
1114
|
+
const projectDir = path12.dirname(file);
|
|
1115
|
+
const relativeComponentPath = path12.relative(projectDir, file);
|
|
1084
1116
|
await worker.executeWithFsMap({
|
|
1085
1117
|
entrypoint: "entrypoint.tsx",
|
|
1086
1118
|
fsMap: {
|
|
@@ -1097,11 +1129,22 @@ circuit.add(<MyCircuit />)
|
|
|
1097
1129
|
});
|
|
1098
1130
|
await worker.renderUntilSettled();
|
|
1099
1131
|
const circuitJson = await worker.getCircuitJson();
|
|
1100
|
-
const outputPath =
|
|
1132
|
+
const outputPath = path12.join(
|
|
1101
1133
|
projectDir,
|
|
1102
1134
|
`${output}${OUTPUT_EXTENSIONS[format]}`
|
|
1103
1135
|
);
|
|
1104
|
-
|
|
1136
|
+
let outputContent;
|
|
1137
|
+
switch (format) {
|
|
1138
|
+
case "schematic-svg":
|
|
1139
|
+
outputContent = convertCircuitJsonToSchematicSvg(circuitJson);
|
|
1140
|
+
break;
|
|
1141
|
+
case "pcb-svg":
|
|
1142
|
+
outputContent = convertCircuitJsonToPcbSvg(circuitJson);
|
|
1143
|
+
break;
|
|
1144
|
+
default:
|
|
1145
|
+
outputContent = JSON.stringify(circuitJson);
|
|
1146
|
+
}
|
|
1147
|
+
fs13.writeFileSync(outputPath, outputContent);
|
|
1105
1148
|
console.log(`Exported to ${outputPath}`);
|
|
1106
1149
|
process.exit(0);
|
|
1107
1150
|
});
|
|
@@ -1169,4 +1212,4 @@ if (process.argv.length === 2) {
|
|
|
1169
1212
|
export {
|
|
1170
1213
|
program
|
|
1171
1214
|
};
|
|
1172
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY2xpL21haW4udHMiLCAiLi4vY2xpL2luaXQvcmVnaXN0ZXIudHMiLCAiLi4vbGliL3NoYXJlZC9kZXRlY3QtcGtnLW1hbmFnZXIudHMiLCAiLi4vbGliL3NoYXJlZC9zZXR1cC10c2NpLXBhY2thZ2VzLnRzIiwgIi4uL2xpYi9zaGFyZWQvZ2VuZXJhdGUtdHMtY29uZmlnLnRzIiwgIi4uL2xpYi9zaGFyZWQvd3JpdGUtZmlsZS1pZi1ub3QtZXhpc3RzLnRzIiwgIi4uL2NsaS9kZXYvcmVnaXN0ZXIudHMiLCAiLi4vbGliL2RlcGVuZGVuY3ktYW5hbHlzaXMvaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXQudHMiLCAiLi4vY2xpL2Rldi9EZXZTZXJ2ZXIudHMiLCAiLi4vbGliL3NlcnZlci9jcmVhdGVIdHRwU2VydmVyLnRzIiwgIi4uL3BhY2thZ2UuanNvbiIsICIuLi9saWIvc2l0ZS9nZXRJbmRleC50cyIsICIuLi9saWIvc2VydmVyL0V2ZW50c1dhdGNoZXIudHMiLCAiLi4vbGliL2RlcGVuZGVuY3ktYW5hbHlzaXMvRmlsZXN5c3RlbVR5cGVzSGFuZGxlci50cyIsICIuLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9maW5kSW1wb3J0c0luU25pcHBldC50cyIsICIuLi9saWIvY2xpLWNvbmZpZy9pbmRleC50cyIsICIuLi9saWIvcmVnaXN0cnktYXBpL2dldC1reS50cyIsICIuLi9saWIvc2hhcmVkL3B1c2gtc25pcHBldC50cyIsICIuLi9jbGkvYXV0aC9sb2dpbi9yZWdpc3Rlci50cyIsICIuLi9jbGkvYXV0aC9sb2dvdXQvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2F1dGgvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2NvbmZpZy9yZWdpc3Rlci50cyIsICIuLi9jbGkvY29uZmlnL3ByaW50L3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9jbG9uZS9yZWdpc3Rlci50cyIsICIuLi9jbGkvZXhwb3J0L3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9hdXRoL3ByaW50LXRva2VuL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9hdXRoL3NldC10b2tlbi9yZWdpc3Rlci50cyIsICIuLi9jbGkvcHVzaC9yZWdpc3Rlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJJbml0IH0gZnJvbSBcIi4vaW5pdC9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckRldiB9IGZyb20gXCIuL2Rldi9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhMb2dpbiB9IGZyb20gXCIuL2F1dGgvbG9naW4vcmVnaXN0ZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJBdXRoTG9nb3V0IH0gZnJvbSBcIi4vYXV0aC9sb2dvdXQvcmVnaXN0ZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJBdXRoIH0gZnJvbSBcIi4vYXV0aC9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckNvbmZpZ1ByaW50IH0gZnJvbSBcIi4vY29uZmlnL3ByaW50L3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQ2xvbmUgfSBmcm9tIFwiLi9jbG9uZS9yZWdpc3RlclwiXG5pbXBvcnQgeyBwZXJmZWN0Q2xpIH0gZnJvbSBcInBlcmZlY3QtY2xpXCJcbmltcG9ydCBwa2cgZnJvbSBcIi4uL3BhY2thZ2UuanNvblwiXG5pbXBvcnQgc2VtdmVyIGZyb20gXCJzZW12ZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJFeHBvcnQgfSBmcm9tIFwiLi9leHBvcnQvcmVnaXN0ZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJBdXRoUHJpbnRUb2tlbiB9IGZyb20gXCIuL2F1dGgvcHJpbnQtdG9rZW4vcmVnaXN0ZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJBdXRoU2V0VG9rZW4gfSBmcm9tIFwiLi9hdXRoL3NldC10b2tlbi9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlclB1c2ggfSBmcm9tIFwiLi9wdXNoL3JlZ2lzdGVyXCJcblxuZXhwb3J0IGNvbnN0IHByb2dyYW0gPSBuZXcgQ29tbWFuZCgpXG5cbnByb2dyYW1cbiAgLm5hbWUoXCJ0c2NpXCIpXG4gIC5kZXNjcmlwdGlvbihcIkNMSSBmb3IgZGV2ZWxvcGluZyB0c2NpcmN1aXQgc25pcHBldHNcIilcbiAgLy8gSEFDSzogYXQgYnVpbGQgdGltZSB0aGUgdmVyc2lvbiBpcyBvbGQsIHdlIG5lZWQgdG9cbiAgLy8gZml4IHRoaXMgYXQgc29tZSBwb2ludC4uLlxuICAudmVyc2lvbihzZW12ZXIuaW5jKHBrZy52ZXJzaW9uLCBcInBhdGNoXCIpID8/IHBrZy52ZXJzaW9uKVxuXG5yZWdpc3RlckluaXQocHJvZ3JhbSlcblxucmVnaXN0ZXJEZXYocHJvZ3JhbSlcbnJlZ2lzdGVyQ2xvbmUocHJvZ3JhbSlcbnJlZ2lzdGVyUHVzaChwcm9ncmFtKVxuXG5yZWdpc3RlckF1dGgocHJvZ3JhbSlcbnJlZ2lzdGVyQXV0aExvZ2luKHByb2dyYW0pXG5yZWdpc3RlckF1dGhMb2dvdXQocHJvZ3JhbSlcbnJlZ2lzdGVyQXV0aFByaW50VG9rZW4ocHJvZ3JhbSlcbnJlZ2lzdGVyQXV0aFNldFRva2VuKHByb2dyYW0pXG5cbnJlZ2lzdGVyQ29uZmlnKHByb2dyYW0pXG5yZWdpc3RlckNvbmZpZ1ByaW50KHByb2dyYW0pXG5cbnJlZ2lzdGVyRXhwb3J0KHByb2dyYW0pXG5cbmlmIChwcm9jZXNzLmFyZ3YubGVuZ3RoID09PSAyKSB7XG4gIHBlcmZlY3RDbGkocHJvZ3JhbSwgcHJvY2Vzcy5hcmd2KVxufSBlbHNlIHtcbiAgcHJvZ3JhbS5wYXJzZSgpXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgc2V0dXBUc2NpUHJvamVjdCB9IGZyb20gXCJsaWIvc2hhcmVkL3NldHVwLXRzY2ktcGFja2FnZXNcIlxuaW1wb3J0IHsgZ2VuZXJhdGVUc0NvbmZpZyB9IGZyb20gXCJsaWIvc2hhcmVkL2dlbmVyYXRlLXRzLWNvbmZpZ1wiXG5pbXBvcnQgeyB3cml0ZUZpbGVJZk5vdEV4aXN0cyB9IGZyb20gXCJsaWIvc2hhcmVkL3dyaXRlLWZpbGUtaWYtbm90LWV4aXN0c1wiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckluaXQgPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoXCJpbml0XCIpXG4gICAgLmRlc2NyaXB0aW9uKFxuICAgICAgXCJJbml0aWFsaXplIGEgbmV3IFRTQ2lyY3VpdCBwcm9qZWN0IGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IChvciBjdXJyZW50IGRpcmVjdG9yeSBpZiBub25lIGlzIHByb3ZpZGVkKVwiLFxuICAgIClcbiAgICAuYXJndW1lbnQoXG4gICAgICBcIltkaXJlY3RvcnldXCIsXG4gICAgICBcIkRpcmVjdG9yeSBuYW1lIChvcHRpb25hbCwgZGVmYXVsdHMgdG8gY3VycmVudCBkaXJlY3RvcnkpXCIsXG4gICAgKVxuICAgIC5hY3Rpb24oKGRpcmVjdG9yeT86IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgcHJvamVjdERpciA9IGRpcmVjdG9yeVxuICAgICAgICA/IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBkaXJlY3RvcnkpXG4gICAgICAgIDogcHJvY2Vzcy5jd2QoKVxuXG4gICAgICAvLyBFbnN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGZzLm1rZGlyU3luYyhwcm9qZWN0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuXG4gICAgICAvLyBDcmVhdGUgZXNzZW50aWFsIHByb2plY3QgZmlsZXNcbiAgICAgIHdyaXRlRmlsZUlmTm90RXhpc3RzKFxuICAgICAgICBwYXRoLmpvaW4ocHJvamVjdERpciwgXCJpbmRleC50c3hcIiksXG4gICAgICAgIGBcbmltcG9ydCBcIkB0c2NpcmN1aXQvY29yZVwiO1xuXG5leHBvcnQgZGVmYXVsdCAoKSA9PiAoXG4gIDxib2FyZCB3aWR0aD1cIjEwbW1cIiBoZWlnaHQ9XCIxMG1tXCI+XG4gICAgPHJlc2lzdG9yIHJlc2lzdGFuY2U9XCIxa1wiIGZvb3RwcmludD1cIjA0MDJcIiBuYW1lPVwiUjFcIiBzY2hYPXszfSBwY2JYPXszfSAvPlxuICAgIDxjYXBhY2l0b3IgY2FwYWNpdGFuY2U9XCIxMDAwcEZcIiBmb290cHJpbnQ9XCIwNDAyXCIgbmFtZT1cIkMxXCIgc2NoWD17LTN9IHBjYlg9ey0zfSAvPlxuICAgIDx0cmFjZSBmcm9tPVwiLlIxID4gLnBpbjFcIiB0bz1cIi5DMSA+IC5waW4xXCIgLz5cbiAgPC9ib2FyZD5cbik7XG5gLFxuICAgICAgKVxuXG4gICAgICB3cml0ZUZpbGVJZk5vdEV4aXN0cyhcbiAgICAgICAgcGF0aC5qb2luKHByb2plY3REaXIsIFwiLm5wbXJjXCIpLFxuICAgICAgICBgXG5AdHNjaTpyZWdpc3RyeT1odHRwczovL25wbS50c2NpcmN1aXQuY29tXG5gLFxuICAgICAgKVxuXG4gICAgICAvLyBTZXR1cCBwcm9qZWN0IGRlcGVuZGVuY2llc1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0dXBUc2NpUHJvamVjdChwcm9qZWN0RGlyKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBpbnN0YWxsIGRlcGVuZGVuY2llczpcIiwgZXJyb3IpXG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgICAgfVxuXG4gICAgICAvLyBHZW5lcmF0ZSB0c2NvbmZpZy5qc29uXG4gICAgICB0cnkge1xuICAgICAgICBnZW5lcmF0ZVRzQ29uZmlnKHByb2plY3REaXIpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGdlbmVyYXRlIHRzY29uZmlnLmpzb246XCIsIGVycm9yKVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICAgIH1cblxuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBgXHVEODNDXHVERjg5IEluaXRpYWxpemF0aW9uIGNvbXBsZXRlISBSdW4gJHtkaXJlY3RvcnkgPyBgXCJjZCAke2RpcmVjdG9yeX1cIiAmIGAgOiBcIlwifVwidHNjaSBkZXZcIiB0byBzdGFydCBkZXZlbG9waW5nLmAsXG4gICAgICApXG4gICAgICBwcm9jZXNzLmV4aXQoMClcbiAgICB9KVxufVxuIiwgImltcG9ydCBmcyBmcm9tIFwiZnNcIlxuXG4vLyBEZXRlY3QgdGhlIHBhY2thZ2UgbWFuYWdlciBiZWluZyB1c2VkIGluIHRoZSBwcm9qZWN0XG5leHBvcnQgY29uc3QgZGV0ZWN0UGFja2FnZU1hbmFnZXIgPSAoKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdXNlckFnZW50ID0gcHJvY2Vzcy5lbnYubnBtX2NvbmZpZ191c2VyX2FnZW50IHx8IFwiXCJcbiAgaWYgKHVzZXJBZ2VudC5zdGFydHNXaXRoKFwieWFyblwiKSkgcmV0dXJuIFwieWFyblwiXG4gIGlmICh1c2VyQWdlbnQuc3RhcnRzV2l0aChcInBucG1cIikpIHJldHVybiBcInBucG1cIlxuICBpZiAodXNlckFnZW50LnN0YXJ0c1dpdGgoXCJidW5cIikpIHJldHVybiBcImJ1blwiXG5cbiAgaWYgKGZzLmV4aXN0c1N5bmMoXCJ5YXJuLmxvY2tcIikpIHJldHVybiBcInlhcm5cIlxuICBpZiAoZnMuZXhpc3RzU3luYyhcInBucG0tbG9jay55YW1sXCIpKSByZXR1cm4gXCJwbnBtXCJcbiAgaWYgKGZzLmV4aXN0c1N5bmMoXCJidW4ubG9ja2JcIikpIHJldHVybiBcImJ1blwiXG5cbiAgcmV0dXJuIFwibnBtXCIgLy8gRGVmYXVsdCB0byBucG1cbn1cbiIsICJpbXBvcnQgeyBkZXRlY3RQYWNrYWdlTWFuYWdlciB9IGZyb20gXCIuL2RldGVjdC1wa2ctbWFuYWdlclwiXG5pbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBleGVjU3luYyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIlxuXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBUc2NpUHJvamVjdChcbiAgZGlyZWN0b3J5ID0gcHJvY2Vzcy5jd2QoKSxcbiAgZGVwZW5kZW5jaWVzID0gW1wiQHR5cGVzL3JlYWN0XCIsIFwiQHRzY2lyY3VpdC9jb3JlXCJdLFxuKSB7XG4gIGNvbnN0IHByb2plY3RQYXRoID0gcGF0aC5yZXNvbHZlKGRpcmVjdG9yeSlcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHByb2plY3RQYXRoKSkge1xuICAgIGZzLm1rZGlyU3luYyhwcm9qZWN0UGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgfVxuICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGRldGVjdFBhY2thZ2VNYW5hZ2VyKClcblxuICBjb25zb2xlLmxvZyhgSW5pdGlhbGl6aW5nIHByb2plY3QgaW4gJHtwcm9qZWN0UGF0aH0uLi5gKVxuICBwcm9jZXNzLmNoZGlyKHByb2plY3RQYXRoKVxuXG4gIGlmICghZnMuZXhpc3RzU3luYyhcInBhY2thZ2UuanNvblwiKSkge1xuICAgIGNvbnN0IGluaXRDb21tYW5kID1cbiAgICAgIHBhY2thZ2VNYW5hZ2VyID09PSBcInlhcm5cIlxuICAgICAgICA/IFwieWFybiBpbml0IC15XCJcbiAgICAgICAgOiBwYWNrYWdlTWFuYWdlciA9PT0gXCJwbnBtXCJcbiAgICAgICAgICA/IFwicG5wbSBpbml0XCJcbiAgICAgICAgICA6IHBhY2thZ2VNYW5hZ2VyID09PSBcImJ1blwiXG4gICAgICAgICAgICA/IFwiYnVuIGluaXQgLXlcIlxuICAgICAgICAgICAgOiBcIm5wbSBpbml0IC15XCJcblxuICAgIGV4ZWNTeW5jKGluaXRDb21tYW5kLCB7IHN0ZGlvOiBcImluaGVyaXRcIiB9KVxuICAgIGNvbnNvbGUubG9nKFwiUHJvamVjdCBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkuXCIpXG4gIH1cblxuICAvLyBSZWFkIGFuZCBtb2RpZnkgcGFja2FnZS5qc29uXG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihwcm9qZWN0UGF0aCwgXCJwYWNrYWdlLmpzb25cIilcbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsIFwidXRmLThcIikpXG5cbiAgLy8gUmVtb3ZlIHVud2FudGVkIGZpZWxkc1xuICBkZWxldGUgcGFja2FnZUpzb24ua2V5d29yZHNcbiAgZGVsZXRlIHBhY2thZ2VKc29uLmF1dGhvclxuICBkZWxldGUgcGFja2FnZUpzb24ubWFpblxuXG4gIGZzLndyaXRlRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiwgbnVsbCwgMikpXG4gIGNvbnNvbGUubG9nKFwiVXBkYXRlZCBwYWNrYWdlLmpzb24gdG8gcmVtb3ZlIHVubmVjZXNzYXJ5IGZpZWxkcy5cIilcblxuICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmxvZyhcIkluc3RhbGxpbmcgZGVwZW5kZW5jaWVzLi4uXCIpXG4gICAgY29uc3QgaW5zdGFsbENvbW1hbmQgPVxuICAgICAgcGFja2FnZU1hbmFnZXIgPT09IFwieWFyblwiXG4gICAgICAgID8gYHlhcm4gYWRkIC1EICR7ZGVwZW5kZW5jaWVzLmpvaW4oXCIgXCIpfWBcbiAgICAgICAgOiBwYWNrYWdlTWFuYWdlciA9PT0gXCJwbnBtXCJcbiAgICAgICAgICA/IGBwbnBtIGFkZCAtRCAke2RlcGVuZGVuY2llcy5qb2luKFwiIFwiKX1gXG4gICAgICAgICAgOiBwYWNrYWdlTWFuYWdlciA9PT0gXCJidW5cIlxuICAgICAgICAgICAgPyBgYnVuIGFkZCAtRCAke2RlcGVuZGVuY2llcy5qb2luKFwiIFwiKX1gXG4gICAgICAgICAgICA6IGBucG0gaW5zdGFsbCAtRCAke2RlcGVuZGVuY2llcy5qb2luKFwiIFwiKX1gXG5cbiAgICBleGVjU3luYyhpbnN0YWxsQ29tbWFuZCwgeyBzdGRpbzogXCJpbmhlcml0XCIgfSlcbiAgICBjb25zb2xlLmxvZyhcIkRlcGVuZGVuY2llcyBpbnN0YWxsZWQgc3VjY2Vzc2Z1bGx5LlwiKVxuICB9XG5cbiAgcmV0dXJuIHBhY2thZ2VKc29uLm5hbWUgfHwgXCJ1bmtub3duXCJcbn1cbiIsICJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5pbXBvcnQgZnMgZnJvbSBcImZzXCJcblxuLy8gR2VuZXJhdGUgYSBSZWFjdC1jb21wYXRpYmxlIHRzY29uZmlnLmpzb25cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZVRzQ29uZmlnID0gKGRpcjogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHRzY29uZmlnUGF0aCA9IHBhdGguam9pbihkaXIsIFwidHNjb25maWcuanNvblwiKVxuICBjb25zdCB0c2NvbmZpZ0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShcbiAgICB7XG4gICAgICBjb21waWxlck9wdGlvbnM6IHtcbiAgICAgICAgdGFyZ2V0OiBcIkVTNlwiLFxuICAgICAgICBtb2R1bGU6IFwiRVNOZXh0XCIsXG4gICAgICAgIGpzeDogXCJyZWFjdC1qc3hcIixcbiAgICAgICAgb3V0RGlyOiBcImRpc3RcIixcbiAgICAgICAgc3RyaWN0OiB0cnVlLFxuICAgICAgICBlc01vZHVsZUludGVyb3A6IHRydWUsXG4gICAgICAgIG1vZHVsZVJlc29sdXRpb246IFwibm9kZVwiLFxuICAgICAgICBza2lwTGliQ2hlY2s6IHRydWUsXG4gICAgICAgIGZvcmNlQ29uc2lzdGVudENhc2luZ0luRmlsZU5hbWVzOiB0cnVlLFxuICAgICAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSxcbiAgICAgICAgc291cmNlTWFwOiB0cnVlLFxuICAgICAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLFxuICAgICAgICBleHBlcmltZW50YWxEZWNvcmF0b3JzOiB0cnVlLFxuICAgICAgfSxcbiAgICB9LFxuICAgIG51bGwsXG4gICAgMixcbiAgKVxuICBpZiAoIWZzLmV4aXN0c1N5bmModHNjb25maWdQYXRoKSkge1xuICAgIGZzLndyaXRlRmlsZVN5bmModHNjb25maWdQYXRoLCB0c2NvbmZpZ0NvbnRlbnQudHJpbVN0YXJ0KCkpXG4gICAgY29uc29sZS5sb2coYENyZWF0ZWQ6ICR7dHNjb25maWdQYXRofWApXG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coYFNraXBwZWQ6ICR7dHNjb25maWdQYXRofSBhbHJlYWR5IGV4aXN0c2ApXG4gIH1cbn1cbiIsICJpbXBvcnQgZnMgZnJvbSBcImZzXCJcblxuZXhwb3J0IGNvbnN0IHdyaXRlRmlsZUlmTm90RXhpc3RzID0gKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZykgPT4ge1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgZnMud3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgY29udGVudC50cmltU3RhcnQoKSwgXCJ1dGYtOFwiKVxuICAgIGNvbnNvbGUuaW5mbyhgQ3JlYXRlZDogJHtmaWxlUGF0aH1gKVxuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuaW5mbyhgU2tpcHBlZDogJHtmaWxlUGF0aH0gYWxyZWFkeSBleGlzdHNgKVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0ICogYXMgY2hva2lkYXIgZnJvbSBcImNob2tpZGFyXCJcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7IGNyZWF0ZUh0dHBTZXJ2ZXIgfSBmcm9tIFwibGliL3NlcnZlci9jcmVhdGVIdHRwU2VydmVyXCJcbmltcG9ydCB7IGdldExvY2FsRmlsZURlcGVuZGVuY2llcyB9IGZyb20gXCJsaWIvZGVwZW5kZW5jeS1hbmFseXNpcy9nZXRMb2NhbEZpbGVEZXBlbmRlbmNpZXNcIlxuaW1wb3J0IHsgaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXQgfSBmcm9tIFwiLi4vLi4vbGliL2RlcGVuZGVuY3ktYW5hbHlzaXMvaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXRcIlxuaW1wb3J0IHsgRXZlbnRzV2F0Y2hlciB9IGZyb20gXCIuLi8uLi9saWIvc2VydmVyL0V2ZW50c1dhdGNoZXJcIlxuaW1wb3J0IHsgRGV2U2VydmVyIH0gZnJvbSBcIi4vRGV2U2VydmVyXCJcbmltcG9ydCAqIGFzIG5ldCBmcm9tIFwibm9kZTpuZXRcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJEZXYgPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoXCJkZXZcIilcbiAgICAuZGVzY3JpcHRpb24oXCJTdGFydCBkZXZlbG9wbWVudCBzZXJ2ZXIgZm9yIGEgc25pcHBldFwiKVxuICAgIC5hcmd1bWVudChcIltmaWxlXVwiLCBcIlBhdGggdG8gdGhlIHNuaXBwZXQgZmlsZVwiKVxuICAgIC5vcHRpb24oXCItcCwgLS1wb3J0IDxudW1iZXI+XCIsIFwiUG9ydCB0byBydW4gc2VydmVyIG9uXCIsIFwiMzAyMFwiKVxuICAgIC5hY3Rpb24oYXN5bmMgKGZpbGU6IHN0cmluZywgb3B0aW9uczogeyBwb3J0OiBzdHJpbmcgfSkgPT4ge1xuICAgICAgbGV0IHBvcnQgPSBwYXJzZUludChvcHRpb25zLnBvcnQpXG5cbiAgICAgIGNvbnN0IGlzUG9ydEF2YWlsYWJsZSA9IChwb3J0OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2VydmVyID0gbmV0LmNyZWF0ZVNlcnZlcigpXG4gICAgICAgICAgc2VydmVyLm9uY2UoXCJlcnJvclwiLCAoKSA9PiByZXNvbHZlKGZhbHNlKSlcbiAgICAgICAgICBzZXJ2ZXIub25jZShcImxpc3RlbmluZ1wiLCAoKSA9PiB7XG4gICAgICAgICAgICBzZXJ2ZXIuY2xvc2UoKCkgPT4gcmVzb2x2ZSh0cnVlKSlcbiAgICAgICAgICB9KVxuICAgICAgICAgIHNlcnZlci5saXN0ZW4ocG9ydClcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKCEoYXdhaXQgaXNQb3J0QXZhaWxhYmxlKHBvcnQpKSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUG9ydCAke3BvcnR9IGlzIGluIHVzZSwgdHJ5aW5nIHBvcnQgJHtwb3J0ICsgMX0uLi5gKVxuICAgICAgICBwb3J0ICs9IDFcbiAgICAgIH1cblxuICAgICAgbGV0IGFic29sdXRlUGF0aDogc3RyaW5nXG5cbiAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgIGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShmaWxlKVxuICAgICAgICBpZiAoIWFic29sdXRlUGF0aC5lbmRzV2l0aChcIi50c3hcIikpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3I6IE9ubHkgLnRzeCBmaWxlcyBhcmUgc3VwcG9ydGVkXCIpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVudHJ5cG9pbnRQYXRoID0gcGF0aC5yZXNvbHZlKFwiaW5kZXgudHN4XCIpXG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGVudHJ5cG9pbnRQYXRoKSkge1xuICAgICAgICAgIGFic29sdXRlUGF0aCA9IGVudHJ5cG9pbnRQYXRoXG4gICAgICAgICAgY29uc29sZS5sb2coXCJObyBmaWxlIHByb3ZpZGVkLiBVc2luZyAnaW5kZXgudHN4JyBhcyB0aGUgZW50cnlwb2ludC5cIilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIFwiTm8gZW50cnlwb2ludCBmb3VuZC4gUnVuICd0c2NpIGluaXQnIHRvIGJvb3RzdHJhcCBhIGJhc2ljIHByb2plY3QuXCIsXG4gICAgICAgICAgKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbGVEaXIgPSBwYXRoLmRpcm5hbWUoYWJzb2x1dGVQYXRoKVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkluc3RhbGxpbmcgdHlwZXMgZm9yIGltcG9ydGVkIHNuaXBwZXRzLi4uXCIpXG4gICAgICAgIGF3YWl0IGluc3RhbGxOb2RlTW9kdWxlVHlwZXNGb3JTbmlwcGV0KGFic29sdXRlUGF0aClcbiAgICAgICAgY29uc29sZS5sb2coXCJUeXBlcyBpbnN0YWxsZWQgc3VjY2Vzc2Z1bGx5XCIpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJGYWlsZWQgdG8gaW5zdGFsbCB0eXBlczpcIiwgZXJyb3IpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlcnZlciA9IG5ldyBEZXZTZXJ2ZXIoe1xuICAgICAgICBwb3J0LFxuICAgICAgICBjb21wb25lbnRGaWxlUGF0aDogYWJzb2x1dGVQYXRoLFxuICAgICAgfSlcblxuICAgICAgYXdhaXQgc2VydmVyLnN0YXJ0KClcbiAgICAgIGF3YWl0IHNlcnZlci5hZGRFbnRyeXBvaW50KClcbiAgICB9KVxufVxuIiwgImltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgKiBhcyB0cyBmcm9tIFwidHlwZXNjcmlwdFwiXG5cbmludGVyZmFjZSBTbmlwcGV0QXBpUmVzcG9uc2Uge1xuICBzbmlwcGV0OiB7XG4gICAgZHRzOiBzdHJpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXQoc25pcHBldFBhdGg6IHN0cmluZykge1xuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNuaXBwZXRQYXRoLCBcInV0Zi04XCIpXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSB0cy5jcmVhdGVTb3VyY2VGaWxlKFxuICAgIHNuaXBwZXRQYXRoLFxuICAgIGNvbnRlbnQsXG4gICAgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCxcbiAgICB0cnVlLFxuICApXG5cbiAgY29uc3QgaW1wb3J0czogc3RyaW5nW10gPSBbXVxuXG4gIGZ1bmN0aW9uIHZpc2l0KG5vZGU6IHRzLk5vZGUpIHtcbiAgICBpZiAodHMuaXNJbXBvcnREZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgY29uc3QgbW9kdWxlU3BlY2lmaWVyID0gbm9kZS5tb2R1bGVTcGVjaWZpZXJcbiAgICAgIGlmIChtb2R1bGVTcGVjaWZpZXIgJiYgdHMuaXNTdHJpbmdMaXRlcmFsKG1vZHVsZVNwZWNpZmllcikpIHtcbiAgICAgICAgY29uc3QgaW1wb3J0UGF0aCA9IG1vZHVsZVNwZWNpZmllci50ZXh0XG4gICAgICAgIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCJAdHNjaS9cIikpIHtcbiAgICAgICAgICBpbXBvcnRzLnB1c2goaW1wb3J0UGF0aClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0cy5mb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXQpXG4gIH1cblxuICB2aXNpdChzb3VyY2VGaWxlKVxuXG4gIGxldCBwcm9qZWN0Um9vdCA9IHBhdGguZGlybmFtZShzbmlwcGV0UGF0aClcbiAgd2hpbGUgKHByb2plY3RSb290ICE9PSBwYXRoLnBhcnNlKHByb2plY3RSb290KS5yb290KSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3RSb290LCBcInBhY2thZ2UuanNvblwiKSkpIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIHByb2plY3RSb290ID0gcGF0aC5kaXJuYW1lKHByb2plY3RSb290KVxuICB9XG5cbiAgZm9yIChjb25zdCBpbXBvcnRQYXRoIG9mIGltcG9ydHMpIHtcbiAgICBjb25zdCBbb3duZXIsIG5hbWVdID0gaW1wb3J0UGF0aC5yZXBsYWNlKFwiQHRzY2kvXCIsIFwiXCIpLnNwbGl0KFwiLlwiKVxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICBgaHR0cHM6Ly9yZWdpc3RyeS1hcGkudHNjaXJjdWl0LmNvbS9zbmlwcGV0cy9nZXQ/b3duZXJfbmFtZT0ke293bmVyfSZ1bnNjb3BlZF9uYW1lPSR7bmFtZX1gLFxuICAgICAgKVxuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIGZldGNoIHR5cGVzIGZvciAke2ltcG9ydFBhdGh9YClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YTogU25pcHBldEFwaVJlc3BvbnNlID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG5cbiAgICAgIGlmIChkYXRhLnNuaXBwZXQuZHRzKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VEaXIgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgcHJvamVjdFJvb3QsXG4gICAgICAgICAgXCJub2RlX21vZHVsZXNcIixcbiAgICAgICAgICBcIkB0c2NpXCIsXG4gICAgICAgICAgYCR7b3duZXJ9LiR7bmFtZX1gLFxuICAgICAgICApXG4gICAgICAgIGZzLm1rZGlyU3luYyhwYWNrYWdlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VEaXIsIFwiaW5kZXguZC50c1wiKSwgZGF0YS5zbmlwcGV0LmR0cylcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKGBFcnJvciBmZXRjaGluZyB0eXBlcyBmb3IgJHtpbXBvcnRQYXRofTpgLCBlcnJvcilcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQga3kgZnJvbSBcImt5XCJcbmltcG9ydCB0eXBlIHsgRmlsZVNlcnZlclJvdXRlcyB9IGZyb20gXCJsaWIvZmlsZS1zZXJ2ZXIvRmlsZVNlcnZlclJvdXRlc1wiXG5pbXBvcnQgeyBjcmVhdGVIdHRwU2VydmVyIH0gZnJvbSBcImxpYi9zZXJ2ZXIvY3JlYXRlSHR0cFNlcnZlclwiXG5pbXBvcnQgeyBFdmVudHNXYXRjaGVyIH0gZnJvbSBcImxpYi9zZXJ2ZXIvRXZlbnRzV2F0Y2hlclwiXG5pbXBvcnQgdHlwZSBodHRwIGZyb20gXCJub2RlOmh0dHBcIlxuaW1wb3J0IHR5cGUgeyBUeXBlZEt5SW5zdGFuY2UgfSBmcm9tIFwidHlwZWQta3lcIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0IHR5cGUgeyBGaWxlVXBkYXRlZEV2ZW50IH0gZnJvbSBcImxpYi9maWxlLXNlcnZlci9GaWxlU2VydmVyRXZlbnRcIlxuaW1wb3J0ICogYXMgY2hva2lkYXIgZnJvbSBcImNob2tpZGFyXCJcbmltcG9ydCB7IEZpbGVzeXN0ZW1UeXBlc0hhbmRsZXIgfSBmcm9tIFwibGliL2RlcGVuZGVuY3ktYW5hbHlzaXMvRmlsZXN5c3RlbVR5cGVzSGFuZGxlclwiXG5pbXBvcnQgeyBwdXNoU25pcHBldCB9IGZyb20gXCJsaWIvc2hhcmVkL3B1c2gtc25pcHBldFwiXG5cbmV4cG9ydCBjbGFzcyBEZXZTZXJ2ZXIge1xuICBwb3J0OiBudW1iZXJcbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIGEgY29tcG9uZW50IHRoYXQgZXhwb3J0cyBhIDxib2FyZCAvPiBvciA8Z3JvdXAgLz4gY29tcG9uZW50XG4gICAqL1xuICBjb21wb25lbnRGaWxlUGF0aDogc3RyaW5nXG5cbiAgcHJvamVjdERpcjogc3RyaW5nXG5cbiAgLyoqXG4gICAqIFRoZSBIVFRQIHNlcnZlciB0aGF0IGhvc3RzIHRoZSBmaWxlIHNlcnZlciBhbmQgZXZlbnQgYnVzLiBZb3UgY2FuIHVzZVxuICAgKiBmc0t5IHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGZpbGUgc2VydmVyL2V2ZW50IGJ1c1xuICAgKi9cbiAgaHR0cFNlcnZlcj86IGh0dHAuU2VydmVyXG4gIC8qKlxuICAgKiBXYXRjaGVzIGZvciBldmVudHMgb24gdGhlIGV2ZW50IGJ1cyBieSBwb2xsaW5nIGBhcGkvZXZlbnRzL2xpc3RgXG4gICAqL1xuICBldmVudHNXYXRjaGVyPzogRXZlbnRzV2F0Y2hlclxuICAvKipcbiAgICogQSBreSBpbnN0YW5jZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGZpbGUgc2VydmVyIGFuZFxuICAgKiBldmVudCBidXNcbiAgICovXG4gIGZzS3k6IFR5cGVkS3lJbnN0YW5jZTxrZXlvZiBGaWxlU2VydmVyUm91dGVzLCBGaWxlU2VydmVyUm91dGVzPlxuICAvKipcbiAgICogQSBjaG9raWRhciBpbnN0YW5jZSB0aGF0IHdhdGNoZXMgdGhlIHByb2plY3QgZGlyZWN0b3J5IGZvciBmaWxlIGNoYW5nZXNcbiAgICovXG4gIGZpbGVzeXN0ZW1XYXRjaGVyPzogY2hva2lkYXIuRlNXYXRjaGVyXG5cbiAgcHJpdmF0ZSB0eXBlc0hhbmRsZXI/OiBGaWxlc3lzdGVtVHlwZXNIYW5kbGVyXG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIHBvcnQsXG4gICAgY29tcG9uZW50RmlsZVBhdGgsXG4gIH06IHtcbiAgICBwb3J0OiBudW1iZXJcbiAgICBjb21wb25lbnRGaWxlUGF0aDogc3RyaW5nXG4gIH0pIHtcbiAgICB0aGlzLnBvcnQgPSBwb3J0XG4gICAgdGhpcy5jb21wb25lbnRGaWxlUGF0aCA9IGNvbXBvbmVudEZpbGVQYXRoXG4gICAgdGhpcy5wcm9qZWN0RGlyID0gcGF0aC5kaXJuYW1lKGNvbXBvbmVudEZpbGVQYXRoKVxuICAgIHRoaXMuZnNLeSA9IGt5LmNyZWF0ZSh7XG4gICAgICBwcmVmaXhVcmw6IGBodHRwOi8vbG9jYWxob3N0OiR7cG9ydH1gLFxuICAgIH0pIGFzIGFueVxuICAgIHRoaXMudHlwZXNIYW5kbGVyID0gbmV3IEZpbGVzeXN0ZW1UeXBlc0hhbmRsZXIodGhpcy5wcm9qZWN0RGlyKVxuICB9XG5cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgY29uc3QgeyBzZXJ2ZXIgfSA9IGF3YWl0IGNyZWF0ZUh0dHBTZXJ2ZXIodGhpcy5wb3J0KVxuICAgIHRoaXMuaHR0cFNlcnZlciA9IHNlcnZlclxuXG4gICAgdGhpcy5ldmVudHNXYXRjaGVyID0gbmV3IEV2ZW50c1dhdGNoZXIoYGh0dHA6Ly9sb2NhbGhvc3Q6JHt0aGlzLnBvcnR9YClcbiAgICB0aGlzLmV2ZW50c1dhdGNoZXIuc3RhcnQoKVxuXG4gICAgdGhpcy5ldmVudHNXYXRjaGVyLm9uKFxuICAgICAgXCJGSUxFX1VQREFURURcIixcbiAgICAgIHRoaXMuaGFuZGxlRmlsZVVwZGF0ZWRFdmVudEZyb21TZXJ2ZXIuYmluZCh0aGlzKSxcbiAgICApXG5cbiAgICB0aGlzLmV2ZW50c1dhdGNoZXIub24oXG4gICAgICBcIlJFUVVFU1RfVE9fU0FWRV9TTklQUEVUXCIsXG4gICAgICB0aGlzLnNhdmVTbmlwcGV0LmJpbmQodGhpcyksXG4gICAgKVxuXG4gICAgdGhpcy5maWxlc3lzdGVtV2F0Y2hlciA9IGNob2tpZGFyLndhdGNoKHRoaXMucHJvamVjdERpciwge1xuICAgICAgcGVyc2lzdGVudDogdHJ1ZSxcbiAgICAgIGlnbm9yZUluaXRpYWw6IHRydWUsXG4gICAgfSlcblxuICAgIHRoaXMuZmlsZXN5c3RlbVdhdGNoZXIub24oXCJjaGFuZ2VcIiwgKGZpbGVQYXRoKSA9PlxuICAgICAgdGhpcy5oYW5kbGVGaWxlQ2hhbmdlZE9uRmlsZXN5c3RlbShmaWxlUGF0aCksXG4gICAgKVxuICAgIHRoaXMuZmlsZXN5c3RlbVdhdGNoZXIub24oXCJhZGRcIiwgKGZpbGVQYXRoKSA9PlxuICAgICAgdGhpcy5oYW5kbGVGaWxlQ2hhbmdlZE9uRmlsZXN5c3RlbShmaWxlUGF0aCksXG4gICAgKVxuXG4gICAgdGhpcy51cHNlcnRJbml0aWFsRmlsZXMoKVxuXG4gICAgdGhpcy50eXBlc0hhbmRsZXI/LmhhbmRsZUluaXRpYWxUeXBlRGVwZW5kZW5jaWVzKHRoaXMuY29tcG9uZW50RmlsZVBhdGgpXG4gIH1cblxuICBhc3luYyBhZGRFbnRyeXBvaW50KCkge1xuICAgIGNvbnN0IHJlbGF0aXZlQ29tcG9uZW50RmlsZVBhdGggPSBwYXRoLnJlbGF0aXZlKFxuICAgICAgdGhpcy5wcm9qZWN0RGlyLFxuICAgICAgdGhpcy5jb21wb25lbnRGaWxlUGF0aCxcbiAgICApXG4gICAgYXdhaXQgdGhpcy5mc0t5LnBvc3QoXCJhcGkvZmlsZXMvdXBzZXJ0XCIsIHtcbiAgICAgIGpzb246IHtcbiAgICAgICAgZmlsZV9wYXRoOiBcImVudHJ5cG9pbnQudHN4XCIsXG4gICAgICAgIHRleHRfY29udGVudDogYFxuaW1wb3J0IE15Q2lyY3VpdCBmcm9tIFwiLi8ke3JlbGF0aXZlQ29tcG9uZW50RmlsZVBhdGh9XCJcblxuY2lyY3VpdC5hZGQoPE15Q2lyY3VpdCAvPilcbmAsXG4gICAgICB9LFxuICAgIH0pXG4gIH1cblxuICBhc3luYyBoYW5kbGVGaWxlVXBkYXRlZEV2ZW50RnJvbVNlcnZlcihldjogRmlsZVVwZGF0ZWRFdmVudCkge1xuICAgIGlmIChldi5pbml0aWF0b3IgPT09IFwiZmlsZXN5c3RlbV9jaGFuZ2VcIikgcmV0dXJuXG5cbiAgICBpZiAoZXYuZmlsZV9wYXRoID09PSBcIm1hbnVhbC1lZGl0cy5qc29uXCIpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiTWFudWFsIGVkaXRzIHVwZGF0ZWQsIHVwZGF0aW5nIG9uIGZpbGVzeXN0ZW0uLi5cIilcbiAgICAgIGNvbnN0IHsgZmlsZSB9ID0gYXdhaXQgdGhpcy5mc0t5XG4gICAgICAgIC5nZXQoXCJhcGkvZmlsZXMvZ2V0XCIsIHtcbiAgICAgICAgICBzZWFyY2hQYXJhbXM6IHsgZmlsZV9wYXRoOiBldi5maWxlX3BhdGggfSxcbiAgICAgICAgfSlcbiAgICAgICAgLmpzb24oKVxuICAgICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgICAgcGF0aC5qb2luKHRoaXMucHJvamVjdERpciwgXCJtYW51YWwtZWRpdHMuanNvblwiKSxcbiAgICAgICAgZmlsZS50ZXh0X2NvbnRlbnQsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaGFuZGxlRmlsZUNoYW5nZWRPbkZpbGVzeXN0ZW0oYWJzb2x1dGVGaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVsYXRpdmVGaWxlUGF0aCA9IHBhdGgucmVsYXRpdmUodGhpcy5wcm9qZWN0RGlyLCBhYnNvbHV0ZUZpbGVQYXRoKVxuICAgIC8vIFdlJ3ZlIHRlbXBvcmFyaWx5IGRpc2FibGVkIHVwc2VydGluZyBtYW51YWwgZWRpdHMgZnJvbSBmaWxlc3lzdGVtIGNoYW5nZXNcbiAgICAvLyBiZWNhdXNlIGl0IGNhbiBiZSBlZGl0ZWQgYnkgdGhlIGJyb3dzZXJcbiAgICBpZiAocmVsYXRpdmVGaWxlUGF0aC5pbmNsdWRlcyhcIm1hbnVhbC1lZGl0cy5qc29uXCIpKSByZXR1cm5cblxuICAgIGF3YWl0IHRoaXMudHlwZXNIYW5kbGVyPy5oYW5kbGVGaWxlVHlwZURlcGVuZGVuY2llcyhhYnNvbHV0ZUZpbGVQYXRoKVxuXG4gICAgY29uc29sZS5sb2coYCR7cmVsYXRpdmVGaWxlUGF0aH0gc2F2ZWQuIEFwcGx5aW5nIGNoYW5nZXMuLi5gKVxuICAgIGF3YWl0IHRoaXMuZnNLeVxuICAgICAgLnBvc3QoXCJhcGkvZmlsZXMvdXBzZXJ0XCIsIHtcbiAgICAgICAganNvbjoge1xuICAgICAgICAgIGZpbGVfcGF0aDogcmVsYXRpdmVGaWxlUGF0aCxcbiAgICAgICAgICB0ZXh0X2NvbnRlbnQ6IGZzLnJlYWRGaWxlU3luYyhhYnNvbHV0ZUZpbGVQYXRoLCBcInV0Zi04XCIpLFxuICAgICAgICAgIGluaXRpYXRvcjogXCJmaWxlc3lzdGVtX2NoYW5nZVwiLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5qc29uKClcbiAgfVxuXG4gIGFzeW5jIHVwc2VydEluaXRpYWxGaWxlcygpIHtcbiAgICAvLyBTY2FuIHByb2plY3QgZGlyZWN0b3J5IGZvciBhbGwgZmlsZXMgYW5kIHVwc2VydCB0aGVtXG4gICAgY29uc3QgZmlsZU5hbWVzID0gZnMucmVhZGRpclN5bmModGhpcy5wcm9qZWN0RGlyKVxuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVzKSB7XG4gICAgICBpZiAoZnMuc3RhdFN5bmMocGF0aC5qb2luKHRoaXMucHJvamVjdERpciwgZmlsZU5hbWUpKS5pc0RpcmVjdG9yeSgpKVxuICAgICAgICBjb250aW51ZVxuICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgIHBhdGguam9pbih0aGlzLnByb2plY3REaXIsIGZpbGVOYW1lKSxcbiAgICAgICAgXCJ1dGYtOFwiLFxuICAgICAgKVxuICAgICAgYXdhaXQgdGhpcy5mc0t5LnBvc3QoXCJhcGkvZmlsZXMvdXBzZXJ0XCIsIHtcbiAgICAgICAganNvbjoge1xuICAgICAgICAgIGZpbGVfcGF0aDogZmlsZU5hbWUsXG4gICAgICAgICAgdGV4dF9jb250ZW50OiBmaWxlQ29udGVudCxcbiAgICAgICAgICBpbml0aWF0b3I6IFwiZmlsZXN5c3RlbV9jaGFuZ2VcIixcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzYXZlU25pcHBldCgpIHtcbiAgICBjb25zdCBwb3N0RXZlbnQgPSBhc3luYyAoXG4gICAgICBldmVudDogXCJGQUlMRURfVE9fU0FWRV9TTklQUEVUXCIgfCBcIlNOSVBQRVRfU0FWRURcIixcbiAgICApID0+XG4gICAgICB0aGlzLmZzS3kucG9zdChcImFwaS9ldmVudHMvY3JlYXRlXCIsIHtcbiAgICAgICAganNvbjogeyBldmVudF90eXBlOiBldmVudCB9LFxuICAgICAgICB0aHJvd0h0dHBFcnJvcnM6IGZhbHNlLFxuICAgICAgfSlcblxuICAgIGF3YWl0IHB1c2hTbmlwcGV0KHtcbiAgICAgIGZpbGVQYXRoOiB0aGlzLmNvbXBvbmVudEZpbGVQYXRoLFxuICAgICAgb25FeGl0OiAoZSkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIHNhdmUgc25pcHBldFwiLCBlKVxuICAgICAgICBwb3N0RXZlbnQoXCJGQUlMRURfVE9fU0FWRV9TTklQUEVUXCIpXG4gICAgICB9LFxuICAgICAgb25FcnJvcjogKGUpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBzYXZlIHNuaXBwZXRcIiwgZSlcbiAgICAgICAgcG9zdEV2ZW50KFwiRkFJTEVEX1RPX1NBVkVfU05JUFBFVFwiKVxuICAgICAgfSxcbiAgICAgIG9uU3VjY2VzczogKCkgPT4ge1xuICAgICAgICBwb3N0RXZlbnQoXCJTTklQUEVUX1NBVkVEXCIpXG4gICAgICB9LFxuICAgIH0pXG4gIH1cblxuICBhc3luYyBzdG9wKCkge1xuICAgIHRoaXMuaHR0cFNlcnZlcj8uY2xvc2UoKVxuICAgIHRoaXMuZXZlbnRzV2F0Y2hlcj8uc3RvcCgpXG4gIH1cbn1cbiIsICJpbXBvcnQgKiBhcyBodHRwIGZyb20gXCJub2RlOmh0dHBcIlxuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IGdldE5vZGVIYW5kbGVyIH0gZnJvbSBcIndpbnRlcnNwZWMvYWRhcHRlcnMvbm9kZVwiXG5pbXBvcnQgcGtnIGZyb20gXCIuLi8uLi9wYWNrYWdlLmpzb25cIlxuXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgd2ludGVyc3BlY0J1bmRsZSBmcm9tIFwiQHRzY2lyY3VpdC9maWxlLXNlcnZlci9kaXN0L2J1bmRsZS5qc1wiXG5pbXBvcnQgeyBnZXRJbmRleCB9IGZyb20gXCIuLi9zaXRlL2dldEluZGV4XCJcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUh0dHBTZXJ2ZXIgPSBhc3luYyAocG9ydCA9IDMwMjApID0+IHtcbiAgY29uc3QgZmlsZVNlcnZlckhhbmRsZXIgPSBnZXROb2RlSGFuZGxlcih3aW50ZXJzcGVjQnVuZGxlIGFzIGFueSwge30pXG5cbiAgY29uc3Qgc2VydmVyID0gaHR0cC5jcmVhdGVTZXJ2ZXIoYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChyZXEudXJsISwgYGh0dHA6Ly8ke3JlcS5oZWFkZXJzLmhvc3R9YClcblxuICAgIGlmICh1cmwucGF0aG5hbWUgPT09IFwiL3N0YW5kYWxvbmUubWluLmpzXCIpIHtcbiAgICAgIGNvbnN0IHN0YW5kYWxvbmVGaWxlUGF0aCA9XG4gICAgICAgIHByb2Nlc3MuZW52LlJVTkZSQU1FX1NUQU5EQUxPTkVfRklMRV9QQVRIIHx8XG4gICAgICAgIHBhdGgucmVzb2x2ZShcbiAgICAgICAgICBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgIFwibm9kZV9tb2R1bGVzXCIsXG4gICAgICAgICAgXCJAdHNjaXJjdWl0L3J1bmZyYW1lL2Rpc3Qvc3RhbmRhbG9uZS5taW4uanNcIixcbiAgICAgICAgKVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHN0YW5kYWxvbmVGaWxlUGF0aCwgXCJ1dGY4XCIpXG4gICAgICAgIHJlcy53cml0ZUhlYWQoMjAwLCB7XG4gICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0OyBjaGFyc2V0PXV0Zi04XCIsXG4gICAgICAgIH0pXG4gICAgICAgIHJlcy5lbmQoY29udGVudClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3Igc2VydmluZyBzdGFuZGFsb25lLm1pbi5qczpcIiwgZXJyb3IpXG4gICAgICB9XG5cbiAgICAgIHJlcy53cml0ZUhlYWQoMzAyLCB7XG4gICAgICAgIExvY2F0aW9uOiBgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9AdHNjaXJjdWl0L3J1bmZyYW1lQCR7cGtnLmRlcGVuZGVuY2llc1tcIkB0c2NpcmN1aXQvcnVuZnJhbWVcIl0ucmVwbGFjZSgvXlteMC05XSsvLCBcIlwiKX0vZGlzdC9zdGFuZGFsb25lLm1pbi5qc2AsXG4gICAgICB9KVxuICAgICAgcmVzLmVuZCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodXJsLnBhdGhuYW1lID09PSBcIi9cIikge1xuICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IGdldEluZGV4KClcbiAgICAgIHJlcy53cml0ZUhlYWQoMjAwLCB7IFwiQ29udGVudC1UeXBlXCI6IFwidGV4dC9odG1sXCIgfSlcbiAgICAgIHJlcy5lbmQoaHRtbClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh1cmwucGF0aG5hbWUuc3RhcnRzV2l0aChcIi9hcGkvXCIpKSB7XG4gICAgICByZXEudXJsID0gcmVxLnVybCEucmVwbGFjZShcIi9hcGkvXCIsIFwiL1wiKVxuICAgICAgZmlsZVNlcnZlckhhbmRsZXIocmVxLCByZXMpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICByZXMud3JpdGVIZWFkKDQwNClcbiAgICByZXMuZW5kKFwiTm90IGZvdW5kXCIpXG4gIH0pXG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlPHsgc2VydmVyOiBodHRwLlNlcnZlciB9PigocmVzb2x2ZSkgPT4ge1xuICAgIHNlcnZlci5saXN0ZW4ocG9ydCwgKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coYFNlcnZlciBydW5uaW5nIGF0IGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0fWApXG4gICAgICByZXNvbHZlKHsgc2VydmVyIH0pXG4gICAgfSlcbiAgfSlcbn1cbiIsICJ7XG4gIFwibmFtZVwiOiBcIkB0c2NpcmN1aXQvY2xpXCIsXG4gIFwibWFpblwiOiBcImRpc3QvbWFpbi5qc1wiLFxuICBcInR5cGVcIjogXCJtb2R1bGVcIixcbiAgXCJ2ZXJzaW9uXCI6IFwiMC4xLjMwXCIsXG4gIFwiYmluXCI6IHtcbiAgICBcInRzY2lcIjogXCIuL2Rpc3QvbWFpbi5qc1wiXG4gIH0sXG4gIFwic2NyaXB0c1wiOiB7XG4gICAgXCJzdGFydFwiOiBcImJ1biBydW4gZGV2XCIsXG4gICAgXCJkZXZcIjogXCJidW4gLS1ob3QgLi9jbGkvbWFpbi50cyBkZXYgLi9leGFtcGxlLWRpci9zbmlwcGV0MS1iYXNpYy50c3hcIixcbiAgICBcImJ1aWxkXCI6IFwidHN1cC1ub2RlIGNsaS9tYWluLnRzIC0tZm9ybWF0IGVzbSAtLXNvdXJjZW1hcCBpbmxpbmVcIixcbiAgICBcImZvcm1hdFwiOiBcImJpb21lIGZvcm1hdCAtLXdyaXRlIC5cIixcbiAgICBcImZvcm1hdDpjaGVja1wiOiBcImJpb21lIGZvcm1hdCAuXCIsXG4gICAgXCJjbGlcIjogXCJidW4gLi9jbGkvbWFpbi50c1wiXG4gIH0sXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkBiaW9tZWpzL2Jpb21lXCI6IFwiXjEuOS40XCIsXG4gICAgXCJAdHNjaXJjdWl0L2NvcmVcIjogXCJeMC4wLjI0OVwiLFxuICAgIFwiQHRzY2lyY3VpdC9mYWtlLXNuaXBwZXRzXCI6IFwiXjAuMC41XCIsXG4gICAgXCJAdHlwZXMvYnVuXCI6IFwiXjEuMS4xNVwiLFxuICAgIFwiQHR5cGVzL2NvbmZpZ3N0b3JlXCI6IFwiXjYuMC4yXCIsXG4gICAgXCJAdHlwZXMvcmVhY3RcIjogXCJeMTkuMC44XCIsXG4gICAgXCJAdHlwZXMvc2VtdmVyXCI6IFwiXjcuNS44XCIsXG4gICAgXCJnZXQtcG9ydFwiOiBcIl43LjEuMFwiLFxuICAgIFwidGVtcHlcIjogXCJeMy4xLjBcIixcbiAgICBcInRzdXBcIjogXCJeOC4zLjVcIixcbiAgICBcInR5cGVkLWt5XCI6IFwiXjAuMC40XCJcbiAgfSxcbiAgXCJwZWVyRGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcInR5cGVzY3JpcHRcIjogXCJeNS4wLjBcIlxuICB9LFxuICBcImRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAdHNjaXJjdWl0L2V2YWxcIjogXCJeMC4wLjk2XCIsXG4gICAgXCJAdHNjaXJjdWl0L2ZpbGUtc2VydmVyXCI6IFwiXjAuMC4xM1wiLFxuICAgIFwiQHRzY2lyY3VpdC9ydW5mcmFtZVwiOiBcIl4wLjAuMTY3XCIsXG4gICAgXCJjaG9raWRhclwiOiBcIjQuMC4xXCIsXG4gICAgXCJjb21tYW5kZXJcIjogXCJeMTIuMS4wXCIsXG4gICAgXCJjb25maWdzdG9yZVwiOiBcIl43LjAuMFwiLFxuICAgIFwiY29zbWljb25maWdcIjogXCJeOS4wLjBcIixcbiAgICBcImRlbGF5XCI6IFwiXjYuMC4wXCIsXG4gICAgXCJqd3QtZGVjb2RlXCI6IFwiXjQuMC4wXCIsXG4gICAgXCJreVwiOiBcIl4xLjcuNFwiLFxuICAgIFwibWFrZS12ZnNcIjogXCJeMS4wLjE1XCIsXG4gICAgXCJwZXJmZWN0LWNsaVwiOiBcIl4xLjAuMjBcIixcbiAgICBcInJlZGF4aW9zXCI6IFwiXjAuNS4xXCIsXG4gICAgXCJzZW12ZXJcIjogXCJeNy42LjNcIlxuICB9XG59XG4iLCAiaW1wb3J0IHBrZyBmcm9tIFwiLi4vLi4vcGFja2FnZS5qc29uXCJcblxuZXhwb3J0IGNvbnN0IGdldEluZGV4ID0gYXN5bmMgKCkgPT4ge1xuICByZXR1cm4gYDxodG1sPlxuICAgIDxoZWFkPlxuICAgIDwvaGVhZD5cbiAgICA8Ym9keT5cbiAgICAgIDxzY3JpcHQgc3JjPVwiaHR0cHM6Ly9jZG4udGFpbHdpbmRjc3MuY29tXCI+PC9zY3JpcHQ+XG4gICAgICA8ZGl2IGlkPVwicm9vdFwiPmxvYWRpbmcuLi48L2Rpdj5cbiAgICAgIDxzY3JpcHQ+XG4gICAgICBnbG9iYWxUaGlzLnByb2Nlc3MgPSB7IGVudjogeyBOT0RFX0VOVjogXCJwcm9kdWN0aW9uXCIgfSB9XG4gICAgICA8L3NjcmlwdD5cbiAgICAgIDxzY3JpcHQgc3JjPVwiL3N0YW5kYWxvbmUubWluLmpzXCI+PC9zY3JpcHQ+XG4gICAgPC9ib2R5PlxuICA8L2h0bWw+YFxufVxuXG4vLyA8c2NyaXB0IHNyYz1cImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHRzY2lyY3VpdC9ydW5mcmFtZUAke3BrZy5kZXBlbmRlbmNpZXNbXCJAdHNjaXJjdWl0L3J1bmZyYW1lXCJdLnJlcGxhY2UoL15bXjAtOV0rLywgXCJcIil9L2Rpc3Qvc3RhbmRhbG9uZS5taW4uanNcIj48L3NjcmlwdD5cbiIsICJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRzXCJcblxuaW50ZXJmYWNlIEV2ZW50IHtcbiAgZXZlbnRfaWQ6IHN0cmluZ1xuICBjcmVhdGVkX2F0OiBzdHJpbmdcbiAgZXZlbnRfdHlwZTogc3RyaW5nXG4gIFtrZXk6IHN0cmluZ106IGFueVxufVxuXG5pbnRlcmZhY2UgRXZlbnRzUmVzcG9uc2Uge1xuICBldmVudF9saXN0OiBFdmVudFtdXG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudHNXYXRjaGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgcHJpdmF0ZSBsYXN0UG9sbFRpbWU6IHN0cmluZ1xuICBwcml2YXRlIHBvbGxJbnRlcnZhbDogbnVtYmVyXG4gIHByaXZhdGUgYmFzZVVybDogc3RyaW5nXG4gIHByaXZhdGUgcG9sbGluZyA9IGZhbHNlXG4gIHByaXZhdGUgdGltZW91dElkPzogTm9kZUpTLlRpbWVvdXRcblxuICBjb25zdHJ1Y3RvcihiYXNlVXJsID0gXCJodHRwOi8vbG9jYWxob3N0OjMwMDBcIiwgcG9sbEludGVydmFsID0gMTAwMCkge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsXG4gICAgdGhpcy5wb2xsSW50ZXJ2YWwgPSBwb2xsSW50ZXJ2YWxcbiAgICB0aGlzLmxhc3RQb2xsVGltZSA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICB9XG5cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgaWYgKHRoaXMucG9sbGluZykgcmV0dXJuXG4gICAgdGhpcy5wb2xsaW5nID0gdHJ1ZVxuICAgIGF3YWl0IHRoaXMucG9sbCgpXG4gIH1cblxuICBzdG9wKCkge1xuICAgIHRoaXMucG9sbGluZyA9IGZhbHNlXG4gICAgaWYgKHRoaXMudGltZW91dElkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0SWQpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwb2xsKCkge1xuICAgIGlmICghdGhpcy5wb2xsaW5nKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICBgJHt0aGlzLmJhc2VVcmx9L2FwaS9ldmVudHMvbGlzdD9zaW5jZT0ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLmxhc3RQb2xsVGltZSl9YCxcbiAgICAgIClcblxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgZXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YTogRXZlbnRzUmVzcG9uc2UgPSBhd2FpdCByZXNwb25zZS5qc29uKClcblxuICAgICAgLy8gVXBkYXRlIGxhc3QgcG9sbCB0aW1lIHRvIGxhdGVzdCBldmVudCBvciBjdXJyZW50IHRpbWVcbiAgICAgIGNvbnN0IGxhdGVzdEV2ZW50ID0gZGF0YS5ldmVudF9saXN0W2RhdGEuZXZlbnRfbGlzdC5sZW5ndGggLSAxXVxuICAgICAgdGhpcy5sYXN0UG9sbFRpbWUgPSBsYXRlc3RFdmVudFxuICAgICAgICA/IGxhdGVzdEV2ZW50LmNyZWF0ZWRfYXRcbiAgICAgICAgOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcblxuICAgICAgLy8gRW1pdCBldmVudHMgaW4gY2hyb25vbG9naWNhbCBvcmRlclxuICAgICAgZGF0YS5ldmVudF9saXN0LmZvckVhY2goKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuZW1pdChldmVudC5ldmVudF90eXBlLCBldmVudClcbiAgICAgICAgdGhpcy5lbWl0KFwiKlwiLCBldmVudClcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZW1pdChcImVycm9yXCIsIGVycm9yKVxuICAgIH1cbiAgICAvLyBTY2hlZHVsZSBuZXh0IHBvbGxcbiAgICB0aGlzLnRpbWVvdXRJZCA9IGdsb2JhbFRoaXMuc2V0VGltZW91dChcbiAgICAgICgpID0+IHRoaXMucG9sbCgpLFxuICAgICAgdGhpcy5wb2xsSW50ZXJ2YWwsXG4gICAgKSBhcyB1bmtub3duIGFzIE5vZGVKUy5UaW1lb3V0XG4gIH1cbn1cbiIsICJpbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgZmluZEltcG9ydHNJblNuaXBwZXQgfSBmcm9tIFwiLi9maW5kSW1wb3J0c0luU25pcHBldFwiXG5pbXBvcnQgeyBpbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldCB9IGZyb20gXCIuL2luc3RhbGxOb2RlTW9kdWxlVHlwZXNGb3JTbmlwcGV0XCJcblxuZXhwb3J0IGNsYXNzIEZpbGVzeXN0ZW1UeXBlc0hhbmRsZXIge1xuICBwcml2YXRlIHByb2plY3RSb290OiBzdHJpbmdcblxuICBjb25zdHJ1Y3Rvcihpbml0aWFsRGlyOiBzdHJpbmcpIHtcbiAgICB0aGlzLnByb2plY3RSb290ID0gdGhpcy5maW5kUHJvamVjdFJvb3QoaW5pdGlhbERpcilcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUluaXRpYWxUeXBlRGVwZW5kZW5jaWVzKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICBjb25zb2xlLmxvZyhcIkNoZWNraW5nIGluaXRpYWwgdHlwZSBkZXBlbmRlbmNpZXMuLi5cIilcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLmFyZVR5cGVzSW5zdGFsbGVkKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkluc3RhbGxpbmcgbWlzc2luZyBpbml0aWFsIHR5cGVzLi4uXCIpXG4gICAgICAgIGF3YWl0IGluc3RhbGxOb2RlTW9kdWxlVHlwZXNGb3JTbmlwcGV0KGZpbGVQYXRoKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJFcnJvciBoYW5kbGluZyBpbml0aWFsIHR5cGUgZGVwZW5kZW5jaWVzOlwiLCBlcnJvcilcbiAgICB9XG4gIH1cblxuICBhc3luYyBoYW5kbGVGaWxlVHlwZURlcGVuZGVuY2llcyhmaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghdGhpcy5hcmVUeXBlc0luc3RhbGxlZChmaWxlUGF0aCkpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJJbnN0YWxsaW5nIG1pc3NpbmcgZmlsZSB0eXBlcy4uLlwiKVxuICAgICAgICBhd2FpdCBpbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldChmaWxlUGF0aClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKFwiRmFpbGVkIHRvIHZlcmlmeSB0eXBlczpcIiwgZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhcmVUeXBlc0luc3RhbGxlZChmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW1wb3J0cyA9IGZpbmRJbXBvcnRzSW5TbmlwcGV0KGZpbGVQYXRoKVxuICAgIHJldHVybiBpbXBvcnRzLmV2ZXJ5KChpbXApID0+IHRoaXMuY2hlY2tUeXBlRXhpc3RzKGltcCkpXG4gIH1cblxuICBwcml2YXRlIGNoZWNrVHlwZUV4aXN0cyhpbXBvcnRQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIWltcG9ydFBhdGguc3RhcnRzV2l0aChcIkB0c2NpL1wiKSkgcmV0dXJuIHRydWVcblxuICAgIGNvbnN0IHBhdGhXaXRob3V0UHJlZml4ID0gaW1wb3J0UGF0aC5yZXBsYWNlKFwiQHRzY2kvXCIsIFwiXCIpXG4gICAgY29uc3QgW293bmVyLCBuYW1lXSA9IHBhdGhXaXRob3V0UHJlZml4LnNwbGl0KFwiLlwiKVxuXG4gICAgY29uc3QgdHlwZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICB0aGlzLnByb2plY3RSb290LFxuICAgICAgXCJub2RlX21vZHVsZXNcIixcbiAgICAgIFwiQHRzY2lcIixcbiAgICAgIGAke293bmVyfS4ke25hbWV9YCxcbiAgICAgIFwiaW5kZXguZC50c1wiLFxuICAgIClcblxuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHR5cGVQYXRoKVxuICB9XG5cbiAgcHJpdmF0ZSBmaW5kUHJvamVjdFJvb3Qoc3RhcnREaXI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHJvb3QgPSBwYXRoLnJlc29sdmUoc3RhcnREaXIpXG4gICAgd2hpbGUgKHJvb3QgIT09IHBhdGgucGFyc2Uocm9vdCkucm9vdCkge1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3QsIFwicGFja2FnZS5qc29uXCIpKSkge1xuICAgICAgICByZXR1cm4gcm9vdFxuICAgICAgfVxuICAgICAgcm9vdCA9IHBhdGguZGlybmFtZShyb290KVxuICAgIH1cbiAgICByZXR1cm4gc3RhcnREaXJcbiAgfVxufVxuIiwgImltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCAqIGFzIHRzIGZyb20gXCJ0eXBlc2NyaXB0XCJcblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRJbXBvcnRzSW5TbmlwcGV0KHNuaXBwZXRQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoc25pcHBldFBhdGgsIFwidXRmLThcIilcbiAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgc25pcHBldFBhdGgsXG4gICAgY29udGVudCxcbiAgICB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0LFxuICAgIHRydWUsXG4gIClcblxuICBjb25zdCBpbXBvcnRzOiBzdHJpbmdbXSA9IFtdXG5cbiAgZnVuY3Rpb24gdmlzaXQobm9kZTogdHMuTm9kZSkge1xuICAgIGlmICh0cy5pc0ltcG9ydERlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICBjb25zdCBtb2R1bGVTcGVjaWZpZXIgPSBub2RlLm1vZHVsZVNwZWNpZmllclxuICAgICAgaWYgKG1vZHVsZVNwZWNpZmllciAmJiB0cy5pc1N0cmluZ0xpdGVyYWwobW9kdWxlU3BlY2lmaWVyKSkge1xuICAgICAgICBjb25zdCBpbXBvcnRQYXRoID0gbW9kdWxlU3BlY2lmaWVyLnRleHRcbiAgICAgICAgaWYgKGltcG9ydFBhdGguc3RhcnRzV2l0aChcIkB0c2NpL1wiKSkge1xuICAgICAgICAgIGltcG9ydHMucHVzaChpbXBvcnRQYXRoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRzLmZvckVhY2hDaGlsZChub2RlLCB2aXNpdClcbiAgfVxuXG4gIHZpc2l0KHNvdXJjZUZpbGUpXG5cbiAgcmV0dXJuIGltcG9ydHNcbn1cbiIsICJpbXBvcnQgQ29uZmlnc3RvcmUgZnJvbSBcImNvbmZpZ3N0b3JlXCJcbmltcG9ydCB0eXBlIHsgVHlwZWRDb25maWdzdG9yZSB9IGZyb20gXCIuL1R5cGVkQ29uZmlnU3RvcmVcIlxuaW1wb3J0IHsgand0RGVjb2RlIH0gZnJvbSBcImp3dC1kZWNvZGVcIlxuXG5leHBvcnQgaW50ZXJmYWNlIENsaUNvbmZpZyB7XG4gIHNlc3Npb25Ub2tlbj86IHN0cmluZ1xuICBnaXRodWJVc2VybmFtZT86IHN0cmluZ1xuICByZWdpc3RyeUFwaVVybD86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgY2xpQ29uZmlnOiBUeXBlZENvbmZpZ3N0b3JlPENsaUNvbmZpZz4gPSBuZXcgQ29uZmlnc3RvcmUoXG4gIFwidHNjaXJjdWl0XCIsXG4pXG5cbmV4cG9ydCBjb25zdCBzZXRTZXNzaW9uVG9rZW4gPSAodG9rZW46IHN0cmluZykgPT4ge1xuICBjbGlDb25maWcuc2V0KFwic2Vzc2lvblRva2VuXCIsIHRva2VuKVxuICBjb25zdCBkZWNvZGVkID0gand0RGVjb2RlPHtcbiAgICBnaXRodWJfdXNlcm5hbWU6IHN0cmluZ1xuICB9Pih0b2tlbilcbiAgY2xpQ29uZmlnLnNldChcImdpdGh1YlVzZXJuYW1lXCIsIGRlY29kZWQuZ2l0aHViX3VzZXJuYW1lKVxufVxuXG5leHBvcnQgY29uc3QgY2xlYXJTZXNzaW9uID0gKCkgPT4ge1xuICBjbGlDb25maWcuZGVsZXRlKFwic2Vzc2lvblRva2VuXCIpXG4gIGNsaUNvbmZpZy5kZWxldGUoXCJnaXRodWJVc2VybmFtZVwiKVxufVxuXG5leHBvcnQgY29uc3QgZ2V0UmVnaXN0cnlBcGlVcmwgPSAoKTogc3RyaW5nID0+IHtcbiAgcmV0dXJuIGNsaUNvbmZpZy5nZXQoXCJyZWdpc3RyeUFwaVVybFwiKSA/PyBcImh0dHBzOi8vcmVnaXN0cnktYXBpLnRzY2lyY3VpdC5jb21cIlxufVxuIiwgImltcG9ydCB7IGdldFJlZ2lzdHJ5QXBpVXJsIH0gZnJvbSBcImxpYi9jbGktY29uZmlnXCJcbmltcG9ydCBreSwgeyB0eXBlIEFmdGVyUmVzcG9uc2VIb29rIH0gZnJvbSBcImt5XCJcblxuZXhwb3J0IGNvbnN0IHByZXR0eVJlc3BvbnNlRXJyb3JIb29rOiBBZnRlclJlc3BvbnNlSG9vayA9IGFzeW5jIChcbiAgX3JlcXVlc3QsXG4gIF9vcHRpb25zLFxuICByZXNwb25zZSxcbikgPT4ge1xuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRkFJTCBbJHtyZXNwb25zZS5zdGF0dXN9XTogJHtfcmVxdWVzdC5tZXRob2R9ICR7XG4gICAgICAgICAgbmV3IFVSTChfcmVxdWVzdC51cmwpLnBhdGhuYW1lXG4gICAgICAgIH0gXFxuXFxuICR7SlNPTi5zdHJpbmdpZnkoZXJyb3JEYXRhLCBudWxsLCAyKX1gLFxuICAgICAgKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vaWdub3JlLCBhbGxvdyB0aGUgZXJyb3IgdG8gYmUgdGhyb3duXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBnZXRLeSA9ICgpID0+IHtcbiAgcmV0dXJuIGt5LmNyZWF0ZSh7XG4gICAgcHJlZml4VXJsOiBnZXRSZWdpc3RyeUFwaVVybCgpLFxuICAgIGhvb2tzOiB7XG4gICAgICBhZnRlclJlc3BvbnNlOiBbcHJldHR5UmVzcG9uc2VFcnJvckhvb2tdLFxuICAgIH0sXG4gIH0pXG59XG4iLCAiaW1wb3J0IHsgY2xpQ29uZmlnIH0gZnJvbSBcImxpYi9jbGktY29uZmlnXCJcbmltcG9ydCB7IGdldEt5IH0gZnJvbSBcImxpYi9yZWdpc3RyeS1hcGkvZ2V0LWt5XCJcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgc2VtdmVyIGZyb20gXCJzZW12ZXJcIlxuXG50eXBlIFB1c2hPcHRpb25zID0ge1xuICBmaWxlUGF0aD86IHN0cmluZ1xuICBvbkV4aXQ/OiAoY29kZTogbnVtYmVyKSA9PiB2b2lkXG4gIG9uRXJyb3I/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkXG4gIG9uU3VjY2Vzcz86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWRcbn1cblxuZXhwb3J0IGNvbnN0IHB1c2hTbmlwcGV0ID0gYXN5bmMgKHtcbiAgZmlsZVBhdGgsXG4gIG9uRXhpdCA9IChjb2RlKSA9PiBwcm9jZXNzLmV4aXQoY29kZSksXG4gIG9uRXJyb3IgPSAobWVzc2FnZSkgPT4gY29uc29sZS5lcnJvcihtZXNzYWdlKSxcbiAgb25TdWNjZXNzID0gKG1lc3NhZ2UpID0+IGNvbnNvbGUubG9nKG1lc3NhZ2UpLFxufTogUHVzaE9wdGlvbnMpID0+IHtcbiAgY29uc3Qgc2Vzc2lvblRva2VuID0gY2xpQ29uZmlnLmdldChcInNlc3Npb25Ub2tlblwiKVxuICBpZiAoIXNlc3Npb25Ub2tlbikge1xuICAgIG9uRXJyb3IoXCJZb3UgbmVlZCB0byBsb2cgaW4gdG8gc2F2ZSBzbmlwcGV0LlwiKVxuICAgIHJldHVybiBvbkV4aXQoMSlcbiAgfVxuXG4gIGxldCBzbmlwcGV0RmlsZVBhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gIGlmIChmaWxlUGF0aCkge1xuICAgIHNuaXBwZXRGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShmaWxlUGF0aClcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkZWZhdWx0RW50cnlwb2ludCA9IHBhdGgucmVzb2x2ZShcImluZGV4LnRzeFwiKVxuICAgIGlmIChmcy5leGlzdHNTeW5jKGRlZmF1bHRFbnRyeXBvaW50KSkge1xuICAgICAgc25pcHBldEZpbGVQYXRoID0gZGVmYXVsdEVudHJ5cG9pbnRcbiAgICAgIG9uU3VjY2VzcyhcIk5vIGZpbGUgcHJvdmlkZWQuIFVzaW5nICdpbmRleC50c3gnIGFzIHRoZSBlbnRyeXBvaW50LlwiKVxuICAgIH0gZWxzZSB7XG4gICAgICBvbkVycm9yKFxuICAgICAgICBcIk5vIGVudHJ5cG9pbnQgZm91bmQuIFJ1biAndHNjaSBpbml0JyB0byBib290c3RyYXAgYSBiYXNpYyBwcm9qZWN0LlwiLFxuICAgICAgKVxuICAgICAgcmV0dXJuIG9uRXhpdCgxKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShcbiAgICBwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHNuaXBwZXRGaWxlUGF0aCksIFwicGFja2FnZS5qc29uXCIpLFxuICApXG4gIGxldCBwYWNrYWdlSnNvbjogeyBuYW1lPzogc3RyaW5nOyBhdXRob3I/OiBzdHJpbmc7IHZlcnNpb24/OiBzdHJpbmcgfSA9IHt9XG4gIGlmIChmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIHtcbiAgICB0cnkge1xuICAgICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgpLnRvU3RyaW5nKCkpXG4gICAgfSBjYXRjaCB7XG4gICAgICBvbkVycm9yKFwiSW52YWxpZCBwYWNrYWdlLmpzb24gcHJvdmlkZWRcIilcbiAgICAgIHJldHVybiBvbkV4aXQoMSlcbiAgICB9XG4gIH1cblxuICBpZiAoIWZzLmV4aXN0c1N5bmMoc25pcHBldEZpbGVQYXRoKSkge1xuICAgIG9uRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke3NuaXBwZXRGaWxlUGF0aH1gKVxuICAgIHJldHVybiBvbkV4aXQoMSlcbiAgfVxuXG4gIGNvbnN0IGt5ID0gZ2V0S3koKVxuICBjb25zdCBwYWNrYWdlTmFtZSA9IChcbiAgICBwYWNrYWdlSnNvbi5uYW1lID8/IHBhdGgucGFyc2Uoc25pcHBldEZpbGVQYXRoKS5uYW1lXG4gICkucmVwbGFjZSgvXkAvLCBcIlwiKVxuICBjb25zdCBwYWNrYWdlQXV0aG9yID1cbiAgICBwYWNrYWdlSnNvbi5hdXRob3I/LnNwbGl0KFwiIFwiKVswXSA/PyBjbGlDb25maWcuZ2V0KFwiZ2l0aHViVXNlcm5hbWVcIilcbiAgY29uc3QgcGFja2FnZUlkZW50aWZpZXIgPSBgJHtwYWNrYWdlQXV0aG9yfS8ke3BhY2thZ2VOYW1lfWBcblxuICBsZXQgcGFja2FnZVZlcnNpb24gPVxuICAgIHBhY2thZ2VKc29uLnZlcnNpb24gPz9cbiAgICAoYXdhaXQga3lcbiAgICAgIC5wb3N0PHtcbiAgICAgICAgZXJyb3I/OiB7IGVycm9yX2NvZGU6IHN0cmluZyB9XG4gICAgICAgIHBhY2thZ2VfcmVsZWFzZXM/OiB7IHZlcnNpb246IHN0cmluZzsgaXNfbGF0ZXN0OiBib29sZWFuIH1bXVxuICAgICAgfT4oXCJwYWNrYWdlX3JlbGVhc2VzL2xpc3RcIiwge1xuICAgICAgICBqc29uOiB7IHBhY2thZ2VfbmFtZTogcGFja2FnZUlkZW50aWZpZXIgfSxcbiAgICAgIH0pXG4gICAgICAuanNvbigpXG4gICAgICAudGhlbihcbiAgICAgICAgKHJlc3BvbnNlKSA9PlxuICAgICAgICAgIHJlc3BvbnNlLnBhY2thZ2VfcmVsZWFzZXM/LltyZXNwb25zZS5wYWNrYWdlX3JlbGVhc2VzLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICA/LnZlcnNpb24sXG4gICAgICApXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIG9uRXJyb3IoXCJGYWlsZWQgdG8gcmV0cmlldmUgbGF0ZXN0IHBhY2thZ2UgdmVyc2lvbjpcIiArIGVycm9yKVxuICAgICAgICByZXR1cm4gb25FeGl0KDEpXG4gICAgICB9KSlcblxuICBpZiAoIXBhY2thZ2VWZXJzaW9uKSB7XG4gICAgb25FcnJvcihcIkZhaWxlZCB0byByZXRyaWV2ZSBwYWNrYWdlIHZlcnNpb24uXCIpXG4gICAgcmV0dXJuIG9uRXhpdCgxKVxuICB9XG5cbiAgY29uc3QgdXBkYXRlUGFja2FnZUpzb25WZXJzaW9uID0gKG5ld1ZlcnNpb24/OiBzdHJpbmcpID0+IHtcbiAgICBpZiAocGFja2FnZUpzb24udmVyc2lvbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGFja2FnZUpzb24udmVyc2lvbiA9IG5ld1ZlcnNpb24gPz8gYCR7cGFja2FnZVZlcnNpb259YFxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24sIG51bGwsIDIpKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgb25FcnJvcihcIkZhaWxlZCB0byB1cGRhdGUgcGFja2FnZS5qc29uIHZlcnNpb246XCIgKyBlcnJvcilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBkb2VzUGFja2FnZUV4aXN0ID0gYXdhaXQga3lcbiAgICAucG9zdDx7IGVycm9yPzogeyBlcnJvcl9jb2RlOiBzdHJpbmcgfSB9PihcInBhY2thZ2VzL2dldFwiLCB7XG4gICAgICBqc29uOiB7IG5hbWU6IHBhY2thZ2VJZGVudGlmaWVyIH0sXG4gICAgICB0aHJvd0h0dHBFcnJvcnM6IGZhbHNlLFxuICAgIH0pXG4gICAgLmpzb24oKVxuICAgIC50aGVuKChyZXNwb25zZSkgPT4gIShyZXNwb25zZS5lcnJvcj8uZXJyb3JfY29kZSA9PT0gXCJwYWNrYWdlX25vdF9mb3VuZFwiKSlcblxuICBpZiAoIWRvZXNQYWNrYWdlRXhpc3QpIHtcbiAgICBhd2FpdCBreVxuICAgICAgLnBvc3QoXCJwYWNrYWdlcy9jcmVhdGVcIiwge1xuICAgICAgICBqc29uOiB7IG5hbWU6IHBhY2thZ2VJZGVudGlmaWVyIH0sXG4gICAgICAgIGhlYWRlcnM6IHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Nlc3Npb25Ub2tlbn1gIH0sXG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBvbkVycm9yKFwiRXJyb3IgY3JlYXRpbmcgcGFja2FnZTpcIiArIGVycm9yKVxuICAgICAgICByZXR1cm4gb25FeGl0KDEpXG4gICAgICB9KVxuICB9XG5cbiAgY29uc3QgZG9lc1JlbGVhc2VFeGlzdCA9IGF3YWl0IGt5XG4gICAgLnBvc3Q8e1xuICAgICAgZXJyb3I/OiB7IGVycm9yX2NvZGU6IHN0cmluZyB9XG4gICAgICBwYWNrYWdlX3JlbGVhc2U/OiB7IHZlcnNpb246IHN0cmluZyB9XG4gICAgfT4oXCJwYWNrYWdlX3JlbGVhc2VzL2dldFwiLCB7XG4gICAgICBqc29uOiB7XG4gICAgICAgIHBhY2thZ2VfbmFtZV93aXRoX3ZlcnNpb246IGAke3BhY2thZ2VJZGVudGlmaWVyfUAke3BhY2thZ2VWZXJzaW9ufWAsXG4gICAgICB9LFxuICAgICAgdGhyb3dIdHRwRXJyb3JzOiBmYWxzZSxcbiAgICB9KVxuICAgIC5qc29uKClcbiAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChyZXNwb25zZS5wYWNrYWdlX3JlbGVhc2U/LnZlcnNpb24pIHtcbiAgICAgICAgcGFja2FnZVZlcnNpb24gPSByZXNwb25zZS5wYWNrYWdlX3JlbGVhc2UudmVyc2lvblxuICAgICAgICB1cGRhdGVQYWNrYWdlSnNvblZlcnNpb24ocmVzcG9uc2UucGFja2FnZV9yZWxlYXNlLnZlcnNpb24pXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gIShyZXNwb25zZS5lcnJvcj8uZXJyb3JfY29kZSA9PT0gXCJwYWNrYWdlX3JlbGVhc2Vfbm90X2ZvdW5kXCIpXG4gICAgfSlcblxuICBpZiAoZG9lc1JlbGVhc2VFeGlzdCkge1xuICAgIGNvbnN0IGJ1bXBlZFZlcnNpb24gPSBzZW12ZXIuaW5jKHBhY2thZ2VWZXJzaW9uLCBcInBhdGNoXCIpIVxuICAgIG9uU3VjY2VzcyhcbiAgICAgIGBJbmNyZW1lbnRpbmcgUGFja2FnZSBWZXJzaW9uICR7cGFja2FnZVZlcnNpb259IC0+ICR7YnVtcGVkVmVyc2lvbn1gLFxuICAgIClcbiAgICBwYWNrYWdlVmVyc2lvbiA9IGJ1bXBlZFZlcnNpb25cbiAgICB1cGRhdGVQYWNrYWdlSnNvblZlcnNpb24ocGFja2FnZVZlcnNpb24pXG4gIH1cblxuICBhd2FpdCBreVxuICAgIC5wb3N0KFwicGFja2FnZV9yZWxlYXNlcy9jcmVhdGVcIiwge1xuICAgICAganNvbjoge1xuICAgICAgICBwYWNrYWdlX25hbWVfd2l0aF92ZXJzaW9uOiBgJHtwYWNrYWdlSWRlbnRpZmllcn1AJHtwYWNrYWdlVmVyc2lvbn1gLFxuICAgICAgfSxcbiAgICAgIHRocm93SHR0cEVycm9yczogZmFsc2UsXG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICBvbkVycm9yKFwiRXJyb3IgY3JlYXRpbmcgcmVsZWFzZTpcIiArIGVycm9yKVxuICAgICAgcmV0dXJuIG9uRXhpdCgxKVxuICAgIH0pXG5cbiAgb25TdWNjZXNzKFwiXFxuXCIpXG5cbiAgY29uc3QgZGlyZWN0b3J5RmlsZXMgPSBmcy5yZWFkZGlyU3luYyhwYXRoLmRpcm5hbWUoc25pcHBldEZpbGVQYXRoKSlcbiAgZm9yIChjb25zdCBmaWxlIG9mIGRpcmVjdG9yeUZpbGVzKSB7XG4gICAgY29uc3QgZmlsZUV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShmaWxlKS5yZXBsYWNlKFwiLlwiLCBcIlwiKVxuICAgIGlmICghW1wianNvblwiLCBcInRzeFwiLCBcInRzXCJdLmluY2x1ZGVzKGZpbGVFeHRlbnNpb24pKSBjb250aW51ZVxuICAgIGNvbnN0IGZpbGVDb250ZW50ID1cbiAgICAgIGZzXG4gICAgICAgIC5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhdGguZGlybmFtZShzbmlwcGV0RmlsZVBhdGgpLCBmaWxlKSlcbiAgICAgICAgLnRvU3RyaW5nKCkgPz8gXCJcIlxuICAgIGF3YWl0IGt5XG4gICAgICAucG9zdChcInBhY2thZ2VfZmlsZXMvY3JlYXRlXCIsIHtcbiAgICAgICAganNvbjoge1xuICAgICAgICAgIGZpbGVfcGF0aDogZmlsZSxcbiAgICAgICAgICBjb250ZW50X3RleHQ6IGZpbGVDb250ZW50LFxuICAgICAgICAgIHBhY2thZ2VfbmFtZV93aXRoX3ZlcnNpb246IGAke3BhY2thZ2VJZGVudGlmaWVyfUAke3BhY2thZ2VWZXJzaW9ufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHRocm93SHR0cEVycm9yczogZmFsc2UsXG4gICAgICB9KVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBvblN1Y2Nlc3MoYFVwbG9hZGVkIGZpbGUgJHtmaWxlfSB0byB0aGUgcmVnaXN0cnkuYClcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIG9uRXJyb3IoYEVycm9yIHVwbG9hZGluZyBmaWxlICR7ZmlsZX06YCArIGVycm9yKVxuICAgICAgfSlcbiAgfVxuXG4gIG9uU3VjY2VzcyhcbiAgICBbXG4gICAgICBgXFxuXHVEODNDXHVERjg5IFN1Y2Nlc3NmdWxseSBwdXNoZWQgcGFja2FnZSAke3BhY2thZ2VJZGVudGlmaWVyfUAke3BhY2thZ2VWZXJzaW9ufSB0byB0aGUgcmVnaXN0cnkhJHtCdW4uY29sb3IoXCJibHVlXCIsIFwiYW5zaVwiKX1gLFxuICAgICAgYGh0dHBzOi8vdHNjaXJjdWl0LmNvbS8ke3BhY2thZ2VJZGVudGlmaWVyfSBcXHgxYlswbWAsXG4gICAgXS5qb2luKFwiIFwiKSxcbiAgKVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgc2V0U2Vzc2lvblRva2VuIH0gZnJvbSBcImxpYi9jbGktY29uZmlnXCJcbmltcG9ydCBkZWxheSBmcm9tIFwiZGVsYXlcIlxuaW1wb3J0IHsgZ2V0S3kgfSBmcm9tIFwibGliL3JlZ2lzdHJ5LWFwaS9nZXQta3lcIlxuaW1wb3J0IHR5cGUgeyBFbmRwb2ludFJlc3BvbnNlIH0gZnJvbSBcImxpYi9yZWdpc3RyeS1hcGkvZW5kcG9pbnQtdHlwZXNcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJBdXRoTG9naW4gPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICAvLyBEZWZpbmUgdGhlIGxvZ2luIGFjdGlvbiBvbmNlIHRvIHNoYXJlIGJldHdlZW4gYm90aCBjb21tYW5kc1xuICBjb25zdCBsb2dpbkFjdGlvbiA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBreSA9IGdldEt5KClcblxuICAgIGNvbnN0IHsgbG9naW5fcGFnZSB9ID0gYXdhaXQga3lcbiAgICAgIC5wb3N0PEVuZHBvaW50UmVzcG9uc2VbXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2NyZWF0ZVwiXT4oXG4gICAgICAgIFwic2Vzc2lvbnMvbG9naW5fcGFnZS9jcmVhdGVcIixcbiAgICAgICAge1xuICAgICAgICAgIGpzb246IHt9LFxuICAgICAgICB9LFxuICAgICAgKVxuICAgICAgLmpzb24oKVxuXG4gICAgY29uc29sZS5sb2coXCJQbGVhc2UgdmlzaXQgdGhlIGZvbGxvd2luZyBVUkwgdG8gbG9nIGluOlwiKVxuICAgIGNvbnNvbGUubG9nKGxvZ2luX3BhZ2UudXJsKVxuXG4gICAgLy8gV2FpdCB1bnRpbCB3ZSByZWNlaXZlIGNvbmZpcm1hdGlvblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCB7IGxvZ2luX3BhZ2U6IG5ld19sb2dpbl9wYWdlIH0gPSBhd2FpdCBreVxuICAgICAgICAucG9zdDxFbmRwb2ludFJlc3BvbnNlW1wic2Vzc2lvbnMvbG9naW5fcGFnZS9nZXRcIl0+KFxuICAgICAgICAgIFwic2Vzc2lvbnMvbG9naW5fcGFnZS9nZXRcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBqc29uOiB7XG4gICAgICAgICAgICAgIGxvZ2luX3BhZ2VfaWQ6IGxvZ2luX3BhZ2UubG9naW5fcGFnZV9pZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtsb2dpbl9wYWdlLmxvZ2luX3BhZ2VfYXV0aF90b2tlbn1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICAgIC5qc29uKClcblxuICAgICAgaWYgKG5ld19sb2dpbl9wYWdlLndhc19sb2dpbl9zdWNjZXNzZnVsKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiTG9nZ2VkIGluISBHZW5lcmF0aW5nIHRva2VuLi4uXCIpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGlmIChuZXdfbG9naW5fcGFnZS5pc19leHBpcmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkxvZ2luIHBhZ2UgZXhwaXJlZFwiKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBkZWxheSgxMDAwKVxuICAgIH1cblxuICAgIGNvbnN0IHsgc2Vzc2lvbiB9ID0gYXdhaXQga3lcbiAgICAgIC5wb3N0PEVuZHBvaW50UmVzcG9uc2VbXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2V4Y2hhbmdlX2Zvcl9jbGlfc2Vzc2lvblwiXT4oXG4gICAgICAgIFwic2Vzc2lvbnMvbG9naW5fcGFnZS9leGNoYW5nZV9mb3JfY2xpX3Nlc3Npb25cIixcbiAgICAgICAge1xuICAgICAgICAgIGpzb246IHtcbiAgICAgICAgICAgIGxvZ2luX3BhZ2VfaWQ6IGxvZ2luX3BhZ2UubG9naW5fcGFnZV9pZCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtsb2dpbl9wYWdlLmxvZ2luX3BhZ2VfYXV0aF90b2tlbn1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgICAuanNvbigpXG5cbiAgICBzZXRTZXNzaW9uVG9rZW4oc2Vzc2lvbi50b2tlbilcbiAgICBjb25zb2xlLmxvZyhcIlxcblJlYWR5IHRvIHVzZSFcIilcbiAgfVxuXG4gIC8vIFJlZ2lzdGVyIHRoZSBhdXRoIGxvZ2luIHN1YmNvbW1hbmRcbiAgcHJvZ3JhbS5jb21tYW5kc1xuICAgIC5maW5kKChjKSA9PiBjLm5hbWUoKSA9PT0gXCJhdXRoXCIpIVxuICAgIC5jb21tYW5kKFwibG9naW5cIilcbiAgICAuZGVzY3JpcHRpb24oXCJBdXRoZW50aWNhdGUgQ0xJLCBsb2dpbiB0byByZWdpc3RyeVwiKVxuICAgIC5hY3Rpb24obG9naW5BY3Rpb24pXG5cbiAgLy8gUmVnaXN0ZXIgdGhlIHRvcC1sZXZlbCBsb2dpbiBjb21tYW5kIGFzIGFuIGFsaWFzXG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImxvZ2luXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiTG9naW4gdG8gdHNjaXJjdWl0IHJlZ2lzdHJ5XCIpXG4gICAgLmFjdGlvbihsb2dpbkFjdGlvbilcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IGNsZWFyU2Vzc2lvbiB9IGZyb20gXCJsaWIvY2xpLWNvbmZpZ1wiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckF1dGhMb2dvdXQgPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBjb25zdCBsb2dvdXRBY3Rpb24gPSAoKSA9PiB7XG4gICAgY2xlYXJTZXNzaW9uKClcbiAgICBjb25zb2xlLmxvZyhcIllvdSBoYXZlIGJlZW4gbG9nZ2VkIG91dCFcIilcbiAgfVxuXG4gIC8vIFJlZ2lzdGVyIHRoZSBhdXRoIGxvZ291dCBzdWJjb21tYW5kXG4gIHByb2dyYW0uY29tbWFuZHNcbiAgICAuZmluZCgoYykgPT4gYy5uYW1lKCkgPT09IFwiYXV0aFwiKSFcbiAgICAuY29tbWFuZChcImxvZ291dFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkxvZ291dCBmcm9tIHJlZ2lzdHJ5XCIpXG4gICAgLmFjdGlvbihsb2dvdXRBY3Rpb24pXG5cbiAgLy8gUmVnaXN0ZXIgdGhlIHRvcC1sZXZlbCBsb2dvdXQgY29tbWFuZCBhcyBhbiBhbGlhc1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoXCJsb2dvdXRcIilcbiAgICAuZGVzY3JpcHRpb24oXCJMb2dvdXQgZnJvbSB0c2NpcmN1aXQgcmVnaXN0cnlcIilcbiAgICAuYWN0aW9uKGxvZ291dEFjdGlvbilcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQXV0aCA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZChcImF1dGhcIikuZGVzY3JpcHRpb24oXCJMb2dpbi9sb2dvdXRcIilcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQ29uZmlnID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbS5jb21tYW5kKFwiY29uZmlnXCIpLmRlc2NyaXB0aW9uKFwiTWFuYWdlIHRzY2lyY3VpdCBDTEkgY29uZmlndXJhdGlvblwiKVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgY2xpQ29uZmlnIH0gZnJvbSBcImxpYi9jbGktY29uZmlnXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQ29uZmlnUHJpbnQgPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtLmNvbW1hbmRzXG4gICAgLmZpbmQoKGMpID0+IGMubmFtZSgpID09PSBcImNvbmZpZ1wiKSFcbiAgICAuY29tbWFuZChcInByaW50XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiUHJpbnQgdGhlIGN1cnJlbnQgY29uZmlnXCIpXG4gICAgLmFjdGlvbigoKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShjbGlDb25maWcuYWxsLCBudWxsLCAyKSlcbiAgICB9KVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgZ2V0S3kgfSBmcm9tIFwibGliL3JlZ2lzdHJ5LWFwaS9nZXQta3lcIlxuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IHNldHVwVHNjaVByb2plY3QgfSBmcm9tIFwibGliL3NoYXJlZC9zZXR1cC10c2NpLXBhY2thZ2VzXCJcbmltcG9ydCB7IGdlbmVyYXRlVHNDb25maWcgfSBmcm9tIFwibGliL3NoYXJlZC9nZW5lcmF0ZS10cy1jb25maWdcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJDbG9uZSA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImNsb25lXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiQ2xvbmUgYSBzbmlwcGV0IGZyb20gdGhlIHJlZ2lzdHJ5XCIpXG4gICAgLmFyZ3VtZW50KFwiPHNuaXBwZXQ+XCIsIFwiU25pcHBldCB0byBjbG9uZSAoZS5nLiBhdXRob3Ivc25pcHBldE5hbWUpXCIpXG4gICAgLmFjdGlvbihhc3luYyAoc25pcHBldFBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgbWF0Y2ggPSBzbmlwcGV0UGF0aC5tYXRjaCgvXig/OkB0c2NpXFwvKT8oW14vLl0rKVsvLl0oLispJC8pXG4gICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJJbnZhbGlkIHNuaXBwZXQgcGF0aC4gVXNlIGZvcm1hdDogYXV0aG9yL3NuaXBwZXROYW1lLCBhdXRob3Iuc25pcHBldE5hbWUsIG9yIEB0c2NpL2F1dGhvci5zbmlwcGV0TmFtZVwiLFxuICAgICAgICApXG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBbLCBhdXRob3IsIHNuaXBwZXROYW1lXSA9IG1hdGNoXG4gICAgICBjb25zb2xlLmxvZyhgQ2xvbmluZyAke2F1dGhvcn0vJHtzbmlwcGV0TmFtZX0uLi5gKVxuXG4gICAgICBjb25zdCBreSA9IGdldEt5KClcbiAgICAgIGxldCBwYWNrYWdlRmlsZUxpc3RcbiAgICAgIHRyeSB7XG4gICAgICAgIHBhY2thZ2VGaWxlTGlzdCA9IGF3YWl0IGt5XG4gICAgICAgICAgLnBvc3Q8eyBwYWNrYWdlX2ZpbGVzOiBBcnJheTx7IGZpbGVfcGF0aDogc3RyaW5nIH0+IH0+KFxuICAgICAgICAgICAgXCJwYWNrYWdlX2ZpbGVzL2xpc3RcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAganNvbjoge1xuICAgICAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogYCR7YXV0aG9yfS8ke3NuaXBwZXROYW1lfWAsXG4gICAgICAgICAgICAgICAgdXNlX2xhdGVzdF92ZXJzaW9uOiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApXG4gICAgICAgICAgLmpzb24oKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBcIkZhaWxlZCB0byBmZXRjaCBwYWNrYWdlIGZpbGVzOlwiLFxuICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3IsXG4gICAgICAgIClcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoYCR7YXV0aG9yfS4ke3NuaXBwZXROYW1lfWApXG4gICAgICBmcy5ta2RpclN5bmMoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSlcblxuICAgICAgZm9yIChjb25zdCBmaWxlSW5mbyBvZiBwYWNrYWdlRmlsZUxpc3QucGFja2FnZV9maWxlcykge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGZpbGVJbmZvLmZpbGVfcGF0aC5yZXBsYWNlKC9eXFwvfGRpc3RcXC8vZywgXCJcIilcbiAgICAgICAgaWYgKCFmaWxlUGF0aCkgY29udGludWVcblxuICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBmaWxlUGF0aClcbiAgICAgICAgZnMubWtkaXJTeW5jKHBhdGguZGlybmFtZShmdWxsUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBmaWxlQ29udGVudCA9IGF3YWl0IGt5XG4gICAgICAgICAgICAucG9zdDx7IHBhY2thZ2VfZmlsZTogeyBjb250ZW50X3RleHQ6IHN0cmluZyB9IH0+KFxuICAgICAgICAgICAgICBcInBhY2thZ2VfZmlsZXMvZ2V0XCIsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBqc29uOiB7XG4gICAgICAgICAgICAgICAgICBwYWNrYWdlX25hbWU6IGAke2F1dGhvcn0vJHtzbmlwcGV0TmFtZX1gLFxuICAgICAgICAgICAgICAgICAgZmlsZV9wYXRoOiBmaWxlSW5mby5maWxlX3BhdGgsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5qc29uKClcblxuICAgICAgICAgIGxldCBmaWxlVGV4dCA9IGZpbGVDb250ZW50LnBhY2thZ2VfZmlsZS5jb250ZW50X3RleHRcblxuICAgICAgICAgIC8vIEVuc3VyZSBhbGwgLnRzeCBmaWxlcyBjb250YWluIFwiaW1wb3J0ICdAdHNjaXJjdWl0L2NvcmUnO1wiXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZmlsZVBhdGguZW5kc1dpdGgoXCIudHN4XCIpICYmXG4gICAgICAgICAgICAhZmlsZVRleHQuaW5jbHVkZXMoXCJAdHNjaXJjdWl0L2NvcmVcIilcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGZpbGVUZXh0ID0gYGltcG9ydCBcIkB0c2NpcmN1aXQvY29yZVwiO1xcblxcbiR7ZmlsZVRleHR9YFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZnVsbFBhdGgsIGZpbGVUZXh0KVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBTa2lwcGluZyAke2ZpbGVQYXRofSBkdWUgdG8gZXJyb3I6YCxcbiAgICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3IsXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgIHBhdGguam9pbihkaXJQYXRoLCBcIi5ucG1yY1wiKSxcbiAgICAgICAgXCJAdHNjaTpyZWdpc3RyeT1odHRwczovL25wbS50c2NpcmN1aXQuY29tXCIsXG4gICAgICApXG5cbiAgICAgIGdlbmVyYXRlVHNDb25maWcoZGlyUGF0aClcbiAgICAgIHNldHVwVHNjaVByb2plY3QoZGlyUGF0aClcblxuICAgICAgY29uc29sZS5sb2coYFN1Y2Nlc3NmdWxseSBjbG9uZWQgdG8gJHtkaXJQYXRofS9gKVxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBSdW4gXCJjZCAke3BhdGguZGlybmFtZShkaXJQYXRoKX0gJiYgdHNjaSBkZXZcIiB0byBzdGFydCBkZXZlbG9waW5nLmAsXG4gICAgICApXG4gICAgfSlcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IGNyZWF0ZUNpcmN1aXRXZWJXb3JrZXIgfSBmcm9tIFwiQHRzY2lyY3VpdC9ldmFsXCJcbmltcG9ydCB3ZWJXb3JrZXJCdW5kbGVVcmwgZnJvbSBcIkB0c2NpcmN1aXQvZXZhbC9ibG9iLXVybFwiXG5pbXBvcnQgeyBnZXRWaXJ0dWFsRmlsZVN5c3RlbUZyb21EaXJQYXRoIH0gZnJvbSBcIm1ha2UtdmZzXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzXCJcblxuY29uc3QgQUxMT1dFRF9GT1JNQVRTID0gW1xuICBcImpzb25cIixcbiAgXCJjaXJjdWl0LWpzb25cIixcbiAgXCJzY2hlbWF0aWMtc3ZnXCIsXG4gIFwicGNiLXN2Z1wiLFxuICBcImdlcmJlcnNcIixcbiAgXCJyZWFkYWJsZS1uZXRsaXN0XCIsXG4gIFwiZ2x0ZlwiLFxuICBcInNwZWNjdHJhLWRzblwiLFxuXSBhcyBjb25zdFxuXG50eXBlIEZvcm1hdCA9ICh0eXBlb2YgQUxMT1dFRF9GT1JNQVRTKVtudW1iZXJdXG5cbmNvbnN0IE9VVFBVVF9FWFRFTlNJT05TID0ge1xuICBqc29uOiBcIi5jaXJjdWl0Lmpzb25cIixcbiAgXCJjaXJjdWl0LWpzb25cIjogXCIuY2lyY3VpdC5qc29uXCIsXG4gIFwic2NoZW1hdGljLXN2Z1wiOiBcIi1zY2hlbWF0aWMuc3ZnXCIsXG4gIFwicGNiLXN2Z1wiOiBcIi1wY2Iuc3ZnXCIsXG4gIGdlcmJlcnM6IFwiLWdlcmJlcnMuemlwXCIsXG4gIFwicmVhZGFibGUtbmV0bGlzdFwiOiBcIi1yZWFkYWJsZS5uZXRsaXN0XCIsXG4gIGdsdGY6IFwiLmdsdGZcIixcbiAgXCJzcGVjY3RyYS1kc25cIjogXCIuZHNuXCIsXG59XG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckV4cG9ydCA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImV4cG9ydFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkV4cG9ydCB0c2NpcmN1aXQgY29kZSB0byB2YXJpb3VzIGZvcm1hdHNcIilcbiAgICAuYXJndW1lbnQoXCI8ZmlsZT5cIiwgXCJQYXRoIHRvIHRoZSBzbmlwcGV0IGZpbGVcIilcbiAgICAub3B0aW9uKFwiLWYsIC0tZm9ybWF0IDxmb3JtYXQ+XCIsIFwiT3V0cHV0IGZvcm1hdFwiKVxuICAgIC5vcHRpb24oXCItbywgLS1vdXRwdXQgPHBhdGg+XCIsIFwiT3V0cHV0IGZpbGUgcGF0aFwiKVxuICAgIC5hY3Rpb24oYXN5bmMgKGZpbGUsIG9wdGlvbnMpID0+IHtcbiAgICAgIGNvbnN0IHsgZm9ybWF0ID0gXCJjaXJjdWl0LWpzb25cIiB9ID0gb3B0aW9uc1xuICAgICAgbGV0IHsgb3V0cHV0IH0gPSBvcHRpb25zXG4gICAgICBpZiAoIUFMTE9XRURfRk9STUFUUy5pbmNsdWRlcyhmb3JtYXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW52YWxpZCBmb3JtYXQ6ICR7Zm9ybWF0fVxcblN1cHBvcnRlZCBmb3JtYXRzOiAke0FMTE9XRURfRk9STUFUUy5qb2luKFwiLFwiKX1gLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIGlmICghb3V0cHV0KSB7XG4gICAgICAgIG91dHB1dCA9IHBhdGguYmFzZW5hbWUoZmlsZSkucmVwbGFjZSgvXFwuW14uXSskLywgXCJcIilcbiAgICAgIH1cblxuICAgICAgY29uc3Qgd29ya2VyID0gYXdhaXQgY3JlYXRlQ2lyY3VpdFdlYldvcmtlcih7XG4gICAgICAgIHdlYldvcmtlclVybDogd2ViV29ya2VyQnVuZGxlVXJsLFxuICAgICAgfSlcblxuICAgICAgY29uc3QgcHJvamVjdERpciA9IHBhdGguZGlybmFtZShmaWxlKVxuXG4gICAgICBjb25zdCByZWxhdGl2ZUNvbXBvbmVudFBhdGggPSBwYXRoLnJlbGF0aXZlKHByb2plY3REaXIsIGZpbGUpXG5cbiAgICAgIGF3YWl0IHdvcmtlci5leGVjdXRlV2l0aEZzTWFwKHtcbiAgICAgICAgZW50cnlwb2ludDogXCJlbnRyeXBvaW50LnRzeFwiLFxuICAgICAgICBmc01hcDoge1xuICAgICAgICAgIC4uLigoYXdhaXQgZ2V0VmlydHVhbEZpbGVTeXN0ZW1Gcm9tRGlyUGF0aCh7XG4gICAgICAgICAgICBkaXJQYXRoOiBwcm9qZWN0RGlyLFxuICAgICAgICAgICAgY29udGVudEZvcm1hdDogXCJzdHJpbmdcIixcbiAgICAgICAgICB9KSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiksXG4gICAgICAgICAgXCJlbnRyeXBvaW50LnRzeFwiOiBgXG5pbXBvcnQgTXlDaXJjdWl0IGZyb20gXCIuLyR7cmVsYXRpdmVDb21wb25lbnRQYXRofVwiXG5cbmNpcmN1aXQuYWRkKDxNeUNpcmN1aXQgLz4pXG4gICAgICAgIGAsXG4gICAgICAgIH0sXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCB3b3JrZXIucmVuZGVyVW50aWxTZXR0bGVkKClcblxuICAgICAgY29uc3QgY2lyY3VpdEpzb24gPSBhd2FpdCB3b3JrZXIuZ2V0Q2lyY3VpdEpzb24oKVxuXG4gICAgICBjb25zdCBvdXRwdXRQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICBwcm9qZWN0RGlyLFxuICAgICAgICBgJHtvdXRwdXR9JHtPVVRQVVRfRVhURU5TSU9OU1tmb3JtYXQgYXMgRm9ybWF0XX1gLFxuICAgICAgKVxuXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKG91dHB1dFBhdGgsIEpTT04uc3RyaW5naWZ5KGNpcmN1aXRKc29uKSlcblxuICAgICAgY29uc29sZS5sb2coYEV4cG9ydGVkIHRvICR7b3V0cHV0UGF0aH1gKVxuXG4gICAgICBwcm9jZXNzLmV4aXQoMClcbiAgICB9KVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgY2xpQ29uZmlnIH0gZnJvbSBcImxpYi9jbGktY29uZmlnXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQXV0aFByaW50VG9rZW4gPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtLmNvbW1hbmRzXG4gICAgLmZpbmQoKGMpID0+IGMubmFtZSgpID09PSBcImF1dGhcIikhXG4gICAgLmNvbW1hbmQoXCJwcmludC10b2tlblwiKVxuICAgIC5kZXNjcmlwdGlvbihcIlByaW50cyB5b3VyIGF1dGggdG9rZW5cIilcbiAgICAuYWN0aW9uKCgpID0+IHtcbiAgICAgIGNvbnN0IHRva2VuID0gY2xpQ29uZmlnLmdldChcInNlc3Npb25Ub2tlblwiKVxuICAgICAgaWYgKCF0b2tlbikgcmV0dXJuIGNvbnNvbGUubG9nKFwiWW91IG5lZWQgdG8gbG9nIGluIHRvIGFjY2VzcyB0aGlzLlwiKVxuICAgICAgY29uc29sZS5sb2coXCJZb3VyIFRva2VuOlxcblwiLCB0b2tlbilcbiAgICB9KVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgc2V0U2Vzc2lvblRva2VuIH0gZnJvbSBcImxpYi9jbGktY29uZmlnXCJcblxuZnVuY3Rpb24gdmFsaWRhdGVKV1RMZW5ndGgodG9rZW46IHN0cmluZykge1xuICBjb25zdCBwYXJ0cyA9IHRva2VuLnNwbGl0KFwiLlwiKVxuXG4gIGlmIChwYXJ0cy5sZW5ndGggPT09IDMgJiYgcGFydHMuZXZlcnkoKHBhcnQpID0+IHBhcnQubGVuZ3RoID4gMCkpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5leHBvcnQgY29uc3QgcmVnaXN0ZXJBdXRoU2V0VG9rZW4gPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtLmNvbW1hbmRzXG4gICAgLmZpbmQoKGMpID0+IGMubmFtZSgpID09PSBcImF1dGhcIikhXG4gICAgLmNvbW1hbmQoXCJzZXQtdG9rZW5cIilcbiAgICAuZGVzY3JpcHRpb24oXCJFeHBsaWNpdGx5IHNldCB5b3VyIGF1dGggdG9rZW5cIilcbiAgICAuYXJndW1lbnQoXCI8dG9rZW4+XCIsIFwiTmV3IHRva2VuIHRvIG1hbnVhbGx5IGNvbmZpZ3VyZVwiKVxuICAgIC5hY3Rpb24oKHRva2VuKSA9PiB7XG4gICAgICBpZiAoIXZhbGlkYXRlSldUTGVuZ3RoKHRva2VuKSlcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUubG9nKFwiSW52YWxpZCB0b2tlbiBwcm92aWRlZFwiKVxuICAgICAgc2V0U2Vzc2lvblRva2VuKHRva2VuKVxuICAgICAgY29uc29sZS5sb2coXCJUb2tlbiBtYW51YWxseSB1cGRhdGVkLlwiKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IHsgcHVzaFNuaXBwZXQgfSBmcm9tIFwibGliL3NoYXJlZC9wdXNoLXNuaXBwZXRcIlxuaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlclB1c2ggPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoXCJwdXNoXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiU2F2ZSBzbmlwcGV0IGNvZGUgdG8gUmVnaXN0cnkgQVBJXCIpXG4gICAgLmFyZ3VtZW50KFwiW2ZpbGVdXCIsIFwiUGF0aCB0byB0aGUgc25pcHBldCBmaWxlXCIpXG4gICAgLmFjdGlvbihhc3luYyAoZmlsZVBhdGg/OiBzdHJpbmcpID0+IHtcbiAgICAgIGF3YWl0IHB1c2hTbmlwcGV0KHtcbiAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgIG9uRXhpdDogKGNvZGUpID0+IHByb2Nlc3MuZXhpdChjb2RlKSxcbiAgICAgICAgb25FcnJvcjogKG1lc3NhZ2UpID0+IGNvbnNvbGUuZXJyb3IobWVzc2FnZSksXG4gICAgICAgIG9uU3VjY2VzczogKG1lc3NhZ2UpID0+IGNvbnNvbGUubG9nKG1lc3NhZ2UpLFxuICAgICAgfSlcbiAgICB9KVxu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WUFBWTtBQUFBLE1BQ2hCO0FBQUEsTUFDQSxRQUFRLENBQUMsU0FBUyxRQUFRLEtBQUssSUFBSTtBQUFBLE1BQ25DLFNBQVMsQ0FBQyxZQUFZLFFBQVEsTUFBTSxPQUFPO0FBQUEsTUFDM0MsV0FBVyxDQUFDLFlBQVksUUFBUSxJQUFJLE9BQU87QUFBQSxJQUM3QyxDQUFDO0FBQUEsRUFDSCxDQUFDO0FBQ0w7OztBM0JFTyxJQUFNLFVBQVUsSUFBSSxRQUFRO0FBRW5DLFFBQ0csS0FBSyxNQUFNLEVBQ1gsWUFBWSx1Q0FBdUMsRUFHbkQsUUFBUUMsUUFBTyxJQUFJLGdCQUFJLFNBQVMsT0FBTyxLQUFLLGdCQUFJLE9BQU87QUFFMUQsYUFBYSxPQUFPO0FBRXBCLFlBQVksT0FBTztBQUNuQixjQUFjLE9BQU87QUFDckIsYUFBYSxPQUFPO0FBRXBCLGFBQWEsT0FBTztBQUNwQixrQkFBa0IsT0FBTztBQUN6QixtQkFBbUIsT0FBTztBQUMxQix1QkFBdUIsT0FBTztBQUM5QixxQkFBcUIsT0FBTztBQUU1QixlQUFlLE9BQU87QUFDdEIsb0JBQW9CLE9BQU87QUFFM0IsZUFBZSxPQUFPO0FBRXRCLElBQUksUUFBUSxLQUFLLFdBQVcsR0FBRztBQUM3QixhQUFXLFNBQVMsUUFBUSxJQUFJO0FBQ2xDLE9BQU87QUFDTCxVQUFRLE1BQU07QUFDaEI7IiwKICAibmFtZXMiOiBbImZzIiwgInBhdGgiLCAiZnMiLCAicGF0aCIsICJmcyIsICJmcyIsICJwcm9ncmFtIiwgInBhdGgiLCAiZnMiLCAiZnMiLCAicGF0aCIsICJreSIsICJmcyIsICJwYXRoIiwgInJlc29sdmUiLCAicGF0aCIsICJmcyIsICJmcyIsICJwYXRoIiwgImZzIiwgInRzIiwgImZzIiwgInBhdGgiLCAia3kiLCAicGF0aCIsICJreSIsICJmcyIsICJwcm9ncmFtIiwgInBvcnQiLCAicmVzb2x2ZSIsICJzZXJ2ZXIiLCAicHJvZ3JhbSIsICJreSIsICJwcm9ncmFtIiwgInByb2dyYW0iLCAicHJvZ3JhbSIsICJwcm9ncmFtIiwgImZzIiwgInBhdGgiLCAicHJvZ3JhbSIsICJreSIsICJzZW12ZXIiLCAicGF0aCIsICJmcyIsICJwcm9ncmFtIiwgInByb2dyYW0iLCAicHJvZ3JhbSIsICJwcm9ncmFtIiwgInNlbXZlciJdCn0K
|
|
1215
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY2xpL21haW4udHMiLCAiLi4vY2xpL2luaXQvcmVnaXN0ZXIudHMiLCAiLi4vbGliL3NoYXJlZC9kZXRlY3QtcGtnLW1hbmFnZXIudHMiLCAiLi4vbGliL3NoYXJlZC9zZXR1cC10c2NpLXBhY2thZ2VzLnRzIiwgIi4uL2xpYi9zaGFyZWQvZ2VuZXJhdGUtdHMtY29uZmlnLnRzIiwgIi4uL2xpYi9zaGFyZWQvd3JpdGUtZmlsZS1pZi1ub3QtZXhpc3RzLnRzIiwgIi4uL2xpYi9zaGFyZWQvZ2VuZXJhdGUtZ2l0aWdub3JlLWZpbGUudHMiLCAiLi4vY2xpL2Rldi9yZWdpc3Rlci50cyIsICIuLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9pbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldC50cyIsICIuLi9jbGkvZGV2L0RldlNlcnZlci50cyIsICIuLi9saWIvc2VydmVyL2NyZWF0ZUh0dHBTZXJ2ZXIudHMiLCAiLi4vcGFja2FnZS5qc29uIiwgIi4uL2xpYi9zaXRlL2dldEluZGV4LnRzIiwgIi4uL2xpYi9zZXJ2ZXIvRXZlbnRzV2F0Y2hlci50cyIsICIuLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9GaWxlc3lzdGVtVHlwZXNIYW5kbGVyLnRzIiwgIi4uL2xpYi9kZXBlbmRlbmN5LWFuYWx5c2lzL2ZpbmRJbXBvcnRzSW5TbmlwcGV0LnRzIiwgIi4uL2xpYi9jbGktY29uZmlnL2luZGV4LnRzIiwgIi4uL2xpYi9yZWdpc3RyeS1hcGkvZ2V0LWt5LnRzIiwgIi4uL2xpYi9zaGFyZWQvcHVzaC1zbmlwcGV0LnRzIiwgIi4uL2NsaS9hdXRoL2xvZ2luL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9hdXRoL2xvZ291dC9yZWdpc3Rlci50cyIsICIuLi9jbGkvYXV0aC9yZWdpc3Rlci50cyIsICIuLi9jbGkvY29uZmlnL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9jb25maWcvcHJpbnQvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2Nsb25lL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9leHBvcnQvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2F1dGgvcHJpbnQtdG9rZW4vcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2F1dGgvc2V0LXRva2VuL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9wdXNoL3JlZ2lzdGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIjIS91c3IvYmluL2VudiBub2RlXG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyByZWdpc3RlckluaXQgfSBmcm9tIFwiLi9pbml0L3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyRGV2IH0gZnJvbSBcIi4vZGV2L3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQXV0aExvZ2luIH0gZnJvbSBcIi4vYXV0aC9sb2dpbi9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhMb2dvdXQgfSBmcm9tIFwiLi9hdXRoL2xvZ291dC9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGggfSBmcm9tIFwiLi9hdXRoL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQ29uZmlnUHJpbnQgfSBmcm9tIFwiLi9jb25maWcvcHJpbnQvcmVnaXN0ZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJDbG9uZSB9IGZyb20gXCIuL2Nsb25lL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHBlcmZlY3RDbGkgfSBmcm9tIFwicGVyZmVjdC1jbGlcIlxuaW1wb3J0IHBrZyBmcm9tIFwiLi4vcGFja2FnZS5qc29uXCJcbmltcG9ydCBzZW12ZXIgZnJvbSBcInNlbXZlclwiXG5pbXBvcnQgeyByZWdpc3RlckV4cG9ydCB9IGZyb20gXCIuL2V4cG9ydC9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhQcmludFRva2VuIH0gZnJvbSBcIi4vYXV0aC9wcmludC10b2tlbi9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhTZXRUb2tlbiB9IGZyb20gXCIuL2F1dGgvc2V0LXRva2VuL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyUHVzaCB9IGZyb20gXCIuL3B1c2gvcmVnaXN0ZXJcIlxuXG5leHBvcnQgY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKClcblxucHJvZ3JhbVxuICAubmFtZShcInRzY2lcIilcbiAgLmRlc2NyaXB0aW9uKFwiQ0xJIGZvciBkZXZlbG9waW5nIHRzY2lyY3VpdCBzbmlwcGV0c1wiKVxuICAvLyBIQUNLOiBhdCBidWlsZCB0aW1lIHRoZSB2ZXJzaW9uIGlzIG9sZCwgd2UgbmVlZCB0b1xuICAvLyBmaXggdGhpcyBhdCBzb21lIHBvaW50Li4uXG4gIC52ZXJzaW9uKHNlbXZlci5pbmMocGtnLnZlcnNpb24sIFwicGF0Y2hcIikgPz8gcGtnLnZlcnNpb24pXG5cbnJlZ2lzdGVySW5pdChwcm9ncmFtKVxuXG5yZWdpc3RlckRldihwcm9ncmFtKVxucmVnaXN0ZXJDbG9uZShwcm9ncmFtKVxucmVnaXN0ZXJQdXNoKHByb2dyYW0pXG5cbnJlZ2lzdGVyQXV0aChwcm9ncmFtKVxucmVnaXN0ZXJBdXRoTG9naW4ocHJvZ3JhbSlcbnJlZ2lzdGVyQXV0aExvZ291dChwcm9ncmFtKVxucmVnaXN0ZXJBdXRoUHJpbnRUb2tlbihwcm9ncmFtKVxucmVnaXN0ZXJBdXRoU2V0VG9rZW4ocHJvZ3JhbSlcblxucmVnaXN0ZXJDb25maWcocHJvZ3JhbSlcbnJlZ2lzdGVyQ29uZmlnUHJpbnQocHJvZ3JhbSlcblxucmVnaXN0ZXJFeHBvcnQocHJvZ3JhbSlcblxuaWYgKHByb2Nlc3MuYXJndi5sZW5ndGggPT09IDIpIHtcbiAgcGVyZmVjdENsaShwcm9ncmFtLCBwcm9jZXNzLmFyZ3YpXG59IGVsc2Uge1xuICBwcm9ncmFtLnBhcnNlKClcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBzZXR1cFRzY2lQcm9qZWN0IH0gZnJvbSBcImxpYi9zaGFyZWQvc2V0dXAtdHNjaS1wYWNrYWdlc1wiXG5pbXBvcnQgeyBnZW5lcmF0ZVRzQ29uZmlnIH0gZnJvbSBcImxpYi9zaGFyZWQvZ2VuZXJhdGUtdHMtY29uZmlnXCJcbmltcG9ydCB7IHdyaXRlRmlsZUlmTm90RXhpc3RzIH0gZnJvbSBcImxpYi9zaGFyZWQvd3JpdGUtZmlsZS1pZi1ub3QtZXhpc3RzXCJcbmltcG9ydCB7IGdlbmVyYXRlR2l0SWdub3JlRmlsZSB9IGZyb20gXCJsaWIvc2hhcmVkL2dlbmVyYXRlLWdpdGlnbm9yZS1maWxlXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVySW5pdCA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImluaXRcIilcbiAgICAuZGVzY3JpcHRpb24oXG4gICAgICBcIkluaXRpYWxpemUgYSBuZXcgVFNDaXJjdWl0IHByb2plY3QgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgKG9yIGN1cnJlbnQgZGlyZWN0b3J5IGlmIG5vbmUgaXMgcHJvdmlkZWQpXCIsXG4gICAgKVxuICAgIC5hcmd1bWVudChcbiAgICAgIFwiW2RpcmVjdG9yeV1cIixcbiAgICAgIFwiRGlyZWN0b3J5IG5hbWUgKG9wdGlvbmFsLCBkZWZhdWx0cyB0byBjdXJyZW50IGRpcmVjdG9yeSlcIixcbiAgICApXG4gICAgLmFjdGlvbigoZGlyZWN0b3J5Pzogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBwcm9qZWN0RGlyID0gZGlyZWN0b3J5XG4gICAgICAgID8gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIGRpcmVjdG9yeSlcbiAgICAgICAgOiBwcm9jZXNzLmN3ZCgpXG5cbiAgICAgIC8vIEVuc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgZnMubWtkaXJTeW5jKHByb2plY3REaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG5cbiAgICAgIC8vIENyZWF0ZSBlc3NlbnRpYWwgcHJvamVjdCBmaWxlc1xuICAgICAgd3JpdGVGaWxlSWZOb3RFeGlzdHMoXG4gICAgICAgIHBhdGguam9pbihwcm9qZWN0RGlyLCBcImluZGV4LnRzeFwiKSxcbiAgICAgICAgYFxuaW1wb3J0IFwiQHRzY2lyY3VpdC9jb3JlXCI7XG5cbmV4cG9ydCBkZWZhdWx0ICgpID0+IChcbiAgPGJvYXJkIHdpZHRoPVwiMTBtbVwiIGhlaWdodD1cIjEwbW1cIj5cbiAgICA8cmVzaXN0b3IgcmVzaXN0YW5jZT1cIjFrXCIgZm9vdHByaW50PVwiMDQwMlwiIG5hbWU9XCJSMVwiIHNjaFg9ezN9IHBjYlg9ezN9IC8+XG4gICAgPGNhcGFjaXRvciBjYXBhY2l0YW5jZT1cIjEwMDBwRlwiIGZvb3RwcmludD1cIjA0MDJcIiBuYW1lPVwiQzFcIiBzY2hYPXstM30gcGNiWD17LTN9IC8+XG4gICAgPHRyYWNlIGZyb209XCIuUjEgPiAucGluMVwiIHRvPVwiLkMxID4gLnBpbjFcIiAvPlxuICA8L2JvYXJkPlxuKTtcbmAsXG4gICAgICApXG5cbiAgICAgIHdyaXRlRmlsZUlmTm90RXhpc3RzKFxuICAgICAgICBwYXRoLmpvaW4ocHJvamVjdERpciwgXCIubnBtcmNcIiksXG4gICAgICAgIGBcbkB0c2NpOnJlZ2lzdHJ5PWh0dHBzOi8vbnBtLnRzY2lyY3VpdC5jb21cbmAsXG4gICAgICApXG5cbiAgICAgIC8vIFNldHVwIHByb2plY3QgZGVwZW5kZW5jaWVzXG4gICAgICB0cnkge1xuICAgICAgICBzZXR1cFRzY2lQcm9qZWN0KHByb2plY3REaXIpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGluc3RhbGwgZGVwZW5kZW5jaWVzOlwiLCBlcnJvcilcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgICB9XG5cbiAgICAgIC8vIEdlbmVyYXRlIHRzY29uZmlnLmpzb25cbiAgICAgIGdlbmVyYXRlVHNDb25maWcocHJvamVjdERpcilcbiAgICAgIC8vIENyZWF0ZSAuZ2l0aWdub3JlIGZpbGVcbiAgICAgIGdlbmVyYXRlR2l0SWdub3JlRmlsZShwcm9qZWN0RGlyKVxuXG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGBcdUQ4M0NcdURGODkgSW5pdGlhbGl6YXRpb24gY29tcGxldGUhIFJ1biAke2RpcmVjdG9yeSA/IGBcImNkICR7ZGlyZWN0b3J5fVwiICYgYCA6IFwiXCJ9XCJ0c2NpIGRldlwiIHRvIHN0YXJ0IGRldmVsb3BpbmcuYCxcbiAgICAgIClcbiAgICAgIHByb2Nlc3MuZXhpdCgwKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IGZzIGZyb20gXCJmc1wiXG5cbi8vIERldGVjdCB0aGUgcGFja2FnZSBtYW5hZ2VyIGJlaW5nIHVzZWQgaW4gdGhlIHByb2plY3RcbmV4cG9ydCBjb25zdCBkZXRlY3RQYWNrYWdlTWFuYWdlciA9ICgpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB1c2VyQWdlbnQgPSBwcm9jZXNzLmVudi5ucG1fY29uZmlnX3VzZXJfYWdlbnQgfHwgXCJcIlxuICBpZiAodXNlckFnZW50LnN0YXJ0c1dpdGgoXCJ5YXJuXCIpKSByZXR1cm4gXCJ5YXJuXCJcbiAgaWYgKHVzZXJBZ2VudC5zdGFydHNXaXRoKFwicG5wbVwiKSkgcmV0dXJuIFwicG5wbVwiXG4gIGlmICh1c2VyQWdlbnQuc3RhcnRzV2l0aChcImJ1blwiKSkgcmV0dXJuIFwiYnVuXCJcblxuICBpZiAoZnMuZXhpc3RzU3luYyhcInlhcm4ubG9ja1wiKSkgcmV0dXJuIFwieWFyblwiXG4gIGlmIChmcy5leGlzdHNTeW5jKFwicG5wbS1sb2NrLnlhbWxcIikpIHJldHVybiBcInBucG1cIlxuICBpZiAoZnMuZXhpc3RzU3luYyhcImJ1bi5sb2NrYlwiKSkgcmV0dXJuIFwiYnVuXCJcblxuICByZXR1cm4gXCJucG1cIiAvLyBEZWZhdWx0IHRvIG5wbVxufVxuIiwgImltcG9ydCB7IGRldGVjdFBhY2thZ2VNYW5hZ2VyIH0gZnJvbSBcIi4vZGV0ZWN0LXBrZy1tYW5hZ2VyXCJcbmltcG9ydCBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cFRzY2lQcm9qZWN0KFxuICBkaXJlY3RvcnkgPSBwcm9jZXNzLmN3ZCgpLFxuICBkZXBlbmRlbmNpZXMgPSBbXCJAdHlwZXMvcmVhY3RcIiwgXCJAdHNjaXJjdWl0L2NvcmVcIl0sXG4pIHtcbiAgY29uc3QgcHJvamVjdFBhdGggPSBwYXRoLnJlc29sdmUoZGlyZWN0b3J5KVxuICBpZiAoIWZzLmV4aXN0c1N5bmMocHJvamVjdFBhdGgpKSB7XG4gICAgZnMubWtkaXJTeW5jKHByb2plY3RQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICB9XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gZGV0ZWN0UGFja2FnZU1hbmFnZXIoKVxuXG4gIGNvbnNvbGUubG9nKGBJbml0aWFsaXppbmcgcHJvamVjdCBpbiAke3Byb2plY3RQYXRofS4uLmApXG4gIHByb2Nlc3MuY2hkaXIocHJvamVjdFBhdGgpXG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKFwicGFja2FnZS5qc29uXCIpKSB7XG4gICAgY29uc3QgaW5pdENvbW1hbmQgPVxuICAgICAgcGFja2FnZU1hbmFnZXIgPT09IFwieWFyblwiXG4gICAgICAgID8gXCJ5YXJuIGluaXQgLXlcIlxuICAgICAgICA6IHBhY2thZ2VNYW5hZ2VyID09PSBcInBucG1cIlxuICAgICAgICAgID8gXCJwbnBtIGluaXRcIlxuICAgICAgICAgIDogcGFja2FnZU1hbmFnZXIgPT09IFwiYnVuXCJcbiAgICAgICAgICAgID8gXCJidW4gaW5pdCAteVwiXG4gICAgICAgICAgICA6IFwibnBtIGluaXQgLXlcIlxuXG4gICAgZXhlY1N5bmMoaW5pdENvbW1hbmQsIHsgc3RkaW86IFwiaW5oZXJpdFwiIH0pXG4gICAgY29uc29sZS5sb2coXCJQcm9qZWN0IGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseS5cIilcbiAgfVxuXG4gIC8vIFJlYWQgYW5kIG1vZGlmeSBwYWNrYWdlLmpzb25cbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKHByb2plY3RQYXRoLCBcInBhY2thZ2UuanNvblwiKVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgXCJ1dGYtOFwiKSlcblxuICAvLyBSZW1vdmUgdW53YW50ZWQgZmllbGRzXG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5rZXl3b3Jkc1xuICBkZWxldGUgcGFja2FnZUpzb24uYXV0aG9yXG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5tYWluXG5cbiAgZnMud3JpdGVGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uLCBudWxsLCAyKSlcbiAgY29uc29sZS5sb2coXCJVcGRhdGVkIHBhY2thZ2UuanNvbiB0byByZW1vdmUgdW5uZWNlc3NhcnkgZmllbGRzLlwiKVxuXG4gIGlmIChkZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUubG9nKFwiSW5zdGFsbGluZyBkZXBlbmRlbmNpZXMuLi5cIilcbiAgICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9XG4gICAgICBwYWNrYWdlTWFuYWdlciA9PT0gXCJ5YXJuXCJcbiAgICAgICAgPyBgeWFybiBhZGQgLUQgJHtkZXBlbmRlbmNpZXMuam9pbihcIiBcIil9YFxuICAgICAgICA6IHBhY2thZ2VNYW5hZ2VyID09PSBcInBucG1cIlxuICAgICAgICAgID8gYHBucG0gYWRkIC1EICR7ZGVwZW5kZW5jaWVzLmpvaW4oXCIgXCIpfWBcbiAgICAgICAgICA6IHBhY2thZ2VNYW5hZ2VyID09PSBcImJ1blwiXG4gICAgICAgICAgICA/IGBidW4gYWRkIC1EICR7ZGVwZW5kZW5jaWVzLmpvaW4oXCIgXCIpfWBcbiAgICAgICAgICAgIDogYG5wbSBpbnN0YWxsIC1EICR7ZGVwZW5kZW5jaWVzLmpvaW4oXCIgXCIpfWBcblxuICAgIGV4ZWNTeW5jKGluc3RhbGxDb21tYW5kLCB7IHN0ZGlvOiBcImluaGVyaXRcIiB9KVxuICAgIGNvbnNvbGUubG9nKFwiRGVwZW5kZW5jaWVzIGluc3RhbGxlZCBzdWNjZXNzZnVsbHkuXCIpXG4gIH1cblxuICByZXR1cm4gcGFja2FnZUpzb24ubmFtZSB8fCBcInVua25vd25cIlxufVxuIiwgImltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgd3JpdGVGaWxlSWZOb3RFeGlzdHMgfSBmcm9tIFwiLi93cml0ZS1maWxlLWlmLW5vdC1leGlzdHNcIlxuXG4vLyBHZW5lcmF0ZSBhIFJlYWN0LWNvbXBhdGlibGUgdHNjb25maWcuanNvblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlVHNDb25maWcgPSAoZGlyOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgdHNjb25maWdQYXRoID0gcGF0aC5qb2luKGRpciwgXCJ0c2NvbmZpZy5qc29uXCIpXG4gIGNvbnN0IHRzY29uZmlnQ29udGVudCA9IEpTT04uc3RyaW5naWZ5KFxuICAgIHtcbiAgICAgIGNvbXBpbGVyT3B0aW9uczoge1xuICAgICAgICB0YXJnZXQ6IFwiRVM2XCIsXG4gICAgICAgIG1vZHVsZTogXCJFU05leHRcIixcbiAgICAgICAganN4OiBcInJlYWN0LWpzeFwiLFxuICAgICAgICBvdXREaXI6IFwiZGlzdFwiLFxuICAgICAgICBzdHJpY3Q6IHRydWUsXG4gICAgICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSxcbiAgICAgICAgbW9kdWxlUmVzb2x1dGlvbjogXCJub2RlXCIsXG4gICAgICAgIHNraXBMaWJDaGVjazogdHJ1ZSxcbiAgICAgICAgZm9yY2VDb25zaXN0ZW50Q2FzaW5nSW5GaWxlTmFtZXM6IHRydWUsXG4gICAgICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLFxuICAgICAgICBzb3VyY2VNYXA6IHRydWUsXG4gICAgICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsXG4gICAgICAgIGV4cGVyaW1lbnRhbERlY29yYXRvcnM6IHRydWUsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbnVsbCxcbiAgICAyLFxuICApXG4gIHdyaXRlRmlsZUlmTm90RXhpc3RzKHRzY29uZmlnUGF0aCwgdHNjb25maWdDb250ZW50KVxufVxuIiwgImltcG9ydCBmcyBmcm9tIFwiZnNcIlxuXG5leHBvcnQgY29uc3Qgd3JpdGVGaWxlSWZOb3RFeGlzdHMgPSAoZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKSA9PiB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBjb250ZW50LnRyaW1TdGFydCgpLCBcInV0Zi04XCIpXG4gICAgY29uc29sZS5pbmZvKGBDcmVhdGVkOiAke2ZpbGVQYXRofWApXG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5pbmZvKGBTa2lwcGVkOiAke2ZpbGVQYXRofSBhbHJlYWR5IGV4aXN0c2ApXG4gIH1cbn1cbiIsICJpbXBvcnQgeyB3cml0ZUZpbGVJZk5vdEV4aXN0cyB9IGZyb20gXCIuL3dyaXRlLWZpbGUtaWYtbm90LWV4aXN0c1wiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlR2l0SWdub3JlRmlsZSA9IChkaXI6IHN0cmluZykgPT4ge1xuICBjb25zdCBnaXRpZ25vcmVQYXRoID0gcGF0aC5qb2luKGRpciwgXCIuZ2l0aWdub3JlXCIpXG4gIGNvbnN0IGdpdGlnbm9yZUNvbnRlbnQgPSBgIyBEZXBlbmRlbmNpZXNcbm5vZGVfbW9kdWxlcy9cblxuIyBCdWlsZCBvdXRwdXRcbmRpc3QvXG5idWlsZC9cblxuIyBFbnZpcm9ubWVudCB2YXJpYWJsZXNcbi5lbnZcbi5lbnYubG9jYWxcbi5lbnYuKi5sb2NhbFxuXG4jIElERSBmaWxlc1xuLnZzY29kZS9cbi5pZGVhL1xuKi5zd3Bcbiouc3dvXG5cbiMgT1MgZmlsZXNcbi5EU19TdG9yZVxuVGh1bWJzLmRiXG5cbiMgRGVidWcgbG9nc1xubnBtLWRlYnVnLmxvZypcbnlhcm4tZGVidWcubG9nKlxueWFybi1lcnJvci5sb2cqXG5gXG5cbiAgd3JpdGVGaWxlSWZOb3RFeGlzdHMoZ2l0aWdub3JlUGF0aCwgZ2l0aWdub3JlQ29udGVudClcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgKiBhcyBjaG9raWRhciBmcm9tIFwiY2hva2lkYXJcIlxuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0IHsgY3JlYXRlSHR0cFNlcnZlciB9IGZyb20gXCJsaWIvc2VydmVyL2NyZWF0ZUh0dHBTZXJ2ZXJcIlxuaW1wb3J0IHsgZ2V0TG9jYWxGaWxlRGVwZW5kZW5jaWVzIH0gZnJvbSBcImxpYi9kZXBlbmRlbmN5LWFuYWx5c2lzL2dldExvY2FsRmlsZURlcGVuZGVuY2llc1wiXG5pbXBvcnQgeyBpbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldCB9IGZyb20gXCIuLi8uLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9pbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldFwiXG5pbXBvcnQgeyBFdmVudHNXYXRjaGVyIH0gZnJvbSBcIi4uLy4uL2xpYi9zZXJ2ZXIvRXZlbnRzV2F0Y2hlclwiXG5pbXBvcnQgeyBEZXZTZXJ2ZXIgfSBmcm9tIFwiLi9EZXZTZXJ2ZXJcIlxuaW1wb3J0ICogYXMgbmV0IGZyb20gXCJub2RlOm5ldFwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckRldiA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImRldlwiKVxuICAgIC5kZXNjcmlwdGlvbihcIlN0YXJ0IGRldmVsb3BtZW50IHNlcnZlciBmb3IgYSBzbmlwcGV0XCIpXG4gICAgLmFyZ3VtZW50KFwiW2ZpbGVdXCIsIFwiUGF0aCB0byB0aGUgc25pcHBldCBmaWxlXCIpXG4gICAgLm9wdGlvbihcIi1wLCAtLXBvcnQgPG51bWJlcj5cIiwgXCJQb3J0IHRvIHJ1biBzZXJ2ZXIgb25cIiwgXCIzMDIwXCIpXG4gICAgLmFjdGlvbihhc3luYyAoZmlsZTogc3RyaW5nLCBvcHRpb25zOiB7IHBvcnQ6IHN0cmluZyB9KSA9PiB7XG4gICAgICBsZXQgcG9ydCA9IHBhcnNlSW50KG9wdGlvbnMucG9ydClcblxuICAgICAgY29uc3QgaXNQb3J0QXZhaWxhYmxlID0gKHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBjb25zdCBzZXJ2ZXIgPSBuZXQuY3JlYXRlU2VydmVyKClcbiAgICAgICAgICBzZXJ2ZXIub25jZShcImVycm9yXCIsICgpID0+IHJlc29sdmUoZmFsc2UpKVxuICAgICAgICAgIHNlcnZlci5vbmNlKFwibGlzdGVuaW5nXCIsICgpID0+IHtcbiAgICAgICAgICAgIHNlcnZlci5jbG9zZSgoKSA9PiByZXNvbHZlKHRydWUpKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgc2VydmVyLmxpc3Rlbihwb3J0KVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICB3aGlsZSAoIShhd2FpdCBpc1BvcnRBdmFpbGFibGUocG9ydCkpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBQb3J0ICR7cG9ydH0gaXMgaW4gdXNlLCB0cnlpbmcgcG9ydCAke3BvcnQgKyAxfS4uLmApXG4gICAgICAgIHBvcnQgKz0gMVxuICAgICAgfVxuXG4gICAgICBsZXQgYWJzb2x1dGVQYXRoOiBzdHJpbmdcblxuICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGZpbGUpXG4gICAgICAgIGlmICghYWJzb2x1dGVQYXRoLmVuZHNXaXRoKFwiLnRzeFwiKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvcjogT25seSAudHN4IGZpbGVzIGFyZSBzdXBwb3J0ZWRcIilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZW50cnlwb2ludFBhdGggPSBwYXRoLnJlc29sdmUoXCJpbmRleC50c3hcIilcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZW50cnlwb2ludFBhdGgpKSB7XG4gICAgICAgICAgYWJzb2x1dGVQYXRoID0gZW50cnlwb2ludFBhdGhcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIk5vIGZpbGUgcHJvdmlkZWQuIFVzaW5nICdpbmRleC50c3gnIGFzIHRoZSBlbnRyeXBvaW50LlwiKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgXCJObyBlbnRyeXBvaW50IGZvdW5kLiBSdW4gJ3RzY2kgaW5pdCcgdG8gYm9vdHN0cmFwIGEgYmFzaWMgcHJvamVjdC5cIixcbiAgICAgICAgICApXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsZURpciA9IHBhdGguZGlybmFtZShhYnNvbHV0ZVBhdGgpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiSW5zdGFsbGluZyB0eXBlcyBmb3IgaW1wb3J0ZWQgc25pcHBldHMuLi5cIilcbiAgICAgICAgYXdhaXQgaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXQoYWJzb2x1dGVQYXRoKVxuICAgICAgICBjb25zb2xlLmxvZyhcIlR5cGVzIGluc3RhbGxlZCBzdWNjZXNzZnVsbHlcIilcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIkZhaWxlZCB0byBpbnN0YWxsIHR5cGVzOlwiLCBlcnJvcilcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VydmVyID0gbmV3IERldlNlcnZlcih7XG4gICAgICAgIHBvcnQsXG4gICAgICAgIGNvbXBvbmVudEZpbGVQYXRoOiBhYnNvbHV0ZVBhdGgsXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCBzZXJ2ZXIuc3RhcnQoKVxuICAgICAgYXdhaXQgc2VydmVyLmFkZEVudHJ5cG9pbnQoKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCAqIGFzIHRzIGZyb20gXCJ0eXBlc2NyaXB0XCJcblxuaW50ZXJmYWNlIFNuaXBwZXRBcGlSZXNwb25zZSB7XG4gIHNuaXBwZXQ6IHtcbiAgICBkdHM6IHN0cmluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldChzbmlwcGV0UGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoc25pcHBldFBhdGgsIFwidXRmLThcIilcbiAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgc25pcHBldFBhdGgsXG4gICAgY29udGVudCxcbiAgICB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0LFxuICAgIHRydWUsXG4gIClcblxuICBjb25zdCBpbXBvcnRzOiBzdHJpbmdbXSA9IFtdXG5cbiAgZnVuY3Rpb24gdmlzaXQobm9kZTogdHMuTm9kZSkge1xuICAgIGlmICh0cy5pc0ltcG9ydERlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICBjb25zdCBtb2R1bGVTcGVjaWZpZXIgPSBub2RlLm1vZHVsZVNwZWNpZmllclxuICAgICAgaWYgKG1vZHVsZVNwZWNpZmllciAmJiB0cy5pc1N0cmluZ0xpdGVyYWwobW9kdWxlU3BlY2lmaWVyKSkge1xuICAgICAgICBjb25zdCBpbXBvcnRQYXRoID0gbW9kdWxlU3BlY2lmaWVyLnRleHRcbiAgICAgICAgaWYgKGltcG9ydFBhdGguc3RhcnRzV2l0aChcIkB0c2NpL1wiKSkge1xuICAgICAgICAgIGltcG9ydHMucHVzaChpbXBvcnRQYXRoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRzLmZvckVhY2hDaGlsZChub2RlLCB2aXNpdClcbiAgfVxuXG4gIHZpc2l0KHNvdXJjZUZpbGUpXG5cbiAgbGV0IHByb2plY3RSb290ID0gcGF0aC5kaXJuYW1lKHNuaXBwZXRQYXRoKVxuICB3aGlsZSAocHJvamVjdFJvb3QgIT09IHBhdGgucGFyc2UocHJvamVjdFJvb3QpLnJvb3QpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdFJvb3QsIFwicGFja2FnZS5qc29uXCIpKSkge1xuICAgICAgYnJlYWtcbiAgICB9XG4gICAgcHJvamVjdFJvb3QgPSBwYXRoLmRpcm5hbWUocHJvamVjdFJvb3QpXG4gIH1cblxuICBmb3IgKGNvbnN0IGltcG9ydFBhdGggb2YgaW1wb3J0cykge1xuICAgIGNvbnN0IFtvd25lciwgbmFtZV0gPSBpbXBvcnRQYXRoLnJlcGxhY2UoXCJAdHNjaS9cIiwgXCJcIikuc3BsaXQoXCIuXCIpXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICAgIGBodHRwczovL3JlZ2lzdHJ5LWFwaS50c2NpcmN1aXQuY29tL3NuaXBwZXRzL2dldD9vd25lcl9uYW1lPSR7b3duZXJ9JnVuc2NvcGVkX25hbWU9JHtuYW1lfWAsXG4gICAgICApXG5cbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gZmV0Y2ggdHlwZXMgZm9yICR7aW1wb3J0UGF0aH1gKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhOiBTbmlwcGV0QXBpUmVzcG9uc2UgPSBhd2FpdCByZXNwb25zZS5qc29uKClcblxuICAgICAgaWYgKGRhdGEuc25pcHBldC5kdHMpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZURpciA9IHBhdGguam9pbihcbiAgICAgICAgICBwcm9qZWN0Um9vdCxcbiAgICAgICAgICBcIm5vZGVfbW9kdWxlc1wiLFxuICAgICAgICAgIFwiQHRzY2lcIixcbiAgICAgICAgICBgJHtvd25lcn0uJHtuYW1lfWAsXG4gICAgICAgIClcbiAgICAgICAgZnMubWtkaXJTeW5jKHBhY2thZ2VEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG5cbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZURpciwgXCJpbmRleC5kLnRzXCIpLCBkYXRhLnNuaXBwZXQuZHRzKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oYEVycm9yIGZldGNoaW5nIHR5cGVzIGZvciAke2ltcG9ydFBhdGh9OmAsIGVycm9yKVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCBreSBmcm9tIFwia3lcIlxuaW1wb3J0IHR5cGUgeyBGaWxlU2VydmVyUm91dGVzIH0gZnJvbSBcImxpYi9maWxlLXNlcnZlci9GaWxlU2VydmVyUm91dGVzXCJcbmltcG9ydCB7IGNyZWF0ZUh0dHBTZXJ2ZXIgfSBmcm9tIFwibGliL3NlcnZlci9jcmVhdGVIdHRwU2VydmVyXCJcbmltcG9ydCB7IEV2ZW50c1dhdGNoZXIgfSBmcm9tIFwibGliL3NlcnZlci9FdmVudHNXYXRjaGVyXCJcbmltcG9ydCB0eXBlIGh0dHAgZnJvbSBcIm5vZGU6aHR0cFwiXG5pbXBvcnQgdHlwZSB7IFR5cGVkS3lJbnN0YW5jZSB9IGZyb20gXCJ0eXBlZC1reVwiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgdHlwZSB7IEZpbGVVcGRhdGVkRXZlbnQgfSBmcm9tIFwibGliL2ZpbGUtc2VydmVyL0ZpbGVTZXJ2ZXJFdmVudFwiXG5pbXBvcnQgKiBhcyBjaG9raWRhciBmcm9tIFwiY2hva2lkYXJcIlxuaW1wb3J0IHsgRmlsZXN5c3RlbVR5cGVzSGFuZGxlciB9IGZyb20gXCJsaWIvZGVwZW5kZW5jeS1hbmFseXNpcy9GaWxlc3lzdGVtVHlwZXNIYW5kbGVyXCJcbmltcG9ydCB7IHB1c2hTbmlwcGV0IH0gZnJvbSBcImxpYi9zaGFyZWQvcHVzaC1zbmlwcGV0XCJcblxuZXhwb3J0IGNsYXNzIERldlNlcnZlciB7XG4gIHBvcnQ6IG51bWJlclxuICAvKipcbiAgICogVGhlIHBhdGggdG8gYSBjb21wb25lbnQgdGhhdCBleHBvcnRzIGEgPGJvYXJkIC8+IG9yIDxncm91cCAvPiBjb21wb25lbnRcbiAgICovXG4gIGNvbXBvbmVudEZpbGVQYXRoOiBzdHJpbmdcblxuICBwcm9qZWN0RGlyOiBzdHJpbmdcblxuICAvKipcbiAgICogVGhlIEhUVFAgc2VydmVyIHRoYXQgaG9zdHMgdGhlIGZpbGUgc2VydmVyIGFuZCBldmVudCBidXMuIFlvdSBjYW4gdXNlXG4gICAqIGZzS3kgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgZmlsZSBzZXJ2ZXIvZXZlbnQgYnVzXG4gICAqL1xuICBodHRwU2VydmVyPzogaHR0cC5TZXJ2ZXJcbiAgLyoqXG4gICAqIFdhdGNoZXMgZm9yIGV2ZW50cyBvbiB0aGUgZXZlbnQgYnVzIGJ5IHBvbGxpbmcgYGFwaS9ldmVudHMvbGlzdGBcbiAgICovXG4gIGV2ZW50c1dhdGNoZXI/OiBFdmVudHNXYXRjaGVyXG4gIC8qKlxuICAgKiBBIGt5IGluc3RhbmNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgZmlsZSBzZXJ2ZXIgYW5kXG4gICAqIGV2ZW50IGJ1c1xuICAgKi9cbiAgZnNLeTogVHlwZWRLeUluc3RhbmNlPGtleW9mIEZpbGVTZXJ2ZXJSb3V0ZXMsIEZpbGVTZXJ2ZXJSb3V0ZXM+XG4gIC8qKlxuICAgKiBBIGNob2tpZGFyIGluc3RhbmNlIHRoYXQgd2F0Y2hlcyB0aGUgcHJvamVjdCBkaXJlY3RvcnkgZm9yIGZpbGUgY2hhbmdlc1xuICAgKi9cbiAgZmlsZXN5c3RlbVdhdGNoZXI/OiBjaG9raWRhci5GU1dhdGNoZXJcblxuICBwcml2YXRlIHR5cGVzSGFuZGxlcj86IEZpbGVzeXN0ZW1UeXBlc0hhbmRsZXJcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgcG9ydCxcbiAgICBjb21wb25lbnRGaWxlUGF0aCxcbiAgfToge1xuICAgIHBvcnQ6IG51bWJlclxuICAgIGNvbXBvbmVudEZpbGVQYXRoOiBzdHJpbmdcbiAgfSkge1xuICAgIHRoaXMucG9ydCA9IHBvcnRcbiAgICB0aGlzLmNvbXBvbmVudEZpbGVQYXRoID0gY29tcG9uZW50RmlsZVBhdGhcbiAgICB0aGlzLnByb2plY3REaXIgPSBwYXRoLmRpcm5hbWUoY29tcG9uZW50RmlsZVBhdGgpXG4gICAgdGhpcy5mc0t5ID0ga3kuY3JlYXRlKHtcbiAgICAgIHByZWZpeFVybDogYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0fWAsXG4gICAgfSkgYXMgYW55XG4gICAgdGhpcy50eXBlc0hhbmRsZXIgPSBuZXcgRmlsZXN5c3RlbVR5cGVzSGFuZGxlcih0aGlzLnByb2plY3REaXIpXG4gIH1cblxuICBhc3luYyBzdGFydCgpIHtcbiAgICBjb25zdCB7IHNlcnZlciB9ID0gYXdhaXQgY3JlYXRlSHR0cFNlcnZlcih0aGlzLnBvcnQpXG4gICAgdGhpcy5odHRwU2VydmVyID0gc2VydmVyXG5cbiAgICB0aGlzLmV2ZW50c1dhdGNoZXIgPSBuZXcgRXZlbnRzV2F0Y2hlcihgaHR0cDovL2xvY2FsaG9zdDoke3RoaXMucG9ydH1gKVxuICAgIHRoaXMuZXZlbnRzV2F0Y2hlci5zdGFydCgpXG5cbiAgICB0aGlzLmV2ZW50c1dhdGNoZXIub24oXG4gICAgICBcIkZJTEVfVVBEQVRFRFwiLFxuICAgICAgdGhpcy5oYW5kbGVGaWxlVXBkYXRlZEV2ZW50RnJvbVNlcnZlci5iaW5kKHRoaXMpLFxuICAgIClcblxuICAgIHRoaXMuZXZlbnRzV2F0Y2hlci5vbihcbiAgICAgIFwiUkVRVUVTVF9UT19TQVZFX1NOSVBQRVRcIixcbiAgICAgIHRoaXMuc2F2ZVNuaXBwZXQuYmluZCh0aGlzKSxcbiAgICApXG5cbiAgICB0aGlzLmZpbGVzeXN0ZW1XYXRjaGVyID0gY2hva2lkYXIud2F0Y2godGhpcy5wcm9qZWN0RGlyLCB7XG4gICAgICBwZXJzaXN0ZW50OiB0cnVlLFxuICAgICAgaWdub3JlSW5pdGlhbDogdHJ1ZSxcbiAgICB9KVxuXG4gICAgdGhpcy5maWxlc3lzdGVtV2F0Y2hlci5vbihcImNoYW5nZVwiLCAoZmlsZVBhdGgpID0+XG4gICAgICB0aGlzLmhhbmRsZUZpbGVDaGFuZ2VkT25GaWxlc3lzdGVtKGZpbGVQYXRoKSxcbiAgICApXG4gICAgdGhpcy5maWxlc3lzdGVtV2F0Y2hlci5vbihcImFkZFwiLCAoZmlsZVBhdGgpID0+XG4gICAgICB0aGlzLmhhbmRsZUZpbGVDaGFuZ2VkT25GaWxlc3lzdGVtKGZpbGVQYXRoKSxcbiAgICApXG5cbiAgICB0aGlzLnVwc2VydEluaXRpYWxGaWxlcygpXG5cbiAgICB0aGlzLnR5cGVzSGFuZGxlcj8uaGFuZGxlSW5pdGlhbFR5cGVEZXBlbmRlbmNpZXModGhpcy5jb21wb25lbnRGaWxlUGF0aClcbiAgfVxuXG4gIGFzeW5jIGFkZEVudHJ5cG9pbnQoKSB7XG4gICAgY29uc3QgcmVsYXRpdmVDb21wb25lbnRGaWxlUGF0aCA9IHBhdGgucmVsYXRpdmUoXG4gICAgICB0aGlzLnByb2plY3REaXIsXG4gICAgICB0aGlzLmNvbXBvbmVudEZpbGVQYXRoLFxuICAgIClcbiAgICBhd2FpdCB0aGlzLmZzS3kucG9zdChcImFwaS9maWxlcy91cHNlcnRcIiwge1xuICAgICAganNvbjoge1xuICAgICAgICBmaWxlX3BhdGg6IFwiZW50cnlwb2ludC50c3hcIixcbiAgICAgICAgdGV4dF9jb250ZW50OiBgXG5pbXBvcnQgTXlDaXJjdWl0IGZyb20gXCIuLyR7cmVsYXRpdmVDb21wb25lbnRGaWxlUGF0aH1cIlxuXG5jaXJjdWl0LmFkZCg8TXlDaXJjdWl0IC8+KVxuYCxcbiAgICAgIH0sXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUZpbGVVcGRhdGVkRXZlbnRGcm9tU2VydmVyKGV2OiBGaWxlVXBkYXRlZEV2ZW50KSB7XG4gICAgaWYgKGV2LmluaXRpYXRvciA9PT0gXCJmaWxlc3lzdGVtX2NoYW5nZVwiKSByZXR1cm5cblxuICAgIGlmIChldi5maWxlX3BhdGggPT09IFwibWFudWFsLWVkaXRzLmpzb25cIikge1xuICAgICAgY29uc29sZS5sb2coXCJNYW51YWwgZWRpdHMgdXBkYXRlZCwgdXBkYXRpbmcgb24gZmlsZXN5c3RlbS4uLlwiKVxuICAgICAgY29uc3QgeyBmaWxlIH0gPSBhd2FpdCB0aGlzLmZzS3lcbiAgICAgICAgLmdldChcImFwaS9maWxlcy9nZXRcIiwge1xuICAgICAgICAgIHNlYXJjaFBhcmFtczogeyBmaWxlX3BhdGg6IGV2LmZpbGVfcGF0aCB9LFxuICAgICAgICB9KVxuICAgICAgICAuanNvbigpXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICBwYXRoLmpvaW4odGhpcy5wcm9qZWN0RGlyLCBcIm1hbnVhbC1lZGl0cy5qc29uXCIpLFxuICAgICAgICBmaWxlLnRleHRfY29udGVudCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBhc3luYyBoYW5kbGVGaWxlQ2hhbmdlZE9uRmlsZXN5c3RlbShhYnNvbHV0ZUZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICBjb25zdCByZWxhdGl2ZUZpbGVQYXRoID0gcGF0aC5yZWxhdGl2ZSh0aGlzLnByb2plY3REaXIsIGFic29sdXRlRmlsZVBhdGgpXG4gICAgLy8gV2UndmUgdGVtcG9yYXJpbHkgZGlzYWJsZWQgdXBzZXJ0aW5nIG1hbnVhbCBlZGl0cyBmcm9tIGZpbGVzeXN0ZW0gY2hhbmdlc1xuICAgIC8vIGJlY2F1c2UgaXQgY2FuIGJlIGVkaXRlZCBieSB0aGUgYnJvd3NlclxuICAgIGlmIChyZWxhdGl2ZUZpbGVQYXRoLmluY2x1ZGVzKFwibWFudWFsLWVkaXRzLmpzb25cIikpIHJldHVyblxuXG4gICAgYXdhaXQgdGhpcy50eXBlc0hhbmRsZXI/LmhhbmRsZUZpbGVUeXBlRGVwZW5kZW5jaWVzKGFic29sdXRlRmlsZVBhdGgpXG5cbiAgICBjb25zb2xlLmxvZyhgJHtyZWxhdGl2ZUZpbGVQYXRofSBzYXZlZC4gQXBwbHlpbmcgY2hhbmdlcy4uLmApXG4gICAgYXdhaXQgdGhpcy5mc0t5XG4gICAgICAucG9zdChcImFwaS9maWxlcy91cHNlcnRcIiwge1xuICAgICAgICBqc29uOiB7XG4gICAgICAgICAgZmlsZV9wYXRoOiByZWxhdGl2ZUZpbGVQYXRoLFxuICAgICAgICAgIHRleHRfY29udGVudDogZnMucmVhZEZpbGVTeW5jKGFic29sdXRlRmlsZVBhdGgsIFwidXRmLThcIiksXG4gICAgICAgICAgaW5pdGlhdG9yOiBcImZpbGVzeXN0ZW1fY2hhbmdlXCIsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLmpzb24oKVxuICB9XG5cbiAgYXN5bmMgdXBzZXJ0SW5pdGlhbEZpbGVzKCkge1xuICAgIC8vIFNjYW4gcHJvamVjdCBkaXJlY3RvcnkgZm9yIGFsbCBmaWxlcyBhbmQgdXBzZXJ0IHRoZW1cbiAgICBjb25zdCBmaWxlTmFtZXMgPSBmcy5yZWFkZGlyU3luYyh0aGlzLnByb2plY3REaXIpXG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZXMpIHtcbiAgICAgIGlmIChmcy5zdGF0U3luYyhwYXRoLmpvaW4odGhpcy5wcm9qZWN0RGlyLCBmaWxlTmFtZSkpLmlzRGlyZWN0b3J5KCkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICBjb25zdCBmaWxlQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgcGF0aC5qb2luKHRoaXMucHJvamVjdERpciwgZmlsZU5hbWUpLFxuICAgICAgICBcInV0Zi04XCIsXG4gICAgICApXG4gICAgICBhd2FpdCB0aGlzLmZzS3kucG9zdChcImFwaS9maWxlcy91cHNlcnRcIiwge1xuICAgICAgICBqc29uOiB7XG4gICAgICAgICAgZmlsZV9wYXRoOiBmaWxlTmFtZSxcbiAgICAgICAgICB0ZXh0X2NvbnRlbnQ6IGZpbGVDb250ZW50LFxuICAgICAgICAgIGluaXRpYXRvcjogXCJmaWxlc3lzdGVtX2NoYW5nZVwiLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNhdmVTbmlwcGV0KCkge1xuICAgIGNvbnN0IHBvc3RFdmVudCA9IGFzeW5jIChcbiAgICAgIGV2ZW50OiBcIkZBSUxFRF9UT19TQVZFX1NOSVBQRVRcIiB8IFwiU05JUFBFVF9TQVZFRFwiLFxuICAgICkgPT5cbiAgICAgIHRoaXMuZnNLeS5wb3N0KFwiYXBpL2V2ZW50cy9jcmVhdGVcIiwge1xuICAgICAgICBqc29uOiB7IGV2ZW50X3R5cGU6IGV2ZW50IH0sXG4gICAgICAgIHRocm93SHR0cEVycm9yczogZmFsc2UsXG4gICAgICB9KVxuXG4gICAgYXdhaXQgcHVzaFNuaXBwZXQoe1xuICAgICAgZmlsZVBhdGg6IHRoaXMuY29tcG9uZW50RmlsZVBhdGgsXG4gICAgICBvbkV4aXQ6IChlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gc2F2ZSBzbmlwcGV0XCIsIGUpXG4gICAgICAgIHBvc3RFdmVudChcIkZBSUxFRF9UT19TQVZFX1NOSVBQRVRcIilcbiAgICAgIH0sXG4gICAgICBvbkVycm9yOiAoZSkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIHNhdmUgc25pcHBldFwiLCBlKVxuICAgICAgICBwb3N0RXZlbnQoXCJGQUlMRURfVE9fU0FWRV9TTklQUEVUXCIpXG4gICAgICB9LFxuICAgICAgb25TdWNjZXNzOiAoKSA9PiB7XG4gICAgICAgIHBvc3RFdmVudChcIlNOSVBQRVRfU0FWRURcIilcbiAgICAgIH0sXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgdGhpcy5odHRwU2VydmVyPy5jbG9zZSgpXG4gICAgdGhpcy5ldmVudHNXYXRjaGVyPy5zdG9wKClcbiAgfVxufVxuIiwgImltcG9ydCAqIGFzIGh0dHAgZnJvbSBcIm5vZGU6aHR0cFwiXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgZ2V0Tm9kZUhhbmRsZXIgfSBmcm9tIFwid2ludGVyc3BlYy9hZGFwdGVycy9ub2RlXCJcbmltcG9ydCBwa2cgZnJvbSBcIi4uLy4uL3BhY2thZ2UuanNvblwiXG5cbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB3aW50ZXJzcGVjQnVuZGxlIGZyb20gXCJAdHNjaXJjdWl0L2ZpbGUtc2VydmVyL2Rpc3QvYnVuZGxlLmpzXCJcbmltcG9ydCB7IGdldEluZGV4IH0gZnJvbSBcIi4uL3NpdGUvZ2V0SW5kZXhcIlxuXG5leHBvcnQgY29uc3QgY3JlYXRlSHR0cFNlcnZlciA9IGFzeW5jIChwb3J0ID0gMzAyMCkgPT4ge1xuICBjb25zdCBmaWxlU2VydmVySGFuZGxlciA9IGdldE5vZGVIYW5kbGVyKHdpbnRlcnNwZWNCdW5kbGUgYXMgYW55LCB7fSlcblxuICBjb25zdCBzZXJ2ZXIgPSBodHRwLmNyZWF0ZVNlcnZlcihhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcS51cmwhLCBgaHR0cDovLyR7cmVxLmhlYWRlcnMuaG9zdH1gKVxuXG4gICAgaWYgKHVybC5wYXRobmFtZSA9PT0gXCIvc3RhbmRhbG9uZS5taW4uanNcIikge1xuICAgICAgY29uc3Qgc3RhbmRhbG9uZUZpbGVQYXRoID1cbiAgICAgICAgcHJvY2Vzcy5lbnYuUlVORlJBTUVfU1RBTkRBTE9ORV9GSUxFX1BBVEggfHxcbiAgICAgICAgcGF0aC5yZXNvbHZlKFxuICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgXCJub2RlX21vZHVsZXNcIixcbiAgICAgICAgICBcIkB0c2NpcmN1aXQvcnVuZnJhbWUvZGlzdC9zdGFuZGFsb25lLm1pbi5qc1wiLFxuICAgICAgICApXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoc3RhbmRhbG9uZUZpbGVQYXRoLCBcInV0ZjhcIilcbiAgICAgICAgcmVzLndyaXRlSGVhZCgyMDAsIHtcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHQ7IGNoYXJzZXQ9dXRmLThcIixcbiAgICAgICAgfSlcbiAgICAgICAgcmVzLmVuZChjb250ZW50KVxuICAgICAgICByZXR1cm5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBzZXJ2aW5nIHN0YW5kYWxvbmUubWluLmpzOlwiLCBlcnJvcilcbiAgICAgIH1cblxuICAgICAgcmVzLndyaXRlSGVhZCgzMDIsIHtcbiAgICAgICAgTG9jYXRpb246IGBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0B0c2NpcmN1aXQvcnVuZnJhbWVAJHtwa2cuZGVwZW5kZW5jaWVzW1wiQHRzY2lyY3VpdC9ydW5mcmFtZVwiXS5yZXBsYWNlKC9eW14wLTldKy8sIFwiXCIpfS9kaXN0L3N0YW5kYWxvbmUubWluLmpzYCxcbiAgICAgIH0pXG4gICAgICByZXMuZW5kKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh1cmwucGF0aG5hbWUgPT09IFwiL1wiKSB7XG4gICAgICBjb25zdCBodG1sID0gYXdhaXQgZ2V0SW5kZXgoKVxuICAgICAgcmVzLndyaXRlSGVhZCgyMDAsIHsgXCJDb250ZW50LVR5cGVcIjogXCJ0ZXh0L2h0bWxcIiB9KVxuICAgICAgcmVzLmVuZChodG1sKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHVybC5wYXRobmFtZS5zdGFydHNXaXRoKFwiL2FwaS9cIikpIHtcbiAgICAgIHJlcS51cmwgPSByZXEudXJsIS5yZXBsYWNlKFwiL2FwaS9cIiwgXCIvXCIpXG4gICAgICBmaWxlU2VydmVySGFuZGxlcihyZXEsIHJlcylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHJlcy53cml0ZUhlYWQoNDA0KVxuICAgIHJlcy5lbmQoXCJOb3QgZm91bmRcIilcbiAgfSlcblxuICByZXR1cm4gbmV3IFByb21pc2U8eyBzZXJ2ZXI6IGh0dHAuU2VydmVyIH0+KChyZXNvbHZlKSA9PiB7XG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCAoKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhgU2VydmVyIHJ1bm5pbmcgYXQgaHR0cDovL2xvY2FsaG9zdDoke3BvcnR9YClcbiAgICAgIHJlc29sdmUoeyBzZXJ2ZXIgfSlcbiAgICB9KVxuICB9KVxufVxuIiwgIntcbiAgXCJuYW1lXCI6IFwiQHRzY2lyY3VpdC9jbGlcIixcbiAgXCJtYWluXCI6IFwiZGlzdC9tYWluLmpzXCIsXG4gIFwidHlwZVwiOiBcIm1vZHVsZVwiLFxuICBcInZlcnNpb25cIjogXCIwLjEuMzJcIixcbiAgXCJiaW5cIjoge1xuICAgIFwidHNjaVwiOiBcIi4vZGlzdC9tYWluLmpzXCJcbiAgfSxcbiAgXCJzY3JpcHRzXCI6IHtcbiAgICBcInN0YXJ0XCI6IFwiYnVuIHJ1biBkZXZcIixcbiAgICBcImRldlwiOiBcImJ1biAtLWhvdCAuL2NsaS9tYWluLnRzIGRldiAuL2V4YW1wbGUtZGlyL3NuaXBwZXQxLWJhc2ljLnRzeFwiLFxuICAgIFwiYnVpbGRcIjogXCJ0c3VwLW5vZGUgY2xpL21haW4udHMgLS1mb3JtYXQgZXNtIC0tc291cmNlbWFwIGlubGluZVwiLFxuICAgIFwiZm9ybWF0XCI6IFwiYmlvbWUgZm9ybWF0IC0td3JpdGUgLlwiLFxuICAgIFwiZm9ybWF0OmNoZWNrXCI6IFwiYmlvbWUgZm9ybWF0IC5cIixcbiAgICBcImNsaVwiOiBcImJ1biAuL2NsaS9tYWluLnRzXCJcbiAgfSxcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiQGJpb21lanMvYmlvbWVcIjogXCJeMS45LjRcIixcbiAgICBcIkB0c2NpcmN1aXQvY29yZVwiOiBcIl4wLjAuMjQ5XCIsXG4gICAgXCJAdHNjaXJjdWl0L2Zha2Utc25pcHBldHNcIjogXCJeMC4wLjVcIixcbiAgICBcIkB0eXBlcy9idW5cIjogXCJeMS4xLjE1XCIsXG4gICAgXCJAdHlwZXMvY29uZmlnc3RvcmVcIjogXCJeNi4wLjJcIixcbiAgICBcIkB0eXBlcy9yZWFjdFwiOiBcIl4xOS4wLjhcIixcbiAgICBcIkB0eXBlcy9zZW12ZXJcIjogXCJeNy41LjhcIixcbiAgICBcImdldC1wb3J0XCI6IFwiXjcuMS4wXCIsXG4gICAgXCJ0ZW1weVwiOiBcIl4zLjEuMFwiLFxuICAgIFwidHN1cFwiOiBcIl44LjMuNVwiLFxuICAgIFwidHlwZWQta3lcIjogXCJeMC4wLjRcIlxuICB9LFxuICBcInBlZXJEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwidHlwZXNjcmlwdFwiOiBcIl41LjAuMFwiXG4gIH0sXG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkB0c2NpcmN1aXQvZXZhbFwiOiBcIl4wLjAuOTZcIixcbiAgICBcIkB0c2NpcmN1aXQvZmlsZS1zZXJ2ZXJcIjogXCJeMC4wLjEzXCIsXG4gICAgXCJAdHNjaXJjdWl0L3J1bmZyYW1lXCI6IFwiXjAuMC4xNjdcIixcbiAgICBcImJ1bi1tYXRjaC1zdmdcIjogXCJeMC4wLjlcIixcbiAgICBcImNob2tpZGFyXCI6IFwiNC4wLjFcIixcbiAgICBcImNpcmN1aXQtdG8tc3ZnXCI6IFwiXjAuMC4xMDFcIixcbiAgICBcImNvbW1hbmRlclwiOiBcIl4xMi4xLjBcIixcbiAgICBcImNvbmZpZ3N0b3JlXCI6IFwiXjcuMC4wXCIsXG4gICAgXCJjb3NtaWNvbmZpZ1wiOiBcIl45LjAuMFwiLFxuICAgIFwiZGVsYXlcIjogXCJeNi4wLjBcIixcbiAgICBcImp3dC1kZWNvZGVcIjogXCJeNC4wLjBcIixcbiAgICBcImt5XCI6IFwiXjEuNy40XCIsXG4gICAgXCJtYWtlLXZmc1wiOiBcIl4xLjAuMTVcIixcbiAgICBcInBlcmZlY3QtY2xpXCI6IFwiXjEuMC4yMFwiLFxuICAgIFwicmVkYXhpb3NcIjogXCJeMC41LjFcIixcbiAgICBcInNlbXZlclwiOiBcIl43LjYuM1wiXG4gIH1cbn1cbiIsICJpbXBvcnQgcGtnIGZyb20gXCIuLi8uLi9wYWNrYWdlLmpzb25cIlxuXG5leHBvcnQgY29uc3QgZ2V0SW5kZXggPSBhc3luYyAoKSA9PiB7XG4gIHJldHVybiBgPGh0bWw+XG4gICAgPGhlYWQ+XG4gICAgPC9oZWFkPlxuICAgIDxib2R5PlxuICAgICAgPHNjcmlwdCBzcmM9XCJodHRwczovL2Nkbi50YWlsd2luZGNzcy5jb21cIj48L3NjcmlwdD5cbiAgICAgIDxkaXYgaWQ9XCJyb290XCI+bG9hZGluZy4uLjwvZGl2PlxuICAgICAgPHNjcmlwdD5cbiAgICAgIGdsb2JhbFRoaXMucHJvY2VzcyA9IHsgZW52OiB7IE5PREVfRU5WOiBcInByb2R1Y3Rpb25cIiB9IH1cbiAgICAgIDwvc2NyaXB0PlxuICAgICAgPHNjcmlwdCBzcmM9XCIvc3RhbmRhbG9uZS5taW4uanNcIj48L3NjcmlwdD5cbiAgICA8L2JvZHk+XG4gIDwvaHRtbD5gXG59XG5cbi8vIDxzY3JpcHQgc3JjPVwiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9AdHNjaXJjdWl0L3J1bmZyYW1lQCR7cGtnLmRlcGVuZGVuY2llc1tcIkB0c2NpcmN1aXQvcnVuZnJhbWVcIl0ucmVwbGFjZSgvXlteMC05XSsvLCBcIlwiKX0vZGlzdC9zdGFuZGFsb25lLm1pbi5qc1wiPjwvc2NyaXB0PlxuIiwgImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJldmVudHNcIlxuXG5pbnRlcmZhY2UgRXZlbnQge1xuICBldmVudF9pZDogc3RyaW5nXG4gIGNyZWF0ZWRfYXQ6IHN0cmluZ1xuICBldmVudF90eXBlOiBzdHJpbmdcbiAgW2tleTogc3RyaW5nXTogYW55XG59XG5cbmludGVyZmFjZSBFdmVudHNSZXNwb25zZSB7XG4gIGV2ZW50X2xpc3Q6IEV2ZW50W11cbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50c1dhdGNoZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBwcml2YXRlIGxhc3RQb2xsVGltZTogc3RyaW5nXG4gIHByaXZhdGUgcG9sbEludGVydmFsOiBudW1iZXJcbiAgcHJpdmF0ZSBiYXNlVXJsOiBzdHJpbmdcbiAgcHJpdmF0ZSBwb2xsaW5nID0gZmFsc2VcbiAgcHJpdmF0ZSB0aW1lb3V0SWQ/OiBOb2RlSlMuVGltZW91dFxuXG4gIGNvbnN0cnVjdG9yKGJhc2VVcmwgPSBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMFwiLCBwb2xsSW50ZXJ2YWwgPSAxMDAwKSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmxcbiAgICB0aGlzLnBvbGxJbnRlcnZhbCA9IHBvbGxJbnRlcnZhbFxuICAgIHRoaXMubGFzdFBvbGxUaW1lID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gIH1cblxuICBhc3luYyBzdGFydCgpIHtcbiAgICBpZiAodGhpcy5wb2xsaW5nKSByZXR1cm5cbiAgICB0aGlzLnBvbGxpbmcgPSB0cnVlXG4gICAgYXdhaXQgdGhpcy5wb2xsKClcbiAgfVxuXG4gIHN0b3AoKSB7XG4gICAgdGhpcy5wb2xsaW5nID0gZmFsc2VcbiAgICBpZiAodGhpcy50aW1lb3V0SWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBvbGwoKSB7XG4gICAgaWYgKCF0aGlzLnBvbGxpbmcpIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICAgIGAke3RoaXMuYmFzZVVybH0vYXBpL2V2ZW50cy9saXN0P3NpbmNlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMubGFzdFBvbGxUaW1lKX1gLFxuICAgICAgKVxuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCBlcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhOiBFdmVudHNSZXNwb25zZSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuXG4gICAgICAvLyBVcGRhdGUgbGFzdCBwb2xsIHRpbWUgdG8gbGF0ZXN0IGV2ZW50IG9yIGN1cnJlbnQgdGltZVxuICAgICAgY29uc3QgbGF0ZXN0RXZlbnQgPSBkYXRhLmV2ZW50X2xpc3RbZGF0YS5ldmVudF9saXN0Lmxlbmd0aCAtIDFdXG4gICAgICB0aGlzLmxhc3RQb2xsVGltZSA9IGxhdGVzdEV2ZW50XG4gICAgICAgID8gbGF0ZXN0RXZlbnQuY3JlYXRlZF9hdFxuICAgICAgICA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuXG4gICAgICAvLyBFbWl0IGV2ZW50cyBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyXG4gICAgICBkYXRhLmV2ZW50X2xpc3QuZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5lbWl0KGV2ZW50LmV2ZW50X3R5cGUsIGV2ZW50KVxuICAgICAgICB0aGlzLmVtaXQoXCIqXCIsIGV2ZW50KVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5lbWl0KFwiZXJyb3JcIiwgZXJyb3IpXG4gICAgfVxuICAgIC8vIFNjaGVkdWxlIG5leHQgcG9sbFxuICAgIHRoaXMudGltZW91dElkID0gZ2xvYmFsVGhpcy5zZXRUaW1lb3V0KFxuICAgICAgKCkgPT4gdGhpcy5wb2xsKCksXG4gICAgICB0aGlzLnBvbGxJbnRlcnZhbCxcbiAgICApIGFzIHVua25vd24gYXMgTm9kZUpTLlRpbWVvdXRcbiAgfVxufVxuIiwgImltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBmaW5kSW1wb3J0c0luU25pcHBldCB9IGZyb20gXCIuL2ZpbmRJbXBvcnRzSW5TbmlwcGV0XCJcbmltcG9ydCB7IGluc3RhbGxOb2RlTW9kdWxlVHlwZXNGb3JTbmlwcGV0IH0gZnJvbSBcIi4vaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXRcIlxuXG5leHBvcnQgY2xhc3MgRmlsZXN5c3RlbVR5cGVzSGFuZGxlciB7XG4gIHByaXZhdGUgcHJvamVjdFJvb3Q6IHN0cmluZ1xuXG4gIGNvbnN0cnVjdG9yKGluaXRpYWxEaXI6IHN0cmluZykge1xuICAgIHRoaXMucHJvamVjdFJvb3QgPSB0aGlzLmZpbmRQcm9qZWN0Um9vdChpbml0aWFsRGlyKVxuICB9XG5cbiAgYXN5bmMgaGFuZGxlSW5pdGlhbFR5cGVEZXBlbmRlbmNpZXMoZmlsZVBhdGg6IHN0cmluZykge1xuICAgIGNvbnNvbGUubG9nKFwiQ2hlY2tpbmcgaW5pdGlhbCB0eXBlIGRlcGVuZGVuY2llcy4uLlwiKVxuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMuYXJlVHlwZXNJbnN0YWxsZWQoZmlsZVBhdGgpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiSW5zdGFsbGluZyBtaXNzaW5nIGluaXRpYWwgdHlwZXMuLi5cIilcbiAgICAgICAgYXdhaXQgaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXQoZmlsZVBhdGgpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkVycm9yIGhhbmRsaW5nIGluaXRpYWwgdHlwZSBkZXBlbmRlbmNpZXM6XCIsIGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUZpbGVUeXBlRGVwZW5kZW5jaWVzKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLmFyZVR5cGVzSW5zdGFsbGVkKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkluc3RhbGxpbmcgbWlzc2luZyBmaWxlIHR5cGVzLi4uXCIpXG4gICAgICAgIGF3YWl0IGluc3RhbGxOb2RlTW9kdWxlVHlwZXNGb3JTbmlwcGV0KGZpbGVQYXRoKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJGYWlsZWQgdG8gdmVyaWZ5IHR5cGVzOlwiLCBlcnJvcilcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFyZVR5cGVzSW5zdGFsbGVkKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBpbXBvcnRzID0gZmluZEltcG9ydHNJblNuaXBwZXQoZmlsZVBhdGgpXG4gICAgcmV0dXJuIGltcG9ydHMuZXZlcnkoKGltcCkgPT4gdGhpcy5jaGVja1R5cGVFeGlzdHMoaW1wKSlcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tUeXBlRXhpc3RzKGltcG9ydFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiQHRzY2kvXCIpKSByZXR1cm4gdHJ1ZVxuXG4gICAgY29uc3QgcGF0aFdpdGhvdXRQcmVmaXggPSBpbXBvcnRQYXRoLnJlcGxhY2UoXCJAdHNjaS9cIiwgXCJcIilcbiAgICBjb25zdCBbb3duZXIsIG5hbWVdID0gcGF0aFdpdGhvdXRQcmVmaXguc3BsaXQoXCIuXCIpXG5cbiAgICBjb25zdCB0eXBlUGF0aCA9IHBhdGguam9pbihcbiAgICAgIHRoaXMucHJvamVjdFJvb3QsXG4gICAgICBcIm5vZGVfbW9kdWxlc1wiLFxuICAgICAgXCJAdHNjaVwiLFxuICAgICAgYCR7b3duZXJ9LiR7bmFtZX1gLFxuICAgICAgXCJpbmRleC5kLnRzXCIsXG4gICAgKVxuXG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmModHlwZVBhdGgpXG4gIH1cblxuICBwcml2YXRlIGZpbmRQcm9qZWN0Um9vdChzdGFydERpcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcm9vdCA9IHBhdGgucmVzb2x2ZShzdGFydERpcilcbiAgICB3aGlsZSAocm9vdCAhPT0gcGF0aC5wYXJzZShyb290KS5yb290KSB7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdCwgXCJwYWNrYWdlLmpzb25cIikpKSB7XG4gICAgICAgIHJldHVybiByb290XG4gICAgICB9XG4gICAgICByb290ID0gcGF0aC5kaXJuYW1lKHJvb3QpXG4gICAgfVxuICAgIHJldHVybiBzdGFydERpclxuICB9XG59XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgdHMgZnJvbSBcInR5cGVzY3JpcHRcIlxuXG5leHBvcnQgZnVuY3Rpb24gZmluZEltcG9ydHNJblNuaXBwZXQoc25pcHBldFBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzbmlwcGV0UGF0aCwgXCJ1dGYtOFwiKVxuICBjb25zdCBzb3VyY2VGaWxlID0gdHMuY3JlYXRlU291cmNlRmlsZShcbiAgICBzbmlwcGV0UGF0aCxcbiAgICBjb250ZW50LFxuICAgIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsXG4gICAgdHJ1ZSxcbiAgKVxuXG4gIGNvbnN0IGltcG9ydHM6IHN0cmluZ1tdID0gW11cblxuICBmdW5jdGlvbiB2aXNpdChub2RlOiB0cy5Ob2RlKSB7XG4gICAgaWYgKHRzLmlzSW1wb3J0RGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgIGNvbnN0IG1vZHVsZVNwZWNpZmllciA9IG5vZGUubW9kdWxlU3BlY2lmaWVyXG4gICAgICBpZiAobW9kdWxlU3BlY2lmaWVyICYmIHRzLmlzU3RyaW5nTGl0ZXJhbChtb2R1bGVTcGVjaWZpZXIpKSB7XG4gICAgICAgIGNvbnN0IGltcG9ydFBhdGggPSBtb2R1bGVTcGVjaWZpZXIudGV4dFxuICAgICAgICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiQHRzY2kvXCIpKSB7XG4gICAgICAgICAgaW1wb3J0cy5wdXNoKGltcG9ydFBhdGgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdHMuZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0KVxuICB9XG5cbiAgdmlzaXQoc291cmNlRmlsZSlcblxuICByZXR1cm4gaW1wb3J0c1xufVxuIiwgImltcG9ydCBDb25maWdzdG9yZSBmcm9tIFwiY29uZmlnc3RvcmVcIlxuaW1wb3J0IHR5cGUgeyBUeXBlZENvbmZpZ3N0b3JlIH0gZnJvbSBcIi4vVHlwZWRDb25maWdTdG9yZVwiXG5pbXBvcnQgeyBqd3REZWNvZGUgfSBmcm9tIFwiand0LWRlY29kZVwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpQ29uZmlnIHtcbiAgc2Vzc2lvblRva2VuPzogc3RyaW5nXG4gIGdpdGh1YlVzZXJuYW1lPzogc3RyaW5nXG4gIHJlZ2lzdHJ5QXBpVXJsPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBjbGlDb25maWc6IFR5cGVkQ29uZmlnc3RvcmU8Q2xpQ29uZmlnPiA9IG5ldyBDb25maWdzdG9yZShcbiAgXCJ0c2NpcmN1aXRcIixcbilcblxuZXhwb3J0IGNvbnN0IHNldFNlc3Npb25Ub2tlbiA9ICh0b2tlbjogc3RyaW5nKSA9PiB7XG4gIGNsaUNvbmZpZy5zZXQoXCJzZXNzaW9uVG9rZW5cIiwgdG9rZW4pXG4gIGNvbnN0IGRlY29kZWQgPSBqd3REZWNvZGU8e1xuICAgIGdpdGh1Yl91c2VybmFtZTogc3RyaW5nXG4gIH0+KHRva2VuKVxuICBjbGlDb25maWcuc2V0KFwiZ2l0aHViVXNlcm5hbWVcIiwgZGVjb2RlZC5naXRodWJfdXNlcm5hbWUpXG59XG5cbmV4cG9ydCBjb25zdCBjbGVhclNlc3Npb24gPSAoKSA9PiB7XG4gIGNsaUNvbmZpZy5kZWxldGUoXCJzZXNzaW9uVG9rZW5cIilcbiAgY2xpQ29uZmlnLmRlbGV0ZShcImdpdGh1YlVzZXJuYW1lXCIpXG59XG5cbmV4cG9ydCBjb25zdCBnZXRSZWdpc3RyeUFwaVVybCA9ICgpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gY2xpQ29uZmlnLmdldChcInJlZ2lzdHJ5QXBpVXJsXCIpID8/IFwiaHR0cHM6Ly9yZWdpc3RyeS1hcGkudHNjaXJjdWl0LmNvbVwiXG59XG4iLCAiaW1wb3J0IHsgZ2V0UmVnaXN0cnlBcGlVcmwgfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuaW1wb3J0IGt5LCB7IHR5cGUgQWZ0ZXJSZXNwb25zZUhvb2sgfSBmcm9tIFwia3lcIlxuXG5leHBvcnQgY29uc3QgcHJldHR5UmVzcG9uc2VFcnJvckhvb2s6IEFmdGVyUmVzcG9uc2VIb29rID0gYXN5bmMgKFxuICBfcmVxdWVzdCxcbiAgX29wdGlvbnMsXG4gIHJlc3BvbnNlLFxuKSA9PiB7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXJyb3JEYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBGQUlMIFske3Jlc3BvbnNlLnN0YXR1c31dOiAke19yZXF1ZXN0Lm1ldGhvZH0gJHtcbiAgICAgICAgICBuZXcgVVJMKF9yZXF1ZXN0LnVybCkucGF0aG5hbWVcbiAgICAgICAgfSBcXG5cXG4gJHtKU09OLnN0cmluZ2lmeShlcnJvckRhdGEsIG51bGwsIDIpfWAsXG4gICAgICApXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy9pZ25vcmUsIGFsbG93IHRoZSBlcnJvciB0byBiZSB0aHJvd25cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldEt5ID0gKCkgPT4ge1xuICByZXR1cm4ga3kuY3JlYXRlKHtcbiAgICBwcmVmaXhVcmw6IGdldFJlZ2lzdHJ5QXBpVXJsKCksXG4gICAgaG9va3M6IHtcbiAgICAgIGFmdGVyUmVzcG9uc2U6IFtwcmV0dHlSZXNwb25zZUVycm9ySG9va10sXG4gICAgfSxcbiAgfSlcbn1cbiIsICJpbXBvcnQgeyBjbGlDb25maWcgfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuaW1wb3J0IHsgZ2V0S3kgfSBmcm9tIFwibGliL3JlZ2lzdHJ5LWFwaS9nZXQta3lcIlxuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCBzZW12ZXIgZnJvbSBcInNlbXZlclwiXG5cbnR5cGUgUHVzaE9wdGlvbnMgPSB7XG4gIGZpbGVQYXRoPzogc3RyaW5nXG4gIG9uRXhpdD86IChjb2RlOiBudW1iZXIpID0+IHZvaWRcbiAgb25FcnJvcj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWRcbiAgb25TdWNjZXNzPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZFxufVxuXG5leHBvcnQgY29uc3QgcHVzaFNuaXBwZXQgPSBhc3luYyAoe1xuICBmaWxlUGF0aCxcbiAgb25FeGl0ID0gKGNvZGUpID0+IHByb2Nlc3MuZXhpdChjb2RlKSxcbiAgb25FcnJvciA9IChtZXNzYWdlKSA9PiBjb25zb2xlLmVycm9yKG1lc3NhZ2UpLFxuICBvblN1Y2Nlc3MgPSAobWVzc2FnZSkgPT4gY29uc29sZS5sb2cobWVzc2FnZSksXG59OiBQdXNoT3B0aW9ucykgPT4ge1xuICBjb25zdCBzZXNzaW9uVG9rZW4gPSBjbGlDb25maWcuZ2V0KFwic2Vzc2lvblRva2VuXCIpXG4gIGlmICghc2Vzc2lvblRva2VuKSB7XG4gICAgb25FcnJvcihcIllvdSBuZWVkIHRvIGxvZyBpbiB0byBzYXZlIHNuaXBwZXQuXCIpXG4gICAgcmV0dXJuIG9uRXhpdCgxKVxuICB9XG5cbiAgbGV0IHNuaXBwZXRGaWxlUGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgaWYgKGZpbGVQYXRoKSB7XG4gICAgc25pcHBldEZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGZpbGVQYXRoKVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGRlZmF1bHRFbnRyeXBvaW50ID0gcGF0aC5yZXNvbHZlKFwiaW5kZXgudHN4XCIpXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGVmYXVsdEVudHJ5cG9pbnQpKSB7XG4gICAgICBzbmlwcGV0RmlsZVBhdGggPSBkZWZhdWx0RW50cnlwb2ludFxuICAgICAgb25TdWNjZXNzKFwiTm8gZmlsZSBwcm92aWRlZC4gVXNpbmcgJ2luZGV4LnRzeCcgYXMgdGhlIGVudHJ5cG9pbnQuXCIpXG4gICAgfSBlbHNlIHtcbiAgICAgIG9uRXJyb3IoXG4gICAgICAgIFwiTm8gZW50cnlwb2ludCBmb3VuZC4gUnVuICd0c2NpIGluaXQnIHRvIGJvb3RzdHJhcCBhIGJhc2ljIHByb2plY3QuXCIsXG4gICAgICApXG4gICAgICByZXR1cm4gb25FeGl0KDEpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKFxuICAgIHBhdGguam9pbihwYXRoLmRpcm5hbWUoc25pcHBldEZpbGVQYXRoKSwgXCJwYWNrYWdlLmpzb25cIiksXG4gIClcbiAgbGV0IHBhY2thZ2VKc29uOiB7IG5hbWU/OiBzdHJpbmc7IGF1dGhvcj86IHN0cmluZzsgdmVyc2lvbj86IHN0cmluZyB9ID0ge31cbiAgaWYgKGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCkudG9TdHJpbmcoKSlcbiAgICB9IGNhdGNoIHtcbiAgICAgIG9uRXJyb3IoXCJJbnZhbGlkIHBhY2thZ2UuanNvbiBwcm92aWRlZFwiKVxuICAgICAgcmV0dXJuIG9uRXhpdCgxKVxuICAgIH1cbiAgfVxuXG4gIGlmICghZnMuZXhpc3RzU3luYyhzbmlwcGV0RmlsZVBhdGgpKSB7XG4gICAgb25FcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7c25pcHBldEZpbGVQYXRofWApXG4gICAgcmV0dXJuIG9uRXhpdCgxKVxuICB9XG5cbiAgY29uc3Qga3kgPSBnZXRLeSgpXG4gIGNvbnN0IHBhY2thZ2VOYW1lID0gKFxuICAgIHBhY2thZ2VKc29uLm5hbWUgPz8gcGF0aC5wYXJzZShzbmlwcGV0RmlsZVBhdGgpLm5hbWVcbiAgKS5yZXBsYWNlKC9eQC8sIFwiXCIpXG4gIGNvbnN0IHBhY2thZ2VBdXRob3IgPVxuICAgIHBhY2thZ2VKc29uLmF1dGhvcj8uc3BsaXQoXCIgXCIpWzBdID8/IGNsaUNvbmZpZy5nZXQoXCJnaXRodWJVc2VybmFtZVwiKVxuICBjb25zdCBwYWNrYWdlSWRlbnRpZmllciA9IGAke3BhY2thZ2VBdXRob3J9LyR7cGFja2FnZU5hbWV9YFxuXG4gIGxldCBwYWNrYWdlVmVyc2lvbiA9XG4gICAgcGFja2FnZUpzb24udmVyc2lvbiA/P1xuICAgIChhd2FpdCBreVxuICAgICAgLnBvc3Q8e1xuICAgICAgICBlcnJvcj86IHsgZXJyb3JfY29kZTogc3RyaW5nIH1cbiAgICAgICAgcGFja2FnZV9yZWxlYXNlcz86IHsgdmVyc2lvbjogc3RyaW5nOyBpc19sYXRlc3Q6IGJvb2xlYW4gfVtdXG4gICAgICB9PihcInBhY2thZ2VfcmVsZWFzZXMvbGlzdFwiLCB7XG4gICAgICAgIGpzb246IHsgcGFja2FnZV9uYW1lOiBwYWNrYWdlSWRlbnRpZmllciB9LFxuICAgICAgfSlcbiAgICAgIC5qc29uKClcbiAgICAgIC50aGVuKFxuICAgICAgICAocmVzcG9uc2UpID0+XG4gICAgICAgICAgcmVzcG9uc2UucGFja2FnZV9yZWxlYXNlcz8uW3Jlc3BvbnNlLnBhY2thZ2VfcmVsZWFzZXMubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgID8udmVyc2lvbixcbiAgICAgIClcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgb25FcnJvcihcIkZhaWxlZCB0byByZXRyaWV2ZSBsYXRlc3QgcGFja2FnZSB2ZXJzaW9uOlwiICsgZXJyb3IpXG4gICAgICAgIHJldHVybiBvbkV4aXQoMSlcbiAgICAgIH0pKVxuXG4gIGlmICghcGFja2FnZVZlcnNpb24pIHtcbiAgICBvbkVycm9yKFwiRmFpbGVkIHRvIHJldHJpZXZlIHBhY2thZ2UgdmVyc2lvbi5cIilcbiAgICByZXR1cm4gb25FeGl0KDEpXG4gIH1cblxuICBjb25zdCB1cGRhdGVQYWNrYWdlSnNvblZlcnNpb24gPSAobmV3VmVyc2lvbj86IHN0cmluZykgPT4ge1xuICAgIGlmIChwYWNrYWdlSnNvbi52ZXJzaW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwYWNrYWdlSnNvbi52ZXJzaW9uID0gbmV3VmVyc2lvbiA/PyBgJHtwYWNrYWdlVmVyc2lvbn1gXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiwgbnVsbCwgMikpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBvbkVycm9yKFwiRmFpbGVkIHRvIHVwZGF0ZSBwYWNrYWdlLmpzb24gdmVyc2lvbjpcIiArIGVycm9yKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRvZXNQYWNrYWdlRXhpc3QgPSBhd2FpdCBreVxuICAgIC5wb3N0PHsgZXJyb3I/OiB7IGVycm9yX2NvZGU6IHN0cmluZyB9IH0+KFwicGFja2FnZXMvZ2V0XCIsIHtcbiAgICAgIGpzb246IHsgbmFtZTogcGFja2FnZUlkZW50aWZpZXIgfSxcbiAgICAgIHRocm93SHR0cEVycm9yczogZmFsc2UsXG4gICAgfSlcbiAgICAuanNvbigpXG4gICAgLnRoZW4oKHJlc3BvbnNlKSA9PiAhKHJlc3BvbnNlLmVycm9yPy5lcnJvcl9jb2RlID09PSBcInBhY2thZ2Vfbm90X2ZvdW5kXCIpKVxuXG4gIGlmICghZG9lc1BhY2thZ2VFeGlzdCkge1xuICAgIGF3YWl0IGt5XG4gICAgICAucG9zdChcInBhY2thZ2VzL2NyZWF0ZVwiLCB7XG4gICAgICAgIGpzb246IHsgbmFtZTogcGFja2FnZUlkZW50aWZpZXIgfSxcbiAgICAgICAgaGVhZGVyczogeyBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7c2Vzc2lvblRva2VufWAgfSxcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIG9uRXJyb3IoXCJFcnJvciBjcmVhdGluZyBwYWNrYWdlOlwiICsgZXJyb3IpXG4gICAgICAgIHJldHVybiBvbkV4aXQoMSlcbiAgICAgIH0pXG4gIH1cblxuICBjb25zdCBkb2VzUmVsZWFzZUV4aXN0ID0gYXdhaXQga3lcbiAgICAucG9zdDx7XG4gICAgICBlcnJvcj86IHsgZXJyb3JfY29kZTogc3RyaW5nIH1cbiAgICAgIHBhY2thZ2VfcmVsZWFzZT86IHsgdmVyc2lvbjogc3RyaW5nIH1cbiAgICB9PihcInBhY2thZ2VfcmVsZWFzZXMvZ2V0XCIsIHtcbiAgICAgIGpzb246IHtcbiAgICAgICAgcGFja2FnZV9uYW1lX3dpdGhfdmVyc2lvbjogYCR7cGFja2FnZUlkZW50aWZpZXJ9QCR7cGFja2FnZVZlcnNpb259YCxcbiAgICAgIH0sXG4gICAgICB0aHJvd0h0dHBFcnJvcnM6IGZhbHNlLFxuICAgIH0pXG4gICAgLmpzb24oKVxuICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKHJlc3BvbnNlLnBhY2thZ2VfcmVsZWFzZT8udmVyc2lvbikge1xuICAgICAgICBwYWNrYWdlVmVyc2lvbiA9IHJlc3BvbnNlLnBhY2thZ2VfcmVsZWFzZS52ZXJzaW9uXG4gICAgICAgIHVwZGF0ZVBhY2thZ2VKc29uVmVyc2lvbihyZXNwb25zZS5wYWNrYWdlX3JlbGVhc2UudmVyc2lvbilcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiAhKHJlc3BvbnNlLmVycm9yPy5lcnJvcl9jb2RlID09PSBcInBhY2thZ2VfcmVsZWFzZV9ub3RfZm91bmRcIilcbiAgICB9KVxuXG4gIGlmIChkb2VzUmVsZWFzZUV4aXN0KSB7XG4gICAgY29uc3QgYnVtcGVkVmVyc2lvbiA9IHNlbXZlci5pbmMocGFja2FnZVZlcnNpb24sIFwicGF0Y2hcIikhXG4gICAgb25TdWNjZXNzKFxuICAgICAgYEluY3JlbWVudGluZyBQYWNrYWdlIFZlcnNpb24gJHtwYWNrYWdlVmVyc2lvbn0gLT4gJHtidW1wZWRWZXJzaW9ufWAsXG4gICAgKVxuICAgIHBhY2thZ2VWZXJzaW9uID0gYnVtcGVkVmVyc2lvblxuICAgIHVwZGF0ZVBhY2thZ2VKc29uVmVyc2lvbihwYWNrYWdlVmVyc2lvbilcbiAgfVxuXG4gIGF3YWl0IGt5XG4gICAgLnBvc3QoXCJwYWNrYWdlX3JlbGVhc2VzL2NyZWF0ZVwiLCB7XG4gICAgICBqc29uOiB7XG4gICAgICAgIHBhY2thZ2VfbmFtZV93aXRoX3ZlcnNpb246IGAke3BhY2thZ2VJZGVudGlmaWVyfUAke3BhY2thZ2VWZXJzaW9ufWAsXG4gICAgICB9LFxuICAgICAgdGhyb3dIdHRwRXJyb3JzOiBmYWxzZSxcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgIG9uRXJyb3IoXCJFcnJvciBjcmVhdGluZyByZWxlYXNlOlwiICsgZXJyb3IpXG4gICAgICByZXR1cm4gb25FeGl0KDEpXG4gICAgfSlcblxuICBvblN1Y2Nlc3MoXCJcXG5cIilcblxuICBjb25zdCBkaXJlY3RvcnlGaWxlcyA9IGZzLnJlYWRkaXJTeW5jKHBhdGguZGlybmFtZShzbmlwcGV0RmlsZVBhdGgpKVxuICBmb3IgKGNvbnN0IGZpbGUgb2YgZGlyZWN0b3J5RmlsZXMpIHtcbiAgICBjb25zdCBmaWxlRXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGZpbGUpLnJlcGxhY2UoXCIuXCIsIFwiXCIpXG4gICAgaWYgKCFbXCJqc29uXCIsIFwidHN4XCIsIFwidHNcIl0uaW5jbHVkZXMoZmlsZUV4dGVuc2lvbikpIGNvbnRpbnVlXG4gICAgY29uc3QgZmlsZUNvbnRlbnQgPVxuICAgICAgZnNcbiAgICAgICAgLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHNuaXBwZXRGaWxlUGF0aCksIGZpbGUpKVxuICAgICAgICAudG9TdHJpbmcoKSA/PyBcIlwiXG4gICAgYXdhaXQga3lcbiAgICAgIC5wb3N0KFwicGFja2FnZV9maWxlcy9jcmVhdGVcIiwge1xuICAgICAgICBqc29uOiB7XG4gICAgICAgICAgZmlsZV9wYXRoOiBmaWxlLFxuICAgICAgICAgIGNvbnRlbnRfdGV4dDogZmlsZUNvbnRlbnQsXG4gICAgICAgICAgcGFja2FnZV9uYW1lX3dpdGhfdmVyc2lvbjogYCR7cGFja2FnZUlkZW50aWZpZXJ9QCR7cGFja2FnZVZlcnNpb259YCxcbiAgICAgICAgfSxcbiAgICAgICAgdGhyb3dIdHRwRXJyb3JzOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIG9uU3VjY2VzcyhgVXBsb2FkZWQgZmlsZSAke2ZpbGV9IHRvIHRoZSByZWdpc3RyeS5gKVxuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgb25FcnJvcihgRXJyb3IgdXBsb2FkaW5nIGZpbGUgJHtmaWxlfTpgICsgZXJyb3IpXG4gICAgICB9KVxuICB9XG5cbiAgb25TdWNjZXNzKFxuICAgIFtcbiAgICAgIGBcXG5cdUQ4M0NcdURGODkgU3VjY2Vzc2Z1bGx5IHB1c2hlZCBwYWNrYWdlICR7cGFja2FnZUlkZW50aWZpZXJ9QCR7cGFja2FnZVZlcnNpb259IHRvIHRoZSByZWdpc3RyeSEke0J1bi5jb2xvcihcImJsdWVcIiwgXCJhbnNpXCIpfWAsXG4gICAgICBgaHR0cHM6Ly90c2NpcmN1aXQuY29tLyR7cGFja2FnZUlkZW50aWZpZXJ9IFxceDFiWzBtYCxcbiAgICBdLmpvaW4oXCIgXCIpLFxuICApXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBzZXRTZXNzaW9uVG9rZW4gfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuaW1wb3J0IGRlbGF5IGZyb20gXCJkZWxheVwiXG5pbXBvcnQgeyBnZXRLeSB9IGZyb20gXCJsaWIvcmVnaXN0cnktYXBpL2dldC1reVwiXG5pbXBvcnQgdHlwZSB7IEVuZHBvaW50UmVzcG9uc2UgfSBmcm9tIFwibGliL3JlZ2lzdHJ5LWFwaS9lbmRwb2ludC10eXBlc1wiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckF1dGhMb2dpbiA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIC8vIERlZmluZSB0aGUgbG9naW4gYWN0aW9uIG9uY2UgdG8gc2hhcmUgYmV0d2VlbiBib3RoIGNvbW1hbmRzXG4gIGNvbnN0IGxvZ2luQWN0aW9uID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGt5ID0gZ2V0S3koKVxuXG4gICAgY29uc3QgeyBsb2dpbl9wYWdlIH0gPSBhd2FpdCBreVxuICAgICAgLnBvc3Q8RW5kcG9pbnRSZXNwb25zZVtcInNlc3Npb25zL2xvZ2luX3BhZ2UvY3JlYXRlXCJdPihcbiAgICAgICAgXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2NyZWF0ZVwiLFxuICAgICAgICB7XG4gICAgICAgICAganNvbjoge30sXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgICAuanNvbigpXG5cbiAgICBjb25zb2xlLmxvZyhcIlBsZWFzZSB2aXNpdCB0aGUgZm9sbG93aW5nIFVSTCB0byBsb2cgaW46XCIpXG4gICAgY29uc29sZS5sb2cobG9naW5fcGFnZS51cmwpXG5cbiAgICAvLyBXYWl0IHVudGlsIHdlIHJlY2VpdmUgY29uZmlybWF0aW9uXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHsgbG9naW5fcGFnZTogbmV3X2xvZ2luX3BhZ2UgfSA9IGF3YWl0IGt5XG4gICAgICAgIC5wb3N0PEVuZHBvaW50UmVzcG9uc2VbXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2dldFwiXT4oXG4gICAgICAgICAgXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2dldFwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGpzb246IHtcbiAgICAgICAgICAgICAgbG9naW5fcGFnZV9pZDogbG9naW5fcGFnZS5sb2dpbl9wYWdlX2lkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2xvZ2luX3BhZ2UubG9naW5fcGFnZV9hdXRoX3Rva2VufWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgICAgLmpzb24oKVxuXG4gICAgICBpZiAobmV3X2xvZ2luX3BhZ2Uud2FzX2xvZ2luX3N1Y2Nlc3NmdWwpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJMb2dnZWQgaW4hIEdlbmVyYXRpbmcgdG9rZW4uLi5cIilcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgaWYgKG5ld19sb2dpbl9wYWdlLmlzX2V4cGlyZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTG9naW4gcGFnZSBleHBpcmVkXCIpXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGRlbGF5KDEwMDApXG4gICAgfVxuXG4gICAgY29uc3QgeyBzZXNzaW9uIH0gPSBhd2FpdCBreVxuICAgICAgLnBvc3Q8RW5kcG9pbnRSZXNwb25zZVtcInNlc3Npb25zL2xvZ2luX3BhZ2UvZXhjaGFuZ2VfZm9yX2NsaV9zZXNzaW9uXCJdPihcbiAgICAgICAgXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2V4Y2hhbmdlX2Zvcl9jbGlfc2Vzc2lvblwiLFxuICAgICAgICB7XG4gICAgICAgICAganNvbjoge1xuICAgICAgICAgICAgbG9naW5fcGFnZV9pZDogbG9naW5fcGFnZS5sb2dpbl9wYWdlX2lkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2xvZ2luX3BhZ2UubG9naW5fcGFnZV9hdXRoX3Rva2VufWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIClcbiAgICAgIC5qc29uKClcblxuICAgIHNldFNlc3Npb25Ub2tlbihzZXNzaW9uLnRva2VuKVxuICAgIGNvbnNvbGUubG9nKFwiXFxuUmVhZHkgdG8gdXNlIVwiKVxuICB9XG5cbiAgLy8gUmVnaXN0ZXIgdGhlIGF1dGggbG9naW4gc3ViY29tbWFuZFxuICBwcm9ncmFtLmNvbW1hbmRzXG4gICAgLmZpbmQoKGMpID0+IGMubmFtZSgpID09PSBcImF1dGhcIikhXG4gICAgLmNvbW1hbmQoXCJsb2dpblwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkF1dGhlbnRpY2F0ZSBDTEksIGxvZ2luIHRvIHJlZ2lzdHJ5XCIpXG4gICAgLmFjdGlvbihsb2dpbkFjdGlvbilcblxuICAvLyBSZWdpc3RlciB0aGUgdG9wLWxldmVsIGxvZ2luIGNvbW1hbmQgYXMgYW4gYWxpYXNcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKFwibG9naW5cIilcbiAgICAuZGVzY3JpcHRpb24oXCJMb2dpbiB0byB0c2NpcmN1aXQgcmVnaXN0cnlcIilcbiAgICAuYWN0aW9uKGxvZ2luQWN0aW9uKVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgY2xlYXJTZXNzaW9uIH0gZnJvbSBcImxpYi9jbGktY29uZmlnXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQXV0aExvZ291dCA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIGNvbnN0IGxvZ291dEFjdGlvbiA9ICgpID0+IHtcbiAgICBjbGVhclNlc3Npb24oKVxuICAgIGNvbnNvbGUubG9nKFwiWW91IGhhdmUgYmVlbiBsb2dnZWQgb3V0IVwiKVxuICB9XG5cbiAgLy8gUmVnaXN0ZXIgdGhlIGF1dGggbG9nb3V0IHN1YmNvbW1hbmRcbiAgcHJvZ3JhbS5jb21tYW5kc1xuICAgIC5maW5kKChjKSA9PiBjLm5hbWUoKSA9PT0gXCJhdXRoXCIpIVxuICAgIC5jb21tYW5kKFwibG9nb3V0XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiTG9nb3V0IGZyb20gcmVnaXN0cnlcIilcbiAgICAuYWN0aW9uKGxvZ291dEFjdGlvbilcblxuICAvLyBSZWdpc3RlciB0aGUgdG9wLWxldmVsIGxvZ291dCBjb21tYW5kIGFzIGFuIGFsaWFzXG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImxvZ291dFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkxvZ291dCBmcm9tIHRzY2lyY3VpdCByZWdpc3RyeVwiKVxuICAgIC5hY3Rpb24obG9nb3V0QWN0aW9uKVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJBdXRoID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbS5jb21tYW5kKFwiYXV0aFwiKS5kZXNjcmlwdGlvbihcIkxvZ2luL2xvZ291dFwiKVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJDb25maWcgPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtLmNvbW1hbmQoXCJjb25maWdcIikuZGVzY3JpcHRpb24oXCJNYW5hZ2UgdHNjaXJjdWl0IENMSSBjb25maWd1cmF0aW9uXCIpXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBjbGlDb25maWcgfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJDb25maWdQcmludCA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZHNcbiAgICAuZmluZCgoYykgPT4gYy5uYW1lKCkgPT09IFwiY29uZmlnXCIpIVxuICAgIC5jb21tYW5kKFwicHJpbnRcIilcbiAgICAuZGVzY3JpcHRpb24oXCJQcmludCB0aGUgY3VycmVudCBjb25maWdcIilcbiAgICAuYWN0aW9uKCgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGNsaUNvbmZpZy5hbGwsIG51bGwsIDIpKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBnZXRLeSB9IGZyb20gXCJsaWIvcmVnaXN0cnktYXBpL2dldC1reVwiXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgc2V0dXBUc2NpUHJvamVjdCB9IGZyb20gXCJsaWIvc2hhcmVkL3NldHVwLXRzY2ktcGFja2FnZXNcIlxuaW1wb3J0IHsgZ2VuZXJhdGVUc0NvbmZpZyB9IGZyb20gXCJsaWIvc2hhcmVkL2dlbmVyYXRlLXRzLWNvbmZpZ1wiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckNsb25lID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKFwiY2xvbmVcIilcbiAgICAuZGVzY3JpcHRpb24oXCJDbG9uZSBhIHNuaXBwZXQgZnJvbSB0aGUgcmVnaXN0cnlcIilcbiAgICAuYXJndW1lbnQoXCI8c25pcHBldD5cIiwgXCJTbmlwcGV0IHRvIGNsb25lIChlLmcuIGF1dGhvci9zbmlwcGV0TmFtZSlcIilcbiAgICAuYWN0aW9uKGFzeW5jIChzbmlwcGV0UGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBtYXRjaCA9IHNuaXBwZXRQYXRoLm1hdGNoKC9eKD86QHRzY2lcXC8pPyhbXi8uXSspWy8uXSguKykkLylcbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBcIkludmFsaWQgc25pcHBldCBwYXRoLiBVc2UgZm9ybWF0OiBhdXRob3Ivc25pcHBldE5hbWUsIGF1dGhvci5zbmlwcGV0TmFtZSwgb3IgQHRzY2kvYXV0aG9yLnNuaXBwZXROYW1lXCIsXG4gICAgICAgIClcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFssIGF1dGhvciwgc25pcHBldE5hbWVdID0gbWF0Y2hcbiAgICAgIGNvbnNvbGUubG9nKGBDbG9uaW5nICR7YXV0aG9yfS8ke3NuaXBwZXROYW1lfS4uLmApXG5cbiAgICAgIGNvbnN0IGt5ID0gZ2V0S3koKVxuICAgICAgbGV0IHBhY2thZ2VGaWxlTGlzdFxuICAgICAgdHJ5IHtcbiAgICAgICAgcGFja2FnZUZpbGVMaXN0ID0gYXdhaXQga3lcbiAgICAgICAgICAucG9zdDx7IHBhY2thZ2VfZmlsZXM6IEFycmF5PHsgZmlsZV9wYXRoOiBzdHJpbmcgfT4gfT4oXG4gICAgICAgICAgICBcInBhY2thZ2VfZmlsZXMvbGlzdFwiLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBqc29uOiB7XG4gICAgICAgICAgICAgICAgcGFja2FnZV9uYW1lOiBgJHthdXRob3J9LyR7c25pcHBldE5hbWV9YCxcbiAgICAgICAgICAgICAgICB1c2VfbGF0ZXN0X3ZlcnNpb246IHRydWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIClcbiAgICAgICAgICAuanNvbigpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiRmFpbGVkIHRvIGZldGNoIHBhY2thZ2UgZmlsZXM6XCIsXG4gICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcixcbiAgICAgICAgKVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShgJHthdXRob3J9LiR7c25pcHBldE5hbWV9YClcbiAgICAgIGZzLm1rZGlyU3luYyhkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuXG4gICAgICBmb3IgKGNvbnN0IGZpbGVJbmZvIG9mIHBhY2thZ2VGaWxlTGlzdC5wYWNrYWdlX2ZpbGVzKSB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gZmlsZUluZm8uZmlsZV9wYXRoLnJlcGxhY2UoL15cXC98ZGlzdFxcLy9nLCBcIlwiKVxuICAgICAgICBpZiAoIWZpbGVQYXRoKSBjb250aW51ZVxuXG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGVQYXRoKVxuICAgICAgICBmcy5ta2RpclN5bmMocGF0aC5kaXJuYW1lKGZ1bGxQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSlcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQga3lcbiAgICAgICAgICAgIC5wb3N0PHsgcGFja2FnZV9maWxlOiB7IGNvbnRlbnRfdGV4dDogc3RyaW5nIH0gfT4oXG4gICAgICAgICAgICAgIFwicGFja2FnZV9maWxlcy9nZXRcIixcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGpzb246IHtcbiAgICAgICAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogYCR7YXV0aG9yfS8ke3NuaXBwZXROYW1lfWAsXG4gICAgICAgICAgICAgICAgICBmaWxlX3BhdGg6IGZpbGVJbmZvLmZpbGVfcGF0aCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmpzb24oKVxuXG4gICAgICAgICAgbGV0IGZpbGVUZXh0ID0gZmlsZUNvbnRlbnQucGFja2FnZV9maWxlLmNvbnRlbnRfdGV4dFxuXG4gICAgICAgICAgLy8gRW5zdXJlIGFsbCAudHN4IGZpbGVzIGNvbnRhaW4gXCJpbXBvcnQgJ0B0c2NpcmN1aXQvY29yZSc7XCJcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aChcIi50c3hcIikgJiZcbiAgICAgICAgICAgICFmaWxlVGV4dC5pbmNsdWRlcyhcIkB0c2NpcmN1aXQvY29yZVwiKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZmlsZVRleHQgPSBgaW1wb3J0IFwiQHRzY2lyY3VpdC9jb3JlXCI7XFxuXFxuJHtmaWxlVGV4dH1gXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhmdWxsUGF0aCwgZmlsZVRleHQpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFNraXBwaW5nICR7ZmlsZVBhdGh9IGR1ZSB0byBlcnJvcjpgLFxuICAgICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcixcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgICAgcGF0aC5qb2luKGRpclBhdGgsIFwiLm5wbXJjXCIpLFxuICAgICAgICBcIkB0c2NpOnJlZ2lzdHJ5PWh0dHBzOi8vbnBtLnRzY2lyY3VpdC5jb21cIixcbiAgICAgIClcblxuICAgICAgZ2VuZXJhdGVUc0NvbmZpZyhkaXJQYXRoKVxuICAgICAgc2V0dXBUc2NpUHJvamVjdChkaXJQYXRoKVxuXG4gICAgICBjb25zb2xlLmxvZyhgU3VjY2Vzc2Z1bGx5IGNsb25lZCB0byAke2RpclBhdGh9L2ApXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYFJ1biBcImNkICR7cGF0aC5kaXJuYW1lKGRpclBhdGgpfSAmJiB0c2NpIGRldlwiIHRvIHN0YXJ0IGRldmVsb3BpbmcuYCxcbiAgICAgIClcbiAgICB9KVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgY3JlYXRlQ2lyY3VpdFdlYldvcmtlciB9IGZyb20gXCJAdHNjaXJjdWl0L2V2YWxcIlxuaW1wb3J0IHdlYldvcmtlckJ1bmRsZVVybCBmcm9tIFwiQHRzY2lyY3VpdC9ldmFsL2Jsb2ItdXJsXCJcbmltcG9ydCB7IGdldFZpcnR1YWxGaWxlU3lzdGVtRnJvbURpclBhdGggfSBmcm9tIFwibWFrZS12ZnNcIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0IHtcbiAgY29udmVydENpcmN1aXRKc29uVG9TY2hlbWF0aWNTdmcsXG4gIGNvbnZlcnRDaXJjdWl0SnNvblRvUGNiU3ZnLFxufSBmcm9tIFwiY2lyY3VpdC10by1zdmdcIlxuXG5jb25zdCBBTExPV0VEX0ZPUk1BVFMgPSBbXG4gIFwianNvblwiLFxuICBcImNpcmN1aXQtanNvblwiLFxuICBcInNjaGVtYXRpYy1zdmdcIixcbiAgXCJwY2Itc3ZnXCIsXG4gIFwiZ2VyYmVyc1wiLFxuICBcInJlYWRhYmxlLW5ldGxpc3RcIixcbiAgXCJnbHRmXCIsXG4gIFwic3BlY2N0cmEtZHNuXCIsXG5dIGFzIGNvbnN0XG5cbnR5cGUgRm9ybWF0ID0gKHR5cGVvZiBBTExPV0VEX0ZPUk1BVFMpW251bWJlcl1cblxuY29uc3QgT1VUUFVUX0VYVEVOU0lPTlMgPSB7XG4gIGpzb246IFwiLmNpcmN1aXQuanNvblwiLFxuICBcImNpcmN1aXQtanNvblwiOiBcIi5jaXJjdWl0Lmpzb25cIixcbiAgXCJzY2hlbWF0aWMtc3ZnXCI6IFwiLXNjaGVtYXRpYy5zdmdcIixcbiAgXCJwY2Itc3ZnXCI6IFwiLXBjYi5zdmdcIixcbiAgZ2VyYmVyczogXCItZ2VyYmVycy56aXBcIixcbiAgXCJyZWFkYWJsZS1uZXRsaXN0XCI6IFwiLXJlYWRhYmxlLm5ldGxpc3RcIixcbiAgZ2x0ZjogXCIuZ2x0ZlwiLFxuICBcInNwZWNjdHJhLWRzblwiOiBcIi5kc25cIixcbn1cblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyRXhwb3J0ID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKFwiZXhwb3J0XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiRXhwb3J0IHRzY2lyY3VpdCBjb2RlIHRvIHZhcmlvdXMgZm9ybWF0c1wiKVxuICAgIC5hcmd1bWVudChcIjxmaWxlPlwiLCBcIlBhdGggdG8gdGhlIHNuaXBwZXQgZmlsZVwiKVxuICAgIC5vcHRpb24oXCItZiwgLS1mb3JtYXQgPGZvcm1hdD5cIiwgXCJPdXRwdXQgZm9ybWF0XCIpXG4gICAgLm9wdGlvbihcIi1vLCAtLW91dHB1dCA8cGF0aD5cIiwgXCJPdXRwdXQgZmlsZSBwYXRoXCIpXG4gICAgLmFjdGlvbihhc3luYyAoZmlsZSwgb3B0aW9ucykgPT4ge1xuICAgICAgY29uc3QgeyBmb3JtYXQgPSBcImNpcmN1aXQtanNvblwiIH0gPSBvcHRpb25zXG4gICAgICBsZXQgeyBvdXRwdXQgfSA9IG9wdGlvbnNcbiAgICAgIGlmICghQUxMT1dFRF9GT1JNQVRTLmluY2x1ZGVzKGZvcm1hdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIGZvcm1hdDogJHtmb3JtYXR9XFxuU3VwcG9ydGVkIGZvcm1hdHM6ICR7QUxMT1dFRF9GT1JNQVRTLmpvaW4oXCIsXCIpfWAsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgaWYgKCFvdXRwdXQpIHtcbiAgICAgICAgb3V0cHV0ID0gcGF0aC5iYXNlbmFtZShmaWxlKS5yZXBsYWNlKC9cXC5bXi5dKyQvLCBcIlwiKVxuICAgICAgfVxuXG4gICAgICBjb25zdCB3b3JrZXIgPSBhd2FpdCBjcmVhdGVDaXJjdWl0V2ViV29ya2VyKHtcbiAgICAgICAgd2ViV29ya2VyVXJsOiB3ZWJXb3JrZXJCdW5kbGVVcmwsXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBwcm9qZWN0RGlyID0gcGF0aC5kaXJuYW1lKGZpbGUpXG5cbiAgICAgIGNvbnN0IHJlbGF0aXZlQ29tcG9uZW50UGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdERpciwgZmlsZSlcblxuICAgICAgYXdhaXQgd29ya2VyLmV4ZWN1dGVXaXRoRnNNYXAoe1xuICAgICAgICBlbnRyeXBvaW50OiBcImVudHJ5cG9pbnQudHN4XCIsXG4gICAgICAgIGZzTWFwOiB7XG4gICAgICAgICAgLi4uKChhd2FpdCBnZXRWaXJ0dWFsRmlsZVN5c3RlbUZyb21EaXJQYXRoKHtcbiAgICAgICAgICAgIGRpclBhdGg6IHByb2plY3REaXIsXG4gICAgICAgICAgICBjb250ZW50Rm9ybWF0OiBcInN0cmluZ1wiLFxuICAgICAgICAgIH0pKSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSxcbiAgICAgICAgICBcImVudHJ5cG9pbnQudHN4XCI6IGBcbmltcG9ydCBNeUNpcmN1aXQgZnJvbSBcIi4vJHtyZWxhdGl2ZUNvbXBvbmVudFBhdGh9XCJcblxuY2lyY3VpdC5hZGQoPE15Q2lyY3VpdCAvPilcbiAgICAgICAgYCxcbiAgICAgICAgfSxcbiAgICAgIH0pXG5cbiAgICAgIGF3YWl0IHdvcmtlci5yZW5kZXJVbnRpbFNldHRsZWQoKVxuXG4gICAgICBjb25zdCBjaXJjdWl0SnNvbiA9IGF3YWl0IHdvcmtlci5nZXRDaXJjdWl0SnNvbigpXG4gICAgICBjb25zdCBvdXRwdXRQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICBwcm9qZWN0RGlyLFxuICAgICAgICBgJHtvdXRwdXR9JHtPVVRQVVRfRVhURU5TSU9OU1tmb3JtYXQgYXMgRm9ybWF0XX1gLFxuICAgICAgKVxuXG4gICAgICBsZXQgb3V0cHV0Q29udGVudDogc3RyaW5nXG5cbiAgICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICAgIGNhc2UgXCJzY2hlbWF0aWMtc3ZnXCI6XG4gICAgICAgICAgb3V0cHV0Q29udGVudCA9IGNvbnZlcnRDaXJjdWl0SnNvblRvU2NoZW1hdGljU3ZnKGNpcmN1aXRKc29uKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgXCJwY2Itc3ZnXCI6XG4gICAgICAgICAgb3V0cHV0Q29udGVudCA9IGNvbnZlcnRDaXJjdWl0SnNvblRvUGNiU3ZnKGNpcmN1aXRKc29uKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgb3V0cHV0Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KGNpcmN1aXRKc29uKVxuICAgICAgfVxuXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKG91dHB1dFBhdGgsIG91dHB1dENvbnRlbnQpXG5cbiAgICAgIGNvbnNvbGUubG9nKGBFeHBvcnRlZCB0byAke291dHB1dFBhdGh9YClcblxuICAgICAgcHJvY2Vzcy5leGl0KDApXG4gICAgfSlcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IGNsaUNvbmZpZyB9IGZyb20gXCJsaWIvY2xpLWNvbmZpZ1wiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckF1dGhQcmludFRva2VuID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbS5jb21tYW5kc1xuICAgIC5maW5kKChjKSA9PiBjLm5hbWUoKSA9PT0gXCJhdXRoXCIpIVxuICAgIC5jb21tYW5kKFwicHJpbnQtdG9rZW5cIilcbiAgICAuZGVzY3JpcHRpb24oXCJQcmludHMgeW91ciBhdXRoIHRva2VuXCIpXG4gICAgLmFjdGlvbigoKSA9PiB7XG4gICAgICBjb25zdCB0b2tlbiA9IGNsaUNvbmZpZy5nZXQoXCJzZXNzaW9uVG9rZW5cIilcbiAgICAgIGlmICghdG9rZW4pIHJldHVybiBjb25zb2xlLmxvZyhcIllvdSBuZWVkIHRvIGxvZyBpbiB0byBhY2Nlc3MgdGhpcy5cIilcbiAgICAgIGNvbnNvbGUubG9nKFwiWW91ciBUb2tlbjpcXG5cIiwgdG9rZW4pXG4gICAgfSlcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IHNldFNlc3Npb25Ub2tlbiB9IGZyb20gXCJsaWIvY2xpLWNvbmZpZ1wiXG5cbmZ1bmN0aW9uIHZhbGlkYXRlSldUTGVuZ3RoKHRva2VuOiBzdHJpbmcpIHtcbiAgY29uc3QgcGFydHMgPSB0b2tlbi5zcGxpdChcIi5cIilcblxuICBpZiAocGFydHMubGVuZ3RoID09PSAzICYmIHBhcnRzLmV2ZXJ5KChwYXJ0KSA9PiBwYXJ0Lmxlbmd0aCA+IDApKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQXV0aFNldFRva2VuID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbS5jb21tYW5kc1xuICAgIC5maW5kKChjKSA9PiBjLm5hbWUoKSA9PT0gXCJhdXRoXCIpIVxuICAgIC5jb21tYW5kKFwic2V0LXRva2VuXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiRXhwbGljaXRseSBzZXQgeW91ciBhdXRoIHRva2VuXCIpXG4gICAgLmFyZ3VtZW50KFwiPHRva2VuPlwiLCBcIk5ldyB0b2tlbiB0byBtYW51YWxseSBjb25maWd1cmVcIilcbiAgICAuYWN0aW9uKCh0b2tlbikgPT4ge1xuICAgICAgaWYgKCF2YWxpZGF0ZUpXVExlbmd0aCh0b2tlbikpXG4gICAgICAgIHJldHVybiBjb25zb2xlLmxvZyhcIkludmFsaWQgdG9rZW4gcHJvdmlkZWRcIilcbiAgICAgIHNldFNlc3Npb25Ub2tlbih0b2tlbilcbiAgICAgIGNvbnNvbGUubG9nKFwiVG9rZW4gbWFudWFsbHkgdXBkYXRlZC5cIilcbiAgICB9KVxufVxuIiwgImltcG9ydCB7IHB1c2hTbmlwcGV0IH0gZnJvbSBcImxpYi9zaGFyZWQvcHVzaC1zbmlwcGV0XCJcbmltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJQdXNoID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKFwicHVzaFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIlNhdmUgc25pcHBldCBjb2RlIHRvIFJlZ2lzdHJ5IEFQSVwiKVxuICAgIC5hcmd1bWVudChcIltmaWxlXVwiLCBcIlBhdGggdG8gdGhlIHNuaXBwZXQgZmlsZVwiKVxuICAgIC5hY3Rpb24oYXN5bmMgKGZpbGVQYXRoPzogc3RyaW5nKSA9PiB7XG4gICAgICBhd2FpdCBwdXNoU25pcHBldCh7XG4gICAgICAgIGZpbGVQYXRoLFxuICAgICAgICBvbkV4aXQ6IChjb2RlKSA9PiBwcm9jZXNzLmV4aXQoY29kZSksXG4gICAgICAgIG9uRXJyb3I6IChtZXNzYWdlKSA9PiBjb25zb2xlLmVycm9yKG1lc3NhZ2UpLFxuICAgICAgICBvblN1Y2Nlc3M6IChtZXNzYWdlKSA9PiBjb25zb2xlLmxvZyhtZXNzYWdlKSxcbiAgICAgIH0pXG4gICAgfSlcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7OztBQUNBLFNBQVMsZUFBZTs7O0FDQXhCLFlBQVlBLFNBQVE7QUFDcEIsWUFBWUMsV0FBVTs7O0FDRnRCLE9BQU8sUUFBUTtBQUdSLElBQU0sdUJBQXVCLE1BQWM7QUFDaEQsUUFBTSxZQUFZLFFBQVEsSUFBSSx5QkFBeUI7QUFDdkQsTUFBSSxVQUFVLFdBQVcsTUFBTSxFQUFHLFFBQU87QUFDekMsTUFBSSxVQUFVLFdBQVcsTUFBTSxFQUFHLFFBQU87QUFDekMsTUFBSSxVQUFVLFdBQVcsS0FBSyxFQUFHLFFBQU87QUFFeEMsTUFBSSxHQUFHLFdBQVcsV0FBVyxFQUFHLFFBQU87QUFDdkMsTUFBSSxHQUFHLFdBQVcsZ0JBQWdCLEVBQUcsUUFBTztBQUM1QyxNQUFJLEdBQUcsV0FBVyxXQUFXLEVBQUcsUUFBTztBQUV2QyxTQUFPO0FBQ1Q7OztBQ2JBLE9BQU9DLFNBQVE7QUFDZixPQUFPLFVBQVU7QUFDakIsU0FBUyxnQkFBZ0I7QUFFbEIsU0FBUyxpQkFDZCxZQUFZLFFBQVEsSUFBSSxHQUN4QixlQUFlLENBQUMsZ0JBQWdCLGlCQUFpQixHQUNqRDtBQUNBLFFBQU0sY0FBYyxLQUFLLFFBQVEsU0FBUztBQUMxQyxNQUFJLENBQUNBLElBQUcsV0FBVyxXQUFXLEdBQUc7QUFDL0IsSUFBQUEsSUFBRyxVQUFVLGFBQWEsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUFBLEVBQy9DO0FBQ0EsUUFBTSxpQkFBaUIscUJBQXFCO0FBRTVDLFVBQVEsSUFBSSwyQkFBMkIsV0FBVyxLQUFLO0FBQ3ZELFVBQVEsTUFBTSxXQUFXO0FBRXpCLE1BQUksQ0FBQ0EsSUFBRyxXQUFXLGNBQWMsR0FB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LE9BQU87QUFFdEIsSUFBSSxRQUFRLEtBQUssV0FBVyxHQUFHO0FBQzdCLGFBQVcsU0FBUyxRQUFRLElBQUk7QUFDbEMsT0FBTztBQUNMLFVBQVEsTUFBTTtBQUNoQjsiLAogICJuYW1lcyI6IFsiZnMiLCAicGF0aCIsICJmcyIsICJwYXRoIiwgImZzIiwgInBhdGgiLCAicGF0aCIsICJwcm9ncmFtIiwgInBhdGgiLCAiZnMiLCAiZnMiLCAicGF0aCIsICJreSIsICJmcyIsICJwYXRoIiwgInJlc29sdmUiLCAicGF0aCIsICJmcyIsICJmcyIsICJwYXRoIiwgImZzIiwgInRzIiwgImZzIiwgInBhdGgiLCAia3kiLCAicGF0aCIsICJreSIsICJmcyIsICJwcm9ncmFtIiwgInBvcnQiLCAicmVzb2x2ZSIsICJzZXJ2ZXIiLCAicHJvZ3JhbSIsICJreSIsICJwcm9ncmFtIiwgInByb2dyYW0iLCAicHJvZ3JhbSIsICJwcm9ncmFtIiwgImZzIiwgInBhdGgiLCAicHJvZ3JhbSIsICJreSIsICJzZW12ZXIiLCAicGF0aCIsICJmcyIsICJwcm9ncmFtIiwgInByb2dyYW0iLCAicHJvZ3JhbSIsICJwcm9ncmFtIiwgInNlbXZlciJdCn0K
|