brepjs-cad 0.174.0 → 0.175.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.175.0](https://github.com/andymai/brepjs/compare/brepjs-cad-v0.174.0...brepjs-cad-v0.175.0) (2026-08-26)
4
+
5
+
6
+ ### Features
7
+
8
+ * **brepjs-cad:** transpiling loader for multi-file TS/TSX projects + working watch ([#2228](https://github.com/andymai/brepjs/issues/2228)) ([980ead6](https://github.com/andymai/brepjs/commit/980ead6508867c31fcec1fd06a683f03bacb1e6f))
9
+
3
10
  ## [0.174.0](https://github.com/andymai/brepjs/compare/brepjs-cad-v0.173.0...brepjs-cad-v0.174.0) (2026-08-22)
4
11
 
5
12
 
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_diff = require("./diff-DDu3OLyd.cjs");
2
+ const require_diff = require("./diff-DX9zgrss.cjs");
3
3
  exports.DEFAULT_TOLERANCE_PCT = require_diff.DEFAULT_TOLERANCE_PCT;
4
4
  exports.TYPECHECK_CODE = require_diff.TYPECHECK_CODE;
5
5
  exports.emptyReport = require_diff.emptyReport;
@@ -1,2 +1,2 @@
1
- import { a as typecheckPart, c as isExpectedDims, d as emptyReport, i as TYPECHECK_CODE, l as pctDelta, m as serializeReport, n as runMeasure, o as DEFAULT_TOLERANCE_PCT, r as runPart, s as evaluateExpected, t as runDiff, u as runChecks } from "./diff-CRu6Pqyr.js";
1
+ import { a as typecheckPart, c as isExpectedDims, d as emptyReport, i as TYPECHECK_CODE, l as pctDelta, m as serializeReport, n as runMeasure, o as DEFAULT_TOLERANCE_PCT, r as runPart, s as evaluateExpected, t as runDiff, u as runChecks } from "./diff-B1sSWjLa.js";
2
2
  export { DEFAULT_TOLERANCE_PCT, TYPECHECK_CODE, emptyReport, evaluateExpected, isExpectedDims, pctDelta, runChecks, runDiff, runMeasure, runPart, serializeReport, typecheckPart };
package/dist/cli/main.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const require_diff = require("../diff-DDu3OLyd.cjs");
3
+ const require_diff = require("../diff-DX9zgrss.cjs");
4
4
  let node_url = require("node:url");
5
5
  let node_fs = require("node:fs");
6
6
  let node_path = require("node:path");
@@ -117,6 +117,74 @@ function debounce(fn, delayMs = 150) {
117
117
  cancel
118
118
  };
119
119
  }
120
+ var SOURCE_FILE_RE = /\.(?:m?[jt]s|[jt]sx)$/;
121
+ function isWatchRelevant(filename) {
122
+ if (filename === void 0 || filename === null) return true;
123
+ const name = filename.toString();
124
+ if (/(?:^|[\\/])tsconfig(?:\..+)?\.json$/.test(name)) return true;
125
+ return SOURCE_FILE_RE.test(name);
126
+ }
127
+ /**
128
+ * Root the watcher at the project, not the entry's own directory: with the common
129
+ * `src/main.ts` layout, tsconfig.json (whose JSX options change how sources transpile)
130
+ * and `../` imports live one level up. Nearest package.json or tsconfig.json walking up
131
+ * wins; entries with no project marker fall back to their own directory.
132
+ */
133
+ function watchRootFor(entryPath) {
134
+ const start = (0, node_path.dirname)(entryPath);
135
+ let dir = start;
136
+ for (;;) {
137
+ if ((0, node_fs.existsSync)((0, node_path.join)(dir, "package.json")) || (0, node_fs.existsSync)((0, node_path.join)(dir, "tsconfig.json"))) return dir;
138
+ const parent = (0, node_path.dirname)(dir);
139
+ if (parent === dir) return start;
140
+ dir = parent;
141
+ }
142
+ }
143
+ var IGNORED_DIR_NAMES = /* @__PURE__ */ new Set([
144
+ "node_modules",
145
+ "dist",
146
+ ".git"
147
+ ]);
148
+ /**
149
+ * Watch a directory tree with one non-recursive `fs.watch` per directory, skipping
150
+ * node_modules/dist/.git and never following symlinks. `fs.watch({recursive})` has no
151
+ * exclusion API, so on a real project it would descend into node_modules — tens of
152
+ * thousands of inotify watches. Whenever an event fires in a directory it is re-scanned,
153
+ * which picks up newly created subdirectories. Returns a stop function.
154
+ */
155
+ function watchTree(root, onEvent) {
156
+ const watchers = /* @__PURE__ */ new Map();
157
+ const add = (dir) => {
158
+ if (watchers.has(dir)) return;
159
+ try {
160
+ watchers.set(dir, (0, node_fs.watch)(dir, (_event, filename) => {
161
+ scan(dir);
162
+ onEvent(filename);
163
+ }));
164
+ } catch {}
165
+ };
166
+ const scan = (dir) => {
167
+ let entries;
168
+ try {
169
+ entries = (0, node_fs.readdirSync)(dir, { withFileTypes: true });
170
+ } catch {
171
+ return;
172
+ }
173
+ for (const entry of entries) {
174
+ if (!entry.isDirectory() || IGNORED_DIR_NAMES.has(entry.name)) continue;
175
+ const child = (0, node_path.join)(dir, entry.name);
176
+ if (watchers.has(child)) continue;
177
+ add(child);
178
+ scan(child);
179
+ }
180
+ };
181
+ add(root);
182
+ scan(root);
183
+ return () => {
184
+ for (const watcher of watchers.values()) watcher.close();
185
+ watchers.clear();
186
+ };
187
+ }
120
188
  //#endregion
121
189
  //#region src/disposeShape.ts
122
190
  function disposeShape(shape) {
@@ -436,9 +504,9 @@ program.command("init").argument("<name>", "part name; scaffolds <name>.brep.ts
436
504
  });
437
505
  program.command("watch").argument("<file>", "path to a .brep.ts module; re-verifies on each save until Ctrl-C").action((file) => {
438
506
  const path = (0, node_path.resolve)(file);
439
- const run = async () => {
507
+ const run = async (fresh) => {
440
508
  try {
441
- const { report, shape } = await require_diff.runPart(path);
509
+ const { report, shape } = await require_diff.runPart(path, { freshImport: fresh });
442
510
  try {
443
511
  process.stdout.write(require_diff.serializeReport(report) + "\n");
444
512
  } finally {
@@ -448,18 +516,33 @@ program.command("watch").argument("<file>", "path to a .brep.ts module; re-verif
448
516
  process.stderr.write(`watch run failed: ${e.message}\n`);
449
517
  }
450
518
  };
451
- const { trigger } = debounce(run, 150);
452
- process.stderr.write(`watching ${path} (Ctrl-C to stop)\n`);
453
- run();
454
- const watcher = (0, node_fs.watch)((0, node_path.dirname)(path), (_event, filename) => {
455
- if (filename === void 0 || filename === null) {
456
- trigger();
519
+ let inFlight = false;
520
+ let rerunQueued = false;
521
+ const start = (fresh) => {
522
+ inFlight = true;
523
+ run(fresh).finally(() => {
524
+ inFlight = false;
525
+ if (rerunQueued) {
526
+ rerunQueued = false;
527
+ start(true);
528
+ }
529
+ });
530
+ };
531
+ const schedule = () => {
532
+ if (inFlight) {
533
+ rerunQueued = true;
457
534
  return;
458
535
  }
459
- if ((0, node_path.basename)(path) === filename.toString()) trigger();
536
+ start(true);
537
+ };
538
+ const { trigger } = debounce(schedule, 150);
539
+ process.stderr.write(`watching ${path} (Ctrl-C to stop)\n`);
540
+ start(false);
541
+ const stopWatching = watchTree(watchRootFor(path), (filename) => {
542
+ if (isWatchRelevant(filename)) trigger();
460
543
  });
461
544
  const stop = () => {
462
- watcher.close();
545
+ stopWatching();
463
546
  process.exit(0);
464
547
  };
465
548
  process.on("SIGINT", stop);
package/dist/cli/main.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import { f as pushError, h as loadBrep, m as serializeReport, n as runMeasure, p as reportOk, r as runPart, t as runDiff } from "../diff-CRu6Pqyr.js";
2
+ import { f as pushError, h as loadBrep, m as serializeReport, n as runMeasure, p as reportOk, r as runPart, t as runDiff } from "../diff-B1sSWjLa.js";
3
3
  import { fileURLToPath } from "node:url";
4
- import { existsSync, globSync, mkdirSync, realpathSync, watch, writeFileSync } from "node:fs";
4
+ import { existsSync, globSync, mkdirSync, readdirSync, realpathSync, watch, writeFileSync } from "node:fs";
5
5
  import { basename, dirname, join, resolve } from "node:path";
6
6
  import { Command } from "commander";
7
7
  import { tmpdir } from "node:os";
@@ -116,6 +116,74 @@ function debounce(fn, delayMs = 150) {
116
116
  cancel
117
117
  };
118
118
  }
119
+ var SOURCE_FILE_RE = /\.(?:m?[jt]s|[jt]sx)$/;
120
+ function isWatchRelevant(filename) {
121
+ if (filename === void 0 || filename === null) return true;
122
+ const name = filename.toString();
123
+ if (/(?:^|[\\/])tsconfig(?:\..+)?\.json$/.test(name)) return true;
124
+ return SOURCE_FILE_RE.test(name);
125
+ }
126
+ /**
127
+ * Root the watcher at the project, not the entry's own directory: with the common
128
+ * `src/main.ts` layout, tsconfig.json (whose JSX options change how sources transpile)
129
+ * and `../` imports live one level up. Nearest package.json or tsconfig.json walking up
130
+ * wins; entries with no project marker fall back to their own directory.
131
+ */
132
+ function watchRootFor(entryPath) {
133
+ const start = dirname(entryPath);
134
+ let dir = start;
135
+ for (;;) {
136
+ if (existsSync(join(dir, "package.json")) || existsSync(join(dir, "tsconfig.json"))) return dir;
137
+ const parent = dirname(dir);
138
+ if (parent === dir) return start;
139
+ dir = parent;
140
+ }
141
+ }
142
+ var IGNORED_DIR_NAMES = /* @__PURE__ */ new Set([
143
+ "node_modules",
144
+ "dist",
145
+ ".git"
146
+ ]);
147
+ /**
148
+ * Watch a directory tree with one non-recursive `fs.watch` per directory, skipping
149
+ * node_modules/dist/.git and never following symlinks. `fs.watch({recursive})` has no
150
+ * exclusion API, so on a real project it would descend into node_modules — tens of
151
+ * thousands of inotify watches. Whenever an event fires in a directory it is re-scanned,
152
+ * which picks up newly created subdirectories. Returns a stop function.
153
+ */
154
+ function watchTree(root, onEvent) {
155
+ const watchers = /* @__PURE__ */ new Map();
156
+ const add = (dir) => {
157
+ if (watchers.has(dir)) return;
158
+ try {
159
+ watchers.set(dir, watch(dir, (_event, filename) => {
160
+ scan(dir);
161
+ onEvent(filename);
162
+ }));
163
+ } catch {}
164
+ };
165
+ const scan = (dir) => {
166
+ let entries;
167
+ try {
168
+ entries = readdirSync(dir, { withFileTypes: true });
169
+ } catch {
170
+ return;
171
+ }
172
+ for (const entry of entries) {
173
+ if (!entry.isDirectory() || IGNORED_DIR_NAMES.has(entry.name)) continue;
174
+ const child = join(dir, entry.name);
175
+ if (watchers.has(child)) continue;
176
+ add(child);
177
+ scan(child);
178
+ }
179
+ };
180
+ add(root);
181
+ scan(root);
182
+ return () => {
183
+ for (const watcher of watchers.values()) watcher.close();
184
+ watchers.clear();
185
+ };
186
+ }
119
187
  //#endregion
120
188
  //#region src/disposeShape.ts
121
189
  function disposeShape(shape) {
@@ -435,9 +503,9 @@ program.command("init").argument("<name>", "part name; scaffolds <name>.brep.ts
435
503
  });
436
504
  program.command("watch").argument("<file>", "path to a .brep.ts module; re-verifies on each save until Ctrl-C").action((file) => {
437
505
  const path = resolve(file);
438
- const run = async () => {
506
+ const run = async (fresh) => {
439
507
  try {
440
- const { report, shape } = await runPart(path);
508
+ const { report, shape } = await runPart(path, { freshImport: fresh });
441
509
  try {
442
510
  process.stdout.write(serializeReport(report) + "\n");
443
511
  } finally {
@@ -447,18 +515,33 @@ program.command("watch").argument("<file>", "path to a .brep.ts module; re-verif
447
515
  process.stderr.write(`watch run failed: ${e.message}\n`);
448
516
  }
449
517
  };
450
- const { trigger } = debounce(run, 150);
451
- process.stderr.write(`watching ${path} (Ctrl-C to stop)\n`);
452
- run();
453
- const watcher = watch(dirname(path), (_event, filename) => {
454
- if (filename === void 0 || filename === null) {
455
- trigger();
518
+ let inFlight = false;
519
+ let rerunQueued = false;
520
+ const start = (fresh) => {
521
+ inFlight = true;
522
+ run(fresh).finally(() => {
523
+ inFlight = false;
524
+ if (rerunQueued) {
525
+ rerunQueued = false;
526
+ start(true);
527
+ }
528
+ });
529
+ };
530
+ const schedule = () => {
531
+ if (inFlight) {
532
+ rerunQueued = true;
456
533
  return;
457
534
  }
458
- if (basename(path) === filename.toString()) trigger();
535
+ start(true);
536
+ };
537
+ const { trigger } = debounce(schedule, 150);
538
+ process.stderr.write(`watching ${path} (Ctrl-C to stop)\n`);
539
+ start(false);
540
+ const stopWatching = watchTree(watchRootFor(path), (filename) => {
541
+ if (isWatchRelevant(filename)) trigger();
459
542
  });
460
543
  const stop = () => {
461
- watcher.close();
544
+ stopWatching();
462
545
  process.exit(0);
463
546
  };
464
547
  process.on("SIGINT", stop);
@@ -3,3 +3,19 @@ export declare function debounce(fn: () => void | Promise<void>, delayMs?: numbe
3
3
  trigger: () => void;
4
4
  cancel: () => void;
5
5
  };
6
+ export declare function isWatchRelevant(filename: string | Buffer | null | undefined): boolean;
7
+ /**
8
+ * Root the watcher at the project, not the entry's own directory: with the common
9
+ * `src/main.ts` layout, tsconfig.json (whose JSX options change how sources transpile)
10
+ * and `../` imports live one level up. Nearest package.json or tsconfig.json walking up
11
+ * wins; entries with no project marker fall back to their own directory.
12
+ */
13
+ export declare function watchRootFor(entryPath: string): string;
14
+ /**
15
+ * Watch a directory tree with one non-recursive `fs.watch` per directory, skipping
16
+ * node_modules/dist/.git and never following symlinks. `fs.watch({recursive})` has no
17
+ * exclusion API, so on a real project it would descend into node_modules — tens of
18
+ * thousands of inotify watches. Whenever an event fires in a directory it is re-scanned,
19
+ * which picks up newly created subdirectories. Returns a stop function.
20
+ */
21
+ export declare function watchTree(root: string, onEvent: (filename: string | Buffer | null | undefined) => void): () => void;
@@ -19,8 +19,9 @@ function toolDir() {
19
19
  }
20
20
  }
21
21
  function loaderUrl(dir) {
22
- const built = resolve(dir, "dist", "loader", "brepjsResolve.mjs");
23
22
  const source = resolve(dir, "src", "loader", "brepjsResolve.mjs");
23
+ const built = resolve(dir, "dist", "loader", "brepjsResolve.mjs");
24
+ if (import.meta.url.startsWith(pathToFileURL(resolve(dir, "src") + "/").href)) return pathToFileURL(source).href;
24
25
  return pathToFileURL(existsSync(built) ? built : source).href;
25
26
  }
26
27
  function registerHook() {
@@ -696,6 +697,33 @@ function packageRootOf(startDir, name) {
696
697
  dir = dirname(dir);
697
698
  }
698
699
  }
700
+ /**
701
+ * JSX options for a part come from the nearest tsconfig.json — the same source the
702
+ * runtime load hook reads — so `--check` and execution agree on the dialect
703
+ * (families projects set `jsx: react-jsx` + `jsxImportSource: brepjs-families`).
704
+ * A `.tsx` part with nothing configured defaults to the automatic runtime.
705
+ */
706
+ function jsxCompilerOptions(partPath) {
707
+ const out = {};
708
+ const configPath = ts.findConfigFile(dirname(partPath), (f) => ts.sys.fileExists(f));
709
+ if (configPath) {
710
+ const host = {
711
+ ...ts.sys,
712
+ onUnRecoverableConfigFileDiagnostic: () => {}
713
+ };
714
+ const parsed = ts.getParsedCommandLineOfConfigFile(configPath, void 0, host);
715
+ if (parsed) {
716
+ for (const key of [
717
+ "jsx",
718
+ "jsxImportSource",
719
+ "jsxFactory",
720
+ "jsxFragmentFactory"
721
+ ]) if (parsed.options[key] !== void 0) out[key] = parsed.options[key];
722
+ }
723
+ }
724
+ if (partPath.endsWith(".tsx") && out.jsx === void 0) out.jsx = ts.JsxEmit.ReactJSX;
725
+ return out;
726
+ }
699
727
  var COMPILER_OPTIONS = {
700
728
  target: ts.ScriptTarget.ES2022,
701
729
  module: ts.ModuleKind.ESNext,
@@ -747,7 +775,10 @@ function diagnosticToErrorInfo(d) {
747
775
  */
748
776
  function typecheckPart(partPath, toolDir) {
749
777
  const dts = resolveBrepjsTypes(partPath, toolDir);
750
- const options = { ...COMPILER_OPTIONS };
778
+ const options = {
779
+ ...COMPILER_OPTIONS,
780
+ ...jsxCompilerOptions(partPath)
781
+ };
751
782
  if (dts) options.paths = { brepjs: [dts] };
752
783
  const typesRoot = nodeTypesRoot(partPath, toolDir);
753
784
  if (typesRoot) {
@@ -800,12 +831,15 @@ function buildMaterialMap(m, spec) {
800
831
  }
801
832
  return map.size > 0 ? { map } : {};
802
833
  }
803
- async function loadPart(modulePath) {
834
+ var importGeneration = 0;
835
+ async function loadPart(modulePath, fresh = false) {
836
+ const url = new URL(pathToFileURL(modulePath).href);
837
+ if (fresh) url.searchParams.set("v", String(++importGeneration));
804
838
  try {
805
- return await import(pathToFileURL(modulePath).href);
839
+ return await import(url.href);
806
840
  } catch (e) {
807
841
  const msg = e instanceof Error ? e.message : String(e);
808
- if (/\.[mc]?tsx?$/.test(modulePath) && /import statement|file extension/i.test(msg)) throw new Error(`cannot load TypeScript part "${modulePath}": author parts in an ESM project (set "type": "module" in package.json) or rename the file to .mts. (${msg})`, { cause: e });
842
+ if (/\.[mc]?tsx?$/.test(modulePath) && /import statement|file extension/i.test(msg)) throw new Error(`cannot load TypeScript part "${modulePath}": author parts in an ESM project (set "type": "module" in package.json). (${msg})`, { cause: e });
809
843
  throw e;
810
844
  }
811
845
  }
@@ -865,7 +899,7 @@ async function runPart(modulePath, opts = {}) {
865
899
  const { isOk, mesh, exportGlb, exportSTEP } = brep;
866
900
  let mod;
867
901
  try {
868
- mod = await loadPart(modulePath);
902
+ mod = await loadPart(modulePath, opts.freshImport);
869
903
  } catch (e) {
870
904
  pushError(report, toErrorInfo("import failed", e));
871
905
  return finalize({
@@ -21,8 +21,9 @@ function toolDir() {
21
21
  }
22
22
  }
23
23
  function loaderUrl(dir) {
24
- const built = (0, node_path.resolve)(dir, "dist", "loader", "brepjsResolve.mjs");
25
24
  const source = (0, node_path.resolve)(dir, "src", "loader", "brepjsResolve.mjs");
25
+ const built = (0, node_path.resolve)(dir, "dist", "loader", "brepjsResolve.mjs");
26
+ if ({}.url.startsWith((0, node_url.pathToFileURL)((0, node_path.resolve)(dir, "src") + "/").href)) return (0, node_url.pathToFileURL)(source).href;
26
27
  return (0, node_url.pathToFileURL)((0, node_fs.existsSync)(built) ? built : source).href;
27
28
  }
28
29
  function registerHook() {
@@ -698,6 +699,33 @@ function packageRootOf(startDir, name) {
698
699
  dir = (0, node_path.dirname)(dir);
699
700
  }
700
701
  }
702
+ /**
703
+ * JSX options for a part come from the nearest tsconfig.json — the same source the
704
+ * runtime load hook reads — so `--check` and execution agree on the dialect
705
+ * (families projects set `jsx: react-jsx` + `jsxImportSource: brepjs-families`).
706
+ * A `.tsx` part with nothing configured defaults to the automatic runtime.
707
+ */
708
+ function jsxCompilerOptions(partPath) {
709
+ const out = {};
710
+ const configPath = typescript.default.findConfigFile((0, node_path.dirname)(partPath), (f) => typescript.default.sys.fileExists(f));
711
+ if (configPath) {
712
+ const host = {
713
+ ...typescript.default.sys,
714
+ onUnRecoverableConfigFileDiagnostic: () => {}
715
+ };
716
+ const parsed = typescript.default.getParsedCommandLineOfConfigFile(configPath, void 0, host);
717
+ if (parsed) {
718
+ for (const key of [
719
+ "jsx",
720
+ "jsxImportSource",
721
+ "jsxFactory",
722
+ "jsxFragmentFactory"
723
+ ]) if (parsed.options[key] !== void 0) out[key] = parsed.options[key];
724
+ }
725
+ }
726
+ if (partPath.endsWith(".tsx") && out.jsx === void 0) out.jsx = typescript.default.JsxEmit.ReactJSX;
727
+ return out;
728
+ }
701
729
  var COMPILER_OPTIONS = {
702
730
  target: typescript.default.ScriptTarget.ES2022,
703
731
  module: typescript.default.ModuleKind.ESNext,
@@ -749,7 +777,10 @@ function diagnosticToErrorInfo(d) {
749
777
  */
750
778
  function typecheckPart(partPath, toolDir) {
751
779
  const dts = resolveBrepjsTypes(partPath, toolDir);
752
- const options = { ...COMPILER_OPTIONS };
780
+ const options = {
781
+ ...COMPILER_OPTIONS,
782
+ ...jsxCompilerOptions(partPath)
783
+ };
753
784
  if (dts) options.paths = { brepjs: [dts] };
754
785
  const typesRoot = nodeTypesRoot(partPath, toolDir);
755
786
  if (typesRoot) {
@@ -802,12 +833,15 @@ function buildMaterialMap(m, spec) {
802
833
  }
803
834
  return map.size > 0 ? { map } : {};
804
835
  }
805
- async function loadPart(modulePath) {
836
+ var importGeneration = 0;
837
+ async function loadPart(modulePath, fresh = false) {
838
+ const url = new URL((0, node_url.pathToFileURL)(modulePath).href);
839
+ if (fresh) url.searchParams.set("v", String(++importGeneration));
806
840
  try {
807
- return await import((0, node_url.pathToFileURL)(modulePath).href);
841
+ return await import(url.href);
808
842
  } catch (e) {
809
843
  const msg = e instanceof Error ? e.message : String(e);
810
- if (/\.[mc]?tsx?$/.test(modulePath) && /import statement|file extension/i.test(msg)) throw new Error(`cannot load TypeScript part "${modulePath}": author parts in an ESM project (set "type": "module" in package.json) or rename the file to .mts. (${msg})`, { cause: e });
844
+ if (/\.[mc]?tsx?$/.test(modulePath) && /import statement|file extension/i.test(msg)) throw new Error(`cannot load TypeScript part "${modulePath}": author parts in an ESM project (set "type": "module" in package.json). (${msg})`, { cause: e });
811
845
  throw e;
812
846
  }
813
847
  }
@@ -867,7 +901,7 @@ async function runPart(modulePath, opts = {}) {
867
901
  const { isOk, mesh, exportGlb, exportSTEP } = brep;
868
902
  let mod;
869
903
  try {
870
- mod = await loadPart(modulePath);
904
+ mod = await loadPart(modulePath, opts.freshImport);
871
905
  } catch (e) {
872
906
  pushError(report, toErrorInfo("import failed", e));
873
907
  return finalize({
@@ -1,4 +1,6 @@
1
- import { pathToFileURL } from 'node:url';
1
+ import { pathToFileURL, fileURLToPath } from 'node:url';
2
+ import { readFileSync } from 'node:fs';
3
+ import { dirname } from 'node:path';
2
4
 
3
5
  // Prefer-local resolution hook for the bundled `brep` CLI.
4
6
  //
@@ -12,6 +14,13 @@ import { pathToFileURL } from 'node:url';
12
14
  // Critical single-instance property: the bundled fallback always resolves against the
13
15
  // SAME tool directory regardless of who imports, so the CLI's own `brepjs` and the
14
16
  // part's `import 'brepjs'` collapse to one module URL — one initialized kernel realm.
17
+ //
18
+ // The same hook also carries a `load` hook that transpiles `.ts`/`.mts`/`.tsx` sources
19
+ // (Node's native type-stripping cannot load `.tsx` at all), and a relative-specifier
20
+ // fallback that maps `./dep.js` onto an on-disk `dep.ts`/`dep.tsx` (house style writes
21
+ // `.js` specifiers over TS sources; Node does not do this mapping). Keeping all of this
22
+ // in the ONE registered hook — instead of reaching for tsx — is what preserves the
23
+ // single-realm property above.
15
24
 
16
25
  let toolBaseUrl;
17
26
 
@@ -35,23 +44,149 @@ function isManagedSpecifier(specifier) {
35
44
  );
36
45
  }
37
46
 
38
- export async function resolve(specifier, context, nextResolve) {
39
- if (!isManagedSpecifier(specifier)) {
40
- return nextResolve(specifier, context);
47
+ // Watch/preview cache-busting: the ESM module cache is keyed by full URL, so a rerun
48
+ // that re-imports the same file URL re-executes the FIRST version forever. The watch
49
+ // loop imports the entry with `?v=N`; propagating that query to every user-space file
50
+ // the entry (transitively) imports makes each rerun a fresh module graph. Bare and
51
+ // managed specifiers are never versioned, so `brepjs`/`occt-wasm` keep their stable
52
+ // URLs and the initialized kernel realm survives across reruns.
53
+ function versionParam(parentURL) {
54
+ if (!parentURL || !parentURL.startsWith('file:')) return undefined;
55
+ try {
56
+ return new URL(parentURL).searchParams.get('v') ?? undefined;
57
+ } catch {
58
+ return undefined;
41
59
  }
60
+ }
61
+
62
+ function withInheritedVersion(resolution, version) {
63
+ const url = resolution && resolution.url;
64
+ if (!version || !url || !url.startsWith('file:') || url.includes('/node_modules/')) {
65
+ return resolution;
66
+ }
67
+ const u = new URL(url);
68
+ u.searchParams.set('v', version);
69
+ return { ...resolution, url: u.href };
70
+ }
71
+
72
+ async function resolveWithTsFallback(specifier, context, nextResolve) {
42
73
  try {
43
- // Default resolution: finds a LOCAL brepjs/occt-wasm in the consumer's project.
44
74
  return await nextResolve(specifier, context);
45
75
  } catch (err) {
46
- if (!toolBaseUrl) throw err;
47
- // Re-run the DEFAULT resolver, but as if the import came from inside the tool's package
48
- // (parentURL = the tool's package.json) so it walks the tool's node_modules and honors
49
- // package "exports" for subpaths. `import.meta.resolve` is unavailable in the hooks
50
- // thread, so this nextResolve-with-rebased-parent is the resolver we have.
76
+ if (specifier.endsWith('.js')) {
77
+ const stem = specifier.slice(0, -'.js'.length);
78
+ for (const ext of ['.ts', '.tsx']) {
79
+ try {
80
+ return await nextResolve(stem + ext, context);
81
+ } catch {
82
+ // keep trying
83
+ }
84
+ }
85
+ }
86
+ throw err;
87
+ }
88
+ }
89
+
90
+ export async function resolve(specifier, context, nextResolve) {
91
+ if (isManagedSpecifier(specifier)) {
51
92
  try {
52
- return await nextResolve(specifier, { ...context, parentURL: toolBaseUrl });
53
- } catch {
54
- throw err;
93
+ // Default resolution: finds a LOCAL brepjs/occt-wasm in the consumer's project.
94
+ return await nextResolve(specifier, context);
95
+ } catch (err) {
96
+ if (!toolBaseUrl) throw err;
97
+ // Re-run the DEFAULT resolver, but as if the import came from inside the tool's package
98
+ // (parentURL = the tool's package.json) so it walks the tool's node_modules and honors
99
+ // package "exports" for subpaths. `import.meta.resolve` is unavailable in the hooks
100
+ // thread, so this nextResolve-with-rebased-parent is the resolver we have.
101
+ try {
102
+ return await nextResolve(specifier, { ...context, parentURL: toolBaseUrl });
103
+ } catch {
104
+ throw err;
105
+ }
106
+ }
107
+ }
108
+ if (!specifier.startsWith('./') && !specifier.startsWith('../')) {
109
+ return nextResolve(specifier, context);
110
+ }
111
+ const version = versionParam(context.parentURL);
112
+ return withInheritedVersion(
113
+ await resolveWithTsFallback(specifier, context, nextResolve),
114
+ version
115
+ );
116
+ }
117
+
118
+ // --- TypeScript loading ---------------------------------------------------------------
119
+
120
+ // `typescript` is already a runtime dependency (the `--check` path imports it on the main
121
+ // thread); here it loads lazily in the hooks thread only when a TS source is actually
122
+ // imported, so pure-JS projects never pay for it.
123
+ let tsPromise;
124
+
125
+ function loadTypescript() {
126
+ tsPromise ??= import('typescript').then((mod) => mod.default ?? mod);
127
+ return tsPromise;
128
+ }
129
+
130
+ // JSX cannot be transpiled without knowing the project's dialect (families projects set
131
+ // `jsx: react-jsx` + `jsxImportSource: brepjs-families`), so read it from the nearest
132
+ // tsconfig.json — the same file the author's editor uses. Cached per directory; config
133
+ // parsing honors `extends`.
134
+ const jsxOptionsCache = new Map();
135
+
136
+ // Each watch rerun imports with a fresh `?v=N`; treat a new generation as a config
137
+ // epoch so tsconfig edits made between reruns are picked up instead of served stale.
138
+ let jsxOptionsGeneration;
139
+
140
+ function bumpJsxOptionsGeneration(version) {
141
+ if (version !== null && version !== jsxOptionsGeneration) {
142
+ jsxOptionsGeneration = version;
143
+ jsxOptionsCache.clear();
144
+ }
145
+ }
146
+
147
+ function jsxOptionsFor(ts, filePath) {
148
+ const dir = dirname(filePath);
149
+ const cached = jsxOptionsCache.get(dir);
150
+ if (cached) return cached;
151
+ const options = {};
152
+ const configPath = ts.findConfigFile(dir, ts.sys.fileExists);
153
+ if (configPath) {
154
+ const host = { ...ts.sys, onUnRecoverableConfigFileDiagnostic: () => {} };
155
+ const parsed = ts.getParsedCommandLineOfConfigFile(configPath, undefined, host);
156
+ if (parsed) {
157
+ for (const key of ['jsx', 'jsxImportSource', 'jsxFactory', 'jsxFragmentFactory']) {
158
+ if (parsed.options[key] !== undefined) options[key] = parsed.options[key];
159
+ }
55
160
  }
56
161
  }
162
+ jsxOptionsCache.set(dir, options);
163
+ return options;
164
+ }
165
+
166
+ const TS_SOURCE_RE = /\.(?:ts|mts|tsx)$/;
167
+ const DECLARATION_RE = /\.d\.(?:ts|mts)$/;
168
+
169
+ export async function load(url, context, nextLoad) {
170
+ if (!url.startsWith('file:')) return nextLoad(url, context);
171
+ const parsed = new URL(url);
172
+ if (!TS_SOURCE_RE.test(parsed.pathname) || DECLARATION_RE.test(parsed.pathname)) {
173
+ return nextLoad(url, context);
174
+ }
175
+ const filePath = fileURLToPath(parsed);
176
+ const source = readFileSync(filePath, 'utf8');
177
+ const ts = await loadTypescript();
178
+ bumpJsxOptionsGeneration(parsed.searchParams.get('v'));
179
+ const { outputText } = ts.transpileModule(source, {
180
+ fileName: filePath,
181
+ compilerOptions: {
182
+ module: ts.ModuleKind.ESNext,
183
+ target: ts.ScriptTarget.ES2022,
184
+ // A .tsx with no configured dialect still needs SOME emit mode; the automatic
185
+ // runtime is TS's modern default recommendation and what the scaffold ships.
186
+ ...(parsed.pathname.endsWith('.tsx') ? { jsx: ts.JsxEmit.ReactJSX } : {}),
187
+ ...jsxOptionsFor(ts, filePath),
188
+ inlineSourceMap: true,
189
+ },
190
+ });
191
+ return { format: 'module', source: outputText, shortCircuit: true };
57
192
  }
@@ -43,9 +43,9 @@ function positiveOrDefault(value, fallback) {
43
43
  return value !== void 0 && Number.isFinite(value) && value > 0 ? value : fallback;
44
44
  }
45
45
  function defaultCliEntry() {
46
- const builtJs = (0, node_url.fileURLToPath)(new URL("data:video/mp2t;base64,IyEvdXNyL2Jpbi9lbnYgbm9kZQppbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJzsKaW1wb3J0IHsgd3JpdGVGaWxlU3luYywgd2F0Y2ggYXMgZnNXYXRjaCwgcmVhbHBhdGhTeW5jLCBnbG9iU3luYyB9IGZyb20gJ25vZGU6ZnMnOwppbXBvcnQgeyByZXNvbHZlLCBqb2luLCBiYXNlbmFtZSwgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7CmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnOwppbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnOwppbXBvcnQgeyBydW5QYXJ0IH0gZnJvbSAnLi4vdmVyaWZ5L3J1blBhcnQuanMnOwppbXBvcnQgeyBwdXNoRXJyb3IsIHJlcG9ydE9rLCBzZXJpYWxpemVSZXBvcnQsIHR5cGUgVmVyaWZ5UmVwb3J0IH0gZnJvbSAnLi4vdmVyaWZ5L3JlcG9ydC5qcyc7CmltcG9ydCB7IHJ1bk1lYXN1cmUgfSBmcm9tICcuLi92ZXJpZnkvbWVhc3VyZS5qcyc7CmltcG9ydCB7IHJ1bkRpZmYgfSBmcm9tICcuLi92ZXJpZnkvZGlmZi5qcyc7CmltcG9ydCB7IHNjYWZmb2xkUGFydCB9IGZyb20gJy4vc2NhZmZvbGQuanMnOwppbXBvcnQgeyBkZWJvdW5jZSwgREVGQVVMVF9ERUJPVU5DRV9NUyB9IGZyb20gJy4vd2F0Y2guanMnOwppbXBvcnQgeyBleHBvcnRQYXJ0IH0gZnJvbSAnLi9leHBvcnRQYXJ0LmpzJzsKaW1wb3J0IHsgb3BlbkJyb3dzZXIsIHNob3VsZEF1dG9PcGVuIH0gZnJvbSAnLi9vcGVuQnJvd3Nlci5qcyc7CmltcG9ydCB7IGRpc3Bvc2VTaGFwZSB9IGZyb20gJy4uL2Rpc3Bvc2VTaGFwZS5qcyc7CmltcG9ydCB0eXBlIHsgc2hvb3QgYXMgU2hvb3RGbiB9IGZyb20gJy4uL3NuYXBzaG90L3Nob290LmpzJzsKaW1wb3J0IHsgYWltZWRTZWN0aW9uLCBmZWF0dXJlTWFya3MgfSBmcm9tICcuLi9zbmFwc2hvdC9haW1pbmcuanMnOwoKLy8gT0NDVCdzIFdBU00gU1RFUCB3cml0ZXIgZW1pdHMgYSAiU3RhdGlzdGljcyBvbiBUcmFuc2ZlciIgYmFubmVyIHZpYSBjb25zb2xlLmxvZwovLyAoRW1zY3JpcHRlbidzIGRlZmF1bHQgc3Rkb3V0IHNpbmspLiBUaGUgQ0xJIG93bnMgc3Rkb3V0IGZvciBtYWNoaW5lLXJlYWRhYmxlIEpTT04sCi8vIHNvIGRpdmVydCB0aGF0IGtlcm5lbCBjaGF0dGVyIHRvIHN0ZGVyciB0byBrZWVwIHN0ZG91dCBhIHNpbmdsZSBjbGVhbiBKU09OIGRvY3VtZW50LgovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZSAtLSByZXJvdXRlIGtlcm5lbCBzdGRvdXQgY2hhdHRlciBvZmYgdGhlIEpTT04gY2hhbm5lbApjb25zb2xlLmxvZyA9ICguLi5hcmdzOiB1bmtub3duW10pID0+IHsKICBwcm9jZXNzLnN0ZGVyci53cml0ZShhcmdzLm1hcChTdHJpbmcpLmpvaW4oJyAnKSArICdcbicpOwp9OwoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRTbmFwc2hvdFNob290KCk6IFByb21pc2U8dHlwZW9mIFNob290Rm4gfCB1bmRlZmluZWQ+IHsKICB0cnkgewogICAgY29uc3QgbW9kID0gYXdhaXQgaW1wb3J0KCcuLi9zbmFwc2hvdC9zaG9vdC5qcycpOwogICAgcmV0dXJuIG1vZC5zaG9vdDsKICB9IGNhdGNoIHsKICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdzbmFwc2hvdHMgbmVlZCBwdXBwZXRlZXIvQ2hyb21lIOKAlCBydW46IG5wbSBpIHB1cHBldGVlclxuJyk7CiAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICAgIHJldHVybiB1bmRlZmluZWQ7CiAgfQp9Cgpjb25zdCBwcm9ncmFtID0gbmV3IENvbW1hbmQoKTsKcHJvZ3JhbS5uYW1lKCdicmVwJyk7Cgpwcm9ncmFtCiAgLmNvbW1hbmQoJ3ZlcmlmeScsIHsgaXNEZWZhdWx0OiB0cnVlIH0pCiAgLmFyZ3VtZW50KAogICAgJzxmaWxlcy4uLj4nLAogICAgJ3BhdGgocykgb3IgZ2xvYihzKSB0byAuYnJlcC50cyBtb2R1bGVzOyBtdWx0aXBsZSBmaWxlcyDihpIgYSBiYXRjaCB2YWxpZGl0eSBKU09OIGFycmF5JwogICkKICAub3B0aW9uKCctLXN0ZXAgPG91dD4nLCAnd3JpdGUgdGhlIHByaW1hcnkgU1RFUCBhcnRpZmFjdCB0byB0aGlzIHBhdGgnKQogIC5vcHRpb24oJy0tZ2xiIDxvdXQ+JywgJ3dyaXRlIGEgZGVyaXZlZCBHTEIgcHJldmlldyB0byB0aGlzIHBhdGgnKQogIC5vcHRpb24oJy0tanNvbiA8b3V0PicsICd3cml0ZSB0aGUgSlNPTiByZXBvcnQgdG8gdGhpcyBwYXRoJykKICAub3B0aW9uKAogICAgJy0tY2hlY2snLAogICAgJ3R5cGUtY2hlY2sgdGhlIHBhcnQgKGFnYWluc3QgYnJlcGpzIHR5cGVzKSBiZWZvcmUgcnVubmluZzsgc2tpcCBleGVjdXRpb24gb24gdHlwZSBlcnJvcnMnCiAgKQogIC5vcHRpb24oJy0tc25hcHNob3QgPGRpcj4nLCAncmVuZGVyIGlzby9mcm9udC90b3AvcmlnaHQgUE5HcyB0byB0aGlzIGRpciAocmVxdWlyZXMgYnVpbHQgdmlld2VyKScpCiAgLm9wdGlvbigKICAgICctLXNlcnZlJywKICAgICdhZnRlciB2ZXJpZnlpbmcsIHN0YXJ0IGEgcHJldmlldyBzZXJ2ZXIgYW5kIHByaW50IGEgP2Rpcj0mZmlsZT0gZGVlcCBsaW5rIChzdGF5cyBydW5uaW5nKScKICApCiAgLm9wdGlvbignLS1uby1vcGVuJywgJ3dpdGggLS1zZXJ2ZSwgZG8gbm90IGF1dG8tb3BlbiB0aGUgYnJvd3NlciAoanVzdCBwcmludCB0aGUgdmlld2VyIFVSTCknKQogIC5vcHRpb24oCiAgICAnLS1leHBlY3QtY29kZSA8Y29kZT4nLAogICAgJ2V4aXQgMCBvbmx5IGlmIHRoZSByZXBvcnQgZW1pdHMgdGhpcyBlcnJvciBjb2RlIChmb3IgZml4dHVyZXMvZXZhbCByZWNhbGwpJwogICkKICAub3B0aW9uKAogICAgJy0tZXhwZWN0LWludmFsaWQnLAogICAgJ2V4aXQgMCBvbmx5IGlmIHRoZSBwYXJ0IGlzIGludmFsaWQgKG9rOmZhbHNlKSDigJQgZm9yIGtub3duLWJhZCBmaXh0dXJlcycKICApCiAgLm9wdGlvbigKICAgICctLW1ldHJpY3MnLAogICAgJ2NvbXB1dGUgZGV0ZXJtaW5pc3RpYyBtYW51ZmFjdHVyYWJpbGl0eSBtZXRyaWNzIChwZXItYm9keSBicmVha2Rvd24gKyBpbnRlcmZlcmVuY2UgbWF0cml4KSBmb3IgdGhlIGRlc2lnbiBqdWRnZSDigJQgc2xvd2VyOyBvZmYgYnkgZGVmYXVsdCcKICApCiAgLmFjdGlvbigKICAgIGFzeW5jICgKICAgICAgZmlsZXM6IHN0cmluZ1tdLAogICAgICBvcHRzOiB7CiAgICAgICAgc3RlcD86IHN0cmluZzsKICAgICAgICBnbGI/OiBzdHJpbmc7CiAgICAgICAganNvbj86IHN0cmluZzsKICAgICAgICBjaGVjaz86IGJvb2xlYW47CiAgICAgICAgc25hcHNob3Q/OiBzdHJpbmc7CiAgICAgICAgc2VydmU/OiBib29sZWFuOwogICAgICAgIGV4cGVjdENvZGU/OiBzdHJpbmc7CiAgICAgICAgZXhwZWN0SW52YWxpZD86IGJvb2xlYW47CiAgICAgICAgbWV0cmljcz86IGJvb2xlYW47CiAgICAgICAgLy8gQ29tbWFuZGVyIG1hdGVyaWFsaXplcyBhIG5lZ2F0ZWQgZmxhZyBhcyBhIGNvbmNyZXRlIGJvb2xlYW46IHRydWUgYnkKICAgICAgICAvLyBkZWZhdWx0LCBmYWxzZSB3aGVuIC0tbm8tb3BlbiBpcyBwYXNzZWQuCiAgICAgICAgb3BlbjogYm9vbGVhbjsKICAgICAgfQogICAgKSA9PiB7CiAgICAgIC8vIEEgcXVvdGVkIGdsb2IgKCJwYXJ0cy8qLmJyZXAudHMiKSBhcnJpdmVzIGFzIG9uZSBsaXRlcmFsIGFyZywgYSBzaGVsbC1leHBhbmRlZCBvbmUgYXMgbWFueTsKICAgICAgLy8gZ2xvYlN5bmMgaGFuZGxlcyBib3RoIChhIGxpdGVyYWwgZmlsZW5hbWUgbWF0Y2hlcyBpdHNlbGYpLCBmYWxsaW5nIGJhY2sgdG8gdGhlIHJhdyBhcmcgc28gYQogICAgICAvLyBtaXNzaW5nIHBhdGggc3RpbGwgcnVucyBhbmQgcmVwb3J0cyBpdHMgb3duIGVycm9yLgogICAgICBjb25zdCB0YXJnZXRzID0gWwogICAgICAgIC4uLm5ldyBTZXQoCiAgICAgICAgICBmaWxlcy5mbGF0TWFwKChmKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IG0gPSBnbG9iU3luYyhmKTsKICAgICAgICAgICAgcmV0dXJuIG0ubGVuZ3RoID8gbSA6IFtmXTsKICAgICAgICAgIH0pCiAgICAgICAgKSwKICAgICAgXS5tYXAoKHApID0+IHJlc29sdmUocCkpOwoKICAgICAgaWYgKHRhcmdldHMubGVuZ3RoID4gMSkgewogICAgICAgIC8vIEJhdGNoOiB2YWxpZGl0eS1vbmx5IEpTT04gYXJyYXkuIFRoZSBzaW5nbGUtZmlsZSBhcnRpZmFjdCBmbGFncyBkb24ndCBhcHBseS4KICAgICAgICBpZiAoCiAgICAgICAgICBvcHRzLnN0ZXAgfHwKICAgICAgICAgIG9wdHMuc2VydmUgfHwKICAgICAgICAgIG9wdHMuc25hcHNob3QgfHwKICAgICAgICAgIG9wdHMuZ2xiIHx8CiAgICAgICAgICBvcHRzLmV4cGVjdENvZGUgfHwKICAgICAgICAgIG9wdHMuZXhwZWN0SW52YWxpZAogICAgICAgICkgewogICAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoCiAgICAgICAgICAgICdiYXRjaCBtb2RlOiAtLXN0ZXAvLS1nbGIvLS1zZXJ2ZS8tLXNuYXBzaG90Ly0tZXhwZWN0LWNvZGUvLS1leHBlY3QtaW52YWxpZCBpZ25vcmVkIChzaW5nbGUtZmlsZSBvbmx5KVxuJwogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVzdWx0czogeyBmaWxlOiBzdHJpbmc7IG9rOiBib29sZWFuOyByZXBvcnQ6IFZlcmlmeVJlcG9ydCB9W10gPSBbXTsKICAgICAgICBmb3IgKGNvbnN0IGYgb2YgdGFyZ2V0cykgewogICAgICAgICAgY29uc3QgeyByZXBvcnQsIHNoYXBlIH0gPSBhd2FpdCBydW5QYXJ0KGYsIHsKICAgICAgICAgICAgY2hlY2s6IEJvb2xlYW4ob3B0cy5jaGVjayksCiAgICAgICAgICAgIG1ldHJpY3M6IEJvb2xlYW4ob3B0cy5tZXRyaWNzKSwKICAgICAgICAgIH0pOwogICAgICAgICAgZGlzcG9zZVNoYXBlKHNoYXBlKTsKICAgICAgICAgIHJlc3VsdHMucHVzaCh7IGZpbGU6IGYsIG9rOiByZXBvcnRPayhyZXBvcnQpLCByZXBvcnQgfSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShyZXN1bHRzLCBudWxsLCAyKTsKICAgICAgICBpZiAob3B0cy5qc29uICYmIG9wdHMuanNvbiAhPT0gJy0nKSB3cml0ZUZpbGVTeW5jKG9wdHMuanNvbiwganNvbik7CiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoanNvbiArICdcbicpOwogICAgICAgIGlmIChyZXN1bHRzLnNvbWUoKHIpID0+ICFyLm9rKSkgcHJvY2Vzcy5leGl0Q29kZSA9IDE7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBjb25zdCBmaWxlID0gdGFyZ2V0c1swXSA/PyBmaWxlc1swXSA/PyAnJzsKICAgICAgLy8gVGhlIFdBU00gdmlld2VyIGxvYWRzIGEgQ0FEIGZpbGUgKGl0IGNhbid0IHJ1biBhIC5icmVwLnRzKSwgc28gLS1zbmFwc2hvdC8tLXNlcnZlCiAgICAgIC8vIHN0YWdlIHRoZSBwcmltYXJ5IFNURVAgYW5kIHBvaW50IHRoZSB2aWV3ZXIgYXQgaXQgdmlhID9kaXI9JmZpbGU9LiAtLWdsYiBpcyBpdHMgb3duIGFydGlmYWN0LgogICAgICBjb25zdCB3YW50U3RlcCA9IEJvb2xlYW4ob3B0cy5zdGVwKSB8fCBCb29sZWFuKG9wdHMuc25hcHNob3QpIHx8IEJvb2xlYW4ob3B0cy5zZXJ2ZSk7CiAgICAgIGNvbnN0IHsgcmVwb3J0LCBzdGVwLCBnbGIsIHNoYXBlIH0gPSBhd2FpdCBydW5QYXJ0KHJlc29sdmUoZmlsZSksIHsKICAgICAgICBzdGVwOiB3YW50U3RlcCwKICAgICAgICBnbGI6IEJvb2xlYW4ob3B0cy5nbGIpLAogICAgICAgIGNoZWNrOiBCb29sZWFuKG9wdHMuY2hlY2spLAogICAgICAgIC8vIEEgc25hcHNob3QgZmVlZHMgdGhlIGRlc2lnbiBqdWRnZSwgc28gY29tcHV0ZSBtZXRyaWNzIHRvbyAoYm9yZXMg4oaSIGFuIGFpbWVkIHNlY3Rpb24gc2hvdCkuCiAgICAgICAgbWV0cmljczogQm9vbGVhbihvcHRzLm1ldHJpY3MpIHx8IEJvb2xlYW4ob3B0cy5zbmFwc2hvdCksCiAgICAgIH0pOwogICAgICBsZXQgc3RlcFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdHMuc3RlcDsKICAgICAgdHJ5IHsKICAgICAgICBpZiAob3B0cy5nbGIgJiYgZ2xiKSB3cml0ZUZpbGVTeW5jKG9wdHMuZ2xiLCBCdWZmZXIuZnJvbShnbGIpKTsKCiAgICAgICAgaWYgKHdhbnRTdGVwICYmIHN0ZXApIHsKICAgICAgICAgIHN0ZXBQYXRoID0gb3B0cy5zdGVwID8/IGpvaW4odG1wZGlyKCksIGBicmVwLSR7YmFzZW5hbWUoZmlsZSl9LnN0ZXBgKTsKICAgICAgICAgIHdyaXRlRmlsZVN5bmMoc3RlcFBhdGgsIEJ1ZmZlci5mcm9tKHN0ZXApKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9wdHMuc25hcHNob3QgJiYgc3RlcFBhdGgpIHsKICAgICAgICAgIGNvbnN0IHNob290ID0gYXdhaXQgbG9hZFNuYXBzaG90U2hvb3QoKTsgLy8gbGF6eToga2VlcHMgcHVwcGV0ZWVyIG9mZiB0aGUgZGVmYXVsdCBwYXRoCiAgICAgICAgICBpZiAoc2hvb3QpIHsKICAgICAgICAgICAgY29uc3Qgc2VjdGlvbiA9IGFpbWVkU2VjdGlvbigKICAgICAgICAgICAgICByZXBvcnQubWFudWZhY3R1cmFiaWxpdHk/LmJvcmVzID8/IFtdLAogICAgICAgICAgICAgIHJlcG9ydC5tZWFzdXJlbWVudHMuYm91bmRzCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNvbnN0IG1hcmtzID0gZmVhdHVyZU1hcmtzKHJlcG9ydC5ib2RpZXMgPz8gW10sIHJlcG9ydC5tYW51ZmFjdHVyYWJpbGl0eT8uYm9yZXMgPz8gW10pOwogICAgICAgICAgICBjb25zdCB7IHBuZ3MgfSA9IGF3YWl0IHNob290KHsKICAgICAgICAgICAgICBmaWxlOiBzdGVwUGF0aCwKICAgICAgICAgICAgICBvdXREaXI6IG9wdHMuc25hcHNob3QsCiAgICAgICAgICAgICAgLi4uKHNlY3Rpb24gPyB7IHNlY3Rpb24gfSA6IHt9KSwKICAgICAgICAgICAgICAuLi4obWFya3MubGVuZ3RoID4gMCA/IHsgbWFya3MgfSA6IHt9KSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIERpYWdub3N0aWMgcGF0aHMgZ28gdG8gc3RkZXJyIOKAlCBzdGRvdXQgc3RheXMgYSBzaW5nbGUgY2xlYW4gSlNPTiBkb2N1bWVudC4KICAgICAgICAgICAgZm9yIChjb25zdCBwIG9mIHBuZ3MpIHByb2Nlc3Muc3RkZXJyLndyaXRlKGBzbmFwc2hvdDogJHtwfVxuYCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChvcHRzLnNuYXBzaG90KSB7CiAgICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnc25hcHNob3Qgc2tpcHBlZDogU1RFUCBleHBvcnQgcHJvZHVjZWQgbm8gYXJ0aWZhY3RcbicpOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHB1c2hFcnJvcihyZXBvcnQsIHsgbWVzc2FnZTogYGFydGlmYWN0IHdyaXRlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gIH0pOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIC8vIFRoZSBzaGFwZSBpcyBhIGxpdmUgV0FTTSBoYW5kbGU7IHJlbGVhc2UgaXQgYmVmb3JlIHRoZSBzZXJ2ZXIgdGFrZXMgb3ZlciAodGhlCiAgICAgICAgLy8gLS1zZXJ2ZSBwYXRoIHN0YXlzIHJ1bm5pbmcsIHNvIGxlYWtpbmcgaGVyZSB3b3VsZCBwZXJzaXN0IGZvciB0aGUgc2VydmVyJ3MgbGlmZXRpbWUpLgogICAgICAgIGRpc3Bvc2VTaGFwZShzaGFwZSk7CiAgICAgIH0KICAgICAgLy8gU2VyaWFsaXplIG9uY2UgYWZ0ZXIgYWxsIGFydGlmYWN0IHdyaXRlcyBzbyB0aGUgLS1qc29uIGZpbGUgYW5kIHN0ZG91dAogICAgICAvLyByZWZsZWN0IHRoZSBzYW1lIHJlcG9ydCAoaW5jbC4gYW55ICJhcnRpZmFjdCB3cml0ZSBmYWlsZWQiIGVycm9yKS4KICAgICAgY29uc3QganNvbiA9IHNlcmlhbGl6ZVJlcG9ydChyZXBvcnQpOwogICAgICAvLyBgLS1qc29uIC1gIGlzIHNhdGlzZmllZCBieSB0aGUgc3Rkb3V0IHdyaXRlIGJlbG93OyBvbmx5IGEgcmVhbCBwYXRoIHdyaXRlcyBhIGZpbGUuCiAgICAgIGlmIChvcHRzLmpzb24gJiYgb3B0cy5qc29uICE9PSAnLScpIHdyaXRlRmlsZVN5bmMob3B0cy5qc29uLCBqc29uKTsKICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoanNvbiArICdcbicpOwogICAgICBpZiAoIXJlcG9ydE9rKHJlcG9ydCkpIHByb2Nlc3MuZXhpdENvZGUgPSAxOwogICAgICAvLyBGaXh0dXJlIGFzc2VydGlvbnMgKFBoYXNlOiB2ZXJpZnktaGVhbCBwcmVjaXNpb24vcmVjYWxsKSBvdmVycmlkZSB0aGUgbm9ybWFsIGV4aXQgY29kZToKICAgICAgLy8gYSBrbm93bi1iYWQgcGFydCBtdXN0IGZhaWwgdGhlICpyaWdodCogd2F5LiBDb2RlcyBjb21lIGZyb20gdGhlIGtlcm5lbC9hdXRob3JpbmcgZXJyb3JzLAogICAgICAvLyBub3QgdGhlIGhpbnQgdGFibGUsIHNvIHRoaXMgbWVhc3VyZXMgdGhlIHZlcmlmaWVyLCBub3QgaXRzIHByb3NlLgogICAgICBpZiAob3B0cy5leHBlY3RJbnZhbGlkIHx8IG9wdHMuZXhwZWN0Q29kZSkgewogICAgICAgIC8vIGhpbnRzIGFyZSBkZXJpdmVkIGZyb20gZXJyb3JJbmZvcywgc28gdGhlIGNvZGVzIGxpdmUgdGhlcmU7IGRlZHVwZSB0byBrZWVwIHRoZSBsaW5lIGNsZWFuLgogICAgICAgIGNvbnN0IGNvZGVzID0gWwogICAgICAgICAgLi4ubmV3IFNldChyZXBvcnQuZXJyb3JJbmZvcy5tYXAoKGUpID0+IGUuY29kZSkuZmlsdGVyKChjKTogYyBpcyBzdHJpbmcgPT4gQm9vbGVhbihjKSkpLAogICAgICAgIF07CiAgICAgICAgY29uc3QgdmFsaWQgPSByZXBvcnRPayhyZXBvcnQpOwogICAgICAgIGNvbnN0IHBhc3MgPQogICAgICAgICAgKCFvcHRzLmV4cGVjdEludmFsaWQgfHwgIXZhbGlkKSAmJiAoIW9wdHMuZXhwZWN0Q29kZSB8fCBjb2Rlcy5pbmNsdWRlcyhvcHRzLmV4cGVjdENvZGUpKTsKICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gcGFzcyA/IDAgOiAxOwogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKAogICAgICAgICAgYGV4cGVjdDogJHtwYXNzID8gJ1BBU1MnIDogJ0ZBSUwnfWAgKwogICAgICAgICAgICAob3B0cy5leHBlY3RDb2RlID8gYCBjb2RlPSR7b3B0cy5leHBlY3RDb2RlfWAgOiAnJykgKwogICAgICAgICAgICAob3B0cy5leHBlY3RJbnZhbGlkID8gJyBpbnZhbGlkJyA6ICcnKSArCiAgICAgICAgICAgIGAgKG9rPSR7dmFsaWR9LCBjb2Rlcz0ke2NvZGVzLmpvaW4oJywnKSB8fCAnbm9uZSd9KVxuYAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHdpbGxTZXJ2ZSA9IEJvb2xlYW4ob3B0cy5zZXJ2ZSkgJiYgc3RlcFBhdGggIT09IHVuZGVmaW5lZCAmJiByZXBvcnRPayhyZXBvcnQpOwogICAgICBpZiAod2lsbFNlcnZlICYmIHN0ZXBQYXRoKSB7CiAgICAgICAgY29uc3QgeyBzZXJ2ZSB9ID0gYXdhaXQgaW1wb3J0KCcuLi9zbmFwc2hvdC9zZXJ2ZS5qcycpOyAvLyBsYXp5OiBubyBzZXJ2ZXIgZGVwcyBvbiB0aGUgZGVmYXVsdCBwYXRoCiAgICAgICAgY29uc3QgeyB1cmwsIHJldXNlZCB9ID0gYXdhaXQgc2VydmUoeyBmaWxlOiBzdGVwUGF0aCB9KTsgLy8gYnVpbGRzIGEgP2Rpcj0mZmlsZT0gVVJMOyBzZXJ2ZXIgcnVucyB1bnRpbCBDdHJsLUMKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShgdmlld2VyOiAke3VybH1cbmApOwogICAgICAgIC8vIEF1dG8tb3BlbiBvbmx5IGZvciBhIGZyZXNobHkgc3RhcnRlZCBzZXJ2ZXIgKGEgcmV1c2VkIG9uZSBhbHJlYWR5IGhhcwogICAgICAgIC8vIGEgdGFiKSBpbiBhbiBpbnRlcmFjdGl2ZSBzZXNzaW9uOyBgLS1uby1vcGVuYCAob3B0cy5vcGVuID09PSBmYWxzZSkKICAgICAgICAvLyBhbHdheXMgc3VwcHJlc3NlcyBpdC4KICAgICAgICBpZiAoIXJldXNlZCAmJiBvcHRzLm9wZW4gJiYgc2hvdWxkQXV0b09wZW4oKSkgewogICAgICAgICAgb3BlbkJyb3dzZXIodXJsKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICApOwoKcHJvZ3JhbQogIC5jb21tYW5kKCdtZWFzdXJlJykKICAuYXJndW1lbnQoJzxhPicsICdwYXRoIHRvIGEgLmJyZXAudHMgbW9kdWxlJykKICAuYXJndW1lbnQoJ1tiXScsICdvcHRpb25hbCBzZWNvbmQgbW9kdWxlOyBpZiBnaXZlbiwgbWVhc3VyZXMgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHBhcnRzJykKICAuYWN0aW9uKGFzeW5jIChhOiBzdHJpbmcsIGI/OiBzdHJpbmcpID0+IHsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1bk1lYXN1cmUocmVzb2x2ZShhKSwgYiA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcmVzb2x2ZShiKSk7CiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgKICAgICAgSlNPTi5zdHJpbmdpZnkoeyBvazogcmVzdWx0LmVycm9ycy5sZW5ndGggPT09IDAsIC4uLnJlc3VsdCB9LCBudWxsLCAyKSArICdcbicKICAgICk7CiAgICBpZiAocmVzdWx0LmVycm9ycy5sZW5ndGggPiAwKSBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICB9KTsKCnByb2dyYW0KICAuY29tbWFuZCgnZGlmZicpCiAgLmFyZ3VtZW50KCc8YT4nLCAncGF0aCB0byB0aGUgYmFzZWxpbmUgLmJyZXAudHMgbW9kdWxlJykKICAuYXJndW1lbnQoJzxiPicsICdwYXRoIHRvIHRoZSBjb21wYXJpc29uIC5icmVwLnRzIG1vZHVsZScpCiAgLmFjdGlvbihhc3luYyAoYTogc3RyaW5nLCBiOiBzdHJpbmcpID0+IHsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1bkRpZmYocmVzb2x2ZShhKSwgcmVzb2x2ZShiKSk7CiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgKICAgICAgSlNPTi5zdHJpbmdpZnkoeyBvazogcmVzdWx0LmVycm9ycy5sZW5ndGggPT09IDAsIC4uLnJlc3VsdCB9LCBudWxsLCAyKSArICdcbicKICAgICk7CiAgICBpZiAocmVzdWx0LmVycm9ycy5sZW5ndGggPiAwKSBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICB9KTsKCnByb2dyYW0KICAuY29tbWFuZCgnc25hcHNob3QnKQogIC5hcmd1bWVudCgKICAgICc8ZmlsZT4nLAogICAgJ3BhdGggdG8gYSAuYnJlcC50cyBtb2R1bGU7IHJlbmRlcnMgaXNvL2Zyb250L3RvcC9yaWdodCBQTkdzIChubyByZXBvcnQgYXNzZXJ0aW9ucyknCiAgKQogIC5vcHRpb24oJy0tb3V0IDxkaXI+JywgJ291dHB1dCBkaXJlY3RvcnkgZm9yIHRoZSBQTkdzIChkZWZhdWx0IDxmaWxlPi1zaG90cyknKQogIC5vcHRpb24oJy0tbGFiZWwgPHRhZz4nLCAnc3ViZm9sZGVyIGZvciB0aGlzIHJlbmRlciBzZXQgKGUuZy4gcHJlLCBwb3N0KSBmb3IgQS9CIHBhaXJpbmcnKQogIC5hY3Rpb24oYXN5bmMgKGZpbGU6IHN0cmluZywgb3B0czogeyBvdXQ/OiBzdHJpbmc7IGxhYmVsPzogc3RyaW5nIH0pID0+IHsKICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZShmaWxlKTsKICAgIGNvbnN0IGJhc2UgPSBvcHRzLm91dCA/IHJlc29sdmUob3B0cy5vdXQpIDogYCR7cmVzb2x2ZWR9LXNob3RzYDsKICAgIGNvbnN0IG91dERpciA9IG9wdHMubGFiZWwgPyBqb2luKGJhc2UsIG9wdHMubGFiZWwpIDogYmFzZTsKICAgIGNvbnN0IHsgcmVwb3J0LCBzdGVwLCBzaGFwZSB9ID0gYXdhaXQgcnVuUGFydChyZXNvbHZlZCwgeyBzdGVwOiB0cnVlLCBtZXRyaWNzOiB0cnVlIH0pOwogICAgdHJ5IHsKICAgICAgaWYgKCFzdGVwKSB7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ3NuYXBzaG90OiBwYXJ0IHByb2R1Y2VkIG5vIFNURVAg4oCUIG5vdGhpbmcgdG8gcmVuZGVyXG4nKTsKICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShzZXJpYWxpemVSZXBvcnQocmVwb3J0KSArICdcbicpOwogICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBzdGVwUGF0aCA9IGpvaW4odG1wZGlyKCksIGBicmVwLXNuYXAtJHtiYXNlbmFtZShmaWxlKX0uc3RlcGApOwogICAgICB3cml0ZUZpbGVTeW5jKHN0ZXBQYXRoLCBCdWZmZXIuZnJvbShzdGVwKSk7CiAgICAgIGNvbnN0IHNob290ID0gYXdhaXQgbG9hZFNuYXBzaG90U2hvb3QoKTsKICAgICAgaWYgKCFzaG9vdCkgewogICAgICAgIC8vIHB1cHBldGVlciBhYnNlbnQ6IGxvYWRTbmFwc2hvdFNob290IHNldCBleGl0Q29kZSArIHN0ZGVycjsgc3RpbGwgZW1pdCB0aGUgcmVwb3J0IHNvIGEKICAgICAgICAvLyBjYWxsZXIgcGFyc2luZyBzdGRvdXQgZ2V0cyB0aGUgdmFsaWRpdHkgaW5mbyByYXRoZXIgdGhhbiBhbiBlbXB0eSBidWZmZXIuCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoc2VyaWFsaXplUmVwb3J0KHJlcG9ydCkgKyAnXG4nKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgLy8gZnJlc2g6IGEgcHJpdmF0ZSBlcGhlbWVyYWwgcmVuZGVyIHNlcnZlciBzbyBwYXJhbGxlbCBzbmFwc2hvdHMgZG9uJ3QgY29udGVuZCBvbiA6NzM3My4KICAgICAgY29uc3Qgc2VjdGlvbiA9IGFpbWVkU2VjdGlvbigKICAgICAgICByZXBvcnQubWFudWZhY3R1cmFiaWxpdHk/LmJvcmVzID8/IFtdLAogICAgICAgIHJlcG9ydC5tZWFzdXJlbWVudHMuYm91bmRzCiAgICAgICk7CiAgICAgIGNvbnN0IG1hcmtzID0gZmVhdHVyZU1hcmtzKHJlcG9ydC5ib2RpZXMgPz8gW10sIHJlcG9ydC5tYW51ZmFjdHVyYWJpbGl0eT8uYm9yZXMgPz8gW10pOwogICAgICBjb25zdCB7IHBuZ3MgfSA9IGF3YWl0IHNob290KHsKICAgICAgICBmaWxlOiBzdGVwUGF0aCwKICAgICAgICBvdXREaXIsCiAgICAgICAgZnJlc2g6IHRydWUsCiAgICAgICAgLi4uKHNlY3Rpb24gPyB7IHNlY3Rpb24gfSA6IHt9KSwKICAgICAgICAuLi4obWFya3MubGVuZ3RoID4gMCA/IHsgbWFya3MgfSA6IHt9KSwKICAgICAgfSk7CiAgICAgIGZvciAoY29uc3QgcCBvZiBwbmdzKSBwcm9jZXNzLnN0ZG91dC53cml0ZShgJHtwfVxuYCk7CiAgICB9IGZpbmFsbHkgewogICAgICBkaXNwb3NlU2hhcGUoc2hhcGUpOwogICAgfQogIH0pOwoKcHJvZ3JhbQogIC5jb21tYW5kKCdpbml0JykKICAuYXJndW1lbnQoJzxuYW1lPicsICdwYXJ0IG5hbWU7IHNjYWZmb2xkcyA8bmFtZT4uYnJlcC50cyArIHRzY29uZmlnLmpzb24gKyBSRUFETUUubWQnKQogIC5vcHRpb24oJy0tb3V0IDxkaXI+JywgJ3RhcmdldCBkaXJlY3RvcnkgKGRlZmF1bHRzIHRvIC4vPG5hbWU+KScpCiAgLmFjdGlvbigobmFtZTogc3RyaW5nLCBvcHRzOiB7IG91dD86IHN0cmluZyB9KSA9PiB7CiAgICBjb25zdCBkaXIgPSByZXNvbHZlKG9wdHMub3V0ID8/IG5hbWUpOwogICAgY29uc3QgcmVzdWx0ID0gc2NhZmZvbGRQYXJ0KG5hbWUsIGRpcik7CiAgICBmb3IgKGNvbnN0IGYgb2YgcmVzdWx0LmZpbGVzKSB7CiAgICAgIGNvbnN0IHRhZyA9IGYuY3JlYXRlZCA/ICdjcmVhdGVkJyA6ICdleGlzdHMgKGtlcHQpJzsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoYCR7dGFnfTogJHtmLnBhdGh9XG5gKTsKICAgIH0KICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMikgKyAnXG4nKTsKICB9KTsKCnByb2dyYW0KICAuY29tbWFuZCgnd2F0Y2gnKQogIC5hcmd1bWVudCgnPGZpbGU+JywgJ3BhdGggdG8gYSAuYnJlcC50cyBtb2R1bGU7IHJlLXZlcmlmaWVzIG9uIGVhY2ggc2F2ZSB1bnRpbCBDdHJsLUMnKQogIC5hY3Rpb24oKGZpbGU6IHN0cmluZykgPT4gewogICAgY29uc3QgcGF0aCA9IHJlc29sdmUoZmlsZSk7CiAgICBjb25zdCBydW4gPSBhc3luYyAoKSA9PiB7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgeyByZXBvcnQsIHNoYXBlIH0gPSBhd2FpdCBydW5QYXJ0KHBhdGgpOwogICAgICAgIHRyeSB7CiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShzZXJpYWxpemVSZXBvcnQocmVwb3J0KSArICdcbicpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBkaXNwb3NlU2hhcGUoc2hhcGUpOyAvLyBsaXZlIFdBU00gaGFuZGxlOyB0aGUgbG9vcCBydW5zIGluZGVmaW5pdGVseQogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGB3YXRjaCBydW4gZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfVxuYCk7CiAgICAgIH0KICAgIH07CiAgICBjb25zdCB7IHRyaWdnZXIgfSA9IGRlYm91bmNlKHJ1biwgREVGQVVMVF9ERUJPVU5DRV9NUyk7CiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShgd2F0Y2hpbmcgJHtwYXRofSAoQ3RybC1DIHRvIHN0b3ApXG5gKTsKICAgIHZvaWQgcnVuKCk7IC8vIGluaXRpYWwgdmVyaWZ5CiAgICAvLyBXYXRjaCB0aGUgcGFyZW50IGRpcjogZWRpdG9ycyBvZnRlbiByZXBsYWNlIHRoZSBmaWxlIChyZW5hbWUpIG9uIHNhdmUsCiAgICAvLyB3aGljaCBkcm9wcyBhIHdhdGNoZXIgYm91bmQgdG8gdGhlIGZpbGUgaW5vZGUgaXRzZWxmLgogICAgY29uc3Qgd2F0Y2hlciA9IGZzV2F0Y2goZGlybmFtZShwYXRoKSwgKF9ldmVudCwgZmlsZW5hbWUpID0+IHsKICAgICAgaWYgKGZpbGVuYW1lID09PSB1bmRlZmluZWQgfHwgZmlsZW5hbWUgPT09IG51bGwpIHsKICAgICAgICB0cmlnZ2VyKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChiYXNlbmFtZShwYXRoKSA9PT0gZmlsZW5hbWUudG9TdHJpbmcoKSkgdHJpZ2dlcigpOwogICAgfSk7CiAgICBjb25zdCBzdG9wID0gKCkgPT4gewogICAgICB3YXRjaGVyLmNsb3NlKCk7CiAgICAgIHByb2Nlc3MuZXhpdCgwKTsKICAgIH07CiAgICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBzdG9wKTsKICAgIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCBzdG9wKTsgLy8gc3VwZXJ2aXNvcnMgKGRvY2tlciBzdG9wLCBzeXN0ZW1jdGwpIHNlbmQgU0lHVEVSTQogIH0pOwoKcHJvZ3JhbQogIC5jb21tYW5kKCdleHBvcnQnKQogIC5hcmd1bWVudCgnPGZpbGU+JywgJ3BhdGggdG8gYSAuYnJlcC50cyBtb2R1bGUnKQogIC5vcHRpb24oJy0tc3RlcCcsICd3cml0ZSBhIFNURVAgYXJ0aWZhY3QnKQogIC5vcHRpb24oJy0tZ2xiJywgJ3dyaXRlIGEgR0xCIGFydGlmYWN0JykKICAub3B0aW9uKCctLXN0bCcsICd3cml0ZSBhbiBTVEwgYXJ0aWZhY3QnKQogIC5vcHRpb24oJy0tYWxsJywgJ3dyaXRlIFNURVAgKyBHTEIgKyBTVEwnKQogIC5vcHRpb24oJy0tb3V0IDxkaXI+JywgJ291dHB1dCBkaXJlY3RvcnknLCAnLicpCiAgLmFjdGlvbigKICAgIGFzeW5jICgKICAgICAgZmlsZTogc3RyaW5nLAogICAgICBvcHRzOiB7IHN0ZXA/OiBib29sZWFuOyBnbGI/OiBib29sZWFuOyBzdGw/OiBib29sZWFuOyBhbGw/OiBib29sZWFuOyBvdXQ6IHN0cmluZyB9CiAgICApID0+IHsKICAgICAgY29uc3QgZm9ybWF0cyA9IG9wdHMuYWxsCiAgICAgICAgPyB7IHN0ZXA6IHRydWUsIGdsYjogdHJ1ZSwgc3RsOiB0cnVlIH0KICAgICAgICA6IHsgc3RlcDogQm9vbGVhbihvcHRzLnN0ZXApLCBnbGI6IEJvb2xlYW4ob3B0cy5nbGIpLCBzdGw6IEJvb2xlYW4ob3B0cy5zdGwpIH07CiAgICAgIGlmICghZm9ybWF0cy5zdGVwICYmICFmb3JtYXRzLmdsYiAmJiAhZm9ybWF0cy5zdGwpIHsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnbm8gZm9ybWF0cyByZXF1ZXN0ZWQg4oCUIHBhc3MgLS1zdGVwLy0tZ2xiLy0tc3RsIG9yIC0tYWxsXG4nKTsKICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhwb3J0UGFydChyZXNvbHZlKGZpbGUpLCBmb3JtYXRzLCByZXNvbHZlKG9wdHMub3V0KSk7CiAgICAgIGZvciAoY29uc3QgcCBvZiByZXN1bHQud3JpdHRlbikgcHJvY2Vzcy5zdGRlcnIud3JpdGUoYHdyb3RlOiAke3B9XG5gKTsKICAgICAgZm9yIChjb25zdCBlIG9mIHJlc3VsdC5lcnJvcnMpIHByb2Nlc3Muc3RkZXJyLndyaXRlKGBlcnJvcjogJHtlfVxuYCk7CiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKAogICAgICAgIEpTT04uc3RyaW5naWZ5KHsgb2s6IHJlc3VsdC5vaywgd3JpdHRlbjogcmVzdWx0LndyaXR0ZW4sIGVycm9yczogcmVzdWx0LmVycm9ycyB9LCBudWxsLCAyKSArCiAgICAgICAgICAnXG4nCiAgICAgICk7CiAgICAgIGlmICghcmVzdWx0Lm9rKSBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICAgIH0KICApOwoKLy8gT25seSBkcml2ZSB0aGUgQ0xJIHdoZW4gcnVuIGFzIHRoZSBlbnRyeSBzY3JpcHQsIHNvIHRlc3RzIGNhbiBpbXBvcnQgdGhlCi8vIGd1YXJkZWQgbG9hZGVycyB3aXRob3V0IGNvbW1hbmRlciBwYXJzaW5nIHRoZSB0ZXN0IHJ1bm5lcidzIGFyZ3YuCi8vIFJlc29sdmUgc3ltbGlua3Mgb24gYm90aCBzaWRlczogdGhlIG5wbS1pbnN0YWxsZWQgYmluIChub2RlX21vZHVsZXMvLmJpbi9icmVwanMpCi8vIGlzIGEgc3ltbGluaywgc28gcHJvY2Vzcy5hcmd2WzFdIHdvdWxkIG90aGVyd2lzZSBuZXZlciBlcXVhbCB0aGUgcmVhbCBtb2R1bGUgcGF0aC4KZXhwb3J0IGZ1bmN0aW9uIGlzRW50cnlwb2ludChhcmd2MTogc3RyaW5nIHwgdW5kZWZpbmVkLCBtb2R1bGVVcmw6IHN0cmluZyk6IGJvb2xlYW4gewogIGlmICghYXJndjEpIHJldHVybiBmYWxzZTsKICB0cnkgewogICAgcmV0dXJuIHJlYWxwYXRoU3luYyhhcmd2MSkgPT09IHJlYWxwYXRoU3luYyhmaWxlVVJMVG9QYXRoKG1vZHVsZVVybCkpOwogIH0gY2F0Y2ggewogICAgcmV0dXJuIGZhbHNlOwogIH0KfQoKaWYgKGlzRW50cnlwb2ludChwcm9jZXNzLmFyZ3ZbMV0sIGltcG9ydC5tZXRhLnVybCkpIHsKICB2b2lkIHByb2dyYW0ucGFyc2VBc3luYygpOwp9Cg==", "" + {}.url));
46
+ const builtJs = (0, node_url.fileURLToPath)(new URL("data:video/mp2t;base64,IyEvdXNyL2Jpbi9lbnYgbm9kZQppbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJzsKaW1wb3J0IHsgd3JpdGVGaWxlU3luYywgcmVhbHBhdGhTeW5jLCBnbG9iU3luYyB9IGZyb20gJ25vZGU6ZnMnOwppbXBvcnQgeyByZXNvbHZlLCBqb2luLCBiYXNlbmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7CmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnOwppbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnOwppbXBvcnQgeyBydW5QYXJ0IH0gZnJvbSAnLi4vdmVyaWZ5L3J1blBhcnQuanMnOwppbXBvcnQgeyBwdXNoRXJyb3IsIHJlcG9ydE9rLCBzZXJpYWxpemVSZXBvcnQsIHR5cGUgVmVyaWZ5UmVwb3J0IH0gZnJvbSAnLi4vdmVyaWZ5L3JlcG9ydC5qcyc7CmltcG9ydCB7IHJ1bk1lYXN1cmUgfSBmcm9tICcuLi92ZXJpZnkvbWVhc3VyZS5qcyc7CmltcG9ydCB7IHJ1bkRpZmYgfSBmcm9tICcuLi92ZXJpZnkvZGlmZi5qcyc7CmltcG9ydCB7IHNjYWZmb2xkUGFydCB9IGZyb20gJy4vc2NhZmZvbGQuanMnOwppbXBvcnQgewogIGRlYm91bmNlLAogIERFRkFVTFRfREVCT1VOQ0VfTVMsCiAgaXNXYXRjaFJlbGV2YW50LAogIHdhdGNoUm9vdEZvciwKICB3YXRjaFRyZWUsCn0gZnJvbSAnLi93YXRjaC5qcyc7CmltcG9ydCB7IGV4cG9ydFBhcnQgfSBmcm9tICcuL2V4cG9ydFBhcnQuanMnOwppbXBvcnQgeyBvcGVuQnJvd3Nlciwgc2hvdWxkQXV0b09wZW4gfSBmcm9tICcuL29wZW5Ccm93c2VyLmpzJzsKaW1wb3J0IHsgZGlzcG9zZVNoYXBlIH0gZnJvbSAnLi4vZGlzcG9zZVNoYXBlLmpzJzsKaW1wb3J0IHR5cGUgeyBzaG9vdCBhcyBTaG9vdEZuIH0gZnJvbSAnLi4vc25hcHNob3Qvc2hvb3QuanMnOwppbXBvcnQgeyBhaW1lZFNlY3Rpb24sIGZlYXR1cmVNYXJrcyB9IGZyb20gJy4uL3NuYXBzaG90L2FpbWluZy5qcyc7CgovLyBPQ0NUJ3MgV0FTTSBTVEVQIHdyaXRlciBlbWl0cyBhICJTdGF0aXN0aWNzIG9uIFRyYW5zZmVyIiBiYW5uZXIgdmlhIGNvbnNvbGUubG9nCi8vIChFbXNjcmlwdGVuJ3MgZGVmYXVsdCBzdGRvdXQgc2luaykuIFRoZSBDTEkgb3ducyBzdGRvdXQgZm9yIG1hY2hpbmUtcmVhZGFibGUgSlNPTiwKLy8gc28gZGl2ZXJ0IHRoYXQga2VybmVsIGNoYXR0ZXIgdG8gc3RkZXJyIHRvIGtlZXAgc3Rkb3V0IGEgc2luZ2xlIGNsZWFuIEpTT04gZG9jdW1lbnQuCi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlIC0tIHJlcm91dGUga2VybmVsIHN0ZG91dCBjaGF0dGVyIG9mZiB0aGUgSlNPTiBjaGFubmVsCmNvbnNvbGUubG9nID0gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gewogIHByb2Nlc3Muc3RkZXJyLndyaXRlKGFyZ3MubWFwKFN0cmluZykuam9pbignICcpICsgJ1xuJyk7Cn07CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFNuYXBzaG90U2hvb3QoKTogUHJvbWlzZTx0eXBlb2YgU2hvb3RGbiB8IHVuZGVmaW5lZD4gewogIHRyeSB7CiAgICBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoJy4uL3NuYXBzaG90L3Nob290LmpzJyk7CiAgICByZXR1cm4gbW9kLnNob290OwogIH0gY2F0Y2ggewogICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ3NuYXBzaG90cyBuZWVkIHB1cHBldGVlci9DaHJvbWUg4oCUIHJ1bjogbnBtIGkgcHVwcGV0ZWVyXG4nKTsKICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxOwogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9Cn0KCmNvbnN0IHByb2dyYW0gPSBuZXcgQ29tbWFuZCgpOwpwcm9ncmFtLm5hbWUoJ2JyZXAnKTsKCnByb2dyYW0KICAuY29tbWFuZCgndmVyaWZ5JywgeyBpc0RlZmF1bHQ6IHRydWUgfSkKICAuYXJndW1lbnQoCiAgICAnPGZpbGVzLi4uPicsCiAgICAncGF0aChzKSBvciBnbG9iKHMpIHRvIC5icmVwLnRzIG1vZHVsZXM7IG11bHRpcGxlIGZpbGVzIOKGkiBhIGJhdGNoIHZhbGlkaXR5IEpTT04gYXJyYXknCiAgKQogIC5vcHRpb24oJy0tc3RlcCA8b3V0PicsICd3cml0ZSB0aGUgcHJpbWFyeSBTVEVQIGFydGlmYWN0IHRvIHRoaXMgcGF0aCcpCiAgLm9wdGlvbignLS1nbGIgPG91dD4nLCAnd3JpdGUgYSBkZXJpdmVkIEdMQiBwcmV2aWV3IHRvIHRoaXMgcGF0aCcpCiAgLm9wdGlvbignLS1qc29uIDxvdXQ+JywgJ3dyaXRlIHRoZSBKU09OIHJlcG9ydCB0byB0aGlzIHBhdGgnKQogIC5vcHRpb24oCiAgICAnLS1jaGVjaycsCiAgICAndHlwZS1jaGVjayB0aGUgcGFydCAoYWdhaW5zdCBicmVwanMgdHlwZXMpIGJlZm9yZSBydW5uaW5nOyBza2lwIGV4ZWN1dGlvbiBvbiB0eXBlIGVycm9ycycKICApCiAgLm9wdGlvbignLS1zbmFwc2hvdCA8ZGlyPicsICdyZW5kZXIgaXNvL2Zyb250L3RvcC9yaWdodCBQTkdzIHRvIHRoaXMgZGlyIChyZXF1aXJlcyBidWlsdCB2aWV3ZXIpJykKICAub3B0aW9uKAogICAgJy0tc2VydmUnLAogICAgJ2FmdGVyIHZlcmlmeWluZywgc3RhcnQgYSBwcmV2aWV3IHNlcnZlciBhbmQgcHJpbnQgYSA/ZGlyPSZmaWxlPSBkZWVwIGxpbmsgKHN0YXlzIHJ1bm5pbmcpJwogICkKICAub3B0aW9uKCctLW5vLW9wZW4nLCAnd2l0aCAtLXNlcnZlLCBkbyBub3QgYXV0by1vcGVuIHRoZSBicm93c2VyIChqdXN0IHByaW50IHRoZSB2aWV3ZXIgVVJMKScpCiAgLm9wdGlvbigKICAgICctLWV4cGVjdC1jb2RlIDxjb2RlPicsCiAgICAnZXhpdCAwIG9ubHkgaWYgdGhlIHJlcG9ydCBlbWl0cyB0aGlzIGVycm9yIGNvZGUgKGZvciBmaXh0dXJlcy9ldmFsIHJlY2FsbCknCiAgKQogIC5vcHRpb24oCiAgICAnLS1leHBlY3QtaW52YWxpZCcsCiAgICAnZXhpdCAwIG9ubHkgaWYgdGhlIHBhcnQgaXMgaW52YWxpZCAob2s6ZmFsc2UpIOKAlCBmb3Iga25vd24tYmFkIGZpeHR1cmVzJwogICkKICAub3B0aW9uKAogICAgJy0tbWV0cmljcycsCiAgICAnY29tcHV0ZSBkZXRlcm1pbmlzdGljIG1hbnVmYWN0dXJhYmlsaXR5IG1ldHJpY3MgKHBlci1ib2R5IGJyZWFrZG93biArIGludGVyZmVyZW5jZSBtYXRyaXgpIGZvciB0aGUgZGVzaWduIGp1ZGdlIOKAlCBzbG93ZXI7IG9mZiBieSBkZWZhdWx0JwogICkKICAuYWN0aW9uKAogICAgYXN5bmMgKAogICAgICBmaWxlczogc3RyaW5nW10sCiAgICAgIG9wdHM6IHsKICAgICAgICBzdGVwPzogc3RyaW5nOwogICAgICAgIGdsYj86IHN0cmluZzsKICAgICAgICBqc29uPzogc3RyaW5nOwogICAgICAgIGNoZWNrPzogYm9vbGVhbjsKICAgICAgICBzbmFwc2hvdD86IHN0cmluZzsKICAgICAgICBzZXJ2ZT86IGJvb2xlYW47CiAgICAgICAgZXhwZWN0Q29kZT86IHN0cmluZzsKICAgICAgICBleHBlY3RJbnZhbGlkPzogYm9vbGVhbjsKICAgICAgICBtZXRyaWNzPzogYm9vbGVhbjsKICAgICAgICAvLyBDb21tYW5kZXIgbWF0ZXJpYWxpemVzIGEgbmVnYXRlZCBmbGFnIGFzIGEgY29uY3JldGUgYm9vbGVhbjogdHJ1ZSBieQogICAgICAgIC8vIGRlZmF1bHQsIGZhbHNlIHdoZW4gLS1uby1vcGVuIGlzIHBhc3NlZC4KICAgICAgICBvcGVuOiBib29sZWFuOwogICAgICB9CiAgICApID0+IHsKICAgICAgLy8gQSBxdW90ZWQgZ2xvYiAoInBhcnRzLyouYnJlcC50cyIpIGFycml2ZXMgYXMgb25lIGxpdGVyYWwgYXJnLCBhIHNoZWxsLWV4cGFuZGVkIG9uZSBhcyBtYW55OwogICAgICAvLyBnbG9iU3luYyBoYW5kbGVzIGJvdGggKGEgbGl0ZXJhbCBmaWxlbmFtZSBtYXRjaGVzIGl0c2VsZiksIGZhbGxpbmcgYmFjayB0byB0aGUgcmF3IGFyZyBzbyBhCiAgICAgIC8vIG1pc3NpbmcgcGF0aCBzdGlsbCBydW5zIGFuZCByZXBvcnRzIGl0cyBvd24gZXJyb3IuCiAgICAgIGNvbnN0IHRhcmdldHMgPSBbCiAgICAgICAgLi4ubmV3IFNldCgKICAgICAgICAgIGZpbGVzLmZsYXRNYXAoKGYpID0+IHsKICAgICAgICAgICAgY29uc3QgbSA9IGdsb2JTeW5jKGYpOwogICAgICAgICAgICByZXR1cm4gbS5sZW5ndGggPyBtIDogW2ZdOwogICAgICAgICAgfSkKICAgICAgICApLAogICAgICBdLm1hcCgocCkgPT4gcmVzb2x2ZShwKSk7CgogICAgICBpZiAodGFyZ2V0cy5sZW5ndGggPiAxKSB7CiAgICAgICAgLy8gQmF0Y2g6IHZhbGlkaXR5LW9ubHkgSlNPTiBhcnJheS4gVGhlIHNpbmdsZS1maWxlIGFydGlmYWN0IGZsYWdzIGRvbid0IGFwcGx5LgogICAgICAgIGlmICgKICAgICAgICAgIG9wdHMuc3RlcCB8fAogICAgICAgICAgb3B0cy5zZXJ2ZSB8fAogICAgICAgICAgb3B0cy5zbmFwc2hvdCB8fAogICAgICAgICAgb3B0cy5nbGIgfHwKICAgICAgICAgIG9wdHMuZXhwZWN0Q29kZSB8fAogICAgICAgICAgb3B0cy5leHBlY3RJbnZhbGlkCiAgICAgICAgKSB7CiAgICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgKICAgICAgICAgICAgJ2JhdGNoIG1vZGU6IC0tc3RlcC8tLWdsYi8tLXNlcnZlLy0tc25hcHNob3QvLS1leHBlY3QtY29kZS8tLWV4cGVjdC1pbnZhbGlkIGlnbm9yZWQgKHNpbmdsZS1maWxlIG9ubHkpXG4nCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBjb25zdCByZXN1bHRzOiB7IGZpbGU6IHN0cmluZzsgb2s6IGJvb2xlYW47IHJlcG9ydDogVmVyaWZ5UmVwb3J0IH1bXSA9IFtdOwogICAgICAgIGZvciAoY29uc3QgZiBvZiB0YXJnZXRzKSB7CiAgICAgICAgICBjb25zdCB7IHJlcG9ydCwgc2hhcGUgfSA9IGF3YWl0IHJ1blBhcnQoZiwgewogICAgICAgICAgICBjaGVjazogQm9vbGVhbihvcHRzLmNoZWNrKSwKICAgICAgICAgICAgbWV0cmljczogQm9vbGVhbihvcHRzLm1ldHJpY3MpLAogICAgICAgICAgfSk7CiAgICAgICAgICBkaXNwb3NlU2hhcGUoc2hhcGUpOwogICAgICAgICAgcmVzdWx0cy5wdXNoKHsgZmlsZTogZiwgb2s6IHJlcG9ydE9rKHJlcG9ydCksIHJlcG9ydCB9KTsKICAgICAgICB9CiAgICAgICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KHJlc3VsdHMsIG51bGwsIDIpOwogICAgICAgIGlmIChvcHRzLmpzb24gJiYgb3B0cy5qc29uICE9PSAnLScpIHdyaXRlRmlsZVN5bmMob3B0cy5qc29uLCBqc29uKTsKICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShqc29uICsgJ1xuJyk7CiAgICAgICAgaWYgKHJlc3VsdHMuc29tZSgocikgPT4gIXIub2spKSBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGNvbnN0IGZpbGUgPSB0YXJnZXRzWzBdID8/IGZpbGVzWzBdID8/ICcnOwogICAgICAvLyBUaGUgV0FTTSB2aWV3ZXIgbG9hZHMgYSBDQUQgZmlsZSAoaXQgY2FuJ3QgcnVuIGEgLmJyZXAudHMpLCBzbyAtLXNuYXBzaG90Ly0tc2VydmUKICAgICAgLy8gc3RhZ2UgdGhlIHByaW1hcnkgU1RFUCBhbmQgcG9pbnQgdGhlIHZpZXdlciBhdCBpdCB2aWEgP2Rpcj0mZmlsZT0uIC0tZ2xiIGlzIGl0cyBvd24gYXJ0aWZhY3QuCiAgICAgIGNvbnN0IHdhbnRTdGVwID0gQm9vbGVhbihvcHRzLnN0ZXApIHx8IEJvb2xlYW4ob3B0cy5zbmFwc2hvdCkgfHwgQm9vbGVhbihvcHRzLnNlcnZlKTsKICAgICAgY29uc3QgeyByZXBvcnQsIHN0ZXAsIGdsYiwgc2hhcGUgfSA9IGF3YWl0IHJ1blBhcnQocmVzb2x2ZShmaWxlKSwgewogICAgICAgIHN0ZXA6IHdhbnRTdGVwLAogICAgICAgIGdsYjogQm9vbGVhbihvcHRzLmdsYiksCiAgICAgICAgY2hlY2s6IEJvb2xlYW4ob3B0cy5jaGVjayksCiAgICAgICAgLy8gQSBzbmFwc2hvdCBmZWVkcyB0aGUgZGVzaWduIGp1ZGdlLCBzbyBjb21wdXRlIG1ldHJpY3MgdG9vIChib3JlcyDihpIgYW4gYWltZWQgc2VjdGlvbiBzaG90KS4KICAgICAgICBtZXRyaWNzOiBCb29sZWFuKG9wdHMubWV0cmljcykgfHwgQm9vbGVhbihvcHRzLnNuYXBzaG90KSwKICAgICAgfSk7CiAgICAgIGxldCBzdGVwUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0cy5zdGVwOwogICAgICB0cnkgewogICAgICAgIGlmIChvcHRzLmdsYiAmJiBnbGIpIHdyaXRlRmlsZVN5bmMob3B0cy5nbGIsIEJ1ZmZlci5mcm9tKGdsYikpOwoKICAgICAgICBpZiAod2FudFN0ZXAgJiYgc3RlcCkgewogICAgICAgICAgc3RlcFBhdGggPSBvcHRzLnN0ZXAgPz8gam9pbih0bXBkaXIoKSwgYGJyZXAtJHtiYXNlbmFtZShmaWxlKX0uc3RlcGApOwogICAgICAgICAgd3JpdGVGaWxlU3luYyhzdGVwUGF0aCwgQnVmZmVyLmZyb20oc3RlcCkpOwogICAgICAgIH0KICAgICAgICBpZiAob3B0cy5zbmFwc2hvdCAmJiBzdGVwUGF0aCkgewogICAgICAgICAgY29uc3Qgc2hvb3QgPSBhd2FpdCBsb2FkU25hcHNob3RTaG9vdCgpOyAvLyBsYXp5OiBrZWVwcyBwdXBwZXRlZXIgb2ZmIHRoZSBkZWZhdWx0IHBhdGgKICAgICAgICAgIGlmIChzaG9vdCkgewogICAgICAgICAgICBjb25zdCBzZWN0aW9uID0gYWltZWRTZWN0aW9uKAogICAgICAgICAgICAgIHJlcG9ydC5tYW51ZmFjdHVyYWJpbGl0eT8uYm9yZXMgPz8gW10sCiAgICAgICAgICAgICAgcmVwb3J0Lm1lYXN1cmVtZW50cy5ib3VuZHMKICAgICAgICAgICAgKTsKICAgICAgICAgICAgY29uc3QgbWFya3MgPSBmZWF0dXJlTWFya3MocmVwb3J0LmJvZGllcyA/PyBbXSwgcmVwb3J0Lm1hbnVmYWN0dXJhYmlsaXR5Py5ib3JlcyA/PyBbXSk7CiAgICAgICAgICAgIGNvbnN0IHsgcG5ncyB9ID0gYXdhaXQgc2hvb3QoewogICAgICAgICAgICAgIGZpbGU6IHN0ZXBQYXRoLAogICAgICAgICAgICAgIG91dERpcjogb3B0cy5zbmFwc2hvdCwKICAgICAgICAgICAgICAuLi4oc2VjdGlvbiA/IHsgc2VjdGlvbiB9IDoge30pLAogICAgICAgICAgICAgIC4uLihtYXJrcy5sZW5ndGggPiAwID8geyBtYXJrcyB9IDoge30pLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gRGlhZ25vc3RpYyBwYXRocyBnbyB0byBzdGRlcnIg4oCUIHN0ZG91dCBzdGF5cyBhIHNpbmdsZSBjbGVhbiBKU09OIGRvY3VtZW50LgogICAgICAgICAgICBmb3IgKGNvbnN0IHAgb2YgcG5ncykgcHJvY2Vzcy5zdGRlcnIud3JpdGUoYHNuYXBzaG90OiAke3B9XG5gKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKG9wdHMuc25hcHNob3QpIHsKICAgICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdzbmFwc2hvdCBza2lwcGVkOiBTVEVQIGV4cG9ydCBwcm9kdWNlZCBubyBhcnRpZmFjdFxuJyk7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgcHVzaEVycm9yKHJlcG9ydCwgeyBtZXNzYWdlOiBgYXJ0aWZhY3Qgd3JpdGUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWAgfSk7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgLy8gVGhlIHNoYXBlIGlzIGEgbGl2ZSBXQVNNIGhhbmRsZTsgcmVsZWFzZSBpdCBiZWZvcmUgdGhlIHNlcnZlciB0YWtlcyBvdmVyICh0aGUKICAgICAgICAvLyAtLXNlcnZlIHBhdGggc3RheXMgcnVubmluZywgc28gbGVha2luZyBoZXJlIHdvdWxkIHBlcnNpc3QgZm9yIHRoZSBzZXJ2ZXIncyBsaWZldGltZSkuCiAgICAgICAgZGlzcG9zZVNoYXBlKHNoYXBlKTsKICAgICAgfQogICAgICAvLyBTZXJpYWxpemUgb25jZSBhZnRlciBhbGwgYXJ0aWZhY3Qgd3JpdGVzIHNvIHRoZSAtLWpzb24gZmlsZSBhbmQgc3Rkb3V0CiAgICAgIC8vIHJlZmxlY3QgdGhlIHNhbWUgcmVwb3J0IChpbmNsLiBhbnkgImFydGlmYWN0IHdyaXRlIGZhaWxlZCIgZXJyb3IpLgogICAgICBjb25zdCBqc29uID0gc2VyaWFsaXplUmVwb3J0KHJlcG9ydCk7CiAgICAgIC8vIGAtLWpzb24gLWAgaXMgc2F0aXNmaWVkIGJ5IHRoZSBzdGRvdXQgd3JpdGUgYmVsb3c7IG9ubHkgYSByZWFsIHBhdGggd3JpdGVzIGEgZmlsZS4KICAgICAgaWYgKG9wdHMuanNvbiAmJiBvcHRzLmpzb24gIT09ICctJykgd3JpdGVGaWxlU3luYyhvcHRzLmpzb24sIGpzb24pOwogICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShqc29uICsgJ1xuJyk7CiAgICAgIGlmICghcmVwb3J0T2socmVwb3J0KSkgcHJvY2Vzcy5leGl0Q29kZSA9IDE7CiAgICAgIC8vIEZpeHR1cmUgYXNzZXJ0aW9ucyAoUGhhc2U6IHZlcmlmeS1oZWFsIHByZWNpc2lvbi9yZWNhbGwpIG92ZXJyaWRlIHRoZSBub3JtYWwgZXhpdCBjb2RlOgogICAgICAvLyBhIGtub3duLWJhZCBwYXJ0IG11c3QgZmFpbCB0aGUgKnJpZ2h0KiB3YXkuIENvZGVzIGNvbWUgZnJvbSB0aGUga2VybmVsL2F1dGhvcmluZyBlcnJvcnMsCiAgICAgIC8vIG5vdCB0aGUgaGludCB0YWJsZSwgc28gdGhpcyBtZWFzdXJlcyB0aGUgdmVyaWZpZXIsIG5vdCBpdHMgcHJvc2UuCiAgICAgIGlmIChvcHRzLmV4cGVjdEludmFsaWQgfHwgb3B0cy5leHBlY3RDb2RlKSB7CiAgICAgICAgLy8gaGludHMgYXJlIGRlcml2ZWQgZnJvbSBlcnJvckluZm9zLCBzbyB0aGUgY29kZXMgbGl2ZSB0aGVyZTsgZGVkdXBlIHRvIGtlZXAgdGhlIGxpbmUgY2xlYW4uCiAgICAgICAgY29uc3QgY29kZXMgPSBbCiAgICAgICAgICAuLi5uZXcgU2V0KHJlcG9ydC5lcnJvckluZm9zLm1hcCgoZSkgPT4gZS5jb2RlKS5maWx0ZXIoKGMpOiBjIGlzIHN0cmluZyA9PiBCb29sZWFuKGMpKSksCiAgICAgICAgXTsKICAgICAgICBjb25zdCB2YWxpZCA9IHJlcG9ydE9rKHJlcG9ydCk7CiAgICAgICAgY29uc3QgcGFzcyA9CiAgICAgICAgICAoIW9wdHMuZXhwZWN0SW52YWxpZCB8fCAhdmFsaWQpICYmICghb3B0cy5leHBlY3RDb2RlIHx8IGNvZGVzLmluY2x1ZGVzKG9wdHMuZXhwZWN0Q29kZSkpOwogICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBwYXNzID8gMCA6IDE7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoCiAgICAgICAgICBgZXhwZWN0OiAke3Bhc3MgPyAnUEFTUycgOiAnRkFJTCd9YCArCiAgICAgICAgICAgIChvcHRzLmV4cGVjdENvZGUgPyBgIGNvZGU9JHtvcHRzLmV4cGVjdENvZGV9YCA6ICcnKSArCiAgICAgICAgICAgIChvcHRzLmV4cGVjdEludmFsaWQgPyAnIGludmFsaWQnIDogJycpICsKICAgICAgICAgICAgYCAob2s9JHt2YWxpZH0sIGNvZGVzPSR7Y29kZXMuam9pbignLCcpIHx8ICdub25lJ30pXG5gCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgd2lsbFNlcnZlID0gQm9vbGVhbihvcHRzLnNlcnZlKSAmJiBzdGVwUGF0aCAhPT0gdW5kZWZpbmVkICYmIHJlcG9ydE9rKHJlcG9ydCk7CiAgICAgIGlmICh3aWxsU2VydmUgJiYgc3RlcFBhdGgpIHsKICAgICAgICBjb25zdCB7IHNlcnZlIH0gPSBhd2FpdCBpbXBvcnQoJy4uL3NuYXBzaG90L3NlcnZlLmpzJyk7IC8vIGxhenk6IG5vIHNlcnZlciBkZXBzIG9uIHRoZSBkZWZhdWx0IHBhdGgKICAgICAgICBjb25zdCB7IHVybCwgcmV1c2VkIH0gPSBhd2FpdCBzZXJ2ZSh7IGZpbGU6IHN0ZXBQYXRoIH0pOyAvLyBidWlsZHMgYSA/ZGlyPSZmaWxlPSBVUkw7IHNlcnZlciBydW5zIHVudGlsIEN0cmwtQwogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGB2aWV3ZXI6ICR7dXJsfVxuYCk7CiAgICAgICAgLy8gQXV0by1vcGVuIG9ubHkgZm9yIGEgZnJlc2hseSBzdGFydGVkIHNlcnZlciAoYSByZXVzZWQgb25lIGFscmVhZHkgaGFzCiAgICAgICAgLy8gYSB0YWIpIGluIGFuIGludGVyYWN0aXZlIHNlc3Npb247IGAtLW5vLW9wZW5gIChvcHRzLm9wZW4gPT09IGZhbHNlKQogICAgICAgIC8vIGFsd2F5cyBzdXBwcmVzc2VzIGl0LgogICAgICAgIGlmICghcmV1c2VkICYmIG9wdHMub3BlbiAmJiBzaG91bGRBdXRvT3BlbigpKSB7CiAgICAgICAgICBvcGVuQnJvd3Nlcih1cmwpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICk7Cgpwcm9ncmFtCiAgLmNvbW1hbmQoJ21lYXN1cmUnKQogIC5hcmd1bWVudCgnPGE+JywgJ3BhdGggdG8gYSAuYnJlcC50cyBtb2R1bGUnKQogIC5hcmd1bWVudCgnW2JdJywgJ29wdGlvbmFsIHNlY29uZCBtb2R1bGU7IGlmIGdpdmVuLCBtZWFzdXJlcyBkaXN0YW5jZSBiZXR3ZWVuIHRoZSB0d28gcGFydHMnKQogIC5hY3Rpb24oYXN5bmMgKGE6IHN0cmluZywgYj86IHN0cmluZykgPT4gewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuTWVhc3VyZShyZXNvbHZlKGEpLCBiID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByZXNvbHZlKGIpKTsKICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKAogICAgICBKU09OLnN0cmluZ2lmeSh7IG9rOiByZXN1bHQuZXJyb3JzLmxlbmd0aCA9PT0gMCwgLi4ucmVzdWx0IH0sIG51bGwsIDIpICsgJ1xuJwogICAgKTsKICAgIGlmIChyZXN1bHQuZXJyb3JzLmxlbmd0aCA+IDApIHByb2Nlc3MuZXhpdENvZGUgPSAxOwogIH0pOwoKcHJvZ3JhbQogIC5jb21tYW5kKCdkaWZmJykKICAuYXJndW1lbnQoJzxhPicsICdwYXRoIHRvIHRoZSBiYXNlbGluZSAuYnJlcC50cyBtb2R1bGUnKQogIC5hcmd1bWVudCgnPGI+JywgJ3BhdGggdG8gdGhlIGNvbXBhcmlzb24gLmJyZXAudHMgbW9kdWxlJykKICAuYWN0aW9uKGFzeW5jIChhOiBzdHJpbmcsIGI6IHN0cmluZykgPT4gewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuRGlmZihyZXNvbHZlKGEpLCByZXNvbHZlKGIpKTsKICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKAogICAgICBKU09OLnN0cmluZ2lmeSh7IG9rOiByZXN1bHQuZXJyb3JzLmxlbmd0aCA9PT0gMCwgLi4ucmVzdWx0IH0sIG51bGwsIDIpICsgJ1xuJwogICAgKTsKICAgIGlmIChyZXN1bHQuZXJyb3JzLmxlbmd0aCA+IDApIHByb2Nlc3MuZXhpdENvZGUgPSAxOwogIH0pOwoKcHJvZ3JhbQogIC5jb21tYW5kKCdzbmFwc2hvdCcpCiAgLmFyZ3VtZW50KAogICAgJzxmaWxlPicsCiAgICAncGF0aCB0byBhIC5icmVwLnRzIG1vZHVsZTsgcmVuZGVycyBpc28vZnJvbnQvdG9wL3JpZ2h0IFBOR3MgKG5vIHJlcG9ydCBhc3NlcnRpb25zKScKICApCiAgLm9wdGlvbignLS1vdXQgPGRpcj4nLCAnb3V0cHV0IGRpcmVjdG9yeSBmb3IgdGhlIFBOR3MgKGRlZmF1bHQgPGZpbGU+LXNob3RzKScpCiAgLm9wdGlvbignLS1sYWJlbCA8dGFnPicsICdzdWJmb2xkZXIgZm9yIHRoaXMgcmVuZGVyIHNldCAoZS5nLiBwcmUsIHBvc3QpIGZvciBBL0IgcGFpcmluZycpCiAgLmFjdGlvbihhc3luYyAoZmlsZTogc3RyaW5nLCBvcHRzOiB7IG91dD86IHN0cmluZzsgbGFiZWw/OiBzdHJpbmcgfSkgPT4gewogICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlKGZpbGUpOwogICAgY29uc3QgYmFzZSA9IG9wdHMub3V0ID8gcmVzb2x2ZShvcHRzLm91dCkgOiBgJHtyZXNvbHZlZH0tc2hvdHNgOwogICAgY29uc3Qgb3V0RGlyID0gb3B0cy5sYWJlbCA/IGpvaW4oYmFzZSwgb3B0cy5sYWJlbCkgOiBiYXNlOwogICAgY29uc3QgeyByZXBvcnQsIHN0ZXAsIHNoYXBlIH0gPSBhd2FpdCBydW5QYXJ0KHJlc29sdmVkLCB7IHN0ZXA6IHRydWUsIG1ldHJpY3M6IHRydWUgfSk7CiAgICB0cnkgewogICAgICBpZiAoIXN0ZXApIHsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnc25hcHNob3Q6IHBhcnQgcHJvZHVjZWQgbm8gU1RFUCDigJQgbm90aGluZyB0byByZW5kZXJcbicpOwogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHNlcmlhbGl6ZVJlcG9ydChyZXBvcnQpICsgJ1xuJyk7CiAgICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHN0ZXBQYXRoID0gam9pbih0bXBkaXIoKSwgYGJyZXAtc25hcC0ke2Jhc2VuYW1lKGZpbGUpfS5zdGVwYCk7CiAgICAgIHdyaXRlRmlsZVN5bmMoc3RlcFBhdGgsIEJ1ZmZlci5mcm9tKHN0ZXApKTsKICAgICAgY29uc3Qgc2hvb3QgPSBhd2FpdCBsb2FkU25hcHNob3RTaG9vdCgpOwogICAgICBpZiAoIXNob290KSB7CiAgICAgICAgLy8gcHVwcGV0ZWVyIGFic2VudDogbG9hZFNuYXBzaG90U2hvb3Qgc2V0IGV4aXRDb2RlICsgc3RkZXJyOyBzdGlsbCBlbWl0IHRoZSByZXBvcnQgc28gYQogICAgICAgIC8vIGNhbGxlciBwYXJzaW5nIHN0ZG91dCBnZXRzIHRoZSB2YWxpZGl0eSBpbmZvIHJhdGhlciB0aGFuIGFuIGVtcHR5IGJ1ZmZlci4KICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShzZXJpYWxpemVSZXBvcnQocmVwb3J0KSArICdcbicpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBmcmVzaDogYSBwcml2YXRlIGVwaGVtZXJhbCByZW5kZXIgc2VydmVyIHNvIHBhcmFsbGVsIHNuYXBzaG90cyBkb24ndCBjb250ZW5kIG9uIDo3MzczLgogICAgICBjb25zdCBzZWN0aW9uID0gYWltZWRTZWN0aW9uKAogICAgICAgIHJlcG9ydC5tYW51ZmFjdHVyYWJpbGl0eT8uYm9yZXMgPz8gW10sCiAgICAgICAgcmVwb3J0Lm1lYXN1cmVtZW50cy5ib3VuZHMKICAgICAgKTsKICAgICAgY29uc3QgbWFya3MgPSBmZWF0dXJlTWFya3MocmVwb3J0LmJvZGllcyA/PyBbXSwgcmVwb3J0Lm1hbnVmYWN0dXJhYmlsaXR5Py5ib3JlcyA/PyBbXSk7CiAgICAgIGNvbnN0IHsgcG5ncyB9ID0gYXdhaXQgc2hvb3QoewogICAgICAgIGZpbGU6IHN0ZXBQYXRoLAogICAgICAgIG91dERpciwKICAgICAgICBmcmVzaDogdHJ1ZSwKICAgICAgICAuLi4oc2VjdGlvbiA/IHsgc2VjdGlvbiB9IDoge30pLAogICAgICAgIC4uLihtYXJrcy5sZW5ndGggPiAwID8geyBtYXJrcyB9IDoge30pLAogICAgICB9KTsKICAgICAgZm9yIChjb25zdCBwIG9mIHBuZ3MpIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAke3B9XG5gKTsKICAgIH0gZmluYWxseSB7CiAgICAgIGRpc3Bvc2VTaGFwZShzaGFwZSk7CiAgICB9CiAgfSk7Cgpwcm9ncmFtCiAgLmNvbW1hbmQoJ2luaXQnKQogIC5hcmd1bWVudCgnPG5hbWU+JywgJ3BhcnQgbmFtZTsgc2NhZmZvbGRzIDxuYW1lPi5icmVwLnRzICsgdHNjb25maWcuanNvbiArIFJFQURNRS5tZCcpCiAgLm9wdGlvbignLS1vdXQgPGRpcj4nLCAndGFyZ2V0IGRpcmVjdG9yeSAoZGVmYXVsdHMgdG8gLi88bmFtZT4pJykKICAuYWN0aW9uKChuYW1lOiBzdHJpbmcsIG9wdHM6IHsgb3V0Pzogc3RyaW5nIH0pID0+IHsKICAgIGNvbnN0IGRpciA9IHJlc29sdmUob3B0cy5vdXQgPz8gbmFtZSk7CiAgICBjb25zdCByZXN1bHQgPSBzY2FmZm9sZFBhcnQobmFtZSwgZGlyKTsKICAgIGZvciAoY29uc3QgZiBvZiByZXN1bHQuZmlsZXMpIHsKICAgICAgY29uc3QgdGFnID0gZi5jcmVhdGVkID8gJ2NyZWF0ZWQnIDogJ2V4aXN0cyAoa2VwdCknOwogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShgJHt0YWd9OiAke2YucGF0aH1cbmApOwogICAgfQogICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSArICdcbicpOwogIH0pOwoKcHJvZ3JhbQogIC5jb21tYW5kKCd3YXRjaCcpCiAgLmFyZ3VtZW50KCc8ZmlsZT4nLCAncGF0aCB0byBhIC5icmVwLnRzIG1vZHVsZTsgcmUtdmVyaWZpZXMgb24gZWFjaCBzYXZlIHVudGlsIEN0cmwtQycpCiAgLmFjdGlvbigoZmlsZTogc3RyaW5nKSA9PiB7CiAgICBjb25zdCBwYXRoID0gcmVzb2x2ZShmaWxlKTsKICAgIC8vIFJlcnVucyBpbXBvcnQgd2l0aCBhIGZyZXNoIGNhY2hlLWJ1c3RpbmcgcXVlcnkg4oCUIHRoZSBFU00gY2FjaGUgaXMga2V5ZWQgYnkgVVJMLCBzbwogICAgLy8gd2l0aG91dCBpdCBldmVyeSByZXJ1biB3b3VsZCByZS1leGVjdXRlIHRoZSBmaXJzdCB2ZXJzaW9uIG9mIHRoZSBwYXJ0IGZvcmV2ZXIuCiAgICBjb25zdCBydW4gPSBhc3luYyAoZnJlc2g6IGJvb2xlYW4pID0+IHsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCB7IHJlcG9ydCwgc2hhcGUgfSA9IGF3YWl0IHJ1blBhcnQocGF0aCwgeyBmcmVzaEltcG9ydDogZnJlc2ggfSk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHNlcmlhbGl6ZVJlcG9ydChyZXBvcnQpICsgJ1xuJyk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIGRpc3Bvc2VTaGFwZShzaGFwZSk7IC8vIGxpdmUgV0FTTSBoYW5kbGU7IHRoZSBsb29wIHJ1bnMgaW5kZWZpbml0ZWx5CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoYHdhdGNoIHJ1biBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9XG5gKTsKICAgICAgfQogICAgfTsKICAgIC8vIFNlcmlhbGl6ZSBydW5zOiBhIHNhdmUgbGFuZGluZyBtaWQtdmVyaWZ5IG11c3Qgbm90IHN0YXJ0IGEgc2Vjb25kIHJ1blBhcnQgb24gdGhlCiAgICAvLyBzaGFyZWQga2VybmVsIChyZXBvcnRzIHdvdWxkIGludGVybGVhdmUgb3V0IG9mIG9yZGVyKS4gRWRpdHMgZHVyaW5nIGEgcnVuIGNvYWxlc2NlCiAgICAvLyBpbnRvIGV4YWN0bHkgb25lIHRyYWlsaW5nIHJlcnVuLgogICAgbGV0IGluRmxpZ2h0ID0gZmFsc2U7CiAgICBsZXQgcmVydW5RdWV1ZWQgPSBmYWxzZTsKICAgIGNvbnN0IHN0YXJ0ID0gKGZyZXNoOiBib29sZWFuKTogdm9pZCA9PiB7CiAgICAgIGluRmxpZ2h0ID0gdHJ1ZTsKICAgICAgdm9pZCBydW4oZnJlc2gpLmZpbmFsbHkoKCkgPT4gewogICAgICAgIGluRmxpZ2h0ID0gZmFsc2U7CiAgICAgICAgaWYgKHJlcnVuUXVldWVkKSB7CiAgICAgICAgICByZXJ1blF1ZXVlZCA9IGZhbHNlOwogICAgICAgICAgc3RhcnQodHJ1ZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH07CiAgICBjb25zdCBzY2hlZHVsZSA9ICgpOiB2b2lkID0+IHsKICAgICAgaWYgKGluRmxpZ2h0KSB7CiAgICAgICAgcmVydW5RdWV1ZWQgPSB0cnVlOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBzdGFydCh0cnVlKTsKICAgIH07CiAgICBjb25zdCB7IHRyaWdnZXIgfSA9IGRlYm91bmNlKHNjaGVkdWxlLCBERUZBVUxUX0RFQk9VTkNFX01TKTsKICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGB3YXRjaGluZyAke3BhdGh9IChDdHJsLUMgdG8gc3RvcClcbmApOwogICAgc3RhcnQoZmFsc2UpOyAvLyBpbml0aWFsIHZlcmlmeQogICAgLy8gV2F0Y2ggdGhlIHdob2xlIHByb2plY3QgdHJlZSAobmVhcmVzdCBwYWNrYWdlLmpzb24vdHNjb25maWcuanNvbiBhYm92ZSB0aGUgZW50cnkpOgogICAgLy8gZWRpdG9ycyBvZnRlbiByZXBsYWNlIGEgZmlsZSAocmVuYW1lKSBvbiBzYXZlLCB3aGljaCBkcm9wcyBhIHdhdGNoZXIgYm91bmQgdG8gdGhlCiAgICAvLyBpbm9kZSBpdHNlbGYg4oCUIGFuZCBhIG11bHRpLWZpbGUgcHJvamVjdCBtdXN0IHJlLXZlcmlmeSB3aGVuIGFueSBzb3VyY2UgT1IgdGhlIHJvb3QKICAgIC8vIHRzY29uZmlnIGNoYW5nZXMsIG5vdCBqdXN0IGZpbGVzIGJlc2lkZSB0aGUgZW50cnkuCiAgICBjb25zdCBzdG9wV2F0Y2hpbmcgPSB3YXRjaFRyZWUod2F0Y2hSb290Rm9yKHBhdGgpLCAoZmlsZW5hbWUpID0+IHsKICAgICAgaWYgKGlzV2F0Y2hSZWxldmFudChmaWxlbmFtZSkpIHRyaWdnZXIoKTsKICAgIH0pOwogICAgY29uc3Qgc3RvcCA9ICgpID0+IHsKICAgICAgc3RvcFdhdGNoaW5nKCk7CiAgICAgIHByb2Nlc3MuZXhpdCgwKTsKICAgIH07CiAgICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBzdG9wKTsKICAgIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCBzdG9wKTsgLy8gc3VwZXJ2aXNvcnMgKGRvY2tlciBzdG9wLCBzeXN0ZW1jdGwpIHNlbmQgU0lHVEVSTQogIH0pOwoKcHJvZ3JhbQogIC5jb21tYW5kKCdleHBvcnQnKQogIC5hcmd1bWVudCgnPGZpbGU+JywgJ3BhdGggdG8gYSAuYnJlcC50cyBtb2R1bGUnKQogIC5vcHRpb24oJy0tc3RlcCcsICd3cml0ZSBhIFNURVAgYXJ0aWZhY3QnKQogIC5vcHRpb24oJy0tZ2xiJywgJ3dyaXRlIGEgR0xCIGFydGlmYWN0JykKICAub3B0aW9uKCctLXN0bCcsICd3cml0ZSBhbiBTVEwgYXJ0aWZhY3QnKQogIC5vcHRpb24oJy0tYWxsJywgJ3dyaXRlIFNURVAgKyBHTEIgKyBTVEwnKQogIC5vcHRpb24oJy0tb3V0IDxkaXI+JywgJ291dHB1dCBkaXJlY3RvcnknLCAnLicpCiAgLmFjdGlvbigKICAgIGFzeW5jICgKICAgICAgZmlsZTogc3RyaW5nLAogICAgICBvcHRzOiB7IHN0ZXA/OiBib29sZWFuOyBnbGI/OiBib29sZWFuOyBzdGw/OiBib29sZWFuOyBhbGw/OiBib29sZWFuOyBvdXQ6IHN0cmluZyB9CiAgICApID0+IHsKICAgICAgY29uc3QgZm9ybWF0cyA9IG9wdHMuYWxsCiAgICAgICAgPyB7IHN0ZXA6IHRydWUsIGdsYjogdHJ1ZSwgc3RsOiB0cnVlIH0KICAgICAgICA6IHsgc3RlcDogQm9vbGVhbihvcHRzLnN0ZXApLCBnbGI6IEJvb2xlYW4ob3B0cy5nbGIpLCBzdGw6IEJvb2xlYW4ob3B0cy5zdGwpIH07CiAgICAgIGlmICghZm9ybWF0cy5zdGVwICYmICFmb3JtYXRzLmdsYiAmJiAhZm9ybWF0cy5zdGwpIHsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnbm8gZm9ybWF0cyByZXF1ZXN0ZWQg4oCUIHBhc3MgLS1zdGVwLy0tZ2xiLy0tc3RsIG9yIC0tYWxsXG4nKTsKICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhwb3J0UGFydChyZXNvbHZlKGZpbGUpLCBmb3JtYXRzLCByZXNvbHZlKG9wdHMub3V0KSk7CiAgICAgIGZvciAoY29uc3QgcCBvZiByZXN1bHQud3JpdHRlbikgcHJvY2Vzcy5zdGRlcnIud3JpdGUoYHdyb3RlOiAke3B9XG5gKTsKICAgICAgZm9yIChjb25zdCBlIG9mIHJlc3VsdC5lcnJvcnMpIHByb2Nlc3Muc3RkZXJyLndyaXRlKGBlcnJvcjogJHtlfVxuYCk7CiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKAogICAgICAgIEpTT04uc3RyaW5naWZ5KHsgb2s6IHJlc3VsdC5vaywgd3JpdHRlbjogcmVzdWx0LndyaXR0ZW4sIGVycm9yczogcmVzdWx0LmVycm9ycyB9LCBudWxsLCAyKSArCiAgICAgICAgICAnXG4nCiAgICAgICk7CiAgICAgIGlmICghcmVzdWx0Lm9rKSBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICAgIH0KICApOwoKLy8gT25seSBkcml2ZSB0aGUgQ0xJIHdoZW4gcnVuIGFzIHRoZSBlbnRyeSBzY3JpcHQsIHNvIHRlc3RzIGNhbiBpbXBvcnQgdGhlCi8vIGd1YXJkZWQgbG9hZGVycyB3aXRob3V0IGNvbW1hbmRlciBwYXJzaW5nIHRoZSB0ZXN0IHJ1bm5lcidzIGFyZ3YuCi8vIFJlc29sdmUgc3ltbGlua3Mgb24gYm90aCBzaWRlczogdGhlIG5wbS1pbnN0YWxsZWQgYmluIChub2RlX21vZHVsZXMvLmJpbi9icmVwanMpCi8vIGlzIGEgc3ltbGluaywgc28gcHJvY2Vzcy5hcmd2WzFdIHdvdWxkIG90aGVyd2lzZSBuZXZlciBlcXVhbCB0aGUgcmVhbCBtb2R1bGUgcGF0aC4KZXhwb3J0IGZ1bmN0aW9uIGlzRW50cnlwb2ludChhcmd2MTogc3RyaW5nIHwgdW5kZWZpbmVkLCBtb2R1bGVVcmw6IHN0cmluZyk6IGJvb2xlYW4gewogIGlmICghYXJndjEpIHJldHVybiBmYWxzZTsKICB0cnkgewogICAgcmV0dXJuIHJlYWxwYXRoU3luYyhhcmd2MSkgPT09IHJlYWxwYXRoU3luYyhmaWxlVVJMVG9QYXRoKG1vZHVsZVVybCkpOwogIH0gY2F0Y2ggewogICAgcmV0dXJuIGZhbHNlOwogIH0KfQoKaWYgKGlzRW50cnlwb2ludChwcm9jZXNzLmFyZ3ZbMV0sIGltcG9ydC5tZXRhLnVybCkpIHsKICB2b2lkIHByb2dyYW0ucGFyc2VBc3luYygpOwp9Cg==", "" + {}.url));
47
47
  if ((0, node_fs.existsSync)(builtJs)) return builtJs;
48
- return (0, node_url.fileURLToPath)(new URL("data:video/mp2t;base64,IyEvdXNyL2Jpbi9lbnYgbm9kZQppbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJzsKaW1wb3J0IHsgd3JpdGVGaWxlU3luYywgd2F0Y2ggYXMgZnNXYXRjaCwgcmVhbHBhdGhTeW5jLCBnbG9iU3luYyB9IGZyb20gJ25vZGU6ZnMnOwppbXBvcnQgeyByZXNvbHZlLCBqb2luLCBiYXNlbmFtZSwgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7CmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnOwppbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnOwppbXBvcnQgeyBydW5QYXJ0IH0gZnJvbSAnLi4vdmVyaWZ5L3J1blBhcnQuanMnOwppbXBvcnQgeyBwdXNoRXJyb3IsIHJlcG9ydE9rLCBzZXJpYWxpemVSZXBvcnQsIHR5cGUgVmVyaWZ5UmVwb3J0IH0gZnJvbSAnLi4vdmVyaWZ5L3JlcG9ydC5qcyc7CmltcG9ydCB7IHJ1bk1lYXN1cmUgfSBmcm9tICcuLi92ZXJpZnkvbWVhc3VyZS5qcyc7CmltcG9ydCB7IHJ1bkRpZmYgfSBmcm9tICcuLi92ZXJpZnkvZGlmZi5qcyc7CmltcG9ydCB7IHNjYWZmb2xkUGFydCB9IGZyb20gJy4vc2NhZmZvbGQuanMnOwppbXBvcnQgeyBkZWJvdW5jZSwgREVGQVVMVF9ERUJPVU5DRV9NUyB9IGZyb20gJy4vd2F0Y2guanMnOwppbXBvcnQgeyBleHBvcnRQYXJ0IH0gZnJvbSAnLi9leHBvcnRQYXJ0LmpzJzsKaW1wb3J0IHsgb3BlbkJyb3dzZXIsIHNob3VsZEF1dG9PcGVuIH0gZnJvbSAnLi9vcGVuQnJvd3Nlci5qcyc7CmltcG9ydCB7IGRpc3Bvc2VTaGFwZSB9IGZyb20gJy4uL2Rpc3Bvc2VTaGFwZS5qcyc7CmltcG9ydCB0eXBlIHsgc2hvb3QgYXMgU2hvb3RGbiB9IGZyb20gJy4uL3NuYXBzaG90L3Nob290LmpzJzsKaW1wb3J0IHsgYWltZWRTZWN0aW9uLCBmZWF0dXJlTWFya3MgfSBmcm9tICcuLi9zbmFwc2hvdC9haW1pbmcuanMnOwoKLy8gT0NDVCdzIFdBU00gU1RFUCB3cml0ZXIgZW1pdHMgYSAiU3RhdGlzdGljcyBvbiBUcmFuc2ZlciIgYmFubmVyIHZpYSBjb25zb2xlLmxvZwovLyAoRW1zY3JpcHRlbidzIGRlZmF1bHQgc3Rkb3V0IHNpbmspLiBUaGUgQ0xJIG93bnMgc3Rkb3V0IGZvciBtYWNoaW5lLXJlYWRhYmxlIEpTT04sCi8vIHNvIGRpdmVydCB0aGF0IGtlcm5lbCBjaGF0dGVyIHRvIHN0ZGVyciB0byBrZWVwIHN0ZG91dCBhIHNpbmdsZSBjbGVhbiBKU09OIGRvY3VtZW50LgovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZSAtLSByZXJvdXRlIGtlcm5lbCBzdGRvdXQgY2hhdHRlciBvZmYgdGhlIEpTT04gY2hhbm5lbApjb25zb2xlLmxvZyA9ICguLi5hcmdzOiB1bmtub3duW10pID0+IHsKICBwcm9jZXNzLnN0ZGVyci53cml0ZShhcmdzLm1hcChTdHJpbmcpLmpvaW4oJyAnKSArICdcbicpOwp9OwoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRTbmFwc2hvdFNob290KCk6IFByb21pc2U8dHlwZW9mIFNob290Rm4gfCB1bmRlZmluZWQ+IHsKICB0cnkgewogICAgY29uc3QgbW9kID0gYXdhaXQgaW1wb3J0KCcuLi9zbmFwc2hvdC9zaG9vdC5qcycpOwogICAgcmV0dXJuIG1vZC5zaG9vdDsKICB9IGNhdGNoIHsKICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdzbmFwc2hvdHMgbmVlZCBwdXBwZXRlZXIvQ2hyb21lIOKAlCBydW46IG5wbSBpIHB1cHBldGVlclxuJyk7CiAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICAgIHJldHVybiB1bmRlZmluZWQ7CiAgfQp9Cgpjb25zdCBwcm9ncmFtID0gbmV3IENvbW1hbmQoKTsKcHJvZ3JhbS5uYW1lKCdicmVwJyk7Cgpwcm9ncmFtCiAgLmNvbW1hbmQoJ3ZlcmlmeScsIHsgaXNEZWZhdWx0OiB0cnVlIH0pCiAgLmFyZ3VtZW50KAogICAgJzxmaWxlcy4uLj4nLAogICAgJ3BhdGgocykgb3IgZ2xvYihzKSB0byAuYnJlcC50cyBtb2R1bGVzOyBtdWx0aXBsZSBmaWxlcyDihpIgYSBiYXRjaCB2YWxpZGl0eSBKU09OIGFycmF5JwogICkKICAub3B0aW9uKCctLXN0ZXAgPG91dD4nLCAnd3JpdGUgdGhlIHByaW1hcnkgU1RFUCBhcnRpZmFjdCB0byB0aGlzIHBhdGgnKQogIC5vcHRpb24oJy0tZ2xiIDxvdXQ+JywgJ3dyaXRlIGEgZGVyaXZlZCBHTEIgcHJldmlldyB0byB0aGlzIHBhdGgnKQogIC5vcHRpb24oJy0tanNvbiA8b3V0PicsICd3cml0ZSB0aGUgSlNPTiByZXBvcnQgdG8gdGhpcyBwYXRoJykKICAub3B0aW9uKAogICAgJy0tY2hlY2snLAogICAgJ3R5cGUtY2hlY2sgdGhlIHBhcnQgKGFnYWluc3QgYnJlcGpzIHR5cGVzKSBiZWZvcmUgcnVubmluZzsgc2tpcCBleGVjdXRpb24gb24gdHlwZSBlcnJvcnMnCiAgKQogIC5vcHRpb24oJy0tc25hcHNob3QgPGRpcj4nLCAncmVuZGVyIGlzby9mcm9udC90b3AvcmlnaHQgUE5HcyB0byB0aGlzIGRpciAocmVxdWlyZXMgYnVpbHQgdmlld2VyKScpCiAgLm9wdGlvbigKICAgICctLXNlcnZlJywKICAgICdhZnRlciB2ZXJpZnlpbmcsIHN0YXJ0IGEgcHJldmlldyBzZXJ2ZXIgYW5kIHByaW50IGEgP2Rpcj0mZmlsZT0gZGVlcCBsaW5rIChzdGF5cyBydW5uaW5nKScKICApCiAgLm9wdGlvbignLS1uby1vcGVuJywgJ3dpdGggLS1zZXJ2ZSwgZG8gbm90IGF1dG8tb3BlbiB0aGUgYnJvd3NlciAoanVzdCBwcmludCB0aGUgdmlld2VyIFVSTCknKQogIC5vcHRpb24oCiAgICAnLS1leHBlY3QtY29kZSA8Y29kZT4nLAogICAgJ2V4aXQgMCBvbmx5IGlmIHRoZSByZXBvcnQgZW1pdHMgdGhpcyBlcnJvciBjb2RlIChmb3IgZml4dHVyZXMvZXZhbCByZWNhbGwpJwogICkKICAub3B0aW9uKAogICAgJy0tZXhwZWN0LWludmFsaWQnLAogICAgJ2V4aXQgMCBvbmx5IGlmIHRoZSBwYXJ0IGlzIGludmFsaWQgKG9rOmZhbHNlKSDigJQgZm9yIGtub3duLWJhZCBmaXh0dXJlcycKICApCiAgLm9wdGlvbigKICAgICctLW1ldHJpY3MnLAogICAgJ2NvbXB1dGUgZGV0ZXJtaW5pc3RpYyBtYW51ZmFjdHVyYWJpbGl0eSBtZXRyaWNzIChwZXItYm9keSBicmVha2Rvd24gKyBpbnRlcmZlcmVuY2UgbWF0cml4KSBmb3IgdGhlIGRlc2lnbiBqdWRnZSDigJQgc2xvd2VyOyBvZmYgYnkgZGVmYXVsdCcKICApCiAgLmFjdGlvbigKICAgIGFzeW5jICgKICAgICAgZmlsZXM6IHN0cmluZ1tdLAogICAgICBvcHRzOiB7CiAgICAgICAgc3RlcD86IHN0cmluZzsKICAgICAgICBnbGI/OiBzdHJpbmc7CiAgICAgICAganNvbj86IHN0cmluZzsKICAgICAgICBjaGVjaz86IGJvb2xlYW47CiAgICAgICAgc25hcHNob3Q/OiBzdHJpbmc7CiAgICAgICAgc2VydmU/OiBib29sZWFuOwogICAgICAgIGV4cGVjdENvZGU/OiBzdHJpbmc7CiAgICAgICAgZXhwZWN0SW52YWxpZD86IGJvb2xlYW47CiAgICAgICAgbWV0cmljcz86IGJvb2xlYW47CiAgICAgICAgLy8gQ29tbWFuZGVyIG1hdGVyaWFsaXplcyBhIG5lZ2F0ZWQgZmxhZyBhcyBhIGNvbmNyZXRlIGJvb2xlYW46IHRydWUgYnkKICAgICAgICAvLyBkZWZhdWx0LCBmYWxzZSB3aGVuIC0tbm8tb3BlbiBpcyBwYXNzZWQuCiAgICAgICAgb3BlbjogYm9vbGVhbjsKICAgICAgfQogICAgKSA9PiB7CiAgICAgIC8vIEEgcXVvdGVkIGdsb2IgKCJwYXJ0cy8qLmJyZXAudHMiKSBhcnJpdmVzIGFzIG9uZSBsaXRlcmFsIGFyZywgYSBzaGVsbC1leHBhbmRlZCBvbmUgYXMgbWFueTsKICAgICAgLy8gZ2xvYlN5bmMgaGFuZGxlcyBib3RoIChhIGxpdGVyYWwgZmlsZW5hbWUgbWF0Y2hlcyBpdHNlbGYpLCBmYWxsaW5nIGJhY2sgdG8gdGhlIHJhdyBhcmcgc28gYQogICAgICAvLyBtaXNzaW5nIHBhdGggc3RpbGwgcnVucyBhbmQgcmVwb3J0cyBpdHMgb3duIGVycm9yLgogICAgICBjb25zdCB0YXJnZXRzID0gWwogICAgICAgIC4uLm5ldyBTZXQoCiAgICAgICAgICBmaWxlcy5mbGF0TWFwKChmKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IG0gPSBnbG9iU3luYyhmKTsKICAgICAgICAgICAgcmV0dXJuIG0ubGVuZ3RoID8gbSA6IFtmXTsKICAgICAgICAgIH0pCiAgICAgICAgKSwKICAgICAgXS5tYXAoKHApID0+IHJlc29sdmUocCkpOwoKICAgICAgaWYgKHRhcmdldHMubGVuZ3RoID4gMSkgewogICAgICAgIC8vIEJhdGNoOiB2YWxpZGl0eS1vbmx5IEpTT04gYXJyYXkuIFRoZSBzaW5nbGUtZmlsZSBhcnRpZmFjdCBmbGFncyBkb24ndCBhcHBseS4KICAgICAgICBpZiAoCiAgICAgICAgICBvcHRzLnN0ZXAgfHwKICAgICAgICAgIG9wdHMuc2VydmUgfHwKICAgICAgICAgIG9wdHMuc25hcHNob3QgfHwKICAgICAgICAgIG9wdHMuZ2xiIHx8CiAgICAgICAgICBvcHRzLmV4cGVjdENvZGUgfHwKICAgICAgICAgIG9wdHMuZXhwZWN0SW52YWxpZAogICAgICAgICkgewogICAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoCiAgICAgICAgICAgICdiYXRjaCBtb2RlOiAtLXN0ZXAvLS1nbGIvLS1zZXJ2ZS8tLXNuYXBzaG90Ly0tZXhwZWN0LWNvZGUvLS1leHBlY3QtaW52YWxpZCBpZ25vcmVkIChzaW5nbGUtZmlsZSBvbmx5KVxuJwogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVzdWx0czogeyBmaWxlOiBzdHJpbmc7IG9rOiBib29sZWFuOyByZXBvcnQ6IFZlcmlmeVJlcG9ydCB9W10gPSBbXTsKICAgICAgICBmb3IgKGNvbnN0IGYgb2YgdGFyZ2V0cykgewogICAgICAgICAgY29uc3QgeyByZXBvcnQsIHNoYXBlIH0gPSBhd2FpdCBydW5QYXJ0KGYsIHsKICAgICAgICAgICAgY2hlY2s6IEJvb2xlYW4ob3B0cy5jaGVjayksCiAgICAgICAgICAgIG1ldHJpY3M6IEJvb2xlYW4ob3B0cy5tZXRyaWNzKSwKICAgICAgICAgIH0pOwogICAgICAgICAgZGlzcG9zZVNoYXBlKHNoYXBlKTsKICAgICAgICAgIHJlc3VsdHMucHVzaCh7IGZpbGU6IGYsIG9rOiByZXBvcnRPayhyZXBvcnQpLCByZXBvcnQgfSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShyZXN1bHRzLCBudWxsLCAyKTsKICAgICAgICBpZiAob3B0cy5qc29uICYmIG9wdHMuanNvbiAhPT0gJy0nKSB3cml0ZUZpbGVTeW5jKG9wdHMuanNvbiwganNvbik7CiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoanNvbiArICdcbicpOwogICAgICAgIGlmIChyZXN1bHRzLnNvbWUoKHIpID0+ICFyLm9rKSkgcHJvY2Vzcy5leGl0Q29kZSA9IDE7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBjb25zdCBmaWxlID0gdGFyZ2V0c1swXSA/PyBmaWxlc1swXSA/PyAnJzsKICAgICAgLy8gVGhlIFdBU00gdmlld2VyIGxvYWRzIGEgQ0FEIGZpbGUgKGl0IGNhbid0IHJ1biBhIC5icmVwLnRzKSwgc28gLS1zbmFwc2hvdC8tLXNlcnZlCiAgICAgIC8vIHN0YWdlIHRoZSBwcmltYXJ5IFNURVAgYW5kIHBvaW50IHRoZSB2aWV3ZXIgYXQgaXQgdmlhID9kaXI9JmZpbGU9LiAtLWdsYiBpcyBpdHMgb3duIGFydGlmYWN0LgogICAgICBjb25zdCB3YW50U3RlcCA9IEJvb2xlYW4ob3B0cy5zdGVwKSB8fCBCb29sZWFuKG9wdHMuc25hcHNob3QpIHx8IEJvb2xlYW4ob3B0cy5zZXJ2ZSk7CiAgICAgIGNvbnN0IHsgcmVwb3J0LCBzdGVwLCBnbGIsIHNoYXBlIH0gPSBhd2FpdCBydW5QYXJ0KHJlc29sdmUoZmlsZSksIHsKICAgICAgICBzdGVwOiB3YW50U3RlcCwKICAgICAgICBnbGI6IEJvb2xlYW4ob3B0cy5nbGIpLAogICAgICAgIGNoZWNrOiBCb29sZWFuKG9wdHMuY2hlY2spLAogICAgICAgIC8vIEEgc25hcHNob3QgZmVlZHMgdGhlIGRlc2lnbiBqdWRnZSwgc28gY29tcHV0ZSBtZXRyaWNzIHRvbyAoYm9yZXMg4oaSIGFuIGFpbWVkIHNlY3Rpb24gc2hvdCkuCiAgICAgICAgbWV0cmljczogQm9vbGVhbihvcHRzLm1ldHJpY3MpIHx8IEJvb2xlYW4ob3B0cy5zbmFwc2hvdCksCiAgICAgIH0pOwogICAgICBsZXQgc3RlcFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdHMuc3RlcDsKICAgICAgdHJ5IHsKICAgICAgICBpZiAob3B0cy5nbGIgJiYgZ2xiKSB3cml0ZUZpbGVTeW5jKG9wdHMuZ2xiLCBCdWZmZXIuZnJvbShnbGIpKTsKCiAgICAgICAgaWYgKHdhbnRTdGVwICYmIHN0ZXApIHsKICAgICAgICAgIHN0ZXBQYXRoID0gb3B0cy5zdGVwID8/IGpvaW4odG1wZGlyKCksIGBicmVwLSR7YmFzZW5hbWUoZmlsZSl9LnN0ZXBgKTsKICAgICAgICAgIHdyaXRlRmlsZVN5bmMoc3RlcFBhdGgsIEJ1ZmZlci5mcm9tKHN0ZXApKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9wdHMuc25hcHNob3QgJiYgc3RlcFBhdGgpIHsKICAgICAgICAgIGNvbnN0IHNob290ID0gYXdhaXQgbG9hZFNuYXBzaG90U2hvb3QoKTsgLy8gbGF6eToga2VlcHMgcHVwcGV0ZWVyIG9mZiB0aGUgZGVmYXVsdCBwYXRoCiAgICAgICAgICBpZiAoc2hvb3QpIHsKICAgICAgICAgICAgY29uc3Qgc2VjdGlvbiA9IGFpbWVkU2VjdGlvbigKICAgICAgICAgICAgICByZXBvcnQubWFudWZhY3R1cmFiaWxpdHk/LmJvcmVzID8/IFtdLAogICAgICAgICAgICAgIHJlcG9ydC5tZWFzdXJlbWVudHMuYm91bmRzCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNvbnN0IG1hcmtzID0gZmVhdHVyZU1hcmtzKHJlcG9ydC5ib2RpZXMgPz8gW10sIHJlcG9ydC5tYW51ZmFjdHVyYWJpbGl0eT8uYm9yZXMgPz8gW10pOwogICAgICAgICAgICBjb25zdCB7IHBuZ3MgfSA9IGF3YWl0IHNob290KHsKICAgICAgICAgICAgICBmaWxlOiBzdGVwUGF0aCwKICAgICAgICAgICAgICBvdXREaXI6IG9wdHMuc25hcHNob3QsCiAgICAgICAgICAgICAgLi4uKHNlY3Rpb24gPyB7IHNlY3Rpb24gfSA6IHt9KSwKICAgICAgICAgICAgICAuLi4obWFya3MubGVuZ3RoID4gMCA/IHsgbWFya3MgfSA6IHt9KSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIERpYWdub3N0aWMgcGF0aHMgZ28gdG8gc3RkZXJyIOKAlCBzdGRvdXQgc3RheXMgYSBzaW5nbGUgY2xlYW4gSlNPTiBkb2N1bWVudC4KICAgICAgICAgICAgZm9yIChjb25zdCBwIG9mIHBuZ3MpIHByb2Nlc3Muc3RkZXJyLndyaXRlKGBzbmFwc2hvdDogJHtwfVxuYCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChvcHRzLnNuYXBzaG90KSB7CiAgICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnc25hcHNob3Qgc2tpcHBlZDogU1RFUCBleHBvcnQgcHJvZHVjZWQgbm8gYXJ0aWZhY3RcbicpOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHB1c2hFcnJvcihyZXBvcnQsIHsgbWVzc2FnZTogYGFydGlmYWN0IHdyaXRlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gIH0pOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIC8vIFRoZSBzaGFwZSBpcyBhIGxpdmUgV0FTTSBoYW5kbGU7IHJlbGVhc2UgaXQgYmVmb3JlIHRoZSBzZXJ2ZXIgdGFrZXMgb3ZlciAodGhlCiAgICAgICAgLy8gLS1zZXJ2ZSBwYXRoIHN0YXlzIHJ1bm5pbmcsIHNvIGxlYWtpbmcgaGVyZSB3b3VsZCBwZXJzaXN0IGZvciB0aGUgc2VydmVyJ3MgbGlmZXRpbWUpLgogICAgICAgIGRpc3Bvc2VTaGFwZShzaGFwZSk7CiAgICAgIH0KICAgICAgLy8gU2VyaWFsaXplIG9uY2UgYWZ0ZXIgYWxsIGFydGlmYWN0IHdyaXRlcyBzbyB0aGUgLS1qc29uIGZpbGUgYW5kIHN0ZG91dAogICAgICAvLyByZWZsZWN0IHRoZSBzYW1lIHJlcG9ydCAoaW5jbC4gYW55ICJhcnRpZmFjdCB3cml0ZSBmYWlsZWQiIGVycm9yKS4KICAgICAgY29uc3QganNvbiA9IHNlcmlhbGl6ZVJlcG9ydChyZXBvcnQpOwogICAgICAvLyBgLS1qc29uIC1gIGlzIHNhdGlzZmllZCBieSB0aGUgc3Rkb3V0IHdyaXRlIGJlbG93OyBvbmx5IGEgcmVhbCBwYXRoIHdyaXRlcyBhIGZpbGUuCiAgICAgIGlmIChvcHRzLmpzb24gJiYgb3B0cy5qc29uICE9PSAnLScpIHdyaXRlRmlsZVN5bmMob3B0cy5qc29uLCBqc29uKTsKICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoanNvbiArICdcbicpOwogICAgICBpZiAoIXJlcG9ydE9rKHJlcG9ydCkpIHByb2Nlc3MuZXhpdENvZGUgPSAxOwogICAgICAvLyBGaXh0dXJlIGFzc2VydGlvbnMgKFBoYXNlOiB2ZXJpZnktaGVhbCBwcmVjaXNpb24vcmVjYWxsKSBvdmVycmlkZSB0aGUgbm9ybWFsIGV4aXQgY29kZToKICAgICAgLy8gYSBrbm93bi1iYWQgcGFydCBtdXN0IGZhaWwgdGhlICpyaWdodCogd2F5LiBDb2RlcyBjb21lIGZyb20gdGhlIGtlcm5lbC9hdXRob3JpbmcgZXJyb3JzLAogICAgICAvLyBub3QgdGhlIGhpbnQgdGFibGUsIHNvIHRoaXMgbWVhc3VyZXMgdGhlIHZlcmlmaWVyLCBub3QgaXRzIHByb3NlLgogICAgICBpZiAob3B0cy5leHBlY3RJbnZhbGlkIHx8IG9wdHMuZXhwZWN0Q29kZSkgewogICAgICAgIC8vIGhpbnRzIGFyZSBkZXJpdmVkIGZyb20gZXJyb3JJbmZvcywgc28gdGhlIGNvZGVzIGxpdmUgdGhlcmU7IGRlZHVwZSB0byBrZWVwIHRoZSBsaW5lIGNsZWFuLgogICAgICAgIGNvbnN0IGNvZGVzID0gWwogICAgICAgICAgLi4ubmV3IFNldChyZXBvcnQuZXJyb3JJbmZvcy5tYXAoKGUpID0+IGUuY29kZSkuZmlsdGVyKChjKTogYyBpcyBzdHJpbmcgPT4gQm9vbGVhbihjKSkpLAogICAgICAgIF07CiAgICAgICAgY29uc3QgdmFsaWQgPSByZXBvcnRPayhyZXBvcnQpOwogICAgICAgIGNvbnN0IHBhc3MgPQogICAgICAgICAgKCFvcHRzLmV4cGVjdEludmFsaWQgfHwgIXZhbGlkKSAmJiAoIW9wdHMuZXhwZWN0Q29kZSB8fCBjb2Rlcy5pbmNsdWRlcyhvcHRzLmV4cGVjdENvZGUpKTsKICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gcGFzcyA/IDAgOiAxOwogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKAogICAgICAgICAgYGV4cGVjdDogJHtwYXNzID8gJ1BBU1MnIDogJ0ZBSUwnfWAgKwogICAgICAgICAgICAob3B0cy5leHBlY3RDb2RlID8gYCBjb2RlPSR7b3B0cy5leHBlY3RDb2RlfWAgOiAnJykgKwogICAgICAgICAgICAob3B0cy5leHBlY3RJbnZhbGlkID8gJyBpbnZhbGlkJyA6ICcnKSArCiAgICAgICAgICAgIGAgKG9rPSR7dmFsaWR9LCBjb2Rlcz0ke2NvZGVzLmpvaW4oJywnKSB8fCAnbm9uZSd9KVxuYAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHdpbGxTZXJ2ZSA9IEJvb2xlYW4ob3B0cy5zZXJ2ZSkgJiYgc3RlcFBhdGggIT09IHVuZGVmaW5lZCAmJiByZXBvcnRPayhyZXBvcnQpOwogICAgICBpZiAod2lsbFNlcnZlICYmIHN0ZXBQYXRoKSB7CiAgICAgICAgY29uc3QgeyBzZXJ2ZSB9ID0gYXdhaXQgaW1wb3J0KCcuLi9zbmFwc2hvdC9zZXJ2ZS5qcycpOyAvLyBsYXp5OiBubyBzZXJ2ZXIgZGVwcyBvbiB0aGUgZGVmYXVsdCBwYXRoCiAgICAgICAgY29uc3QgeyB1cmwsIHJldXNlZCB9ID0gYXdhaXQgc2VydmUoeyBmaWxlOiBzdGVwUGF0aCB9KTsgLy8gYnVpbGRzIGEgP2Rpcj0mZmlsZT0gVVJMOyBzZXJ2ZXIgcnVucyB1bnRpbCBDdHJsLUMKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShgdmlld2VyOiAke3VybH1cbmApOwogICAgICAgIC8vIEF1dG8tb3BlbiBvbmx5IGZvciBhIGZyZXNobHkgc3RhcnRlZCBzZXJ2ZXIgKGEgcmV1c2VkIG9uZSBhbHJlYWR5IGhhcwogICAgICAgIC8vIGEgdGFiKSBpbiBhbiBpbnRlcmFjdGl2ZSBzZXNzaW9uOyBgLS1uby1vcGVuYCAob3B0cy5vcGVuID09PSBmYWxzZSkKICAgICAgICAvLyBhbHdheXMgc3VwcHJlc3NlcyBpdC4KICAgICAgICBpZiAoIXJldXNlZCAmJiBvcHRzLm9wZW4gJiYgc2hvdWxkQXV0b09wZW4oKSkgewogICAgICAgICAgb3BlbkJyb3dzZXIodXJsKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICApOwoKcHJvZ3JhbQogIC5jb21tYW5kKCdtZWFzdXJlJykKICAuYXJndW1lbnQoJzxhPicsICdwYXRoIHRvIGEgLmJyZXAudHMgbW9kdWxlJykKICAuYXJndW1lbnQoJ1tiXScsICdvcHRpb25hbCBzZWNvbmQgbW9kdWxlOyBpZiBnaXZlbiwgbWVhc3VyZXMgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHBhcnRzJykKICAuYWN0aW9uKGFzeW5jIChhOiBzdHJpbmcsIGI/OiBzdHJpbmcpID0+IHsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1bk1lYXN1cmUocmVzb2x2ZShhKSwgYiA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcmVzb2x2ZShiKSk7CiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgKICAgICAgSlNPTi5zdHJpbmdpZnkoeyBvazogcmVzdWx0LmVycm9ycy5sZW5ndGggPT09IDAsIC4uLnJlc3VsdCB9LCBudWxsLCAyKSArICdcbicKICAgICk7CiAgICBpZiAocmVzdWx0LmVycm9ycy5sZW5ndGggPiAwKSBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICB9KTsKCnByb2dyYW0KICAuY29tbWFuZCgnZGlmZicpCiAgLmFyZ3VtZW50KCc8YT4nLCAncGF0aCB0byB0aGUgYmFzZWxpbmUgLmJyZXAudHMgbW9kdWxlJykKICAuYXJndW1lbnQoJzxiPicsICdwYXRoIHRvIHRoZSBjb21wYXJpc29uIC5icmVwLnRzIG1vZHVsZScpCiAgLmFjdGlvbihhc3luYyAoYTogc3RyaW5nLCBiOiBzdHJpbmcpID0+IHsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1bkRpZmYocmVzb2x2ZShhKSwgcmVzb2x2ZShiKSk7CiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgKICAgICAgSlNPTi5zdHJpbmdpZnkoeyBvazogcmVzdWx0LmVycm9ycy5sZW5ndGggPT09IDAsIC4uLnJlc3VsdCB9LCBudWxsLCAyKSArICdcbicKICAgICk7CiAgICBpZiAocmVzdWx0LmVycm9ycy5sZW5ndGggPiAwKSBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICB9KTsKCnByb2dyYW0KICAuY29tbWFuZCgnc25hcHNob3QnKQogIC5hcmd1bWVudCgKICAgICc8ZmlsZT4nLAogICAgJ3BhdGggdG8gYSAuYnJlcC50cyBtb2R1bGU7IHJlbmRlcnMgaXNvL2Zyb250L3RvcC9yaWdodCBQTkdzIChubyByZXBvcnQgYXNzZXJ0aW9ucyknCiAgKQogIC5vcHRpb24oJy0tb3V0IDxkaXI+JywgJ291dHB1dCBkaXJlY3RvcnkgZm9yIHRoZSBQTkdzIChkZWZhdWx0IDxmaWxlPi1zaG90cyknKQogIC5vcHRpb24oJy0tbGFiZWwgPHRhZz4nLCAnc3ViZm9sZGVyIGZvciB0aGlzIHJlbmRlciBzZXQgKGUuZy4gcHJlLCBwb3N0KSBmb3IgQS9CIHBhaXJpbmcnKQogIC5hY3Rpb24oYXN5bmMgKGZpbGU6IHN0cmluZywgb3B0czogeyBvdXQ/OiBzdHJpbmc7IGxhYmVsPzogc3RyaW5nIH0pID0+IHsKICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZShmaWxlKTsKICAgIGNvbnN0IGJhc2UgPSBvcHRzLm91dCA/IHJlc29sdmUob3B0cy5vdXQpIDogYCR7cmVzb2x2ZWR9LXNob3RzYDsKICAgIGNvbnN0IG91dERpciA9IG9wdHMubGFiZWwgPyBqb2luKGJhc2UsIG9wdHMubGFiZWwpIDogYmFzZTsKICAgIGNvbnN0IHsgcmVwb3J0LCBzdGVwLCBzaGFwZSB9ID0gYXdhaXQgcnVuUGFydChyZXNvbHZlZCwgeyBzdGVwOiB0cnVlLCBtZXRyaWNzOiB0cnVlIH0pOwogICAgdHJ5IHsKICAgICAgaWYgKCFzdGVwKSB7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ3NuYXBzaG90OiBwYXJ0IHByb2R1Y2VkIG5vIFNURVAg4oCUIG5vdGhpbmcgdG8gcmVuZGVyXG4nKTsKICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShzZXJpYWxpemVSZXBvcnQocmVwb3J0KSArICdcbicpOwogICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBzdGVwUGF0aCA9IGpvaW4odG1wZGlyKCksIGBicmVwLXNuYXAtJHtiYXNlbmFtZShmaWxlKX0uc3RlcGApOwogICAgICB3cml0ZUZpbGVTeW5jKHN0ZXBQYXRoLCBCdWZmZXIuZnJvbShzdGVwKSk7CiAgICAgIGNvbnN0IHNob290ID0gYXdhaXQgbG9hZFNuYXBzaG90U2hvb3QoKTsKICAgICAgaWYgKCFzaG9vdCkgewogICAgICAgIC8vIHB1cHBldGVlciBhYnNlbnQ6IGxvYWRTbmFwc2hvdFNob290IHNldCBleGl0Q29kZSArIHN0ZGVycjsgc3RpbGwgZW1pdCB0aGUgcmVwb3J0IHNvIGEKICAgICAgICAvLyBjYWxsZXIgcGFyc2luZyBzdGRvdXQgZ2V0cyB0aGUgdmFsaWRpdHkgaW5mbyByYXRoZXIgdGhhbiBhbiBlbXB0eSBidWZmZXIuCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoc2VyaWFsaXplUmVwb3J0KHJlcG9ydCkgKyAnXG4nKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgLy8gZnJlc2g6IGEgcHJpdmF0ZSBlcGhlbWVyYWwgcmVuZGVyIHNlcnZlciBzbyBwYXJhbGxlbCBzbmFwc2hvdHMgZG9uJ3QgY29udGVuZCBvbiA6NzM3My4KICAgICAgY29uc3Qgc2VjdGlvbiA9IGFpbWVkU2VjdGlvbigKICAgICAgICByZXBvcnQubWFudWZhY3R1cmFiaWxpdHk/LmJvcmVzID8/IFtdLAogICAgICAgIHJlcG9ydC5tZWFzdXJlbWVudHMuYm91bmRzCiAgICAgICk7CiAgICAgIGNvbnN0IG1hcmtzID0gZmVhdHVyZU1hcmtzKHJlcG9ydC5ib2RpZXMgPz8gW10sIHJlcG9ydC5tYW51ZmFjdHVyYWJpbGl0eT8uYm9yZXMgPz8gW10pOwogICAgICBjb25zdCB7IHBuZ3MgfSA9IGF3YWl0IHNob290KHsKICAgICAgICBmaWxlOiBzdGVwUGF0aCwKICAgICAgICBvdXREaXIsCiAgICAgICAgZnJlc2g6IHRydWUsCiAgICAgICAgLi4uKHNlY3Rpb24gPyB7IHNlY3Rpb24gfSA6IHt9KSwKICAgICAgICAuLi4obWFya3MubGVuZ3RoID4gMCA/IHsgbWFya3MgfSA6IHt9KSwKICAgICAgfSk7CiAgICAgIGZvciAoY29uc3QgcCBvZiBwbmdzKSBwcm9jZXNzLnN0ZG91dC53cml0ZShgJHtwfVxuYCk7CiAgICB9IGZpbmFsbHkgewogICAgICBkaXNwb3NlU2hhcGUoc2hhcGUpOwogICAgfQogIH0pOwoKcHJvZ3JhbQogIC5jb21tYW5kKCdpbml0JykKICAuYXJndW1lbnQoJzxuYW1lPicsICdwYXJ0IG5hbWU7IHNjYWZmb2xkcyA8bmFtZT4uYnJlcC50cyArIHRzY29uZmlnLmpzb24gKyBSRUFETUUubWQnKQogIC5vcHRpb24oJy0tb3V0IDxkaXI+JywgJ3RhcmdldCBkaXJlY3RvcnkgKGRlZmF1bHRzIHRvIC4vPG5hbWU+KScpCiAgLmFjdGlvbigobmFtZTogc3RyaW5nLCBvcHRzOiB7IG91dD86IHN0cmluZyB9KSA9PiB7CiAgICBjb25zdCBkaXIgPSByZXNvbHZlKG9wdHMub3V0ID8/IG5hbWUpOwogICAgY29uc3QgcmVzdWx0ID0gc2NhZmZvbGRQYXJ0KG5hbWUsIGRpcik7CiAgICBmb3IgKGNvbnN0IGYgb2YgcmVzdWx0LmZpbGVzKSB7CiAgICAgIGNvbnN0IHRhZyA9IGYuY3JlYXRlZCA/ICdjcmVhdGVkJyA6ICdleGlzdHMgKGtlcHQpJzsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoYCR7dGFnfTogJHtmLnBhdGh9XG5gKTsKICAgIH0KICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMikgKyAnXG4nKTsKICB9KTsKCnByb2dyYW0KICAuY29tbWFuZCgnd2F0Y2gnKQogIC5hcmd1bWVudCgnPGZpbGU+JywgJ3BhdGggdG8gYSAuYnJlcC50cyBtb2R1bGU7IHJlLXZlcmlmaWVzIG9uIGVhY2ggc2F2ZSB1bnRpbCBDdHJsLUMnKQogIC5hY3Rpb24oKGZpbGU6IHN0cmluZykgPT4gewogICAgY29uc3QgcGF0aCA9IHJlc29sdmUoZmlsZSk7CiAgICBjb25zdCBydW4gPSBhc3luYyAoKSA9PiB7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgeyByZXBvcnQsIHNoYXBlIH0gPSBhd2FpdCBydW5QYXJ0KHBhdGgpOwogICAgICAgIHRyeSB7CiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShzZXJpYWxpemVSZXBvcnQocmVwb3J0KSArICdcbicpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBkaXNwb3NlU2hhcGUoc2hhcGUpOyAvLyBsaXZlIFdBU00gaGFuZGxlOyB0aGUgbG9vcCBydW5zIGluZGVmaW5pdGVseQogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGB3YXRjaCBydW4gZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfVxuYCk7CiAgICAgIH0KICAgIH07CiAgICBjb25zdCB7IHRyaWdnZXIgfSA9IGRlYm91bmNlKHJ1biwgREVGQVVMVF9ERUJPVU5DRV9NUyk7CiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShgd2F0Y2hpbmcgJHtwYXRofSAoQ3RybC1DIHRvIHN0b3ApXG5gKTsKICAgIHZvaWQgcnVuKCk7IC8vIGluaXRpYWwgdmVyaWZ5CiAgICAvLyBXYXRjaCB0aGUgcGFyZW50IGRpcjogZWRpdG9ycyBvZnRlbiByZXBsYWNlIHRoZSBmaWxlIChyZW5hbWUpIG9uIHNhdmUsCiAgICAvLyB3aGljaCBkcm9wcyBhIHdhdGNoZXIgYm91bmQgdG8gdGhlIGZpbGUgaW5vZGUgaXRzZWxmLgogICAgY29uc3Qgd2F0Y2hlciA9IGZzV2F0Y2goZGlybmFtZShwYXRoKSwgKF9ldmVudCwgZmlsZW5hbWUpID0+IHsKICAgICAgaWYgKGZpbGVuYW1lID09PSB1bmRlZmluZWQgfHwgZmlsZW5hbWUgPT09IG51bGwpIHsKICAgICAgICB0cmlnZ2VyKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChiYXNlbmFtZShwYXRoKSA9PT0gZmlsZW5hbWUudG9TdHJpbmcoKSkgdHJpZ2dlcigpOwogICAgfSk7CiAgICBjb25zdCBzdG9wID0gKCkgPT4gewogICAgICB3YXRjaGVyLmNsb3NlKCk7CiAgICAgIHByb2Nlc3MuZXhpdCgwKTsKICAgIH07CiAgICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBzdG9wKTsKICAgIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCBzdG9wKTsgLy8gc3VwZXJ2aXNvcnMgKGRvY2tlciBzdG9wLCBzeXN0ZW1jdGwpIHNlbmQgU0lHVEVSTQogIH0pOwoKcHJvZ3JhbQogIC5jb21tYW5kKCdleHBvcnQnKQogIC5hcmd1bWVudCgnPGZpbGU+JywgJ3BhdGggdG8gYSAuYnJlcC50cyBtb2R1bGUnKQogIC5vcHRpb24oJy0tc3RlcCcsICd3cml0ZSBhIFNURVAgYXJ0aWZhY3QnKQogIC5vcHRpb24oJy0tZ2xiJywgJ3dyaXRlIGEgR0xCIGFydGlmYWN0JykKICAub3B0aW9uKCctLXN0bCcsICd3cml0ZSBhbiBTVEwgYXJ0aWZhY3QnKQogIC5vcHRpb24oJy0tYWxsJywgJ3dyaXRlIFNURVAgKyBHTEIgKyBTVEwnKQogIC5vcHRpb24oJy0tb3V0IDxkaXI+JywgJ291dHB1dCBkaXJlY3RvcnknLCAnLicpCiAgLmFjdGlvbigKICAgIGFzeW5jICgKICAgICAgZmlsZTogc3RyaW5nLAogICAgICBvcHRzOiB7IHN0ZXA/OiBib29sZWFuOyBnbGI/OiBib29sZWFuOyBzdGw/OiBib29sZWFuOyBhbGw/OiBib29sZWFuOyBvdXQ6IHN0cmluZyB9CiAgICApID0+IHsKICAgICAgY29uc3QgZm9ybWF0cyA9IG9wdHMuYWxsCiAgICAgICAgPyB7IHN0ZXA6IHRydWUsIGdsYjogdHJ1ZSwgc3RsOiB0cnVlIH0KICAgICAgICA6IHsgc3RlcDogQm9vbGVhbihvcHRzLnN0ZXApLCBnbGI6IEJvb2xlYW4ob3B0cy5nbGIpLCBzdGw6IEJvb2xlYW4ob3B0cy5zdGwpIH07CiAgICAgIGlmICghZm9ybWF0cy5zdGVwICYmICFmb3JtYXRzLmdsYiAmJiAhZm9ybWF0cy5zdGwpIHsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnbm8gZm9ybWF0cyByZXF1ZXN0ZWQg4oCUIHBhc3MgLS1zdGVwLy0tZ2xiLy0tc3RsIG9yIC0tYWxsXG4nKTsKICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhwb3J0UGFydChyZXNvbHZlKGZpbGUpLCBmb3JtYXRzLCByZXNvbHZlKG9wdHMub3V0KSk7CiAgICAgIGZvciAoY29uc3QgcCBvZiByZXN1bHQud3JpdHRlbikgcHJvY2Vzcy5zdGRlcnIud3JpdGUoYHdyb3RlOiAke3B9XG5gKTsKICAgICAgZm9yIChjb25zdCBlIG9mIHJlc3VsdC5lcnJvcnMpIHByb2Nlc3Muc3RkZXJyLndyaXRlKGBlcnJvcjogJHtlfVxuYCk7CiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKAogICAgICAgIEpTT04uc3RyaW5naWZ5KHsgb2s6IHJlc3VsdC5vaywgd3JpdHRlbjogcmVzdWx0LndyaXR0ZW4sIGVycm9yczogcmVzdWx0LmVycm9ycyB9LCBudWxsLCAyKSArCiAgICAgICAgICAnXG4nCiAgICAgICk7CiAgICAgIGlmICghcmVzdWx0Lm9rKSBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICAgIH0KICApOwoKLy8gT25seSBkcml2ZSB0aGUgQ0xJIHdoZW4gcnVuIGFzIHRoZSBlbnRyeSBzY3JpcHQsIHNvIHRlc3RzIGNhbiBpbXBvcnQgdGhlCi8vIGd1YXJkZWQgbG9hZGVycyB3aXRob3V0IGNvbW1hbmRlciBwYXJzaW5nIHRoZSB0ZXN0IHJ1bm5lcidzIGFyZ3YuCi8vIFJlc29sdmUgc3ltbGlua3Mgb24gYm90aCBzaWRlczogdGhlIG5wbS1pbnN0YWxsZWQgYmluIChub2RlX21vZHVsZXMvLmJpbi9icmVwanMpCi8vIGlzIGEgc3ltbGluaywgc28gcHJvY2Vzcy5hcmd2WzFdIHdvdWxkIG90aGVyd2lzZSBuZXZlciBlcXVhbCB0aGUgcmVhbCBtb2R1bGUgcGF0aC4KZXhwb3J0IGZ1bmN0aW9uIGlzRW50cnlwb2ludChhcmd2MTogc3RyaW5nIHwgdW5kZWZpbmVkLCBtb2R1bGVVcmw6IHN0cmluZyk6IGJvb2xlYW4gewogIGlmICghYXJndjEpIHJldHVybiBmYWxzZTsKICB0cnkgewogICAgcmV0dXJuIHJlYWxwYXRoU3luYyhhcmd2MSkgPT09IHJlYWxwYXRoU3luYyhmaWxlVVJMVG9QYXRoKG1vZHVsZVVybCkpOwogIH0gY2F0Y2ggewogICAgcmV0dXJuIGZhbHNlOwogIH0KfQoKaWYgKGlzRW50cnlwb2ludChwcm9jZXNzLmFyZ3ZbMV0sIGltcG9ydC5tZXRhLnVybCkpIHsKICB2b2lkIHByb2dyYW0ucGFyc2VBc3luYygpOwp9Cg==", "" + {}.url));
48
+ return (0, node_url.fileURLToPath)(new URL("data:video/mp2t;base64,IyEvdXNyL2Jpbi9lbnYgbm9kZQppbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJzsKaW1wb3J0IHsgd3JpdGVGaWxlU3luYywgcmVhbHBhdGhTeW5jLCBnbG9iU3luYyB9IGZyb20gJ25vZGU6ZnMnOwppbXBvcnQgeyByZXNvbHZlLCBqb2luLCBiYXNlbmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7CmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnOwppbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnOwppbXBvcnQgeyBydW5QYXJ0IH0gZnJvbSAnLi4vdmVyaWZ5L3J1blBhcnQuanMnOwppbXBvcnQgeyBwdXNoRXJyb3IsIHJlcG9ydE9rLCBzZXJpYWxpemVSZXBvcnQsIHR5cGUgVmVyaWZ5UmVwb3J0IH0gZnJvbSAnLi4vdmVyaWZ5L3JlcG9ydC5qcyc7CmltcG9ydCB7IHJ1bk1lYXN1cmUgfSBmcm9tICcuLi92ZXJpZnkvbWVhc3VyZS5qcyc7CmltcG9ydCB7IHJ1bkRpZmYgfSBmcm9tICcuLi92ZXJpZnkvZGlmZi5qcyc7CmltcG9ydCB7IHNjYWZmb2xkUGFydCB9IGZyb20gJy4vc2NhZmZvbGQuanMnOwppbXBvcnQgewogIGRlYm91bmNlLAogIERFRkFVTFRfREVCT1VOQ0VfTVMsCiAgaXNXYXRjaFJlbGV2YW50LAogIHdhdGNoUm9vdEZvciwKICB3YXRjaFRyZWUsCn0gZnJvbSAnLi93YXRjaC5qcyc7CmltcG9ydCB7IGV4cG9ydFBhcnQgfSBmcm9tICcuL2V4cG9ydFBhcnQuanMnOwppbXBvcnQgeyBvcGVuQnJvd3Nlciwgc2hvdWxkQXV0b09wZW4gfSBmcm9tICcuL29wZW5Ccm93c2VyLmpzJzsKaW1wb3J0IHsgZGlzcG9zZVNoYXBlIH0gZnJvbSAnLi4vZGlzcG9zZVNoYXBlLmpzJzsKaW1wb3J0IHR5cGUgeyBzaG9vdCBhcyBTaG9vdEZuIH0gZnJvbSAnLi4vc25hcHNob3Qvc2hvb3QuanMnOwppbXBvcnQgeyBhaW1lZFNlY3Rpb24sIGZlYXR1cmVNYXJrcyB9IGZyb20gJy4uL3NuYXBzaG90L2FpbWluZy5qcyc7CgovLyBPQ0NUJ3MgV0FTTSBTVEVQIHdyaXRlciBlbWl0cyBhICJTdGF0aXN0aWNzIG9uIFRyYW5zZmVyIiBiYW5uZXIgdmlhIGNvbnNvbGUubG9nCi8vIChFbXNjcmlwdGVuJ3MgZGVmYXVsdCBzdGRvdXQgc2luaykuIFRoZSBDTEkgb3ducyBzdGRvdXQgZm9yIG1hY2hpbmUtcmVhZGFibGUgSlNPTiwKLy8gc28gZGl2ZXJ0IHRoYXQga2VybmVsIGNoYXR0ZXIgdG8gc3RkZXJyIHRvIGtlZXAgc3Rkb3V0IGEgc2luZ2xlIGNsZWFuIEpTT04gZG9jdW1lbnQuCi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlIC0tIHJlcm91dGUga2VybmVsIHN0ZG91dCBjaGF0dGVyIG9mZiB0aGUgSlNPTiBjaGFubmVsCmNvbnNvbGUubG9nID0gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gewogIHByb2Nlc3Muc3RkZXJyLndyaXRlKGFyZ3MubWFwKFN0cmluZykuam9pbignICcpICsgJ1xuJyk7Cn07CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFNuYXBzaG90U2hvb3QoKTogUHJvbWlzZTx0eXBlb2YgU2hvb3RGbiB8IHVuZGVmaW5lZD4gewogIHRyeSB7CiAgICBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoJy4uL3NuYXBzaG90L3Nob290LmpzJyk7CiAgICByZXR1cm4gbW9kLnNob290OwogIH0gY2F0Y2ggewogICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ3NuYXBzaG90cyBuZWVkIHB1cHBldGVlci9DaHJvbWUg4oCUIHJ1bjogbnBtIGkgcHVwcGV0ZWVyXG4nKTsKICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxOwogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9Cn0KCmNvbnN0IHByb2dyYW0gPSBuZXcgQ29tbWFuZCgpOwpwcm9ncmFtLm5hbWUoJ2JyZXAnKTsKCnByb2dyYW0KICAuY29tbWFuZCgndmVyaWZ5JywgeyBpc0RlZmF1bHQ6IHRydWUgfSkKICAuYXJndW1lbnQoCiAgICAnPGZpbGVzLi4uPicsCiAgICAncGF0aChzKSBvciBnbG9iKHMpIHRvIC5icmVwLnRzIG1vZHVsZXM7IG11bHRpcGxlIGZpbGVzIOKGkiBhIGJhdGNoIHZhbGlkaXR5IEpTT04gYXJyYXknCiAgKQogIC5vcHRpb24oJy0tc3RlcCA8b3V0PicsICd3cml0ZSB0aGUgcHJpbWFyeSBTVEVQIGFydGlmYWN0IHRvIHRoaXMgcGF0aCcpCiAgLm9wdGlvbignLS1nbGIgPG91dD4nLCAnd3JpdGUgYSBkZXJpdmVkIEdMQiBwcmV2aWV3IHRvIHRoaXMgcGF0aCcpCiAgLm9wdGlvbignLS1qc29uIDxvdXQ+JywgJ3dyaXRlIHRoZSBKU09OIHJlcG9ydCB0byB0aGlzIHBhdGgnKQogIC5vcHRpb24oCiAgICAnLS1jaGVjaycsCiAgICAndHlwZS1jaGVjayB0aGUgcGFydCAoYWdhaW5zdCBicmVwanMgdHlwZXMpIGJlZm9yZSBydW5uaW5nOyBza2lwIGV4ZWN1dGlvbiBvbiB0eXBlIGVycm9ycycKICApCiAgLm9wdGlvbignLS1zbmFwc2hvdCA8ZGlyPicsICdyZW5kZXIgaXNvL2Zyb250L3RvcC9yaWdodCBQTkdzIHRvIHRoaXMgZGlyIChyZXF1aXJlcyBidWlsdCB2aWV3ZXIpJykKICAub3B0aW9uKAogICAgJy0tc2VydmUnLAogICAgJ2FmdGVyIHZlcmlmeWluZywgc3RhcnQgYSBwcmV2aWV3IHNlcnZlciBhbmQgcHJpbnQgYSA/ZGlyPSZmaWxlPSBkZWVwIGxpbmsgKHN0YXlzIHJ1bm5pbmcpJwogICkKICAub3B0aW9uKCctLW5vLW9wZW4nLCAnd2l0aCAtLXNlcnZlLCBkbyBub3QgYXV0by1vcGVuIHRoZSBicm93c2VyIChqdXN0IHByaW50IHRoZSB2aWV3ZXIgVVJMKScpCiAgLm9wdGlvbigKICAgICctLWV4cGVjdC1jb2RlIDxjb2RlPicsCiAgICAnZXhpdCAwIG9ubHkgaWYgdGhlIHJlcG9ydCBlbWl0cyB0aGlzIGVycm9yIGNvZGUgKGZvciBmaXh0dXJlcy9ldmFsIHJlY2FsbCknCiAgKQogIC5vcHRpb24oCiAgICAnLS1leHBlY3QtaW52YWxpZCcsCiAgICAnZXhpdCAwIG9ubHkgaWYgdGhlIHBhcnQgaXMgaW52YWxpZCAob2s6ZmFsc2UpIOKAlCBmb3Iga25vd24tYmFkIGZpeHR1cmVzJwogICkKICAub3B0aW9uKAogICAgJy0tbWV0cmljcycsCiAgICAnY29tcHV0ZSBkZXRlcm1pbmlzdGljIG1hbnVmYWN0dXJhYmlsaXR5IG1ldHJpY3MgKHBlci1ib2R5IGJyZWFrZG93biArIGludGVyZmVyZW5jZSBtYXRyaXgpIGZvciB0aGUgZGVzaWduIGp1ZGdlIOKAlCBzbG93ZXI7IG9mZiBieSBkZWZhdWx0JwogICkKICAuYWN0aW9uKAogICAgYXN5bmMgKAogICAgICBmaWxlczogc3RyaW5nW10sCiAgICAgIG9wdHM6IHsKICAgICAgICBzdGVwPzogc3RyaW5nOwogICAgICAgIGdsYj86IHN0cmluZzsKICAgICAgICBqc29uPzogc3RyaW5nOwogICAgICAgIGNoZWNrPzogYm9vbGVhbjsKICAgICAgICBzbmFwc2hvdD86IHN0cmluZzsKICAgICAgICBzZXJ2ZT86IGJvb2xlYW47CiAgICAgICAgZXhwZWN0Q29kZT86IHN0cmluZzsKICAgICAgICBleHBlY3RJbnZhbGlkPzogYm9vbGVhbjsKICAgICAgICBtZXRyaWNzPzogYm9vbGVhbjsKICAgICAgICAvLyBDb21tYW5kZXIgbWF0ZXJpYWxpemVzIGEgbmVnYXRlZCBmbGFnIGFzIGEgY29uY3JldGUgYm9vbGVhbjogdHJ1ZSBieQogICAgICAgIC8vIGRlZmF1bHQsIGZhbHNlIHdoZW4gLS1uby1vcGVuIGlzIHBhc3NlZC4KICAgICAgICBvcGVuOiBib29sZWFuOwogICAgICB9CiAgICApID0+IHsKICAgICAgLy8gQSBxdW90ZWQgZ2xvYiAoInBhcnRzLyouYnJlcC50cyIpIGFycml2ZXMgYXMgb25lIGxpdGVyYWwgYXJnLCBhIHNoZWxsLWV4cGFuZGVkIG9uZSBhcyBtYW55OwogICAgICAvLyBnbG9iU3luYyBoYW5kbGVzIGJvdGggKGEgbGl0ZXJhbCBmaWxlbmFtZSBtYXRjaGVzIGl0c2VsZiksIGZhbGxpbmcgYmFjayB0byB0aGUgcmF3IGFyZyBzbyBhCiAgICAgIC8vIG1pc3NpbmcgcGF0aCBzdGlsbCBydW5zIGFuZCByZXBvcnRzIGl0cyBvd24gZXJyb3IuCiAgICAgIGNvbnN0IHRhcmdldHMgPSBbCiAgICAgICAgLi4ubmV3IFNldCgKICAgICAgICAgIGZpbGVzLmZsYXRNYXAoKGYpID0+IHsKICAgICAgICAgICAgY29uc3QgbSA9IGdsb2JTeW5jKGYpOwogICAgICAgICAgICByZXR1cm4gbS5sZW5ndGggPyBtIDogW2ZdOwogICAgICAgICAgfSkKICAgICAgICApLAogICAgICBdLm1hcCgocCkgPT4gcmVzb2x2ZShwKSk7CgogICAgICBpZiAodGFyZ2V0cy5sZW5ndGggPiAxKSB7CiAgICAgICAgLy8gQmF0Y2g6IHZhbGlkaXR5LW9ubHkgSlNPTiBhcnJheS4gVGhlIHNpbmdsZS1maWxlIGFydGlmYWN0IGZsYWdzIGRvbid0IGFwcGx5LgogICAgICAgIGlmICgKICAgICAgICAgIG9wdHMuc3RlcCB8fAogICAgICAgICAgb3B0cy5zZXJ2ZSB8fAogICAgICAgICAgb3B0cy5zbmFwc2hvdCB8fAogICAgICAgICAgb3B0cy5nbGIgfHwKICAgICAgICAgIG9wdHMuZXhwZWN0Q29kZSB8fAogICAgICAgICAgb3B0cy5leHBlY3RJbnZhbGlkCiAgICAgICAgKSB7CiAgICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgKICAgICAgICAgICAgJ2JhdGNoIG1vZGU6IC0tc3RlcC8tLWdsYi8tLXNlcnZlLy0tc25hcHNob3QvLS1leHBlY3QtY29kZS8tLWV4cGVjdC1pbnZhbGlkIGlnbm9yZWQgKHNpbmdsZS1maWxlIG9ubHkpXG4nCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBjb25zdCByZXN1bHRzOiB7IGZpbGU6IHN0cmluZzsgb2s6IGJvb2xlYW47IHJlcG9ydDogVmVyaWZ5UmVwb3J0IH1bXSA9IFtdOwogICAgICAgIGZvciAoY29uc3QgZiBvZiB0YXJnZXRzKSB7CiAgICAgICAgICBjb25zdCB7IHJlcG9ydCwgc2hhcGUgfSA9IGF3YWl0IHJ1blBhcnQoZiwgewogICAgICAgICAgICBjaGVjazogQm9vbGVhbihvcHRzLmNoZWNrKSwKICAgICAgICAgICAgbWV0cmljczogQm9vbGVhbihvcHRzLm1ldHJpY3MpLAogICAgICAgICAgfSk7CiAgICAgICAgICBkaXNwb3NlU2hhcGUoc2hhcGUpOwogICAgICAgICAgcmVzdWx0cy5wdXNoKHsgZmlsZTogZiwgb2s6IHJlcG9ydE9rKHJlcG9ydCksIHJlcG9ydCB9KTsKICAgICAgICB9CiAgICAgICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KHJlc3VsdHMsIG51bGwsIDIpOwogICAgICAgIGlmIChvcHRzLmpzb24gJiYgb3B0cy5qc29uICE9PSAnLScpIHdyaXRlRmlsZVN5bmMob3B0cy5qc29uLCBqc29uKTsKICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShqc29uICsgJ1xuJyk7CiAgICAgICAgaWYgKHJlc3VsdHMuc29tZSgocikgPT4gIXIub2spKSBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGNvbnN0IGZpbGUgPSB0YXJnZXRzWzBdID8/IGZpbGVzWzBdID8/ICcnOwogICAgICAvLyBUaGUgV0FTTSB2aWV3ZXIgbG9hZHMgYSBDQUQgZmlsZSAoaXQgY2FuJ3QgcnVuIGEgLmJyZXAudHMpLCBzbyAtLXNuYXBzaG90Ly0tc2VydmUKICAgICAgLy8gc3RhZ2UgdGhlIHByaW1hcnkgU1RFUCBhbmQgcG9pbnQgdGhlIHZpZXdlciBhdCBpdCB2aWEgP2Rpcj0mZmlsZT0uIC0tZ2xiIGlzIGl0cyBvd24gYXJ0aWZhY3QuCiAgICAgIGNvbnN0IHdhbnRTdGVwID0gQm9vbGVhbihvcHRzLnN0ZXApIHx8IEJvb2xlYW4ob3B0cy5zbmFwc2hvdCkgfHwgQm9vbGVhbihvcHRzLnNlcnZlKTsKICAgICAgY29uc3QgeyByZXBvcnQsIHN0ZXAsIGdsYiwgc2hhcGUgfSA9IGF3YWl0IHJ1blBhcnQocmVzb2x2ZShmaWxlKSwgewogICAgICAgIHN0ZXA6IHdhbnRTdGVwLAogICAgICAgIGdsYjogQm9vbGVhbihvcHRzLmdsYiksCiAgICAgICAgY2hlY2s6IEJvb2xlYW4ob3B0cy5jaGVjayksCiAgICAgICAgLy8gQSBzbmFwc2hvdCBmZWVkcyB0aGUgZGVzaWduIGp1ZGdlLCBzbyBjb21wdXRlIG1ldHJpY3MgdG9vIChib3JlcyDihpIgYW4gYWltZWQgc2VjdGlvbiBzaG90KS4KICAgICAgICBtZXRyaWNzOiBCb29sZWFuKG9wdHMubWV0cmljcykgfHwgQm9vbGVhbihvcHRzLnNuYXBzaG90KSwKICAgICAgfSk7CiAgICAgIGxldCBzdGVwUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0cy5zdGVwOwogICAgICB0cnkgewogICAgICAgIGlmIChvcHRzLmdsYiAmJiBnbGIpIHdyaXRlRmlsZVN5bmMob3B0cy5nbGIsIEJ1ZmZlci5mcm9tKGdsYikpOwoKICAgICAgICBpZiAod2FudFN0ZXAgJiYgc3RlcCkgewogICAgICAgICAgc3RlcFBhdGggPSBvcHRzLnN0ZXAgPz8gam9pbih0bXBkaXIoKSwgYGJyZXAtJHtiYXNlbmFtZShmaWxlKX0uc3RlcGApOwogICAgICAgICAgd3JpdGVGaWxlU3luYyhzdGVwUGF0aCwgQnVmZmVyLmZyb20oc3RlcCkpOwogICAgICAgIH0KICAgICAgICBpZiAob3B0cy5zbmFwc2hvdCAmJiBzdGVwUGF0aCkgewogICAgICAgICAgY29uc3Qgc2hvb3QgPSBhd2FpdCBsb2FkU25hcHNob3RTaG9vdCgpOyAvLyBsYXp5OiBrZWVwcyBwdXBwZXRlZXIgb2ZmIHRoZSBkZWZhdWx0IHBhdGgKICAgICAgICAgIGlmIChzaG9vdCkgewogICAgICAgICAgICBjb25zdCBzZWN0aW9uID0gYWltZWRTZWN0aW9uKAogICAgICAgICAgICAgIHJlcG9ydC5tYW51ZmFjdHVyYWJpbGl0eT8uYm9yZXMgPz8gW10sCiAgICAgICAgICAgICAgcmVwb3J0Lm1lYXN1cmVtZW50cy5ib3VuZHMKICAgICAgICAgICAgKTsKICAgICAgICAgICAgY29uc3QgbWFya3MgPSBmZWF0dXJlTWFya3MocmVwb3J0LmJvZGllcyA/PyBbXSwgcmVwb3J0Lm1hbnVmYWN0dXJhYmlsaXR5Py5ib3JlcyA/PyBbXSk7CiAgICAgICAgICAgIGNvbnN0IHsgcG5ncyB9ID0gYXdhaXQgc2hvb3QoewogICAgICAgICAgICAgIGZpbGU6IHN0ZXBQYXRoLAogICAgICAgICAgICAgIG91dERpcjogb3B0cy5zbmFwc2hvdCwKICAgICAgICAgICAgICAuLi4oc2VjdGlvbiA/IHsgc2VjdGlvbiB9IDoge30pLAogICAgICAgICAgICAgIC4uLihtYXJrcy5sZW5ndGggPiAwID8geyBtYXJrcyB9IDoge30pLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gRGlhZ25vc3RpYyBwYXRocyBnbyB0byBzdGRlcnIg4oCUIHN0ZG91dCBzdGF5cyBhIHNpbmdsZSBjbGVhbiBKU09OIGRvY3VtZW50LgogICAgICAgICAgICBmb3IgKGNvbnN0IHAgb2YgcG5ncykgcHJvY2Vzcy5zdGRlcnIud3JpdGUoYHNuYXBzaG90OiAke3B9XG5gKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKG9wdHMuc25hcHNob3QpIHsKICAgICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdzbmFwc2hvdCBza2lwcGVkOiBTVEVQIGV4cG9ydCBwcm9kdWNlZCBubyBhcnRpZmFjdFxuJyk7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgcHVzaEVycm9yKHJlcG9ydCwgeyBtZXNzYWdlOiBgYXJ0aWZhY3Qgd3JpdGUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWAgfSk7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgLy8gVGhlIHNoYXBlIGlzIGEgbGl2ZSBXQVNNIGhhbmRsZTsgcmVsZWFzZSBpdCBiZWZvcmUgdGhlIHNlcnZlciB0YWtlcyBvdmVyICh0aGUKICAgICAgICAvLyAtLXNlcnZlIHBhdGggc3RheXMgcnVubmluZywgc28gbGVha2luZyBoZXJlIHdvdWxkIHBlcnNpc3QgZm9yIHRoZSBzZXJ2ZXIncyBsaWZldGltZSkuCiAgICAgICAgZGlzcG9zZVNoYXBlKHNoYXBlKTsKICAgICAgfQogICAgICAvLyBTZXJpYWxpemUgb25jZSBhZnRlciBhbGwgYXJ0aWZhY3Qgd3JpdGVzIHNvIHRoZSAtLWpzb24gZmlsZSBhbmQgc3Rkb3V0CiAgICAgIC8vIHJlZmxlY3QgdGhlIHNhbWUgcmVwb3J0IChpbmNsLiBhbnkgImFydGlmYWN0IHdyaXRlIGZhaWxlZCIgZXJyb3IpLgogICAgICBjb25zdCBqc29uID0gc2VyaWFsaXplUmVwb3J0KHJlcG9ydCk7CiAgICAgIC8vIGAtLWpzb24gLWAgaXMgc2F0aXNmaWVkIGJ5IHRoZSBzdGRvdXQgd3JpdGUgYmVsb3c7IG9ubHkgYSByZWFsIHBhdGggd3JpdGVzIGEgZmlsZS4KICAgICAgaWYgKG9wdHMuanNvbiAmJiBvcHRzLmpzb24gIT09ICctJykgd3JpdGVGaWxlU3luYyhvcHRzLmpzb24sIGpzb24pOwogICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShqc29uICsgJ1xuJyk7CiAgICAgIGlmICghcmVwb3J0T2socmVwb3J0KSkgcHJvY2Vzcy5leGl0Q29kZSA9IDE7CiAgICAgIC8vIEZpeHR1cmUgYXNzZXJ0aW9ucyAoUGhhc2U6IHZlcmlmeS1oZWFsIHByZWNpc2lvbi9yZWNhbGwpIG92ZXJyaWRlIHRoZSBub3JtYWwgZXhpdCBjb2RlOgogICAgICAvLyBhIGtub3duLWJhZCBwYXJ0IG11c3QgZmFpbCB0aGUgKnJpZ2h0KiB3YXkuIENvZGVzIGNvbWUgZnJvbSB0aGUga2VybmVsL2F1dGhvcmluZyBlcnJvcnMsCiAgICAgIC8vIG5vdCB0aGUgaGludCB0YWJsZSwgc28gdGhpcyBtZWFzdXJlcyB0aGUgdmVyaWZpZXIsIG5vdCBpdHMgcHJvc2UuCiAgICAgIGlmIChvcHRzLmV4cGVjdEludmFsaWQgfHwgb3B0cy5leHBlY3RDb2RlKSB7CiAgICAgICAgLy8gaGludHMgYXJlIGRlcml2ZWQgZnJvbSBlcnJvckluZm9zLCBzbyB0aGUgY29kZXMgbGl2ZSB0aGVyZTsgZGVkdXBlIHRvIGtlZXAgdGhlIGxpbmUgY2xlYW4uCiAgICAgICAgY29uc3QgY29kZXMgPSBbCiAgICAgICAgICAuLi5uZXcgU2V0KHJlcG9ydC5lcnJvckluZm9zLm1hcCgoZSkgPT4gZS5jb2RlKS5maWx0ZXIoKGMpOiBjIGlzIHN0cmluZyA9PiBCb29sZWFuKGMpKSksCiAgICAgICAgXTsKICAgICAgICBjb25zdCB2YWxpZCA9IHJlcG9ydE9rKHJlcG9ydCk7CiAgICAgICAgY29uc3QgcGFzcyA9CiAgICAgICAgICAoIW9wdHMuZXhwZWN0SW52YWxpZCB8fCAhdmFsaWQpICYmICghb3B0cy5leHBlY3RDb2RlIHx8IGNvZGVzLmluY2x1ZGVzKG9wdHMuZXhwZWN0Q29kZSkpOwogICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBwYXNzID8gMCA6IDE7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoCiAgICAgICAgICBgZXhwZWN0OiAke3Bhc3MgPyAnUEFTUycgOiAnRkFJTCd9YCArCiAgICAgICAgICAgIChvcHRzLmV4cGVjdENvZGUgPyBgIGNvZGU9JHtvcHRzLmV4cGVjdENvZGV9YCA6ICcnKSArCiAgICAgICAgICAgIChvcHRzLmV4cGVjdEludmFsaWQgPyAnIGludmFsaWQnIDogJycpICsKICAgICAgICAgICAgYCAob2s9JHt2YWxpZH0sIGNvZGVzPSR7Y29kZXMuam9pbignLCcpIHx8ICdub25lJ30pXG5gCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgd2lsbFNlcnZlID0gQm9vbGVhbihvcHRzLnNlcnZlKSAmJiBzdGVwUGF0aCAhPT0gdW5kZWZpbmVkICYmIHJlcG9ydE9rKHJlcG9ydCk7CiAgICAgIGlmICh3aWxsU2VydmUgJiYgc3RlcFBhdGgpIHsKICAgICAgICBjb25zdCB7IHNlcnZlIH0gPSBhd2FpdCBpbXBvcnQoJy4uL3NuYXBzaG90L3NlcnZlLmpzJyk7IC8vIGxhenk6IG5vIHNlcnZlciBkZXBzIG9uIHRoZSBkZWZhdWx0IHBhdGgKICAgICAgICBjb25zdCB7IHVybCwgcmV1c2VkIH0gPSBhd2FpdCBzZXJ2ZSh7IGZpbGU6IHN0ZXBQYXRoIH0pOyAvLyBidWlsZHMgYSA/ZGlyPSZmaWxlPSBVUkw7IHNlcnZlciBydW5zIHVudGlsIEN0cmwtQwogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGB2aWV3ZXI6ICR7dXJsfVxuYCk7CiAgICAgICAgLy8gQXV0by1vcGVuIG9ubHkgZm9yIGEgZnJlc2hseSBzdGFydGVkIHNlcnZlciAoYSByZXVzZWQgb25lIGFscmVhZHkgaGFzCiAgICAgICAgLy8gYSB0YWIpIGluIGFuIGludGVyYWN0aXZlIHNlc3Npb247IGAtLW5vLW9wZW5gIChvcHRzLm9wZW4gPT09IGZhbHNlKQogICAgICAgIC8vIGFsd2F5cyBzdXBwcmVzc2VzIGl0LgogICAgICAgIGlmICghcmV1c2VkICYmIG9wdHMub3BlbiAmJiBzaG91bGRBdXRvT3BlbigpKSB7CiAgICAgICAgICBvcGVuQnJvd3Nlcih1cmwpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICk7Cgpwcm9ncmFtCiAgLmNvbW1hbmQoJ21lYXN1cmUnKQogIC5hcmd1bWVudCgnPGE+JywgJ3BhdGggdG8gYSAuYnJlcC50cyBtb2R1bGUnKQogIC5hcmd1bWVudCgnW2JdJywgJ29wdGlvbmFsIHNlY29uZCBtb2R1bGU7IGlmIGdpdmVuLCBtZWFzdXJlcyBkaXN0YW5jZSBiZXR3ZWVuIHRoZSB0d28gcGFydHMnKQogIC5hY3Rpb24oYXN5bmMgKGE6IHN0cmluZywgYj86IHN0cmluZykgPT4gewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuTWVhc3VyZShyZXNvbHZlKGEpLCBiID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByZXNvbHZlKGIpKTsKICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKAogICAgICBKU09OLnN0cmluZ2lmeSh7IG9rOiByZXN1bHQuZXJyb3JzLmxlbmd0aCA9PT0gMCwgLi4ucmVzdWx0IH0sIG51bGwsIDIpICsgJ1xuJwogICAgKTsKICAgIGlmIChyZXN1bHQuZXJyb3JzLmxlbmd0aCA+IDApIHByb2Nlc3MuZXhpdENvZGUgPSAxOwogIH0pOwoKcHJvZ3JhbQogIC5jb21tYW5kKCdkaWZmJykKICAuYXJndW1lbnQoJzxhPicsICdwYXRoIHRvIHRoZSBiYXNlbGluZSAuYnJlcC50cyBtb2R1bGUnKQogIC5hcmd1bWVudCgnPGI+JywgJ3BhdGggdG8gdGhlIGNvbXBhcmlzb24gLmJyZXAudHMgbW9kdWxlJykKICAuYWN0aW9uKGFzeW5jIChhOiBzdHJpbmcsIGI6IHN0cmluZykgPT4gewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuRGlmZihyZXNvbHZlKGEpLCByZXNvbHZlKGIpKTsKICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKAogICAgICBKU09OLnN0cmluZ2lmeSh7IG9rOiByZXN1bHQuZXJyb3JzLmxlbmd0aCA9PT0gMCwgLi4ucmVzdWx0IH0sIG51bGwsIDIpICsgJ1xuJwogICAgKTsKICAgIGlmIChyZXN1bHQuZXJyb3JzLmxlbmd0aCA+IDApIHByb2Nlc3MuZXhpdENvZGUgPSAxOwogIH0pOwoKcHJvZ3JhbQogIC5jb21tYW5kKCdzbmFwc2hvdCcpCiAgLmFyZ3VtZW50KAogICAgJzxmaWxlPicsCiAgICAncGF0aCB0byBhIC5icmVwLnRzIG1vZHVsZTsgcmVuZGVycyBpc28vZnJvbnQvdG9wL3JpZ2h0IFBOR3MgKG5vIHJlcG9ydCBhc3NlcnRpb25zKScKICApCiAgLm9wdGlvbignLS1vdXQgPGRpcj4nLCAnb3V0cHV0IGRpcmVjdG9yeSBmb3IgdGhlIFBOR3MgKGRlZmF1bHQgPGZpbGU+LXNob3RzKScpCiAgLm9wdGlvbignLS1sYWJlbCA8dGFnPicsICdzdWJmb2xkZXIgZm9yIHRoaXMgcmVuZGVyIHNldCAoZS5nLiBwcmUsIHBvc3QpIGZvciBBL0IgcGFpcmluZycpCiAgLmFjdGlvbihhc3luYyAoZmlsZTogc3RyaW5nLCBvcHRzOiB7IG91dD86IHN0cmluZzsgbGFiZWw/OiBzdHJpbmcgfSkgPT4gewogICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlKGZpbGUpOwogICAgY29uc3QgYmFzZSA9IG9wdHMub3V0ID8gcmVzb2x2ZShvcHRzLm91dCkgOiBgJHtyZXNvbHZlZH0tc2hvdHNgOwogICAgY29uc3Qgb3V0RGlyID0gb3B0cy5sYWJlbCA/IGpvaW4oYmFzZSwgb3B0cy5sYWJlbCkgOiBiYXNlOwogICAgY29uc3QgeyByZXBvcnQsIHN0ZXAsIHNoYXBlIH0gPSBhd2FpdCBydW5QYXJ0KHJlc29sdmVkLCB7IHN0ZXA6IHRydWUsIG1ldHJpY3M6IHRydWUgfSk7CiAgICB0cnkgewogICAgICBpZiAoIXN0ZXApIHsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnc25hcHNob3Q6IHBhcnQgcHJvZHVjZWQgbm8gU1RFUCDigJQgbm90aGluZyB0byByZW5kZXJcbicpOwogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHNlcmlhbGl6ZVJlcG9ydChyZXBvcnQpICsgJ1xuJyk7CiAgICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHN0ZXBQYXRoID0gam9pbih0bXBkaXIoKSwgYGJyZXAtc25hcC0ke2Jhc2VuYW1lKGZpbGUpfS5zdGVwYCk7CiAgICAgIHdyaXRlRmlsZVN5bmMoc3RlcFBhdGgsIEJ1ZmZlci5mcm9tKHN0ZXApKTsKICAgICAgY29uc3Qgc2hvb3QgPSBhd2FpdCBsb2FkU25hcHNob3RTaG9vdCgpOwogICAgICBpZiAoIXNob290KSB7CiAgICAgICAgLy8gcHVwcGV0ZWVyIGFic2VudDogbG9hZFNuYXBzaG90U2hvb3Qgc2V0IGV4aXRDb2RlICsgc3RkZXJyOyBzdGlsbCBlbWl0IHRoZSByZXBvcnQgc28gYQogICAgICAgIC8vIGNhbGxlciBwYXJzaW5nIHN0ZG91dCBnZXRzIHRoZSB2YWxpZGl0eSBpbmZvIHJhdGhlciB0aGFuIGFuIGVtcHR5IGJ1ZmZlci4KICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShzZXJpYWxpemVSZXBvcnQocmVwb3J0KSArICdcbicpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBmcmVzaDogYSBwcml2YXRlIGVwaGVtZXJhbCByZW5kZXIgc2VydmVyIHNvIHBhcmFsbGVsIHNuYXBzaG90cyBkb24ndCBjb250ZW5kIG9uIDo3MzczLgogICAgICBjb25zdCBzZWN0aW9uID0gYWltZWRTZWN0aW9uKAogICAgICAgIHJlcG9ydC5tYW51ZmFjdHVyYWJpbGl0eT8uYm9yZXMgPz8gW10sCiAgICAgICAgcmVwb3J0Lm1lYXN1cmVtZW50cy5ib3VuZHMKICAgICAgKTsKICAgICAgY29uc3QgbWFya3MgPSBmZWF0dXJlTWFya3MocmVwb3J0LmJvZGllcyA/PyBbXSwgcmVwb3J0Lm1hbnVmYWN0dXJhYmlsaXR5Py5ib3JlcyA/PyBbXSk7CiAgICAgIGNvbnN0IHsgcG5ncyB9ID0gYXdhaXQgc2hvb3QoewogICAgICAgIGZpbGU6IHN0ZXBQYXRoLAogICAgICAgIG91dERpciwKICAgICAgICBmcmVzaDogdHJ1ZSwKICAgICAgICAuLi4oc2VjdGlvbiA/IHsgc2VjdGlvbiB9IDoge30pLAogICAgICAgIC4uLihtYXJrcy5sZW5ndGggPiAwID8geyBtYXJrcyB9IDoge30pLAogICAgICB9KTsKICAgICAgZm9yIChjb25zdCBwIG9mIHBuZ3MpIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAke3B9XG5gKTsKICAgIH0gZmluYWxseSB7CiAgICAgIGRpc3Bvc2VTaGFwZShzaGFwZSk7CiAgICB9CiAgfSk7Cgpwcm9ncmFtCiAgLmNvbW1hbmQoJ2luaXQnKQogIC5hcmd1bWVudCgnPG5hbWU+JywgJ3BhcnQgbmFtZTsgc2NhZmZvbGRzIDxuYW1lPi5icmVwLnRzICsgdHNjb25maWcuanNvbiArIFJFQURNRS5tZCcpCiAgLm9wdGlvbignLS1vdXQgPGRpcj4nLCAndGFyZ2V0IGRpcmVjdG9yeSAoZGVmYXVsdHMgdG8gLi88bmFtZT4pJykKICAuYWN0aW9uKChuYW1lOiBzdHJpbmcsIG9wdHM6IHsgb3V0Pzogc3RyaW5nIH0pID0+IHsKICAgIGNvbnN0IGRpciA9IHJlc29sdmUob3B0cy5vdXQgPz8gbmFtZSk7CiAgICBjb25zdCByZXN1bHQgPSBzY2FmZm9sZFBhcnQobmFtZSwgZGlyKTsKICAgIGZvciAoY29uc3QgZiBvZiByZXN1bHQuZmlsZXMpIHsKICAgICAgY29uc3QgdGFnID0gZi5jcmVhdGVkID8gJ2NyZWF0ZWQnIDogJ2V4aXN0cyAoa2VwdCknOwogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShgJHt0YWd9OiAke2YucGF0aH1cbmApOwogICAgfQogICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSArICdcbicpOwogIH0pOwoKcHJvZ3JhbQogIC5jb21tYW5kKCd3YXRjaCcpCiAgLmFyZ3VtZW50KCc8ZmlsZT4nLCAncGF0aCB0byBhIC5icmVwLnRzIG1vZHVsZTsgcmUtdmVyaWZpZXMgb24gZWFjaCBzYXZlIHVudGlsIEN0cmwtQycpCiAgLmFjdGlvbigoZmlsZTogc3RyaW5nKSA9PiB7CiAgICBjb25zdCBwYXRoID0gcmVzb2x2ZShmaWxlKTsKICAgIC8vIFJlcnVucyBpbXBvcnQgd2l0aCBhIGZyZXNoIGNhY2hlLWJ1c3RpbmcgcXVlcnkg4oCUIHRoZSBFU00gY2FjaGUgaXMga2V5ZWQgYnkgVVJMLCBzbwogICAgLy8gd2l0aG91dCBpdCBldmVyeSByZXJ1biB3b3VsZCByZS1leGVjdXRlIHRoZSBmaXJzdCB2ZXJzaW9uIG9mIHRoZSBwYXJ0IGZvcmV2ZXIuCiAgICBjb25zdCBydW4gPSBhc3luYyAoZnJlc2g6IGJvb2xlYW4pID0+IHsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCB7IHJlcG9ydCwgc2hhcGUgfSA9IGF3YWl0IHJ1blBhcnQocGF0aCwgeyBmcmVzaEltcG9ydDogZnJlc2ggfSk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHNlcmlhbGl6ZVJlcG9ydChyZXBvcnQpICsgJ1xuJyk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIGRpc3Bvc2VTaGFwZShzaGFwZSk7IC8vIGxpdmUgV0FTTSBoYW5kbGU7IHRoZSBsb29wIHJ1bnMgaW5kZWZpbml0ZWx5CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoYHdhdGNoIHJ1biBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9XG5gKTsKICAgICAgfQogICAgfTsKICAgIC8vIFNlcmlhbGl6ZSBydW5zOiBhIHNhdmUgbGFuZGluZyBtaWQtdmVyaWZ5IG11c3Qgbm90IHN0YXJ0IGEgc2Vjb25kIHJ1blBhcnQgb24gdGhlCiAgICAvLyBzaGFyZWQga2VybmVsIChyZXBvcnRzIHdvdWxkIGludGVybGVhdmUgb3V0IG9mIG9yZGVyKS4gRWRpdHMgZHVyaW5nIGEgcnVuIGNvYWxlc2NlCiAgICAvLyBpbnRvIGV4YWN0bHkgb25lIHRyYWlsaW5nIHJlcnVuLgogICAgbGV0IGluRmxpZ2h0ID0gZmFsc2U7CiAgICBsZXQgcmVydW5RdWV1ZWQgPSBmYWxzZTsKICAgIGNvbnN0IHN0YXJ0ID0gKGZyZXNoOiBib29sZWFuKTogdm9pZCA9PiB7CiAgICAgIGluRmxpZ2h0ID0gdHJ1ZTsKICAgICAgdm9pZCBydW4oZnJlc2gpLmZpbmFsbHkoKCkgPT4gewogICAgICAgIGluRmxpZ2h0ID0gZmFsc2U7CiAgICAgICAgaWYgKHJlcnVuUXVldWVkKSB7CiAgICAgICAgICByZXJ1blF1ZXVlZCA9IGZhbHNlOwogICAgICAgICAgc3RhcnQodHJ1ZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH07CiAgICBjb25zdCBzY2hlZHVsZSA9ICgpOiB2b2lkID0+IHsKICAgICAgaWYgKGluRmxpZ2h0KSB7CiAgICAgICAgcmVydW5RdWV1ZWQgPSB0cnVlOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBzdGFydCh0cnVlKTsKICAgIH07CiAgICBjb25zdCB7IHRyaWdnZXIgfSA9IGRlYm91bmNlKHNjaGVkdWxlLCBERUZBVUxUX0RFQk9VTkNFX01TKTsKICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGB3YXRjaGluZyAke3BhdGh9IChDdHJsLUMgdG8gc3RvcClcbmApOwogICAgc3RhcnQoZmFsc2UpOyAvLyBpbml0aWFsIHZlcmlmeQogICAgLy8gV2F0Y2ggdGhlIHdob2xlIHByb2plY3QgdHJlZSAobmVhcmVzdCBwYWNrYWdlLmpzb24vdHNjb25maWcuanNvbiBhYm92ZSB0aGUgZW50cnkpOgogICAgLy8gZWRpdG9ycyBvZnRlbiByZXBsYWNlIGEgZmlsZSAocmVuYW1lKSBvbiBzYXZlLCB3aGljaCBkcm9wcyBhIHdhdGNoZXIgYm91bmQgdG8gdGhlCiAgICAvLyBpbm9kZSBpdHNlbGYg4oCUIGFuZCBhIG11bHRpLWZpbGUgcHJvamVjdCBtdXN0IHJlLXZlcmlmeSB3aGVuIGFueSBzb3VyY2UgT1IgdGhlIHJvb3QKICAgIC8vIHRzY29uZmlnIGNoYW5nZXMsIG5vdCBqdXN0IGZpbGVzIGJlc2lkZSB0aGUgZW50cnkuCiAgICBjb25zdCBzdG9wV2F0Y2hpbmcgPSB3YXRjaFRyZWUod2F0Y2hSb290Rm9yKHBhdGgpLCAoZmlsZW5hbWUpID0+IHsKICAgICAgaWYgKGlzV2F0Y2hSZWxldmFudChmaWxlbmFtZSkpIHRyaWdnZXIoKTsKICAgIH0pOwogICAgY29uc3Qgc3RvcCA9ICgpID0+IHsKICAgICAgc3RvcFdhdGNoaW5nKCk7CiAgICAgIHByb2Nlc3MuZXhpdCgwKTsKICAgIH07CiAgICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBzdG9wKTsKICAgIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCBzdG9wKTsgLy8gc3VwZXJ2aXNvcnMgKGRvY2tlciBzdG9wLCBzeXN0ZW1jdGwpIHNlbmQgU0lHVEVSTQogIH0pOwoKcHJvZ3JhbQogIC5jb21tYW5kKCdleHBvcnQnKQogIC5hcmd1bWVudCgnPGZpbGU+JywgJ3BhdGggdG8gYSAuYnJlcC50cyBtb2R1bGUnKQogIC5vcHRpb24oJy0tc3RlcCcsICd3cml0ZSBhIFNURVAgYXJ0aWZhY3QnKQogIC5vcHRpb24oJy0tZ2xiJywgJ3dyaXRlIGEgR0xCIGFydGlmYWN0JykKICAub3B0aW9uKCctLXN0bCcsICd3cml0ZSBhbiBTVEwgYXJ0aWZhY3QnKQogIC5vcHRpb24oJy0tYWxsJywgJ3dyaXRlIFNURVAgKyBHTEIgKyBTVEwnKQogIC5vcHRpb24oJy0tb3V0IDxkaXI+JywgJ291dHB1dCBkaXJlY3RvcnknLCAnLicpCiAgLmFjdGlvbigKICAgIGFzeW5jICgKICAgICAgZmlsZTogc3RyaW5nLAogICAgICBvcHRzOiB7IHN0ZXA/OiBib29sZWFuOyBnbGI/OiBib29sZWFuOyBzdGw/OiBib29sZWFuOyBhbGw/OiBib29sZWFuOyBvdXQ6IHN0cmluZyB9CiAgICApID0+IHsKICAgICAgY29uc3QgZm9ybWF0cyA9IG9wdHMuYWxsCiAgICAgICAgPyB7IHN0ZXA6IHRydWUsIGdsYjogdHJ1ZSwgc3RsOiB0cnVlIH0KICAgICAgICA6IHsgc3RlcDogQm9vbGVhbihvcHRzLnN0ZXApLCBnbGI6IEJvb2xlYW4ob3B0cy5nbGIpLCBzdGw6IEJvb2xlYW4ob3B0cy5zdGwpIH07CiAgICAgIGlmICghZm9ybWF0cy5zdGVwICYmICFmb3JtYXRzLmdsYiAmJiAhZm9ybWF0cy5zdGwpIHsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnbm8gZm9ybWF0cyByZXF1ZXN0ZWQg4oCUIHBhc3MgLS1zdGVwLy0tZ2xiLy0tc3RsIG9yIC0tYWxsXG4nKTsKICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhwb3J0UGFydChyZXNvbHZlKGZpbGUpLCBmb3JtYXRzLCByZXNvbHZlKG9wdHMub3V0KSk7CiAgICAgIGZvciAoY29uc3QgcCBvZiByZXN1bHQud3JpdHRlbikgcHJvY2Vzcy5zdGRlcnIud3JpdGUoYHdyb3RlOiAke3B9XG5gKTsKICAgICAgZm9yIChjb25zdCBlIG9mIHJlc3VsdC5lcnJvcnMpIHByb2Nlc3Muc3RkZXJyLndyaXRlKGBlcnJvcjogJHtlfVxuYCk7CiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKAogICAgICAgIEpTT04uc3RyaW5naWZ5KHsgb2s6IHJlc3VsdC5vaywgd3JpdHRlbjogcmVzdWx0LndyaXR0ZW4sIGVycm9yczogcmVzdWx0LmVycm9ycyB9LCBudWxsLCAyKSArCiAgICAgICAgICAnXG4nCiAgICAgICk7CiAgICAgIGlmICghcmVzdWx0Lm9rKSBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICAgIH0KICApOwoKLy8gT25seSBkcml2ZSB0aGUgQ0xJIHdoZW4gcnVuIGFzIHRoZSBlbnRyeSBzY3JpcHQsIHNvIHRlc3RzIGNhbiBpbXBvcnQgdGhlCi8vIGd1YXJkZWQgbG9hZGVycyB3aXRob3V0IGNvbW1hbmRlciBwYXJzaW5nIHRoZSB0ZXN0IHJ1bm5lcidzIGFyZ3YuCi8vIFJlc29sdmUgc3ltbGlua3Mgb24gYm90aCBzaWRlczogdGhlIG5wbS1pbnN0YWxsZWQgYmluIChub2RlX21vZHVsZXMvLmJpbi9icmVwanMpCi8vIGlzIGEgc3ltbGluaywgc28gcHJvY2Vzcy5hcmd2WzFdIHdvdWxkIG90aGVyd2lzZSBuZXZlciBlcXVhbCB0aGUgcmVhbCBtb2R1bGUgcGF0aC4KZXhwb3J0IGZ1bmN0aW9uIGlzRW50cnlwb2ludChhcmd2MTogc3RyaW5nIHwgdW5kZWZpbmVkLCBtb2R1bGVVcmw6IHN0cmluZyk6IGJvb2xlYW4gewogIGlmICghYXJndjEpIHJldHVybiBmYWxzZTsKICB0cnkgewogICAgcmV0dXJuIHJlYWxwYXRoU3luYyhhcmd2MSkgPT09IHJlYWxwYXRoU3luYyhmaWxlVVJMVG9QYXRoKG1vZHVsZVVybCkpOwogIH0gY2F0Y2ggewogICAgcmV0dXJuIGZhbHNlOwogIH0KfQoKaWYgKGlzRW50cnlwb2ludChwcm9jZXNzLmFyZ3ZbMV0sIGltcG9ydC5tZXRhLnVybCkpIHsKICB2b2lkIHByb2dyYW0ucGFyc2VBc3luYygpOwp9Cg==", "" + {}.url));
49
49
  }
50
50
  /**
51
51
  * Write `code` to a temp ESM directory, run the verify CLI with `makeArgs(partPath)` in a
@@ -43,9 +43,9 @@ function positiveOrDefault(value, fallback) {
43
43
  return value !== void 0 && Number.isFinite(value) && value > 0 ? value : fallback;
44
44
  }
45
45
  function defaultCliEntry() {
46
- const builtJs = fileURLToPath(new URL("data:video/mp2t;base64,IyEvdXNyL2Jpbi9lbnYgbm9kZQppbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJzsKaW1wb3J0IHsgd3JpdGVGaWxlU3luYywgd2F0Y2ggYXMgZnNXYXRjaCwgcmVhbHBhdGhTeW5jLCBnbG9iU3luYyB9IGZyb20gJ25vZGU6ZnMnOwppbXBvcnQgeyByZXNvbHZlLCBqb2luLCBiYXNlbmFtZSwgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7CmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnOwppbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnOwppbXBvcnQgeyBydW5QYXJ0IH0gZnJvbSAnLi4vdmVyaWZ5L3J1blBhcnQuanMnOwppbXBvcnQgeyBwdXNoRXJyb3IsIHJlcG9ydE9rLCBzZXJpYWxpemVSZXBvcnQsIHR5cGUgVmVyaWZ5UmVwb3J0IH0gZnJvbSAnLi4vdmVyaWZ5L3JlcG9ydC5qcyc7CmltcG9ydCB7IHJ1bk1lYXN1cmUgfSBmcm9tICcuLi92ZXJpZnkvbWVhc3VyZS5qcyc7CmltcG9ydCB7IHJ1bkRpZmYgfSBmcm9tICcuLi92ZXJpZnkvZGlmZi5qcyc7CmltcG9ydCB7IHNjYWZmb2xkUGFydCB9IGZyb20gJy4vc2NhZmZvbGQuanMnOwppbXBvcnQgeyBkZWJvdW5jZSwgREVGQVVMVF9ERUJPVU5DRV9NUyB9IGZyb20gJy4vd2F0Y2guanMnOwppbXBvcnQgeyBleHBvcnRQYXJ0IH0gZnJvbSAnLi9leHBvcnRQYXJ0LmpzJzsKaW1wb3J0IHsgb3BlbkJyb3dzZXIsIHNob3VsZEF1dG9PcGVuIH0gZnJvbSAnLi9vcGVuQnJvd3Nlci5qcyc7CmltcG9ydCB7IGRpc3Bvc2VTaGFwZSB9IGZyb20gJy4uL2Rpc3Bvc2VTaGFwZS5qcyc7CmltcG9ydCB0eXBlIHsgc2hvb3QgYXMgU2hvb3RGbiB9IGZyb20gJy4uL3NuYXBzaG90L3Nob290LmpzJzsKaW1wb3J0IHsgYWltZWRTZWN0aW9uLCBmZWF0dXJlTWFya3MgfSBmcm9tICcuLi9zbmFwc2hvdC9haW1pbmcuanMnOwoKLy8gT0NDVCdzIFdBU00gU1RFUCB3cml0ZXIgZW1pdHMgYSAiU3RhdGlzdGljcyBvbiBUcmFuc2ZlciIgYmFubmVyIHZpYSBjb25zb2xlLmxvZwovLyAoRW1zY3JpcHRlbidzIGRlZmF1bHQgc3Rkb3V0IHNpbmspLiBUaGUgQ0xJIG93bnMgc3Rkb3V0IGZvciBtYWNoaW5lLXJlYWRhYmxlIEpTT04sCi8vIHNvIGRpdmVydCB0aGF0IGtlcm5lbCBjaGF0dGVyIHRvIHN0ZGVyciB0byBrZWVwIHN0ZG91dCBhIHNpbmdsZSBjbGVhbiBKU09OIGRvY3VtZW50LgovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZSAtLSByZXJvdXRlIGtlcm5lbCBzdGRvdXQgY2hhdHRlciBvZmYgdGhlIEpTT04gY2hhbm5lbApjb25zb2xlLmxvZyA9ICguLi5hcmdzOiB1bmtub3duW10pID0+IHsKICBwcm9jZXNzLnN0ZGVyci53cml0ZShhcmdzLm1hcChTdHJpbmcpLmpvaW4oJyAnKSArICdcbicpOwp9OwoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRTbmFwc2hvdFNob290KCk6IFByb21pc2U8dHlwZW9mIFNob290Rm4gfCB1bmRlZmluZWQ+IHsKICB0cnkgewogICAgY29uc3QgbW9kID0gYXdhaXQgaW1wb3J0KCcuLi9zbmFwc2hvdC9zaG9vdC5qcycpOwogICAgcmV0dXJuIG1vZC5zaG9vdDsKICB9IGNhdGNoIHsKICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdzbmFwc2hvdHMgbmVlZCBwdXBwZXRlZXIvQ2hyb21lIOKAlCBydW46IG5wbSBpIHB1cHBldGVlclxuJyk7CiAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICAgIHJldHVybiB1bmRlZmluZWQ7CiAgfQp9Cgpjb25zdCBwcm9ncmFtID0gbmV3IENvbW1hbmQoKTsKcHJvZ3JhbS5uYW1lKCdicmVwJyk7Cgpwcm9ncmFtCiAgLmNvbW1hbmQoJ3ZlcmlmeScsIHsgaXNEZWZhdWx0OiB0cnVlIH0pCiAgLmFyZ3VtZW50KAogICAgJzxmaWxlcy4uLj4nLAogICAgJ3BhdGgocykgb3IgZ2xvYihzKSB0byAuYnJlcC50cyBtb2R1bGVzOyBtdWx0aXBsZSBmaWxlcyDihpIgYSBiYXRjaCB2YWxpZGl0eSBKU09OIGFycmF5JwogICkKICAub3B0aW9uKCctLXN0ZXAgPG91dD4nLCAnd3JpdGUgdGhlIHByaW1hcnkgU1RFUCBhcnRpZmFjdCB0byB0aGlzIHBhdGgnKQogIC5vcHRpb24oJy0tZ2xiIDxvdXQ+JywgJ3dyaXRlIGEgZGVyaXZlZCBHTEIgcHJldmlldyB0byB0aGlzIHBhdGgnKQogIC5vcHRpb24oJy0tanNvbiA8b3V0PicsICd3cml0ZSB0aGUgSlNPTiByZXBvcnQgdG8gdGhpcyBwYXRoJykKICAub3B0aW9uKAogICAgJy0tY2hlY2snLAogICAgJ3R5cGUtY2hlY2sgdGhlIHBhcnQgKGFnYWluc3QgYnJlcGpzIHR5cGVzKSBiZWZvcmUgcnVubmluZzsgc2tpcCBleGVjdXRpb24gb24gdHlwZSBlcnJvcnMnCiAgKQogIC5vcHRpb24oJy0tc25hcHNob3QgPGRpcj4nLCAncmVuZGVyIGlzby9mcm9udC90b3AvcmlnaHQgUE5HcyB0byB0aGlzIGRpciAocmVxdWlyZXMgYnVpbHQgdmlld2VyKScpCiAgLm9wdGlvbigKICAgICctLXNlcnZlJywKICAgICdhZnRlciB2ZXJpZnlpbmcsIHN0YXJ0IGEgcHJldmlldyBzZXJ2ZXIgYW5kIHByaW50IGEgP2Rpcj0mZmlsZT0gZGVlcCBsaW5rIChzdGF5cyBydW5uaW5nKScKICApCiAgLm9wdGlvbignLS1uby1vcGVuJywgJ3dpdGggLS1zZXJ2ZSwgZG8gbm90IGF1dG8tb3BlbiB0aGUgYnJvd3NlciAoanVzdCBwcmludCB0aGUgdmlld2VyIFVSTCknKQogIC5vcHRpb24oCiAgICAnLS1leHBlY3QtY29kZSA8Y29kZT4nLAogICAgJ2V4aXQgMCBvbmx5IGlmIHRoZSByZXBvcnQgZW1pdHMgdGhpcyBlcnJvciBjb2RlIChmb3IgZml4dHVyZXMvZXZhbCByZWNhbGwpJwogICkKICAub3B0aW9uKAogICAgJy0tZXhwZWN0LWludmFsaWQnLAogICAgJ2V4aXQgMCBvbmx5IGlmIHRoZSBwYXJ0IGlzIGludmFsaWQgKG9rOmZhbHNlKSDigJQgZm9yIGtub3duLWJhZCBmaXh0dXJlcycKICApCiAgLm9wdGlvbigKICAgICctLW1ldHJpY3MnLAogICAgJ2NvbXB1dGUgZGV0ZXJtaW5pc3RpYyBtYW51ZmFjdHVyYWJpbGl0eSBtZXRyaWNzIChwZXItYm9keSBicmVha2Rvd24gKyBpbnRlcmZlcmVuY2UgbWF0cml4KSBmb3IgdGhlIGRlc2lnbiBqdWRnZSDigJQgc2xvd2VyOyBvZmYgYnkgZGVmYXVsdCcKICApCiAgLmFjdGlvbigKICAgIGFzeW5jICgKICAgICAgZmlsZXM6IHN0cmluZ1tdLAogICAgICBvcHRzOiB7CiAgICAgICAgc3RlcD86IHN0cmluZzsKICAgICAgICBnbGI/OiBzdHJpbmc7CiAgICAgICAganNvbj86IHN0cmluZzsKICAgICAgICBjaGVjaz86IGJvb2xlYW47CiAgICAgICAgc25hcHNob3Q/OiBzdHJpbmc7CiAgICAgICAgc2VydmU/OiBib29sZWFuOwogICAgICAgIGV4cGVjdENvZGU/OiBzdHJpbmc7CiAgICAgICAgZXhwZWN0SW52YWxpZD86IGJvb2xlYW47CiAgICAgICAgbWV0cmljcz86IGJvb2xlYW47CiAgICAgICAgLy8gQ29tbWFuZGVyIG1hdGVyaWFsaXplcyBhIG5lZ2F0ZWQgZmxhZyBhcyBhIGNvbmNyZXRlIGJvb2xlYW46IHRydWUgYnkKICAgICAgICAvLyBkZWZhdWx0LCBmYWxzZSB3aGVuIC0tbm8tb3BlbiBpcyBwYXNzZWQuCiAgICAgICAgb3BlbjogYm9vbGVhbjsKICAgICAgfQogICAgKSA9PiB7CiAgICAgIC8vIEEgcXVvdGVkIGdsb2IgKCJwYXJ0cy8qLmJyZXAudHMiKSBhcnJpdmVzIGFzIG9uZSBsaXRlcmFsIGFyZywgYSBzaGVsbC1leHBhbmRlZCBvbmUgYXMgbWFueTsKICAgICAgLy8gZ2xvYlN5bmMgaGFuZGxlcyBib3RoIChhIGxpdGVyYWwgZmlsZW5hbWUgbWF0Y2hlcyBpdHNlbGYpLCBmYWxsaW5nIGJhY2sgdG8gdGhlIHJhdyBhcmcgc28gYQogICAgICAvLyBtaXNzaW5nIHBhdGggc3RpbGwgcnVucyBhbmQgcmVwb3J0cyBpdHMgb3duIGVycm9yLgogICAgICBjb25zdCB0YXJnZXRzID0gWwogICAgICAgIC4uLm5ldyBTZXQoCiAgICAgICAgICBmaWxlcy5mbGF0TWFwKChmKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IG0gPSBnbG9iU3luYyhmKTsKICAgICAgICAgICAgcmV0dXJuIG0ubGVuZ3RoID8gbSA6IFtmXTsKICAgICAgICAgIH0pCiAgICAgICAgKSwKICAgICAgXS5tYXAoKHApID0+IHJlc29sdmUocCkpOwoKICAgICAgaWYgKHRhcmdldHMubGVuZ3RoID4gMSkgewogICAgICAgIC8vIEJhdGNoOiB2YWxpZGl0eS1vbmx5IEpTT04gYXJyYXkuIFRoZSBzaW5nbGUtZmlsZSBhcnRpZmFjdCBmbGFncyBkb24ndCBhcHBseS4KICAgICAgICBpZiAoCiAgICAgICAgICBvcHRzLnN0ZXAgfHwKICAgICAgICAgIG9wdHMuc2VydmUgfHwKICAgICAgICAgIG9wdHMuc25hcHNob3QgfHwKICAgICAgICAgIG9wdHMuZ2xiIHx8CiAgICAgICAgICBvcHRzLmV4cGVjdENvZGUgfHwKICAgICAgICAgIG9wdHMuZXhwZWN0SW52YWxpZAogICAgICAgICkgewogICAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoCiAgICAgICAgICAgICdiYXRjaCBtb2RlOiAtLXN0ZXAvLS1nbGIvLS1zZXJ2ZS8tLXNuYXBzaG90Ly0tZXhwZWN0LWNvZGUvLS1leHBlY3QtaW52YWxpZCBpZ25vcmVkIChzaW5nbGUtZmlsZSBvbmx5KVxuJwogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVzdWx0czogeyBmaWxlOiBzdHJpbmc7IG9rOiBib29sZWFuOyByZXBvcnQ6IFZlcmlmeVJlcG9ydCB9W10gPSBbXTsKICAgICAgICBmb3IgKGNvbnN0IGYgb2YgdGFyZ2V0cykgewogICAgICAgICAgY29uc3QgeyByZXBvcnQsIHNoYXBlIH0gPSBhd2FpdCBydW5QYXJ0KGYsIHsKICAgICAgICAgICAgY2hlY2s6IEJvb2xlYW4ob3B0cy5jaGVjayksCiAgICAgICAgICAgIG1ldHJpY3M6IEJvb2xlYW4ob3B0cy5tZXRyaWNzKSwKICAgICAgICAgIH0pOwogICAgICAgICAgZGlzcG9zZVNoYXBlKHNoYXBlKTsKICAgICAgICAgIHJlc3VsdHMucHVzaCh7IGZpbGU6IGYsIG9rOiByZXBvcnRPayhyZXBvcnQpLCByZXBvcnQgfSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShyZXN1bHRzLCBudWxsLCAyKTsKICAgICAgICBpZiAob3B0cy5qc29uICYmIG9wdHMuanNvbiAhPT0gJy0nKSB3cml0ZUZpbGVTeW5jKG9wdHMuanNvbiwganNvbik7CiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoanNvbiArICdcbicpOwogICAgICAgIGlmIChyZXN1bHRzLnNvbWUoKHIpID0+ICFyLm9rKSkgcHJvY2Vzcy5leGl0Q29kZSA9IDE7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBjb25zdCBmaWxlID0gdGFyZ2V0c1swXSA/PyBmaWxlc1swXSA/PyAnJzsKICAgICAgLy8gVGhlIFdBU00gdmlld2VyIGxvYWRzIGEgQ0FEIGZpbGUgKGl0IGNhbid0IHJ1biBhIC5icmVwLnRzKSwgc28gLS1zbmFwc2hvdC8tLXNlcnZlCiAgICAgIC8vIHN0YWdlIHRoZSBwcmltYXJ5IFNURVAgYW5kIHBvaW50IHRoZSB2aWV3ZXIgYXQgaXQgdmlhID9kaXI9JmZpbGU9LiAtLWdsYiBpcyBpdHMgb3duIGFydGlmYWN0LgogICAgICBjb25zdCB3YW50U3RlcCA9IEJvb2xlYW4ob3B0cy5zdGVwKSB8fCBCb29sZWFuKG9wdHMuc25hcHNob3QpIHx8IEJvb2xlYW4ob3B0cy5zZXJ2ZSk7CiAgICAgIGNvbnN0IHsgcmVwb3J0LCBzdGVwLCBnbGIsIHNoYXBlIH0gPSBhd2FpdCBydW5QYXJ0KHJlc29sdmUoZmlsZSksIHsKICAgICAgICBzdGVwOiB3YW50U3RlcCwKICAgICAgICBnbGI6IEJvb2xlYW4ob3B0cy5nbGIpLAogICAgICAgIGNoZWNrOiBCb29sZWFuKG9wdHMuY2hlY2spLAogICAgICAgIC8vIEEgc25hcHNob3QgZmVlZHMgdGhlIGRlc2lnbiBqdWRnZSwgc28gY29tcHV0ZSBtZXRyaWNzIHRvbyAoYm9yZXMg4oaSIGFuIGFpbWVkIHNlY3Rpb24gc2hvdCkuCiAgICAgICAgbWV0cmljczogQm9vbGVhbihvcHRzLm1ldHJpY3MpIHx8IEJvb2xlYW4ob3B0cy5zbmFwc2hvdCksCiAgICAgIH0pOwogICAgICBsZXQgc3RlcFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdHMuc3RlcDsKICAgICAgdHJ5IHsKICAgICAgICBpZiAob3B0cy5nbGIgJiYgZ2xiKSB3cml0ZUZpbGVTeW5jKG9wdHMuZ2xiLCBCdWZmZXIuZnJvbShnbGIpKTsKCiAgICAgICAgaWYgKHdhbnRTdGVwICYmIHN0ZXApIHsKICAgICAgICAgIHN0ZXBQYXRoID0gb3B0cy5zdGVwID8/IGpvaW4odG1wZGlyKCksIGBicmVwLSR7YmFzZW5hbWUoZmlsZSl9LnN0ZXBgKTsKICAgICAgICAgIHdyaXRlRmlsZVN5bmMoc3RlcFBhdGgsIEJ1ZmZlci5mcm9tKHN0ZXApKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9wdHMuc25hcHNob3QgJiYgc3RlcFBhdGgpIHsKICAgICAgICAgIGNvbnN0IHNob290ID0gYXdhaXQgbG9hZFNuYXBzaG90U2hvb3QoKTsgLy8gbGF6eToga2VlcHMgcHVwcGV0ZWVyIG9mZiB0aGUgZGVmYXVsdCBwYXRoCiAgICAgICAgICBpZiAoc2hvb3QpIHsKICAgICAgICAgICAgY29uc3Qgc2VjdGlvbiA9IGFpbWVkU2VjdGlvbigKICAgICAgICAgICAgICByZXBvcnQubWFudWZhY3R1cmFiaWxpdHk/LmJvcmVzID8/IFtdLAogICAgICAgICAgICAgIHJlcG9ydC5tZWFzdXJlbWVudHMuYm91bmRzCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNvbnN0IG1hcmtzID0gZmVhdHVyZU1hcmtzKHJlcG9ydC5ib2RpZXMgPz8gW10sIHJlcG9ydC5tYW51ZmFjdHVyYWJpbGl0eT8uYm9yZXMgPz8gW10pOwogICAgICAgICAgICBjb25zdCB7IHBuZ3MgfSA9IGF3YWl0IHNob290KHsKICAgICAgICAgICAgICBmaWxlOiBzdGVwUGF0aCwKICAgICAgICAgICAgICBvdXREaXI6IG9wdHMuc25hcHNob3QsCiAgICAgICAgICAgICAgLi4uKHNlY3Rpb24gPyB7IHNlY3Rpb24gfSA6IHt9KSwKICAgICAgICAgICAgICAuLi4obWFya3MubGVuZ3RoID4gMCA/IHsgbWFya3MgfSA6IHt9KSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIERpYWdub3N0aWMgcGF0aHMgZ28gdG8gc3RkZXJyIOKAlCBzdGRvdXQgc3RheXMgYSBzaW5nbGUgY2xlYW4gSlNPTiBkb2N1bWVudC4KICAgICAgICAgICAgZm9yIChjb25zdCBwIG9mIHBuZ3MpIHByb2Nlc3Muc3RkZXJyLndyaXRlKGBzbmFwc2hvdDogJHtwfVxuYCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChvcHRzLnNuYXBzaG90KSB7CiAgICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnc25hcHNob3Qgc2tpcHBlZDogU1RFUCBleHBvcnQgcHJvZHVjZWQgbm8gYXJ0aWZhY3RcbicpOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHB1c2hFcnJvcihyZXBvcnQsIHsgbWVzc2FnZTogYGFydGlmYWN0IHdyaXRlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gIH0pOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIC8vIFRoZSBzaGFwZSBpcyBhIGxpdmUgV0FTTSBoYW5kbGU7IHJlbGVhc2UgaXQgYmVmb3JlIHRoZSBzZXJ2ZXIgdGFrZXMgb3ZlciAodGhlCiAgICAgICAgLy8gLS1zZXJ2ZSBwYXRoIHN0YXlzIHJ1bm5pbmcsIHNvIGxlYWtpbmcgaGVyZSB3b3VsZCBwZXJzaXN0IGZvciB0aGUgc2VydmVyJ3MgbGlmZXRpbWUpLgogICAgICAgIGRpc3Bvc2VTaGFwZShzaGFwZSk7CiAgICAgIH0KICAgICAgLy8gU2VyaWFsaXplIG9uY2UgYWZ0ZXIgYWxsIGFydGlmYWN0IHdyaXRlcyBzbyB0aGUgLS1qc29uIGZpbGUgYW5kIHN0ZG91dAogICAgICAvLyByZWZsZWN0IHRoZSBzYW1lIHJlcG9ydCAoaW5jbC4gYW55ICJhcnRpZmFjdCB3cml0ZSBmYWlsZWQiIGVycm9yKS4KICAgICAgY29uc3QganNvbiA9IHNlcmlhbGl6ZVJlcG9ydChyZXBvcnQpOwogICAgICAvLyBgLS1qc29uIC1gIGlzIHNhdGlzZmllZCBieSB0aGUgc3Rkb3V0IHdyaXRlIGJlbG93OyBvbmx5IGEgcmVhbCBwYXRoIHdyaXRlcyBhIGZpbGUuCiAgICAgIGlmIChvcHRzLmpzb24gJiYgb3B0cy5qc29uICE9PSAnLScpIHdyaXRlRmlsZVN5bmMob3B0cy5qc29uLCBqc29uKTsKICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoanNvbiArICdcbicpOwogICAgICBpZiAoIXJlcG9ydE9rKHJlcG9ydCkpIHByb2Nlc3MuZXhpdENvZGUgPSAxOwogICAgICAvLyBGaXh0dXJlIGFzc2VydGlvbnMgKFBoYXNlOiB2ZXJpZnktaGVhbCBwcmVjaXNpb24vcmVjYWxsKSBvdmVycmlkZSB0aGUgbm9ybWFsIGV4aXQgY29kZToKICAgICAgLy8gYSBrbm93bi1iYWQgcGFydCBtdXN0IGZhaWwgdGhlICpyaWdodCogd2F5LiBDb2RlcyBjb21lIGZyb20gdGhlIGtlcm5lbC9hdXRob3JpbmcgZXJyb3JzLAogICAgICAvLyBub3QgdGhlIGhpbnQgdGFibGUsIHNvIHRoaXMgbWVhc3VyZXMgdGhlIHZlcmlmaWVyLCBub3QgaXRzIHByb3NlLgogICAgICBpZiAob3B0cy5leHBlY3RJbnZhbGlkIHx8IG9wdHMuZXhwZWN0Q29kZSkgewogICAgICAgIC8vIGhpbnRzIGFyZSBkZXJpdmVkIGZyb20gZXJyb3JJbmZvcywgc28gdGhlIGNvZGVzIGxpdmUgdGhlcmU7IGRlZHVwZSB0byBrZWVwIHRoZSBsaW5lIGNsZWFuLgogICAgICAgIGNvbnN0IGNvZGVzID0gWwogICAgICAgICAgLi4ubmV3IFNldChyZXBvcnQuZXJyb3JJbmZvcy5tYXAoKGUpID0+IGUuY29kZSkuZmlsdGVyKChjKTogYyBpcyBzdHJpbmcgPT4gQm9vbGVhbihjKSkpLAogICAgICAgIF07CiAgICAgICAgY29uc3QgdmFsaWQgPSByZXBvcnRPayhyZXBvcnQpOwogICAgICAgIGNvbnN0IHBhc3MgPQogICAgICAgICAgKCFvcHRzLmV4cGVjdEludmFsaWQgfHwgIXZhbGlkKSAmJiAoIW9wdHMuZXhwZWN0Q29kZSB8fCBjb2Rlcy5pbmNsdWRlcyhvcHRzLmV4cGVjdENvZGUpKTsKICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gcGFzcyA/IDAgOiAxOwogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKAogICAgICAgICAgYGV4cGVjdDogJHtwYXNzID8gJ1BBU1MnIDogJ0ZBSUwnfWAgKwogICAgICAgICAgICAob3B0cy5leHBlY3RDb2RlID8gYCBjb2RlPSR7b3B0cy5leHBlY3RDb2RlfWAgOiAnJykgKwogICAgICAgICAgICAob3B0cy5leHBlY3RJbnZhbGlkID8gJyBpbnZhbGlkJyA6ICcnKSArCiAgICAgICAgICAgIGAgKG9rPSR7dmFsaWR9LCBjb2Rlcz0ke2NvZGVzLmpvaW4oJywnKSB8fCAnbm9uZSd9KVxuYAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHdpbGxTZXJ2ZSA9IEJvb2xlYW4ob3B0cy5zZXJ2ZSkgJiYgc3RlcFBhdGggIT09IHVuZGVmaW5lZCAmJiByZXBvcnRPayhyZXBvcnQpOwogICAgICBpZiAod2lsbFNlcnZlICYmIHN0ZXBQYXRoKSB7CiAgICAgICAgY29uc3QgeyBzZXJ2ZSB9ID0gYXdhaXQgaW1wb3J0KCcuLi9zbmFwc2hvdC9zZXJ2ZS5qcycpOyAvLyBsYXp5OiBubyBzZXJ2ZXIgZGVwcyBvbiB0aGUgZGVmYXVsdCBwYXRoCiAgICAgICAgY29uc3QgeyB1cmwsIHJldXNlZCB9ID0gYXdhaXQgc2VydmUoeyBmaWxlOiBzdGVwUGF0aCB9KTsgLy8gYnVpbGRzIGEgP2Rpcj0mZmlsZT0gVVJMOyBzZXJ2ZXIgcnVucyB1bnRpbCBDdHJsLUMKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShgdmlld2VyOiAke3VybH1cbmApOwogICAgICAgIC8vIEF1dG8tb3BlbiBvbmx5IGZvciBhIGZyZXNobHkgc3RhcnRlZCBzZXJ2ZXIgKGEgcmV1c2VkIG9uZSBhbHJlYWR5IGhhcwogICAgICAgIC8vIGEgdGFiKSBpbiBhbiBpbnRlcmFjdGl2ZSBzZXNzaW9uOyBgLS1uby1vcGVuYCAob3B0cy5vcGVuID09PSBmYWxzZSkKICAgICAgICAvLyBhbHdheXMgc3VwcHJlc3NlcyBpdC4KICAgICAgICBpZiAoIXJldXNlZCAmJiBvcHRzLm9wZW4gJiYgc2hvdWxkQXV0b09wZW4oKSkgewogICAgICAgICAgb3BlbkJyb3dzZXIodXJsKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICApOwoKcHJvZ3JhbQogIC5jb21tYW5kKCdtZWFzdXJlJykKICAuYXJndW1lbnQoJzxhPicsICdwYXRoIHRvIGEgLmJyZXAudHMgbW9kdWxlJykKICAuYXJndW1lbnQoJ1tiXScsICdvcHRpb25hbCBzZWNvbmQgbW9kdWxlOyBpZiBnaXZlbiwgbWVhc3VyZXMgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHBhcnRzJykKICAuYWN0aW9uKGFzeW5jIChhOiBzdHJpbmcsIGI/OiBzdHJpbmcpID0+IHsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1bk1lYXN1cmUocmVzb2x2ZShhKSwgYiA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcmVzb2x2ZShiKSk7CiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgKICAgICAgSlNPTi5zdHJpbmdpZnkoeyBvazogcmVzdWx0LmVycm9ycy5sZW5ndGggPT09IDAsIC4uLnJlc3VsdCB9LCBudWxsLCAyKSArICdcbicKICAgICk7CiAgICBpZiAocmVzdWx0LmVycm9ycy5sZW5ndGggPiAwKSBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICB9KTsKCnByb2dyYW0KICAuY29tbWFuZCgnZGlmZicpCiAgLmFyZ3VtZW50KCc8YT4nLCAncGF0aCB0byB0aGUgYmFzZWxpbmUgLmJyZXAudHMgbW9kdWxlJykKICAuYXJndW1lbnQoJzxiPicsICdwYXRoIHRvIHRoZSBjb21wYXJpc29uIC5icmVwLnRzIG1vZHVsZScpCiAgLmFjdGlvbihhc3luYyAoYTogc3RyaW5nLCBiOiBzdHJpbmcpID0+IHsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1bkRpZmYocmVzb2x2ZShhKSwgcmVzb2x2ZShiKSk7CiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgKICAgICAgSlNPTi5zdHJpbmdpZnkoeyBvazogcmVzdWx0LmVycm9ycy5sZW5ndGggPT09IDAsIC4uLnJlc3VsdCB9LCBudWxsLCAyKSArICdcbicKICAgICk7CiAgICBpZiAocmVzdWx0LmVycm9ycy5sZW5ndGggPiAwKSBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICB9KTsKCnByb2dyYW0KICAuY29tbWFuZCgnc25hcHNob3QnKQogIC5hcmd1bWVudCgKICAgICc8ZmlsZT4nLAogICAgJ3BhdGggdG8gYSAuYnJlcC50cyBtb2R1bGU7IHJlbmRlcnMgaXNvL2Zyb250L3RvcC9yaWdodCBQTkdzIChubyByZXBvcnQgYXNzZXJ0aW9ucyknCiAgKQogIC5vcHRpb24oJy0tb3V0IDxkaXI+JywgJ291dHB1dCBkaXJlY3RvcnkgZm9yIHRoZSBQTkdzIChkZWZhdWx0IDxmaWxlPi1zaG90cyknKQogIC5vcHRpb24oJy0tbGFiZWwgPHRhZz4nLCAnc3ViZm9sZGVyIGZvciB0aGlzIHJlbmRlciBzZXQgKGUuZy4gcHJlLCBwb3N0KSBmb3IgQS9CIHBhaXJpbmcnKQogIC5hY3Rpb24oYXN5bmMgKGZpbGU6IHN0cmluZywgb3B0czogeyBvdXQ/OiBzdHJpbmc7IGxhYmVsPzogc3RyaW5nIH0pID0+IHsKICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZShmaWxlKTsKICAgIGNvbnN0IGJhc2UgPSBvcHRzLm91dCA/IHJlc29sdmUob3B0cy5vdXQpIDogYCR7cmVzb2x2ZWR9LXNob3RzYDsKICAgIGNvbnN0IG91dERpciA9IG9wdHMubGFiZWwgPyBqb2luKGJhc2UsIG9wdHMubGFiZWwpIDogYmFzZTsKICAgIGNvbnN0IHsgcmVwb3J0LCBzdGVwLCBzaGFwZSB9ID0gYXdhaXQgcnVuUGFydChyZXNvbHZlZCwgeyBzdGVwOiB0cnVlLCBtZXRyaWNzOiB0cnVlIH0pOwogICAgdHJ5IHsKICAgICAgaWYgKCFzdGVwKSB7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ3NuYXBzaG90OiBwYXJ0IHByb2R1Y2VkIG5vIFNURVAg4oCUIG5vdGhpbmcgdG8gcmVuZGVyXG4nKTsKICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShzZXJpYWxpemVSZXBvcnQocmVwb3J0KSArICdcbicpOwogICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBzdGVwUGF0aCA9IGpvaW4odG1wZGlyKCksIGBicmVwLXNuYXAtJHtiYXNlbmFtZShmaWxlKX0uc3RlcGApOwogICAgICB3cml0ZUZpbGVTeW5jKHN0ZXBQYXRoLCBCdWZmZXIuZnJvbShzdGVwKSk7CiAgICAgIGNvbnN0IHNob290ID0gYXdhaXQgbG9hZFNuYXBzaG90U2hvb3QoKTsKICAgICAgaWYgKCFzaG9vdCkgewogICAgICAgIC8vIHB1cHBldGVlciBhYnNlbnQ6IGxvYWRTbmFwc2hvdFNob290IHNldCBleGl0Q29kZSArIHN0ZGVycjsgc3RpbGwgZW1pdCB0aGUgcmVwb3J0IHNvIGEKICAgICAgICAvLyBjYWxsZXIgcGFyc2luZyBzdGRvdXQgZ2V0cyB0aGUgdmFsaWRpdHkgaW5mbyByYXRoZXIgdGhhbiBhbiBlbXB0eSBidWZmZXIuCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoc2VyaWFsaXplUmVwb3J0KHJlcG9ydCkgKyAnXG4nKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgLy8gZnJlc2g6IGEgcHJpdmF0ZSBlcGhlbWVyYWwgcmVuZGVyIHNlcnZlciBzbyBwYXJhbGxlbCBzbmFwc2hvdHMgZG9uJ3QgY29udGVuZCBvbiA6NzM3My4KICAgICAgY29uc3Qgc2VjdGlvbiA9IGFpbWVkU2VjdGlvbigKICAgICAgICByZXBvcnQubWFudWZhY3R1cmFiaWxpdHk/LmJvcmVzID8/IFtdLAogICAgICAgIHJlcG9ydC5tZWFzdXJlbWVudHMuYm91bmRzCiAgICAgICk7CiAgICAgIGNvbnN0IG1hcmtzID0gZmVhdHVyZU1hcmtzKHJlcG9ydC5ib2RpZXMgPz8gW10sIHJlcG9ydC5tYW51ZmFjdHVyYWJpbGl0eT8uYm9yZXMgPz8gW10pOwogICAgICBjb25zdCB7IHBuZ3MgfSA9IGF3YWl0IHNob290KHsKICAgICAgICBmaWxlOiBzdGVwUGF0aCwKICAgICAgICBvdXREaXIsCiAgICAgICAgZnJlc2g6IHRydWUsCiAgICAgICAgLi4uKHNlY3Rpb24gPyB7IHNlY3Rpb24gfSA6IHt9KSwKICAgICAgICAuLi4obWFya3MubGVuZ3RoID4gMCA/IHsgbWFya3MgfSA6IHt9KSwKICAgICAgfSk7CiAgICAgIGZvciAoY29uc3QgcCBvZiBwbmdzKSBwcm9jZXNzLnN0ZG91dC53cml0ZShgJHtwfVxuYCk7CiAgICB9IGZpbmFsbHkgewogICAgICBkaXNwb3NlU2hhcGUoc2hhcGUpOwogICAgfQogIH0pOwoKcHJvZ3JhbQogIC5jb21tYW5kKCdpbml0JykKICAuYXJndW1lbnQoJzxuYW1lPicsICdwYXJ0IG5hbWU7IHNjYWZmb2xkcyA8bmFtZT4uYnJlcC50cyArIHRzY29uZmlnLmpzb24gKyBSRUFETUUubWQnKQogIC5vcHRpb24oJy0tb3V0IDxkaXI+JywgJ3RhcmdldCBkaXJlY3RvcnkgKGRlZmF1bHRzIHRvIC4vPG5hbWU+KScpCiAgLmFjdGlvbigobmFtZTogc3RyaW5nLCBvcHRzOiB7IG91dD86IHN0cmluZyB9KSA9PiB7CiAgICBjb25zdCBkaXIgPSByZXNvbHZlKG9wdHMub3V0ID8/IG5hbWUpOwogICAgY29uc3QgcmVzdWx0ID0gc2NhZmZvbGRQYXJ0KG5hbWUsIGRpcik7CiAgICBmb3IgKGNvbnN0IGYgb2YgcmVzdWx0LmZpbGVzKSB7CiAgICAgIGNvbnN0IHRhZyA9IGYuY3JlYXRlZCA/ICdjcmVhdGVkJyA6ICdleGlzdHMgKGtlcHQpJzsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoYCR7dGFnfTogJHtmLnBhdGh9XG5gKTsKICAgIH0KICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMikgKyAnXG4nKTsKICB9KTsKCnByb2dyYW0KICAuY29tbWFuZCgnd2F0Y2gnKQogIC5hcmd1bWVudCgnPGZpbGU+JywgJ3BhdGggdG8gYSAuYnJlcC50cyBtb2R1bGU7IHJlLXZlcmlmaWVzIG9uIGVhY2ggc2F2ZSB1bnRpbCBDdHJsLUMnKQogIC5hY3Rpb24oKGZpbGU6IHN0cmluZykgPT4gewogICAgY29uc3QgcGF0aCA9IHJlc29sdmUoZmlsZSk7CiAgICBjb25zdCBydW4gPSBhc3luYyAoKSA9PiB7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgeyByZXBvcnQsIHNoYXBlIH0gPSBhd2FpdCBydW5QYXJ0KHBhdGgpOwogICAgICAgIHRyeSB7CiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShzZXJpYWxpemVSZXBvcnQocmVwb3J0KSArICdcbicpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBkaXNwb3NlU2hhcGUoc2hhcGUpOyAvLyBsaXZlIFdBU00gaGFuZGxlOyB0aGUgbG9vcCBydW5zIGluZGVmaW5pdGVseQogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGB3YXRjaCBydW4gZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfVxuYCk7CiAgICAgIH0KICAgIH07CiAgICBjb25zdCB7IHRyaWdnZXIgfSA9IGRlYm91bmNlKHJ1biwgREVGQVVMVF9ERUJPVU5DRV9NUyk7CiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShgd2F0Y2hpbmcgJHtwYXRofSAoQ3RybC1DIHRvIHN0b3ApXG5gKTsKICAgIHZvaWQgcnVuKCk7IC8vIGluaXRpYWwgdmVyaWZ5CiAgICAvLyBXYXRjaCB0aGUgcGFyZW50IGRpcjogZWRpdG9ycyBvZnRlbiByZXBsYWNlIHRoZSBmaWxlIChyZW5hbWUpIG9uIHNhdmUsCiAgICAvLyB3aGljaCBkcm9wcyBhIHdhdGNoZXIgYm91bmQgdG8gdGhlIGZpbGUgaW5vZGUgaXRzZWxmLgogICAgY29uc3Qgd2F0Y2hlciA9IGZzV2F0Y2goZGlybmFtZShwYXRoKSwgKF9ldmVudCwgZmlsZW5hbWUpID0+IHsKICAgICAgaWYgKGZpbGVuYW1lID09PSB1bmRlZmluZWQgfHwgZmlsZW5hbWUgPT09IG51bGwpIHsKICAgICAgICB0cmlnZ2VyKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChiYXNlbmFtZShwYXRoKSA9PT0gZmlsZW5hbWUudG9TdHJpbmcoKSkgdHJpZ2dlcigpOwogICAgfSk7CiAgICBjb25zdCBzdG9wID0gKCkgPT4gewogICAgICB3YXRjaGVyLmNsb3NlKCk7CiAgICAgIHByb2Nlc3MuZXhpdCgwKTsKICAgIH07CiAgICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBzdG9wKTsKICAgIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCBzdG9wKTsgLy8gc3VwZXJ2aXNvcnMgKGRvY2tlciBzdG9wLCBzeXN0ZW1jdGwpIHNlbmQgU0lHVEVSTQogIH0pOwoKcHJvZ3JhbQogIC5jb21tYW5kKCdleHBvcnQnKQogIC5hcmd1bWVudCgnPGZpbGU+JywgJ3BhdGggdG8gYSAuYnJlcC50cyBtb2R1bGUnKQogIC5vcHRpb24oJy0tc3RlcCcsICd3cml0ZSBhIFNURVAgYXJ0aWZhY3QnKQogIC5vcHRpb24oJy0tZ2xiJywgJ3dyaXRlIGEgR0xCIGFydGlmYWN0JykKICAub3B0aW9uKCctLXN0bCcsICd3cml0ZSBhbiBTVEwgYXJ0aWZhY3QnKQogIC5vcHRpb24oJy0tYWxsJywgJ3dyaXRlIFNURVAgKyBHTEIgKyBTVEwnKQogIC5vcHRpb24oJy0tb3V0IDxkaXI+JywgJ291dHB1dCBkaXJlY3RvcnknLCAnLicpCiAgLmFjdGlvbigKICAgIGFzeW5jICgKICAgICAgZmlsZTogc3RyaW5nLAogICAgICBvcHRzOiB7IHN0ZXA/OiBib29sZWFuOyBnbGI/OiBib29sZWFuOyBzdGw/OiBib29sZWFuOyBhbGw/OiBib29sZWFuOyBvdXQ6IHN0cmluZyB9CiAgICApID0+IHsKICAgICAgY29uc3QgZm9ybWF0cyA9IG9wdHMuYWxsCiAgICAgICAgPyB7IHN0ZXA6IHRydWUsIGdsYjogdHJ1ZSwgc3RsOiB0cnVlIH0KICAgICAgICA6IHsgc3RlcDogQm9vbGVhbihvcHRzLnN0ZXApLCBnbGI6IEJvb2xlYW4ob3B0cy5nbGIpLCBzdGw6IEJvb2xlYW4ob3B0cy5zdGwpIH07CiAgICAgIGlmICghZm9ybWF0cy5zdGVwICYmICFmb3JtYXRzLmdsYiAmJiAhZm9ybWF0cy5zdGwpIHsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnbm8gZm9ybWF0cyByZXF1ZXN0ZWQg4oCUIHBhc3MgLS1zdGVwLy0tZ2xiLy0tc3RsIG9yIC0tYWxsXG4nKTsKICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhwb3J0UGFydChyZXNvbHZlKGZpbGUpLCBmb3JtYXRzLCByZXNvbHZlKG9wdHMub3V0KSk7CiAgICAgIGZvciAoY29uc3QgcCBvZiByZXN1bHQud3JpdHRlbikgcHJvY2Vzcy5zdGRlcnIud3JpdGUoYHdyb3RlOiAke3B9XG5gKTsKICAgICAgZm9yIChjb25zdCBlIG9mIHJlc3VsdC5lcnJvcnMpIHByb2Nlc3Muc3RkZXJyLndyaXRlKGBlcnJvcjogJHtlfVxuYCk7CiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKAogICAgICAgIEpTT04uc3RyaW5naWZ5KHsgb2s6IHJlc3VsdC5vaywgd3JpdHRlbjogcmVzdWx0LndyaXR0ZW4sIGVycm9yczogcmVzdWx0LmVycm9ycyB9LCBudWxsLCAyKSArCiAgICAgICAgICAnXG4nCiAgICAgICk7CiAgICAgIGlmICghcmVzdWx0Lm9rKSBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICAgIH0KICApOwoKLy8gT25seSBkcml2ZSB0aGUgQ0xJIHdoZW4gcnVuIGFzIHRoZSBlbnRyeSBzY3JpcHQsIHNvIHRlc3RzIGNhbiBpbXBvcnQgdGhlCi8vIGd1YXJkZWQgbG9hZGVycyB3aXRob3V0IGNvbW1hbmRlciBwYXJzaW5nIHRoZSB0ZXN0IHJ1bm5lcidzIGFyZ3YuCi8vIFJlc29sdmUgc3ltbGlua3Mgb24gYm90aCBzaWRlczogdGhlIG5wbS1pbnN0YWxsZWQgYmluIChub2RlX21vZHVsZXMvLmJpbi9icmVwanMpCi8vIGlzIGEgc3ltbGluaywgc28gcHJvY2Vzcy5hcmd2WzFdIHdvdWxkIG90aGVyd2lzZSBuZXZlciBlcXVhbCB0aGUgcmVhbCBtb2R1bGUgcGF0aC4KZXhwb3J0IGZ1bmN0aW9uIGlzRW50cnlwb2ludChhcmd2MTogc3RyaW5nIHwgdW5kZWZpbmVkLCBtb2R1bGVVcmw6IHN0cmluZyk6IGJvb2xlYW4gewogIGlmICghYXJndjEpIHJldHVybiBmYWxzZTsKICB0cnkgewogICAgcmV0dXJuIHJlYWxwYXRoU3luYyhhcmd2MSkgPT09IHJlYWxwYXRoU3luYyhmaWxlVVJMVG9QYXRoKG1vZHVsZVVybCkpOwogIH0gY2F0Y2ggewogICAgcmV0dXJuIGZhbHNlOwogIH0KfQoKaWYgKGlzRW50cnlwb2ludChwcm9jZXNzLmFyZ3ZbMV0sIGltcG9ydC5tZXRhLnVybCkpIHsKICB2b2lkIHByb2dyYW0ucGFyc2VBc3luYygpOwp9Cg==", "" + import.meta.url));
46
+ const builtJs = fileURLToPath(new URL("data:video/mp2t;base64,IyEvdXNyL2Jpbi9lbnYgbm9kZQppbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJzsKaW1wb3J0IHsgd3JpdGVGaWxlU3luYywgcmVhbHBhdGhTeW5jLCBnbG9iU3luYyB9IGZyb20gJ25vZGU6ZnMnOwppbXBvcnQgeyByZXNvbHZlLCBqb2luLCBiYXNlbmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7CmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnOwppbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnOwppbXBvcnQgeyBydW5QYXJ0IH0gZnJvbSAnLi4vdmVyaWZ5L3J1blBhcnQuanMnOwppbXBvcnQgeyBwdXNoRXJyb3IsIHJlcG9ydE9rLCBzZXJpYWxpemVSZXBvcnQsIHR5cGUgVmVyaWZ5UmVwb3J0IH0gZnJvbSAnLi4vdmVyaWZ5L3JlcG9ydC5qcyc7CmltcG9ydCB7IHJ1bk1lYXN1cmUgfSBmcm9tICcuLi92ZXJpZnkvbWVhc3VyZS5qcyc7CmltcG9ydCB7IHJ1bkRpZmYgfSBmcm9tICcuLi92ZXJpZnkvZGlmZi5qcyc7CmltcG9ydCB7IHNjYWZmb2xkUGFydCB9IGZyb20gJy4vc2NhZmZvbGQuanMnOwppbXBvcnQgewogIGRlYm91bmNlLAogIERFRkFVTFRfREVCT1VOQ0VfTVMsCiAgaXNXYXRjaFJlbGV2YW50LAogIHdhdGNoUm9vdEZvciwKICB3YXRjaFRyZWUsCn0gZnJvbSAnLi93YXRjaC5qcyc7CmltcG9ydCB7IGV4cG9ydFBhcnQgfSBmcm9tICcuL2V4cG9ydFBhcnQuanMnOwppbXBvcnQgeyBvcGVuQnJvd3Nlciwgc2hvdWxkQXV0b09wZW4gfSBmcm9tICcuL29wZW5Ccm93c2VyLmpzJzsKaW1wb3J0IHsgZGlzcG9zZVNoYXBlIH0gZnJvbSAnLi4vZGlzcG9zZVNoYXBlLmpzJzsKaW1wb3J0IHR5cGUgeyBzaG9vdCBhcyBTaG9vdEZuIH0gZnJvbSAnLi4vc25hcHNob3Qvc2hvb3QuanMnOwppbXBvcnQgeyBhaW1lZFNlY3Rpb24sIGZlYXR1cmVNYXJrcyB9IGZyb20gJy4uL3NuYXBzaG90L2FpbWluZy5qcyc7CgovLyBPQ0NUJ3MgV0FTTSBTVEVQIHdyaXRlciBlbWl0cyBhICJTdGF0aXN0aWNzIG9uIFRyYW5zZmVyIiBiYW5uZXIgdmlhIGNvbnNvbGUubG9nCi8vIChFbXNjcmlwdGVuJ3MgZGVmYXVsdCBzdGRvdXQgc2luaykuIFRoZSBDTEkgb3ducyBzdGRvdXQgZm9yIG1hY2hpbmUtcmVhZGFibGUgSlNPTiwKLy8gc28gZGl2ZXJ0IHRoYXQga2VybmVsIGNoYXR0ZXIgdG8gc3RkZXJyIHRvIGtlZXAgc3Rkb3V0IGEgc2luZ2xlIGNsZWFuIEpTT04gZG9jdW1lbnQuCi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlIC0tIHJlcm91dGUga2VybmVsIHN0ZG91dCBjaGF0dGVyIG9mZiB0aGUgSlNPTiBjaGFubmVsCmNvbnNvbGUubG9nID0gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gewogIHByb2Nlc3Muc3RkZXJyLndyaXRlKGFyZ3MubWFwKFN0cmluZykuam9pbignICcpICsgJ1xuJyk7Cn07CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFNuYXBzaG90U2hvb3QoKTogUHJvbWlzZTx0eXBlb2YgU2hvb3RGbiB8IHVuZGVmaW5lZD4gewogIHRyeSB7CiAgICBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoJy4uL3NuYXBzaG90L3Nob290LmpzJyk7CiAgICByZXR1cm4gbW9kLnNob290OwogIH0gY2F0Y2ggewogICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ3NuYXBzaG90cyBuZWVkIHB1cHBldGVlci9DaHJvbWUg4oCUIHJ1bjogbnBtIGkgcHVwcGV0ZWVyXG4nKTsKICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxOwogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9Cn0KCmNvbnN0IHByb2dyYW0gPSBuZXcgQ29tbWFuZCgpOwpwcm9ncmFtLm5hbWUoJ2JyZXAnKTsKCnByb2dyYW0KICAuY29tbWFuZCgndmVyaWZ5JywgeyBpc0RlZmF1bHQ6IHRydWUgfSkKICAuYXJndW1lbnQoCiAgICAnPGZpbGVzLi4uPicsCiAgICAncGF0aChzKSBvciBnbG9iKHMpIHRvIC5icmVwLnRzIG1vZHVsZXM7IG11bHRpcGxlIGZpbGVzIOKGkiBhIGJhdGNoIHZhbGlkaXR5IEpTT04gYXJyYXknCiAgKQogIC5vcHRpb24oJy0tc3RlcCA8b3V0PicsICd3cml0ZSB0aGUgcHJpbWFyeSBTVEVQIGFydGlmYWN0IHRvIHRoaXMgcGF0aCcpCiAgLm9wdGlvbignLS1nbGIgPG91dD4nLCAnd3JpdGUgYSBkZXJpdmVkIEdMQiBwcmV2aWV3IHRvIHRoaXMgcGF0aCcpCiAgLm9wdGlvbignLS1qc29uIDxvdXQ+JywgJ3dyaXRlIHRoZSBKU09OIHJlcG9ydCB0byB0aGlzIHBhdGgnKQogIC5vcHRpb24oCiAgICAnLS1jaGVjaycsCiAgICAndHlwZS1jaGVjayB0aGUgcGFydCAoYWdhaW5zdCBicmVwanMgdHlwZXMpIGJlZm9yZSBydW5uaW5nOyBza2lwIGV4ZWN1dGlvbiBvbiB0eXBlIGVycm9ycycKICApCiAgLm9wdGlvbignLS1zbmFwc2hvdCA8ZGlyPicsICdyZW5kZXIgaXNvL2Zyb250L3RvcC9yaWdodCBQTkdzIHRvIHRoaXMgZGlyIChyZXF1aXJlcyBidWlsdCB2aWV3ZXIpJykKICAub3B0aW9uKAogICAgJy0tc2VydmUnLAogICAgJ2FmdGVyIHZlcmlmeWluZywgc3RhcnQgYSBwcmV2aWV3IHNlcnZlciBhbmQgcHJpbnQgYSA/ZGlyPSZmaWxlPSBkZWVwIGxpbmsgKHN0YXlzIHJ1bm5pbmcpJwogICkKICAub3B0aW9uKCctLW5vLW9wZW4nLCAnd2l0aCAtLXNlcnZlLCBkbyBub3QgYXV0by1vcGVuIHRoZSBicm93c2VyIChqdXN0IHByaW50IHRoZSB2aWV3ZXIgVVJMKScpCiAgLm9wdGlvbigKICAgICctLWV4cGVjdC1jb2RlIDxjb2RlPicsCiAgICAnZXhpdCAwIG9ubHkgaWYgdGhlIHJlcG9ydCBlbWl0cyB0aGlzIGVycm9yIGNvZGUgKGZvciBmaXh0dXJlcy9ldmFsIHJlY2FsbCknCiAgKQogIC5vcHRpb24oCiAgICAnLS1leHBlY3QtaW52YWxpZCcsCiAgICAnZXhpdCAwIG9ubHkgaWYgdGhlIHBhcnQgaXMgaW52YWxpZCAob2s6ZmFsc2UpIOKAlCBmb3Iga25vd24tYmFkIGZpeHR1cmVzJwogICkKICAub3B0aW9uKAogICAgJy0tbWV0cmljcycsCiAgICAnY29tcHV0ZSBkZXRlcm1pbmlzdGljIG1hbnVmYWN0dXJhYmlsaXR5IG1ldHJpY3MgKHBlci1ib2R5IGJyZWFrZG93biArIGludGVyZmVyZW5jZSBtYXRyaXgpIGZvciB0aGUgZGVzaWduIGp1ZGdlIOKAlCBzbG93ZXI7IG9mZiBieSBkZWZhdWx0JwogICkKICAuYWN0aW9uKAogICAgYXN5bmMgKAogICAgICBmaWxlczogc3RyaW5nW10sCiAgICAgIG9wdHM6IHsKICAgICAgICBzdGVwPzogc3RyaW5nOwogICAgICAgIGdsYj86IHN0cmluZzsKICAgICAgICBqc29uPzogc3RyaW5nOwogICAgICAgIGNoZWNrPzogYm9vbGVhbjsKICAgICAgICBzbmFwc2hvdD86IHN0cmluZzsKICAgICAgICBzZXJ2ZT86IGJvb2xlYW47CiAgICAgICAgZXhwZWN0Q29kZT86IHN0cmluZzsKICAgICAgICBleHBlY3RJbnZhbGlkPzogYm9vbGVhbjsKICAgICAgICBtZXRyaWNzPzogYm9vbGVhbjsKICAgICAgICAvLyBDb21tYW5kZXIgbWF0ZXJpYWxpemVzIGEgbmVnYXRlZCBmbGFnIGFzIGEgY29uY3JldGUgYm9vbGVhbjogdHJ1ZSBieQogICAgICAgIC8vIGRlZmF1bHQsIGZhbHNlIHdoZW4gLS1uby1vcGVuIGlzIHBhc3NlZC4KICAgICAgICBvcGVuOiBib29sZWFuOwogICAgICB9CiAgICApID0+IHsKICAgICAgLy8gQSBxdW90ZWQgZ2xvYiAoInBhcnRzLyouYnJlcC50cyIpIGFycml2ZXMgYXMgb25lIGxpdGVyYWwgYXJnLCBhIHNoZWxsLWV4cGFuZGVkIG9uZSBhcyBtYW55OwogICAgICAvLyBnbG9iU3luYyBoYW5kbGVzIGJvdGggKGEgbGl0ZXJhbCBmaWxlbmFtZSBtYXRjaGVzIGl0c2VsZiksIGZhbGxpbmcgYmFjayB0byB0aGUgcmF3IGFyZyBzbyBhCiAgICAgIC8vIG1pc3NpbmcgcGF0aCBzdGlsbCBydW5zIGFuZCByZXBvcnRzIGl0cyBvd24gZXJyb3IuCiAgICAgIGNvbnN0IHRhcmdldHMgPSBbCiAgICAgICAgLi4ubmV3IFNldCgKICAgICAgICAgIGZpbGVzLmZsYXRNYXAoKGYpID0+IHsKICAgICAgICAgICAgY29uc3QgbSA9IGdsb2JTeW5jKGYpOwogICAgICAgICAgICByZXR1cm4gbS5sZW5ndGggPyBtIDogW2ZdOwogICAgICAgICAgfSkKICAgICAgICApLAogICAgICBdLm1hcCgocCkgPT4gcmVzb2x2ZShwKSk7CgogICAgICBpZiAodGFyZ2V0cy5sZW5ndGggPiAxKSB7CiAgICAgICAgLy8gQmF0Y2g6IHZhbGlkaXR5LW9ubHkgSlNPTiBhcnJheS4gVGhlIHNpbmdsZS1maWxlIGFydGlmYWN0IGZsYWdzIGRvbid0IGFwcGx5LgogICAgICAgIGlmICgKICAgICAgICAgIG9wdHMuc3RlcCB8fAogICAgICAgICAgb3B0cy5zZXJ2ZSB8fAogICAgICAgICAgb3B0cy5zbmFwc2hvdCB8fAogICAgICAgICAgb3B0cy5nbGIgfHwKICAgICAgICAgIG9wdHMuZXhwZWN0Q29kZSB8fAogICAgICAgICAgb3B0cy5leHBlY3RJbnZhbGlkCiAgICAgICAgKSB7CiAgICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgKICAgICAgICAgICAgJ2JhdGNoIG1vZGU6IC0tc3RlcC8tLWdsYi8tLXNlcnZlLy0tc25hcHNob3QvLS1leHBlY3QtY29kZS8tLWV4cGVjdC1pbnZhbGlkIGlnbm9yZWQgKHNpbmdsZS1maWxlIG9ubHkpXG4nCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBjb25zdCByZXN1bHRzOiB7IGZpbGU6IHN0cmluZzsgb2s6IGJvb2xlYW47IHJlcG9ydDogVmVyaWZ5UmVwb3J0IH1bXSA9IFtdOwogICAgICAgIGZvciAoY29uc3QgZiBvZiB0YXJnZXRzKSB7CiAgICAgICAgICBjb25zdCB7IHJlcG9ydCwgc2hhcGUgfSA9IGF3YWl0IHJ1blBhcnQoZiwgewogICAgICAgICAgICBjaGVjazogQm9vbGVhbihvcHRzLmNoZWNrKSwKICAgICAgICAgICAgbWV0cmljczogQm9vbGVhbihvcHRzLm1ldHJpY3MpLAogICAgICAgICAgfSk7CiAgICAgICAgICBkaXNwb3NlU2hhcGUoc2hhcGUpOwogICAgICAgICAgcmVzdWx0cy5wdXNoKHsgZmlsZTogZiwgb2s6IHJlcG9ydE9rKHJlcG9ydCksIHJlcG9ydCB9KTsKICAgICAgICB9CiAgICAgICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KHJlc3VsdHMsIG51bGwsIDIpOwogICAgICAgIGlmIChvcHRzLmpzb24gJiYgb3B0cy5qc29uICE9PSAnLScpIHdyaXRlRmlsZVN5bmMob3B0cy5qc29uLCBqc29uKTsKICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShqc29uICsgJ1xuJyk7CiAgICAgICAgaWYgKHJlc3VsdHMuc29tZSgocikgPT4gIXIub2spKSBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGNvbnN0IGZpbGUgPSB0YXJnZXRzWzBdID8/IGZpbGVzWzBdID8/ICcnOwogICAgICAvLyBUaGUgV0FTTSB2aWV3ZXIgbG9hZHMgYSBDQUQgZmlsZSAoaXQgY2FuJ3QgcnVuIGEgLmJyZXAudHMpLCBzbyAtLXNuYXBzaG90Ly0tc2VydmUKICAgICAgLy8gc3RhZ2UgdGhlIHByaW1hcnkgU1RFUCBhbmQgcG9pbnQgdGhlIHZpZXdlciBhdCBpdCB2aWEgP2Rpcj0mZmlsZT0uIC0tZ2xiIGlzIGl0cyBvd24gYXJ0aWZhY3QuCiAgICAgIGNvbnN0IHdhbnRTdGVwID0gQm9vbGVhbihvcHRzLnN0ZXApIHx8IEJvb2xlYW4ob3B0cy5zbmFwc2hvdCkgfHwgQm9vbGVhbihvcHRzLnNlcnZlKTsKICAgICAgY29uc3QgeyByZXBvcnQsIHN0ZXAsIGdsYiwgc2hhcGUgfSA9IGF3YWl0IHJ1blBhcnQocmVzb2x2ZShmaWxlKSwgewogICAgICAgIHN0ZXA6IHdhbnRTdGVwLAogICAgICAgIGdsYjogQm9vbGVhbihvcHRzLmdsYiksCiAgICAgICAgY2hlY2s6IEJvb2xlYW4ob3B0cy5jaGVjayksCiAgICAgICAgLy8gQSBzbmFwc2hvdCBmZWVkcyB0aGUgZGVzaWduIGp1ZGdlLCBzbyBjb21wdXRlIG1ldHJpY3MgdG9vIChib3JlcyDihpIgYW4gYWltZWQgc2VjdGlvbiBzaG90KS4KICAgICAgICBtZXRyaWNzOiBCb29sZWFuKG9wdHMubWV0cmljcykgfHwgQm9vbGVhbihvcHRzLnNuYXBzaG90KSwKICAgICAgfSk7CiAgICAgIGxldCBzdGVwUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0cy5zdGVwOwogICAgICB0cnkgewogICAgICAgIGlmIChvcHRzLmdsYiAmJiBnbGIpIHdyaXRlRmlsZVN5bmMob3B0cy5nbGIsIEJ1ZmZlci5mcm9tKGdsYikpOwoKICAgICAgICBpZiAod2FudFN0ZXAgJiYgc3RlcCkgewogICAgICAgICAgc3RlcFBhdGggPSBvcHRzLnN0ZXAgPz8gam9pbih0bXBkaXIoKSwgYGJyZXAtJHtiYXNlbmFtZShmaWxlKX0uc3RlcGApOwogICAgICAgICAgd3JpdGVGaWxlU3luYyhzdGVwUGF0aCwgQnVmZmVyLmZyb20oc3RlcCkpOwogICAgICAgIH0KICAgICAgICBpZiAob3B0cy5zbmFwc2hvdCAmJiBzdGVwUGF0aCkgewogICAgICAgICAgY29uc3Qgc2hvb3QgPSBhd2FpdCBsb2FkU25hcHNob3RTaG9vdCgpOyAvLyBsYXp5OiBrZWVwcyBwdXBwZXRlZXIgb2ZmIHRoZSBkZWZhdWx0IHBhdGgKICAgICAgICAgIGlmIChzaG9vdCkgewogICAgICAgICAgICBjb25zdCBzZWN0aW9uID0gYWltZWRTZWN0aW9uKAogICAgICAgICAgICAgIHJlcG9ydC5tYW51ZmFjdHVyYWJpbGl0eT8uYm9yZXMgPz8gW10sCiAgICAgICAgICAgICAgcmVwb3J0Lm1lYXN1cmVtZW50cy5ib3VuZHMKICAgICAgICAgICAgKTsKICAgICAgICAgICAgY29uc3QgbWFya3MgPSBmZWF0dXJlTWFya3MocmVwb3J0LmJvZGllcyA/PyBbXSwgcmVwb3J0Lm1hbnVmYWN0dXJhYmlsaXR5Py5ib3JlcyA/PyBbXSk7CiAgICAgICAgICAgIGNvbnN0IHsgcG5ncyB9ID0gYXdhaXQgc2hvb3QoewogICAgICAgICAgICAgIGZpbGU6IHN0ZXBQYXRoLAogICAgICAgICAgICAgIG91dERpcjogb3B0cy5zbmFwc2hvdCwKICAgICAgICAgICAgICAuLi4oc2VjdGlvbiA/IHsgc2VjdGlvbiB9IDoge30pLAogICAgICAgICAgICAgIC4uLihtYXJrcy5sZW5ndGggPiAwID8geyBtYXJrcyB9IDoge30pLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gRGlhZ25vc3RpYyBwYXRocyBnbyB0byBzdGRlcnIg4oCUIHN0ZG91dCBzdGF5cyBhIHNpbmdsZSBjbGVhbiBKU09OIGRvY3VtZW50LgogICAgICAgICAgICBmb3IgKGNvbnN0IHAgb2YgcG5ncykgcHJvY2Vzcy5zdGRlcnIud3JpdGUoYHNuYXBzaG90OiAke3B9XG5gKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKG9wdHMuc25hcHNob3QpIHsKICAgICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdzbmFwc2hvdCBza2lwcGVkOiBTVEVQIGV4cG9ydCBwcm9kdWNlZCBubyBhcnRpZmFjdFxuJyk7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgcHVzaEVycm9yKHJlcG9ydCwgeyBtZXNzYWdlOiBgYXJ0aWZhY3Qgd3JpdGUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWAgfSk7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgLy8gVGhlIHNoYXBlIGlzIGEgbGl2ZSBXQVNNIGhhbmRsZTsgcmVsZWFzZSBpdCBiZWZvcmUgdGhlIHNlcnZlciB0YWtlcyBvdmVyICh0aGUKICAgICAgICAvLyAtLXNlcnZlIHBhdGggc3RheXMgcnVubmluZywgc28gbGVha2luZyBoZXJlIHdvdWxkIHBlcnNpc3QgZm9yIHRoZSBzZXJ2ZXIncyBsaWZldGltZSkuCiAgICAgICAgZGlzcG9zZVNoYXBlKHNoYXBlKTsKICAgICAgfQogICAgICAvLyBTZXJpYWxpemUgb25jZSBhZnRlciBhbGwgYXJ0aWZhY3Qgd3JpdGVzIHNvIHRoZSAtLWpzb24gZmlsZSBhbmQgc3Rkb3V0CiAgICAgIC8vIHJlZmxlY3QgdGhlIHNhbWUgcmVwb3J0IChpbmNsLiBhbnkgImFydGlmYWN0IHdyaXRlIGZhaWxlZCIgZXJyb3IpLgogICAgICBjb25zdCBqc29uID0gc2VyaWFsaXplUmVwb3J0KHJlcG9ydCk7CiAgICAgIC8vIGAtLWpzb24gLWAgaXMgc2F0aXNmaWVkIGJ5IHRoZSBzdGRvdXQgd3JpdGUgYmVsb3c7IG9ubHkgYSByZWFsIHBhdGggd3JpdGVzIGEgZmlsZS4KICAgICAgaWYgKG9wdHMuanNvbiAmJiBvcHRzLmpzb24gIT09ICctJykgd3JpdGVGaWxlU3luYyhvcHRzLmpzb24sIGpzb24pOwogICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShqc29uICsgJ1xuJyk7CiAgICAgIGlmICghcmVwb3J0T2socmVwb3J0KSkgcHJvY2Vzcy5leGl0Q29kZSA9IDE7CiAgICAgIC8vIEZpeHR1cmUgYXNzZXJ0aW9ucyAoUGhhc2U6IHZlcmlmeS1oZWFsIHByZWNpc2lvbi9yZWNhbGwpIG92ZXJyaWRlIHRoZSBub3JtYWwgZXhpdCBjb2RlOgogICAgICAvLyBhIGtub3duLWJhZCBwYXJ0IG11c3QgZmFpbCB0aGUgKnJpZ2h0KiB3YXkuIENvZGVzIGNvbWUgZnJvbSB0aGUga2VybmVsL2F1dGhvcmluZyBlcnJvcnMsCiAgICAgIC8vIG5vdCB0aGUgaGludCB0YWJsZSwgc28gdGhpcyBtZWFzdXJlcyB0aGUgdmVyaWZpZXIsIG5vdCBpdHMgcHJvc2UuCiAgICAgIGlmIChvcHRzLmV4cGVjdEludmFsaWQgfHwgb3B0cy5leHBlY3RDb2RlKSB7CiAgICAgICAgLy8gaGludHMgYXJlIGRlcml2ZWQgZnJvbSBlcnJvckluZm9zLCBzbyB0aGUgY29kZXMgbGl2ZSB0aGVyZTsgZGVkdXBlIHRvIGtlZXAgdGhlIGxpbmUgY2xlYW4uCiAgICAgICAgY29uc3QgY29kZXMgPSBbCiAgICAgICAgICAuLi5uZXcgU2V0KHJlcG9ydC5lcnJvckluZm9zLm1hcCgoZSkgPT4gZS5jb2RlKS5maWx0ZXIoKGMpOiBjIGlzIHN0cmluZyA9PiBCb29sZWFuKGMpKSksCiAgICAgICAgXTsKICAgICAgICBjb25zdCB2YWxpZCA9IHJlcG9ydE9rKHJlcG9ydCk7CiAgICAgICAgY29uc3QgcGFzcyA9CiAgICAgICAgICAoIW9wdHMuZXhwZWN0SW52YWxpZCB8fCAhdmFsaWQpICYmICghb3B0cy5leHBlY3RDb2RlIHx8IGNvZGVzLmluY2x1ZGVzKG9wdHMuZXhwZWN0Q29kZSkpOwogICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBwYXNzID8gMCA6IDE7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoCiAgICAgICAgICBgZXhwZWN0OiAke3Bhc3MgPyAnUEFTUycgOiAnRkFJTCd9YCArCiAgICAgICAgICAgIChvcHRzLmV4cGVjdENvZGUgPyBgIGNvZGU9JHtvcHRzLmV4cGVjdENvZGV9YCA6ICcnKSArCiAgICAgICAgICAgIChvcHRzLmV4cGVjdEludmFsaWQgPyAnIGludmFsaWQnIDogJycpICsKICAgICAgICAgICAgYCAob2s9JHt2YWxpZH0sIGNvZGVzPSR7Y29kZXMuam9pbignLCcpIHx8ICdub25lJ30pXG5gCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgd2lsbFNlcnZlID0gQm9vbGVhbihvcHRzLnNlcnZlKSAmJiBzdGVwUGF0aCAhPT0gdW5kZWZpbmVkICYmIHJlcG9ydE9rKHJlcG9ydCk7CiAgICAgIGlmICh3aWxsU2VydmUgJiYgc3RlcFBhdGgpIHsKICAgICAgICBjb25zdCB7IHNlcnZlIH0gPSBhd2FpdCBpbXBvcnQoJy4uL3NuYXBzaG90L3NlcnZlLmpzJyk7IC8vIGxhenk6IG5vIHNlcnZlciBkZXBzIG9uIHRoZSBkZWZhdWx0IHBhdGgKICAgICAgICBjb25zdCB7IHVybCwgcmV1c2VkIH0gPSBhd2FpdCBzZXJ2ZSh7IGZpbGU6IHN0ZXBQYXRoIH0pOyAvLyBidWlsZHMgYSA/ZGlyPSZmaWxlPSBVUkw7IHNlcnZlciBydW5zIHVudGlsIEN0cmwtQwogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGB2aWV3ZXI6ICR7dXJsfVxuYCk7CiAgICAgICAgLy8gQXV0by1vcGVuIG9ubHkgZm9yIGEgZnJlc2hseSBzdGFydGVkIHNlcnZlciAoYSByZXVzZWQgb25lIGFscmVhZHkgaGFzCiAgICAgICAgLy8gYSB0YWIpIGluIGFuIGludGVyYWN0aXZlIHNlc3Npb247IGAtLW5vLW9wZW5gIChvcHRzLm9wZW4gPT09IGZhbHNlKQogICAgICAgIC8vIGFsd2F5cyBzdXBwcmVzc2VzIGl0LgogICAgICAgIGlmICghcmV1c2VkICYmIG9wdHMub3BlbiAmJiBzaG91bGRBdXRvT3BlbigpKSB7CiAgICAgICAgICBvcGVuQnJvd3Nlcih1cmwpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICk7Cgpwcm9ncmFtCiAgLmNvbW1hbmQoJ21lYXN1cmUnKQogIC5hcmd1bWVudCgnPGE+JywgJ3BhdGggdG8gYSAuYnJlcC50cyBtb2R1bGUnKQogIC5hcmd1bWVudCgnW2JdJywgJ29wdGlvbmFsIHNlY29uZCBtb2R1bGU7IGlmIGdpdmVuLCBtZWFzdXJlcyBkaXN0YW5jZSBiZXR3ZWVuIHRoZSB0d28gcGFydHMnKQogIC5hY3Rpb24oYXN5bmMgKGE6IHN0cmluZywgYj86IHN0cmluZykgPT4gewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuTWVhc3VyZShyZXNvbHZlKGEpLCBiID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByZXNvbHZlKGIpKTsKICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKAogICAgICBKU09OLnN0cmluZ2lmeSh7IG9rOiByZXN1bHQuZXJyb3JzLmxlbmd0aCA9PT0gMCwgLi4ucmVzdWx0IH0sIG51bGwsIDIpICsgJ1xuJwogICAgKTsKICAgIGlmIChyZXN1bHQuZXJyb3JzLmxlbmd0aCA+IDApIHByb2Nlc3MuZXhpdENvZGUgPSAxOwogIH0pOwoKcHJvZ3JhbQogIC5jb21tYW5kKCdkaWZmJykKICAuYXJndW1lbnQoJzxhPicsICdwYXRoIHRvIHRoZSBiYXNlbGluZSAuYnJlcC50cyBtb2R1bGUnKQogIC5hcmd1bWVudCgnPGI+JywgJ3BhdGggdG8gdGhlIGNvbXBhcmlzb24gLmJyZXAudHMgbW9kdWxlJykKICAuYWN0aW9uKGFzeW5jIChhOiBzdHJpbmcsIGI6IHN0cmluZykgPT4gewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuRGlmZihyZXNvbHZlKGEpLCByZXNvbHZlKGIpKTsKICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKAogICAgICBKU09OLnN0cmluZ2lmeSh7IG9rOiByZXN1bHQuZXJyb3JzLmxlbmd0aCA9PT0gMCwgLi4ucmVzdWx0IH0sIG51bGwsIDIpICsgJ1xuJwogICAgKTsKICAgIGlmIChyZXN1bHQuZXJyb3JzLmxlbmd0aCA+IDApIHByb2Nlc3MuZXhpdENvZGUgPSAxOwogIH0pOwoKcHJvZ3JhbQogIC5jb21tYW5kKCdzbmFwc2hvdCcpCiAgLmFyZ3VtZW50KAogICAgJzxmaWxlPicsCiAgICAncGF0aCB0byBhIC5icmVwLnRzIG1vZHVsZTsgcmVuZGVycyBpc28vZnJvbnQvdG9wL3JpZ2h0IFBOR3MgKG5vIHJlcG9ydCBhc3NlcnRpb25zKScKICApCiAgLm9wdGlvbignLS1vdXQgPGRpcj4nLCAnb3V0cHV0IGRpcmVjdG9yeSBmb3IgdGhlIFBOR3MgKGRlZmF1bHQgPGZpbGU+LXNob3RzKScpCiAgLm9wdGlvbignLS1sYWJlbCA8dGFnPicsICdzdWJmb2xkZXIgZm9yIHRoaXMgcmVuZGVyIHNldCAoZS5nLiBwcmUsIHBvc3QpIGZvciBBL0IgcGFpcmluZycpCiAgLmFjdGlvbihhc3luYyAoZmlsZTogc3RyaW5nLCBvcHRzOiB7IG91dD86IHN0cmluZzsgbGFiZWw/OiBzdHJpbmcgfSkgPT4gewogICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlKGZpbGUpOwogICAgY29uc3QgYmFzZSA9IG9wdHMub3V0ID8gcmVzb2x2ZShvcHRzLm91dCkgOiBgJHtyZXNvbHZlZH0tc2hvdHNgOwogICAgY29uc3Qgb3V0RGlyID0gb3B0cy5sYWJlbCA/IGpvaW4oYmFzZSwgb3B0cy5sYWJlbCkgOiBiYXNlOwogICAgY29uc3QgeyByZXBvcnQsIHN0ZXAsIHNoYXBlIH0gPSBhd2FpdCBydW5QYXJ0KHJlc29sdmVkLCB7IHN0ZXA6IHRydWUsIG1ldHJpY3M6IHRydWUgfSk7CiAgICB0cnkgewogICAgICBpZiAoIXN0ZXApIHsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnc25hcHNob3Q6IHBhcnQgcHJvZHVjZWQgbm8gU1RFUCDigJQgbm90aGluZyB0byByZW5kZXJcbicpOwogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHNlcmlhbGl6ZVJlcG9ydChyZXBvcnQpICsgJ1xuJyk7CiAgICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHN0ZXBQYXRoID0gam9pbih0bXBkaXIoKSwgYGJyZXAtc25hcC0ke2Jhc2VuYW1lKGZpbGUpfS5zdGVwYCk7CiAgICAgIHdyaXRlRmlsZVN5bmMoc3RlcFBhdGgsIEJ1ZmZlci5mcm9tKHN0ZXApKTsKICAgICAgY29uc3Qgc2hvb3QgPSBhd2FpdCBsb2FkU25hcHNob3RTaG9vdCgpOwogICAgICBpZiAoIXNob290KSB7CiAgICAgICAgLy8gcHVwcGV0ZWVyIGFic2VudDogbG9hZFNuYXBzaG90U2hvb3Qgc2V0IGV4aXRDb2RlICsgc3RkZXJyOyBzdGlsbCBlbWl0IHRoZSByZXBvcnQgc28gYQogICAgICAgIC8vIGNhbGxlciBwYXJzaW5nIHN0ZG91dCBnZXRzIHRoZSB2YWxpZGl0eSBpbmZvIHJhdGhlciB0aGFuIGFuIGVtcHR5IGJ1ZmZlci4KICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShzZXJpYWxpemVSZXBvcnQocmVwb3J0KSArICdcbicpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBmcmVzaDogYSBwcml2YXRlIGVwaGVtZXJhbCByZW5kZXIgc2VydmVyIHNvIHBhcmFsbGVsIHNuYXBzaG90cyBkb24ndCBjb250ZW5kIG9uIDo3MzczLgogICAgICBjb25zdCBzZWN0aW9uID0gYWltZWRTZWN0aW9uKAogICAgICAgIHJlcG9ydC5tYW51ZmFjdHVyYWJpbGl0eT8uYm9yZXMgPz8gW10sCiAgICAgICAgcmVwb3J0Lm1lYXN1cmVtZW50cy5ib3VuZHMKICAgICAgKTsKICAgICAgY29uc3QgbWFya3MgPSBmZWF0dXJlTWFya3MocmVwb3J0LmJvZGllcyA/PyBbXSwgcmVwb3J0Lm1hbnVmYWN0dXJhYmlsaXR5Py5ib3JlcyA/PyBbXSk7CiAgICAgIGNvbnN0IHsgcG5ncyB9ID0gYXdhaXQgc2hvb3QoewogICAgICAgIGZpbGU6IHN0ZXBQYXRoLAogICAgICAgIG91dERpciwKICAgICAgICBmcmVzaDogdHJ1ZSwKICAgICAgICAuLi4oc2VjdGlvbiA/IHsgc2VjdGlvbiB9IDoge30pLAogICAgICAgIC4uLihtYXJrcy5sZW5ndGggPiAwID8geyBtYXJrcyB9IDoge30pLAogICAgICB9KTsKICAgICAgZm9yIChjb25zdCBwIG9mIHBuZ3MpIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAke3B9XG5gKTsKICAgIH0gZmluYWxseSB7CiAgICAgIGRpc3Bvc2VTaGFwZShzaGFwZSk7CiAgICB9CiAgfSk7Cgpwcm9ncmFtCiAgLmNvbW1hbmQoJ2luaXQnKQogIC5hcmd1bWVudCgnPG5hbWU+JywgJ3BhcnQgbmFtZTsgc2NhZmZvbGRzIDxuYW1lPi5icmVwLnRzICsgdHNjb25maWcuanNvbiArIFJFQURNRS5tZCcpCiAgLm9wdGlvbignLS1vdXQgPGRpcj4nLCAndGFyZ2V0IGRpcmVjdG9yeSAoZGVmYXVsdHMgdG8gLi88bmFtZT4pJykKICAuYWN0aW9uKChuYW1lOiBzdHJpbmcsIG9wdHM6IHsgb3V0Pzogc3RyaW5nIH0pID0+IHsKICAgIGNvbnN0IGRpciA9IHJlc29sdmUob3B0cy5vdXQgPz8gbmFtZSk7CiAgICBjb25zdCByZXN1bHQgPSBzY2FmZm9sZFBhcnQobmFtZSwgZGlyKTsKICAgIGZvciAoY29uc3QgZiBvZiByZXN1bHQuZmlsZXMpIHsKICAgICAgY29uc3QgdGFnID0gZi5jcmVhdGVkID8gJ2NyZWF0ZWQnIDogJ2V4aXN0cyAoa2VwdCknOwogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShgJHt0YWd9OiAke2YucGF0aH1cbmApOwogICAgfQogICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSArICdcbicpOwogIH0pOwoKcHJvZ3JhbQogIC5jb21tYW5kKCd3YXRjaCcpCiAgLmFyZ3VtZW50KCc8ZmlsZT4nLCAncGF0aCB0byBhIC5icmVwLnRzIG1vZHVsZTsgcmUtdmVyaWZpZXMgb24gZWFjaCBzYXZlIHVudGlsIEN0cmwtQycpCiAgLmFjdGlvbigoZmlsZTogc3RyaW5nKSA9PiB7CiAgICBjb25zdCBwYXRoID0gcmVzb2x2ZShmaWxlKTsKICAgIC8vIFJlcnVucyBpbXBvcnQgd2l0aCBhIGZyZXNoIGNhY2hlLWJ1c3RpbmcgcXVlcnkg4oCUIHRoZSBFU00gY2FjaGUgaXMga2V5ZWQgYnkgVVJMLCBzbwogICAgLy8gd2l0aG91dCBpdCBldmVyeSByZXJ1biB3b3VsZCByZS1leGVjdXRlIHRoZSBmaXJzdCB2ZXJzaW9uIG9mIHRoZSBwYXJ0IGZvcmV2ZXIuCiAgICBjb25zdCBydW4gPSBhc3luYyAoZnJlc2g6IGJvb2xlYW4pID0+IHsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCB7IHJlcG9ydCwgc2hhcGUgfSA9IGF3YWl0IHJ1blBhcnQocGF0aCwgeyBmcmVzaEltcG9ydDogZnJlc2ggfSk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHNlcmlhbGl6ZVJlcG9ydChyZXBvcnQpICsgJ1xuJyk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIGRpc3Bvc2VTaGFwZShzaGFwZSk7IC8vIGxpdmUgV0FTTSBoYW5kbGU7IHRoZSBsb29wIHJ1bnMgaW5kZWZpbml0ZWx5CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoYHdhdGNoIHJ1biBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9XG5gKTsKICAgICAgfQogICAgfTsKICAgIC8vIFNlcmlhbGl6ZSBydW5zOiBhIHNhdmUgbGFuZGluZyBtaWQtdmVyaWZ5IG11c3Qgbm90IHN0YXJ0IGEgc2Vjb25kIHJ1blBhcnQgb24gdGhlCiAgICAvLyBzaGFyZWQga2VybmVsIChyZXBvcnRzIHdvdWxkIGludGVybGVhdmUgb3V0IG9mIG9yZGVyKS4gRWRpdHMgZHVyaW5nIGEgcnVuIGNvYWxlc2NlCiAgICAvLyBpbnRvIGV4YWN0bHkgb25lIHRyYWlsaW5nIHJlcnVuLgogICAgbGV0IGluRmxpZ2h0ID0gZmFsc2U7CiAgICBsZXQgcmVydW5RdWV1ZWQgPSBmYWxzZTsKICAgIGNvbnN0IHN0YXJ0ID0gKGZyZXNoOiBib29sZWFuKTogdm9pZCA9PiB7CiAgICAgIGluRmxpZ2h0ID0gdHJ1ZTsKICAgICAgdm9pZCBydW4oZnJlc2gpLmZpbmFsbHkoKCkgPT4gewogICAgICAgIGluRmxpZ2h0ID0gZmFsc2U7CiAgICAgICAgaWYgKHJlcnVuUXVldWVkKSB7CiAgICAgICAgICByZXJ1blF1ZXVlZCA9IGZhbHNlOwogICAgICAgICAgc3RhcnQodHJ1ZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH07CiAgICBjb25zdCBzY2hlZHVsZSA9ICgpOiB2b2lkID0+IHsKICAgICAgaWYgKGluRmxpZ2h0KSB7CiAgICAgICAgcmVydW5RdWV1ZWQgPSB0cnVlOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBzdGFydCh0cnVlKTsKICAgIH07CiAgICBjb25zdCB7IHRyaWdnZXIgfSA9IGRlYm91bmNlKHNjaGVkdWxlLCBERUZBVUxUX0RFQk9VTkNFX01TKTsKICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGB3YXRjaGluZyAke3BhdGh9IChDdHJsLUMgdG8gc3RvcClcbmApOwogICAgc3RhcnQoZmFsc2UpOyAvLyBpbml0aWFsIHZlcmlmeQogICAgLy8gV2F0Y2ggdGhlIHdob2xlIHByb2plY3QgdHJlZSAobmVhcmVzdCBwYWNrYWdlLmpzb24vdHNjb25maWcuanNvbiBhYm92ZSB0aGUgZW50cnkpOgogICAgLy8gZWRpdG9ycyBvZnRlbiByZXBsYWNlIGEgZmlsZSAocmVuYW1lKSBvbiBzYXZlLCB3aGljaCBkcm9wcyBhIHdhdGNoZXIgYm91bmQgdG8gdGhlCiAgICAvLyBpbm9kZSBpdHNlbGYg4oCUIGFuZCBhIG11bHRpLWZpbGUgcHJvamVjdCBtdXN0IHJlLXZlcmlmeSB3aGVuIGFueSBzb3VyY2UgT1IgdGhlIHJvb3QKICAgIC8vIHRzY29uZmlnIGNoYW5nZXMsIG5vdCBqdXN0IGZpbGVzIGJlc2lkZSB0aGUgZW50cnkuCiAgICBjb25zdCBzdG9wV2F0Y2hpbmcgPSB3YXRjaFRyZWUod2F0Y2hSb290Rm9yKHBhdGgpLCAoZmlsZW5hbWUpID0+IHsKICAgICAgaWYgKGlzV2F0Y2hSZWxldmFudChmaWxlbmFtZSkpIHRyaWdnZXIoKTsKICAgIH0pOwogICAgY29uc3Qgc3RvcCA9ICgpID0+IHsKICAgICAgc3RvcFdhdGNoaW5nKCk7CiAgICAgIHByb2Nlc3MuZXhpdCgwKTsKICAgIH07CiAgICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBzdG9wKTsKICAgIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCBzdG9wKTsgLy8gc3VwZXJ2aXNvcnMgKGRvY2tlciBzdG9wLCBzeXN0ZW1jdGwpIHNlbmQgU0lHVEVSTQogIH0pOwoKcHJvZ3JhbQogIC5jb21tYW5kKCdleHBvcnQnKQogIC5hcmd1bWVudCgnPGZpbGU+JywgJ3BhdGggdG8gYSAuYnJlcC50cyBtb2R1bGUnKQogIC5vcHRpb24oJy0tc3RlcCcsICd3cml0ZSBhIFNURVAgYXJ0aWZhY3QnKQogIC5vcHRpb24oJy0tZ2xiJywgJ3dyaXRlIGEgR0xCIGFydGlmYWN0JykKICAub3B0aW9uKCctLXN0bCcsICd3cml0ZSBhbiBTVEwgYXJ0aWZhY3QnKQogIC5vcHRpb24oJy0tYWxsJywgJ3dyaXRlIFNURVAgKyBHTEIgKyBTVEwnKQogIC5vcHRpb24oJy0tb3V0IDxkaXI+JywgJ291dHB1dCBkaXJlY3RvcnknLCAnLicpCiAgLmFjdGlvbigKICAgIGFzeW5jICgKICAgICAgZmlsZTogc3RyaW5nLAogICAgICBvcHRzOiB7IHN0ZXA/OiBib29sZWFuOyBnbGI/OiBib29sZWFuOyBzdGw/OiBib29sZWFuOyBhbGw/OiBib29sZWFuOyBvdXQ6IHN0cmluZyB9CiAgICApID0+IHsKICAgICAgY29uc3QgZm9ybWF0cyA9IG9wdHMuYWxsCiAgICAgICAgPyB7IHN0ZXA6IHRydWUsIGdsYjogdHJ1ZSwgc3RsOiB0cnVlIH0KICAgICAgICA6IHsgc3RlcDogQm9vbGVhbihvcHRzLnN0ZXApLCBnbGI6IEJvb2xlYW4ob3B0cy5nbGIpLCBzdGw6IEJvb2xlYW4ob3B0cy5zdGwpIH07CiAgICAgIGlmICghZm9ybWF0cy5zdGVwICYmICFmb3JtYXRzLmdsYiAmJiAhZm9ybWF0cy5zdGwpIHsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnbm8gZm9ybWF0cyByZXF1ZXN0ZWQg4oCUIHBhc3MgLS1zdGVwLy0tZ2xiLy0tc3RsIG9yIC0tYWxsXG4nKTsKICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhwb3J0UGFydChyZXNvbHZlKGZpbGUpLCBmb3JtYXRzLCByZXNvbHZlKG9wdHMub3V0KSk7CiAgICAgIGZvciAoY29uc3QgcCBvZiByZXN1bHQud3JpdHRlbikgcHJvY2Vzcy5zdGRlcnIud3JpdGUoYHdyb3RlOiAke3B9XG5gKTsKICAgICAgZm9yIChjb25zdCBlIG9mIHJlc3VsdC5lcnJvcnMpIHByb2Nlc3Muc3RkZXJyLndyaXRlKGBlcnJvcjogJHtlfVxuYCk7CiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKAogICAgICAgIEpTT04uc3RyaW5naWZ5KHsgb2s6IHJlc3VsdC5vaywgd3JpdHRlbjogcmVzdWx0LndyaXR0ZW4sIGVycm9yczogcmVzdWx0LmVycm9ycyB9LCBudWxsLCAyKSArCiAgICAgICAgICAnXG4nCiAgICAgICk7CiAgICAgIGlmICghcmVzdWx0Lm9rKSBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICAgIH0KICApOwoKLy8gT25seSBkcml2ZSB0aGUgQ0xJIHdoZW4gcnVuIGFzIHRoZSBlbnRyeSBzY3JpcHQsIHNvIHRlc3RzIGNhbiBpbXBvcnQgdGhlCi8vIGd1YXJkZWQgbG9hZGVycyB3aXRob3V0IGNvbW1hbmRlciBwYXJzaW5nIHRoZSB0ZXN0IHJ1bm5lcidzIGFyZ3YuCi8vIFJlc29sdmUgc3ltbGlua3Mgb24gYm90aCBzaWRlczogdGhlIG5wbS1pbnN0YWxsZWQgYmluIChub2RlX21vZHVsZXMvLmJpbi9icmVwanMpCi8vIGlzIGEgc3ltbGluaywgc28gcHJvY2Vzcy5hcmd2WzFdIHdvdWxkIG90aGVyd2lzZSBuZXZlciBlcXVhbCB0aGUgcmVhbCBtb2R1bGUgcGF0aC4KZXhwb3J0IGZ1bmN0aW9uIGlzRW50cnlwb2ludChhcmd2MTogc3RyaW5nIHwgdW5kZWZpbmVkLCBtb2R1bGVVcmw6IHN0cmluZyk6IGJvb2xlYW4gewogIGlmICghYXJndjEpIHJldHVybiBmYWxzZTsKICB0cnkgewogICAgcmV0dXJuIHJlYWxwYXRoU3luYyhhcmd2MSkgPT09IHJlYWxwYXRoU3luYyhmaWxlVVJMVG9QYXRoKG1vZHVsZVVybCkpOwogIH0gY2F0Y2ggewogICAgcmV0dXJuIGZhbHNlOwogIH0KfQoKaWYgKGlzRW50cnlwb2ludChwcm9jZXNzLmFyZ3ZbMV0sIGltcG9ydC5tZXRhLnVybCkpIHsKICB2b2lkIHByb2dyYW0ucGFyc2VBc3luYygpOwp9Cg==", "" + import.meta.url));
47
47
  if (existsSync(builtJs)) return builtJs;
48
- return fileURLToPath(new URL("data:video/mp2t;base64,IyEvdXNyL2Jpbi9lbnYgbm9kZQppbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJzsKaW1wb3J0IHsgd3JpdGVGaWxlU3luYywgd2F0Y2ggYXMgZnNXYXRjaCwgcmVhbHBhdGhTeW5jLCBnbG9iU3luYyB9IGZyb20gJ25vZGU6ZnMnOwppbXBvcnQgeyByZXNvbHZlLCBqb2luLCBiYXNlbmFtZSwgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7CmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnOwppbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnOwppbXBvcnQgeyBydW5QYXJ0IH0gZnJvbSAnLi4vdmVyaWZ5L3J1blBhcnQuanMnOwppbXBvcnQgeyBwdXNoRXJyb3IsIHJlcG9ydE9rLCBzZXJpYWxpemVSZXBvcnQsIHR5cGUgVmVyaWZ5UmVwb3J0IH0gZnJvbSAnLi4vdmVyaWZ5L3JlcG9ydC5qcyc7CmltcG9ydCB7IHJ1bk1lYXN1cmUgfSBmcm9tICcuLi92ZXJpZnkvbWVhc3VyZS5qcyc7CmltcG9ydCB7IHJ1bkRpZmYgfSBmcm9tICcuLi92ZXJpZnkvZGlmZi5qcyc7CmltcG9ydCB7IHNjYWZmb2xkUGFydCB9IGZyb20gJy4vc2NhZmZvbGQuanMnOwppbXBvcnQgeyBkZWJvdW5jZSwgREVGQVVMVF9ERUJPVU5DRV9NUyB9IGZyb20gJy4vd2F0Y2guanMnOwppbXBvcnQgeyBleHBvcnRQYXJ0IH0gZnJvbSAnLi9leHBvcnRQYXJ0LmpzJzsKaW1wb3J0IHsgb3BlbkJyb3dzZXIsIHNob3VsZEF1dG9PcGVuIH0gZnJvbSAnLi9vcGVuQnJvd3Nlci5qcyc7CmltcG9ydCB7IGRpc3Bvc2VTaGFwZSB9IGZyb20gJy4uL2Rpc3Bvc2VTaGFwZS5qcyc7CmltcG9ydCB0eXBlIHsgc2hvb3QgYXMgU2hvb3RGbiB9IGZyb20gJy4uL3NuYXBzaG90L3Nob290LmpzJzsKaW1wb3J0IHsgYWltZWRTZWN0aW9uLCBmZWF0dXJlTWFya3MgfSBmcm9tICcuLi9zbmFwc2hvdC9haW1pbmcuanMnOwoKLy8gT0NDVCdzIFdBU00gU1RFUCB3cml0ZXIgZW1pdHMgYSAiU3RhdGlzdGljcyBvbiBUcmFuc2ZlciIgYmFubmVyIHZpYSBjb25zb2xlLmxvZwovLyAoRW1zY3JpcHRlbidzIGRlZmF1bHQgc3Rkb3V0IHNpbmspLiBUaGUgQ0xJIG93bnMgc3Rkb3V0IGZvciBtYWNoaW5lLXJlYWRhYmxlIEpTT04sCi8vIHNvIGRpdmVydCB0aGF0IGtlcm5lbCBjaGF0dGVyIHRvIHN0ZGVyciB0byBrZWVwIHN0ZG91dCBhIHNpbmdsZSBjbGVhbiBKU09OIGRvY3VtZW50LgovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZSAtLSByZXJvdXRlIGtlcm5lbCBzdGRvdXQgY2hhdHRlciBvZmYgdGhlIEpTT04gY2hhbm5lbApjb25zb2xlLmxvZyA9ICguLi5hcmdzOiB1bmtub3duW10pID0+IHsKICBwcm9jZXNzLnN0ZGVyci53cml0ZShhcmdzLm1hcChTdHJpbmcpLmpvaW4oJyAnKSArICdcbicpOwp9OwoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRTbmFwc2hvdFNob290KCk6IFByb21pc2U8dHlwZW9mIFNob290Rm4gfCB1bmRlZmluZWQ+IHsKICB0cnkgewogICAgY29uc3QgbW9kID0gYXdhaXQgaW1wb3J0KCcuLi9zbmFwc2hvdC9zaG9vdC5qcycpOwogICAgcmV0dXJuIG1vZC5zaG9vdDsKICB9IGNhdGNoIHsKICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdzbmFwc2hvdHMgbmVlZCBwdXBwZXRlZXIvQ2hyb21lIOKAlCBydW46IG5wbSBpIHB1cHBldGVlclxuJyk7CiAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICAgIHJldHVybiB1bmRlZmluZWQ7CiAgfQp9Cgpjb25zdCBwcm9ncmFtID0gbmV3IENvbW1hbmQoKTsKcHJvZ3JhbS5uYW1lKCdicmVwJyk7Cgpwcm9ncmFtCiAgLmNvbW1hbmQoJ3ZlcmlmeScsIHsgaXNEZWZhdWx0OiB0cnVlIH0pCiAgLmFyZ3VtZW50KAogICAgJzxmaWxlcy4uLj4nLAogICAgJ3BhdGgocykgb3IgZ2xvYihzKSB0byAuYnJlcC50cyBtb2R1bGVzOyBtdWx0aXBsZSBmaWxlcyDihpIgYSBiYXRjaCB2YWxpZGl0eSBKU09OIGFycmF5JwogICkKICAub3B0aW9uKCctLXN0ZXAgPG91dD4nLCAnd3JpdGUgdGhlIHByaW1hcnkgU1RFUCBhcnRpZmFjdCB0byB0aGlzIHBhdGgnKQogIC5vcHRpb24oJy0tZ2xiIDxvdXQ+JywgJ3dyaXRlIGEgZGVyaXZlZCBHTEIgcHJldmlldyB0byB0aGlzIHBhdGgnKQogIC5vcHRpb24oJy0tanNvbiA8b3V0PicsICd3cml0ZSB0aGUgSlNPTiByZXBvcnQgdG8gdGhpcyBwYXRoJykKICAub3B0aW9uKAogICAgJy0tY2hlY2snLAogICAgJ3R5cGUtY2hlY2sgdGhlIHBhcnQgKGFnYWluc3QgYnJlcGpzIHR5cGVzKSBiZWZvcmUgcnVubmluZzsgc2tpcCBleGVjdXRpb24gb24gdHlwZSBlcnJvcnMnCiAgKQogIC5vcHRpb24oJy0tc25hcHNob3QgPGRpcj4nLCAncmVuZGVyIGlzby9mcm9udC90b3AvcmlnaHQgUE5HcyB0byB0aGlzIGRpciAocmVxdWlyZXMgYnVpbHQgdmlld2VyKScpCiAgLm9wdGlvbigKICAgICctLXNlcnZlJywKICAgICdhZnRlciB2ZXJpZnlpbmcsIHN0YXJ0IGEgcHJldmlldyBzZXJ2ZXIgYW5kIHByaW50IGEgP2Rpcj0mZmlsZT0gZGVlcCBsaW5rIChzdGF5cyBydW5uaW5nKScKICApCiAgLm9wdGlvbignLS1uby1vcGVuJywgJ3dpdGggLS1zZXJ2ZSwgZG8gbm90IGF1dG8tb3BlbiB0aGUgYnJvd3NlciAoanVzdCBwcmludCB0aGUgdmlld2VyIFVSTCknKQogIC5vcHRpb24oCiAgICAnLS1leHBlY3QtY29kZSA8Y29kZT4nLAogICAgJ2V4aXQgMCBvbmx5IGlmIHRoZSByZXBvcnQgZW1pdHMgdGhpcyBlcnJvciBjb2RlIChmb3IgZml4dHVyZXMvZXZhbCByZWNhbGwpJwogICkKICAub3B0aW9uKAogICAgJy0tZXhwZWN0LWludmFsaWQnLAogICAgJ2V4aXQgMCBvbmx5IGlmIHRoZSBwYXJ0IGlzIGludmFsaWQgKG9rOmZhbHNlKSDigJQgZm9yIGtub3duLWJhZCBmaXh0dXJlcycKICApCiAgLm9wdGlvbigKICAgICctLW1ldHJpY3MnLAogICAgJ2NvbXB1dGUgZGV0ZXJtaW5pc3RpYyBtYW51ZmFjdHVyYWJpbGl0eSBtZXRyaWNzIChwZXItYm9keSBicmVha2Rvd24gKyBpbnRlcmZlcmVuY2UgbWF0cml4KSBmb3IgdGhlIGRlc2lnbiBqdWRnZSDigJQgc2xvd2VyOyBvZmYgYnkgZGVmYXVsdCcKICApCiAgLmFjdGlvbigKICAgIGFzeW5jICgKICAgICAgZmlsZXM6IHN0cmluZ1tdLAogICAgICBvcHRzOiB7CiAgICAgICAgc3RlcD86IHN0cmluZzsKICAgICAgICBnbGI/OiBzdHJpbmc7CiAgICAgICAganNvbj86IHN0cmluZzsKICAgICAgICBjaGVjaz86IGJvb2xlYW47CiAgICAgICAgc25hcHNob3Q/OiBzdHJpbmc7CiAgICAgICAgc2VydmU/OiBib29sZWFuOwogICAgICAgIGV4cGVjdENvZGU/OiBzdHJpbmc7CiAgICAgICAgZXhwZWN0SW52YWxpZD86IGJvb2xlYW47CiAgICAgICAgbWV0cmljcz86IGJvb2xlYW47CiAgICAgICAgLy8gQ29tbWFuZGVyIG1hdGVyaWFsaXplcyBhIG5lZ2F0ZWQgZmxhZyBhcyBhIGNvbmNyZXRlIGJvb2xlYW46IHRydWUgYnkKICAgICAgICAvLyBkZWZhdWx0LCBmYWxzZSB3aGVuIC0tbm8tb3BlbiBpcyBwYXNzZWQuCiAgICAgICAgb3BlbjogYm9vbGVhbjsKICAgICAgfQogICAgKSA9PiB7CiAgICAgIC8vIEEgcXVvdGVkIGdsb2IgKCJwYXJ0cy8qLmJyZXAudHMiKSBhcnJpdmVzIGFzIG9uZSBsaXRlcmFsIGFyZywgYSBzaGVsbC1leHBhbmRlZCBvbmUgYXMgbWFueTsKICAgICAgLy8gZ2xvYlN5bmMgaGFuZGxlcyBib3RoIChhIGxpdGVyYWwgZmlsZW5hbWUgbWF0Y2hlcyBpdHNlbGYpLCBmYWxsaW5nIGJhY2sgdG8gdGhlIHJhdyBhcmcgc28gYQogICAgICAvLyBtaXNzaW5nIHBhdGggc3RpbGwgcnVucyBhbmQgcmVwb3J0cyBpdHMgb3duIGVycm9yLgogICAgICBjb25zdCB0YXJnZXRzID0gWwogICAgICAgIC4uLm5ldyBTZXQoCiAgICAgICAgICBmaWxlcy5mbGF0TWFwKChmKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IG0gPSBnbG9iU3luYyhmKTsKICAgICAgICAgICAgcmV0dXJuIG0ubGVuZ3RoID8gbSA6IFtmXTsKICAgICAgICAgIH0pCiAgICAgICAgKSwKICAgICAgXS5tYXAoKHApID0+IHJlc29sdmUocCkpOwoKICAgICAgaWYgKHRhcmdldHMubGVuZ3RoID4gMSkgewogICAgICAgIC8vIEJhdGNoOiB2YWxpZGl0eS1vbmx5IEpTT04gYXJyYXkuIFRoZSBzaW5nbGUtZmlsZSBhcnRpZmFjdCBmbGFncyBkb24ndCBhcHBseS4KICAgICAgICBpZiAoCiAgICAgICAgICBvcHRzLnN0ZXAgfHwKICAgICAgICAgIG9wdHMuc2VydmUgfHwKICAgICAgICAgIG9wdHMuc25hcHNob3QgfHwKICAgICAgICAgIG9wdHMuZ2xiIHx8CiAgICAgICAgICBvcHRzLmV4cGVjdENvZGUgfHwKICAgICAgICAgIG9wdHMuZXhwZWN0SW52YWxpZAogICAgICAgICkgewogICAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoCiAgICAgICAgICAgICdiYXRjaCBtb2RlOiAtLXN0ZXAvLS1nbGIvLS1zZXJ2ZS8tLXNuYXBzaG90Ly0tZXhwZWN0LWNvZGUvLS1leHBlY3QtaW52YWxpZCBpZ25vcmVkIChzaW5nbGUtZmlsZSBvbmx5KVxuJwogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVzdWx0czogeyBmaWxlOiBzdHJpbmc7IG9rOiBib29sZWFuOyByZXBvcnQ6IFZlcmlmeVJlcG9ydCB9W10gPSBbXTsKICAgICAgICBmb3IgKGNvbnN0IGYgb2YgdGFyZ2V0cykgewogICAgICAgICAgY29uc3QgeyByZXBvcnQsIHNoYXBlIH0gPSBhd2FpdCBydW5QYXJ0KGYsIHsKICAgICAgICAgICAgY2hlY2s6IEJvb2xlYW4ob3B0cy5jaGVjayksCiAgICAgICAgICAgIG1ldHJpY3M6IEJvb2xlYW4ob3B0cy5tZXRyaWNzKSwKICAgICAgICAgIH0pOwogICAgICAgICAgZGlzcG9zZVNoYXBlKHNoYXBlKTsKICAgICAgICAgIHJlc3VsdHMucHVzaCh7IGZpbGU6IGYsIG9rOiByZXBvcnRPayhyZXBvcnQpLCByZXBvcnQgfSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShyZXN1bHRzLCBudWxsLCAyKTsKICAgICAgICBpZiAob3B0cy5qc29uICYmIG9wdHMuanNvbiAhPT0gJy0nKSB3cml0ZUZpbGVTeW5jKG9wdHMuanNvbiwganNvbik7CiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoanNvbiArICdcbicpOwogICAgICAgIGlmIChyZXN1bHRzLnNvbWUoKHIpID0+ICFyLm9rKSkgcHJvY2Vzcy5leGl0Q29kZSA9IDE7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBjb25zdCBmaWxlID0gdGFyZ2V0c1swXSA/PyBmaWxlc1swXSA/PyAnJzsKICAgICAgLy8gVGhlIFdBU00gdmlld2VyIGxvYWRzIGEgQ0FEIGZpbGUgKGl0IGNhbid0IHJ1biBhIC5icmVwLnRzKSwgc28gLS1zbmFwc2hvdC8tLXNlcnZlCiAgICAgIC8vIHN0YWdlIHRoZSBwcmltYXJ5IFNURVAgYW5kIHBvaW50IHRoZSB2aWV3ZXIgYXQgaXQgdmlhID9kaXI9JmZpbGU9LiAtLWdsYiBpcyBpdHMgb3duIGFydGlmYWN0LgogICAgICBjb25zdCB3YW50U3RlcCA9IEJvb2xlYW4ob3B0cy5zdGVwKSB8fCBCb29sZWFuKG9wdHMuc25hcHNob3QpIHx8IEJvb2xlYW4ob3B0cy5zZXJ2ZSk7CiAgICAgIGNvbnN0IHsgcmVwb3J0LCBzdGVwLCBnbGIsIHNoYXBlIH0gPSBhd2FpdCBydW5QYXJ0KHJlc29sdmUoZmlsZSksIHsKICAgICAgICBzdGVwOiB3YW50U3RlcCwKICAgICAgICBnbGI6IEJvb2xlYW4ob3B0cy5nbGIpLAogICAgICAgIGNoZWNrOiBCb29sZWFuKG9wdHMuY2hlY2spLAogICAgICAgIC8vIEEgc25hcHNob3QgZmVlZHMgdGhlIGRlc2lnbiBqdWRnZSwgc28gY29tcHV0ZSBtZXRyaWNzIHRvbyAoYm9yZXMg4oaSIGFuIGFpbWVkIHNlY3Rpb24gc2hvdCkuCiAgICAgICAgbWV0cmljczogQm9vbGVhbihvcHRzLm1ldHJpY3MpIHx8IEJvb2xlYW4ob3B0cy5zbmFwc2hvdCksCiAgICAgIH0pOwogICAgICBsZXQgc3RlcFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdHMuc3RlcDsKICAgICAgdHJ5IHsKICAgICAgICBpZiAob3B0cy5nbGIgJiYgZ2xiKSB3cml0ZUZpbGVTeW5jKG9wdHMuZ2xiLCBCdWZmZXIuZnJvbShnbGIpKTsKCiAgICAgICAgaWYgKHdhbnRTdGVwICYmIHN0ZXApIHsKICAgICAgICAgIHN0ZXBQYXRoID0gb3B0cy5zdGVwID8/IGpvaW4odG1wZGlyKCksIGBicmVwLSR7YmFzZW5hbWUoZmlsZSl9LnN0ZXBgKTsKICAgICAgICAgIHdyaXRlRmlsZVN5bmMoc3RlcFBhdGgsIEJ1ZmZlci5mcm9tKHN0ZXApKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9wdHMuc25hcHNob3QgJiYgc3RlcFBhdGgpIHsKICAgICAgICAgIGNvbnN0IHNob290ID0gYXdhaXQgbG9hZFNuYXBzaG90U2hvb3QoKTsgLy8gbGF6eToga2VlcHMgcHVwcGV0ZWVyIG9mZiB0aGUgZGVmYXVsdCBwYXRoCiAgICAgICAgICBpZiAoc2hvb3QpIHsKICAgICAgICAgICAgY29uc3Qgc2VjdGlvbiA9IGFpbWVkU2VjdGlvbigKICAgICAgICAgICAgICByZXBvcnQubWFudWZhY3R1cmFiaWxpdHk/LmJvcmVzID8/IFtdLAogICAgICAgICAgICAgIHJlcG9ydC5tZWFzdXJlbWVudHMuYm91bmRzCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNvbnN0IG1hcmtzID0gZmVhdHVyZU1hcmtzKHJlcG9ydC5ib2RpZXMgPz8gW10sIHJlcG9ydC5tYW51ZmFjdHVyYWJpbGl0eT8uYm9yZXMgPz8gW10pOwogICAgICAgICAgICBjb25zdCB7IHBuZ3MgfSA9IGF3YWl0IHNob290KHsKICAgICAgICAgICAgICBmaWxlOiBzdGVwUGF0aCwKICAgICAgICAgICAgICBvdXREaXI6IG9wdHMuc25hcHNob3QsCiAgICAgICAgICAgICAgLi4uKHNlY3Rpb24gPyB7IHNlY3Rpb24gfSA6IHt9KSwKICAgICAgICAgICAgICAuLi4obWFya3MubGVuZ3RoID4gMCA/IHsgbWFya3MgfSA6IHt9KSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIERpYWdub3N0aWMgcGF0aHMgZ28gdG8gc3RkZXJyIOKAlCBzdGRvdXQgc3RheXMgYSBzaW5nbGUgY2xlYW4gSlNPTiBkb2N1bWVudC4KICAgICAgICAgICAgZm9yIChjb25zdCBwIG9mIHBuZ3MpIHByb2Nlc3Muc3RkZXJyLndyaXRlKGBzbmFwc2hvdDogJHtwfVxuYCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChvcHRzLnNuYXBzaG90KSB7CiAgICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnc25hcHNob3Qgc2tpcHBlZDogU1RFUCBleHBvcnQgcHJvZHVjZWQgbm8gYXJ0aWZhY3RcbicpOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHB1c2hFcnJvcihyZXBvcnQsIHsgbWVzc2FnZTogYGFydGlmYWN0IHdyaXRlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gIH0pOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIC8vIFRoZSBzaGFwZSBpcyBhIGxpdmUgV0FTTSBoYW5kbGU7IHJlbGVhc2UgaXQgYmVmb3JlIHRoZSBzZXJ2ZXIgdGFrZXMgb3ZlciAodGhlCiAgICAgICAgLy8gLS1zZXJ2ZSBwYXRoIHN0YXlzIHJ1bm5pbmcsIHNvIGxlYWtpbmcgaGVyZSB3b3VsZCBwZXJzaXN0IGZvciB0aGUgc2VydmVyJ3MgbGlmZXRpbWUpLgogICAgICAgIGRpc3Bvc2VTaGFwZShzaGFwZSk7CiAgICAgIH0KICAgICAgLy8gU2VyaWFsaXplIG9uY2UgYWZ0ZXIgYWxsIGFydGlmYWN0IHdyaXRlcyBzbyB0aGUgLS1qc29uIGZpbGUgYW5kIHN0ZG91dAogICAgICAvLyByZWZsZWN0IHRoZSBzYW1lIHJlcG9ydCAoaW5jbC4gYW55ICJhcnRpZmFjdCB3cml0ZSBmYWlsZWQiIGVycm9yKS4KICAgICAgY29uc3QganNvbiA9IHNlcmlhbGl6ZVJlcG9ydChyZXBvcnQpOwogICAgICAvLyBgLS1qc29uIC1gIGlzIHNhdGlzZmllZCBieSB0aGUgc3Rkb3V0IHdyaXRlIGJlbG93OyBvbmx5IGEgcmVhbCBwYXRoIHdyaXRlcyBhIGZpbGUuCiAgICAgIGlmIChvcHRzLmpzb24gJiYgb3B0cy5qc29uICE9PSAnLScpIHdyaXRlRmlsZVN5bmMob3B0cy5qc29uLCBqc29uKTsKICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoanNvbiArICdcbicpOwogICAgICBpZiAoIXJlcG9ydE9rKHJlcG9ydCkpIHByb2Nlc3MuZXhpdENvZGUgPSAxOwogICAgICAvLyBGaXh0dXJlIGFzc2VydGlvbnMgKFBoYXNlOiB2ZXJpZnktaGVhbCBwcmVjaXNpb24vcmVjYWxsKSBvdmVycmlkZSB0aGUgbm9ybWFsIGV4aXQgY29kZToKICAgICAgLy8gYSBrbm93bi1iYWQgcGFydCBtdXN0IGZhaWwgdGhlICpyaWdodCogd2F5LiBDb2RlcyBjb21lIGZyb20gdGhlIGtlcm5lbC9hdXRob3JpbmcgZXJyb3JzLAogICAgICAvLyBub3QgdGhlIGhpbnQgdGFibGUsIHNvIHRoaXMgbWVhc3VyZXMgdGhlIHZlcmlmaWVyLCBub3QgaXRzIHByb3NlLgogICAgICBpZiAob3B0cy5leHBlY3RJbnZhbGlkIHx8IG9wdHMuZXhwZWN0Q29kZSkgewogICAgICAgIC8vIGhpbnRzIGFyZSBkZXJpdmVkIGZyb20gZXJyb3JJbmZvcywgc28gdGhlIGNvZGVzIGxpdmUgdGhlcmU7IGRlZHVwZSB0byBrZWVwIHRoZSBsaW5lIGNsZWFuLgogICAgICAgIGNvbnN0IGNvZGVzID0gWwogICAgICAgICAgLi4ubmV3IFNldChyZXBvcnQuZXJyb3JJbmZvcy5tYXAoKGUpID0+IGUuY29kZSkuZmlsdGVyKChjKTogYyBpcyBzdHJpbmcgPT4gQm9vbGVhbihjKSkpLAogICAgICAgIF07CiAgICAgICAgY29uc3QgdmFsaWQgPSByZXBvcnRPayhyZXBvcnQpOwogICAgICAgIGNvbnN0IHBhc3MgPQogICAgICAgICAgKCFvcHRzLmV4cGVjdEludmFsaWQgfHwgIXZhbGlkKSAmJiAoIW9wdHMuZXhwZWN0Q29kZSB8fCBjb2Rlcy5pbmNsdWRlcyhvcHRzLmV4cGVjdENvZGUpKTsKICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gcGFzcyA/IDAgOiAxOwogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKAogICAgICAgICAgYGV4cGVjdDogJHtwYXNzID8gJ1BBU1MnIDogJ0ZBSUwnfWAgKwogICAgICAgICAgICAob3B0cy5leHBlY3RDb2RlID8gYCBjb2RlPSR7b3B0cy5leHBlY3RDb2RlfWAgOiAnJykgKwogICAgICAgICAgICAob3B0cy5leHBlY3RJbnZhbGlkID8gJyBpbnZhbGlkJyA6ICcnKSArCiAgICAgICAgICAgIGAgKG9rPSR7dmFsaWR9LCBjb2Rlcz0ke2NvZGVzLmpvaW4oJywnKSB8fCAnbm9uZSd9KVxuYAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHdpbGxTZXJ2ZSA9IEJvb2xlYW4ob3B0cy5zZXJ2ZSkgJiYgc3RlcFBhdGggIT09IHVuZGVmaW5lZCAmJiByZXBvcnRPayhyZXBvcnQpOwogICAgICBpZiAod2lsbFNlcnZlICYmIHN0ZXBQYXRoKSB7CiAgICAgICAgY29uc3QgeyBzZXJ2ZSB9ID0gYXdhaXQgaW1wb3J0KCcuLi9zbmFwc2hvdC9zZXJ2ZS5qcycpOyAvLyBsYXp5OiBubyBzZXJ2ZXIgZGVwcyBvbiB0aGUgZGVmYXVsdCBwYXRoCiAgICAgICAgY29uc3QgeyB1cmwsIHJldXNlZCB9ID0gYXdhaXQgc2VydmUoeyBmaWxlOiBzdGVwUGF0aCB9KTsgLy8gYnVpbGRzIGEgP2Rpcj0mZmlsZT0gVVJMOyBzZXJ2ZXIgcnVucyB1bnRpbCBDdHJsLUMKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShgdmlld2VyOiAke3VybH1cbmApOwogICAgICAgIC8vIEF1dG8tb3BlbiBvbmx5IGZvciBhIGZyZXNobHkgc3RhcnRlZCBzZXJ2ZXIgKGEgcmV1c2VkIG9uZSBhbHJlYWR5IGhhcwogICAgICAgIC8vIGEgdGFiKSBpbiBhbiBpbnRlcmFjdGl2ZSBzZXNzaW9uOyBgLS1uby1vcGVuYCAob3B0cy5vcGVuID09PSBmYWxzZSkKICAgICAgICAvLyBhbHdheXMgc3VwcHJlc3NlcyBpdC4KICAgICAgICBpZiAoIXJldXNlZCAmJiBvcHRzLm9wZW4gJiYgc2hvdWxkQXV0b09wZW4oKSkgewogICAgICAgICAgb3BlbkJyb3dzZXIodXJsKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICApOwoKcHJvZ3JhbQogIC5jb21tYW5kKCdtZWFzdXJlJykKICAuYXJndW1lbnQoJzxhPicsICdwYXRoIHRvIGEgLmJyZXAudHMgbW9kdWxlJykKICAuYXJndW1lbnQoJ1tiXScsICdvcHRpb25hbCBzZWNvbmQgbW9kdWxlOyBpZiBnaXZlbiwgbWVhc3VyZXMgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHBhcnRzJykKICAuYWN0aW9uKGFzeW5jIChhOiBzdHJpbmcsIGI/OiBzdHJpbmcpID0+IHsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1bk1lYXN1cmUocmVzb2x2ZShhKSwgYiA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcmVzb2x2ZShiKSk7CiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgKICAgICAgSlNPTi5zdHJpbmdpZnkoeyBvazogcmVzdWx0LmVycm9ycy5sZW5ndGggPT09IDAsIC4uLnJlc3VsdCB9LCBudWxsLCAyKSArICdcbicKICAgICk7CiAgICBpZiAocmVzdWx0LmVycm9ycy5sZW5ndGggPiAwKSBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICB9KTsKCnByb2dyYW0KICAuY29tbWFuZCgnZGlmZicpCiAgLmFyZ3VtZW50KCc8YT4nLCAncGF0aCB0byB0aGUgYmFzZWxpbmUgLmJyZXAudHMgbW9kdWxlJykKICAuYXJndW1lbnQoJzxiPicsICdwYXRoIHRvIHRoZSBjb21wYXJpc29uIC5icmVwLnRzIG1vZHVsZScpCiAgLmFjdGlvbihhc3luYyAoYTogc3RyaW5nLCBiOiBzdHJpbmcpID0+IHsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1bkRpZmYocmVzb2x2ZShhKSwgcmVzb2x2ZShiKSk7CiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgKICAgICAgSlNPTi5zdHJpbmdpZnkoeyBvazogcmVzdWx0LmVycm9ycy5sZW5ndGggPT09IDAsIC4uLnJlc3VsdCB9LCBudWxsLCAyKSArICdcbicKICAgICk7CiAgICBpZiAocmVzdWx0LmVycm9ycy5sZW5ndGggPiAwKSBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICB9KTsKCnByb2dyYW0KICAuY29tbWFuZCgnc25hcHNob3QnKQogIC5hcmd1bWVudCgKICAgICc8ZmlsZT4nLAogICAgJ3BhdGggdG8gYSAuYnJlcC50cyBtb2R1bGU7IHJlbmRlcnMgaXNvL2Zyb250L3RvcC9yaWdodCBQTkdzIChubyByZXBvcnQgYXNzZXJ0aW9ucyknCiAgKQogIC5vcHRpb24oJy0tb3V0IDxkaXI+JywgJ291dHB1dCBkaXJlY3RvcnkgZm9yIHRoZSBQTkdzIChkZWZhdWx0IDxmaWxlPi1zaG90cyknKQogIC5vcHRpb24oJy0tbGFiZWwgPHRhZz4nLCAnc3ViZm9sZGVyIGZvciB0aGlzIHJlbmRlciBzZXQgKGUuZy4gcHJlLCBwb3N0KSBmb3IgQS9CIHBhaXJpbmcnKQogIC5hY3Rpb24oYXN5bmMgKGZpbGU6IHN0cmluZywgb3B0czogeyBvdXQ/OiBzdHJpbmc7IGxhYmVsPzogc3RyaW5nIH0pID0+IHsKICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZShmaWxlKTsKICAgIGNvbnN0IGJhc2UgPSBvcHRzLm91dCA/IHJlc29sdmUob3B0cy5vdXQpIDogYCR7cmVzb2x2ZWR9LXNob3RzYDsKICAgIGNvbnN0IG91dERpciA9IG9wdHMubGFiZWwgPyBqb2luKGJhc2UsIG9wdHMubGFiZWwpIDogYmFzZTsKICAgIGNvbnN0IHsgcmVwb3J0LCBzdGVwLCBzaGFwZSB9ID0gYXdhaXQgcnVuUGFydChyZXNvbHZlZCwgeyBzdGVwOiB0cnVlLCBtZXRyaWNzOiB0cnVlIH0pOwogICAgdHJ5IHsKICAgICAgaWYgKCFzdGVwKSB7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ3NuYXBzaG90OiBwYXJ0IHByb2R1Y2VkIG5vIFNURVAg4oCUIG5vdGhpbmcgdG8gcmVuZGVyXG4nKTsKICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShzZXJpYWxpemVSZXBvcnQocmVwb3J0KSArICdcbicpOwogICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBzdGVwUGF0aCA9IGpvaW4odG1wZGlyKCksIGBicmVwLXNuYXAtJHtiYXNlbmFtZShmaWxlKX0uc3RlcGApOwogICAgICB3cml0ZUZpbGVTeW5jKHN0ZXBQYXRoLCBCdWZmZXIuZnJvbShzdGVwKSk7CiAgICAgIGNvbnN0IHNob290ID0gYXdhaXQgbG9hZFNuYXBzaG90U2hvb3QoKTsKICAgICAgaWYgKCFzaG9vdCkgewogICAgICAgIC8vIHB1cHBldGVlciBhYnNlbnQ6IGxvYWRTbmFwc2hvdFNob290IHNldCBleGl0Q29kZSArIHN0ZGVycjsgc3RpbGwgZW1pdCB0aGUgcmVwb3J0IHNvIGEKICAgICAgICAvLyBjYWxsZXIgcGFyc2luZyBzdGRvdXQgZ2V0cyB0aGUgdmFsaWRpdHkgaW5mbyByYXRoZXIgdGhhbiBhbiBlbXB0eSBidWZmZXIuCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoc2VyaWFsaXplUmVwb3J0KHJlcG9ydCkgKyAnXG4nKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgLy8gZnJlc2g6IGEgcHJpdmF0ZSBlcGhlbWVyYWwgcmVuZGVyIHNlcnZlciBzbyBwYXJhbGxlbCBzbmFwc2hvdHMgZG9uJ3QgY29udGVuZCBvbiA6NzM3My4KICAgICAgY29uc3Qgc2VjdGlvbiA9IGFpbWVkU2VjdGlvbigKICAgICAgICByZXBvcnQubWFudWZhY3R1cmFiaWxpdHk/LmJvcmVzID8/IFtdLAogICAgICAgIHJlcG9ydC5tZWFzdXJlbWVudHMuYm91bmRzCiAgICAgICk7CiAgICAgIGNvbnN0IG1hcmtzID0gZmVhdHVyZU1hcmtzKHJlcG9ydC5ib2RpZXMgPz8gW10sIHJlcG9ydC5tYW51ZmFjdHVyYWJpbGl0eT8uYm9yZXMgPz8gW10pOwogICAgICBjb25zdCB7IHBuZ3MgfSA9IGF3YWl0IHNob290KHsKICAgICAgICBmaWxlOiBzdGVwUGF0aCwKICAgICAgICBvdXREaXIsCiAgICAgICAgZnJlc2g6IHRydWUsCiAgICAgICAgLi4uKHNlY3Rpb24gPyB7IHNlY3Rpb24gfSA6IHt9KSwKICAgICAgICAuLi4obWFya3MubGVuZ3RoID4gMCA/IHsgbWFya3MgfSA6IHt9KSwKICAgICAgfSk7CiAgICAgIGZvciAoY29uc3QgcCBvZiBwbmdzKSBwcm9jZXNzLnN0ZG91dC53cml0ZShgJHtwfVxuYCk7CiAgICB9IGZpbmFsbHkgewogICAgICBkaXNwb3NlU2hhcGUoc2hhcGUpOwogICAgfQogIH0pOwoKcHJvZ3JhbQogIC5jb21tYW5kKCdpbml0JykKICAuYXJndW1lbnQoJzxuYW1lPicsICdwYXJ0IG5hbWU7IHNjYWZmb2xkcyA8bmFtZT4uYnJlcC50cyArIHRzY29uZmlnLmpzb24gKyBSRUFETUUubWQnKQogIC5vcHRpb24oJy0tb3V0IDxkaXI+JywgJ3RhcmdldCBkaXJlY3RvcnkgKGRlZmF1bHRzIHRvIC4vPG5hbWU+KScpCiAgLmFjdGlvbigobmFtZTogc3RyaW5nLCBvcHRzOiB7IG91dD86IHN0cmluZyB9KSA9PiB7CiAgICBjb25zdCBkaXIgPSByZXNvbHZlKG9wdHMub3V0ID8/IG5hbWUpOwogICAgY29uc3QgcmVzdWx0ID0gc2NhZmZvbGRQYXJ0KG5hbWUsIGRpcik7CiAgICBmb3IgKGNvbnN0IGYgb2YgcmVzdWx0LmZpbGVzKSB7CiAgICAgIGNvbnN0IHRhZyA9IGYuY3JlYXRlZCA/ICdjcmVhdGVkJyA6ICdleGlzdHMgKGtlcHQpJzsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoYCR7dGFnfTogJHtmLnBhdGh9XG5gKTsKICAgIH0KICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMikgKyAnXG4nKTsKICB9KTsKCnByb2dyYW0KICAuY29tbWFuZCgnd2F0Y2gnKQogIC5hcmd1bWVudCgnPGZpbGU+JywgJ3BhdGggdG8gYSAuYnJlcC50cyBtb2R1bGU7IHJlLXZlcmlmaWVzIG9uIGVhY2ggc2F2ZSB1bnRpbCBDdHJsLUMnKQogIC5hY3Rpb24oKGZpbGU6IHN0cmluZykgPT4gewogICAgY29uc3QgcGF0aCA9IHJlc29sdmUoZmlsZSk7CiAgICBjb25zdCBydW4gPSBhc3luYyAoKSA9PiB7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgeyByZXBvcnQsIHNoYXBlIH0gPSBhd2FpdCBydW5QYXJ0KHBhdGgpOwogICAgICAgIHRyeSB7CiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShzZXJpYWxpemVSZXBvcnQocmVwb3J0KSArICdcbicpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBkaXNwb3NlU2hhcGUoc2hhcGUpOyAvLyBsaXZlIFdBU00gaGFuZGxlOyB0aGUgbG9vcCBydW5zIGluZGVmaW5pdGVseQogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGB3YXRjaCBydW4gZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfVxuYCk7CiAgICAgIH0KICAgIH07CiAgICBjb25zdCB7IHRyaWdnZXIgfSA9IGRlYm91bmNlKHJ1biwgREVGQVVMVF9ERUJPVU5DRV9NUyk7CiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShgd2F0Y2hpbmcgJHtwYXRofSAoQ3RybC1DIHRvIHN0b3ApXG5gKTsKICAgIHZvaWQgcnVuKCk7IC8vIGluaXRpYWwgdmVyaWZ5CiAgICAvLyBXYXRjaCB0aGUgcGFyZW50IGRpcjogZWRpdG9ycyBvZnRlbiByZXBsYWNlIHRoZSBmaWxlIChyZW5hbWUpIG9uIHNhdmUsCiAgICAvLyB3aGljaCBkcm9wcyBhIHdhdGNoZXIgYm91bmQgdG8gdGhlIGZpbGUgaW5vZGUgaXRzZWxmLgogICAgY29uc3Qgd2F0Y2hlciA9IGZzV2F0Y2goZGlybmFtZShwYXRoKSwgKF9ldmVudCwgZmlsZW5hbWUpID0+IHsKICAgICAgaWYgKGZpbGVuYW1lID09PSB1bmRlZmluZWQgfHwgZmlsZW5hbWUgPT09IG51bGwpIHsKICAgICAgICB0cmlnZ2VyKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChiYXNlbmFtZShwYXRoKSA9PT0gZmlsZW5hbWUudG9TdHJpbmcoKSkgdHJpZ2dlcigpOwogICAgfSk7CiAgICBjb25zdCBzdG9wID0gKCkgPT4gewogICAgICB3YXRjaGVyLmNsb3NlKCk7CiAgICAgIHByb2Nlc3MuZXhpdCgwKTsKICAgIH07CiAgICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBzdG9wKTsKICAgIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCBzdG9wKTsgLy8gc3VwZXJ2aXNvcnMgKGRvY2tlciBzdG9wLCBzeXN0ZW1jdGwpIHNlbmQgU0lHVEVSTQogIH0pOwoKcHJvZ3JhbQogIC5jb21tYW5kKCdleHBvcnQnKQogIC5hcmd1bWVudCgnPGZpbGU+JywgJ3BhdGggdG8gYSAuYnJlcC50cyBtb2R1bGUnKQogIC5vcHRpb24oJy0tc3RlcCcsICd3cml0ZSBhIFNURVAgYXJ0aWZhY3QnKQogIC5vcHRpb24oJy0tZ2xiJywgJ3dyaXRlIGEgR0xCIGFydGlmYWN0JykKICAub3B0aW9uKCctLXN0bCcsICd3cml0ZSBhbiBTVEwgYXJ0aWZhY3QnKQogIC5vcHRpb24oJy0tYWxsJywgJ3dyaXRlIFNURVAgKyBHTEIgKyBTVEwnKQogIC5vcHRpb24oJy0tb3V0IDxkaXI+JywgJ291dHB1dCBkaXJlY3RvcnknLCAnLicpCiAgLmFjdGlvbigKICAgIGFzeW5jICgKICAgICAgZmlsZTogc3RyaW5nLAogICAgICBvcHRzOiB7IHN0ZXA/OiBib29sZWFuOyBnbGI/OiBib29sZWFuOyBzdGw/OiBib29sZWFuOyBhbGw/OiBib29sZWFuOyBvdXQ6IHN0cmluZyB9CiAgICApID0+IHsKICAgICAgY29uc3QgZm9ybWF0cyA9IG9wdHMuYWxsCiAgICAgICAgPyB7IHN0ZXA6IHRydWUsIGdsYjogdHJ1ZSwgc3RsOiB0cnVlIH0KICAgICAgICA6IHsgc3RlcDogQm9vbGVhbihvcHRzLnN0ZXApLCBnbGI6IEJvb2xlYW4ob3B0cy5nbGIpLCBzdGw6IEJvb2xlYW4ob3B0cy5zdGwpIH07CiAgICAgIGlmICghZm9ybWF0cy5zdGVwICYmICFmb3JtYXRzLmdsYiAmJiAhZm9ybWF0cy5zdGwpIHsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnbm8gZm9ybWF0cyByZXF1ZXN0ZWQg4oCUIHBhc3MgLS1zdGVwLy0tZ2xiLy0tc3RsIG9yIC0tYWxsXG4nKTsKICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhwb3J0UGFydChyZXNvbHZlKGZpbGUpLCBmb3JtYXRzLCByZXNvbHZlKG9wdHMub3V0KSk7CiAgICAgIGZvciAoY29uc3QgcCBvZiByZXN1bHQud3JpdHRlbikgcHJvY2Vzcy5zdGRlcnIud3JpdGUoYHdyb3RlOiAke3B9XG5gKTsKICAgICAgZm9yIChjb25zdCBlIG9mIHJlc3VsdC5lcnJvcnMpIHByb2Nlc3Muc3RkZXJyLndyaXRlKGBlcnJvcjogJHtlfVxuYCk7CiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKAogICAgICAgIEpTT04uc3RyaW5naWZ5KHsgb2s6IHJlc3VsdC5vaywgd3JpdHRlbjogcmVzdWx0LndyaXR0ZW4sIGVycm9yczogcmVzdWx0LmVycm9ycyB9LCBudWxsLCAyKSArCiAgICAgICAgICAnXG4nCiAgICAgICk7CiAgICAgIGlmICghcmVzdWx0Lm9rKSBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICAgIH0KICApOwoKLy8gT25seSBkcml2ZSB0aGUgQ0xJIHdoZW4gcnVuIGFzIHRoZSBlbnRyeSBzY3JpcHQsIHNvIHRlc3RzIGNhbiBpbXBvcnQgdGhlCi8vIGd1YXJkZWQgbG9hZGVycyB3aXRob3V0IGNvbW1hbmRlciBwYXJzaW5nIHRoZSB0ZXN0IHJ1bm5lcidzIGFyZ3YuCi8vIFJlc29sdmUgc3ltbGlua3Mgb24gYm90aCBzaWRlczogdGhlIG5wbS1pbnN0YWxsZWQgYmluIChub2RlX21vZHVsZXMvLmJpbi9icmVwanMpCi8vIGlzIGEgc3ltbGluaywgc28gcHJvY2Vzcy5hcmd2WzFdIHdvdWxkIG90aGVyd2lzZSBuZXZlciBlcXVhbCB0aGUgcmVhbCBtb2R1bGUgcGF0aC4KZXhwb3J0IGZ1bmN0aW9uIGlzRW50cnlwb2ludChhcmd2MTogc3RyaW5nIHwgdW5kZWZpbmVkLCBtb2R1bGVVcmw6IHN0cmluZyk6IGJvb2xlYW4gewogIGlmICghYXJndjEpIHJldHVybiBmYWxzZTsKICB0cnkgewogICAgcmV0dXJuIHJlYWxwYXRoU3luYyhhcmd2MSkgPT09IHJlYWxwYXRoU3luYyhmaWxlVVJMVG9QYXRoKG1vZHVsZVVybCkpOwogIH0gY2F0Y2ggewogICAgcmV0dXJuIGZhbHNlOwogIH0KfQoKaWYgKGlzRW50cnlwb2ludChwcm9jZXNzLmFyZ3ZbMV0sIGltcG9ydC5tZXRhLnVybCkpIHsKICB2b2lkIHByb2dyYW0ucGFyc2VBc3luYygpOwp9Cg==", "" + import.meta.url));
48
+ return fileURLToPath(new URL("data:video/mp2t;base64,IyEvdXNyL2Jpbi9lbnYgbm9kZQppbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJzsKaW1wb3J0IHsgd3JpdGVGaWxlU3luYywgcmVhbHBhdGhTeW5jLCBnbG9iU3luYyB9IGZyb20gJ25vZGU6ZnMnOwppbXBvcnQgeyByZXNvbHZlLCBqb2luLCBiYXNlbmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7CmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnOwppbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnOwppbXBvcnQgeyBydW5QYXJ0IH0gZnJvbSAnLi4vdmVyaWZ5L3J1blBhcnQuanMnOwppbXBvcnQgeyBwdXNoRXJyb3IsIHJlcG9ydE9rLCBzZXJpYWxpemVSZXBvcnQsIHR5cGUgVmVyaWZ5UmVwb3J0IH0gZnJvbSAnLi4vdmVyaWZ5L3JlcG9ydC5qcyc7CmltcG9ydCB7IHJ1bk1lYXN1cmUgfSBmcm9tICcuLi92ZXJpZnkvbWVhc3VyZS5qcyc7CmltcG9ydCB7IHJ1bkRpZmYgfSBmcm9tICcuLi92ZXJpZnkvZGlmZi5qcyc7CmltcG9ydCB7IHNjYWZmb2xkUGFydCB9IGZyb20gJy4vc2NhZmZvbGQuanMnOwppbXBvcnQgewogIGRlYm91bmNlLAogIERFRkFVTFRfREVCT1VOQ0VfTVMsCiAgaXNXYXRjaFJlbGV2YW50LAogIHdhdGNoUm9vdEZvciwKICB3YXRjaFRyZWUsCn0gZnJvbSAnLi93YXRjaC5qcyc7CmltcG9ydCB7IGV4cG9ydFBhcnQgfSBmcm9tICcuL2V4cG9ydFBhcnQuanMnOwppbXBvcnQgeyBvcGVuQnJvd3Nlciwgc2hvdWxkQXV0b09wZW4gfSBmcm9tICcuL29wZW5Ccm93c2VyLmpzJzsKaW1wb3J0IHsgZGlzcG9zZVNoYXBlIH0gZnJvbSAnLi4vZGlzcG9zZVNoYXBlLmpzJzsKaW1wb3J0IHR5cGUgeyBzaG9vdCBhcyBTaG9vdEZuIH0gZnJvbSAnLi4vc25hcHNob3Qvc2hvb3QuanMnOwppbXBvcnQgeyBhaW1lZFNlY3Rpb24sIGZlYXR1cmVNYXJrcyB9IGZyb20gJy4uL3NuYXBzaG90L2FpbWluZy5qcyc7CgovLyBPQ0NUJ3MgV0FTTSBTVEVQIHdyaXRlciBlbWl0cyBhICJTdGF0aXN0aWNzIG9uIFRyYW5zZmVyIiBiYW5uZXIgdmlhIGNvbnNvbGUubG9nCi8vIChFbXNjcmlwdGVuJ3MgZGVmYXVsdCBzdGRvdXQgc2luaykuIFRoZSBDTEkgb3ducyBzdGRvdXQgZm9yIG1hY2hpbmUtcmVhZGFibGUgSlNPTiwKLy8gc28gZGl2ZXJ0IHRoYXQga2VybmVsIGNoYXR0ZXIgdG8gc3RkZXJyIHRvIGtlZXAgc3Rkb3V0IGEgc2luZ2xlIGNsZWFuIEpTT04gZG9jdW1lbnQuCi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlIC0tIHJlcm91dGUga2VybmVsIHN0ZG91dCBjaGF0dGVyIG9mZiB0aGUgSlNPTiBjaGFubmVsCmNvbnNvbGUubG9nID0gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gewogIHByb2Nlc3Muc3RkZXJyLndyaXRlKGFyZ3MubWFwKFN0cmluZykuam9pbignICcpICsgJ1xuJyk7Cn07CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFNuYXBzaG90U2hvb3QoKTogUHJvbWlzZTx0eXBlb2YgU2hvb3RGbiB8IHVuZGVmaW5lZD4gewogIHRyeSB7CiAgICBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoJy4uL3NuYXBzaG90L3Nob290LmpzJyk7CiAgICByZXR1cm4gbW9kLnNob290OwogIH0gY2F0Y2ggewogICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ3NuYXBzaG90cyBuZWVkIHB1cHBldGVlci9DaHJvbWUg4oCUIHJ1bjogbnBtIGkgcHVwcGV0ZWVyXG4nKTsKICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxOwogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9Cn0KCmNvbnN0IHByb2dyYW0gPSBuZXcgQ29tbWFuZCgpOwpwcm9ncmFtLm5hbWUoJ2JyZXAnKTsKCnByb2dyYW0KICAuY29tbWFuZCgndmVyaWZ5JywgeyBpc0RlZmF1bHQ6IHRydWUgfSkKICAuYXJndW1lbnQoCiAgICAnPGZpbGVzLi4uPicsCiAgICAncGF0aChzKSBvciBnbG9iKHMpIHRvIC5icmVwLnRzIG1vZHVsZXM7IG11bHRpcGxlIGZpbGVzIOKGkiBhIGJhdGNoIHZhbGlkaXR5IEpTT04gYXJyYXknCiAgKQogIC5vcHRpb24oJy0tc3RlcCA8b3V0PicsICd3cml0ZSB0aGUgcHJpbWFyeSBTVEVQIGFydGlmYWN0IHRvIHRoaXMgcGF0aCcpCiAgLm9wdGlvbignLS1nbGIgPG91dD4nLCAnd3JpdGUgYSBkZXJpdmVkIEdMQiBwcmV2aWV3IHRvIHRoaXMgcGF0aCcpCiAgLm9wdGlvbignLS1qc29uIDxvdXQ+JywgJ3dyaXRlIHRoZSBKU09OIHJlcG9ydCB0byB0aGlzIHBhdGgnKQogIC5vcHRpb24oCiAgICAnLS1jaGVjaycsCiAgICAndHlwZS1jaGVjayB0aGUgcGFydCAoYWdhaW5zdCBicmVwanMgdHlwZXMpIGJlZm9yZSBydW5uaW5nOyBza2lwIGV4ZWN1dGlvbiBvbiB0eXBlIGVycm9ycycKICApCiAgLm9wdGlvbignLS1zbmFwc2hvdCA8ZGlyPicsICdyZW5kZXIgaXNvL2Zyb250L3RvcC9yaWdodCBQTkdzIHRvIHRoaXMgZGlyIChyZXF1aXJlcyBidWlsdCB2aWV3ZXIpJykKICAub3B0aW9uKAogICAgJy0tc2VydmUnLAogICAgJ2FmdGVyIHZlcmlmeWluZywgc3RhcnQgYSBwcmV2aWV3IHNlcnZlciBhbmQgcHJpbnQgYSA/ZGlyPSZmaWxlPSBkZWVwIGxpbmsgKHN0YXlzIHJ1bm5pbmcpJwogICkKICAub3B0aW9uKCctLW5vLW9wZW4nLCAnd2l0aCAtLXNlcnZlLCBkbyBub3QgYXV0by1vcGVuIHRoZSBicm93c2VyIChqdXN0IHByaW50IHRoZSB2aWV3ZXIgVVJMKScpCiAgLm9wdGlvbigKICAgICctLWV4cGVjdC1jb2RlIDxjb2RlPicsCiAgICAnZXhpdCAwIG9ubHkgaWYgdGhlIHJlcG9ydCBlbWl0cyB0aGlzIGVycm9yIGNvZGUgKGZvciBmaXh0dXJlcy9ldmFsIHJlY2FsbCknCiAgKQogIC5vcHRpb24oCiAgICAnLS1leHBlY3QtaW52YWxpZCcsCiAgICAnZXhpdCAwIG9ubHkgaWYgdGhlIHBhcnQgaXMgaW52YWxpZCAob2s6ZmFsc2UpIOKAlCBmb3Iga25vd24tYmFkIGZpeHR1cmVzJwogICkKICAub3B0aW9uKAogICAgJy0tbWV0cmljcycsCiAgICAnY29tcHV0ZSBkZXRlcm1pbmlzdGljIG1hbnVmYWN0dXJhYmlsaXR5IG1ldHJpY3MgKHBlci1ib2R5IGJyZWFrZG93biArIGludGVyZmVyZW5jZSBtYXRyaXgpIGZvciB0aGUgZGVzaWduIGp1ZGdlIOKAlCBzbG93ZXI7IG9mZiBieSBkZWZhdWx0JwogICkKICAuYWN0aW9uKAogICAgYXN5bmMgKAogICAgICBmaWxlczogc3RyaW5nW10sCiAgICAgIG9wdHM6IHsKICAgICAgICBzdGVwPzogc3RyaW5nOwogICAgICAgIGdsYj86IHN0cmluZzsKICAgICAgICBqc29uPzogc3RyaW5nOwogICAgICAgIGNoZWNrPzogYm9vbGVhbjsKICAgICAgICBzbmFwc2hvdD86IHN0cmluZzsKICAgICAgICBzZXJ2ZT86IGJvb2xlYW47CiAgICAgICAgZXhwZWN0Q29kZT86IHN0cmluZzsKICAgICAgICBleHBlY3RJbnZhbGlkPzogYm9vbGVhbjsKICAgICAgICBtZXRyaWNzPzogYm9vbGVhbjsKICAgICAgICAvLyBDb21tYW5kZXIgbWF0ZXJpYWxpemVzIGEgbmVnYXRlZCBmbGFnIGFzIGEgY29uY3JldGUgYm9vbGVhbjogdHJ1ZSBieQogICAgICAgIC8vIGRlZmF1bHQsIGZhbHNlIHdoZW4gLS1uby1vcGVuIGlzIHBhc3NlZC4KICAgICAgICBvcGVuOiBib29sZWFuOwogICAgICB9CiAgICApID0+IHsKICAgICAgLy8gQSBxdW90ZWQgZ2xvYiAoInBhcnRzLyouYnJlcC50cyIpIGFycml2ZXMgYXMgb25lIGxpdGVyYWwgYXJnLCBhIHNoZWxsLWV4cGFuZGVkIG9uZSBhcyBtYW55OwogICAgICAvLyBnbG9iU3luYyBoYW5kbGVzIGJvdGggKGEgbGl0ZXJhbCBmaWxlbmFtZSBtYXRjaGVzIGl0c2VsZiksIGZhbGxpbmcgYmFjayB0byB0aGUgcmF3IGFyZyBzbyBhCiAgICAgIC8vIG1pc3NpbmcgcGF0aCBzdGlsbCBydW5zIGFuZCByZXBvcnRzIGl0cyBvd24gZXJyb3IuCiAgICAgIGNvbnN0IHRhcmdldHMgPSBbCiAgICAgICAgLi4ubmV3IFNldCgKICAgICAgICAgIGZpbGVzLmZsYXRNYXAoKGYpID0+IHsKICAgICAgICAgICAgY29uc3QgbSA9IGdsb2JTeW5jKGYpOwogICAgICAgICAgICByZXR1cm4gbS5sZW5ndGggPyBtIDogW2ZdOwogICAgICAgICAgfSkKICAgICAgICApLAogICAgICBdLm1hcCgocCkgPT4gcmVzb2x2ZShwKSk7CgogICAgICBpZiAodGFyZ2V0cy5sZW5ndGggPiAxKSB7CiAgICAgICAgLy8gQmF0Y2g6IHZhbGlkaXR5LW9ubHkgSlNPTiBhcnJheS4gVGhlIHNpbmdsZS1maWxlIGFydGlmYWN0IGZsYWdzIGRvbid0IGFwcGx5LgogICAgICAgIGlmICgKICAgICAgICAgIG9wdHMuc3RlcCB8fAogICAgICAgICAgb3B0cy5zZXJ2ZSB8fAogICAgICAgICAgb3B0cy5zbmFwc2hvdCB8fAogICAgICAgICAgb3B0cy5nbGIgfHwKICAgICAgICAgIG9wdHMuZXhwZWN0Q29kZSB8fAogICAgICAgICAgb3B0cy5leHBlY3RJbnZhbGlkCiAgICAgICAgKSB7CiAgICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgKICAgICAgICAgICAgJ2JhdGNoIG1vZGU6IC0tc3RlcC8tLWdsYi8tLXNlcnZlLy0tc25hcHNob3QvLS1leHBlY3QtY29kZS8tLWV4cGVjdC1pbnZhbGlkIGlnbm9yZWQgKHNpbmdsZS1maWxlIG9ubHkpXG4nCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBjb25zdCByZXN1bHRzOiB7IGZpbGU6IHN0cmluZzsgb2s6IGJvb2xlYW47IHJlcG9ydDogVmVyaWZ5UmVwb3J0IH1bXSA9IFtdOwogICAgICAgIGZvciAoY29uc3QgZiBvZiB0YXJnZXRzKSB7CiAgICAgICAgICBjb25zdCB7IHJlcG9ydCwgc2hhcGUgfSA9IGF3YWl0IHJ1blBhcnQoZiwgewogICAgICAgICAgICBjaGVjazogQm9vbGVhbihvcHRzLmNoZWNrKSwKICAgICAgICAgICAgbWV0cmljczogQm9vbGVhbihvcHRzLm1ldHJpY3MpLAogICAgICAgICAgfSk7CiAgICAgICAgICBkaXNwb3NlU2hhcGUoc2hhcGUpOwogICAgICAgICAgcmVzdWx0cy5wdXNoKHsgZmlsZTogZiwgb2s6IHJlcG9ydE9rKHJlcG9ydCksIHJlcG9ydCB9KTsKICAgICAgICB9CiAgICAgICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KHJlc3VsdHMsIG51bGwsIDIpOwogICAgICAgIGlmIChvcHRzLmpzb24gJiYgb3B0cy5qc29uICE9PSAnLScpIHdyaXRlRmlsZVN5bmMob3B0cy5qc29uLCBqc29uKTsKICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShqc29uICsgJ1xuJyk7CiAgICAgICAgaWYgKHJlc3VsdHMuc29tZSgocikgPT4gIXIub2spKSBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGNvbnN0IGZpbGUgPSB0YXJnZXRzWzBdID8/IGZpbGVzWzBdID8/ICcnOwogICAgICAvLyBUaGUgV0FTTSB2aWV3ZXIgbG9hZHMgYSBDQUQgZmlsZSAoaXQgY2FuJ3QgcnVuIGEgLmJyZXAudHMpLCBzbyAtLXNuYXBzaG90Ly0tc2VydmUKICAgICAgLy8gc3RhZ2UgdGhlIHByaW1hcnkgU1RFUCBhbmQgcG9pbnQgdGhlIHZpZXdlciBhdCBpdCB2aWEgP2Rpcj0mZmlsZT0uIC0tZ2xiIGlzIGl0cyBvd24gYXJ0aWZhY3QuCiAgICAgIGNvbnN0IHdhbnRTdGVwID0gQm9vbGVhbihvcHRzLnN0ZXApIHx8IEJvb2xlYW4ob3B0cy5zbmFwc2hvdCkgfHwgQm9vbGVhbihvcHRzLnNlcnZlKTsKICAgICAgY29uc3QgeyByZXBvcnQsIHN0ZXAsIGdsYiwgc2hhcGUgfSA9IGF3YWl0IHJ1blBhcnQocmVzb2x2ZShmaWxlKSwgewogICAgICAgIHN0ZXA6IHdhbnRTdGVwLAogICAgICAgIGdsYjogQm9vbGVhbihvcHRzLmdsYiksCiAgICAgICAgY2hlY2s6IEJvb2xlYW4ob3B0cy5jaGVjayksCiAgICAgICAgLy8gQSBzbmFwc2hvdCBmZWVkcyB0aGUgZGVzaWduIGp1ZGdlLCBzbyBjb21wdXRlIG1ldHJpY3MgdG9vIChib3JlcyDihpIgYW4gYWltZWQgc2VjdGlvbiBzaG90KS4KICAgICAgICBtZXRyaWNzOiBCb29sZWFuKG9wdHMubWV0cmljcykgfHwgQm9vbGVhbihvcHRzLnNuYXBzaG90KSwKICAgICAgfSk7CiAgICAgIGxldCBzdGVwUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0cy5zdGVwOwogICAgICB0cnkgewogICAgICAgIGlmIChvcHRzLmdsYiAmJiBnbGIpIHdyaXRlRmlsZVN5bmMob3B0cy5nbGIsIEJ1ZmZlci5mcm9tKGdsYikpOwoKICAgICAgICBpZiAod2FudFN0ZXAgJiYgc3RlcCkgewogICAgICAgICAgc3RlcFBhdGggPSBvcHRzLnN0ZXAgPz8gam9pbih0bXBkaXIoKSwgYGJyZXAtJHtiYXNlbmFtZShmaWxlKX0uc3RlcGApOwogICAgICAgICAgd3JpdGVGaWxlU3luYyhzdGVwUGF0aCwgQnVmZmVyLmZyb20oc3RlcCkpOwogICAgICAgIH0KICAgICAgICBpZiAob3B0cy5zbmFwc2hvdCAmJiBzdGVwUGF0aCkgewogICAgICAgICAgY29uc3Qgc2hvb3QgPSBhd2FpdCBsb2FkU25hcHNob3RTaG9vdCgpOyAvLyBsYXp5OiBrZWVwcyBwdXBwZXRlZXIgb2ZmIHRoZSBkZWZhdWx0IHBhdGgKICAgICAgICAgIGlmIChzaG9vdCkgewogICAgICAgICAgICBjb25zdCBzZWN0aW9uID0gYWltZWRTZWN0aW9uKAogICAgICAgICAgICAgIHJlcG9ydC5tYW51ZmFjdHVyYWJpbGl0eT8uYm9yZXMgPz8gW10sCiAgICAgICAgICAgICAgcmVwb3J0Lm1lYXN1cmVtZW50cy5ib3VuZHMKICAgICAgICAgICAgKTsKICAgICAgICAgICAgY29uc3QgbWFya3MgPSBmZWF0dXJlTWFya3MocmVwb3J0LmJvZGllcyA/PyBbXSwgcmVwb3J0Lm1hbnVmYWN0dXJhYmlsaXR5Py5ib3JlcyA/PyBbXSk7CiAgICAgICAgICAgIGNvbnN0IHsgcG5ncyB9ID0gYXdhaXQgc2hvb3QoewogICAgICAgICAgICAgIGZpbGU6IHN0ZXBQYXRoLAogICAgICAgICAgICAgIG91dERpcjogb3B0cy5zbmFwc2hvdCwKICAgICAgICAgICAgICAuLi4oc2VjdGlvbiA/IHsgc2VjdGlvbiB9IDoge30pLAogICAgICAgICAgICAgIC4uLihtYXJrcy5sZW5ndGggPiAwID8geyBtYXJrcyB9IDoge30pLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gRGlhZ25vc3RpYyBwYXRocyBnbyB0byBzdGRlcnIg4oCUIHN0ZG91dCBzdGF5cyBhIHNpbmdsZSBjbGVhbiBKU09OIGRvY3VtZW50LgogICAgICAgICAgICBmb3IgKGNvbnN0IHAgb2YgcG5ncykgcHJvY2Vzcy5zdGRlcnIud3JpdGUoYHNuYXBzaG90OiAke3B9XG5gKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKG9wdHMuc25hcHNob3QpIHsKICAgICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdzbmFwc2hvdCBza2lwcGVkOiBTVEVQIGV4cG9ydCBwcm9kdWNlZCBubyBhcnRpZmFjdFxuJyk7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgcHVzaEVycm9yKHJlcG9ydCwgeyBtZXNzYWdlOiBgYXJ0aWZhY3Qgd3JpdGUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWAgfSk7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgLy8gVGhlIHNoYXBlIGlzIGEgbGl2ZSBXQVNNIGhhbmRsZTsgcmVsZWFzZSBpdCBiZWZvcmUgdGhlIHNlcnZlciB0YWtlcyBvdmVyICh0aGUKICAgICAgICAvLyAtLXNlcnZlIHBhdGggc3RheXMgcnVubmluZywgc28gbGVha2luZyBoZXJlIHdvdWxkIHBlcnNpc3QgZm9yIHRoZSBzZXJ2ZXIncyBsaWZldGltZSkuCiAgICAgICAgZGlzcG9zZVNoYXBlKHNoYXBlKTsKICAgICAgfQogICAgICAvLyBTZXJpYWxpemUgb25jZSBhZnRlciBhbGwgYXJ0aWZhY3Qgd3JpdGVzIHNvIHRoZSAtLWpzb24gZmlsZSBhbmQgc3Rkb3V0CiAgICAgIC8vIHJlZmxlY3QgdGhlIHNhbWUgcmVwb3J0IChpbmNsLiBhbnkgImFydGlmYWN0IHdyaXRlIGZhaWxlZCIgZXJyb3IpLgogICAgICBjb25zdCBqc29uID0gc2VyaWFsaXplUmVwb3J0KHJlcG9ydCk7CiAgICAgIC8vIGAtLWpzb24gLWAgaXMgc2F0aXNmaWVkIGJ5IHRoZSBzdGRvdXQgd3JpdGUgYmVsb3c7IG9ubHkgYSByZWFsIHBhdGggd3JpdGVzIGEgZmlsZS4KICAgICAgaWYgKG9wdHMuanNvbiAmJiBvcHRzLmpzb24gIT09ICctJykgd3JpdGVGaWxlU3luYyhvcHRzLmpzb24sIGpzb24pOwogICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShqc29uICsgJ1xuJyk7CiAgICAgIGlmICghcmVwb3J0T2socmVwb3J0KSkgcHJvY2Vzcy5leGl0Q29kZSA9IDE7CiAgICAgIC8vIEZpeHR1cmUgYXNzZXJ0aW9ucyAoUGhhc2U6IHZlcmlmeS1oZWFsIHByZWNpc2lvbi9yZWNhbGwpIG92ZXJyaWRlIHRoZSBub3JtYWwgZXhpdCBjb2RlOgogICAgICAvLyBhIGtub3duLWJhZCBwYXJ0IG11c3QgZmFpbCB0aGUgKnJpZ2h0KiB3YXkuIENvZGVzIGNvbWUgZnJvbSB0aGUga2VybmVsL2F1dGhvcmluZyBlcnJvcnMsCiAgICAgIC8vIG5vdCB0aGUgaGludCB0YWJsZSwgc28gdGhpcyBtZWFzdXJlcyB0aGUgdmVyaWZpZXIsIG5vdCBpdHMgcHJvc2UuCiAgICAgIGlmIChvcHRzLmV4cGVjdEludmFsaWQgfHwgb3B0cy5leHBlY3RDb2RlKSB7CiAgICAgICAgLy8gaGludHMgYXJlIGRlcml2ZWQgZnJvbSBlcnJvckluZm9zLCBzbyB0aGUgY29kZXMgbGl2ZSB0aGVyZTsgZGVkdXBlIHRvIGtlZXAgdGhlIGxpbmUgY2xlYW4uCiAgICAgICAgY29uc3QgY29kZXMgPSBbCiAgICAgICAgICAuLi5uZXcgU2V0KHJlcG9ydC5lcnJvckluZm9zLm1hcCgoZSkgPT4gZS5jb2RlKS5maWx0ZXIoKGMpOiBjIGlzIHN0cmluZyA9PiBCb29sZWFuKGMpKSksCiAgICAgICAgXTsKICAgICAgICBjb25zdCB2YWxpZCA9IHJlcG9ydE9rKHJlcG9ydCk7CiAgICAgICAgY29uc3QgcGFzcyA9CiAgICAgICAgICAoIW9wdHMuZXhwZWN0SW52YWxpZCB8fCAhdmFsaWQpICYmICghb3B0cy5leHBlY3RDb2RlIHx8IGNvZGVzLmluY2x1ZGVzKG9wdHMuZXhwZWN0Q29kZSkpOwogICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBwYXNzID8gMCA6IDE7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoCiAgICAgICAgICBgZXhwZWN0OiAke3Bhc3MgPyAnUEFTUycgOiAnRkFJTCd9YCArCiAgICAgICAgICAgIChvcHRzLmV4cGVjdENvZGUgPyBgIGNvZGU9JHtvcHRzLmV4cGVjdENvZGV9YCA6ICcnKSArCiAgICAgICAgICAgIChvcHRzLmV4cGVjdEludmFsaWQgPyAnIGludmFsaWQnIDogJycpICsKICAgICAgICAgICAgYCAob2s9JHt2YWxpZH0sIGNvZGVzPSR7Y29kZXMuam9pbignLCcpIHx8ICdub25lJ30pXG5gCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgd2lsbFNlcnZlID0gQm9vbGVhbihvcHRzLnNlcnZlKSAmJiBzdGVwUGF0aCAhPT0gdW5kZWZpbmVkICYmIHJlcG9ydE9rKHJlcG9ydCk7CiAgICAgIGlmICh3aWxsU2VydmUgJiYgc3RlcFBhdGgpIHsKICAgICAgICBjb25zdCB7IHNlcnZlIH0gPSBhd2FpdCBpbXBvcnQoJy4uL3NuYXBzaG90L3NlcnZlLmpzJyk7IC8vIGxhenk6IG5vIHNlcnZlciBkZXBzIG9uIHRoZSBkZWZhdWx0IHBhdGgKICAgICAgICBjb25zdCB7IHVybCwgcmV1c2VkIH0gPSBhd2FpdCBzZXJ2ZSh7IGZpbGU6IHN0ZXBQYXRoIH0pOyAvLyBidWlsZHMgYSA/ZGlyPSZmaWxlPSBVUkw7IHNlcnZlciBydW5zIHVudGlsIEN0cmwtQwogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGB2aWV3ZXI6ICR7dXJsfVxuYCk7CiAgICAgICAgLy8gQXV0by1vcGVuIG9ubHkgZm9yIGEgZnJlc2hseSBzdGFydGVkIHNlcnZlciAoYSByZXVzZWQgb25lIGFscmVhZHkgaGFzCiAgICAgICAgLy8gYSB0YWIpIGluIGFuIGludGVyYWN0aXZlIHNlc3Npb247IGAtLW5vLW9wZW5gIChvcHRzLm9wZW4gPT09IGZhbHNlKQogICAgICAgIC8vIGFsd2F5cyBzdXBwcmVzc2VzIGl0LgogICAgICAgIGlmICghcmV1c2VkICYmIG9wdHMub3BlbiAmJiBzaG91bGRBdXRvT3BlbigpKSB7CiAgICAgICAgICBvcGVuQnJvd3Nlcih1cmwpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICk7Cgpwcm9ncmFtCiAgLmNvbW1hbmQoJ21lYXN1cmUnKQogIC5hcmd1bWVudCgnPGE+JywgJ3BhdGggdG8gYSAuYnJlcC50cyBtb2R1bGUnKQogIC5hcmd1bWVudCgnW2JdJywgJ29wdGlvbmFsIHNlY29uZCBtb2R1bGU7IGlmIGdpdmVuLCBtZWFzdXJlcyBkaXN0YW5jZSBiZXR3ZWVuIHRoZSB0d28gcGFydHMnKQogIC5hY3Rpb24oYXN5bmMgKGE6IHN0cmluZywgYj86IHN0cmluZykgPT4gewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuTWVhc3VyZShyZXNvbHZlKGEpLCBiID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByZXNvbHZlKGIpKTsKICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKAogICAgICBKU09OLnN0cmluZ2lmeSh7IG9rOiByZXN1bHQuZXJyb3JzLmxlbmd0aCA9PT0gMCwgLi4ucmVzdWx0IH0sIG51bGwsIDIpICsgJ1xuJwogICAgKTsKICAgIGlmIChyZXN1bHQuZXJyb3JzLmxlbmd0aCA+IDApIHByb2Nlc3MuZXhpdENvZGUgPSAxOwogIH0pOwoKcHJvZ3JhbQogIC5jb21tYW5kKCdkaWZmJykKICAuYXJndW1lbnQoJzxhPicsICdwYXRoIHRvIHRoZSBiYXNlbGluZSAuYnJlcC50cyBtb2R1bGUnKQogIC5hcmd1bWVudCgnPGI+JywgJ3BhdGggdG8gdGhlIGNvbXBhcmlzb24gLmJyZXAudHMgbW9kdWxlJykKICAuYWN0aW9uKGFzeW5jIChhOiBzdHJpbmcsIGI6IHN0cmluZykgPT4gewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuRGlmZihyZXNvbHZlKGEpLCByZXNvbHZlKGIpKTsKICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKAogICAgICBKU09OLnN0cmluZ2lmeSh7IG9rOiByZXN1bHQuZXJyb3JzLmxlbmd0aCA9PT0gMCwgLi4ucmVzdWx0IH0sIG51bGwsIDIpICsgJ1xuJwogICAgKTsKICAgIGlmIChyZXN1bHQuZXJyb3JzLmxlbmd0aCA+IDApIHByb2Nlc3MuZXhpdENvZGUgPSAxOwogIH0pOwoKcHJvZ3JhbQogIC5jb21tYW5kKCdzbmFwc2hvdCcpCiAgLmFyZ3VtZW50KAogICAgJzxmaWxlPicsCiAgICAncGF0aCB0byBhIC5icmVwLnRzIG1vZHVsZTsgcmVuZGVycyBpc28vZnJvbnQvdG9wL3JpZ2h0IFBOR3MgKG5vIHJlcG9ydCBhc3NlcnRpb25zKScKICApCiAgLm9wdGlvbignLS1vdXQgPGRpcj4nLCAnb3V0cHV0IGRpcmVjdG9yeSBmb3IgdGhlIFBOR3MgKGRlZmF1bHQgPGZpbGU+LXNob3RzKScpCiAgLm9wdGlvbignLS1sYWJlbCA8dGFnPicsICdzdWJmb2xkZXIgZm9yIHRoaXMgcmVuZGVyIHNldCAoZS5nLiBwcmUsIHBvc3QpIGZvciBBL0IgcGFpcmluZycpCiAgLmFjdGlvbihhc3luYyAoZmlsZTogc3RyaW5nLCBvcHRzOiB7IG91dD86IHN0cmluZzsgbGFiZWw/OiBzdHJpbmcgfSkgPT4gewogICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlKGZpbGUpOwogICAgY29uc3QgYmFzZSA9IG9wdHMub3V0ID8gcmVzb2x2ZShvcHRzLm91dCkgOiBgJHtyZXNvbHZlZH0tc2hvdHNgOwogICAgY29uc3Qgb3V0RGlyID0gb3B0cy5sYWJlbCA/IGpvaW4oYmFzZSwgb3B0cy5sYWJlbCkgOiBiYXNlOwogICAgY29uc3QgeyByZXBvcnQsIHN0ZXAsIHNoYXBlIH0gPSBhd2FpdCBydW5QYXJ0KHJlc29sdmVkLCB7IHN0ZXA6IHRydWUsIG1ldHJpY3M6IHRydWUgfSk7CiAgICB0cnkgewogICAgICBpZiAoIXN0ZXApIHsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnc25hcHNob3Q6IHBhcnQgcHJvZHVjZWQgbm8gU1RFUCDigJQgbm90aGluZyB0byByZW5kZXJcbicpOwogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHNlcmlhbGl6ZVJlcG9ydChyZXBvcnQpICsgJ1xuJyk7CiAgICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHN0ZXBQYXRoID0gam9pbih0bXBkaXIoKSwgYGJyZXAtc25hcC0ke2Jhc2VuYW1lKGZpbGUpfS5zdGVwYCk7CiAgICAgIHdyaXRlRmlsZVN5bmMoc3RlcFBhdGgsIEJ1ZmZlci5mcm9tKHN0ZXApKTsKICAgICAgY29uc3Qgc2hvb3QgPSBhd2FpdCBsb2FkU25hcHNob3RTaG9vdCgpOwogICAgICBpZiAoIXNob290KSB7CiAgICAgICAgLy8gcHVwcGV0ZWVyIGFic2VudDogbG9hZFNuYXBzaG90U2hvb3Qgc2V0IGV4aXRDb2RlICsgc3RkZXJyOyBzdGlsbCBlbWl0IHRoZSByZXBvcnQgc28gYQogICAgICAgIC8vIGNhbGxlciBwYXJzaW5nIHN0ZG91dCBnZXRzIHRoZSB2YWxpZGl0eSBpbmZvIHJhdGhlciB0aGFuIGFuIGVtcHR5IGJ1ZmZlci4KICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShzZXJpYWxpemVSZXBvcnQocmVwb3J0KSArICdcbicpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBmcmVzaDogYSBwcml2YXRlIGVwaGVtZXJhbCByZW5kZXIgc2VydmVyIHNvIHBhcmFsbGVsIHNuYXBzaG90cyBkb24ndCBjb250ZW5kIG9uIDo3MzczLgogICAgICBjb25zdCBzZWN0aW9uID0gYWltZWRTZWN0aW9uKAogICAgICAgIHJlcG9ydC5tYW51ZmFjdHVyYWJpbGl0eT8uYm9yZXMgPz8gW10sCiAgICAgICAgcmVwb3J0Lm1lYXN1cmVtZW50cy5ib3VuZHMKICAgICAgKTsKICAgICAgY29uc3QgbWFya3MgPSBmZWF0dXJlTWFya3MocmVwb3J0LmJvZGllcyA/PyBbXSwgcmVwb3J0Lm1hbnVmYWN0dXJhYmlsaXR5Py5ib3JlcyA/PyBbXSk7CiAgICAgIGNvbnN0IHsgcG5ncyB9ID0gYXdhaXQgc2hvb3QoewogICAgICAgIGZpbGU6IHN0ZXBQYXRoLAogICAgICAgIG91dERpciwKICAgICAgICBmcmVzaDogdHJ1ZSwKICAgICAgICAuLi4oc2VjdGlvbiA/IHsgc2VjdGlvbiB9IDoge30pLAogICAgICAgIC4uLihtYXJrcy5sZW5ndGggPiAwID8geyBtYXJrcyB9IDoge30pLAogICAgICB9KTsKICAgICAgZm9yIChjb25zdCBwIG9mIHBuZ3MpIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAke3B9XG5gKTsKICAgIH0gZmluYWxseSB7CiAgICAgIGRpc3Bvc2VTaGFwZShzaGFwZSk7CiAgICB9CiAgfSk7Cgpwcm9ncmFtCiAgLmNvbW1hbmQoJ2luaXQnKQogIC5hcmd1bWVudCgnPG5hbWU+JywgJ3BhcnQgbmFtZTsgc2NhZmZvbGRzIDxuYW1lPi5icmVwLnRzICsgdHNjb25maWcuanNvbiArIFJFQURNRS5tZCcpCiAgLm9wdGlvbignLS1vdXQgPGRpcj4nLCAndGFyZ2V0IGRpcmVjdG9yeSAoZGVmYXVsdHMgdG8gLi88bmFtZT4pJykKICAuYWN0aW9uKChuYW1lOiBzdHJpbmcsIG9wdHM6IHsgb3V0Pzogc3RyaW5nIH0pID0+IHsKICAgIGNvbnN0IGRpciA9IHJlc29sdmUob3B0cy5vdXQgPz8gbmFtZSk7CiAgICBjb25zdCByZXN1bHQgPSBzY2FmZm9sZFBhcnQobmFtZSwgZGlyKTsKICAgIGZvciAoY29uc3QgZiBvZiByZXN1bHQuZmlsZXMpIHsKICAgICAgY29uc3QgdGFnID0gZi5jcmVhdGVkID8gJ2NyZWF0ZWQnIDogJ2V4aXN0cyAoa2VwdCknOwogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShgJHt0YWd9OiAke2YucGF0aH1cbmApOwogICAgfQogICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSArICdcbicpOwogIH0pOwoKcHJvZ3JhbQogIC5jb21tYW5kKCd3YXRjaCcpCiAgLmFyZ3VtZW50KCc8ZmlsZT4nLCAncGF0aCB0byBhIC5icmVwLnRzIG1vZHVsZTsgcmUtdmVyaWZpZXMgb24gZWFjaCBzYXZlIHVudGlsIEN0cmwtQycpCiAgLmFjdGlvbigoZmlsZTogc3RyaW5nKSA9PiB7CiAgICBjb25zdCBwYXRoID0gcmVzb2x2ZShmaWxlKTsKICAgIC8vIFJlcnVucyBpbXBvcnQgd2l0aCBhIGZyZXNoIGNhY2hlLWJ1c3RpbmcgcXVlcnkg4oCUIHRoZSBFU00gY2FjaGUgaXMga2V5ZWQgYnkgVVJMLCBzbwogICAgLy8gd2l0aG91dCBpdCBldmVyeSByZXJ1biB3b3VsZCByZS1leGVjdXRlIHRoZSBmaXJzdCB2ZXJzaW9uIG9mIHRoZSBwYXJ0IGZvcmV2ZXIuCiAgICBjb25zdCBydW4gPSBhc3luYyAoZnJlc2g6IGJvb2xlYW4pID0+IHsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCB7IHJlcG9ydCwgc2hhcGUgfSA9IGF3YWl0IHJ1blBhcnQocGF0aCwgeyBmcmVzaEltcG9ydDogZnJlc2ggfSk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHNlcmlhbGl6ZVJlcG9ydChyZXBvcnQpICsgJ1xuJyk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIGRpc3Bvc2VTaGFwZShzaGFwZSk7IC8vIGxpdmUgV0FTTSBoYW5kbGU7IHRoZSBsb29wIHJ1bnMgaW5kZWZpbml0ZWx5CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoYHdhdGNoIHJ1biBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9XG5gKTsKICAgICAgfQogICAgfTsKICAgIC8vIFNlcmlhbGl6ZSBydW5zOiBhIHNhdmUgbGFuZGluZyBtaWQtdmVyaWZ5IG11c3Qgbm90IHN0YXJ0IGEgc2Vjb25kIHJ1blBhcnQgb24gdGhlCiAgICAvLyBzaGFyZWQga2VybmVsIChyZXBvcnRzIHdvdWxkIGludGVybGVhdmUgb3V0IG9mIG9yZGVyKS4gRWRpdHMgZHVyaW5nIGEgcnVuIGNvYWxlc2NlCiAgICAvLyBpbnRvIGV4YWN0bHkgb25lIHRyYWlsaW5nIHJlcnVuLgogICAgbGV0IGluRmxpZ2h0ID0gZmFsc2U7CiAgICBsZXQgcmVydW5RdWV1ZWQgPSBmYWxzZTsKICAgIGNvbnN0IHN0YXJ0ID0gKGZyZXNoOiBib29sZWFuKTogdm9pZCA9PiB7CiAgICAgIGluRmxpZ2h0ID0gdHJ1ZTsKICAgICAgdm9pZCBydW4oZnJlc2gpLmZpbmFsbHkoKCkgPT4gewogICAgICAgIGluRmxpZ2h0ID0gZmFsc2U7CiAgICAgICAgaWYgKHJlcnVuUXVldWVkKSB7CiAgICAgICAgICByZXJ1blF1ZXVlZCA9IGZhbHNlOwogICAgICAgICAgc3RhcnQodHJ1ZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH07CiAgICBjb25zdCBzY2hlZHVsZSA9ICgpOiB2b2lkID0+IHsKICAgICAgaWYgKGluRmxpZ2h0KSB7CiAgICAgICAgcmVydW5RdWV1ZWQgPSB0cnVlOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBzdGFydCh0cnVlKTsKICAgIH07CiAgICBjb25zdCB7IHRyaWdnZXIgfSA9IGRlYm91bmNlKHNjaGVkdWxlLCBERUZBVUxUX0RFQk9VTkNFX01TKTsKICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGB3YXRjaGluZyAke3BhdGh9IChDdHJsLUMgdG8gc3RvcClcbmApOwogICAgc3RhcnQoZmFsc2UpOyAvLyBpbml0aWFsIHZlcmlmeQogICAgLy8gV2F0Y2ggdGhlIHdob2xlIHByb2plY3QgdHJlZSAobmVhcmVzdCBwYWNrYWdlLmpzb24vdHNjb25maWcuanNvbiBhYm92ZSB0aGUgZW50cnkpOgogICAgLy8gZWRpdG9ycyBvZnRlbiByZXBsYWNlIGEgZmlsZSAocmVuYW1lKSBvbiBzYXZlLCB3aGljaCBkcm9wcyBhIHdhdGNoZXIgYm91bmQgdG8gdGhlCiAgICAvLyBpbm9kZSBpdHNlbGYg4oCUIGFuZCBhIG11bHRpLWZpbGUgcHJvamVjdCBtdXN0IHJlLXZlcmlmeSB3aGVuIGFueSBzb3VyY2UgT1IgdGhlIHJvb3QKICAgIC8vIHRzY29uZmlnIGNoYW5nZXMsIG5vdCBqdXN0IGZpbGVzIGJlc2lkZSB0aGUgZW50cnkuCiAgICBjb25zdCBzdG9wV2F0Y2hpbmcgPSB3YXRjaFRyZWUod2F0Y2hSb290Rm9yKHBhdGgpLCAoZmlsZW5hbWUpID0+IHsKICAgICAgaWYgKGlzV2F0Y2hSZWxldmFudChmaWxlbmFtZSkpIHRyaWdnZXIoKTsKICAgIH0pOwogICAgY29uc3Qgc3RvcCA9ICgpID0+IHsKICAgICAgc3RvcFdhdGNoaW5nKCk7CiAgICAgIHByb2Nlc3MuZXhpdCgwKTsKICAgIH07CiAgICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBzdG9wKTsKICAgIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCBzdG9wKTsgLy8gc3VwZXJ2aXNvcnMgKGRvY2tlciBzdG9wLCBzeXN0ZW1jdGwpIHNlbmQgU0lHVEVSTQogIH0pOwoKcHJvZ3JhbQogIC5jb21tYW5kKCdleHBvcnQnKQogIC5hcmd1bWVudCgnPGZpbGU+JywgJ3BhdGggdG8gYSAuYnJlcC50cyBtb2R1bGUnKQogIC5vcHRpb24oJy0tc3RlcCcsICd3cml0ZSBhIFNURVAgYXJ0aWZhY3QnKQogIC5vcHRpb24oJy0tZ2xiJywgJ3dyaXRlIGEgR0xCIGFydGlmYWN0JykKICAub3B0aW9uKCctLXN0bCcsICd3cml0ZSBhbiBTVEwgYXJ0aWZhY3QnKQogIC5vcHRpb24oJy0tYWxsJywgJ3dyaXRlIFNURVAgKyBHTEIgKyBTVEwnKQogIC5vcHRpb24oJy0tb3V0IDxkaXI+JywgJ291dHB1dCBkaXJlY3RvcnknLCAnLicpCiAgLmFjdGlvbigKICAgIGFzeW5jICgKICAgICAgZmlsZTogc3RyaW5nLAogICAgICBvcHRzOiB7IHN0ZXA/OiBib29sZWFuOyBnbGI/OiBib29sZWFuOyBzdGw/OiBib29sZWFuOyBhbGw/OiBib29sZWFuOyBvdXQ6IHN0cmluZyB9CiAgICApID0+IHsKICAgICAgY29uc3QgZm9ybWF0cyA9IG9wdHMuYWxsCiAgICAgICAgPyB7IHN0ZXA6IHRydWUsIGdsYjogdHJ1ZSwgc3RsOiB0cnVlIH0KICAgICAgICA6IHsgc3RlcDogQm9vbGVhbihvcHRzLnN0ZXApLCBnbGI6IEJvb2xlYW4ob3B0cy5nbGIpLCBzdGw6IEJvb2xlYW4ob3B0cy5zdGwpIH07CiAgICAgIGlmICghZm9ybWF0cy5zdGVwICYmICFmb3JtYXRzLmdsYiAmJiAhZm9ybWF0cy5zdGwpIHsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnbm8gZm9ybWF0cyByZXF1ZXN0ZWQg4oCUIHBhc3MgLS1zdGVwLy0tZ2xiLy0tc3RsIG9yIC0tYWxsXG4nKTsKICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhwb3J0UGFydChyZXNvbHZlKGZpbGUpLCBmb3JtYXRzLCByZXNvbHZlKG9wdHMub3V0KSk7CiAgICAgIGZvciAoY29uc3QgcCBvZiByZXN1bHQud3JpdHRlbikgcHJvY2Vzcy5zdGRlcnIud3JpdGUoYHdyb3RlOiAke3B9XG5gKTsKICAgICAgZm9yIChjb25zdCBlIG9mIHJlc3VsdC5lcnJvcnMpIHByb2Nlc3Muc3RkZXJyLndyaXRlKGBlcnJvcjogJHtlfVxuYCk7CiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKAogICAgICAgIEpTT04uc3RyaW5naWZ5KHsgb2s6IHJlc3VsdC5vaywgd3JpdHRlbjogcmVzdWx0LndyaXR0ZW4sIGVycm9yczogcmVzdWx0LmVycm9ycyB9LCBudWxsLCAyKSArCiAgICAgICAgICAnXG4nCiAgICAgICk7CiAgICAgIGlmICghcmVzdWx0Lm9rKSBwcm9jZXNzLmV4aXRDb2RlID0gMTsKICAgIH0KICApOwoKLy8gT25seSBkcml2ZSB0aGUgQ0xJIHdoZW4gcnVuIGFzIHRoZSBlbnRyeSBzY3JpcHQsIHNvIHRlc3RzIGNhbiBpbXBvcnQgdGhlCi8vIGd1YXJkZWQgbG9hZGVycyB3aXRob3V0IGNvbW1hbmRlciBwYXJzaW5nIHRoZSB0ZXN0IHJ1bm5lcidzIGFyZ3YuCi8vIFJlc29sdmUgc3ltbGlua3Mgb24gYm90aCBzaWRlczogdGhlIG5wbS1pbnN0YWxsZWQgYmluIChub2RlX21vZHVsZXMvLmJpbi9icmVwanMpCi8vIGlzIGEgc3ltbGluaywgc28gcHJvY2Vzcy5hcmd2WzFdIHdvdWxkIG90aGVyd2lzZSBuZXZlciBlcXVhbCB0aGUgcmVhbCBtb2R1bGUgcGF0aC4KZXhwb3J0IGZ1bmN0aW9uIGlzRW50cnlwb2ludChhcmd2MTogc3RyaW5nIHwgdW5kZWZpbmVkLCBtb2R1bGVVcmw6IHN0cmluZyk6IGJvb2xlYW4gewogIGlmICghYXJndjEpIHJldHVybiBmYWxzZTsKICB0cnkgewogICAgcmV0dXJuIHJlYWxwYXRoU3luYyhhcmd2MSkgPT09IHJlYWxwYXRoU3luYyhmaWxlVVJMVG9QYXRoKG1vZHVsZVVybCkpOwogIH0gY2F0Y2ggewogICAgcmV0dXJuIGZhbHNlOwogIH0KfQoKaWYgKGlzRW50cnlwb2ludChwcm9jZXNzLmFyZ3ZbMV0sIGltcG9ydC5tZXRhLnVybCkpIHsKICB2b2lkIHByb2dyYW0ucGFyc2VBc3luYygpOwp9Cg==", "" + import.meta.url));
49
49
  }
50
50
  /**
51
51
  * Write `code` to a temp ESM directory, run the verify CLI with `makeArgs(partPath)` in a
@@ -15,6 +15,11 @@ export interface RunPartOptions {
15
15
  * judge/snapshot path opts in; the author `--check` loop stays fast.
16
16
  */
17
17
  metrics?: boolean;
18
+ /**
19
+ * Bust the ESM module cache for the part and its own imports (watch reruns pick up
20
+ * edits). The kernel realm (`brepjs`/`occt-wasm`) keeps its stable URLs either way.
21
+ */
22
+ freshImport?: boolean;
18
23
  }
19
24
  export interface RunPartResult {
20
25
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "brepjs-cad",
3
- "version": "0.174.0",
3
+ "version": "0.175.0",
4
4
  "description": "Brainstorm → design → author → verify → polish pipeline for parametric brepjs CAD, with the brep CLI",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -66,7 +66,7 @@
66
66
  "puppeteer": "^25.0.4"
67
67
  },
68
68
  "devDependencies": {
69
- "@anthropic-ai/sdk": "0.116.0",
69
+ "@anthropic-ai/sdk": "0.117.1",
70
70
  "@langfuse/client": "5.10.0",
71
71
  "@langfuse/otel": "5.10.0",
72
72
  "@langfuse/tracing": "5.10.0",
@@ -84,7 +84,7 @@
84
84
  "react": "19.2.8",
85
85
  "react-dom": "19.2.8",
86
86
  "three": "0.185.1",
87
- "tsx": "4.23.11",
87
+ "tsx": "4.23.12",
88
88
  "vite": "^8.0.0",
89
89
  "vite-plugin-dts": "^5.0.1",
90
90
  "vitest": "^4.0.0",
Binary file