@sendly/cli 3.36.0 → 3.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +204 -1
  2. package/dist/commands/10dlc/assignments/list.d.ts +10 -0
  3. package/dist/commands/10dlc/assignments/list.js +67 -0
  4. package/dist/commands/10dlc/brands/create.d.ts +25 -0
  5. package/dist/commands/10dlc/brands/create.js +89 -0
  6. package/dist/commands/10dlc/brands/get.d.ts +13 -0
  7. package/dist/commands/10dlc/brands/get.js +63 -0
  8. package/dist/commands/10dlc/brands/list.d.ts +10 -0
  9. package/dist/commands/10dlc/brands/list.js +63 -0
  10. package/dist/commands/10dlc/campaigns/assign.d.ts +14 -0
  11. package/dist/commands/10dlc/campaigns/assign.js +64 -0
  12. package/dist/commands/10dlc/campaigns/create.d.ts +24 -0
  13. package/dist/commands/10dlc/campaigns/create.js +118 -0
  14. package/dist/commands/10dlc/campaigns/get.d.ts +13 -0
  15. package/dist/commands/10dlc/campaigns/get.js +84 -0
  16. package/dist/commands/10dlc/campaigns/list.d.ts +10 -0
  17. package/dist/commands/10dlc/campaigns/list.js +70 -0
  18. package/dist/commands/10dlc/qualify.d.ts +14 -0
  19. package/dist/commands/10dlc/qualify.js +56 -0
  20. package/dist/commands/keys/rotate.js +7 -12
  21. package/dist/commands/links/create.d.ts +24 -0
  22. package/dist/commands/links/create.js +71 -0
  23. package/dist/commands/links/disable.d.ts +21 -0
  24. package/dist/commands/links/disable.js +55 -0
  25. package/dist/commands/links/list.d.ts +19 -0
  26. package/dist/commands/links/list.js +85 -0
  27. package/dist/commands/numbers/buy.js +15 -1
  28. package/dist/commands/numbers/get.d.ts +20 -0
  29. package/dist/commands/numbers/get.js +52 -0
  30. package/dist/commands/numbers/list.js +18 -1
  31. package/dist/commands/numbers/release.d.ts +23 -0
  32. package/dist/commands/numbers/release.js +67 -0
  33. package/dist/commands/numbers/update.d.ts +25 -0
  34. package/dist/commands/numbers/update.js +70 -0
  35. package/dist/commands/sms/group.d.ts +25 -0
  36. package/dist/commands/sms/group.js +164 -0
  37. package/dist/commands/sms/upload-media.d.ts +1 -1
  38. package/dist/commands/sms/upload-media.js +4 -4
  39. package/dist/commands/templates/enhance.js +3 -3
  40. package/dist/commands/upgrade.d.ts +1 -16
  41. package/dist/commands/upgrade.js +131 -38
  42. package/oclif.manifest.json +3964 -2966
  43. package/package.json +16 -1
@@ -1,67 +1,160 @@
1
1
  import { Command, Flags } from "@oclif/core";
2
2
  import { spawn } from "node:child_process";
3
3
  import { detectInstallPath, upgradeCommandFor, } from "../lib/detect-install-path.js";
4
- import { success, error, info } from "../lib/output.js";
4
+ import { colors, success, error, info, spinner, divider, } from "../lib/output.js";
5
5
  /**
6
- * `sendly upgrade` — bring the CLI up to the latest version.
6
+ * `sendly upgrade` — bring the CLI up to the latest version with a guided,
7
+ * animated flow: an animated version check, a `vCURRENT → vLATEST` diff, and a
8
+ * success panel. The noisy package-manager output is hidden behind a spinner
9
+ * for Homebrew (which never needs sudo); for npm we keep inherited stdio so an
10
+ * auth/sudo prompt can never hang invisibly behind a spinner.
7
11
  *
8
- * Detects the install path (Homebrew vs npm-global vs unknown) and
9
- * executes the matching package-manager upgrade command. If the install
10
- * path is unknown we print both options for the user to pick.
12
+ * `--check` is a dry-run: it shows the detected install method and the command
13
+ * that would run, without changing anything.
11
14
  *
12
- * The `--check` flag does a dry-run: prints what would happen without
13
- * executing anything. Useful in restricted shells where we don't want
14
- * to trigger a brew/npm run accidentally.
15
- *
16
- * The unattended in-band update banner that prompts users to run this
17
- * comes from the `@oclif/plugin-warn-if-update-available` plugin wired
18
- * in package.json; this command is the companion action for that
19
- * banner.
15
+ * The unattended banner that nudges users to run this comes from the
16
+ * `@oclif/plugin-warn-if-update-available` plugin wired in package.json; this
17
+ * command is the companion action for that banner.
20
18
  */
