@tscircuit/cli 0.1.19 → 0.1.21
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/cli/auth/logout/register.ts +14 -3
- package/cli/dev/register.ts +4 -0
- package/dist/main.js +16 -5
- package/lib/cli-config/index.ts +5 -0
- package/package.json +1 -1
|
@@ -1,11 +1,22 @@
|
|
|
1
1
|
import type { Command } from "commander"
|
|
2
|
+
import { clearSession } from "lib/cli-config"
|
|
2
3
|
|
|
3
4
|
export const registerAuthLogout = (program: Command) => {
|
|
5
|
+
const logoutAction = () => {
|
|
6
|
+
clearSession()
|
|
7
|
+
console.log("You have been logged out!")
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
// Register the auth logout subcommand
|
|
4
11
|
program.commands
|
|
5
12
|
.find((c) => c.name() === "auth")!
|
|
6
13
|
.command("logout")
|
|
7
14
|
.description("Logout from registry")
|
|
8
|
-
.action(
|
|
9
|
-
|
|
10
|
-
|
|
15
|
+
.action(logoutAction)
|
|
16
|
+
|
|
17
|
+
// Register the top-level logout command as an alias
|
|
18
|
+
program
|
|
19
|
+
.command("logout")
|
|
20
|
+
.description("Logout from tscircuit registry")
|
|
21
|
+
.action(logoutAction)
|
|
11
22
|
}
|
package/cli/dev/register.ts
CHANGED
|
@@ -38,6 +38,10 @@ export const registerDev = (program: Command) => {
|
|
|
38
38
|
|
|
39
39
|
if (file) {
|
|
40
40
|
absolutePath = path.resolve(file)
|
|
41
|
+
if (!absolutePath.endsWith(".tsx")) {
|
|
42
|
+
console.error("Error: Only .tsx files are supported")
|
|
43
|
+
return
|
|
44
|
+
}
|
|
41
45
|
} else {
|
|
42
46
|
const entrypointPath = path.resolve("index.tsx")
|
|
43
47
|
if (fs.existsSync(entrypointPath)) {
|
package/dist/main.js
CHANGED
|
@@ -131,7 +131,7 @@ var package_default = {
|
|
|
131
131
|
name: "@tscircuit/cli",
|
|
132
132
|
main: "dist/main.js",
|
|
133
133
|
type: "module",
|
|
134
|
-
version: "0.1.
|
|
134
|
+
version: "0.1.20",
|
|
135
135
|
bin: {
|
|
136
136
|
tsci: "./dist/main.js"
|
|
137
137
|
},
|
|
@@ -537,6 +537,10 @@ var registerDev = (program2) => {
|
|
|
537
537
|
let absolutePath;
|
|
538
538
|
if (file) {
|
|
539
539
|
absolutePath = path6.resolve(file);
|
|
540
|
+
if (!absolutePath.endsWith(".tsx")) {
|
|
541
|
+
console.error("Error: Only .tsx files are supported");
|
|
542
|
+
return;
|
|
543
|
+
}
|
|
540
544
|
} else {
|
|
541
545
|
const entrypointPath = path6.resolve("index.tsx");
|
|
542
546
|
if (fs7.existsSync(entrypointPath)) {
|
|
@@ -577,6 +581,10 @@ var setSessionToken = (token) => {
|
|
|
577
581
|
const decoded = jwtDecode(token);
|
|
578
582
|
cliConfig.set("githubUsername", decoded.github_username);
|
|
579
583
|
};
|
|
584
|
+
var clearSession = () => {
|
|
585
|
+
cliConfig.delete("sessionToken");
|
|
586
|
+
cliConfig.delete("githubUsername");
|
|
587
|
+
};
|
|
580
588
|
var getRegistryApiUrl = () => {
|
|
581
589
|
return cliConfig.get("registryApiUrl") ?? "https://registry-api.tscircuit.com";
|
|
582
590
|
};
|
|
@@ -661,9 +669,12 @@ var registerAuthLogin = (program2) => {
|
|
|
661
669
|
|
|
662
670
|
// cli/auth/logout/register.ts
|
|
663
671
|
var registerAuthLogout = (program2) => {
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
672
|
+
const logoutAction = () => {
|
|
673
|
+
clearSession();
|
|
674
|
+
console.log("You have been logged out!");
|
|
675
|
+
};
|
|
676
|
+
program2.commands.find((c) => c.name() === "auth").command("logout").description("Logout from registry").action(logoutAction);
|
|
677
|
+
program2.command("logout").description("Logout from tscircuit registry").action(logoutAction);
|
|
667
678
|
};
|
|
668
679
|
|
|
669
680
|
// cli/auth/register.ts
|
|
@@ -868,4 +879,4 @@ if (process.argv.length === 2) {
|
|
|
868
879
|
} else {
|
|
869
880
|
program.parse();
|
|
870
881
|
}
|
|
871
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY2xpL21haW4udHMiLCAiLi4vY2xpL2luaXQvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2Rldi9yZWdpc3Rlci50cyIsICIuLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9pbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldC50cyIsICIuLi9jbGkvZGV2L0RldlNlcnZlci50cyIsICIuLi9saWIvc2VydmVyL2NyZWF0ZUh0dHBTZXJ2ZXIudHMiLCAiLi4vcGFja2FnZS5qc29uIiwgIi4uL2xpYi9zaXRlL2dldEluZGV4LnRzIiwgIi4uL2xpYi9zZXJ2ZXIvRXZlbnRzV2F0Y2hlci50cyIsICIuLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9GaWxlc3lzdGVtVHlwZXNIYW5kbGVyLnRzIiwgIi4uL2xpYi9kZXBlbmRlbmN5LWFuYWx5c2lzL2ZpbmRJbXBvcnRzSW5TbmlwcGV0LnRzIiwgIi4uL2xpYi9jbGktY29uZmlnL2luZGV4LnRzIiwgIi4uL2NsaS9hdXRoL2xvZ2luL3JlZ2lzdGVyLnRzIiwgIi4uL2xpYi9yZWdpc3RyeS1hcGkvZ2V0LWt5LnRzIiwgIi4uL2NsaS9hdXRoL2xvZ291dC9yZWdpc3Rlci50cyIsICIuLi9jbGkvYXV0aC9yZWdpc3Rlci50cyIsICIuLi9jbGkvY29uZmlnL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9jb25maWcvcHJpbnQvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2Nsb25lL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9leHBvcnQvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2F1dGgvcHJpbnQtdG9rZW4vcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2F1dGgvc2V0LXRva2VuL3JlZ2lzdGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIjIS91c3IvYmluL2VudiBub2RlXG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyByZWdpc3RlckluaXQgfSBmcm9tIFwiLi9pbml0L3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyRGV2IH0gZnJvbSBcIi4vZGV2L3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQXV0aExvZ2luIH0gZnJvbSBcIi4vYXV0aC9sb2dpbi9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhMb2dvdXQgfSBmcm9tIFwiLi9hdXRoL2xvZ291dC9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGggfSBmcm9tIFwiLi9hdXRoL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQ29uZmlnUHJpbnQgfSBmcm9tIFwiLi9jb25maWcvcHJpbnQvcmVnaXN0ZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJDbG9uZSB9IGZyb20gXCIuL2Nsb25lL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHBlcmZlY3RDbGkgfSBmcm9tIFwicGVyZmVjdC1jbGlcIlxuaW1wb3J0IHBrZyBmcm9tIFwiLi4vcGFja2FnZS5qc29uXCJcbmltcG9ydCBzZW12ZXIgZnJvbSBcInNlbXZlclwiXG5pbXBvcnQgeyByZWdpc3RlckV4cG9ydCB9IGZyb20gXCIuL2V4cG9ydC9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhQcmludFRva2VuIH0gZnJvbSBcIi4vYXV0aC9wcmludC10b2tlbi9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhTZXRUb2tlbiB9IGZyb20gXCIuL2F1dGgvc2V0LXRva2VuL3JlZ2lzdGVyXCJcblxuY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKClcblxucHJvZ3JhbVxuICAubmFtZShcInRzY2lcIilcbiAgLmRlc2NyaXB0aW9uKFwiQ0xJIGZvciBkZXZlbG9waW5nIHRzY2lyY3VpdCBzbmlwcGV0c1wiKVxuICAvLyBIQUNLOiBhdCBidWlsZCB0aW1lIHRoZSB2ZXJzaW9uIGlzIG9sZCwgd2UgbmVlZCB0b1xuICAvLyBmaXggdGhpcyBhdCBzb21lIHBvaW50Li4uXG4gIC52ZXJzaW9uKHNlbXZlci5pbmMocGtnLnZlcnNpb24sIFwicGF0Y2hcIikgPz8gcGtnLnZlcnNpb24pXG5cbnJlZ2lzdGVySW5pdChwcm9ncmFtKVxuXG5yZWdpc3RlckRldihwcm9ncmFtKVxucmVnaXN0ZXJDbG9uZShwcm9ncmFtKVxuXG5yZWdpc3RlckF1dGgocHJvZ3JhbSlcbnJlZ2lzdGVyQXV0aExvZ2luKHByb2dyYW0pXG5yZWdpc3RlckF1dGhMb2dvdXQocHJvZ3JhbSlcbnJlZ2lzdGVyQXV0aFByaW50VG9rZW4ocHJvZ3JhbSlcbnJlZ2lzdGVyQXV0aFNldFRva2VuKHByb2dyYW0pXG5cbnJlZ2lzdGVyQ29uZmlnKHByb2dyYW0pXG5yZWdpc3RlckNvbmZpZ1ByaW50KHByb2dyYW0pXG5cbnJlZ2lzdGVyRXhwb3J0KHByb2dyYW0pXG5cbmlmIChwcm9jZXNzLmFyZ3YubGVuZ3RoID09PSAyKSB7XG4gIHBlcmZlY3RDbGkocHJvZ3JhbSwgcHJvY2Vzcy5hcmd2KVxufSBlbHNlIHtcbiAgcHJvZ3JhbS5wYXJzZSgpXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJJbml0ID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKFwiaW5pdFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkluaXRpYWxpemUgYSBuZXcgVFNDaXJjdWl0IHByb2plY3QgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5XCIpXG4gICAgLmFjdGlvbigoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50RGlyID0gcHJvY2Vzcy5jd2QoKVxuXG4gICAgICBjb25zdCBpbmRleEZpbGVQYXRoID0gcGF0aC5qb2luKGN1cnJlbnREaXIsIFwiaW5kZXgudHN4XCIpXG4gICAgICBjb25zdCBucG1yY0ZpbGVQYXRoID0gcGF0aC5qb2luKGN1cnJlbnREaXIsIFwiLm5wbXJjXCIpXG5cbiAgICAgIGNvbnN0IGluZGV4Q29udGVudCA9IGBcbmV4cG9ydCBkZWZhdWx0ICgpID0+IChcbiAgPGJvYXJkIHdpZHRoPVwiMTBtbVwiIGhlaWdodD1cIjEwbW1cIj5cbiAgICA8cmVzaXN0b3JcbiAgICAgIHJlc2lzdGFuY2U9XCIxa1wiXG4gICAgICBmb290cHJpbnQ9XCIwNDAyXCJcbiAgICAgIG5hbWU9XCJSMVwiXG4gICAgICBzY2hYPXszfVxuICAgICAgcGNiWD17M31cbiAgICAvPlxuICAgIDxjYXBhY2l0b3JcbiAgICAgIGNhcGFjaXRhbmNlPVwiMTAwMHBGXCJcbiAgICAgIGZvb3RwcmludD1cIjA0MDJcIlxuICAgICAgbmFtZT1cIkMxXCJcbiAgICAgIHNjaFg9ey0zfVxuICAgICAgcGNiWD17LTN9XG4gICAgLz5cbiAgICA8dHJhY2UgZnJvbT1cIi5SMSA+IC5waW4xXCIgdG89XCIuQzEgPiAucGluMVwiIC8+XG4gIDwvYm9hcmQ+XG4pO1xuYFxuXG4gICAgICBjb25zdCBucG1yY0NvbnRlbnQgPSBgXG5AdHNjaTpyZWdpc3RyeT1odHRwczovL25wbS50c2NpcmN1aXQuY29tXG5gXG5cbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhpbmRleEZpbGVQYXRoKSkge1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGluZGV4RmlsZVBhdGgsIGluZGV4Q29udGVudC50cmltU3RhcnQoKSlcbiAgICAgICAgY29uc29sZS5sb2coYENyZWF0ZWQ6ICR7aW5kZXhGaWxlUGF0aH1gKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coYFNraXBwZWQ6ICR7aW5kZXhGaWxlUGF0aH0gYWxyZWFkeSBleGlzdHNgKVxuICAgICAgfVxuXG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMobnBtcmNGaWxlUGF0aCkpIHtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhucG1yY0ZpbGVQYXRoLCBucG1yY0NvbnRlbnQudHJpbVN0YXJ0KCkpXG4gICAgICAgIGNvbnNvbGUubG9nKGBDcmVhdGVkOiAke25wbXJjRmlsZVBhdGh9YClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBTa2lwcGVkOiAke25wbXJjRmlsZVBhdGh9IGFscmVhZHkgZXhpc3RzYClcbiAgICAgIH1cblxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBJbml0aWFsaXphdGlvbiBjb21wbGV0ZS4gUnVuIFwidHNjaSBkZXZcIiB0byBzdGFydCBkZXZlbG9waW5nLmAsXG4gICAgICApXG4gICAgfSlcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgKiBhcyBjaG9raWRhciBmcm9tIFwiY2hva2lkYXJcIlxuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0IHsgY3JlYXRlSHR0cFNlcnZlciB9IGZyb20gXCJsaWIvc2VydmVyL2NyZWF0ZUh0dHBTZXJ2ZXJcIlxuaW1wb3J0IHsgZ2V0TG9jYWxGaWxlRGVwZW5kZW5jaWVzIH0gZnJvbSBcImxpYi9kZXBlbmRlbmN5LWFuYWx5c2lzL2dldExvY2FsRmlsZURlcGVuZGVuY2llc1wiXG5pbXBvcnQgeyBpbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldCB9IGZyb20gXCIuLi8uLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9pbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldFwiXG5pbXBvcnQgeyBFdmVudHNXYXRjaGVyIH0gZnJvbSBcIi4uLy4uL2xpYi9zZXJ2ZXIvRXZlbnRzV2F0Y2hlclwiXG5pbXBvcnQgeyBEZXZTZXJ2ZXIgfSBmcm9tIFwiLi9EZXZTZXJ2ZXJcIlxuaW1wb3J0ICogYXMgbmV0IGZyb20gXCJub2RlOm5ldFwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckRldiA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImRldlwiKVxuICAgIC5kZXNjcmlwdGlvbihcIlN0YXJ0IGRldmVsb3BtZW50IHNlcnZlciBmb3IgYSBzbmlwcGV0XCIpXG4gICAgLmFyZ3VtZW50KFwiW2ZpbGVdXCIsIFwiUGF0aCB0byB0aGUgc25pcHBldCBmaWxlXCIpXG4gICAgLm9wdGlvbihcIi1wLCAtLXBvcnQgPG51bWJlcj5cIiwgXCJQb3J0IHRvIHJ1biBzZXJ2ZXIgb25cIiwgXCIzMDIwXCIpXG4gICAgLmFjdGlvbihhc3luYyAoZmlsZTogc3RyaW5nLCBvcHRpb25zOiB7IHBvcnQ6IHN0cmluZyB9KSA9PiB7XG4gICAgICBsZXQgcG9ydCA9IHBhcnNlSW50KG9wdGlvbnMucG9ydClcblxuICAgICAgY29uc3QgaXNQb3J0QXZhaWxhYmxlID0gKHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBjb25zdCBzZXJ2ZXIgPSBuZXQuY3JlYXRlU2VydmVyKClcbiAgICAgICAgICBzZXJ2ZXIub25jZShcImVycm9yXCIsICgpID0+IHJlc29sdmUoZmFsc2UpKVxuICAgICAgICAgIHNlcnZlci5vbmNlKFwibGlzdGVuaW5nXCIsICgpID0+IHtcbiAgICAgICAgICAgIHNlcnZlci5jbG9zZSgoKSA9PiByZXNvbHZlKHRydWUpKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgc2VydmVyLmxpc3Rlbihwb3J0KVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICB3aGlsZSAoIShhd2FpdCBpc1BvcnRBdmFpbGFibGUocG9ydCkpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBQb3J0ICR7cG9ydH0gaXMgaW4gdXNlLCB0cnlpbmcgcG9ydCAke3BvcnQgKyAxfS4uLmApXG4gICAgICAgIHBvcnQgKz0gMVxuICAgICAgfVxuXG4gICAgICBsZXQgYWJzb2x1dGVQYXRoOiBzdHJpbmdcblxuICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGZpbGUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlbnRyeXBvaW50UGF0aCA9IHBhdGgucmVzb2x2ZShcImluZGV4LnRzeFwiKVxuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhlbnRyeXBvaW50UGF0aCkpIHtcbiAgICAgICAgICBhYnNvbHV0ZVBhdGggPSBlbnRyeXBvaW50UGF0aFxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiTm8gZmlsZSBwcm92aWRlZC4gVXNpbmcgJ2luZGV4LnRzeCcgYXMgdGhlIGVudHJ5cG9pbnQuXCIpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBcIk5vIGVudHJ5cG9pbnQgZm91bmQuIFJ1biAndHNjaSBpbml0JyB0byBib290c3RyYXAgYSBiYXNpYyBwcm9qZWN0LlwiLFxuICAgICAgICAgIClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWxlRGlyID0gcGF0aC5kaXJuYW1lKGFic29sdXRlUGF0aClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc29sZS5sb2coXCJJbnN0YWxsaW5nIHR5cGVzIGZvciBpbXBvcnRlZCBzbmlwcGV0cy4uLlwiKVxuICAgICAgICBhd2FpdCBpbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldChhYnNvbHV0ZVBhdGgpXG4gICAgICAgIGNvbnNvbGUubG9nKFwiVHlwZXMgaW5zdGFsbGVkIHN1Y2Nlc3NmdWxseVwiKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiRmFpbGVkIHRvIGluc3RhbGwgdHlwZXM6XCIsIGVycm9yKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzZXJ2ZXIgPSBuZXcgRGV2U2VydmVyKHtcbiAgICAgICAgcG9ydCxcbiAgICAgICAgY29tcG9uZW50RmlsZVBhdGg6IGFic29sdXRlUGF0aCxcbiAgICAgIH0pXG5cbiAgICAgIGF3YWl0IHNlcnZlci5zdGFydCgpXG4gICAgICBhd2FpdCBzZXJ2ZXIuYWRkRW50cnlwb2ludCgpXG4gICAgfSlcbn1cbiIsICJpbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0ICogYXMgdHMgZnJvbSBcInR5cGVzY3JpcHRcIlxuXG5pbnRlcmZhY2UgU25pcHBldEFwaVJlc3BvbnNlIHtcbiAgc25pcHBldDoge1xuICAgIGR0czogc3RyaW5nXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxOb2RlTW9kdWxlVHlwZXNGb3JTbmlwcGV0KHNuaXBwZXRQYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzbmlwcGV0UGF0aCwgXCJ1dGYtOFwiKVxuICBjb25zdCBzb3VyY2VGaWxlID0gdHMuY3JlYXRlU291cmNlRmlsZShcbiAgICBzbmlwcGV0UGF0aCxcbiAgICBjb250ZW50LFxuICAgIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsXG4gICAgdHJ1ZSxcbiAgKVxuXG4gIGNvbnN0IGltcG9ydHM6IHN0cmluZ1tdID0gW11cblxuICBmdW5jdGlvbiB2aXNpdChub2RlOiB0cy5Ob2RlKSB7XG4gICAgaWYgKHRzLmlzSW1wb3J0RGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgIGNvbnN0IG1vZHVsZVNwZWNpZmllciA9IG5vZGUubW9kdWxlU3BlY2lmaWVyXG4gICAgICBpZiAobW9kdWxlU3BlY2lmaWVyICYmIHRzLmlzU3RyaW5nTGl0ZXJhbChtb2R1bGVTcGVjaWZpZXIpKSB7XG4gICAgICAgIGNvbnN0IGltcG9ydFBhdGggPSBtb2R1bGVTcGVjaWZpZXIudGV4dFxuICAgICAgICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiQHRzY2kvXCIpKSB7XG4gICAgICAgICAgaW1wb3J0cy5wdXNoKGltcG9ydFBhdGgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdHMuZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0KVxuICB9XG5cbiAgdmlzaXQoc291cmNlRmlsZSlcblxuICBsZXQgcHJvamVjdFJvb3QgPSBwYXRoLmRpcm5hbWUoc25pcHBldFBhdGgpXG4gIHdoaWxlIChwcm9qZWN0Um9vdCAhPT0gcGF0aC5wYXJzZShwcm9qZWN0Um9vdCkucm9vdCkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0Um9vdCwgXCJwYWNrYWdlLmpzb25cIikpKSB7XG4gICAgICBicmVha1xuICAgIH1cbiAgICBwcm9qZWN0Um9vdCA9IHBhdGguZGlybmFtZShwcm9qZWN0Um9vdClcbiAgfVxuXG4gIGZvciAoY29uc3QgaW1wb3J0UGF0aCBvZiBpbXBvcnRzKSB7XG4gICAgY29uc3QgW293bmVyLCBuYW1lXSA9IGltcG9ydFBhdGgucmVwbGFjZShcIkB0c2NpL1wiLCBcIlwiKS5zcGxpdChcIi5cIilcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgYGh0dHBzOi8vcmVnaXN0cnktYXBpLnRzY2lyY3VpdC5jb20vc25pcHBldHMvZ2V0P293bmVyX25hbWU9JHtvd25lcn0mdW5zY29wZWRfbmFtZT0ke25hbWV9YCxcbiAgICAgIClcblxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBmZXRjaCB0eXBlcyBmb3IgJHtpbXBvcnRQYXRofWApXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGE6IFNuaXBwZXRBcGlSZXNwb25zZSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuXG4gICAgICBpZiAoZGF0YS5zbmlwcGV0LmR0cykge1xuICAgICAgICBjb25zdCBwYWNrYWdlRGlyID0gcGF0aC5qb2luKFxuICAgICAgICAgIHByb2plY3RSb290LFxuICAgICAgICAgIFwibm9kZV9tb2R1bGVzXCIsXG4gICAgICAgICAgXCJAdHNjaVwiLFxuICAgICAgICAgIGAke293bmVyfS4ke25hbWV9YCxcbiAgICAgICAgKVxuICAgICAgICBmcy5ta2RpclN5bmMocGFja2FnZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSlcblxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihwYWNrYWdlRGlyLCBcImluZGV4LmQudHNcIiksIGRhdGEuc25pcHBldC5kdHMpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihgRXJyb3IgZmV0Y2hpbmcgdHlwZXMgZm9yICR7aW1wb3J0UGF0aH06YCwgZXJyb3IpXG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IGt5IGZyb20gXCJreVwiXG5pbXBvcnQgdHlwZSB7IEZpbGVTZXJ2ZXJSb3V0ZXMgfSBmcm9tIFwibGliL2ZpbGUtc2VydmVyL0ZpbGVTZXJ2ZXJSb3V0ZXNcIlxuaW1wb3J0IHsgY3JlYXRlSHR0cFNlcnZlciB9IGZyb20gXCJsaWIvc2VydmVyL2NyZWF0ZUh0dHBTZXJ2ZXJcIlxuaW1wb3J0IHsgRXZlbnRzV2F0Y2hlciB9IGZyb20gXCJsaWIvc2VydmVyL0V2ZW50c1dhdGNoZXJcIlxuaW1wb3J0IHR5cGUgaHR0cCBmcm9tIFwibm9kZTpodHRwXCJcbmltcG9ydCB0eXBlIHsgVHlwZWRLeUluc3RhbmNlIH0gZnJvbSBcInR5cGVkLWt5XCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB0eXBlIHsgRmlsZVVwZGF0ZWRFdmVudCB9IGZyb20gXCJsaWIvZmlsZS1zZXJ2ZXIvRmlsZVNlcnZlckV2ZW50XCJcbmltcG9ydCAqIGFzIGNob2tpZGFyIGZyb20gXCJjaG9raWRhclwiXG5pbXBvcnQgeyBGaWxlc3lzdGVtVHlwZXNIYW5kbGVyIH0gZnJvbSBcImxpYi9kZXBlbmRlbmN5LWFuYWx5c2lzL0ZpbGVzeXN0ZW1UeXBlc0hhbmRsZXJcIlxuXG5leHBvcnQgY2xhc3MgRGV2U2VydmVyIHtcbiAgcG9ydDogbnVtYmVyXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byBhIGNvbXBvbmVudCB0aGF0IGV4cG9ydHMgYSA8Ym9hcmQgLz4gb3IgPGdyb3VwIC8+IGNvbXBvbmVudFxuICAgKi9cbiAgY29tcG9uZW50RmlsZVBhdGg6IHN0cmluZ1xuXG4gIHByb2plY3REaXI6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBUaGUgSFRUUCBzZXJ2ZXIgdGhhdCBob3N0cyB0aGUgZmlsZSBzZXJ2ZXIgYW5kIGV2ZW50IGJ1cy4gWW91IGNhbiB1c2VcbiAgICogZnNLeSB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBmaWxlIHNlcnZlci9ldmVudCBidXNcbiAgICovXG4gIGh0dHBTZXJ2ZXI/OiBodHRwLlNlcnZlclxuICAvKipcbiAgICogV2F0Y2hlcyBmb3IgZXZlbnRzIG9uIHRoZSBldmVudCBidXMgYnkgcG9sbGluZyBgYXBpL2V2ZW50cy9saXN0YFxuICAgKi9cbiAgZXZlbnRzV2F0Y2hlcj86IEV2ZW50c1dhdGNoZXJcbiAgLyoqXG4gICAqIEEga3kgaW5zdGFuY2UgdGhhdCBjYW4gYmUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBmaWxlIHNlcnZlciBhbmRcbiAgICogZXZlbnQgYnVzXG4gICAqL1xuICBmc0t5OiBUeXBlZEt5SW5zdGFuY2U8a2V5b2YgRmlsZVNlcnZlclJvdXRlcywgRmlsZVNlcnZlclJvdXRlcz5cbiAgLyoqXG4gICAqIEEgY2hva2lkYXIgaW5zdGFuY2UgdGhhdCB3YXRjaGVzIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSBmb3IgZmlsZSBjaGFuZ2VzXG4gICAqL1xuICBmaWxlc3lzdGVtV2F0Y2hlcj86IGNob2tpZGFyLkZTV2F0Y2hlclxuXG4gIHByaXZhdGUgdHlwZXNIYW5kbGVyPzogRmlsZXN5c3RlbVR5cGVzSGFuZGxlclxuXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBwb3J0LFxuICAgIGNvbXBvbmVudEZpbGVQYXRoLFxuICB9OiB7XG4gICAgcG9ydDogbnVtYmVyXG4gICAgY29tcG9uZW50RmlsZVBhdGg6IHN0cmluZ1xuICB9KSB7XG4gICAgdGhpcy5wb3J0ID0gcG9ydFxuICAgIHRoaXMuY29tcG9uZW50RmlsZVBhdGggPSBjb21wb25lbnRGaWxlUGF0aFxuICAgIHRoaXMucHJvamVjdERpciA9IHBhdGguZGlybmFtZShjb21wb25lbnRGaWxlUGF0aClcbiAgICB0aGlzLmZzS3kgPSBreS5jcmVhdGUoe1xuICAgICAgcHJlZml4VXJsOiBgaHR0cDovL2xvY2FsaG9zdDoke3BvcnR9YCxcbiAgICB9KSBhcyBhbnlcbiAgICB0aGlzLnR5cGVzSGFuZGxlciA9IG5ldyBGaWxlc3lzdGVtVHlwZXNIYW5kbGVyKHRoaXMucHJvamVjdERpcilcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0KCkge1xuICAgIGNvbnN0IHsgc2VydmVyIH0gPSBhd2FpdCBjcmVhdGVIdHRwU2VydmVyKHRoaXMucG9ydClcbiAgICB0aGlzLmh0dHBTZXJ2ZXIgPSBzZXJ2ZXJcblxuICAgIHRoaXMuZXZlbnRzV2F0Y2hlciA9IG5ldyBFdmVudHNXYXRjaGVyKGBodHRwOi8vbG9jYWxob3N0OiR7dGhpcy5wb3J0fWApXG4gICAgdGhpcy5ldmVudHNXYXRjaGVyLnN0YXJ0KClcblxuICAgIHRoaXMuZXZlbnRzV2F0Y2hlci5vbihcbiAgICAgIFwiRklMRV9VUERBVEVEXCIsXG4gICAgICB0aGlzLmhhbmRsZUZpbGVVcGRhdGVkRXZlbnRGcm9tU2VydmVyLmJpbmQodGhpcyksXG4gICAgKVxuXG4gICAgdGhpcy5maWxlc3lzdGVtV2F0Y2hlciA9IGNob2tpZGFyLndhdGNoKHRoaXMucHJvamVjdERpciwge1xuICAgICAgcGVyc2lzdGVudDogdHJ1ZSxcbiAgICAgIGlnbm9yZUluaXRpYWw6IHRydWUsXG4gICAgfSlcblxuICAgIHRoaXMuZmlsZXN5c3RlbVdhdGNoZXIub24oXCJjaGFuZ2VcIiwgKGZpbGVQYXRoKSA9PlxuICAgICAgdGhpcy5oYW5kbGVGaWxlQ2hhbmdlZE9uRmlsZXN5c3RlbShmaWxlUGF0aCksXG4gICAgKVxuICAgIHRoaXMuZmlsZXN5c3RlbVdhdGNoZXIub24oXCJhZGRcIiwgKGZpbGVQYXRoKSA9PlxuICAgICAgdGhpcy5oYW5kbGVGaWxlQ2hhbmdlZE9uRmlsZXN5c3RlbShmaWxlUGF0aCksXG4gICAgKVxuXG4gICAgdGhpcy51cHNlcnRJbml0aWFsRmlsZXMoKVxuXG4gICAgdGhpcy50eXBlc0hhbmRsZXI/LmhhbmRsZUluaXRpYWxUeXBlRGVwZW5kZW5jaWVzKHRoaXMuY29tcG9uZW50RmlsZVBhdGgpXG4gIH1cblxuICBhc3luYyBhZGRFbnRyeXBvaW50KCkge1xuICAgIGNvbnN0IHJlbGF0aXZlQ29tcG9uZW50RmlsZVBhdGggPSBwYXRoLnJlbGF0aXZlKFxuICAgICAgdGhpcy5wcm9qZWN0RGlyLFxuICAgICAgdGhpcy5jb21wb25lbnRGaWxlUGF0aCxcbiAgICApXG4gICAgYXdhaXQgdGhpcy5mc0t5LnBvc3QoXCJhcGkvZmlsZXMvdXBzZXJ0XCIsIHtcbiAgICAgIGpzb246IHtcbiAgICAgICAgZmlsZV9wYXRoOiBcImVudHJ5cG9pbnQudHN4XCIsXG4gICAgICAgIHRleHRfY29udGVudDogYFxuaW1wb3J0IE15Q2lyY3VpdCBmcm9tIFwiLi8ke3JlbGF0aXZlQ29tcG9uZW50RmlsZVBhdGh9XCJcblxuY2lyY3VpdC5hZGQoPE15Q2lyY3VpdCAvPilcbmAsXG4gICAgICB9LFxuICAgIH0pXG4gIH1cblxuICBhc3luYyBoYW5kbGVGaWxlVXBkYXRlZEV2ZW50RnJvbVNlcnZlcihldjogRmlsZVVwZGF0ZWRFdmVudCkge1xuICAgIGlmIChldi5pbml0aWF0b3IgPT09IFwiZmlsZXN5c3RlbV9jaGFuZ2VcIikgcmV0dXJuXG5cbiAgICBpZiAoZXYuZmlsZV9wYXRoID09PSBcIm1hbnVhbC1lZGl0cy5qc29uXCIpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiTWFudWFsIGVkaXRzIHVwZGF0ZWQsIHVwZGF0aW5nIG9uIGZpbGVzeXN0ZW0uLi5cIilcbiAgICAgIGNvbnN0IHsgZmlsZSB9ID0gYXdhaXQgdGhpcy5mc0t5XG4gICAgICAgIC5nZXQoXCJhcGkvZmlsZXMvZ2V0XCIsIHtcbiAgICAgICAgICBzZWFyY2hQYXJhbXM6IHsgZmlsZV9wYXRoOiBldi5maWxlX3BhdGggfSxcbiAgICAgICAgfSlcbiAgICAgICAgLmpzb24oKVxuICAgICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgICAgcGF0aC5qb2luKHRoaXMucHJvamVjdERpciwgXCJtYW51YWwtZWRpdHMuanNvblwiKSxcbiAgICAgICAgZmlsZS50ZXh0X2NvbnRlbnQsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaGFuZGxlRmlsZUNoYW5nZWRPbkZpbGVzeXN0ZW0oYWJzb2x1dGVGaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVsYXRpdmVGaWxlUGF0aCA9IHBhdGgucmVsYXRpdmUodGhpcy5wcm9qZWN0RGlyLCBhYnNvbHV0ZUZpbGVQYXRoKVxuICAgIC8vIFdlJ3ZlIHRlbXBvcmFyaWx5IGRpc2FibGVkIHVwc2VydGluZyBtYW51YWwgZWRpdHMgZnJvbSBmaWxlc3lzdGVtIGNoYW5nZXNcbiAgICAvLyBiZWNhdXNlIGl0IGNhbiBiZSBlZGl0ZWQgYnkgdGhlIGJyb3dzZXJcbiAgICBpZiAocmVsYXRpdmVGaWxlUGF0aC5pbmNsdWRlcyhcIm1hbnVhbC1lZGl0cy5qc29uXCIpKSByZXR1cm5cblxuICAgIGF3YWl0IHRoaXMudHlwZXNIYW5kbGVyPy5oYW5kbGVGaWxlVHlwZURlcGVuZGVuY2llcyhhYnNvbHV0ZUZpbGVQYXRoKVxuXG4gICAgY29uc29sZS5sb2coYCR7cmVsYXRpdmVGaWxlUGF0aH0gc2F2ZWQuIEFwcGx5aW5nIGNoYW5nZXMuLi5gKVxuICAgIGF3YWl0IHRoaXMuZnNLeVxuICAgICAgLnBvc3QoXCJhcGkvZmlsZXMvdXBzZXJ0XCIsIHtcbiAgICAgICAganNvbjoge1xuICAgICAgICAgIGZpbGVfcGF0aDogcmVsYXRpdmVGaWxlUGF0aCxcbiAgICAgICAgICB0ZXh0X2NvbnRlbnQ6IGZzLnJlYWRGaWxlU3luYyhhYnNvbHV0ZUZpbGVQYXRoLCBcInV0Zi04XCIpLFxuICAgICAgICAgIGluaXRpYXRvcjogXCJmaWxlc3lzdGVtX2NoYW5nZVwiLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5qc29uKClcbiAgfVxuXG4gIGFzeW5jIHVwc2VydEluaXRpYWxGaWxlcygpIHtcbiAgICAvLyBTY2FuIHByb2plY3QgZGlyZWN0b3J5IGZvciBhbGwgZmlsZXMgYW5kIHVwc2VydCB0aGVtXG4gICAgY29uc3QgZmlsZU5hbWVzID0gZnMucmVhZGRpclN5bmModGhpcy5wcm9qZWN0RGlyKVxuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVzKSB7XG4gICAgICBpZiAoZnMuc3RhdFN5bmMocGF0aC5qb2luKHRoaXMucHJvamVjdERpciwgZmlsZU5hbWUpKS5pc0RpcmVjdG9yeSgpKVxuICAgICAgICBjb250aW51ZVxuICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgIHBhdGguam9pbih0aGlzLnByb2plY3REaXIsIGZpbGVOYW1lKSxcbiAgICAgICAgXCJ1dGYtOFwiLFxuICAgICAgKVxuICAgICAgYXdhaXQgdGhpcy5mc0t5LnBvc3QoXCJhcGkvZmlsZXMvdXBzZXJ0XCIsIHtcbiAgICAgICAganNvbjoge1xuICAgICAgICAgIGZpbGVfcGF0aDogZmlsZU5hbWUsXG4gICAgICAgICAgdGV4dF9jb250ZW50OiBmaWxlQ29udGVudCxcbiAgICAgICAgICBpbml0aWF0b3I6IFwiZmlsZXN5c3RlbV9jaGFuZ2VcIixcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RvcCgpIHtcbiAgICB0aGlzLmh0dHBTZXJ2ZXI/LmNsb3NlKClcbiAgICB0aGlzLmV2ZW50c1dhdGNoZXI/LnN0b3AoKVxuICB9XG59XG4iLCAiaW1wb3J0ICogYXMgaHR0cCBmcm9tIFwibm9kZTpodHRwXCJcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBnZXROb2RlSGFuZGxlciB9IGZyb20gXCJ3aW50ZXJzcGVjL2FkYXB0ZXJzL25vZGVcIlxuaW1wb3J0IHBrZyBmcm9tIFwiLi4vLi4vcGFja2FnZS5qc29uXCJcblxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHdpbnRlcnNwZWNCdW5kbGUgZnJvbSBcIkB0c2NpcmN1aXQvZmlsZS1zZXJ2ZXIvZGlzdC9idW5kbGUuanNcIlxuaW1wb3J0IHsgZ2V0SW5kZXggfSBmcm9tIFwiLi4vc2l0ZS9nZXRJbmRleFwiXG5cbmV4cG9ydCBjb25zdCBjcmVhdGVIdHRwU2VydmVyID0gYXN5bmMgKHBvcnQgPSAzMDIwKSA9PiB7XG4gIGNvbnN0IGZpbGVTZXJ2ZXJIYW5kbGVyID0gZ2V0Tm9kZUhhbmRsZXIod2ludGVyc3BlY0J1bmRsZSBhcyBhbnksIHt9KVxuXG4gIGNvbnN0IHNlcnZlciA9IGh0dHAuY3JlYXRlU2VydmVyKGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxLnVybCEsIGBodHRwOi8vJHtyZXEuaGVhZGVycy5ob3N0fWApXG5cbiAgICBpZiAodXJsLnBhdGhuYW1lID09PSBcIi9zdGFuZGFsb25lLm1pbi5qc1wiKSB7XG4gICAgICBjb25zdCBzdGFuZGFsb25lRmlsZVBhdGggPVxuICAgICAgICBwcm9jZXNzLmVudi5SVU5GUkFNRV9TVEFOREFMT05FX0ZJTEVfUEFUSCB8fFxuICAgICAgICBwYXRoLnJlc29sdmUoXG4gICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICBcIm5vZGVfbW9kdWxlc1wiLFxuICAgICAgICAgIFwiQHRzY2lyY3VpdC9ydW5mcmFtZS9kaXN0L3N0YW5kYWxvbmUubWluLmpzXCIsXG4gICAgICAgIClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzdGFuZGFsb25lRmlsZVBhdGgsIFwidXRmOFwiKVxuICAgICAgICByZXMud3JpdGVIZWFkKDIwMCwge1xuICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vamF2YXNjcmlwdDsgY2hhcnNldD11dGYtOFwiLFxuICAgICAgICB9KVxuICAgICAgICByZXMuZW5kKGNvbnRlbnQpXG4gICAgICAgIHJldHVyblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHNlcnZpbmcgc3RhbmRhbG9uZS5taW4uanM6XCIsIGVycm9yKVxuICAgICAgfVxuXG4gICAgICByZXMud3JpdGVIZWFkKDMwMiwge1xuICAgICAgICBMb2NhdGlvbjogYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHRzY2lyY3VpdC9ydW5mcmFtZUAke3BrZy5kZXBlbmRlbmNpZXNbXCJAdHNjaXJjdWl0L3J1bmZyYW1lXCJdLnJlcGxhY2UoL15bXjAtOV0rLywgXCJcIil9L2Rpc3Qvc3RhbmRhbG9uZS5taW4uanNgLFxuICAgICAgfSlcbiAgICAgIHJlcy5lbmQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHVybC5wYXRobmFtZSA9PT0gXCIvXCIpIHtcbiAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCBnZXRJbmRleCgpXG4gICAgICByZXMud3JpdGVIZWFkKDIwMCwgeyBcIkNvbnRlbnQtVHlwZVwiOiBcInRleHQvaHRtbFwiIH0pXG4gICAgICByZXMuZW5kKGh0bWwpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodXJsLnBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvYXBpL1wiKSkge1xuICAgICAgcmVxLnVybCA9IHJlcS51cmwhLnJlcGxhY2UoXCIvYXBpL1wiLCBcIi9cIilcbiAgICAgIGZpbGVTZXJ2ZXJIYW5kbGVyKHJlcSwgcmVzKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgcmVzLndyaXRlSGVhZCg0MDQpXG4gICAgcmVzLmVuZChcIk5vdCBmb3VuZFwiKVxuICB9KVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZTx7IHNlcnZlcjogaHR0cC5TZXJ2ZXIgfT4oKHJlc29sdmUpID0+IHtcbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsICgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGBTZXJ2ZXIgcnVubmluZyBhdCBodHRwOi8vbG9jYWxob3N0OiR7cG9ydH1gKVxuICAgICAgcmVzb2x2ZSh7IHNlcnZlciB9KVxuICAgIH0pXG4gIH0pXG59XG4iLCAie1xuICBcIm5hbWVcIjogXCJAdHNjaXJjdWl0L2NsaVwiLFxuICBcIm1haW5cIjogXCJkaXN0L21haW4uanNcIixcbiAgXCJ0eXBlXCI6IFwibW9kdWxlXCIsXG4gIFwidmVyc2lvblwiOiBcIjAuMS4xOFwiLFxuICBcImJpblwiOiB7XG4gICAgXCJ0c2NpXCI6IFwiLi9kaXN0L21haW4uanNcIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwic3RhcnRcIjogXCJidW4gcnVuIGRldlwiLFxuICAgIFwiZGV2XCI6IFwiYnVuIC0taG90IC4vY2xpL21haW4udHMgZGV2IC4vZXhhbXBsZS1kaXIvc25pcHBldDEtYmFzaWMudHN4XCIsXG4gICAgXCJidWlsZFwiOiBcInRzdXAtbm9kZSBjbGkvbWFpbi50cyAtLWZvcm1hdCBlc20gLS1zb3VyY2VtYXAgaW5saW5lXCIsXG4gICAgXCJmb3JtYXRcIjogXCJiaW9tZSBmb3JtYXQgLS13cml0ZSAuXCIsXG4gICAgXCJmb3JtYXQ6Y2hlY2tcIjogXCJiaW9tZSBmb3JtYXQgLlwiLFxuICAgIFwiY2xpXCI6IFwiYnVuIC4vY2xpL21haW4udHNcIlxuICB9LFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAYmlvbWVqcy9iaW9tZVwiOiBcIl4xLjkuNFwiLFxuICAgIFwiQHRzY2lyY3VpdC9jb3JlXCI6IFwiXjAuMC4yNDlcIixcbiAgICBcIkB0eXBlcy9idW5cIjogXCJeMS4xLjE1XCIsXG4gICAgXCJAdHlwZXMvY29uZmlnc3RvcmVcIjogXCJeNi4wLjJcIixcbiAgICBcIkB0eXBlcy9yZWFjdFwiOiBcIl4xOS4wLjFcIixcbiAgICBcIkB0eXBlcy9zZW12ZXJcIjogXCJeNy41LjhcIixcbiAgICBcImdldC1wb3J0XCI6IFwiXjcuMS4wXCIsXG4gICAgXCJ0ZW1weVwiOiBcIl4zLjEuMFwiLFxuICAgIFwidHN1cFwiOiBcIl44LjMuNVwiLFxuICAgIFwidHlwZWQta3lcIjogXCJeMC4wLjRcIlxuICB9LFxuICBcInBlZXJEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwidHlwZXNjcmlwdFwiOiBcIl41LjAuMFwiXG4gIH0sXG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkB0c2NpcmN1aXQvZmlsZS1zZXJ2ZXJcIjogXCJeMC4wLjEzXCIsXG4gICAgXCJAdHNjaXJjdWl0L3J1bmZyYW1lXCI6IFwiXjAuMC40N1wiLFxuICAgIFwiY2hva2lkYXJcIjogXCJeNC4wLjFcIixcbiAgICBcImNvbW1hbmRlclwiOiBcIl4xMi4xLjBcIixcbiAgICBcImNvbmZpZ3N0b3JlXCI6IFwiXjcuMC4wXCIsXG4gICAgXCJjb3NtaWNvbmZpZ1wiOiBcIl45LjAuMFwiLFxuICAgIFwiZGVsYXlcIjogXCJeNi4wLjBcIixcbiAgICBcImp3dC1kZWNvZGVcIjogXCJeNC4wLjBcIixcbiAgICBcImt5XCI6IFwiXjEuNy40XCIsXG4gICAgXCJtYWtlLXZmc1wiOiBcIl4xLjAuMTVcIixcbiAgICBcInBlcmZlY3QtY2xpXCI6IFwiXjEuMC4yMFwiLFxuICAgIFwic2VtdmVyXCI6IFwiXjcuNi4zXCJcbiAgfVxufVxuIiwgImltcG9ydCBwa2cgZnJvbSBcIi4uLy4uL3BhY2thZ2UuanNvblwiXG5cbmV4cG9ydCBjb25zdCBnZXRJbmRleCA9IGFzeW5jICgpID0+IHtcbiAgcmV0dXJuIGA8aHRtbD5cbiAgICA8aGVhZD5cbiAgICA8L2hlYWQ+XG4gICAgPGJvZHk+XG4gICAgICA8c2NyaXB0IHNyYz1cImh0dHBzOi8vY2RuLnRhaWx3aW5kY3NzLmNvbVwiPjwvc2NyaXB0PlxuICAgICAgPGRpdiBpZD1cInJvb3RcIj5sb2FkaW5nLi4uPC9kaXY+XG4gICAgICA8c2NyaXB0PlxuICAgICAgZ2xvYmFsVGhpcy5wcm9jZXNzID0geyBlbnY6IHsgTk9ERV9FTlY6IFwicHJvZHVjdGlvblwiIH0gfVxuICAgICAgPC9zY3JpcHQ+XG4gICAgICA8c2NyaXB0IHNyYz1cIi9zdGFuZGFsb25lLm1pbi5qc1wiPjwvc2NyaXB0PlxuICAgIDwvYm9keT5cbiAgPC9odG1sPmBcbn1cblxuLy8gPHNjcmlwdCBzcmM9XCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0B0c2NpcmN1aXQvcnVuZnJhbWVAJHtwa2cuZGVwZW5kZW5jaWVzW1wiQHRzY2lyY3VpdC9ydW5mcmFtZVwiXS5yZXBsYWNlKC9eW14wLTldKy8sIFwiXCIpfS9kaXN0L3N0YW5kYWxvbmUubWluLmpzXCI+PC9zY3JpcHQ+XG4iLCAiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSBcImV2ZW50c1wiXG5cbmludGVyZmFjZSBFdmVudCB7XG4gIGV2ZW50X2lkOiBzdHJpbmdcbiAgY3JlYXRlZF9hdDogc3RyaW5nXG4gIGV2ZW50X3R5cGU6IHN0cmluZ1xuICBba2V5OiBzdHJpbmddOiBhbnlcbn1cblxuaW50ZXJmYWNlIEV2ZW50c1Jlc3BvbnNlIHtcbiAgZXZlbnRfbGlzdDogRXZlbnRbXVxufVxuXG5leHBvcnQgY2xhc3MgRXZlbnRzV2F0Y2hlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHByaXZhdGUgbGFzdFBvbGxUaW1lOiBzdHJpbmdcbiAgcHJpdmF0ZSBwb2xsSW50ZXJ2YWw6IG51bWJlclxuICBwcml2YXRlIGJhc2VVcmw6IHN0cmluZ1xuICBwcml2YXRlIHBvbGxpbmcgPSBmYWxzZVxuICBwcml2YXRlIHRpbWVvdXRJZD86IE5vZGVKUy5UaW1lb3V0XG5cbiAgY29uc3RydWN0b3IoYmFzZVVybCA9IFwiaHR0cDovL2xvY2FsaG9zdDozMDAwXCIsIHBvbGxJbnRlcnZhbCA9IDEwMDApIHtcbiAgICBzdXBlcigpXG4gICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybFxuICAgIHRoaXMucG9sbEludGVydmFsID0gcG9sbEludGVydmFsXG4gICAgdGhpcy5sYXN0UG9sbFRpbWUgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0KCkge1xuICAgIGlmICh0aGlzLnBvbGxpbmcpIHJldHVyblxuICAgIHRoaXMucG9sbGluZyA9IHRydWVcbiAgICBhd2FpdCB0aGlzLnBvbGwoKVxuICB9XG5cbiAgc3RvcCgpIHtcbiAgICB0aGlzLnBvbGxpbmcgPSBmYWxzZVxuICAgIGlmICh0aGlzLnRpbWVvdXRJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dElkKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcG9sbCgpIHtcbiAgICBpZiAoIXRoaXMucG9sbGluZykgcmV0dXJuXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgYCR7dGhpcy5iYXNlVXJsfS9hcGkvZXZlbnRzL2xpc3Q/c2luY2U9JHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5sYXN0UG9sbFRpbWUpfWAsXG4gICAgICApXG5cbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQIGVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGE6IEV2ZW50c1Jlc3BvbnNlID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG5cbiAgICAgIC8vIFVwZGF0ZSBsYXN0IHBvbGwgdGltZSB0byBsYXRlc3QgZXZlbnQgb3IgY3VycmVudCB0aW1lXG4gICAgICBjb25zdCBsYXRlc3RFdmVudCA9IGRhdGEuZXZlbnRfbGlzdFtkYXRhLmV2ZW50X2xpc3QubGVuZ3RoIC0gMV1cbiAgICAgIHRoaXMubGFzdFBvbGxUaW1lID0gbGF0ZXN0RXZlbnRcbiAgICAgICAgPyBsYXRlc3RFdmVudC5jcmVhdGVkX2F0XG4gICAgICAgIDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG5cbiAgICAgIC8vIEVtaXQgZXZlbnRzIGluIGNocm9ub2xvZ2ljYWwgb3JkZXJcbiAgICAgIGRhdGEuZXZlbnRfbGlzdC5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLmVtaXQoZXZlbnQuZXZlbnRfdHlwZSwgZXZlbnQpXG4gICAgICAgIHRoaXMuZW1pdChcIipcIiwgZXZlbnQpXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBlcnJvcilcbiAgICB9XG4gICAgLy8gU2NoZWR1bGUgbmV4dCBwb2xsXG4gICAgdGhpcy50aW1lb3V0SWQgPSBnbG9iYWxUaGlzLnNldFRpbWVvdXQoXG4gICAgICAoKSA9PiB0aGlzLnBvbGwoKSxcbiAgICAgIHRoaXMucG9sbEludGVydmFsLFxuICAgICkgYXMgdW5rbm93biBhcyBOb2RlSlMuVGltZW91dFxuICB9XG59XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IGZpbmRJbXBvcnRzSW5TbmlwcGV0IH0gZnJvbSBcIi4vZmluZEltcG9ydHNJblNuaXBwZXRcIlxuaW1wb3J0IHsgaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXQgfSBmcm9tIFwiLi9pbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldFwiXG5cbmV4cG9ydCBjbGFzcyBGaWxlc3lzdGVtVHlwZXNIYW5kbGVyIHtcbiAgcHJpdmF0ZSBwcm9qZWN0Um9vdDogc3RyaW5nXG5cbiAgY29uc3RydWN0b3IoaW5pdGlhbERpcjogc3RyaW5nKSB7XG4gICAgdGhpcy5wcm9qZWN0Um9vdCA9IHRoaXMuZmluZFByb2plY3RSb290KGluaXRpYWxEaXIpXG4gIH1cblxuICBhc3luYyBoYW5kbGVJbml0aWFsVHlwZURlcGVuZGVuY2llcyhmaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgY29uc29sZS5sb2coXCJDaGVja2luZyBpbml0aWFsIHR5cGUgZGVwZW5kZW5jaWVzLi4uXCIpXG4gICAgdHJ5IHtcbiAgICAgIGlmICghdGhpcy5hcmVUeXBlc0luc3RhbGxlZChmaWxlUGF0aCkpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJJbnN0YWxsaW5nIG1pc3NpbmcgaW5pdGlhbCB0eXBlcy4uLlwiKVxuICAgICAgICBhd2FpdCBpbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldChmaWxlUGF0aClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKFwiRXJyb3IgaGFuZGxpbmcgaW5pdGlhbCB0eXBlIGRlcGVuZGVuY2llczpcIiwgZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaGFuZGxlRmlsZVR5cGVEZXBlbmRlbmNpZXMoZmlsZVBhdGg6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMuYXJlVHlwZXNJbnN0YWxsZWQoZmlsZVBhdGgpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiSW5zdGFsbGluZyBtaXNzaW5nIGZpbGUgdHlwZXMuLi5cIilcbiAgICAgICAgYXdhaXQgaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXQoZmlsZVBhdGgpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkZhaWxlZCB0byB2ZXJpZnkgdHlwZXM6XCIsIGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXJlVHlwZXNJbnN0YWxsZWQoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGltcG9ydHMgPSBmaW5kSW1wb3J0c0luU25pcHBldChmaWxlUGF0aClcbiAgICByZXR1cm4gaW1wb3J0cy5ldmVyeSgoaW1wKSA9PiB0aGlzLmNoZWNrVHlwZUV4aXN0cyhpbXApKVxuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1R5cGVFeGlzdHMoaW1wb3J0UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCFpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCJAdHNjaS9cIikpIHJldHVybiB0cnVlXG5cbiAgICBjb25zdCBwYXRoV2l0aG91dFByZWZpeCA9IGltcG9ydFBhdGgucmVwbGFjZShcIkB0c2NpL1wiLCBcIlwiKVxuICAgIGNvbnN0IFtvd25lciwgbmFtZV0gPSBwYXRoV2l0aG91dFByZWZpeC5zcGxpdChcIi5cIilcblxuICAgIGNvbnN0IHR5cGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgdGhpcy5wcm9qZWN0Um9vdCxcbiAgICAgIFwibm9kZV9tb2R1bGVzXCIsXG4gICAgICBcIkB0c2NpXCIsXG4gICAgICBgJHtvd25lcn0uJHtuYW1lfWAsXG4gICAgICBcImluZGV4LmQudHNcIixcbiAgICApXG5cbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyh0eXBlUGF0aClcbiAgfVxuXG4gIHByaXZhdGUgZmluZFByb2plY3RSb290KHN0YXJ0RGlyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCByb290ID0gcGF0aC5yZXNvbHZlKHN0YXJ0RGlyKVxuICAgIHdoaWxlIChyb290ICE9PSBwYXRoLnBhcnNlKHJvb3QpLnJvb3QpIHtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290LCBcInBhY2thZ2UuanNvblwiKSkpIHtcbiAgICAgICAgcmV0dXJuIHJvb3RcbiAgICAgIH1cbiAgICAgIHJvb3QgPSBwYXRoLmRpcm5hbWUocm9vdClcbiAgICB9XG4gICAgcmV0dXJuIHN0YXJ0RGlyXG4gIH1cbn1cbiIsICJpbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgKiBhcyB0cyBmcm9tIFwidHlwZXNjcmlwdFwiXG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kSW1wb3J0c0luU25pcHBldChzbmlwcGV0UGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNuaXBwZXRQYXRoLCBcInV0Zi04XCIpXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSB0cy5jcmVhdGVTb3VyY2VGaWxlKFxuICAgIHNuaXBwZXRQYXRoLFxuICAgIGNvbnRlbnQsXG4gICAgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCxcbiAgICB0cnVlLFxuICApXG5cbiAgY29uc3QgaW1wb3J0czogc3RyaW5nW10gPSBbXVxuXG4gIGZ1bmN0aW9uIHZpc2l0KG5vZGU6IHRzLk5vZGUpIHtcbiAgICBpZiAodHMuaXNJbXBvcnREZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgY29uc3QgbW9kdWxlU3BlY2lmaWVyID0gbm9kZS5tb2R1bGVTcGVjaWZpZXJcbiAgICAgIGlmIChtb2R1bGVTcGVjaWZpZXIgJiYgdHMuaXNTdHJpbmdMaXRlcmFsKG1vZHVsZVNwZWNpZmllcikpIHtcbiAgICAgICAgY29uc3QgaW1wb3J0UGF0aCA9IG1vZHVsZVNwZWNpZmllci50ZXh0XG4gICAgICAgIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCJAdHNjaS9cIikpIHtcbiAgICAgICAgICBpbXBvcnRzLnB1c2goaW1wb3J0UGF0aClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0cy5mb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXQpXG4gIH1cblxuICB2aXNpdChzb3VyY2VGaWxlKVxuXG4gIHJldHVybiBpbXBvcnRzXG59XG4iLCAiaW1wb3J0IENvbmZpZ3N0b3JlIGZyb20gXCJjb25maWdzdG9yZVwiXG5pbXBvcnQgdHlwZSB7IFR5cGVkQ29uZmlnc3RvcmUgfSBmcm9tIFwiLi9UeXBlZENvbmZpZ1N0b3JlXCJcbmltcG9ydCB7IGp3dERlY29kZSB9IGZyb20gXCJqd3QtZGVjb2RlXCJcblxuZXhwb3J0IGludGVyZmFjZSBDbGlDb25maWcge1xuICBzZXNzaW9uVG9rZW4/OiBzdHJpbmdcbiAgZ2l0aHViVXNlcm5hbWU/OiBzdHJpbmdcbiAgcmVnaXN0cnlBcGlVcmw/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IGNsaUNvbmZpZzogVHlwZWRDb25maWdzdG9yZTxDbGlDb25maWc+ID0gbmV3IENvbmZpZ3N0b3JlKFxuICBcInRzY2lyY3VpdFwiLFxuKVxuXG5leHBvcnQgY29uc3Qgc2V0U2Vzc2lvblRva2VuID0gKHRva2VuOiBzdHJpbmcpID0+IHtcbiAgY2xpQ29uZmlnLnNldChcInNlc3Npb25Ub2tlblwiLCB0b2tlbilcbiAgY29uc3QgZGVjb2RlZCA9IGp3dERlY29kZTx7XG4gICAgZ2l0aHViX3VzZXJuYW1lOiBzdHJpbmdcbiAgfT4odG9rZW4pXG4gIGNsaUNvbmZpZy5zZXQoXCJnaXRodWJVc2VybmFtZVwiLCBkZWNvZGVkLmdpdGh1Yl91c2VybmFtZSlcbn1cblxuZXhwb3J0IGNvbnN0IGdldFJlZ2lzdHJ5QXBpVXJsID0gKCk6IHN0cmluZyA9PiB7XG4gIHJldHVybiBjbGlDb25maWcuZ2V0KFwicmVnaXN0cnlBcGlVcmxcIikgPz8gXCJodHRwczovL3JlZ2lzdHJ5LWFwaS50c2NpcmN1aXQuY29tXCJcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IHNldFNlc3Npb25Ub2tlbiB9IGZyb20gXCJsaWIvY2xpLWNvbmZpZ1wiXG5pbXBvcnQgZGVsYXkgZnJvbSBcImRlbGF5XCJcbmltcG9ydCB7IGdldEt5IH0gZnJvbSBcImxpYi9yZWdpc3RyeS1hcGkvZ2V0LWt5XCJcbmltcG9ydCB0eXBlIHsgRW5kcG9pbnRSZXNwb25zZSB9IGZyb20gXCJsaWIvcmVnaXN0cnktYXBpL2VuZHBvaW50LXR5cGVzXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQXV0aExvZ2luID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgLy8gRGVmaW5lIHRoZSBsb2dpbiBhY3Rpb24gb25jZSB0byBzaGFyZSBiZXR3ZWVuIGJvdGggY29tbWFuZHNcbiAgY29uc3QgbG9naW5BY3Rpb24gPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qga3kgPSBnZXRLeSgpXG5cbiAgICBjb25zdCB7IGxvZ2luX3BhZ2UgfSA9IGF3YWl0IGt5XG4gICAgICAucG9zdDxFbmRwb2ludFJlc3BvbnNlW1wic2Vzc2lvbnMvbG9naW5fcGFnZS9jcmVhdGVcIl0+KFxuICAgICAgICBcInNlc3Npb25zL2xvZ2luX3BhZ2UvY3JlYXRlXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBqc29uOiB7fSxcbiAgICAgICAgfSxcbiAgICAgIClcbiAgICAgIC5qc29uKClcblxuICAgIGNvbnNvbGUubG9nKFwiUGxlYXNlIHZpc2l0IHRoZSBmb2xsb3dpbmcgVVJMIHRvIGxvZyBpbjpcIilcbiAgICBjb25zb2xlLmxvZyhsb2dpbl9wYWdlLnVybClcblxuICAgIC8vIFdhaXQgdW50aWwgd2UgcmVjZWl2ZSBjb25maXJtYXRpb25cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgeyBsb2dpbl9wYWdlOiBuZXdfbG9naW5fcGFnZSB9ID0gYXdhaXQga3lcbiAgICAgICAgLnBvc3Q8RW5kcG9pbnRSZXNwb25zZVtcInNlc3Npb25zL2xvZ2luX3BhZ2UvZ2V0XCJdPihcbiAgICAgICAgICBcInNlc3Npb25zL2xvZ2luX3BhZ2UvZ2V0XCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAganNvbjoge1xuICAgICAgICAgICAgICBsb2dpbl9wYWdlX2lkOiBsb2dpbl9wYWdlLmxvZ2luX3BhZ2VfaWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7bG9naW5fcGFnZS5sb2dpbl9wYWdlX2F1dGhfdG9rZW59YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgICAuanNvbigpXG5cbiAgICAgIGlmIChuZXdfbG9naW5fcGFnZS53YXNfbG9naW5fc3VjY2Vzc2Z1bCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkxvZ2dlZCBpbiEgR2VuZXJhdGluZyB0b2tlbi4uLlwiKVxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBpZiAobmV3X2xvZ2luX3BhZ2UuaXNfZXhwaXJlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMb2dpbiBwYWdlIGV4cGlyZWRcIilcbiAgICAgIH1cblxuICAgICAgYXdhaXQgZGVsYXkoMTAwMClcbiAgICB9XG5cbiAgICBjb25zdCB7IHNlc3Npb24gfSA9IGF3YWl0IGt5XG4gICAgICAucG9zdDxFbmRwb2ludFJlc3BvbnNlW1wic2Vzc2lvbnMvbG9naW5fcGFnZS9leGNoYW5nZV9mb3JfY2xpX3Nlc3Npb25cIl0+KFxuICAgICAgICBcInNlc3Npb25zL2xvZ2luX3BhZ2UvZXhjaGFuZ2VfZm9yX2NsaV9zZXNzaW9uXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBqc29uOiB7XG4gICAgICAgICAgICBsb2dpbl9wYWdlX2lkOiBsb2dpbl9wYWdlLmxvZ2luX3BhZ2VfaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7bG9naW5fcGFnZS5sb2dpbl9wYWdlX2F1dGhfdG9rZW59YCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgKVxuICAgICAgLmpzb24oKVxuXG4gICAgc2V0U2Vzc2lvblRva2VuKHNlc3Npb24udG9rZW4pXG4gICAgY29uc29sZS5sb2coXCJcXG5SZWFkeSB0byB1c2UhXCIpXG4gIH1cblxuICAvLyBSZWdpc3RlciB0aGUgYXV0aCBsb2dpbiBzdWJjb21tYW5kXG4gIHByb2dyYW0uY29tbWFuZHNcbiAgICAuZmluZCgoYykgPT4gYy5uYW1lKCkgPT09IFwiYXV0aFwiKSFcbiAgICAuY29tbWFuZChcImxvZ2luXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiQXV0aGVudGljYXRlIENMSSwgbG9naW4gdG8gcmVnaXN0cnlcIilcbiAgICAuYWN0aW9uKGxvZ2luQWN0aW9uKVxuXG4gIC8vIFJlZ2lzdGVyIHRoZSB0b3AtbGV2ZWwgbG9naW4gY29tbWFuZCBhcyBhbiBhbGlhc1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoXCJsb2dpblwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkxvZ2luIHRvIHRzY2lyY3VpdCByZWdpc3RyeVwiKVxuICAgIC5hY3Rpb24obG9naW5BY3Rpb24pXG59XG4iLCAiaW1wb3J0IHsgZ2V0UmVnaXN0cnlBcGlVcmwgfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuaW1wb3J0IGt5LCB7IHR5cGUgQWZ0ZXJSZXNwb25zZUhvb2sgfSBmcm9tIFwia3lcIlxuXG5jb25zdCBwcmV0dHlSZXNwb25zZUVycm9ySG9vazogQWZ0ZXJSZXNwb25zZUhvb2sgPSBhc3luYyAoXG4gIF9yZXF1ZXN0LFxuICBfb3B0aW9ucyxcbiAgcmVzcG9uc2UsXG4pID0+IHtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlcnJvckRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZBSUwgWyR7cmVzcG9uc2Uuc3RhdHVzfV06ICR7X3JlcXVlc3QubWV0aG9kfSAke1xuICAgICAgICAgIG5ldyBVUkwoX3JlcXVlc3QudXJsKS5wYXRobmFtZVxuICAgICAgICB9IFxcblxcbiAke0pTT04uc3RyaW5naWZ5KGVycm9yRGF0YSwgbnVsbCwgMil9YCxcbiAgICAgIClcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvL2lnbm9yZSwgYWxsb3cgdGhlIGVycm9yIHRvIGJlIHRocm93blxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0S3kgPSAoKSA9PiB7XG4gIHJldHVybiBreS5jcmVhdGUoe1xuICAgIHByZWZpeFVybDogZ2V0UmVnaXN0cnlBcGlVcmwoKSxcbiAgICBob29rczoge1xuICAgICAgYWZ0ZXJSZXNwb25zZTogW3ByZXR0eVJlc3BvbnNlRXJyb3JIb29rXSxcbiAgICB9LFxuICB9KVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJBdXRoTG9nb3V0ID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbS5jb21tYW5kc1xuICAgIC5maW5kKChjKSA9PiBjLm5hbWUoKSA9PT0gXCJhdXRoXCIpIVxuICAgIC5jb21tYW5kKFwibG9nb3V0XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiTG9nb3V0IGZyb20gcmVnaXN0cnlcIilcbiAgICAuYWN0aW9uKChhcmdzKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhcImxvZ291dFwiKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckF1dGggPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtLmNvbW1hbmQoXCJhdXRoXCIpLmRlc2NyaXB0aW9uKFwiTG9naW4vbG9nb3V0XCIpXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckNvbmZpZyA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZChcImNvbmZpZ1wiKS5kZXNjcmlwdGlvbihcIk1hbmFnZSB0c2NpcmN1aXQgQ0xJIGNvbmZpZ3VyYXRpb25cIilcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IGNsaUNvbmZpZyB9IGZyb20gXCJsaWIvY2xpLWNvbmZpZ1wiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckNvbmZpZ1ByaW50ID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbS5jb21tYW5kc1xuICAgIC5maW5kKChjKSA9PiBjLm5hbWUoKSA9PT0gXCJjb25maWdcIikhXG4gICAgLmNvbW1hbmQoXCJwcmludFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIlByaW50IHRoZSBjdXJyZW50IGNvbmZpZ1wiKVxuICAgIC5hY3Rpb24oKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoY2xpQ29uZmlnLmFsbCwgbnVsbCwgMikpXG4gICAgfSlcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IGdldEt5IH0gZnJvbSBcImxpYi9yZWdpc3RyeS1hcGkvZ2V0LWt5XCJcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckNsb25lID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKFwiY2xvbmVcIilcbiAgICAuZGVzY3JpcHRpb24oXCJDbG9uZSBhIHNuaXBwZXQgZnJvbSB0aGUgcmVnaXN0cnlcIilcbiAgICAuYXJndW1lbnQoXCI8c25pcHBldD5cIiwgXCJTbmlwcGV0IHRvIGNsb25lIChlLmcuIGF1dGhvci9zbmlwcGV0TmFtZSlcIilcbiAgICAuYWN0aW9uKGFzeW5jIChzbmlwcGV0UGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBsZXQgYXV0aG9yOiBzdHJpbmdcbiAgICAgIGxldCBzbmlwcGV0TmFtZTogc3RyaW5nXG4gICAgICBpZiAoIXNuaXBwZXRQYXRoLnN0YXJ0c1dpdGgoXCJAdHNjaS9cIikgJiYgc25pcHBldFBhdGguaW5jbHVkZXMoXCIvXCIpKSB7XG4gICAgICAgIDtbYXV0aG9yLCBzbmlwcGV0TmFtZV0gPSBzbmlwcGV0UGF0aC5zcGxpdChcIi9cIilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRyaW1tZWRQYXRoID0gc25pcHBldFBhdGgucmVwbGFjZShcIkB0c2NpL1wiLCBcIlwiKVxuICAgICAgICBjb25zdCBmaXJzdERvdEluZGV4ID0gdHJpbW1lZFBhdGguaW5kZXhPZihcIi5cIilcbiAgICAgICAgYXV0aG9yID0gdHJpbW1lZFBhdGguc2xpY2UoMCwgZmlyc3REb3RJbmRleClcbiAgICAgICAgc25pcHBldE5hbWUgPSB0cmltbWVkUGF0aC5zbGljZShmaXJzdERvdEluZGV4ICsgMSlcbiAgICAgIH1cblxuICAgICAgaWYgKCFhdXRob3IgfHwgIXNuaXBwZXROYW1lKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJJbnZhbGlkIHNuaXBwZXQgcGF0aC4gVXNlIGZvcm1hdDogYXV0aG9yL3NuaXBwZXROYW1lLCBhdXRob3Iuc25pcHBldE5hbWUgb3IgQHRzY2kvYXV0aG9yLnNuaXBwZXROYW1lXCIsXG4gICAgICAgIClcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGt5ID0gZ2V0S3koKVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zb2xlLmxvZyhgQ2xvbmluZyAke2F1dGhvcn0vJHtzbmlwcGV0TmFtZX0uLi5gKVxuXG4gICAgICAgIGNvbnN0IHBhY2thZ2VGaWxlTGlzdCA9IGF3YWl0IGt5XG4gICAgICAgICAgLnBvc3Q8e1xuICAgICAgICAgICAgcGFja2FnZV9maWxlczogQXJyYXk8e1xuICAgICAgICAgICAgICBwYWNrYWdlX2ZpbGVfaWQ6IHN0cmluZ1xuICAgICAgICAgICAgICBwYWNrYWdlX3JlbGVhc2VfaWQ6IHN0cmluZ1xuICAgICAgICAgICAgICBmaWxlX3BhdGg6IHN0cmluZ1xuICAgICAgICAgICAgICBjcmVhdGVkX2F0OiBzdHJpbmdcbiAgICAgICAgICAgIH0+XG4gICAgICAgICAgfT4oXCJwYWNrYWdlX2ZpbGVzL2xpc3RcIiwge1xuICAgICAgICAgICAganNvbjoge1xuICAgICAgICAgICAgICBwYWNrYWdlX25hbWU6IGAke2F1dGhvcn0vJHtzbmlwcGV0TmFtZX1gLFxuICAgICAgICAgICAgICB1c2VfbGF0ZXN0X3ZlcnNpb246IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmpzb24oKVxuXG4gICAgICAgIC8vIENyZWF0ZSBkaXJlY3RvcnkgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgICAgICBjb25zdCBkaXJQYXRoID0gYC4vJHthdXRob3J9LiR7c25pcHBldE5hbWV9YFxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgICAgICBmcy5ta2RpclN5bmMoZGlyUGF0aClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERvd25sb2FkIGVhY2ggZmlsZSB0aGF0IGRvZXNuJ3Qgc3RhcnQgd2l0aCBkaXN0L1xuICAgICAgICBmb3IgKGNvbnN0IGZpbGVJbmZvIG9mIHBhY2thZ2VGaWxlTGlzdC5wYWNrYWdlX2ZpbGVzKSB7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBmaWxlSW5mby5maWxlX3BhdGguc3RhcnRzV2l0aChcIi9cIilcbiAgICAgICAgICAgID8gZmlsZUluZm8uZmlsZV9wYXRoLnNsaWNlKDEpXG4gICAgICAgICAgICA6IGZpbGVJbmZvLmZpbGVfcGF0aFxuXG4gICAgICAgICAgaWYgKGZpbGVQYXRoLnN0YXJ0c1dpdGgoXCJkaXN0L1wiKSkgY29udGludWVcblxuICAgICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQga3lcbiAgICAgICAgICAgIC5wb3N0PHtcbiAgICAgICAgICAgICAgcGFja2FnZV9maWxlOiB7XG4gICAgICAgICAgICAgICAgY29udGVudF90ZXh0OiBzdHJpbmdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfT4oXCJwYWNrYWdlX2ZpbGVzL2dldFwiLCB7XG4gICAgICAgICAgICAgIGpzb246IHtcbiAgICAgICAgICAgICAgICBwYWNrYWdlX25hbWU6IGAke2F1dGhvcn0vJHtzbmlwcGV0TmFtZX1gLFxuICAgICAgICAgICAgICAgIGZpbGVfcGF0aDogZmlsZUluZm8uZmlsZV9wYXRoLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qc29uKClcblxuICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGVQYXRoKVxuICAgICAgICAgIGNvbnN0IGRpck5hbWUgPSBwYXRoLmRpcm5hbWUoZnVsbFBhdGgpXG5cbiAgICAgICAgICAvLyBDcmVhdGUgbmVzdGVkIGRpcmVjdG9yaWVzIGlmIHRoZXkgZG9uJ3QgZXhpc3RcbiAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyTmFtZSkpIHtcbiAgICAgICAgICAgIGZzLm1rZGlyU3luYyhkaXJOYW1lLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZnVsbFBhdGgsIGZpbGVDb250ZW50LnBhY2thZ2VfZmlsZS5jb250ZW50X3RleHQpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBucG1yY1BhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgXCIubnBtcmNcIilcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhucG1yY1BhdGgsIFwiQHRzY2k6cmVnaXN0cnk9aHR0cHM6Ly9ucG0udHNjaXJjdWl0LmNvbVwiKVxuXG4gICAgICAgIGNvbnNvbGUubG9nKGBTdWNjZXNzZnVsbHkgY2xvbmVkIHRvIC4vJHthdXRob3J9LiR7c25pcHBldE5hbWV9L2ApXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gY2xvbmUgc25pcHBldDpcIiwgZXJyb3IubWVzc2FnZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGNsb25lIHNuaXBwZXQ6XCIsIGVycm9yKVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgICAgfVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBjcmVhdGVDaXJjdWl0V2ViV29ya2VyIH0gZnJvbSBcIkB0c2NpcmN1aXQvZXZhbC13ZWJ3b3JrZXJcIlxuaW1wb3J0IHdlYldvcmtlckJ1bmRsZVVybCBmcm9tIFwiQHRzY2lyY3VpdC9ldmFsLXdlYndvcmtlci9ibG9iLXVybFwiXG5pbXBvcnQgeyBnZXRWaXJ0dWFsRmlsZVN5c3RlbUZyb21EaXJQYXRoIH0gZnJvbSBcIm1ha2UtdmZzXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzXCJcblxuY29uc3QgQUxMT1dFRF9GT1JNQVRTID0gW1xuICBcImpzb25cIixcbiAgXCJjaXJjdWl0LWpzb25cIixcbiAgXCJzY2hlbWF0aWMtc3ZnXCIsXG4gIFwicGNiLXN2Z1wiLFxuICBcImdlcmJlcnNcIixcbiAgXCJyZWFkYWJsZS1uZXRsaXN0XCIsXG4gIFwiZ2x0ZlwiLFxuICBcInNwZWNjdHJhLWRzblwiLFxuXSBhcyBjb25zdFxuXG50eXBlIEZvcm1hdCA9ICh0eXBlb2YgQUxMT1dFRF9GT1JNQVRTKVtudW1iZXJdXG5cbmNvbnN0IE9VVFBVVF9FWFRFTlNJT05TID0ge1xuICBqc29uOiBcIi5jaXJjdWl0Lmpzb25cIixcbiAgXCJjaXJjdWl0LWpzb25cIjogXCIuY2lyY3VpdC5qc29uXCIsXG4gIFwic2NoZW1hdGljLXN2Z1wiOiBcIi1zY2hlbWF0aWMuc3ZnXCIsXG4gIFwicGNiLXN2Z1wiOiBcIi1wY2Iuc3ZnXCIsXG4gIGdlcmJlcnM6IFwiLWdlcmJlcnMuemlwXCIsXG4gIFwicmVhZGFibGUtbmV0bGlzdFwiOiBcIi1yZWFkYWJsZS5uZXRsaXN0XCIsXG4gIGdsdGY6IFwiLmdsdGZcIixcbiAgXCJzcGVjY3RyYS1kc25cIjogXCIuZHNuXCIsXG59XG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckV4cG9ydCA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImV4cG9ydFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkV4cG9ydCB0c2NpcmN1aXQgY29kZSB0byB2YXJpb3VzIGZvcm1hdHNcIilcbiAgICAuYXJndW1lbnQoXCI8ZmlsZT5cIiwgXCJQYXRoIHRvIHRoZSBzbmlwcGV0IGZpbGVcIilcbiAgICAub3B0aW9uKFwiLWYsIC0tZm9ybWF0IDxmb3JtYXQ+XCIsIFwiT3V0cHV0IGZvcm1hdFwiKVxuICAgIC5vcHRpb24oXCItbywgLS1vdXRwdXQgPHBhdGg+XCIsIFwiT3V0cHV0IGZpbGUgcGF0aFwiKVxuICAgIC5hY3Rpb24oYXN5bmMgKGZpbGUsIG9wdGlvbnMpID0+IHtcbiAgICAgIGNvbnN0IHsgZm9ybWF0ID0gXCJjaXJjdWl0LWpzb25cIiB9ID0gb3B0aW9uc1xuICAgICAgbGV0IHsgb3V0cHV0IH0gPSBvcHRpb25zXG4gICAgICBpZiAoIUFMTE9XRURfRk9STUFUUy5pbmNsdWRlcyhmb3JtYXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW52YWxpZCBmb3JtYXQ6ICR7Zm9ybWF0fVxcblN1cHBvcnRlZCBmb3JtYXRzOiAke0FMTE9XRURfRk9STUFUUy5qb2luKFwiLFwiKX1gLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIGlmICghb3V0cHV0KSB7XG4gICAgICAgIG91dHB1dCA9IHBhdGguYmFzZW5hbWUoZmlsZSkucmVwbGFjZSgvXFwuW14uXSskLywgXCJcIilcbiAgICAgIH1cblxuICAgICAgY29uc3Qgd29ya2VyID0gYXdhaXQgY3JlYXRlQ2lyY3VpdFdlYldvcmtlcih7XG4gICAgICAgIHdlYldvcmtlclVybDogd2ViV29ya2VyQnVuZGxlVXJsLFxuICAgICAgfSlcblxuICAgICAgY29uc3QgcHJvamVjdERpciA9IHBhdGguZGlybmFtZShmaWxlKVxuXG4gICAgICBjb25zdCByZWxhdGl2ZUNvbXBvbmVudFBhdGggPSBwYXRoLnJlbGF0aXZlKHByb2plY3REaXIsIGZpbGUpXG5cbiAgICAgIGF3YWl0IHdvcmtlci5leGVjdXRlV2l0aEZzTWFwKHtcbiAgICAgICAgZW50cnlwb2ludDogXCJlbnRyeXBvaW50LnRzeFwiLFxuICAgICAgICBmc01hcDoge1xuICAgICAgICAgIC4uLigoYXdhaXQgZ2V0VmlydHVhbEZpbGVTeXN0ZW1Gcm9tRGlyUGF0aCh7XG4gICAgICAgICAgICBkaXJQYXRoOiBwcm9qZWN0RGlyLFxuICAgICAgICAgICAgY29udGVudEZvcm1hdDogXCJzdHJpbmdcIixcbiAgICAgICAgICB9KSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiksXG4gICAgICAgICAgXCJlbnRyeXBvaW50LnRzeFwiOiBgXG5pbXBvcnQgTXlDaXJjdWl0IGZyb20gXCIuLyR7cmVsYXRpdmVDb21wb25lbnRQYXRofVwiXG5cbmNpcmN1aXQuYWRkKDxNeUNpcmN1aXQgLz4pXG4gICAgICAgIGAsXG4gICAgICAgIH0sXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCB3b3JrZXIucmVuZGVyVW50aWxTZXR0bGVkKClcblxuICAgICAgY29uc3QgY2lyY3VpdEpzb24gPSBhd2FpdCB3b3JrZXIuZ2V0Q2lyY3VpdEpzb24oKVxuXG4gICAgICBjb25zdCBvdXRwdXRQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICBwcm9qZWN0RGlyLFxuICAgICAgICBgJHtvdXRwdXR9JHtPVVRQVVRfRVhURU5TSU9OU1tmb3JtYXQgYXMgRm9ybWF0XX1gLFxuICAgICAgKVxuXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKG91dHB1dFBhdGgsIEpTT04uc3RyaW5naWZ5KGNpcmN1aXRKc29uKSlcblxuICAgICAgY29uc29sZS5sb2coYEV4cG9ydGVkIHRvICR7b3V0cHV0UGF0aH1gKVxuXG4gICAgICBwcm9jZXNzLmV4aXQoMClcbiAgICB9KVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgY2xpQ29uZmlnIH0gZnJvbSBcImxpYi9jbGktY29uZmlnXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQXV0aFByaW50VG9rZW4gPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtLmNvbW1hbmRzXG4gICAgLmZpbmQoKGMpID0+IGMubmFtZSgpID09PSBcImF1dGhcIikhXG4gICAgLmNvbW1hbmQoXCJwcmludC10b2tlblwiKVxuICAgIC5kZXNjcmlwdGlvbihcIlByaW50cyB5b3VyIGF1dGggdG9rZW5cIilcbiAgICAuYWN0aW9uKCgpID0+IHtcbiAgICAgIGNvbnN0IHRva2VuID0gY2xpQ29uZmlnLmdldChcInNlc3Npb25Ub2tlblwiKVxuICAgICAgaWYgKCF0b2tlbikgcmV0dXJuIGNvbnNvbGUubG9nKFwiWW91IG5lZWQgdG8gbG9nIGluIHRvIGFjY2VzcyB0aGlzLlwiKVxuICAgICAgY29uc29sZS5sb2coXCJZb3VyIFRva2VuOlxcblwiLCB0b2tlbilcbiAgICB9KVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgc2V0U2Vzc2lvblRva2VuIH0gZnJvbSBcImxpYi9jbGktY29uZmlnXCJcblxuZnVuY3Rpb24gdmFsaWRhdGVKV1RMZW5ndGgodG9rZW46IHN0cmluZykge1xuICBjb25zdCBwYXJ0cyA9IHRva2VuLnNwbGl0KFwiLlwiKVxuXG4gIGlmIChwYXJ0cy5sZW5ndGggPT09IDMgJiYgcGFydHMuZXZlcnkoKHBhcnQpID0+IHBhcnQubGVuZ3RoID4gMCkpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5leHBvcnQgY29uc3QgcmVnaXN0ZXJBdXRoU2V0VG9rZW4gPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtLmNvbW1hbmRzXG4gICAgLmZpbmQoKGMpID0+IGMubmFtZSgpID09PSBcImF1dGhcIikhXG4gICAgLmNvbW1hbmQoXCJzZXQtdG9rZW5cIilcbiAgICAuZGVzY3JpcHRpb24oXCJFeHBsaWNpdGx5IHNldCB5b3VyIGF1dGggdG9rZW5cIilcbiAgICAuYXJndW1lbnQoXCI8dG9rZW4+XCIsIFwiTmV3IHRva2VuIHRvIG1hbnVhbGx5IGNvbmZpZ3VyZVwiKVxuICAgIC5hY3Rpb24oKHRva2VuKSA9PiB7XG4gICAgICBpZiAoIXZhbGlkYXRlSldUTGVuZ3RoKHRva2VuKSlcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUubG9nKFwiSW52YWxpZCB0b2tlbiBwcm92aWRlZFwiKVxuICAgICAgc2V0U2Vzc2lvblRva2VuKHRva2VuKVxuICAgICAgY29uc29sZS5sb2coXCJUb2tlbiBtYW51YWxseSB1cGRhdGVkLlwiKVxuICAgIH0pXG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7QUFDQSxTQUFTLGVBQWU7OztBQ0F4QixZQUFZLFFBQVE7QUFDcEIsWUFBWSxVQUFVO0FBRWYsSUFBTSxlQUFlLENBQUNBLGFBQXFCO0FBQ2hELEVBQUFBLFNBQ0csUUFBUSxNQUFNLEVBQ2QsWUFBWSw2REFBNkQsRUFDekUsT0FBTyxNQUFNO0FBQ1osVUFBTSxhQUFhLFFBQVEsSUFBSTtBQUUvQixVQUFNLGdCQUFxQixVQUFLLFlBQVksV0FBVztBQUN2RCxVQUFNLGdCQUFxQixVQUFLLFlBQVksUUFBUTtBQUVwRCxVQUFNLGVBQWU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBc0JyQixVQUFNLGVBQWU7QUFBQTtBQUFBO0FBSXJC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LEdBQUc7QUFDaEUsV0FBTztBQUFBLEVBQ1QsT0FBTztBQUNMLFdBQU87QUFBQSxFQUNUO0FBQ0Y7QUFDTyxJQUFNLHVCQUF1QixDQUFDQyxhQUFxQjtBQUN4RCxFQUFBQSxTQUFRLFNBQ0wsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLE1BQU0sTUFBTSxFQUMvQixRQUFRLFdBQVcsRUFDbkIsWUFBWSxnQ0FBZ0MsRUFDNUMsU0FBUyxXQUFXLGlDQUFpQyxFQUNyRCxPQUFPLENBQUMsVUFBVTtBQUNqQixRQUFJLENBQUMsa0JBQWtCLEtBQUs7QUFDMUIsYUFBTyxRQUFRLElBQUksd0JBQXdCO0FBQzdDLG9CQUFnQixLQUFLO0FBQ3JCLFlBQVEsSUFBSSx5QkFBeUI7QUFBQSxFQUN2QyxDQUFDO0FBQ0w7OztBckJQQSxJQUFNLFVBQVUsSUFBSSxRQUFRO0FBRTVCLFFBQ0csS0FBSyxNQUFNLEVBQ1gsWUFBWSx1Q0FBdUMsRUFHbkQsUUFBUSxPQUFPLElBQUksZ0JBQUksU0FBUyxPQUFPLEtBQUssZ0JBQUksT0FBTztBQUUxRCxhQUFhLE9BQU87QUFFcEIsWUFBWSxPQUFPO0FBQ25CLGNBQWMsT0FBTztBQUVyQixhQUFhLE9BQU87QUFDcEIsa0JBQWtCLE9BQU87QUFDekIsbUJBQW1CLE9BQU87QUFDMUIsdUJBQXVCLE9BQU87QUFDOUIscUJBQXFCLE9BQU87QUFFNUIsZUFBZSxPQUFPO0FBQ3RCLG9CQUFvQixPQUFPO0FBRTNCLGVBQWUsT0FBTztBQUV0QixJQUFJLFFBQVEsS0FBSyxXQUFXLEdBQUc7QUFDN0IsYUFBVyxTQUFTLFFBQVEsSUFBSTtBQUNsQyxPQUFPO0FBQ0wsVUFBUSxNQUFNO0FBQ2hCOyIsCiAgIm5hbWVzIjogWyJwcm9ncmFtIiwgInBhdGgiLCAiZnMiLCAiZnMiLCAicGF0aCIsICJmcyIsICJwYXRoIiwgInJlc29sdmUiLCAicGF0aCIsICJmcyIsICJmcyIsICJwYXRoIiwgImZzIiwgInRzIiwgInBhdGgiLCAiZnMiLCAicHJvZ3JhbSIsICJwb3J0IiwgInJlc29sdmUiLCAic2VydmVyIiwgImt5IiwgInByb2dyYW0iLCAia3kiLCAicHJvZ3JhbSIsICJwcm9ncmFtIiwgInByb2dyYW0iLCAicHJvZ3JhbSIsICJmcyIsICJwYXRoIiwgInByb2dyYW0iLCAia3kiLCAicGF0aCIsICJmcyIsICJwcm9ncmFtIiwgInByb2dyYW0iLCAicHJvZ3JhbSJdCn0K
|
|
882
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY2xpL21haW4udHMiLCAiLi4vY2xpL2luaXQvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2Rldi9yZWdpc3Rlci50cyIsICIuLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9pbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldC50cyIsICIuLi9jbGkvZGV2L0RldlNlcnZlci50cyIsICIuLi9saWIvc2VydmVyL2NyZWF0ZUh0dHBTZXJ2ZXIudHMiLCAiLi4vcGFja2FnZS5qc29uIiwgIi4uL2xpYi9zaXRlL2dldEluZGV4LnRzIiwgIi4uL2xpYi9zZXJ2ZXIvRXZlbnRzV2F0Y2hlci50cyIsICIuLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9GaWxlc3lzdGVtVHlwZXNIYW5kbGVyLnRzIiwgIi4uL2xpYi9kZXBlbmRlbmN5LWFuYWx5c2lzL2ZpbmRJbXBvcnRzSW5TbmlwcGV0LnRzIiwgIi4uL2xpYi9jbGktY29uZmlnL2luZGV4LnRzIiwgIi4uL2NsaS9hdXRoL2xvZ2luL3JlZ2lzdGVyLnRzIiwgIi4uL2xpYi9yZWdpc3RyeS1hcGkvZ2V0LWt5LnRzIiwgIi4uL2NsaS9hdXRoL2xvZ291dC9yZWdpc3Rlci50cyIsICIuLi9jbGkvYXV0aC9yZWdpc3Rlci50cyIsICIuLi9jbGkvY29uZmlnL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9jb25maWcvcHJpbnQvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2Nsb25lL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9leHBvcnQvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2F1dGgvcHJpbnQtdG9rZW4vcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2F1dGgvc2V0LXRva2VuL3JlZ2lzdGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIjIS91c3IvYmluL2VudiBub2RlXG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyByZWdpc3RlckluaXQgfSBmcm9tIFwiLi9pbml0L3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyRGV2IH0gZnJvbSBcIi4vZGV2L3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQXV0aExvZ2luIH0gZnJvbSBcIi4vYXV0aC9sb2dpbi9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhMb2dvdXQgfSBmcm9tIFwiLi9hdXRoL2xvZ291dC9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGggfSBmcm9tIFwiLi9hdXRoL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQ29uZmlnUHJpbnQgfSBmcm9tIFwiLi9jb25maWcvcHJpbnQvcmVnaXN0ZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJDbG9uZSB9IGZyb20gXCIuL2Nsb25lL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHBlcmZlY3RDbGkgfSBmcm9tIFwicGVyZmVjdC1jbGlcIlxuaW1wb3J0IHBrZyBmcm9tIFwiLi4vcGFja2FnZS5qc29uXCJcbmltcG9ydCBzZW12ZXIgZnJvbSBcInNlbXZlclwiXG5pbXBvcnQgeyByZWdpc3RlckV4cG9ydCB9IGZyb20gXCIuL2V4cG9ydC9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhQcmludFRva2VuIH0gZnJvbSBcIi4vYXV0aC9wcmludC10b2tlbi9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhTZXRUb2tlbiB9IGZyb20gXCIuL2F1dGgvc2V0LXRva2VuL3JlZ2lzdGVyXCJcblxuY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKClcblxucHJvZ3JhbVxuICAubmFtZShcInRzY2lcIilcbiAgLmRlc2NyaXB0aW9uKFwiQ0xJIGZvciBkZXZlbG9waW5nIHRzY2lyY3VpdCBzbmlwcGV0c1wiKVxuICAvLyBIQUNLOiBhdCBidWlsZCB0aW1lIHRoZSB2ZXJzaW9uIGlzIG9sZCwgd2UgbmVlZCB0b1xuICAvLyBmaXggdGhpcyBhdCBzb21lIHBvaW50Li4uXG4gIC52ZXJzaW9uKHNlbXZlci5pbmMocGtnLnZlcnNpb24sIFwicGF0Y2hcIikgPz8gcGtnLnZlcnNpb24pXG5cbnJlZ2lzdGVySW5pdChwcm9ncmFtKVxuXG5yZWdpc3RlckRldihwcm9ncmFtKVxucmVnaXN0ZXJDbG9uZShwcm9ncmFtKVxuXG5yZWdpc3RlckF1dGgocHJvZ3JhbSlcbnJlZ2lzdGVyQXV0aExvZ2luKHByb2dyYW0pXG5yZWdpc3RlckF1dGhMb2dvdXQocHJvZ3JhbSlcbnJlZ2lzdGVyQXV0aFByaW50VG9rZW4ocHJvZ3JhbSlcbnJlZ2lzdGVyQXV0aFNldFRva2VuKHByb2dyYW0pXG5cbnJlZ2lzdGVyQ29uZmlnKHByb2dyYW0pXG5yZWdpc3RlckNvbmZpZ1ByaW50KHByb2dyYW0pXG5cbnJlZ2lzdGVyRXhwb3J0KHByb2dyYW0pXG5cbmlmIChwcm9jZXNzLmFyZ3YubGVuZ3RoID09PSAyKSB7XG4gIHBlcmZlY3RDbGkocHJvZ3JhbSwgcHJvY2Vzcy5hcmd2KVxufSBlbHNlIHtcbiAgcHJvZ3JhbS5wYXJzZSgpXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJJbml0ID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKFwiaW5pdFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkluaXRpYWxpemUgYSBuZXcgVFNDaXJjdWl0IHByb2plY3QgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5XCIpXG4gICAgLmFjdGlvbigoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50RGlyID0gcHJvY2Vzcy5jd2QoKVxuXG4gICAgICBjb25zdCBpbmRleEZpbGVQYXRoID0gcGF0aC5qb2luKGN1cnJlbnREaXIsIFwiaW5kZXgudHN4XCIpXG4gICAgICBjb25zdCBucG1yY0ZpbGVQYXRoID0gcGF0aC5qb2luKGN1cnJlbnREaXIsIFwiLm5wbXJjXCIpXG5cbiAgICAgIGNvbnN0IGluZGV4Q29udGVudCA9IGBcbmV4cG9ydCBkZWZhdWx0ICgpID0+IChcbiAgPGJvYXJkIHdpZHRoPVwiMTBtbVwiIGhlaWdodD1cIjEwbW1cIj5cbiAgICA8cmVzaXN0b3JcbiAgICAgIHJlc2lzdGFuY2U9XCIxa1wiXG4gICAgICBmb290cHJpbnQ9XCIwNDAyXCJcbiAgICAgIG5hbWU9XCJSMVwiXG4gICAgICBzY2hYPXszfVxuICAgICAgcGNiWD17M31cbiAgICAvPlxuICAgIDxjYXBhY2l0b3JcbiAgICAgIGNhcGFjaXRhbmNlPVwiMTAwMHBGXCJcbiAgICAgIGZvb3RwcmludD1cIjA0MDJcIlxuICAgICAgbmFtZT1cIkMxXCJcbiAgICAgIHNjaFg9ey0zfVxuICAgICAgcGNiWD17LTN9XG4gICAgLz5cbiAgICA8dHJhY2UgZnJvbT1cIi5SMSA+IC5waW4xXCIgdG89XCIuQzEgPiAucGluMVwiIC8+XG4gIDwvYm9hcmQ+XG4pO1xuYFxuXG4gICAgICBjb25zdCBucG1yY0NvbnRlbnQgPSBgXG5AdHNjaTpyZWdpc3RyeT1odHRwczovL25wbS50c2NpcmN1aXQuY29tXG5gXG5cbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhpbmRleEZpbGVQYXRoKSkge1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGluZGV4RmlsZVBhdGgsIGluZGV4Q29udGVudC50cmltU3RhcnQoKSlcbiAgICAgICAgY29uc29sZS5sb2coYENyZWF0ZWQ6ICR7aW5kZXhGaWxlUGF0aH1gKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coYFNraXBwZWQ6ICR7aW5kZXhGaWxlUGF0aH0gYWxyZWFkeSBleGlzdHNgKVxuICAgICAgfVxuXG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMobnBtcmNGaWxlUGF0aCkpIHtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhucG1yY0ZpbGVQYXRoLCBucG1yY0NvbnRlbnQudHJpbVN0YXJ0KCkpXG4gICAgICAgIGNvbnNvbGUubG9nKGBDcmVhdGVkOiAke25wbXJjRmlsZVBhdGh9YClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBTa2lwcGVkOiAke25wbXJjRmlsZVBhdGh9IGFscmVhZHkgZXhpc3RzYClcbiAgICAgIH1cblxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBJbml0aWFsaXphdGlvbiBjb21wbGV0ZS4gUnVuIFwidHNjaSBkZXZcIiB0byBzdGFydCBkZXZlbG9waW5nLmAsXG4gICAgICApXG4gICAgfSlcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgKiBhcyBjaG9raWRhciBmcm9tIFwiY2hva2lkYXJcIlxuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0IHsgY3JlYXRlSHR0cFNlcnZlciB9IGZyb20gXCJsaWIvc2VydmVyL2NyZWF0ZUh0dHBTZXJ2ZXJcIlxuaW1wb3J0IHsgZ2V0TG9jYWxGaWxlRGVwZW5kZW5jaWVzIH0gZnJvbSBcImxpYi9kZXBlbmRlbmN5LWFuYWx5c2lzL2dldExvY2FsRmlsZURlcGVuZGVuY2llc1wiXG5pbXBvcnQgeyBpbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldCB9IGZyb20gXCIuLi8uLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9pbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldFwiXG5pbXBvcnQgeyBFdmVudHNXYXRjaGVyIH0gZnJvbSBcIi4uLy4uL2xpYi9zZXJ2ZXIvRXZlbnRzV2F0Y2hlclwiXG5pbXBvcnQgeyBEZXZTZXJ2ZXIgfSBmcm9tIFwiLi9EZXZTZXJ2ZXJcIlxuaW1wb3J0ICogYXMgbmV0IGZyb20gXCJub2RlOm5ldFwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckRldiA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImRldlwiKVxuICAgIC5kZXNjcmlwdGlvbihcIlN0YXJ0IGRldmVsb3BtZW50IHNlcnZlciBmb3IgYSBzbmlwcGV0XCIpXG4gICAgLmFyZ3VtZW50KFwiW2ZpbGVdXCIsIFwiUGF0aCB0byB0aGUgc25pcHBldCBmaWxlXCIpXG4gICAgLm9wdGlvbihcIi1wLCAtLXBvcnQgPG51bWJlcj5cIiwgXCJQb3J0IHRvIHJ1biBzZXJ2ZXIgb25cIiwgXCIzMDIwXCIpXG4gICAgLmFjdGlvbihhc3luYyAoZmlsZTogc3RyaW5nLCBvcHRpb25zOiB7IHBvcnQ6IHN0cmluZyB9KSA9PiB7XG4gICAgICBsZXQgcG9ydCA9IHBhcnNlSW50KG9wdGlvbnMucG9ydClcblxuICAgICAgY29uc3QgaXNQb3J0QXZhaWxhYmxlID0gKHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBjb25zdCBzZXJ2ZXIgPSBuZXQuY3JlYXRlU2VydmVyKClcbiAgICAgICAgICBzZXJ2ZXIub25jZShcImVycm9yXCIsICgpID0+IHJlc29sdmUoZmFsc2UpKVxuICAgICAgICAgIHNlcnZlci5vbmNlKFwibGlzdGVuaW5nXCIsICgpID0+IHtcbiAgICAgICAgICAgIHNlcnZlci5jbG9zZSgoKSA9PiByZXNvbHZlKHRydWUpKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgc2VydmVyLmxpc3Rlbihwb3J0KVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICB3aGlsZSAoIShhd2FpdCBpc1BvcnRBdmFpbGFibGUocG9ydCkpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBQb3J0ICR7cG9ydH0gaXMgaW4gdXNlLCB0cnlpbmcgcG9ydCAke3BvcnQgKyAxfS4uLmApXG4gICAgICAgIHBvcnQgKz0gMVxuICAgICAgfVxuXG4gICAgICBsZXQgYWJzb2x1dGVQYXRoOiBzdHJpbmdcblxuICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGZpbGUpXG4gICAgICAgIGlmICghYWJzb2x1dGVQYXRoLmVuZHNXaXRoKFwiLnRzeFwiKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvcjogT25seSAudHN4IGZpbGVzIGFyZSBzdXBwb3J0ZWRcIilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZW50cnlwb2ludFBhdGggPSBwYXRoLnJlc29sdmUoXCJpbmRleC50c3hcIilcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZW50cnlwb2ludFBhdGgpKSB7XG4gICAgICAgICAgYWJzb2x1dGVQYXRoID0gZW50cnlwb2ludFBhdGhcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIk5vIGZpbGUgcHJvdmlkZWQuIFVzaW5nICdpbmRleC50c3gnIGFzIHRoZSBlbnRyeXBvaW50LlwiKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgXCJObyBlbnRyeXBvaW50IGZvdW5kLiBSdW4gJ3RzY2kgaW5pdCcgdG8gYm9vdHN0cmFwIGEgYmFzaWMgcHJvamVjdC5cIixcbiAgICAgICAgICApXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsZURpciA9IHBhdGguZGlybmFtZShhYnNvbHV0ZVBhdGgpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiSW5zdGFsbGluZyB0eXBlcyBmb3IgaW1wb3J0ZWQgc25pcHBldHMuLi5cIilcbiAgICAgICAgYXdhaXQgaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXQoYWJzb2x1dGVQYXRoKVxuICAgICAgICBjb25zb2xlLmxvZyhcIlR5cGVzIGluc3RhbGxlZCBzdWNjZXNzZnVsbHlcIilcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIkZhaWxlZCB0byBpbnN0YWxsIHR5cGVzOlwiLCBlcnJvcilcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VydmVyID0gbmV3IERldlNlcnZlcih7XG4gICAgICAgIHBvcnQsXG4gICAgICAgIGNvbXBvbmVudEZpbGVQYXRoOiBhYnNvbHV0ZVBhdGgsXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCBzZXJ2ZXIuc3RhcnQoKVxuICAgICAgYXdhaXQgc2VydmVyLmFkZEVudHJ5cG9pbnQoKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCAqIGFzIHRzIGZyb20gXCJ0eXBlc2NyaXB0XCJcblxuaW50ZXJmYWNlIFNuaXBwZXRBcGlSZXNwb25zZSB7XG4gIHNuaXBwZXQ6IHtcbiAgICBkdHM6IHN0cmluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldChzbmlwcGV0UGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoc25pcHBldFBhdGgsIFwidXRmLThcIilcbiAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgc25pcHBldFBhdGgsXG4gICAgY29udGVudCxcbiAgICB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0LFxuICAgIHRydWUsXG4gIClcblxuICBjb25zdCBpbXBvcnRzOiBzdHJpbmdbXSA9IFtdXG5cbiAgZnVuY3Rpb24gdmlzaXQobm9kZTogdHMuTm9kZSkge1xuICAgIGlmICh0cy5pc0ltcG9ydERlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICBjb25zdCBtb2R1bGVTcGVjaWZpZXIgPSBub2RlLm1vZHVsZVNwZWNpZmllclxuICAgICAgaWYgKG1vZHVsZVNwZWNpZmllciAmJiB0cy5pc1N0cmluZ0xpdGVyYWwobW9kdWxlU3BlY2lmaWVyKSkge1xuICAgICAgICBjb25zdCBpbXBvcnRQYXRoID0gbW9kdWxlU3BlY2lmaWVyLnRleHRcbiAgICAgICAgaWYgKGltcG9ydFBhdGguc3RhcnRzV2l0aChcIkB0c2NpL1wiKSkge1xuICAgICAgICAgIGltcG9ydHMucHVzaChpbXBvcnRQYXRoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRzLmZvckVhY2hDaGlsZChub2RlLCB2aXNpdClcbiAgfVxuXG4gIHZpc2l0KHNvdXJjZUZpbGUpXG5cbiAgbGV0IHByb2plY3RSb290ID0gcGF0aC5kaXJuYW1lKHNuaXBwZXRQYXRoKVxuICB3aGlsZSAocHJvamVjdFJvb3QgIT09IHBhdGgucGFyc2UocHJvamVjdFJvb3QpLnJvb3QpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdFJvb3QsIFwicGFja2FnZS5qc29uXCIpKSkge1xuICAgICAgYnJlYWtcbiAgICB9XG4gICAgcHJvamVjdFJvb3QgPSBwYXRoLmRpcm5hbWUocHJvamVjdFJvb3QpXG4gIH1cblxuICBmb3IgKGNvbnN0IGltcG9ydFBhdGggb2YgaW1wb3J0cykge1xuICAgIGNvbnN0IFtvd25lciwgbmFtZV0gPSBpbXBvcnRQYXRoLnJlcGxhY2UoXCJAdHNjaS9cIiwgXCJcIikuc3BsaXQoXCIuXCIpXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICAgIGBodHRwczovL3JlZ2lzdHJ5LWFwaS50c2NpcmN1aXQuY29tL3NuaXBwZXRzL2dldD9vd25lcl9uYW1lPSR7b3duZXJ9JnVuc2NvcGVkX25hbWU9JHtuYW1lfWAsXG4gICAgICApXG5cbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gZmV0Y2ggdHlwZXMgZm9yICR7aW1wb3J0UGF0aH1gKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhOiBTbmlwcGV0QXBpUmVzcG9uc2UgPSBhd2FpdCByZXNwb25zZS5qc29uKClcblxuICAgICAgaWYgKGRhdGEuc25pcHBldC5kdHMpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZURpciA9IHBhdGguam9pbihcbiAgICAgICAgICBwcm9qZWN0Um9vdCxcbiAgICAgICAgICBcIm5vZGVfbW9kdWxlc1wiLFxuICAgICAgICAgIFwiQHRzY2lcIixcbiAgICAgICAgICBgJHtvd25lcn0uJHtuYW1lfWAsXG4gICAgICAgIClcbiAgICAgICAgZnMubWtkaXJTeW5jKHBhY2thZ2VEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG5cbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZURpciwgXCJpbmRleC5kLnRzXCIpLCBkYXRhLnNuaXBwZXQuZHRzKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oYEVycm9yIGZldGNoaW5nIHR5cGVzIGZvciAke2ltcG9ydFBhdGh9OmAsIGVycm9yKVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCBreSBmcm9tIFwia3lcIlxuaW1wb3J0IHR5cGUgeyBGaWxlU2VydmVyUm91dGVzIH0gZnJvbSBcImxpYi9maWxlLXNlcnZlci9GaWxlU2VydmVyUm91dGVzXCJcbmltcG9ydCB7IGNyZWF0ZUh0dHBTZXJ2ZXIgfSBmcm9tIFwibGliL3NlcnZlci9jcmVhdGVIdHRwU2VydmVyXCJcbmltcG9ydCB7IEV2ZW50c1dhdGNoZXIgfSBmcm9tIFwibGliL3NlcnZlci9FdmVudHNXYXRjaGVyXCJcbmltcG9ydCB0eXBlIGh0dHAgZnJvbSBcIm5vZGU6aHR0cFwiXG5pbXBvcnQgdHlwZSB7IFR5cGVkS3lJbnN0YW5jZSB9IGZyb20gXCJ0eXBlZC1reVwiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgdHlwZSB7IEZpbGVVcGRhdGVkRXZlbnQgfSBmcm9tIFwibGliL2ZpbGUtc2VydmVyL0ZpbGVTZXJ2ZXJFdmVudFwiXG5pbXBvcnQgKiBhcyBjaG9raWRhciBmcm9tIFwiY2hva2lkYXJcIlxuaW1wb3J0IHsgRmlsZXN5c3RlbVR5cGVzSGFuZGxlciB9IGZyb20gXCJsaWIvZGVwZW5kZW5jeS1hbmFseXNpcy9GaWxlc3lzdGVtVHlwZXNIYW5kbGVyXCJcblxuZXhwb3J0IGNsYXNzIERldlNlcnZlciB7XG4gIHBvcnQ6IG51bWJlclxuICAvKipcbiAgICogVGhlIHBhdGggdG8gYSBjb21wb25lbnQgdGhhdCBleHBvcnRzIGEgPGJvYXJkIC8+IG9yIDxncm91cCAvPiBjb21wb25lbnRcbiAgICovXG4gIGNvbXBvbmVudEZpbGVQYXRoOiBzdHJpbmdcblxuICBwcm9qZWN0RGlyOiBzdHJpbmdcblxuICAvKipcbiAgICogVGhlIEhUVFAgc2VydmVyIHRoYXQgaG9zdHMgdGhlIGZpbGUgc2VydmVyIGFuZCBldmVudCBidXMuIFlvdSBjYW4gdXNlXG4gICAqIGZzS3kgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgZmlsZSBzZXJ2ZXIvZXZlbnQgYnVzXG4gICAqL1xuICBodHRwU2VydmVyPzogaHR0cC5TZXJ2ZXJcbiAgLyoqXG4gICAqIFdhdGNoZXMgZm9yIGV2ZW50cyBvbiB0aGUgZXZlbnQgYnVzIGJ5IHBvbGxpbmcgYGFwaS9ldmVudHMvbGlzdGBcbiAgICovXG4gIGV2ZW50c1dhdGNoZXI/OiBFdmVudHNXYXRjaGVyXG4gIC8qKlxuICAgKiBBIGt5IGluc3RhbmNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgZmlsZSBzZXJ2ZXIgYW5kXG4gICAqIGV2ZW50IGJ1c1xuICAgKi9cbiAgZnNLeTogVHlwZWRLeUluc3RhbmNlPGtleW9mIEZpbGVTZXJ2ZXJSb3V0ZXMsIEZpbGVTZXJ2ZXJSb3V0ZXM+XG4gIC8qKlxuICAgKiBBIGNob2tpZGFyIGluc3RhbmNlIHRoYXQgd2F0Y2hlcyB0aGUgcHJvamVjdCBkaXJlY3RvcnkgZm9yIGZpbGUgY2hhbmdlc1xuICAgKi9cbiAgZmlsZXN5c3RlbVdhdGNoZXI/OiBjaG9raWRhci5GU1dhdGNoZXJcblxuICBwcml2YXRlIHR5cGVzSGFuZGxlcj86IEZpbGVzeXN0ZW1UeXBlc0hhbmRsZXJcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgcG9ydCxcbiAgICBjb21wb25lbnRGaWxlUGF0aCxcbiAgfToge1xuICAgIHBvcnQ6IG51bWJlclxuICAgIGNvbXBvbmVudEZpbGVQYXRoOiBzdHJpbmdcbiAgfSkge1xuICAgIHRoaXMucG9ydCA9IHBvcnRcbiAgICB0aGlzLmNvbXBvbmVudEZpbGVQYXRoID0gY29tcG9uZW50RmlsZVBhdGhcbiAgICB0aGlzLnByb2plY3REaXIgPSBwYXRoLmRpcm5hbWUoY29tcG9uZW50RmlsZVBhdGgpXG4gICAgdGhpcy5mc0t5ID0ga3kuY3JlYXRlKHtcbiAgICAgIHByZWZpeFVybDogYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0fWAsXG4gICAgfSkgYXMgYW55XG4gICAgdGhpcy50eXBlc0hhbmRsZXIgPSBuZXcgRmlsZXN5c3RlbVR5cGVzSGFuZGxlcih0aGlzLnByb2plY3REaXIpXG4gIH1cblxuICBhc3luYyBzdGFydCgpIHtcbiAgICBjb25zdCB7IHNlcnZlciB9ID0gYXdhaXQgY3JlYXRlSHR0cFNlcnZlcih0aGlzLnBvcnQpXG4gICAgdGhpcy5odHRwU2VydmVyID0gc2VydmVyXG5cbiAgICB0aGlzLmV2ZW50c1dhdGNoZXIgPSBuZXcgRXZlbnRzV2F0Y2hlcihgaHR0cDovL2xvY2FsaG9zdDoke3RoaXMucG9ydH1gKVxuICAgIHRoaXMuZXZlbnRzV2F0Y2hlci5zdGFydCgpXG5cbiAgICB0aGlzLmV2ZW50c1dhdGNoZXIub24oXG4gICAgICBcIkZJTEVfVVBEQVRFRFwiLFxuICAgICAgdGhpcy5oYW5kbGVGaWxlVXBkYXRlZEV2ZW50RnJvbVNlcnZlci5iaW5kKHRoaXMpLFxuICAgIClcblxuICAgIHRoaXMuZmlsZXN5c3RlbVdhdGNoZXIgPSBjaG9raWRhci53YXRjaCh0aGlzLnByb2plY3REaXIsIHtcbiAgICAgIHBlcnNpc3RlbnQ6IHRydWUsXG4gICAgICBpZ25vcmVJbml0aWFsOiB0cnVlLFxuICAgIH0pXG5cbiAgICB0aGlzLmZpbGVzeXN0ZW1XYXRjaGVyLm9uKFwiY2hhbmdlXCIsIChmaWxlUGF0aCkgPT5cbiAgICAgIHRoaXMuaGFuZGxlRmlsZUNoYW5nZWRPbkZpbGVzeXN0ZW0oZmlsZVBhdGgpLFxuICAgIClcbiAgICB0aGlzLmZpbGVzeXN0ZW1XYXRjaGVyLm9uKFwiYWRkXCIsIChmaWxlUGF0aCkgPT5cbiAgICAgIHRoaXMuaGFuZGxlRmlsZUNoYW5nZWRPbkZpbGVzeXN0ZW0oZmlsZVBhdGgpLFxuICAgIClcblxuICAgIHRoaXMudXBzZXJ0SW5pdGlhbEZpbGVzKClcblxuICAgIHRoaXMudHlwZXNIYW5kbGVyPy5oYW5kbGVJbml0aWFsVHlwZURlcGVuZGVuY2llcyh0aGlzLmNvbXBvbmVudEZpbGVQYXRoKVxuICB9XG5cbiAgYXN5bmMgYWRkRW50cnlwb2ludCgpIHtcbiAgICBjb25zdCByZWxhdGl2ZUNvbXBvbmVudEZpbGVQYXRoID0gcGF0aC5yZWxhdGl2ZShcbiAgICAgIHRoaXMucHJvamVjdERpcixcbiAgICAgIHRoaXMuY29tcG9uZW50RmlsZVBhdGgsXG4gICAgKVxuICAgIGF3YWl0IHRoaXMuZnNLeS5wb3N0KFwiYXBpL2ZpbGVzL3Vwc2VydFwiLCB7XG4gICAgICBqc29uOiB7XG4gICAgICAgIGZpbGVfcGF0aDogXCJlbnRyeXBvaW50LnRzeFwiLFxuICAgICAgICB0ZXh0X2NvbnRlbnQ6IGBcbmltcG9ydCBNeUNpcmN1aXQgZnJvbSBcIi4vJHtyZWxhdGl2ZUNvbXBvbmVudEZpbGVQYXRofVwiXG5cbmNpcmN1aXQuYWRkKDxNeUNpcmN1aXQgLz4pXG5gLFxuICAgICAgfSxcbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgaGFuZGxlRmlsZVVwZGF0ZWRFdmVudEZyb21TZXJ2ZXIoZXY6IEZpbGVVcGRhdGVkRXZlbnQpIHtcbiAgICBpZiAoZXYuaW5pdGlhdG9yID09PSBcImZpbGVzeXN0ZW1fY2hhbmdlXCIpIHJldHVyblxuXG4gICAgaWYgKGV2LmZpbGVfcGF0aCA9PT0gXCJtYW51YWwtZWRpdHMuanNvblwiKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIk1hbnVhbCBlZGl0cyB1cGRhdGVkLCB1cGRhdGluZyBvbiBmaWxlc3lzdGVtLi4uXCIpXG4gICAgICBjb25zdCB7IGZpbGUgfSA9IGF3YWl0IHRoaXMuZnNLeVxuICAgICAgICAuZ2V0KFwiYXBpL2ZpbGVzL2dldFwiLCB7XG4gICAgICAgICAgc2VhcmNoUGFyYW1zOiB7IGZpbGVfcGF0aDogZXYuZmlsZV9wYXRoIH0sXG4gICAgICAgIH0pXG4gICAgICAgIC5qc29uKClcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgIHBhdGguam9pbih0aGlzLnByb2plY3REaXIsIFwibWFudWFsLWVkaXRzLmpzb25cIiksXG4gICAgICAgIGZpbGUudGV4dF9jb250ZW50LFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUZpbGVDaGFuZ2VkT25GaWxlc3lzdGVtKGFic29sdXRlRmlsZVBhdGg6IHN0cmluZykge1xuICAgIGNvbnN0IHJlbGF0aXZlRmlsZVBhdGggPSBwYXRoLnJlbGF0aXZlKHRoaXMucHJvamVjdERpciwgYWJzb2x1dGVGaWxlUGF0aClcbiAgICAvLyBXZSd2ZSB0ZW1wb3JhcmlseSBkaXNhYmxlZCB1cHNlcnRpbmcgbWFudWFsIGVkaXRzIGZyb20gZmlsZXN5c3RlbSBjaGFuZ2VzXG4gICAgLy8gYmVjYXVzZSBpdCBjYW4gYmUgZWRpdGVkIGJ5IHRoZSBicm93c2VyXG4gICAgaWYgKHJlbGF0aXZlRmlsZVBhdGguaW5jbHVkZXMoXCJtYW51YWwtZWRpdHMuanNvblwiKSkgcmV0dXJuXG5cbiAgICBhd2FpdCB0aGlzLnR5cGVzSGFuZGxlcj8uaGFuZGxlRmlsZVR5cGVEZXBlbmRlbmNpZXMoYWJzb2x1dGVGaWxlUGF0aClcblxuICAgIGNvbnNvbGUubG9nKGAke3JlbGF0aXZlRmlsZVBhdGh9IHNhdmVkLiBBcHBseWluZyBjaGFuZ2VzLi4uYClcbiAgICBhd2FpdCB0aGlzLmZzS3lcbiAgICAgIC5wb3N0KFwiYXBpL2ZpbGVzL3Vwc2VydFwiLCB7XG4gICAgICAgIGpzb246IHtcbiAgICAgICAgICBmaWxlX3BhdGg6IHJlbGF0aXZlRmlsZVBhdGgsXG4gICAgICAgICAgdGV4dF9jb250ZW50OiBmcy5yZWFkRmlsZVN5bmMoYWJzb2x1dGVGaWxlUGF0aCwgXCJ1dGYtOFwiKSxcbiAgICAgICAgICBpbml0aWF0b3I6IFwiZmlsZXN5c3RlbV9jaGFuZ2VcIixcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuanNvbigpXG4gIH1cblxuICBhc3luYyB1cHNlcnRJbml0aWFsRmlsZXMoKSB7XG4gICAgLy8gU2NhbiBwcm9qZWN0IGRpcmVjdG9yeSBmb3IgYWxsIGZpbGVzIGFuZCB1cHNlcnQgdGhlbVxuICAgIGNvbnN0IGZpbGVOYW1lcyA9IGZzLnJlYWRkaXJTeW5jKHRoaXMucHJvamVjdERpcilcbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lcykge1xuICAgICAgaWYgKGZzLnN0YXRTeW5jKHBhdGguam9pbih0aGlzLnByb2plY3REaXIsIGZpbGVOYW1lKSkuaXNEaXJlY3RvcnkoKSlcbiAgICAgICAgY29udGludWVcbiAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICBwYXRoLmpvaW4odGhpcy5wcm9qZWN0RGlyLCBmaWxlTmFtZSksXG4gICAgICAgIFwidXRmLThcIixcbiAgICAgIClcbiAgICAgIGF3YWl0IHRoaXMuZnNLeS5wb3N0KFwiYXBpL2ZpbGVzL3Vwc2VydFwiLCB7XG4gICAgICAgIGpzb246IHtcbiAgICAgICAgICBmaWxlX3BhdGg6IGZpbGVOYW1lLFxuICAgICAgICAgIHRleHRfY29udGVudDogZmlsZUNvbnRlbnQsXG4gICAgICAgICAgaW5pdGlhdG9yOiBcImZpbGVzeXN0ZW1fY2hhbmdlXCIsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgdGhpcy5odHRwU2VydmVyPy5jbG9zZSgpXG4gICAgdGhpcy5ldmVudHNXYXRjaGVyPy5zdG9wKClcbiAgfVxufVxuIiwgImltcG9ydCAqIGFzIGh0dHAgZnJvbSBcIm5vZGU6aHR0cFwiXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgZ2V0Tm9kZUhhbmRsZXIgfSBmcm9tIFwid2ludGVyc3BlYy9hZGFwdGVycy9ub2RlXCJcbmltcG9ydCBwa2cgZnJvbSBcIi4uLy4uL3BhY2thZ2UuanNvblwiXG5cbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB3aW50ZXJzcGVjQnVuZGxlIGZyb20gXCJAdHNjaXJjdWl0L2ZpbGUtc2VydmVyL2Rpc3QvYnVuZGxlLmpzXCJcbmltcG9ydCB7IGdldEluZGV4IH0gZnJvbSBcIi4uL3NpdGUvZ2V0SW5kZXhcIlxuXG5leHBvcnQgY29uc3QgY3JlYXRlSHR0cFNlcnZlciA9IGFzeW5jIChwb3J0ID0gMzAyMCkgPT4ge1xuICBjb25zdCBmaWxlU2VydmVySGFuZGxlciA9IGdldE5vZGVIYW5kbGVyKHdpbnRlcnNwZWNCdW5kbGUgYXMgYW55LCB7fSlcblxuICBjb25zdCBzZXJ2ZXIgPSBodHRwLmNyZWF0ZVNlcnZlcihhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcS51cmwhLCBgaHR0cDovLyR7cmVxLmhlYWRlcnMuaG9zdH1gKVxuXG4gICAgaWYgKHVybC5wYXRobmFtZSA9PT0gXCIvc3RhbmRhbG9uZS5taW4uanNcIikge1xuICAgICAgY29uc3Qgc3RhbmRhbG9uZUZpbGVQYXRoID1cbiAgICAgICAgcHJvY2Vzcy5lbnYuUlVORlJBTUVfU1RBTkRBTE9ORV9GSUxFX1BBVEggfHxcbiAgICAgICAgcGF0aC5yZXNvbHZlKFxuICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgXCJub2RlX21vZHVsZXNcIixcbiAgICAgICAgICBcIkB0c2NpcmN1aXQvcnVuZnJhbWUvZGlzdC9zdGFuZGFsb25lLm1pbi5qc1wiLFxuICAgICAgICApXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoc3RhbmRhbG9uZUZpbGVQYXRoLCBcInV0ZjhcIilcbiAgICAgICAgcmVzLndyaXRlSGVhZCgyMDAsIHtcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHQ7IGNoYXJzZXQ9dXRmLThcIixcbiAgICAgICAgfSlcbiAgICAgICAgcmVzLmVuZChjb250ZW50KVxuICAgICAgICByZXR1cm5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBzZXJ2aW5nIHN0YW5kYWxvbmUubWluLmpzOlwiLCBlcnJvcilcbiAgICAgIH1cblxuICAgICAgcmVzLndyaXRlSGVhZCgzMDIsIHtcbiAgICAgICAgTG9jYXRpb246IGBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0B0c2NpcmN1aXQvcnVuZnJhbWVAJHtwa2cuZGVwZW5kZW5jaWVzW1wiQHRzY2lyY3VpdC9ydW5mcmFtZVwiXS5yZXBsYWNlKC9eW14wLTldKy8sIFwiXCIpfS9kaXN0L3N0YW5kYWxvbmUubWluLmpzYCxcbiAgICAgIH0pXG4gICAgICByZXMuZW5kKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh1cmwucGF0aG5hbWUgPT09IFwiL1wiKSB7XG4gICAgICBjb25zdCBodG1sID0gYXdhaXQgZ2V0SW5kZXgoKVxuICAgICAgcmVzLndyaXRlSGVhZCgyMDAsIHsgXCJDb250ZW50LVR5cGVcIjogXCJ0ZXh0L2h0bWxcIiB9KVxuICAgICAgcmVzLmVuZChodG1sKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHVybC5wYXRobmFtZS5zdGFydHNXaXRoKFwiL2FwaS9cIikpIHtcbiAgICAgIHJlcS51cmwgPSByZXEudXJsIS5yZXBsYWNlKFwiL2FwaS9cIiwgXCIvXCIpXG4gICAgICBmaWxlU2VydmVySGFuZGxlcihyZXEsIHJlcylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHJlcy53cml0ZUhlYWQoNDA0KVxuICAgIHJlcy5lbmQoXCJOb3QgZm91bmRcIilcbiAgfSlcblxuICByZXR1cm4gbmV3IFByb21pc2U8eyBzZXJ2ZXI6IGh0dHAuU2VydmVyIH0+KChyZXNvbHZlKSA9PiB7XG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCAoKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhgU2VydmVyIHJ1bm5pbmcgYXQgaHR0cDovL2xvY2FsaG9zdDoke3BvcnR9YClcbiAgICAgIHJlc29sdmUoeyBzZXJ2ZXIgfSlcbiAgICB9KVxuICB9KVxufVxuIiwgIntcbiAgXCJuYW1lXCI6IFwiQHRzY2lyY3VpdC9jbGlcIixcbiAgXCJtYWluXCI6IFwiZGlzdC9tYWluLmpzXCIsXG4gIFwidHlwZVwiOiBcIm1vZHVsZVwiLFxuICBcInZlcnNpb25cIjogXCIwLjEuMjBcIixcbiAgXCJiaW5cIjoge1xuICAgIFwidHNjaVwiOiBcIi4vZGlzdC9tYWluLmpzXCJcbiAgfSxcbiAgXCJzY3JpcHRzXCI6IHtcbiAgICBcInN0YXJ0XCI6IFwiYnVuIHJ1biBkZXZcIixcbiAgICBcImRldlwiOiBcImJ1biAtLWhvdCAuL2NsaS9tYWluLnRzIGRldiAuL2V4YW1wbGUtZGlyL3NuaXBwZXQxLWJhc2ljLnRzeFwiLFxuICAgIFwiYnVpbGRcIjogXCJ0c3VwLW5vZGUgY2xpL21haW4udHMgLS1mb3JtYXQgZXNtIC0tc291cmNlbWFwIGlubGluZVwiLFxuICAgIFwiZm9ybWF0XCI6IFwiYmlvbWUgZm9ybWF0IC0td3JpdGUgLlwiLFxuICAgIFwiZm9ybWF0OmNoZWNrXCI6IFwiYmlvbWUgZm9ybWF0IC5cIixcbiAgICBcImNsaVwiOiBcImJ1biAuL2NsaS9tYWluLnRzXCJcbiAgfSxcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiQGJpb21lanMvYmlvbWVcIjogXCJeMS45LjRcIixcbiAgICBcIkB0c2NpcmN1aXQvY29yZVwiOiBcIl4wLjAuMjQ5XCIsXG4gICAgXCJAdHlwZXMvYnVuXCI6IFwiXjEuMS4xNVwiLFxuICAgIFwiQHR5cGVzL2NvbmZpZ3N0b3JlXCI6IFwiXjYuMC4yXCIsXG4gICAgXCJAdHlwZXMvcmVhY3RcIjogXCJeMTkuMC4xXCIsXG4gICAgXCJAdHlwZXMvc2VtdmVyXCI6IFwiXjcuNS44XCIsXG4gICAgXCJnZXQtcG9ydFwiOiBcIl43LjEuMFwiLFxuICAgIFwidGVtcHlcIjogXCJeMy4xLjBcIixcbiAgICBcInRzdXBcIjogXCJeOC4zLjVcIixcbiAgICBcInR5cGVkLWt5XCI6IFwiXjAuMC40XCJcbiAgfSxcbiAgXCJwZWVyRGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcInR5cGVzY3JpcHRcIjogXCJeNS4wLjBcIlxuICB9LFxuICBcImRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAdHNjaXJjdWl0L2ZpbGUtc2VydmVyXCI6IFwiXjAuMC4xM1wiLFxuICAgIFwiQHRzY2lyY3VpdC9ydW5mcmFtZVwiOiBcIl4wLjAuNDdcIixcbiAgICBcImNob2tpZGFyXCI6IFwiXjQuMC4xXCIsXG4gICAgXCJjb21tYW5kZXJcIjogXCJeMTIuMS4wXCIsXG4gICAgXCJjb25maWdzdG9yZVwiOiBcIl43LjAuMFwiLFxuICAgIFwiY29zbWljb25maWdcIjogXCJeOS4wLjBcIixcbiAgICBcImRlbGF5XCI6IFwiXjYuMC4wXCIsXG4gICAgXCJqd3QtZGVjb2RlXCI6IFwiXjQuMC4wXCIsXG4gICAgXCJreVwiOiBcIl4xLjcuNFwiLFxuICAgIFwibWFrZS12ZnNcIjogXCJeMS4wLjE1XCIsXG4gICAgXCJwZXJmZWN0LWNsaVwiOiBcIl4xLjAuMjBcIixcbiAgICBcInNlbXZlclwiOiBcIl43LjYuM1wiXG4gIH1cbn1cbiIsICJpbXBvcnQgcGtnIGZyb20gXCIuLi8uLi9wYWNrYWdlLmpzb25cIlxuXG5leHBvcnQgY29uc3QgZ2V0SW5kZXggPSBhc3luYyAoKSA9PiB7XG4gIHJldHVybiBgPGh0bWw+XG4gICAgPGhlYWQ+XG4gICAgPC9oZWFkPlxuICAgIDxib2R5PlxuICAgICAgPHNjcmlwdCBzcmM9XCJodHRwczovL2Nkbi50YWlsd2luZGNzcy5jb21cIj48L3NjcmlwdD5cbiAgICAgIDxkaXYgaWQ9XCJyb290XCI+bG9hZGluZy4uLjwvZGl2PlxuICAgICAgPHNjcmlwdD5cbiAgICAgIGdsb2JhbFRoaXMucHJvY2VzcyA9IHsgZW52OiB7IE5PREVfRU5WOiBcInByb2R1Y3Rpb25cIiB9IH1cbiAgICAgIDwvc2NyaXB0PlxuICAgICAgPHNjcmlwdCBzcmM9XCIvc3RhbmRhbG9uZS5taW4uanNcIj48L3NjcmlwdD5cbiAgICA8L2JvZHk+XG4gIDwvaHRtbD5gXG59XG5cbi8vIDxzY3JpcHQgc3JjPVwiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9AdHNjaXJjdWl0L3J1bmZyYW1lQCR7cGtnLmRlcGVuZGVuY2llc1tcIkB0c2NpcmN1aXQvcnVuZnJhbWVcIl0ucmVwbGFjZSgvXlteMC05XSsvLCBcIlwiKX0vZGlzdC9zdGFuZGFsb25lLm1pbi5qc1wiPjwvc2NyaXB0PlxuIiwgImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJldmVudHNcIlxuXG5pbnRlcmZhY2UgRXZlbnQge1xuICBldmVudF9pZDogc3RyaW5nXG4gIGNyZWF0ZWRfYXQ6IHN0cmluZ1xuICBldmVudF90eXBlOiBzdHJpbmdcbiAgW2tleTogc3RyaW5nXTogYW55XG59XG5cbmludGVyZmFjZSBFdmVudHNSZXNwb25zZSB7XG4gIGV2ZW50X2xpc3Q6IEV2ZW50W11cbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50c1dhdGNoZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBwcml2YXRlIGxhc3RQb2xsVGltZTogc3RyaW5nXG4gIHByaXZhdGUgcG9sbEludGVydmFsOiBudW1iZXJcbiAgcHJpdmF0ZSBiYXNlVXJsOiBzdHJpbmdcbiAgcHJpdmF0ZSBwb2xsaW5nID0gZmFsc2VcbiAgcHJpdmF0ZSB0aW1lb3V0SWQ/OiBOb2RlSlMuVGltZW91dFxuXG4gIGNvbnN0cnVjdG9yKGJhc2VVcmwgPSBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMFwiLCBwb2xsSW50ZXJ2YWwgPSAxMDAwKSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmxcbiAgICB0aGlzLnBvbGxJbnRlcnZhbCA9IHBvbGxJbnRlcnZhbFxuICAgIHRoaXMubGFzdFBvbGxUaW1lID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gIH1cblxuICBhc3luYyBzdGFydCgpIHtcbiAgICBpZiAodGhpcy5wb2xsaW5nKSByZXR1cm5cbiAgICB0aGlzLnBvbGxpbmcgPSB0cnVlXG4gICAgYXdhaXQgdGhpcy5wb2xsKClcbiAgfVxuXG4gIHN0b3AoKSB7XG4gICAgdGhpcy5wb2xsaW5nID0gZmFsc2VcbiAgICBpZiAodGhpcy50aW1lb3V0SWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBvbGwoKSB7XG4gICAgaWYgKCF0aGlzLnBvbGxpbmcpIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICAgIGAke3RoaXMuYmFzZVVybH0vYXBpL2V2ZW50cy9saXN0P3NpbmNlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMubGFzdFBvbGxUaW1lKX1gLFxuICAgICAgKVxuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCBlcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhOiBFdmVudHNSZXNwb25zZSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuXG4gICAgICAvLyBVcGRhdGUgbGFzdCBwb2xsIHRpbWUgdG8gbGF0ZXN0IGV2ZW50IG9yIGN1cnJlbnQgdGltZVxuICAgICAgY29uc3QgbGF0ZXN0RXZlbnQgPSBkYXRhLmV2ZW50X2xpc3RbZGF0YS5ldmVudF9saXN0Lmxlbmd0aCAtIDFdXG4gICAgICB0aGlzLmxhc3RQb2xsVGltZSA9IGxhdGVzdEV2ZW50XG4gICAgICAgID8gbGF0ZXN0RXZlbnQuY3JlYXRlZF9hdFxuICAgICAgICA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuXG4gICAgICAvLyBFbWl0IGV2ZW50cyBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyXG4gICAgICBkYXRhLmV2ZW50X2xpc3QuZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5lbWl0KGV2ZW50LmV2ZW50X3R5cGUsIGV2ZW50KVxuICAgICAgICB0aGlzLmVtaXQoXCIqXCIsIGV2ZW50KVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5lbWl0KFwiZXJyb3JcIiwgZXJyb3IpXG4gICAgfVxuICAgIC8vIFNjaGVkdWxlIG5leHQgcG9sbFxuICAgIHRoaXMudGltZW91dElkID0gZ2xvYmFsVGhpcy5zZXRUaW1lb3V0KFxuICAgICAgKCkgPT4gdGhpcy5wb2xsKCksXG4gICAgICB0aGlzLnBvbGxJbnRlcnZhbCxcbiAgICApIGFzIHVua25vd24gYXMgTm9kZUpTLlRpbWVvdXRcbiAgfVxufVxuIiwgImltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBmaW5kSW1wb3J0c0luU25pcHBldCB9IGZyb20gXCIuL2ZpbmRJbXBvcnRzSW5TbmlwcGV0XCJcbmltcG9ydCB7IGluc3RhbGxOb2RlTW9kdWxlVHlwZXNGb3JTbmlwcGV0IH0gZnJvbSBcIi4vaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXRcIlxuXG5leHBvcnQgY2xhc3MgRmlsZXN5c3RlbVR5cGVzSGFuZGxlciB7XG4gIHByaXZhdGUgcHJvamVjdFJvb3Q6IHN0cmluZ1xuXG4gIGNvbnN0cnVjdG9yKGluaXRpYWxEaXI6IHN0cmluZykge1xuICAgIHRoaXMucHJvamVjdFJvb3QgPSB0aGlzLmZpbmRQcm9qZWN0Um9vdChpbml0aWFsRGlyKVxuICB9XG5cbiAgYXN5bmMgaGFuZGxlSW5pdGlhbFR5cGVEZXBlbmRlbmNpZXMoZmlsZVBhdGg6IHN0cmluZykge1xuICAgIGNvbnNvbGUubG9nKFwiQ2hlY2tpbmcgaW5pdGlhbCB0eXBlIGRlcGVuZGVuY2llcy4uLlwiKVxuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMuYXJlVHlwZXNJbnN0YWxsZWQoZmlsZVBhdGgpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiSW5zdGFsbGluZyBtaXNzaW5nIGluaXRpYWwgdHlwZXMuLi5cIilcbiAgICAgICAgYXdhaXQgaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXQoZmlsZVBhdGgpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkVycm9yIGhhbmRsaW5nIGluaXRpYWwgdHlwZSBkZXBlbmRlbmNpZXM6XCIsIGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUZpbGVUeXBlRGVwZW5kZW5jaWVzKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLmFyZVR5cGVzSW5zdGFsbGVkKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkluc3RhbGxpbmcgbWlzc2luZyBmaWxlIHR5cGVzLi4uXCIpXG4gICAgICAgIGF3YWl0IGluc3RhbGxOb2RlTW9kdWxlVHlwZXNGb3JTbmlwcGV0KGZpbGVQYXRoKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJGYWlsZWQgdG8gdmVyaWZ5IHR5cGVzOlwiLCBlcnJvcilcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFyZVR5cGVzSW5zdGFsbGVkKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBpbXBvcnRzID0gZmluZEltcG9ydHNJblNuaXBwZXQoZmlsZVBhdGgpXG4gICAgcmV0dXJuIGltcG9ydHMuZXZlcnkoKGltcCkgPT4gdGhpcy5jaGVja1R5cGVFeGlzdHMoaW1wKSlcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tUeXBlRXhpc3RzKGltcG9ydFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiQHRzY2kvXCIpKSByZXR1cm4gdHJ1ZVxuXG4gICAgY29uc3QgcGF0aFdpdGhvdXRQcmVmaXggPSBpbXBvcnRQYXRoLnJlcGxhY2UoXCJAdHNjaS9cIiwgXCJcIilcbiAgICBjb25zdCBbb3duZXIsIG5hbWVdID0gcGF0aFdpdGhvdXRQcmVmaXguc3BsaXQoXCIuXCIpXG5cbiAgICBjb25zdCB0eXBlUGF0aCA9IHBhdGguam9pbihcbiAgICAgIHRoaXMucHJvamVjdFJvb3QsXG4gICAgICBcIm5vZGVfbW9kdWxlc1wiLFxuICAgICAgXCJAdHNjaVwiLFxuICAgICAgYCR7b3duZXJ9LiR7bmFtZX1gLFxuICAgICAgXCJpbmRleC5kLnRzXCIsXG4gICAgKVxuXG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmModHlwZVBhdGgpXG4gIH1cblxuICBwcml2YXRlIGZpbmRQcm9qZWN0Um9vdChzdGFydERpcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcm9vdCA9IHBhdGgucmVzb2x2ZShzdGFydERpcilcbiAgICB3aGlsZSAocm9vdCAhPT0gcGF0aC5wYXJzZShyb290KS5yb290KSB7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdCwgXCJwYWNrYWdlLmpzb25cIikpKSB7XG4gICAgICAgIHJldHVybiByb290XG4gICAgICB9XG4gICAgICByb290ID0gcGF0aC5kaXJuYW1lKHJvb3QpXG4gICAgfVxuICAgIHJldHVybiBzdGFydERpclxuICB9XG59XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgdHMgZnJvbSBcInR5cGVzY3JpcHRcIlxuXG5leHBvcnQgZnVuY3Rpb24gZmluZEltcG9ydHNJblNuaXBwZXQoc25pcHBldFBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzbmlwcGV0UGF0aCwgXCJ1dGYtOFwiKVxuICBjb25zdCBzb3VyY2VGaWxlID0gdHMuY3JlYXRlU291cmNlRmlsZShcbiAgICBzbmlwcGV0UGF0aCxcbiAgICBjb250ZW50LFxuICAgIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsXG4gICAgdHJ1ZSxcbiAgKVxuXG4gIGNvbnN0IGltcG9ydHM6IHN0cmluZ1tdID0gW11cblxuICBmdW5jdGlvbiB2aXNpdChub2RlOiB0cy5Ob2RlKSB7XG4gICAgaWYgKHRzLmlzSW1wb3J0RGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgIGNvbnN0IG1vZHVsZVNwZWNpZmllciA9IG5vZGUubW9kdWxlU3BlY2lmaWVyXG4gICAgICBpZiAobW9kdWxlU3BlY2lmaWVyICYmIHRzLmlzU3RyaW5nTGl0ZXJhbChtb2R1bGVTcGVjaWZpZXIpKSB7XG4gICAgICAgIGNvbnN0IGltcG9ydFBhdGggPSBtb2R1bGVTcGVjaWZpZXIudGV4dFxuICAgICAgICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiQHRzY2kvXCIpKSB7XG4gICAgICAgICAgaW1wb3J0cy5wdXNoKGltcG9ydFBhdGgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdHMuZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0KVxuICB9XG5cbiAgdmlzaXQoc291cmNlRmlsZSlcblxuICByZXR1cm4gaW1wb3J0c1xufVxuIiwgImltcG9ydCBDb25maWdzdG9yZSBmcm9tIFwiY29uZmlnc3RvcmVcIlxuaW1wb3J0IHR5cGUgeyBUeXBlZENvbmZpZ3N0b3JlIH0gZnJvbSBcIi4vVHlwZWRDb25maWdTdG9yZVwiXG5pbXBvcnQgeyBqd3REZWNvZGUgfSBmcm9tIFwiand0LWRlY29kZVwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpQ29uZmlnIHtcbiAgc2Vzc2lvblRva2VuPzogc3RyaW5nXG4gIGdpdGh1YlVzZXJuYW1lPzogc3RyaW5nXG4gIHJlZ2lzdHJ5QXBpVXJsPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBjbGlDb25maWc6IFR5cGVkQ29uZmlnc3RvcmU8Q2xpQ29uZmlnPiA9IG5ldyBDb25maWdzdG9yZShcbiAgXCJ0c2NpcmN1aXRcIixcbilcblxuZXhwb3J0IGNvbnN0IHNldFNlc3Npb25Ub2tlbiA9ICh0b2tlbjogc3RyaW5nKSA9PiB7XG4gIGNsaUNvbmZpZy5zZXQoXCJzZXNzaW9uVG9rZW5cIiwgdG9rZW4pXG4gIGNvbnN0IGRlY29kZWQgPSBqd3REZWNvZGU8e1xuICAgIGdpdGh1Yl91c2VybmFtZTogc3RyaW5nXG4gIH0+KHRva2VuKVxuICBjbGlDb25maWcuc2V0KFwiZ2l0aHViVXNlcm5hbWVcIiwgZGVjb2RlZC5naXRodWJfdXNlcm5hbWUpXG59XG5cbmV4cG9ydCBjb25zdCBjbGVhclNlc3Npb24gPSAoKSA9PiB7XG4gIGNsaUNvbmZpZy5kZWxldGUoXCJzZXNzaW9uVG9rZW5cIilcbiAgY2xpQ29uZmlnLmRlbGV0ZShcImdpdGh1YlVzZXJuYW1lXCIpXG59XG5cbmV4cG9ydCBjb25zdCBnZXRSZWdpc3RyeUFwaVVybCA9ICgpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gY2xpQ29uZmlnLmdldChcInJlZ2lzdHJ5QXBpVXJsXCIpID8/IFwiaHR0cHM6Ly9yZWdpc3RyeS1hcGkudHNjaXJjdWl0LmNvbVwiXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBzZXRTZXNzaW9uVG9rZW4gfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuaW1wb3J0IGRlbGF5IGZyb20gXCJkZWxheVwiXG5pbXBvcnQgeyBnZXRLeSB9IGZyb20gXCJsaWIvcmVnaXN0cnktYXBpL2dldC1reVwiXG5pbXBvcnQgdHlwZSB7IEVuZHBvaW50UmVzcG9uc2UgfSBmcm9tIFwibGliL3JlZ2lzdHJ5LWFwaS9lbmRwb2ludC10eXBlc1wiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckF1dGhMb2dpbiA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIC8vIERlZmluZSB0aGUgbG9naW4gYWN0aW9uIG9uY2UgdG8gc2hhcmUgYmV0d2VlbiBib3RoIGNvbW1hbmRzXG4gIGNvbnN0IGxvZ2luQWN0aW9uID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGt5ID0gZ2V0S3koKVxuXG4gICAgY29uc3QgeyBsb2dpbl9wYWdlIH0gPSBhd2FpdCBreVxuICAgICAgLnBvc3Q8RW5kcG9pbnRSZXNwb25zZVtcInNlc3Npb25zL2xvZ2luX3BhZ2UvY3JlYXRlXCJdPihcbiAgICAgICAgXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2NyZWF0ZVwiLFxuICAgICAgICB7XG4gICAgICAgICAganNvbjoge30sXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgICAuanNvbigpXG5cbiAgICBjb25zb2xlLmxvZyhcIlBsZWFzZSB2aXNpdCB0aGUgZm9sbG93aW5nIFVSTCB0byBsb2cgaW46XCIpXG4gICAgY29uc29sZS5sb2cobG9naW5fcGFnZS51cmwpXG5cbiAgICAvLyBXYWl0IHVudGlsIHdlIHJlY2VpdmUgY29uZmlybWF0aW9uXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHsgbG9naW5fcGFnZTogbmV3X2xvZ2luX3BhZ2UgfSA9IGF3YWl0IGt5XG4gICAgICAgIC5wb3N0PEVuZHBvaW50UmVzcG9uc2VbXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2dldFwiXT4oXG4gICAgICAgICAgXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2dldFwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGpzb246IHtcbiAgICAgICAgICAgICAgbG9naW5fcGFnZV9pZDogbG9naW5fcGFnZS5sb2dpbl9wYWdlX2lkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2xvZ2luX3BhZ2UubG9naW5fcGFnZV9hdXRoX3Rva2VufWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgICAgLmpzb24oKVxuXG4gICAgICBpZiAobmV3X2xvZ2luX3BhZ2Uud2FzX2xvZ2luX3N1Y2Nlc3NmdWwpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJMb2dnZWQgaW4hIEdlbmVyYXRpbmcgdG9rZW4uLi5cIilcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgaWYgKG5ld19sb2dpbl9wYWdlLmlzX2V4cGlyZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTG9naW4gcGFnZSBleHBpcmVkXCIpXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGRlbGF5KDEwMDApXG4gICAgfVxuXG4gICAgY29uc3QgeyBzZXNzaW9uIH0gPSBhd2FpdCBreVxuICAgICAgLnBvc3Q8RW5kcG9pbnRSZXNwb25zZVtcInNlc3Npb25zL2xvZ2luX3BhZ2UvZXhjaGFuZ2VfZm9yX2NsaV9zZXNzaW9uXCJdPihcbiAgICAgICAgXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2V4Y2hhbmdlX2Zvcl9jbGlfc2Vzc2lvblwiLFxuICAgICAgICB7XG4gICAgICAgICAganNvbjoge1xuICAgICAgICAgICAgbG9naW5fcGFnZV9pZDogbG9naW5fcGFnZS5sb2dpbl9wYWdlX2lkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2xvZ2luX3BhZ2UubG9naW5fcGFnZV9hdXRoX3Rva2VufWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIClcbiAgICAgIC5qc29uKClcblxuICAgIHNldFNlc3Npb25Ub2tlbihzZXNzaW9uLnRva2VuKVxuICAgIGNvbnNvbGUubG9nKFwiXFxuUmVhZHkgdG8gdXNlIVwiKVxuICB9XG5cbiAgLy8gUmVnaXN0ZXIgdGhlIGF1dGggbG9naW4gc3ViY29tbWFuZFxuICBwcm9ncmFtLmNvbW1hbmRzXG4gICAgLmZpbmQoKGMpID0+IGMubmFtZSgpID09PSBcImF1dGhcIikhXG4gICAgLmNvbW1hbmQoXCJsb2dpblwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkF1dGhlbnRpY2F0ZSBDTEksIGxvZ2luIHRvIHJlZ2lzdHJ5XCIpXG4gICAgLmFjdGlvbihsb2dpbkFjdGlvbilcblxuICAvLyBSZWdpc3RlciB0aGUgdG9wLWxldmVsIGxvZ2luIGNvbW1hbmQgYXMgYW4gYWxpYXNcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKFwibG9naW5cIilcbiAgICAuZGVzY3JpcHRpb24oXCJMb2dpbiB0byB0c2NpcmN1aXQgcmVnaXN0cnlcIilcbiAgICAuYWN0aW9uKGxvZ2luQWN0aW9uKVxufVxuIiwgImltcG9ydCB7IGdldFJlZ2lzdHJ5QXBpVXJsIH0gZnJvbSBcImxpYi9jbGktY29uZmlnXCJcbmltcG9ydCBreSwgeyB0eXBlIEFmdGVyUmVzcG9uc2VIb29rIH0gZnJvbSBcImt5XCJcblxuY29uc3QgcHJldHR5UmVzcG9uc2VFcnJvckhvb2s6IEFmdGVyUmVzcG9uc2VIb29rID0gYXN5bmMgKFxuICBfcmVxdWVzdCxcbiAgX29wdGlvbnMsXG4gIHJlc3BvbnNlLFxuKSA9PiB7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXJyb3JEYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBGQUlMIFske3Jlc3BvbnNlLnN0YXR1c31dOiAke19yZXF1ZXN0Lm1ldGhvZH0gJHtcbiAgICAgICAgICBuZXcgVVJMKF9yZXF1ZXN0LnVybCkucGF0aG5hbWVcbiAgICAgICAgfSBcXG5cXG4gJHtKU09OLnN0cmluZ2lmeShlcnJvckRhdGEsIG51bGwsIDIpfWAsXG4gICAgICApXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy9pZ25vcmUsIGFsbG93IHRoZSBlcnJvciB0byBiZSB0aHJvd25cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldEt5ID0gKCkgPT4ge1xuICByZXR1cm4ga3kuY3JlYXRlKHtcbiAgICBwcmVmaXhVcmw6IGdldFJlZ2lzdHJ5QXBpVXJsKCksXG4gICAgaG9va3M6IHtcbiAgICAgIGFmdGVyUmVzcG9uc2U6IFtwcmV0dHlSZXNwb25zZUVycm9ySG9va10sXG4gICAgfSxcbiAgfSlcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IGNsZWFyU2Vzc2lvbiB9IGZyb20gXCJsaWIvY2xpLWNvbmZpZ1wiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckF1dGhMb2dvdXQgPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBjb25zdCBsb2dvdXRBY3Rpb24gPSAoKSA9PiB7XG4gICAgY2xlYXJTZXNzaW9uKClcbiAgICBjb25zb2xlLmxvZyhcIllvdSBoYXZlIGJlZW4gbG9nZ2VkIG91dCFcIilcbiAgfVxuXG4gIC8vIFJlZ2lzdGVyIHRoZSBhdXRoIGxvZ291dCBzdWJjb21tYW5kXG4gIHByb2dyYW0uY29tbWFuZHNcbiAgICAuZmluZCgoYykgPT4gYy5uYW1lKCkgPT09IFwiYXV0aFwiKSFcbiAgICAuY29tbWFuZChcImxvZ291dFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkxvZ291dCBmcm9tIHJlZ2lzdHJ5XCIpXG4gICAgLmFjdGlvbihsb2dvdXRBY3Rpb24pXG5cbiAgLy8gUmVnaXN0ZXIgdGhlIHRvcC1sZXZlbCBsb2dvdXQgY29tbWFuZCBhcyBhbiBhbGlhc1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoXCJsb2dvdXRcIilcbiAgICAuZGVzY3JpcHRpb24oXCJMb2dvdXQgZnJvbSB0c2NpcmN1aXQgcmVnaXN0cnlcIilcbiAgICAuYWN0aW9uKGxvZ291dEFjdGlvbilcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQXV0aCA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZChcImF1dGhcIikuZGVzY3JpcHRpb24oXCJMb2dpbi9sb2dvdXRcIilcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQ29uZmlnID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbS5jb21tYW5kKFwiY29uZmlnXCIpLmRlc2NyaXB0aW9uKFwiTWFuYWdlIHRzY2lyY3VpdCBDTEkgY29uZmlndXJhdGlvblwiKVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgY2xpQ29uZmlnIH0gZnJvbSBcImxpYi9jbGktY29uZmlnXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQ29uZmlnUHJpbnQgPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtLmNvbW1hbmRzXG4gICAgLmZpbmQoKGMpID0+IGMubmFtZSgpID09PSBcImNvbmZpZ1wiKSFcbiAgICAuY29tbWFuZChcInByaW50XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiUHJpbnQgdGhlIGN1cnJlbnQgY29uZmlnXCIpXG4gICAgLmFjdGlvbigoKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShjbGlDb25maWcuYWxsLCBudWxsLCAyKSlcbiAgICB9KVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgZ2V0S3kgfSBmcm9tIFwibGliL3JlZ2lzdHJ5LWFwaS9nZXQta3lcIlxuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQ2xvbmUgPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoXCJjbG9uZVwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkNsb25lIGEgc25pcHBldCBmcm9tIHRoZSByZWdpc3RyeVwiKVxuICAgIC5hcmd1bWVudChcIjxzbmlwcGV0PlwiLCBcIlNuaXBwZXQgdG8gY2xvbmUgKGUuZy4gYXV0aG9yL3NuaXBwZXROYW1lKVwiKVxuICAgIC5hY3Rpb24oYXN5bmMgKHNuaXBwZXRQYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgIGxldCBhdXRob3I6IHN0cmluZ1xuICAgICAgbGV0IHNuaXBwZXROYW1lOiBzdHJpbmdcbiAgICAgIGlmICghc25pcHBldFBhdGguc3RhcnRzV2l0aChcIkB0c2NpL1wiKSAmJiBzbmlwcGV0UGF0aC5pbmNsdWRlcyhcIi9cIikpIHtcbiAgICAgICAgO1thdXRob3IsIHNuaXBwZXROYW1lXSA9IHNuaXBwZXRQYXRoLnNwbGl0KFwiL1wiKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdHJpbW1lZFBhdGggPSBzbmlwcGV0UGF0aC5yZXBsYWNlKFwiQHRzY2kvXCIsIFwiXCIpXG4gICAgICAgIGNvbnN0IGZpcnN0RG90SW5kZXggPSB0cmltbWVkUGF0aC5pbmRleE9mKFwiLlwiKVxuICAgICAgICBhdXRob3IgPSB0cmltbWVkUGF0aC5zbGljZSgwLCBmaXJzdERvdEluZGV4KVxuICAgICAgICBzbmlwcGV0TmFtZSA9IHRyaW1tZWRQYXRoLnNsaWNlKGZpcnN0RG90SW5kZXggKyAxKVxuICAgICAgfVxuXG4gICAgICBpZiAoIWF1dGhvciB8fCAhc25pcHBldE5hbWUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBcIkludmFsaWQgc25pcHBldCBwYXRoLiBVc2UgZm9ybWF0OiBhdXRob3Ivc25pcHBldE5hbWUsIGF1dGhvci5zbmlwcGV0TmFtZSBvciBAdHNjaS9hdXRob3Iuc25pcHBldE5hbWVcIixcbiAgICAgICAgKVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICAgIH1cblxuICAgICAgY29uc3Qga3kgPSBnZXRLeSgpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBDbG9uaW5nICR7YXV0aG9yfS8ke3NuaXBwZXROYW1lfS4uLmApXG5cbiAgICAgICAgY29uc3QgcGFja2FnZUZpbGVMaXN0ID0gYXdhaXQga3lcbiAgICAgICAgICAucG9zdDx7XG4gICAgICAgICAgICBwYWNrYWdlX2ZpbGVzOiBBcnJheTx7XG4gICAgICAgICAgICAgIHBhY2thZ2VfZmlsZV9pZDogc3RyaW5nXG4gICAgICAgICAgICAgIHBhY2thZ2VfcmVsZWFzZV9pZDogc3RyaW5nXG4gICAgICAgICAgICAgIGZpbGVfcGF0aDogc3RyaW5nXG4gICAgICAgICAgICAgIGNyZWF0ZWRfYXQ6IHN0cmluZ1xuICAgICAgICAgICAgfT5cbiAgICAgICAgICB9PihcInBhY2thZ2VfZmlsZXMvbGlzdFwiLCB7XG4gICAgICAgICAgICBqc29uOiB7XG4gICAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogYCR7YXV0aG9yfS8ke3NuaXBwZXROYW1lfWAsXG4gICAgICAgICAgICAgIHVzZV9sYXRlc3RfdmVyc2lvbjogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuanNvbigpXG5cbiAgICAgICAgLy8gQ3JlYXRlIGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICAgIGNvbnN0IGRpclBhdGggPSBgLi8ke2F1dGhvcn0uJHtzbmlwcGV0TmFtZX1gXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkge1xuICAgICAgICAgIGZzLm1rZGlyU3luYyhkaXJQYXRoKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG93bmxvYWQgZWFjaCBmaWxlIHRoYXQgZG9lc24ndCBzdGFydCB3aXRoIGRpc3QvXG4gICAgICAgIGZvciAoY29uc3QgZmlsZUluZm8gb2YgcGFja2FnZUZpbGVMaXN0LnBhY2thZ2VfZmlsZXMpIHtcbiAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGZpbGVJbmZvLmZpbGVfcGF0aC5zdGFydHNXaXRoKFwiL1wiKVxuICAgICAgICAgICAgPyBmaWxlSW5mby5maWxlX3BhdGguc2xpY2UoMSlcbiAgICAgICAgICAgIDogZmlsZUluZm8uZmlsZV9wYXRoXG5cbiAgICAgICAgICBpZiAoZmlsZVBhdGguc3RhcnRzV2l0aChcImRpc3QvXCIpKSBjb250aW51ZVxuXG4gICAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBhd2FpdCBreVxuICAgICAgICAgICAgLnBvc3Q8e1xuICAgICAgICAgICAgICBwYWNrYWdlX2ZpbGU6IHtcbiAgICAgICAgICAgICAgICBjb250ZW50X3RleHQ6IHN0cmluZ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9PihcInBhY2thZ2VfZmlsZXMvZ2V0XCIsIHtcbiAgICAgICAgICAgICAganNvbjoge1xuICAgICAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogYCR7YXV0aG9yfS8ke3NuaXBwZXROYW1lfWAsXG4gICAgICAgICAgICAgICAgZmlsZV9wYXRoOiBmaWxlSW5mby5maWxlX3BhdGgsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmpzb24oKVxuXG4gICAgICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZVBhdGgpXG4gICAgICAgICAgY29uc3QgZGlyTmFtZSA9IHBhdGguZGlybmFtZShmdWxsUGF0aClcblxuICAgICAgICAgIC8vIENyZWF0ZSBuZXN0ZWQgZGlyZWN0b3JpZXMgaWYgdGhleSBkb24ndCBleGlzdFxuICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhkaXJOYW1lKSkge1xuICAgICAgICAgICAgZnMubWtkaXJTeW5jKGRpck5hbWUsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhmdWxsUGF0aCwgZmlsZUNvbnRlbnQucGFja2FnZV9maWxlLmNvbnRlbnRfdGV4dClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5wbXJjUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBcIi5ucG1yY1wiKVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKG5wbXJjUGF0aCwgXCJAdHNjaTpyZWdpc3RyeT1odHRwczovL25wbS50c2NpcmN1aXQuY29tXCIpXG5cbiAgICAgICAgY29uc29sZS5sb2coYFN1Y2Nlc3NmdWxseSBjbG9uZWQgdG8gLi8ke2F1dGhvcn0uJHtzbmlwcGV0TmFtZX0vYClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBjbG9uZSBzbmlwcGV0OlwiLCBlcnJvci5tZXNzYWdlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gY2xvbmUgc25pcHBldDpcIiwgZXJyb3IpXG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgICB9XG4gICAgfSlcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IGNyZWF0ZUNpcmN1aXRXZWJXb3JrZXIgfSBmcm9tIFwiQHRzY2lyY3VpdC9ldmFsLXdlYndvcmtlclwiXG5pbXBvcnQgd2ViV29ya2VyQnVuZGxlVXJsIGZyb20gXCJAdHNjaXJjdWl0L2V2YWwtd2Vid29ya2VyL2Jsb2ItdXJsXCJcbmltcG9ydCB7IGdldFZpcnR1YWxGaWxlU3lzdGVtRnJvbURpclBhdGggfSBmcm9tIFwibWFrZS12ZnNcIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuXG5jb25zdCBBTExPV0VEX0ZPUk1BVFMgPSBbXG4gIFwianNvblwiLFxuICBcImNpcmN1aXQtanNvblwiLFxuICBcInNjaGVtYXRpYy1zdmdcIixcbiAgXCJwY2Itc3ZnXCIsXG4gIFwiZ2VyYmVyc1wiLFxuICBcInJlYWRhYmxlLW5ldGxpc3RcIixcbiAgXCJnbHRmXCIsXG4gIFwic3BlY2N0cmEtZHNuXCIsXG5dIGFzIGNvbnN0XG5cbnR5cGUgRm9ybWF0ID0gKHR5cGVvZiBBTExPV0VEX0ZPUk1BVFMpW251bWJlcl1cblxuY29uc3QgT1VUUFVUX0VYVEVOU0lPTlMgPSB7XG4gIGpzb246IFwiLmNpcmN1aXQuanNvblwiLFxuICBcImNpcmN1aXQtanNvblwiOiBcIi5jaXJjdWl0Lmpzb25cIixcbiAgXCJzY2hlbWF0aWMtc3ZnXCI6IFwiLXNjaGVtYXRpYy5zdmdcIixcbiAgXCJwY2Itc3ZnXCI6IFwiLXBjYi5zdmdcIixcbiAgZ2VyYmVyczogXCItZ2VyYmVycy56aXBcIixcbiAgXCJyZWFkYWJsZS1uZXRsaXN0XCI6IFwiLXJlYWRhYmxlLm5ldGxpc3RcIixcbiAgZ2x0ZjogXCIuZ2x0ZlwiLFxuICBcInNwZWNjdHJhLWRzblwiOiBcIi5kc25cIixcbn1cblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyRXhwb3J0ID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKFwiZXhwb3J0XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiRXhwb3J0IHRzY2lyY3VpdCBjb2RlIHRvIHZhcmlvdXMgZm9ybWF0c1wiKVxuICAgIC5hcmd1bWVudChcIjxmaWxlPlwiLCBcIlBhdGggdG8gdGhlIHNuaXBwZXQgZmlsZVwiKVxuICAgIC5vcHRpb24oXCItZiwgLS1mb3JtYXQgPGZvcm1hdD5cIiwgXCJPdXRwdXQgZm9ybWF0XCIpXG4gICAgLm9wdGlvbihcIi1vLCAtLW91dHB1dCA8cGF0aD5cIiwgXCJPdXRwdXQgZmlsZSBwYXRoXCIpXG4gICAgLmFjdGlvbihhc3luYyAoZmlsZSwgb3B0aW9ucykgPT4ge1xuICAgICAgY29uc3QgeyBmb3JtYXQgPSBcImNpcmN1aXQtanNvblwiIH0gPSBvcHRpb25zXG4gICAgICBsZXQgeyBvdXRwdXQgfSA9IG9wdGlvbnNcbiAgICAgIGlmICghQUxMT1dFRF9GT1JNQVRTLmluY2x1ZGVzKGZvcm1hdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIGZvcm1hdDogJHtmb3JtYXR9XFxuU3VwcG9ydGVkIGZvcm1hdHM6ICR7QUxMT1dFRF9GT1JNQVRTLmpvaW4oXCIsXCIpfWAsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgaWYgKCFvdXRwdXQpIHtcbiAgICAgICAgb3V0cHV0ID0gcGF0aC5iYXNlbmFtZShmaWxlKS5yZXBsYWNlKC9cXC5bXi5dKyQvLCBcIlwiKVxuICAgICAgfVxuXG4gICAgICBjb25zdCB3b3JrZXIgPSBhd2FpdCBjcmVhdGVDaXJjdWl0V2ViV29ya2VyKHtcbiAgICAgICAgd2ViV29ya2VyVXJsOiB3ZWJXb3JrZXJCdW5kbGVVcmwsXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBwcm9qZWN0RGlyID0gcGF0aC5kaXJuYW1lKGZpbGUpXG5cbiAgICAgIGNvbnN0IHJlbGF0aXZlQ29tcG9uZW50UGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdERpciwgZmlsZSlcblxuICAgICAgYXdhaXQgd29ya2VyLmV4ZWN1dGVXaXRoRnNNYXAoe1xuICAgICAgICBlbnRyeXBvaW50OiBcImVudHJ5cG9pbnQudHN4XCIsXG4gICAgICAgIGZzTWFwOiB7XG4gICAgICAgICAgLi4uKChhd2FpdCBnZXRWaXJ0dWFsRmlsZVN5c3RlbUZyb21EaXJQYXRoKHtcbiAgICAgICAgICAgIGRpclBhdGg6IHByb2plY3REaXIsXG4gICAgICAgICAgICBjb250ZW50Rm9ybWF0OiBcInN0cmluZ1wiLFxuICAgICAgICAgIH0pKSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSxcbiAgICAgICAgICBcImVudHJ5cG9pbnQudHN4XCI6IGBcbmltcG9ydCBNeUNpcmN1aXQgZnJvbSBcIi4vJHtyZWxhdGl2ZUNvbXBvbmVudFBhdGh9XCJcblxuY2lyY3VpdC5hZGQoPE15Q2lyY3VpdCAvPilcbiAgICAgICAgYCxcbiAgICAgICAgfSxcbiAgICAgIH0pXG5cbiAgICAgIGF3YWl0IHdvcmtlci5yZW5kZXJVbnRpbFNldHRsZWQoKVxuXG4gICAgICBjb25zdCBjaXJjdWl0SnNvbiA9IGF3YWl0IHdvcmtlci5nZXRDaXJjdWl0SnNvbigpXG5cbiAgICAgIGNvbnN0IG91dHB1dFBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgIHByb2plY3REaXIsXG4gICAgICAgIGAke291dHB1dH0ke09VVFBVVF9FWFRFTlNJT05TW2Zvcm1hdCBhcyBGb3JtYXRdfWAsXG4gICAgICApXG5cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMob3V0cHV0UGF0aCwgSlNPTi5zdHJpbmdpZnkoY2lyY3VpdEpzb24pKVxuXG4gICAgICBjb25zb2xlLmxvZyhgRXhwb3J0ZWQgdG8gJHtvdXRwdXRQYXRofWApXG5cbiAgICAgIHByb2Nlc3MuZXhpdCgwKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBjbGlDb25maWcgfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJBdXRoUHJpbnRUb2tlbiA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZHNcbiAgICAuZmluZCgoYykgPT4gYy5uYW1lKCkgPT09IFwiYXV0aFwiKSFcbiAgICAuY29tbWFuZChcInByaW50LXRva2VuXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiUHJpbnRzIHlvdXIgYXV0aCB0b2tlblwiKVxuICAgIC5hY3Rpb24oKCkgPT4ge1xuICAgICAgY29uc3QgdG9rZW4gPSBjbGlDb25maWcuZ2V0KFwic2Vzc2lvblRva2VuXCIpXG4gICAgICBpZiAoIXRva2VuKSByZXR1cm4gY29uc29sZS5sb2coXCJZb3UgbmVlZCB0byBsb2cgaW4gdG8gYWNjZXNzIHRoaXMuXCIpXG4gICAgICBjb25zb2xlLmxvZyhcIllvdXIgVG9rZW46XFxuXCIsIHRva2VuKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBzZXRTZXNzaW9uVG9rZW4gfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuXG5mdW5jdGlvbiB2YWxpZGF0ZUpXVExlbmd0aCh0b2tlbjogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcnRzID0gdG9rZW4uc3BsaXQoXCIuXCIpXG5cbiAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMyAmJiBwYXJ0cy5ldmVyeSgocGFydCkgPT4gcGFydC5sZW5ndGggPiAwKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cbmV4cG9ydCBjb25zdCByZWdpc3RlckF1dGhTZXRUb2tlbiA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZHNcbiAgICAuZmluZCgoYykgPT4gYy5uYW1lKCkgPT09IFwiYXV0aFwiKSFcbiAgICAuY29tbWFuZChcInNldC10b2tlblwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkV4cGxpY2l0bHkgc2V0IHlvdXIgYXV0aCB0b2tlblwiKVxuICAgIC5hcmd1bWVudChcIjx0b2tlbj5cIiwgXCJOZXcgdG9rZW4gdG8gbWFudWFsbHkgY29uZmlndXJlXCIpXG4gICAgLmFjdGlvbigodG9rZW4pID0+IHtcbiAgICAgIGlmICghdmFsaWRhdGVKV1RMZW5ndGgodG9rZW4pKVxuICAgICAgICByZXR1cm4gY29uc29sZS5sb2coXCJJbnZhbGlkIHRva2VuIHByb3ZpZGVkXCIpXG4gICAgICBzZXRTZXNzaW9uVG9rZW4odG9rZW4pXG4gICAgICBjb25zb2xlLmxvZyhcIlRva2VuIG1hbnVhbGx5IHVwZGF0ZWQuXCIpXG4gICAgfSlcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7OztBQUNBLFNBQVMsZUFBZTs7O0FDQXhCLFlBQVksUUFBUTtBQUNwQixZQUFZLFVBQVU7QUFFZixJQUFNLGVBQWUsQ0FBQ0EsYUFBcUI7QUFDaEQsRUFBQUEsU0FDRyxRQUFRLE1BQU0sRUFDZCxZQUFZLDZEQUE2RCxFQUN6RSxPQUFPLE1BQU07QUFDWixVQUFNLGFBQWEsUUFBUSxJQUFJO0FBRS9CLFVBQU0sZ0JBQXFCLFVBQUssWUFBWSxXQUFXO0FBQ3ZELFVBQU0sZ0JBQXFCLFVBQUssWUFBWSxRQUFRO0FBRXBELFVBQU0sZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFzQnJCLFVBQU0sZUFBZTtBQUFBO0FBQUE7QUFJckIsUUFBSSxDQUFJLGNBQVcsYUFBYSxHQUFHO0FBQ2pDLE1BQUcsaUJBQWMsZUFBZSxhQUFhLFVBQVUsQ0FBQztBQUN4RCxjQUFRLElBQUksWUFBWSxhQUFhLEVBQUU7QUFBQSxJQUN6QyxPQUFPO0FBQ0wsY0FBUSxJQUFJLFlBQVksYUFBYSxpQkFBaUI7QUFBQSxJQUN4RDtBQUVBLFFBQUksQ0FBSSxjQUFXLGFBQWEsR0FBRztBQUNqQyxNQUFHLGlCQUFjLGVBQWUsYUFBYSxVQUFVLENBQUM7QUFDeEQsY0FBUSxJQUFJLFlBQVksYUFBYSxFQUFFO0FBQUEsSUFDekMsT0FBTztBQUNMLGNBQVEsSUFBSSxZQUFZLGFBQWEsaUJBQWlC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dUJBQXVCLENBQUNDLGFBQXFCO0FBQ3hELEVBQUFBLFNBQVEsU0FDTCxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssTUFBTSxNQUFNLEVBQy9CLFFBQVEsV0FBVyxFQUNuQixZQUFZLGdDQUFnQyxFQUM1QyxTQUFTLFdBQVcsaUNBQWlDLEVBQ3JELE9BQU8sQ0FBQyxVQUFVO0FBQ2pCLFFBQUksQ0FBQyxrQkFBa0IsS0FBSztBQUMxQixhQUFPLFFBQVEsSUFBSSx3QkFBd0I7QUFDN0Msb0JBQWdCLEtBQUs7QUFDckIsWUFBUSxJQUFJLHlCQUF5QjtBQUFBLEVBQ3ZDLENBQUM7QUFDTDs7O0FyQlBBLElBQU0sVUFBVSxJQUFJLFFBQVE7QUFFNUIsUUFDRyxLQUFLLE1BQU0sRUFDWCxZQUFZLHVDQUF1QyxFQUduRCxRQUFRLE9BQU8sSUFBSSxnQkFBSSxTQUFTLE9BQU8sS0FBSyxnQkFBSSxPQUFPO0FBRTFELGFBQWEsT0FBTztBQUVwQixZQUFZLE9BQU87QUFDbkIsY0FBYyxPQUFPO0FBRXJCLGFBQWEsT0FBTztBQUNwQixrQkFBa0IsT0FBTztBQUN6QixtQkFBbUIsT0FBTztBQUMxQix1QkFBdUIsT0FBTztBQUM5QixxQkFBcUIsT0FBTztBQUU1QixlQUFlLE9BQU87QUFDdEIsb0JBQW9CLE9BQU87QUFFM0IsZUFBZSxPQUFPO0FBRXRCLElBQUksUUFBUSxLQUFLLFdBQVcsR0FBRztBQUM3QixhQUFXLFNBQVMsUUFBUSxJQUFJO0FBQ2xDLE9BQU87QUFDTCxVQUFRLE1BQU07QUFDaEI7IiwKICAibmFtZXMiOiBbInByb2dyYW0iLCAicGF0aCIsICJmcyIsICJmcyIsICJwYXRoIiwgImZzIiwgInBhdGgiLCAicmVzb2x2ZSIsICJwYXRoIiwgImZzIiwgImZzIiwgInBhdGgiLCAiZnMiLCAidHMiLCAicGF0aCIsICJmcyIsICJwcm9ncmFtIiwgInBvcnQiLCAicmVzb2x2ZSIsICJzZXJ2ZXIiLCAia3kiLCAicHJvZ3JhbSIsICJreSIsICJwcm9ncmFtIiwgInByb2dyYW0iLCAicHJvZ3JhbSIsICJwcm9ncmFtIiwgImZzIiwgInBhdGgiLCAicHJvZ3JhbSIsICJreSIsICJwYXRoIiwgImZzIiwgInByb2dyYW0iLCAicHJvZ3JhbSIsICJwcm9ncmFtIl0KfQo=
|
package/lib/cli-config/index.ts
CHANGED
|
@@ -20,6 +20,11 @@ export const setSessionToken = (token: string) => {
|
|
|
20
20
|
cliConfig.set("githubUsername", decoded.github_username)
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
+
export const clearSession = () => {
|
|
24
|
+
cliConfig.delete("sessionToken")
|
|
25
|
+
cliConfig.delete("githubUsername")
|
|
26
|
+
}
|
|
27
|
+
|
|
23
28
|
export const getRegistryApiUrl = (): string => {
|
|
24
29
|
return cliConfig.get("registryApiUrl") ?? "https://registry-api.tscircuit.com"
|
|
25
30
|
}
|