19
+ const REGISTRY_URL = "https://registry.npmjs.org/@sendly/cli";
20
+ const CHANGELOG_URL = "https://sendly.live/docs/changelog";
21
+ function bumpType(from, to) {
22
+ const a = from.split(".").map((n) => parseInt(n, 10));
23
+ const b = to.split(".").map((n) => parseInt(n, 10));
24
+ if (a.length < 3 || b.length < 3 || [...a, ...b].some(Number.isNaN))
25
+ return "";
26
+ if (b[0] > a[0])
27
+ return "major";
28
+ if (b[1] > a[1])
29
+ return "minor";
30
+ if (b[2] > a[2])
31
+ return "patch";
32
+ return "";
33
+ }
34
+ async function fetchLatest() {
35
+ try {
36
+ const controller = new AbortController();
37
+ const timer = setTimeout(() => controller.abort(), 4000);
38
+ const res = await fetch(REGISTRY_URL, {
39
+ headers: { accept: "application/vnd.npm.install-v1+json" },
40
+ signal: controller.signal,
41
+ });
42
+ clearTimeout(timer);
43
+ if (!res.ok)
44
+ return null;
45
+ const body = (await res.json());
46
+ return body["dist-tags"]?.latest ?? null;
47
+ }
48
+ catch {
49
+ return null;
50
+ }
51
+ }
52
+ function runCaptured(command) {
53
+ return new Promise((resolve) => {
54
+ const [bin, ...args] = command.split(" ");
55
+ const child = spawn(bin, args, { stdio: ["ignore", "pipe", "pipe"] });
56
+ let output = "";
57
+ child.stdout?.on("data", (d) => (output += d.toString()));
58
+ child.stderr?.on("data", (d) => (output += d.toString()));
59
+ child.on("error", (err) => resolve({ code: 1, output: err.message }));
60
+ child.on("exit", (code) => resolve({ code: code ?? 1, output }));
61
+ });
62
+ }
63
+ function runInherited(command) {
64
+ return new Promise((resolve) => {
65
+ const [bin, ...args] = command.split(" ");
66
+ const child = spawn(bin, args, { stdio: "inherit" });
67
+ child.on("error", () => resolve(1));
68
+ child.on("exit", (code) => resolve(code ?? 1));
69
+ });
70
+ }
21
71
  export default class Upgrade extends Command {
22
- static description = "Upgrade Sendly CLI to the latest version using the package manager that installed it (Homebrew or npm).";
72
+ static description = "Upgrade the Sendly CLI to the latest version with a guided, animated flow.";
23
73
  static examples = [
24
74
  "<%= config.bin %> upgrade",
25
75
  "<%= config.bin %> upgrade --check",
26
76
  ];
27
77
  static flags = {
28
78
  check: Flags.boolean({
29
- description: "Print the upgrade command for your install path without executing it",
79
+ description: "Show what would happen without changing anything",
30
80
  default: false,
31
81
  }),
32
82
  };
33
83
  async run() {
34
84
  const { flags } = await this.parse(Upgrade);
85
+ const current = this.config.version;
86
+ divider();
87
+ console.log(` ${colors.highlight("⚡ Sendly CLI")} ${colors.dim("upgrade")}`);
88
+ divider();
89
+ const spin = spinner("Checking for the latest version...").start();
90
+ const latest = await fetchLatest();
91
+ if (latest && latest === current) {
92
+ spin.succeed(`You're on the latest version ${colors.success.bold("v" + current)}`);
93
+ divider();
94
+ return;
95
+ }
96
+ if (latest) {
97
+ const kind = bumpType(current, latest);
98
+ spin.succeed(`Update available${kind ? " " + colors.dim(`(${kind})`) : ""}`);
99
+ console.log(` ${colors.dim("v" + current)} ${colors.primary("→")} ${colors.success.bold("v" + latest)}`);
100
+ divider();
101
+ }
102
+ else {
103
+ spin.succeed("Ready to upgrade");
104
+ }
35
105
  const installPath = detectInstallPath();
36
106
  const command = upgradeCommandFor(installPath);
37
107
  if (installPath === "unknown") {
38
- info("Can't detect how you installed the Sendly CLI. Pick the matching command:\n" +
39
- " • Homebrew: brew upgrade sendly\n" +
40
- "npm: npm install -g @sendly/cli@latest");
108
+ info("Can't detect how the CLI was installed. Run whichever matches:\n" +
109
+ ` ${colors.code("brew upgrade sendly")} ${colors.dim("(Homebrew)")}\n` +
110
+ ` ${colors.code("npm install -g @sendly/cli@latest")} ${colors.dim("(npm)")}`);
41
111
  return;
42
112
  }
43
113
  if (flags.check) {
44
- info(`Detected install path: ${installPath}\nWould run: ${command}`);
114
+ info(`Install method: ${colors.bold(installPath)}\n` +
115
+ `Would run: ${colors.code(command)}`);
45
116
  return;
46
117
  }
47
- info(`Upgrading via ${installPath}: ${command}`);
48
- const [bin, ...args] = command.split(" ");
49
- const child = spawn(bin, args, { stdio: "inherit" });
50
- await new Promise((resolve) => {
51
- child.on("exit", (code) => {
52
- if (code === 0) {
53
- success("Upgrade complete. Run `sendly --version` to confirm the new version.");
54
- }
55
- else {
56
- error(`Upgrade command exited with code ${code}. Try running \`${command}\` manually.`);
57
- }
58
- resolve();
59
- });
60
- child.on("error", (err) => {
61
- error(`Failed to execute upgrade command: ${err.message}. Try running \`${command}\` manually.`);
62
- resolve();
63
- });
64
- });
118
+ const via = installPath === "homebrew" ? "Homebrew" : "npm";
119
+ const target = latest ? ` to ${colors.success("v" + latest)}` : "";
120
+ if (installPath === "homebrew") {
121
+ // Homebrew never needs sudo, so it's safe to hide its output behind a
122
+ // spinner for a clean, animated upgrade.
123
+ const upSpin = spinner(`Upgrading via ${via}${target}...`).start();
124
+ const { code, output } = await runCaptured(command);
125
+ if (code === 0) {
126
+ upSpin.stop();
127
+ this.renderSuccess(via, latest);
128
+ }
129
+ else {
130
+ upSpin.fail(`Upgrade failed via ${via}`);
131
+ const tail = output.trim().split("\n").slice(-6).join("\n");
132
+ if (tail)
133
+ console.log(colors.dim(tail));
134
+ error(`Try running it yourself: ${colors.code(command)}`);
135
+ }
136
+ return;
137
+ }
138
+ // npm: keep inherited stdio so any auth/sudo prompt stays visible.
139
+ info(`Upgrading via ${via}${target}`);
140
+ console.log(colors.dim(` ${command}`));
141
+ divider();
142
+ const code = await runInherited(command);
143
+ if (code === 0) {
144
+ this.renderSuccess(via, latest);
145
+ }
146
+ else {
147
+ error(`Upgrade command exited with code ${code}. Try running it yourself: ${colors.code(command)}`);
148
+ }
149
+ }
150
+ renderSuccess(via, latest) {
151
+ success(latest
152
+ ? `Upgraded to ${colors.success.bold("v" + latest)} via ${via}`
153
+ : `Upgrade complete via ${via}`);
154
+ divider();
155
+ info(`What's new: ${colors.code(CHANGELOG_URL)}`);
156
+ info("Run `sendly --version` to confirm.");
157
+ divider();
65
158
  }
66
159
  }
67
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBncmFkZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy91cGdyYWRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLGlCQUFpQixHQUNsQixNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXhEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sT0FBUSxTQUFRLE9BQU87SUFDMUMsTUFBTSxDQUFDLFdBQVcsR0FDaEIseUdBQXlHLENBQUM7SUFFNUcsTUFBTSxDQUFDLFFBQVEsR0FBRztRQUNoQiwyQkFBMkI7UUFDM0IsbUNBQW1DO0tBQ3BDLENBQUM7SUFFRixNQUFNLENBQUMsS0FBSyxHQUFHO1FBQ2IsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDbkIsV0FBVyxFQUNULHNFQUFzRTtZQUN4RSxPQUFPLEVBQUUsS0FBSztTQUNmLENBQUM7S0FDSCxDQUFDO0lBRUYsS0FBSyxDQUFDLEdBQUc7UUFDUCxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTVDLE1BQU0sV0FBVyxHQUFHLGlCQUFpQixFQUFFLENBQUM7UUFDeEMsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFL0MsSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUNGLDZFQUE2RTtnQkFDM0UscUNBQXFDO2dCQUNyQyxpREFBaUQsQ0FDcEQsQ0FBQztZQUNGLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUNGLDBCQUEwQixXQUFXLGdCQUFnQixPQUFPLEVBQUUsQ0FDL0QsQ0FBQztZQUNGLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLGlCQUFpQixXQUFXLEtBQUssT0FBTyxFQUFFLENBQUMsQ0FBQztRQUVqRCxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBRXJELE1BQU0sSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNsQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUN4QixJQUFJLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDZixPQUFPLENBQ0wsc0VBQXNFLENBQ3ZFLENBQUM7Z0JBQ0osQ0FBQztxQkFBTSxDQUFDO29CQUNOLEtBQUssQ0FDSCxvQ0FBb0MsSUFBSSxtQkFBbUIsT0FBTyxjQUFjLENBQ2pGLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxPQUFPLEVBQUUsQ0FBQztZQUNaLENBQUMsQ0FBQyxDQUFDO1lBQ0gsS0FBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDeEIsS0FBSyxDQUNILHNDQUFzQyxHQUFHLENBQUMsT0FBTyxtQkFBbUIsT0FBTyxjQUFjLENBQzFGLENBQUM7Z0JBQ0YsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1hbmQsIEZsYWdzIH0gZnJvbSBcIkBvY2xpZi9jb3JlXCI7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7XG4gIGRldGVjdEluc3RhbGxQYXRoLFxuICB1cGdyYWRlQ29tbWFuZEZvcixcbn0gZnJvbSBcIi4uL2xpYi9kZXRlY3QtaW5zdGFsbC1wYXRoLmpzXCI7XG5pbXBvcnQgeyBzdWNjZXNzLCBlcnJvciwgaW5mbyB9IGZyb20gXCIuLi9saWIvb3V0cHV0LmpzXCI7XG5cbi8qKlxuICogYHNlbmRseSB1cGdyYWRlYCDigJQgYnJpbmcgdGhlIENMSSB1cCB0byB0aGUgbGF0ZXN0IHZlcnNpb24uXG4gKlxuICogRGV0ZWN0cyB0aGUgaW5zdGFsbCBwYXRoIChIb21lYnJldyB2cyBucG0tZ2xvYmFsIHZzIHVua25vd24pIGFuZFxuICogZXhlY3V0ZXMgdGhlIG1hdGNoaW5nIHBhY2thZ2UtbWFuYWdlciB1cGdyYWRlIGNvbW1hbmQuIElmIHRoZSBpbnN0YWxsXG4gKiBwYXRoIGlzIHVua25vd24gd2UgcHJpbnQgYm90aCBvcHRpb25zIGZvciB0aGUgdXNlciB0byBwaWNrLlxuICpcbiAqIFRoZSBgLS1jaGVja2AgZmxhZyBkb2VzIGEgZHJ5LXJ1bjogcHJpbnRzIHdoYXQgd291bGQgaGFwcGVuIHdpdGhvdXRcbiAqIGV4ZWN1dGluZyBhbnl0aGluZy4gVXNlZnVsIGluIHJlc3RyaWN0ZWQgc2hlbGxzIHdoZXJlIHdlIGRvbid0IHdhbnRcbiAqIHRvIHRyaWdnZXIgYSBicmV3L25wbSBydW4gYWNjaWRlbnRhbGx5LlxuICpcbiAqIFRoZSB1bmF0dGVuZGVkIGluLWJhbmQgdXBkYXRlIGJhbm5lciB0aGF0IHByb21wdHMgdXNlcnMgdG8gcnVuIHRoaXNcbiAqIGNvbWVzIGZyb20gdGhlIGBAb2NsaWYvcGx1Z2luLXdhcm4taWYtdXBkYXRlLWF2YWlsYWJsZWAgcGx1Z2luIHdpcmVkXG4gKiBpbiBwYWNrYWdlLmpzb247IHRoaXMgY29tbWFuZCBpcyB0aGUgY29tcGFuaW9uIGFjdGlvbiBmb3IgdGhhdFxuICogYmFubmVyLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVcGdyYWRlIGV4dGVuZHMgQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9XG4gICAgXCJVcGdyYWRlIFNlbmRseSBDTEkgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIHVzaW5nIHRoZSBwYWNrYWdlIG1hbmFnZXIgdGhhdCBpbnN0YWxsZWQgaXQgKEhvbWVicmV3IG9yIG5wbSkuXCI7XG5cbiAgc3RhdGljIGV4YW1wbGVzID0gW1xuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gdXBncmFkZVwiLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gdXBncmFkZSAtLWNoZWNrXCIsXG4gIF07XG5cbiAgc3RhdGljIGZsYWdzID0ge1xuICAgIGNoZWNrOiBGbGFncy5ib29sZWFuKHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlByaW50IHRoZSB1cGdyYWRlIGNvbW1hbmQgZm9yIHlvdXIgaW5zdGFsbCBwYXRoIHdpdGhvdXQgZXhlY3V0aW5nIGl0XCIsXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB9KSxcbiAgfTtcblxuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBmbGFncyB9ID0gYXdhaXQgdGhpcy5wYXJzZShVcGdyYWRlKTtcblxuICAgIGNvbnN0IGluc3RhbGxQYXRoID0gZGV0ZWN0SW5zdGFsbFBhdGgoKTtcbiAgICBjb25zdCBjb21tYW5kID0gdXBncmFkZUNvbW1hbmRGb3IoaW5zdGFsbFBhdGgpO1xuXG4gICAgaWYgKGluc3RhbGxQYXRoID09PSBcInVua25vd25cIikge1xuICAgICAgaW5mbyhcbiAgICAgICAgXCJDYW4ndCBkZXRlY3QgaG93IHlvdSBpbnN0YWxsZWQgdGhlIFNlbmRseSBDTEkuIFBpY2sgdGhlIG1hdGNoaW5nIGNvbW1hbmQ6XFxuXCIgK1xuICAgICAgICAgIFwiICDigKIgSG9tZWJyZXc6IGJyZXcgdXBncmFkZSBzZW5kbHlcXG5cIiArXG4gICAgICAgICAgXCIgIOKAoiBucG06ICAgICAgbnBtIGluc3RhbGwgLWcgQHNlbmRseS9jbGlAbGF0ZXN0XCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmbGFncy5jaGVjaykge1xuICAgICAgaW5mbyhcbiAgICAgICAgYERldGVjdGVkIGluc3RhbGwgcGF0aDogJHtpbnN0YWxsUGF0aH1cXG5Xb3VsZCBydW46ICR7Y29tbWFuZH1gLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpbmZvKGBVcGdyYWRpbmcgdmlhICR7aW5zdGFsbFBhdGh9OiAke2NvbW1hbmR9YCk7XG5cbiAgICBjb25zdCBbYmluLCAuLi5hcmdzXSA9IGNvbW1hbmQuc3BsaXQoXCIgXCIpO1xuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oYmluLCBhcmdzLCB7IHN0ZGlvOiBcImluaGVyaXRcIiB9KTtcblxuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICBjaGlsZC5vbihcImV4aXRcIiwgKGNvZGUpID0+IHtcbiAgICAgICAgaWYgKGNvZGUgPT09IDApIHtcbiAgICAgICAgICBzdWNjZXNzKFxuICAgICAgICAgICAgXCJVcGdyYWRlIGNvbXBsZXRlLiBSdW4gYHNlbmRseSAtLXZlcnNpb25gIHRvIGNvbmZpcm0gdGhlIG5ldyB2ZXJzaW9uLlwiLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXJyb3IoXG4gICAgICAgICAgICBgVXBncmFkZSBjb21tYW5kIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfS4gVHJ5IHJ1bm5pbmcgXFxgJHtjb21tYW5kfVxcYCBtYW51YWxseS5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgICBjaGlsZC5vbihcImVycm9yXCIsIChlcnIpID0+IHtcbiAgICAgICAgZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBleGVjdXRlIHVwZ3JhZGUgY29tbWFuZDogJHtlcnIubWVzc2FnZX0uIFRyeSBydW5uaW5nIFxcYCR7Y29tbWFuZH1cXGAgbWFudWFsbHkuYCxcbiAgICAgICAgKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBncmFkZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy91cGdyYWRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLGlCQUFpQixHQUNsQixNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFDTCxNQUFNLEVBQ04sT0FBTyxFQUNQLEtBQUssRUFDTCxJQUFJLEVBQ0osT0FBTyxFQUNQLE9BQU8sR0FDUixNQUFNLGtCQUFrQixDQUFDO0FBRTFCOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxNQUFNLFlBQVksR0FBRyx3Q0FBd0MsQ0FBQztBQUM5RCxNQUFNLGFBQWEsR0FBRyxvQ0FBb0MsQ0FBQztBQUUzRCxTQUFTLFFBQVEsQ0FBQyxJQUFZLEVBQUUsRUFBVTtJQUN4QyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEQsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUMvRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDaEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQ2hDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFBRSxPQUFPLE9BQU8sQ0FBQztJQUNoQyxPQUFPLEVBQUUsQ0FBQztBQUNaLENBQUM7QUFFRCxLQUFLLFVBQVUsV0FBVztJQUN4QixJQUFJLENBQUM7UUFDSCxNQUFNLFVBQVUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekQsTUFBTSxHQUFHLEdBQUcsTUFBTSxLQUFLLENBQUMsWUFBWSxFQUFFO1lBQ3BDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxxQ0FBcUMsRUFBRTtZQUMxRCxNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07U0FDMUIsQ0FBQyxDQUFDO1FBQ0gsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3pCLE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLENBRTdCLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDO0lBQzNDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQ2xCLE9BQWU7SUFFZixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDN0IsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0RSxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFELEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxRCxLQUFLLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0RSxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLE9BQWU7SUFDbkMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzdCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMs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QUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsUUFBUSxHQUFHLEVBQUU7WUFDL0QsQ0FBQyxDQUFDLHdCQUF3QixHQUFHLEVBQUUsQ0FDbEMsQ0FBQztRQUNGLE9BQU8sRUFBRSxDQUFDO1FBQ1YsSUFBSSxDQUFDLGVBQWUsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDM0MsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbWFuZCwgRmxhZ3MgfSBmcm9tIFwiQG9jbGlmL2NvcmVcIjtcbmltcG9ydCB7IHNwYXduIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHtcbiAgZGV0ZWN0SW5zdGFsbFBhdGgsXG4gIHVwZ3JhZGVDb21tYW5kRm9yLFxufSBmcm9tIFwiLi4vbGliL2RldGVjdC1pbnN0YWxsLXBhdGguanNcIjtcbmltcG9ydCB7XG4gIGNvbG9ycyxcbiAgc3VjY2VzcyxcbiAgZXJyb3IsXG4gIGluZm8sXG4gIHNwaW5uZXIsXG4gIGRpdmlkZXIsXG59IGZyb20gXCIuLi9saWIvb3V0cHV0LmpzXCI7XG5cbi8qKlxuICogYHNlbmRseSB1cGdyYWRlYCDigJQgYnJpbmcgdGhlIENMSSB1cCB0byB0aGUgbGF0ZXN0IHZlcnNpb24gd2l0aCBhIGd1aWRlZCxcbiAqIGFuaW1hdGVkIGZsb3c6IGFuIGFuaW1hdGVkIHZlcnNpb24gY2hlY2ssIGEgYHZDVVJSRU5UIOKGkiB2TEFURVNUYCBkaWZmLCBhbmQgYVxuICogc3VjY2VzcyBwYW5lbC4gVGhlIG5vaXN5IHBhY2thZ2UtbWFuYWdlciBvdXRwdXQgaXMgaGlkZGVuIGJlaGluZCBhIHNwaW5uZXJcbiAqIGZvciBIb21lYnJldyAod2hpY2ggbmV2ZXIgbmVlZHMgc3Vkbyk7IGZvciBucG0gd2Uga2VlcCBpbmhlcml0ZWQgc3RkaW8gc28gYW5cbiAqIGF1dGgvc3VkbyBwcm9tcHQgY2FuIG5ldmVyIGhhbmcgaW52aXNpYmx5IGJlaGluZCBhIHNwaW5uZXIuXG4gKlxuICogYC0tY2hlY2tgIGlzIGEgZHJ5LXJ1bjogaXQgc2hvd3MgdGhlIGRldGVjdGVkIGluc3RhbGwgbWV0aG9kIGFuZCB0aGUgY29tbWFuZFxuICogdGhhdCB3b3VsZCBydW4sIHdpdGhvdXQgY2hhbmdpbmcgYW55dGhpbmcuXG4gKlxuICogVGhlIHVuYXR0ZW5kZWQgYmFubmVyIHRoYXQgbnVkZ2VzIHVzZXJzIHRvIHJ1biB0aGlzIGNvbWVzIGZyb20gdGhlXG4gKiBgQG9jbGlmL3BsdWdpbi13YXJuLWlmLXVwZGF0ZS1hdmFpbGFibGVgIHBsdWdpbiB3aXJlZCBpbiBwYWNrYWdlLmpzb247IHRoaXNcbiAqIGNvbW1hbmQgaXMgdGhlIGNvbXBhbmlvbiBhY3Rpb24gZm9yIHRoYXQgYmFubmVyLlxuICovXG5cbmNvbnN0IFJFR0lTVFJZX1VSTCA9IFwiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQHNlbmRseS9jbGlcIjtcbmNvbnN0IENIQU5HRUxPR19VUkwgPSBcImh0dHBzOi8vc2VuZGx5LmxpdmUvZG9jcy9jaGFuZ2Vsb2dcIjtcblxuZnVuY3Rpb24gYnVtcFR5cGUoZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nKTogXCJtYWpvclwiIHwgXCJtaW5vclwiIHwgXCJwYXRjaFwiIHwgXCJcIiB7XG4gIGNvbnN0IGEgPSBmcm9tLnNwbGl0KFwiLlwiKS5tYXAoKG4pID0+IHBhcnNlSW50KG4sIDEwKSk7XG4gIGNvbnN0IGIgPSB0by5zcGxpdChcIi5cIikubWFwKChuKSA9PiBwYXJzZUludChuLCAxMCkpO1xuICBpZiAoYS5sZW5ndGggPCAzIHx8IGIubGVuZ3RoIDwgMyB8fCBbLi4uYSwgLi4uYl0uc29tZShOdW1iZXIuaXNOYU4pKSByZXR1cm4gXCJcIjtcbiAgaWYgKGJbMF0gPiBhWzBdKSByZXR1cm4gXCJtYWpvclwiO1xuICBpZiAoYlsxXSA+IGFbMV0pIHJldHVybiBcIm1pbm9yXCI7XG4gIGlmIChiWzJdID4gYVsyXSkgcmV0dXJuIFwicGF0Y2hcIjtcbiAgcmV0dXJuIFwiXCI7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoTGF0ZXN0KCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgNDAwMCk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goUkVHSVNUUllfVVJMLCB7XG4gICAgICBoZWFkZXJzOiB7IGFjY2VwdDogXCJhcHBsaWNhdGlvbi92bmQubnBtLmluc3RhbGwtdjEranNvblwiIH0sXG4gICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgIH0pO1xuICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgaWYgKCFyZXMub2spIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGJvZHkgPSAoYXdhaXQgcmVzLmpzb24oKSkgYXMge1xuICAgICAgXCJkaXN0LXRhZ3NcIj86IHsgbGF0ZXN0Pzogc3RyaW5nIH07XG4gICAgfTtcbiAgICByZXR1cm4gYm9keVtcImRpc3QtdGFnc1wiXT8ubGF0ZXN0ID8/IG51bGw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJ1bkNhcHR1cmVkKFxuICBjb21tYW5kOiBzdHJpbmcsXG4pOiBQcm9taXNlPHsgY29kZTogbnVtYmVyOyBvdXRwdXQ6IHN0cmluZyB9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IFtiaW4sIC4uLmFyZ3NdID0gY29tbWFuZC5zcGxpdChcIiBcIik7XG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihiaW4sIGFyZ3MsIHsgc3RkaW86IFtcImlnbm9yZVwiLCBcInBpcGVcIiwgXCJwaXBlXCJdIH0pO1xuICAgIGxldCBvdXRwdXQgPSBcIlwiO1xuICAgIGNoaWxkLnN0ZG91dD8ub24oXCJkYXRhXCIsIChkKSA9PiAob3V0cHV0ICs9IGQudG9TdHJpbmcoKSkpO1xuICAgIGNoaWxkLnN0ZGVycj8ub24oXCJkYXRhXCIsIChkKSA9PiAob3V0cHV0ICs9IGQudG9TdHJpbmcoKSkpO1xuICAgIGNoaWxkLm9uKFwiZXJyb3JcIiwgKGVycikgPT4gcmVzb2x2ZSh7IGNvZGU6IDEsIG91dHB1dDogZXJyLm1lc3NhZ2UgfSkpO1xuICAgIGNoaWxkLm9uKFwiZXhpdFwiLCAoY29kZSkgPT4gcmVzb2x2ZSh7IGNvZGU6IGNvZGUgPz8gMSwgb3V0cHV0IH0pKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJ1bkluaGVyaXRlZChjb21tYW5kOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBbYmluLCAuLi5hcmdzXSA9IGNvbW1hbmQuc3BsaXQoXCIgXCIpO1xuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oYmluLCBhcmdzLCB7IHN0ZGlvOiBcImluaGVyaXRcIiB9KTtcbiAgICBjaGlsZC5vbihcImVycm9yXCIsICgpID0+IHJlc29sdmUoMSkpO1xuICAgIGNoaWxkLm9uKFwiZXhpdFwiLCAoY29kZSkgPT4gcmVzb2x2ZShjb2RlID8/IDEpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVwZ3JhZGUgZXh0ZW5kcyBDb21tYW5kIHtcbiAgc3RhdGljIGRlc2NyaXB0aW9uID1cbiAgICBcIlVwZ3JhZGUgdGhlIFNlbmRseSBDTEkgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIHdpdGggYSBndWlkZWQsIGFuaW1hdGVkIGZsb3cuXCI7XG5cbiAgc3RhdGljIGV4YW1wbGVzID0gW1xuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gdXBncmFkZVwiLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gdXBncmFkZSAtLWNoZWNrXCIsXG4gIF07XG5cbiAgc3RhdGljIGZsYWdzID0ge1xuICAgIGNoZWNrOiBGbGFncy5ib29sZWFuKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlNob3cgd2hhdCB3b3VsZCBoYXBwZW4gd2l0aG91dCBjaGFuZ2luZyBhbnl0aGluZ1wiLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgfSksXG4gIH07XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZmxhZ3MgfSA9IGF3YWl0IHRoaXMucGFyc2UoVXBncmFkZSk7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY29uZmlnLnZlcnNpb247XG5cbiAgICBkaXZpZGVyKCk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgICAke2NvbG9ycy5oaWdobGlnaHQoXCLimqEgU2VuZGx5IENMSVwiKX0gICR7Y29sb3JzLmRpbShcInVwZ3JhZGVcIil9YCxcbiAgICApO1xuICAgIGRpdmlkZXIoKTtcblxuICAgIGNvbnN0IHNwaW4gPSBzcGlubmVyKFwiQ2hlY2tpbmcgZm9yIHRoZSBsYXRlc3QgdmVyc2lvbi4uLlwiKS5zdGFydCgpO1xuICAgIGNvbnN0IGxhdGVzdCA9IGF3YWl0IGZldGNoTGF0ZXN0KCk7XG5cbiAgICBpZiAobGF0ZXN0ICYmIGxhdGVzdCA9PT0gY3VycmVudCkge1xuICAgICAgc3Bpbi5zdWNjZWVkKFxuICAgICAgICBgWW91J3JlIG9uIHRoZSBsYXRlc3QgdmVyc2lvbiAke2NvbG9ycy5zdWNjZXNzLmJvbGQoXCJ2XCIgKyBjdXJyZW50KX1gLFxuICAgICAgKTtcbiAgICAgIGRpdmlkZXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobGF0ZXN0KSB7XG4gICAgICBjb25zdCBraW5kID0gYnVtcFR5cGUoY3VycmVudCwgbGF0ZXN0KTtcbiAgICAgIHNwaW4uc3VjY2VlZChcbiAgICAgICAgYFVwZGF0ZSBhdmFpbGFibGUke2tpbmQgPyBcIiBcIiArIGNvbG9ycy5kaW0oYCgke2tpbmR9KWApIDogXCJcIn1gLFxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgICAke2NvbG9ycy5kaW0oXCJ2XCIgKyBjdXJyZW50KX0gICR7Y29sb3JzLnByaW1hcnkoXCLihpJcIil9ICAke2NvbG9ycy5zdWNjZXNzLmJvbGQoXCJ2XCIgKyBsYXRlc3QpfWAsXG4gICAgICApO1xuICAgICAgZGl2aWRlcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGluLnN1Y2NlZWQoXCJSZWFkeSB0byB1cGdyYWRlXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbGxQYXRoID0gZGV0ZWN0SW5zdGFsbFBhdGgoKTtcbiAgICBjb25zdCBjb21tYW5kID0gdXBncmFkZUNvbW1hbmRGb3IoaW5zdGFsbFBhdGgpO1xuXG4gICAgaWYgKGluc3RhbGxQYXRoID09PSBcInVua25vd25cIikge1xuICAgICAgaW5mbyhcbiAgICAgICAgXCJDYW4ndCBkZXRlY3QgaG93IHRoZSBDTEkgd2FzIGluc3RhbGxlZC4gUnVuIHdoaWNoZXZlciBtYXRjaGVzOlxcblwiICtcbiAgICAgICAgICBgICAke2NvbG9ycy5jb2RlKFwiYnJldyB1cGdyYWRlIHNlbmRseVwiKX0gICAgICAgICAgICAgICAgJHtjb2xvcnMuZGltKFwiKEhvbWVicmV3KVwiKX1cXG5gICtcbiAgICAgICAgICBgICAke2NvbG9ycy5jb2RlKFwibnBtIGluc3RhbGwgLWcgQHNlbmRseS9jbGlAbGF0ZXN0XCIpfSAgJHtjb2xvcnMuZGltKFwiKG5wbSlcIil9YCxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGZsYWdzLmNoZWNrKSB7XG4gICAgICBpbmZvKFxuICAgICAgICBgSW5zdGFsbCBtZXRob2Q6ICR7Y29sb3JzLmJvbGQoaW5zdGFsbFBhdGgpfVxcbmAgK1xuICAgICAgICAgIGBXb3VsZCBydW46ICAgICAgJHtjb2xvcnMuY29kZShjb21tYW5kKX1gLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2aWEgPSBpbnN0YWxsUGF0aCA9PT0gXCJob21lYnJld1wiID8gXCJIb21lYnJld1wiIDogXCJucG1cIjtcbiAgICBjb25zdCB0YXJnZXQgPSBsYXRlc3QgPyBgIHRvICR7Y29sb3JzLnN1Y2Nlc3MoXCJ2XCIgKyBsYXRlc3QpfWAgOiBcIlwiO1xuXG4gICAgaWYgKGluc3RhbGxQYXRoID09PSBcImhvbWVicmV3XCIpIHtcbiAgICAgIC8vIEhvbWVicmV3IG5ldmVyIG5lZWRzIHN1ZG8sIHNvIGl0J3Mgc2FmZSB0byBoaWRlIGl0cyBvdXRwdXQgYmVoaW5kIGFcbiAgICAgIC8vIHNwaW5uZXIgZm9yIGEgY2xlYW4sIGFuaW1hdGVkIHVwZ3JhZGUuXG4gICAgICBjb25zdCB1cFNwaW4gPSBzcGlubmVyKGBVcGdyYWRpbmcgdmlhICR7dmlhfSR7dGFyZ2V0fS4uLmApLnN0YXJ0KCk7XG4gICAgICBjb25zdCB7IGNvZGUsIG91dHB1dCB9ID0gYXdhaXQgcnVuQ2FwdHVyZWQoY29tbWFuZCk7XG4gICAgICBpZiAoY29kZSA9PT0gMCkge1xuICAgICAgICB1cFNwaW4uc3RvcCgpO1xuICAgICAgICB0aGlzLnJlbmRlclN1Y2Nlc3ModmlhLCBsYXRlc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXBTcGluLmZhaWwoYFVwZ3JhZGUgZmFpbGVkIHZpYSAke3ZpYX1gKTtcbiAgICAgICAgY29uc3QgdGFpbCA9IG91dHB1dC50cmltKCkuc3BsaXQoXCJcXG5cIikuc2xpY2UoLTYpLmpvaW4oXCJcXG5cIik7XG4gICAgICAgIGlmICh0YWlsKSBjb25zb2xlLmxvZyhjb2xvcnMuZGltKHRhaWwpKTtcbiAgICAgICAgZXJyb3IoYFRyeSBydW5uaW5nIGl0IHlvdXJzZWxmOiAke2NvbG9ycy5jb2RlKGNvbW1hbmQpfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIG5wbToga2VlcCBpbmhlcml0ZWQgc3RkaW8gc28gYW55IGF1dGgvc3VkbyBwcm9tcHQgc3RheXMgdmlzaWJsZS5cbiAgICBpbmZvKGBVcGdyYWRpbmcgdmlhICR7dmlhfSR7dGFyZ2V0fWApO1xuICAgIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oYCAgJHtjb21tYW5kfWApKTtcbiAgICBkaXZpZGVyKCk7XG4gICAgY29uc3QgY29kZSA9IGF3YWl0IHJ1bkluaGVyaXRlZChjb21tYW5kKTtcbiAgICBpZiAoY29kZSA9PT0gMCkge1xuICAgICAgdGhpcy5yZW5kZXJTdWNjZXNzKHZpYSwgbGF0ZXN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXJyb3IoXG4gICAgICAgIGBVcGdyYWRlIGNvbW1hbmQgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9LiBUcnkgcnVubmluZyBpdCB5b3Vyc2VsZjogJHtjb2xvcnMuY29kZShjb21tYW5kKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbmRlclN1Y2Nlc3ModmlhOiBzdHJpbmcsIGxhdGVzdDogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIHN1Y2Nlc3MoXG4gICAgICBsYXRlc3RcbiAgICAgICAgPyBgVXBncmFkZWQgdG8gJHtjb2xvcnMuc3VjY2Vzcy5ib2xkKFwidlwiICsgbGF0ZXN0KX0gdmlhICR7dmlhfWBcbiAgICAgICAgOiBgVXBncmFkZSBjb21wbGV0ZSB2aWEgJHt2aWF9YCxcbiAgICApO1xuICAgIGRpdmlkZXIoKTtcbiAgICBpbmZvKGBXaGF0J3MgbmV3OiAke2NvbG9ycy5jb2RlKENIQU5HRUxPR19VUkwpfWApO1xuICAgIGluZm8oXCJSdW4gYHNlbmRseSAtLXZlcnNpb25gIHRvIGNvbmZpcm0uXCIpO1xuICAgIGRpdmlkZXIoKTtcbiAgfVxufVxuIl19