@dbx-tools/cli 0.6.27 → 0.6.35

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.
@@ -4,13 +4,16 @@
4
4
  * @module
5
5
  */
6
6
  import { existsSync, readFileSync, writeFileSync } from "node:fs";
7
+ import { createRequire } from "node:module";
7
8
  import { join } from "node:path";
8
- import { fileURLToPath } from "node:url";
9
9
  import { intro, outro } from "@clack/prompts";
10
10
  import { exec, project } from "@dbx-tools/core";
11
- import { json } from "@dbx-tools/shared-core";
11
+ import { json, log } from "@dbx-tools/shared-core";
12
12
  import { childEnv, resolvePnpmArgv, runPnpm } from "./pnpm.js";
13
13
  import { rootLabel } from "./root.js";
14
+ const logger = log.logger("dbx-tools:bootstrap");
15
+ /** Published package name used for Node's self-reference manifest resolution. */
16
+ const CLI_PACKAGE = "@dbx-tools/cli";
14
17
  /** Fallback when this CLI's own version isn't a real release (an in-repo `0.0.0`). */
15
18
  const FALLBACK_PROJEN_SPECIFIER = "@dbx-tools/projen@latest";
16
19
  /**
@@ -35,7 +38,12 @@ function defaultProjenSpecifier() {
35
38
  /** This CLI's own released version, or `undefined` for an in-repo `0.0.0` build. */
36
39
  function ownVersion() {
37
40
  try {
38
- const manifestPath = fileURLToPath(new URL("../package.json", import.meta.url));
41
+ // Resolve through the package's exported `./package.json`, which works from
42
+ // both source (`src/bootstrap.ts`) and published output
43
+ // (`lib/src/bootstrap.js`). A relative URL is one level from the manifest
44
+ // in source but two levels away after compilation and silently fell back to
45
+ // `@latest` in every installed CLI.
46
+ const manifestPath = createRequire(import.meta.url).resolve(`${CLI_PACKAGE}/package.json`);
39
47
  const version = json.parseRecord(readFileSync(manifestPath, "utf8"))?.version;
40
48
  return typeof version === "string" && version !== "0.0.0" ? version : undefined;
41
49
  }
@@ -140,7 +148,27 @@ export function seedToolchain(root, projenSpecifier = defaultProjenSpecifier())
140
148
  writeFileSync(workspaceFile, WORKSPACE_SEED);
141
149
  }
142
150
  seedRegistry(root);
143
- runPnpm(["add", "-D", "projen", "typescript@^5.9.3", "tsx@^4.23.0", projenSpecifier], root);
151
+ const kernelArch = exec.spawnSync("uname", ["-m"], {
152
+ stdin: "ignore",
153
+ stdout: "capture",
154
+ stderr: "ignore",
155
+ }).stdout;
156
+ logger.info("seeding toolchain", {
157
+ node: process.version,
158
+ platform: process.platform,
159
+ arch: process.arch,
160
+ kernelArch: kernelArch || "unknown",
161
+ engine: projenSpecifier,
162
+ });
163
+ runPnpm([
164
+ "add",
165
+ "--reporter=append-only",
166
+ "-D",
167
+ "projen",
168
+ "typescript@^5.9.3",
169
+ "tsx@^4.23.0",
170
+ projenSpecifier,
171
+ ], root);
144
172
  }
145
173
  /**
146
174
  * Pin a non-default registry into the new root's `.npmrc`.
@@ -209,4 +237,4 @@ export function runInitialSynth(root) {
209
237
  check: true,
210
238
  });
211
239
  }
212
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jvb3RzdHJhcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlDLE9BQU8sRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMvRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXRDLHNGQUFzRjtBQUN0RixNQUFNLHlCQUF5QixHQUFHLDBCQUEwQixDQUFDO0FBRTdEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsU0FBUyxzQkFBc0I7SUFDN0IsTUFBTSxPQUFPLEdBQUcsVUFBVSxFQUFFLENBQUM7SUFDN0IsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUM7QUFDL0UsQ0FBQztBQUVELG9GQUFvRjtBQUNwRixTQUFTLFVBQVU7SUFDakIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLElBQUksR0FBRyxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNoRixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUM7UUFDOUUsT0FBTyxPQUFPLE9BQU8sS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDbEYsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7QUFDSCxDQUFDO0FBRUQsK0VBQStFO0FBQy9FLFNBQVMsZUFBZSxDQUFDLENBQVMsRUFBRSxDQUFTO0lBQzNDLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEYsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFRCxtRUFBbUU7QUFDbkUsU0FBUyxzQkFBc0IsQ0FBQyxJQUFZO0lBQzFDLElBQUksQ0FBQztRQUNILE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDcEYsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDO1FBQzFFLE9BQU8sT0FBTyxPQUFPLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUMzRCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsSUFBWTtJQUM5QyxNQUFNLFFBQVEsR0FBRyxVQUFVLEVBQUUsQ0FBQztJQUM5QixJQUFJLENBQUMsUUFBUTtRQUFFLE9BQU87SUFDdEIsTUFBTSxTQUFTLEdBQUcsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0MsSUFBSSxTQUFTLElBQUksZUFBZSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTztJQUNuRSxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLHNCQUFzQixFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBRUQsOEVBQThFO0FBQzlFLGlGQUFpRjtBQUNqRiwwRUFBMEU7QUFDMUUsNERBQTREO0FBQzVELE1BQU0saUJBQWlCLEdBQUc7Ozs7Q0FJekIsQ0FBQztBQUVGLGdHQUFnRztBQUNoRyxNQUFNLGNBQWMsR0FBRzs7O0NBR3RCLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsSUFBWSxFQUNaLGtCQUEwQixzQkFBc0IsRUFBRTtJQUVsRCxLQUFLLENBQUMsd0NBQXdDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFakUsYUFBYSxDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQztJQUVyQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQzVDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUMxQixhQUFhLENBQUMsUUFBUSxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUV0QixPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLEVBQUUsU0FBUyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDOUQsS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7QUFDOUUsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQzNCLElBQVksRUFDWixrQkFBMEIsc0JBQXNCLEVBQUU7SUFFbEQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNoRCxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7UUFDOUIsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDeEIscUJBQXFCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUscUJBQXFCLENBQUMsQ0FBQztJQUN4RCxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7UUFDL0IsYUFBYSxDQUFDLGFBQWEsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRW5CLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxlQUFlLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM5RixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBUyxZQUFZLENBQUMsSUFBWTtJQUNoQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDOUYsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPO0lBQ3RCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbkMsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTztJQUM5QixhQUFhLENBQUMsS0FBSyxFQUFFLFlBQVksUUFBUSxJQUFJLENBQUMsQ0FBQztBQUNqRCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFTLHFCQUFxQixDQUFDLFlBQW9CO0lBQ2pELElBQUksQ0FBQztRQUNILE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTztRQUN0QixPQUFPLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFDM0IsUUFBUSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7UUFDekIsYUFBYSxDQUFDLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLGlGQUFpRjtJQUNuRixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxJQUFZO0lBQzFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxlQUFlLEVBQUUsQ0FBQztJQUMvQyxnRkFBZ0Y7SUFDaEYsOEVBQThFO0lBQzlFLG9CQUFvQjtJQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLEVBQUU7UUFDbEUsR0FBRyxFQUFFLElBQUk7UUFDVCxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDOUMsS0FBSyxFQUFFLElBQUk7S0FDWixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCb290c3RyYXAgYSBicmFuZC1uZXcgZm9sZGVyIGludG8gYSB3b3JraW5nIGRieC10b29scyB3b3Jrc3BhY2UgYmVmb3JlIHByb2plbiBydW5zLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHsgZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5pbXBvcnQgeyBpbnRybywgb3V0cm8gfSBmcm9tIFwiQGNsYWNrL3Byb21wdHNcIjtcbmltcG9ydCB7IGV4ZWMsIHByb2plY3QgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBqc29uIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IGNoaWxkRW52LCByZXNvbHZlUG5wbUFyZ3YsIHJ1blBucG0gfSBmcm9tIFwiLi9wbnBtLnRzXCI7XG5pbXBvcnQgeyByb290TGFiZWwgfSBmcm9tIFwiLi9yb290LnRzXCI7XG5cbi8qKiBGYWxsYmFjayB3aGVuIHRoaXMgQ0xJJ3Mgb3duIHZlcnNpb24gaXNuJ3QgYSByZWFsIHJlbGVhc2UgKGFuIGluLXJlcG8gYDAuMC4wYCkuICovXG5jb25zdCBGQUxMQkFDS19QUk9KRU5fU1BFQ0lGSUVSID0gXCJAZGJ4LXRvb2xzL3Byb2plbkBsYXRlc3RcIjtcblxuLyoqXG4gKiBJbnN0YWxsIHRoZSBlbmdpbmUgYXQgVEhJUyBDTEkncyBvd24gdmVyc2lvbi4gVGhlIHR3byBhcmUgcmVsZWFzZWQgdG9nZXRoZXIgYnlcbiAqIHRoZSByb290IGBidW1wYCwgc28gdGhlIG1hdGNoaW5nIGVuZ2luZSBhbHdheXMgZXhpc3RzIG9uIHRoZSByZWdpc3RyeS5cbiAqXG4gKiBOb3QgYEBsYXRlc3RgLCBhbmQgbm90IGEgYmFyZSBgQGRieC10b29scy9wcm9qZW5gLiBBIGJhcmUgc3BlY2lmaWVyIGNhbiBsYW5kIG9uXG4gKiBhIHN0cmF5IGAwLjAuMGAsIHdob3NlIGBeMC4wLjBgIGNhcmV0IHRoZW4gcmVhY2hlcyBubyByZWFsIHJlbGVhc2UuIGBAbGF0ZXN0YFxuICogaGFzIGEgc3VidGxlciBmYWlsdXJlOiBwbnBtIDExIGFwcGxpZXMgYSBgbWluaW11bVJlbGVhc2VBZ2VgIGRlbGF5LCBzbyBmb3IgdGhlXG4gKiBmaXJzdCBkYXkgYWZ0ZXIgYSByZWxlYXNlIGl0IGRlbGliZXJhdGVseSByZXNvbHZlcyBhIGRpc3QtdGFnIHRvIHRoZSBuZXdlc3RcbiAqIHZlcnNpb24gT0xERVIgdGhhbiB0aGUgdGhyZXNob2xkIGFuZCBtZXJlbHkgbm90ZXMgdGhlIG5ld2VyIG9uZVxuICogKGArIEBkYngtdG9vbHMvcHJvamVuIDAuMS4yNCAoMC4zLjQyIGlzIGF2YWlsYWJsZSlgKS4gQSBib290c3RyYXAgcnVuIHJpZ2h0XG4gKiBhZnRlciBhIHJlbGVhc2UgdGhlcmVmb3JlIGluc3RhbGxlZCBhIG1vbnRocy1vbGQgZW5naW5lIGFnYWluc3QgYSBjdXJyZW50IENMSSxcbiAqIHdoaWNoIGlzIGhvdyBgc3luYyAtLXdhdGNoYCBkaWVkIG9uIGFuIGVuZ2luZSBwcmVkYXRpbmcgaXRzIGBjb25jdXJyZW50bHlgXG4gKiBkZXBlbmRlbmN5LiBBbiBleHBsaWNpdCByYW5nZSBhZG1pdHMgb25seSB0aGUgdmVyc2lvbiB3ZSB3YW50LCBzbyB0aGUgYWdlXG4gKiBoZXVyaXN0aWMgaGFzIG5vdGhpbmcgb2xkZXIgdG8gZmFsbCBiYWNrIHRvLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0UHJvamVuU3BlY2lmaWVyKCk6IHN0cmluZyB7XG4gIGNvbnN0IHZlcnNpb24gPSBvd25WZXJzaW9uKCk7XG4gIHJldHVybiB2ZXJzaW9uID8gYEBkYngtdG9vbHMvcHJvamVuQF4ke3ZlcnNpb259YCA6IEZBTExCQUNLX1BST0pFTl9TUEVDSUZJRVI7XG59XG5cbi8qKiBUaGlzIENMSSdzIG93biByZWxlYXNlZCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCBmb3IgYW4gaW4tcmVwbyBgMC4wLjBgIGJ1aWxkLiAqL1xuZnVuY3Rpb24gb3duVmVyc2lvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IG1hbmlmZXN0UGF0aCA9IGZpbGVVUkxUb1BhdGgobmV3IFVSTChcIi4uL3BhY2thZ2UuanNvblwiLCBpbXBvcnQubWV0YS51cmwpKTtcbiAgICBjb25zdCB2ZXJzaW9uID0ganNvbi5wYXJzZVJlY29yZChyZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCBcInV0ZjhcIikpPy52ZXJzaW9uO1xuICAgIHJldHVybiB0eXBlb2YgdmVyc2lvbiA9PT0gXCJzdHJpbmdcIiAmJiB2ZXJzaW9uICE9PSBcIjAuMC4wXCIgPyB2ZXJzaW9uIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKiBDb21wYXJlIGB4LnkuemAgdHJpcGxlczsgcmV0dXJucyA8MCwgMCwgb3IgPjAuIE1pc3NpbmcgcGFydHMgY291bnQgYXMgMC4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyhhOiBzdHJpbmcsIGI6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IHBhcnRzID0gKHY6IHN0cmluZykgPT4gdi5zcGxpdChcIi5cIikubWFwKChwKSA9PiBOdW1iZXIucGFyc2VJbnQocCwgMTApIHx8IDApO1xuICBjb25zdCBbeCwgeV0gPSBbcGFydHMoYSksIHBhcnRzKGIpXTtcbiAgcmV0dXJuIHhbMF0gLSB5WzBdIHx8IHhbMV0gLSB5WzFdIHx8IHhbMl0gLSB5WzJdO1xufVxuXG4vKiogVmVyc2lvbiBvZiB0aGUgZW5naW5lIGN1cnJlbnRseSBpbnN0YWxsZWQgYXQgYHJvb3RgLCBpZiBhbnkuICovXG5mdW5jdGlvbiBpbnN0YWxsZWRFbmdpbmVWZXJzaW9uKHJvb3Q6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBqb2luKHJvb3QsIFwibm9kZV9tb2R1bGVzXCIsIFwiQGRieC10b29sc1wiLCBcInByb2plblwiLCBcInBhY2thZ2UuanNvblwiKTtcbiAgICBjb25zdCB2ZXJzaW9uID0ganNvbi5wYXJzZVJlY29yZChyZWFkRmlsZVN5bmMobWFuaWZlc3QsIFwidXRmOFwiKSk/LnZlcnNpb247XG4gICAgcmV0dXJuIHR5cGVvZiB2ZXJzaW9uID09PSBcInN0cmluZ1wiID8gdmVyc2lvbiA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFVwZ3JhZGUgYW4gZXN0YWJsaXNoZWQgd29ya3NwYWNlIHdob3NlIGluc3RhbGxlZCBlbmdpbmUgcHJlZGF0ZXMgdGhpcyBDTEkuXG4gKlxuICogQm9vdHN0cmFwcGluZyBwaW5zIHRoZSBlbmdpbmUgb25jZSwgYW5kIG5vdGhpbmcgYWZ0ZXJ3YXJkcyByZXZpc2l0cyBpdCAtIHNvIGFcbiAqIHdvcmtzcGFjZSBjcmVhdGVkIG1vbnRocyBhZ28ga2VwdCByZXNvbHZpbmcgaXRzIG9yaWdpbmFsIGVuZ2luZSBubyBtYXR0ZXIgaG93XG4gKiBjdXJyZW50IHRoZSBDTEkgaW52b2tpbmcgaXQgd2FzLCBhbmQgZmFpbGVkIGluc2lkZSB0aGUgT0xEIGVuZ2luZSdzIGNvZGVcbiAqIChgc3luYyAtLXdhdGNoYCBkeWluZyBvbiBhIGBjb25jdXJyZW50bHlgIHRoYXQgZW5naW5lIG5ldmVyIGRlY2xhcmVkKS4gVGhlIHR3b1xuICogYXJlIHJlbGVhc2VkIGluIGxvY2tzdGVwLCBzbyB0aGlzIENMSSdzIHZlcnNpb24gaXMgZXhhY3RseSB0aGUgZW5naW5lIGl0XG4gKiBleHBlY3RzLlxuICpcbiAqIE9ubHkgZXZlciBtb3ZlcyBGT1JXQVJEOiBhbiBlbmdpbmUgYXQgb3IgYWhlYWQgb2YgdGhpcyBDTEkgaXMgbGVmdCBhbG9uZSwgc29cbiAqIGFuIG9sZGVyIENMSSBjYW5ub3QgZG93bmdyYWRlIGEgd29ya3NwYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlRW5naW5lQ3VycmVudChyb290OiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgZXhwZWN0ZWQgPSBvd25WZXJzaW9uKCk7XG4gIGlmICghZXhwZWN0ZWQpIHJldHVybjtcbiAgY29uc3QgaW5zdGFsbGVkID0gaW5zdGFsbGVkRW5naW5lVmVyc2lvbihyb290KTtcbiAgaWYgKGluc3RhbGxlZCAmJiBjb21wYXJlVmVyc2lvbnMoaW5zdGFsbGVkLCBleHBlY3RlZCkgPj0gMCkgcmV0dXJuO1xuICBydW5QbnBtKFtcImFkZFwiLCBcIi1EXCIsIGRlZmF1bHRQcm9qZW5TcGVjaWZpZXIoKV0sIHJvb3QpO1xufVxuXG4vLyBSZWFjaCB0aGUgY2xhc3MgdGhyb3VnaCBpdHMgbW9kdWxlIE5BTUVTUEFDRS4gQ3VycmVudCBlbmdpbmVzIGFsc28gaG9pc3QgaXRcbi8vIGZsYXQsIGJ1dCBldmVyeSBlbmdpbmUgZXZlciBwdWJsaXNoZWQgZXhwb3J0cyB0aGUgbmFtZXNwYWNlLCBhbmQgdGhpcyB0ZW1wbGF0ZVxuLy8gaXMgcmVzb2x2ZWQgYWdhaW5zdCBgQGxhdGVzdGAgLSBhIGZsYXQgaW1wb3J0IGRpZXMgb24gYW4gb2xkZXIgb25lIHdpdGhcbi8vIFwiZG9lcyBub3QgcHJvdmlkZSBhbiBleHBvcnQgbmFtZWQgJ0RCWFRvb2xzTm9kZVByb2plY3QnXCIuXG5jb25zdCBQUk9KRU5SQ19URU1QTEFURSA9IGBpbXBvcnQgeyBwcm9qZWN0IGFzIHByb2plY3RBcGkgfSBmcm9tIFwiQGRieC10b29scy9wcm9qZW5cIjtcblxuY29uc3QgcHJvamVjdCA9IG5ldyBwcm9qZWN0QXBpLkRCWFRvb2xzTm9kZVByb2plY3QoKTtcbnByb2plY3Quc3ludGgoKTtcbmA7XG5cbi8qKiBTZWVkIGBwbnBtLXdvcmtzcGFjZS55YW1sYCBzbyB0aGUgZmlyc3QgXFxgcG5wbSBhZGRcXGAgY2FuIGFsbG93IGVzYnVpbGQgbm9uLWludGVyYWN0aXZlbHkuICovXG5jb25zdCBXT1JLU1BBQ0VfU0VFRCA9IGBwYWNrYWdlczogW11cbmFsbG93QnVpbGRzOlxuICBlc2J1aWxkOiB0cnVlXG5gO1xuXG4vKipcbiAqIFR1cm4gYSBmb2xkZXIgaW50byBhIGZ1bmN0aW9uaW5nIGRieC10b29scyB3b3Jrc3BhY2U6IGBwbnBtIGluaXRgLCBzZWVkXG4gKiBgcG5wbS13b3Jrc3BhY2UueWFtbGAsIGFkZCBgcHJvamVuYC9gdHlwZXNjcmlwdGAvYHRzeGAgKyB0aGUgZW5naW5lIHBhY2thZ2UsXG4gKiB3cml0ZSBhIG1pbmltYWwgYC5wcm9qZW5yYy50c2AsIHN5bnRoIG9uY2UgKHdpdGggYFBST0pFTl9ESVNBQkxFX1BPU1RgKSwgdGhlblxuICogaW5zdGFsbC4gRG9lcyBub3QgcnVuIGJhcnJlbHMgLSBydW4gYHBucG0gcnVuIGJhcnJlbHNgIG9yIGEgZnVsbCBwcm9qZW4gc3ludGhcbiAqIHBvc3QtaW5zdGFsbCB0byBnZW5lcmF0ZSBwYWNrYWdlIGJhcnJlbHMuXG4gKlxuICogRXZlcnkgc3RlcCBpcyBpZGVtcG90ZW50IGFuZCBzZWxmLWd1YXJkZWQsIHNvIHRoaXMgaXMgc2FmZSB0byBydW4gYWdhaW5zdCBhXG4gKiBmb2xkZXIgdGhhdCBBTFJFQURZIGhhcyBhIGhhbmQtYXV0aG9yZWQgYC5wcm9qZW5yYy50c2AgKGFuZCBldmVuIGEgY29tbWl0dGVkXG4gKiBgcGFja2FnZS5qc29uYCkgYnV0IGlzIG1pc3NpbmcgdGhlIGluc3RhbGxlZCB0b29sY2hhaW4gLSBlLmcuIGEgZnJlc2hseSBjb3BpZWRcbiAqIHByb2plY3Qgd2hvc2UgZ2VuZXJhdGVkIGZpbGVzIChpbmNsdWRpbmcgbWFuaWZlc3RzKSBhcmUgZ2l0aWdub3JlZC4gSW4gdGhhdFxuICogY2FzZSBgcG5wbSBpbml0YCBhbmQgdGhlIGAucHJvamVucmMudHNgIHNjYWZmb2xkIGFyZSBza2lwcGVkLCBidXQgdGhlIGVuZ2luZSArXG4gKiBwcm9qZW4gKyB0c3ggYXJlIChyZSlpbnN0YWxsZWQgc28gdGhlIHN1YnNlcXVlbnQgc3ludGggY2FuIHJlZ2VuZXJhdGVcbiAqIGV2ZXJ5dGhpbmcuIFNlZSB7QGxpbmsgc2VlZFRvb2xjaGFpbn0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBib290c3RyYXBXb3Jrc3BhY2UoXG4gIHJvb3Q6IHN0cmluZyxcbiAgcHJvamVuU3BlY2lmaWVyOiBzdHJpbmcgPSBkZWZhdWx0UHJvamVuU3BlY2lmaWVyKCksXG4pOiB2b2lkIHtcbiAgaW50cm8oYEJvb3RzdHJhcHBpbmcgZGJ4LXRvb2xzIHdvcmtzcGFjZSBpbiAke3Jvb3RMYWJlbChyb290KX1gKTtcblxuICBzZWVkVG9vbGNoYWluKHJvb3QsIHByb2plblNwZWNpZmllcik7XG5cbiAgY29uc3QgcHJvamVucmMgPSBqb2luKHJvb3QsIFwiLnByb2plbnJjLnRzXCIpO1xuICBpZiAoIWV4aXN0c1N5bmMocHJvamVucmMpKSB7XG4gICAgd3JpdGVGaWxlU3luYyhwcm9qZW5yYywgUFJPSkVOUkNfVEVNUExBVEUpO1xuICB9XG5cbiAgcnVuSW5pdGlhbFN5bnRoKHJvb3QpO1xuXG4gIHJ1blBucG0oW1wiaW5zdGFsbFwiLCBcIi0tbm8tZnJvemVuLWxvY2tmaWxlXCIsIFwiLS1mb3JjZVwiXSwgcm9vdCk7XG4gIG91dHJvKFwiV29ya3NwYWNlIHJlYWR5IC0gcmUtcnVuIGRieC10b29scyBvciBhZGQgcGFja2FnZXMgdW5kZXIgcGFja2FnZXMvXCIpO1xufVxuXG4vKipcbiAqIEluc3RhbGwgdGhlIHRvb2xjaGFpbiBhIHN5bnRoIG5lZWRzIChgcHJvamVuYCwgYHR5cGVzY3JpcHRgLCBgdHN4YCwgYW5kIHRoZVxuICogZGJ4LXRvb2xzIGVuZ2luZSksIHNlZWRpbmcgYSBgcGFja2FnZS5qc29uYCBhbmQgYHBucG0td29ya3NwYWNlLnlhbWxgIGZpcnN0XG4gKiB3aGVuIGFic2VudC4gSWRlbXBvdGVudDogcnVuIGl0IHdoZW5ldmVyIHRoZSBlbmdpbmUgaXMgbWlzc2luZywgc28gYSBjb3BpZWRcbiAqIHByb2plY3Qgd2l0aCBhIGAucHJvamVucmMudHNgIGJ1dCBubyBgbm9kZV9tb2R1bGVzYC9tYW5pZmVzdHMgY2FuIGJlIGJyb3VnaHRcbiAqIHVwIHRvIGEgc3ludGgtcmVhZHkgc3RhdGUgd2l0aG91dCBmdWxsIGJvb3RzdHJhcHBpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWVkVG9vbGNoYWluKFxuICByb290OiBzdHJpbmcsXG4gIHByb2plblNwZWNpZmllcjogc3RyaW5nID0gZGVmYXVsdFByb2plblNwZWNpZmllcigpLFxuKTogdm9pZCB7XG4gIGNvbnN0IG1hbmlmZXN0UGF0aCA9IGpvaW4ocm9vdCwgXCJwYWNrYWdlLmpzb25cIik7XG4gIGlmICghZXhpc3RzU3luYyhtYW5pZmVzdFBhdGgpKSB7XG4gICAgcnVuUG5wbShbXCJpbml0XCJdLCByb290KTtcbiAgICBub3JtYWxpemVTZWVkTWFuaWZlc3QobWFuaWZlc3RQYXRoKTtcbiAgfVxuXG4gIGNvbnN0IHdvcmtzcGFjZUZpbGUgPSBqb2luKHJvb3QsIFwicG5wbS13b3Jrc3BhY2UueWFtbFwiKTtcbiAgaWYgKCFleGlzdHNTeW5jKHdvcmtzcGFjZUZpbGUpKSB7XG4gICAgd3JpdGVGaWxlU3luYyh3b3Jrc3BhY2VGaWxlLCBXT1JLU1BBQ0VfU0VFRCk7XG4gIH1cblxuICBzZWVkUmVnaXN0cnkocm9vdCk7XG5cbiAgcnVuUG5wbShbXCJhZGRcIiwgXCItRFwiLCBcInByb2plblwiLCBcInR5cGVzY3JpcHRAXjUuOS4zXCIsIFwidHN4QF40LjIzLjBcIiwgcHJvamVuU3BlY2lmaWVyXSwgcm9vdCk7XG59XG5cbi8qKlxuICogUGluIGEgbm9uLWRlZmF1bHQgcmVnaXN0cnkgaW50byB0aGUgbmV3IHJvb3QncyBgLm5wbXJjYC5cbiAqXG4gKiBUaGUgQ0xJIGFscmVhZHkgZm9yY2VzIGAtLXJlZ2lzdHJ5YCBvbnRvIHRoZSBwbnBtIGludm9jYXRpb25zIGl0IG1ha2VzIGl0c2VsZixcbiAqIGJ1dCBhIGJvb3RzdHJhcHBlZCB3b3Jrc3BhY2Ugb3V0bGl2ZXMgdGhpcyBwcm9jZXNzOiBldmVyeSBsYXRlciBgcG5wbSBpbnN0YWxsYFxuICogdGhlIGRldmVsb3BlciAob3IgcHJvamVuJ3MgcG9zdC1zeW50aCBzdGVwKSBydW5zIGlzIG9uIGl0cyBvd24uIHBucG0gaWdub3Jlc1xuICogYG5wbV9jb25maWdfcmVnaXN0cnlgIGZyb20gdGhlIGVudmlyb25tZW50LCBzbyB3aXRob3V0IGEgZmlsZSBvbiBkaXNrIHRob3NlXG4gKiBydW5zIHJldmVydCB0byBgaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYCAtIHdoaWNoIGlzIGEgaGFyZCBmYWlsdXJlIHdoZXJlXG4gKiB0aGUgY3VzdG9tIHJlZ2lzdHJ5IHdhcyB0aGUgb25seSByZWFjaGFibGUgb25lLlxuICpcbiAqIE9ubHkgd3JpdGVzIGZvciBhbiBhY3R1YWwgb3ZlcnJpZGUsIG5ldmVyIGNyZWF0ZXMgYSBmaWxlIGp1c3QgdG8gbmFtZSBucG1qcyxcbiAqIGFuZCBuZXZlciBvdmVyd3JpdGVzIGFuIGV4aXN0aW5nIGAubnBtcmNgICh0aGUgZGV2ZWxvcGVyJ3Mgb3duIHdpbnMpLlxuICovXG5mdW5jdGlvbiBzZWVkUmVnaXN0cnkocm9vdDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gcHJvamVjdC5ucG1SZWdpc3RyeShudWxsLCB7IG92ZXJyaWRlT25seTogdHJ1ZSwgZW52VmFyczogdHJ1ZSB9KT8udG9TdHJpbmcoKTtcbiAgaWYgKCFyZWdpc3RyeSkgcmV0dXJuO1xuICBjb25zdCBucG1yYyA9IGpvaW4ocm9vdCwgXCIubnBtcmNcIik7XG4gIGlmIChleGlzdHNTeW5jKG5wbXJjKSkgcmV0dXJuO1xuICB3cml0ZUZpbGVTeW5jKG5wbXJjLCBgcmVnaXN0cnk9JHtyZWdpc3RyeX1cXG5gKTtcbn1cblxuLyoqXG4gKiBNYWtlIHdoYXQgYHBucG0gaW5pdGAgcHJvZHVjZWQgc2FmZSB0byBzeW50aCBhZ2FpbnN0LiBUd28gY29ycmVjdGlvbnMsIGJvdGhcbiAqIGJlY2F1c2UgdGhhdCBvdXRwdXQgdmFyaWVzIGJ5IHBucG0gdmVyc2lvbjpcbiAqXG4gKiAgIC0gZHJvcCBgZGV2RW5naW5lc2AsIHdoaWNoIHBucG0gMTEgc2VlZHMgYXMgYHBhY2thZ2VNYW5hZ2VyOiB7IG5hbWU6IFwicG5wbVwiLFxuICogICAgIG9uRmFpbDogXCJkb3dubG9hZFwiIH1gLiBBbnkgbnBtLWJhc2VkIHRvb2wgbGF0ZXIgaW4gdGhlIGNoYWluIChhblxuICogICAgIGBucHhgL2RseCBmYWxsYmFjaykgdGhlbiByZWZ1c2VzIHdpdGggRUJBRERFVkVOR0lORVMsIGl0cyBydW5uZXIgYmVpbmcgbnBtO1xuICogICAtIGZvcmNlIGB0eXBlOiBcIm1vZHVsZVwiYCwgd2hpY2ggcG5wbSAxMSB3cml0ZXMgYW5kIHBucG0gMTAgZG9lcyBub3QuIHRzeFxuICogICAgIHBpY2tzIHRoZSBlbnRyeSdzIGZvcm1hdCBmcm9tIHRoZSBuZWFyZXN0IG1hbmlmZXN0LCBzbyB3aXRob3V0IGl0XG4gKiAgICAgYC5wcm9qZW5yYy50c2AgbG9hZHMgYXMgQ0pTIGFuZCB0aGUgZmlyc3QgZGVwZW5kZW5jeSB1c2luZyB0b3AtbGV2ZWwgYXdhaXRcbiAqICAgICBkaWVzIG9uIFwibm90IHN1cHBvcnRlZCB3aXRoIHRoZSBjanMgb3V0cHV0IGZvcm1hdFwiLlxuICpcbiAqIHByb2plbiByZWdlbmVyYXRlcyB0aGUgd2hvbGUgbWFuaWZlc3QgYXQgc3ludGgsIHNvIHRoaXMgb25seSBoYXMgdG8gaG9sZCB0aGVcbiAqIHNlZWQgdG9nZXRoZXIgbG9uZyBlbm91Z2ggdG8gZ2V0IHRoZXJlLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTZWVkTWFuaWZlc3QobWFuaWZlc3RQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IGpzb24ucGFyc2VSZWNvcmQocmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgXCJ1dGY4XCIpKTtcbiAgICBpZiAoIW1hbmlmZXN0KSByZXR1cm47XG4gICAgZGVsZXRlIG1hbmlmZXN0LmRldkVuZ2luZXM7XG4gICAgbWFuaWZlc3QudHlwZSA9IFwibW9kdWxlXCI7XG4gICAgd3JpdGVGaWxlU3luYyhtYW5pZmVzdFBhdGgsIGAke0pTT04uc3RyaW5naWZ5KG1hbmlmZXN0LCBudWxsLCAyKX1cXG5gKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gQSBtYWxmb3JtZWQvYWJzZW50IG1hbmlmZXN0IGhlcmUganVzdCBtZWFucyB0aGUgbGF0ZXIgYHBucG0gYWRkYCByZWNyZWF0ZXMgaXQuXG4gIH1cbn1cblxuLyoqXG4gKiBSdW4gdGhlIGluaXRpYWwgc3ludGggYnkgZXhlY3V0aW5nIGAucHJvamVucmMudHNgIGRpcmVjdGx5IHdpdGggdHN4ICh3aXRoXG4gKiBgUFJPSkVOX0RJU0FCTEVfUE9TVGAgc2V0KSwgTk9UIGBwcm9qZW4gPHRhc2s+YC4gVXNlIHJpZ2h0IGFmdGVyIHNlZWRpbmcgYVxuICogZnJlc2ggd29ya3NwYWNlOiB0aGUgcHJvamVuIFRBU0tTIChgc3luY2AsIGBiYXJyZWxzYCwgLi4uKSBvbmx5IGV4aXN0IG9uY2VcbiAqIGAucHJvamVucmMudHNgIGhhcyBydW4gb25jZSwgc28gYHByb2plbiBzeW5jYCBjYW4ndCBiZSB0aGUgYm9vdHN0cmFwcGluZyBzdGVwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuSW5pdGlhbFN5bnRoKHJvb3Q6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBbY29tbWFuZCwgLi4ucHJlZml4XSA9IHJlc29sdmVQbnBtQXJndigpO1xuICAvLyBObyBgLS1yZWdpc3RyeWAgaGVyZTogdGhpcyBpcyBgcG5wbSBleGVjYCwgd2hvc2UgdHJhaWxpbmcgYXJndW1lbnRzIGJlbG9uZyB0b1xuICAvLyB0c3guIFRoZSByZWdpc3RyeSByZWFjaGVzIGFueXRoaW5nIG5lc3RlZCB0aHJvdWdoIGBjaGlsZEVudmAgYW5kIHRoZSBzZWVkZWRcbiAgLy8gYC5ucG1yY2AgaW5zdGVhZC5cbiAgZXhlYy5zcGF3blN5bmMoY29tbWFuZCwgWy4uLnByZWZpeCwgXCJleGVjXCIsIFwidHN4XCIsIFwiLnByb2plbnJjLnRzXCJdLCB7XG4gICAgY3dkOiByb290LFxuICAgIGVudjogY2hpbGRFbnYoeyBQUk9KRU5fRElTQUJMRV9QT1NUOiBcInRydWVcIiB9KSxcbiAgICBjaGVjazogdHJ1ZSxcbiAgfSk7XG59XG4iXX0=
240
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jvb3RzdHJhcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDL0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV0QyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7QUFFakQsaUZBQWlGO0FBQ2pGLE1BQU0sV0FBVyxHQUFHLGdCQUFnQixDQUFDO0FBRXJDLHNGQUFzRjtBQUN0RixNQUFNLHlCQUF5QixHQUFHLDBCQUEwQixDQUFDO0FBRTdEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsU0FBUyxzQkFBc0I7SUFDN0IsTUFBTSxPQUFPLEdBQUcsVUFBVSxFQUFFLENBQUM7SUFDN0IsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUM7QUFDL0UsQ0FBQztBQUVELG9GQUFvRjtBQUNwRixTQUFTLFVBQVU7SUFDakIsSUFBSSxDQUFDO1FBQ0gsNEVBQTRFO1FBQzVFLHdEQUF3RDtRQUN4RCwwRUFBMEU7UUFDMUUsNEVBQTRFO1FBQzVFLG9DQUFvQztRQUNwQyxNQUFNLFlBQVksR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxXQUFXLGVBQWUsQ0FBQyxDQUFDO1FBQzNGLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQztRQUM5RSxPQUFPLE9BQU8sT0FBTyxLQUFLLFFBQVEsSUFBSSxPQUFPLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNsRixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUM7QUFFRCwrRUFBK0U7QUFDL0UsU0FBUyxlQUFlLENBQUMsQ0FBUyxFQUFFLENBQVM7SUFDM0MsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNsRixNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUVELG1FQUFtRTtBQUNuRSxTQUFTLHNCQUFzQixDQUFDLElBQVk7SUFDMUMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNwRixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUM7UUFDMUUsT0FBTyxPQUFPLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzNELENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxJQUFZO0lBQzlDLE1BQU0sUUFBUSxHQUFHLFVBQVUsRUFBRSxDQUFDO0lBQzlCLElBQUksQ0FBQyxRQUFRO1FBQUUsT0FBTztJQUN0QixNQUFNLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQyxJQUFJLFNBQVMsSUFBSSxlQUFlLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPO0lBQ25FLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3pELENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsaUZBQWlGO0FBQ2pGLDBFQUEwRTtBQUMxRSw0REFBNEQ7QUFDNUQsTUFBTSxpQkFBaUIsR0FBRzs7OztDQUl6QixDQUFDO0FBRUYsZ0dBQWdHO0FBQ2hHLE1BQU0sY0FBYyxHQUFHOzs7Q0FHdEIsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxJQUFZLEVBQ1osa0JBQTBCLHNCQUFzQixFQUFFO0lBRWxELEtBQUssQ0FBQyx3Q0FBd0MsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUVqRSxhQUFhLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBRXJDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDNUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQzFCLGFBQWEsQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXRCLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxzQkFBc0IsRUFBRSxTQUFTLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5RCxLQUFLLENBQUMsb0VBQW9FLENBQUMsQ0FBQztBQUM5RSxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FDM0IsSUFBWSxFQUNaLGtCQUEwQixzQkFBc0IsRUFBRTtJQUVsRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ2hELElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztRQUM5QixPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN4QixxQkFBcUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3hELElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUMvQixhQUFhLENBQUMsYUFBYSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFbkIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNqRCxLQUFLLEVBQUUsUUFBUTtRQUNmLE1BQU0sRUFBRSxTQUFTO1FBQ2pCLE1BQU0sRUFBRSxRQUFRO0tBQ2pCLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDVixNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFO1FBQy9CLElBQUksRUFBRSxPQUFPLENBQUMsT0FBTztRQUNyQixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7UUFDMUIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1FBQ2xCLFVBQVUsRUFBRSxVQUFVLElBQUksU0FBUztRQUNuQyxNQUFNLEVBQUUsZUFBZTtLQUN4QixDQUFDLENBQUM7SUFDSCxPQUFPLENBQ0w7UUFDRSxLQUFLO1FBQ0wsd0JBQXdCO1FBQ3hCLElBQUk7UUFDSixRQUFRO1FBQ1IsbUJBQW1CO1FBQ25CLGFBQWE7UUFDYixlQUFlO0tBQ2hCLEVBQ0QsSUFBSSxDQUNMLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBUyxZQUFZLENBQUMsSUFBWTtJQUNoQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDOUYsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPO0lBQ3RCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbkMsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTztJQUM5QixhQUFhLENBQUMsS0FBSyxFQUFFLFlBQVksUUFBUSxJQUFJLENBQUMsQ0FBQztBQUNqRCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFTLHFCQUFxQixDQUFDLFlBQW9CO0lBQ2pELElBQUksQ0FBQztRQUNILE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTztRQUN0QixPQUFPLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFDM0IsUUFBUSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7UUFDekIsYUFBYSxDQUFDLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLGlGQUFpRjtJQUNuRixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxJQUFZO0lBQzFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxlQUFlLEVBQUUsQ0FBQztJQUMvQyxnRkFBZ0Y7SUFDaEYsOEVBQThFO0lBQzlFLG9CQUFvQjtJQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLEVBQUU7UUFDbEUsR0FBRyxFQUFFLElBQUk7UUFDVCxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDOUMsS0FBSyxFQUFFLElBQUk7S0FDWixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCb290c3RyYXAgYSBicmFuZC1uZXcgZm9sZGVyIGludG8gYSB3b3JraW5nIGRieC10b29scyB3b3Jrc3BhY2UgYmVmb3JlIHByb2plbiBydW5zLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHsgZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBpbnRybywgb3V0cm8gfSBmcm9tIFwiQGNsYWNrL3Byb21wdHNcIjtcbmltcG9ydCB7IGV4ZWMsIHByb2plY3QgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBqc29uLCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgY2hpbGRFbnYsIHJlc29sdmVQbnBtQXJndiwgcnVuUG5wbSB9IGZyb20gXCIuL3BucG0udHNcIjtcbmltcG9ydCB7IHJvb3RMYWJlbCB9IGZyb20gXCIuL3Jvb3QudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImRieC10b29sczpib290c3RyYXBcIik7XG5cbi8qKiBQdWJsaXNoZWQgcGFja2FnZSBuYW1lIHVzZWQgZm9yIE5vZGUncyBzZWxmLXJlZmVyZW5jZSBtYW5pZmVzdCByZXNvbHV0aW9uLiAqL1xuY29uc3QgQ0xJX1BBQ0tBR0UgPSBcIkBkYngtdG9vbHMvY2xpXCI7XG5cbi8qKiBGYWxsYmFjayB3aGVuIHRoaXMgQ0xJJ3Mgb3duIHZlcnNpb24gaXNuJ3QgYSByZWFsIHJlbGVhc2UgKGFuIGluLXJlcG8gYDAuMC4wYCkuICovXG5jb25zdCBGQUxMQkFDS19QUk9KRU5fU1BFQ0lGSUVSID0gXCJAZGJ4LXRvb2xzL3Byb2plbkBsYXRlc3RcIjtcblxuLyoqXG4gKiBJbnN0YWxsIHRoZSBlbmdpbmUgYXQgVEhJUyBDTEkncyBvd24gdmVyc2lvbi4gVGhlIHR3byBhcmUgcmVsZWFzZWQgdG9nZXRoZXIgYnlcbiAqIHRoZSByb290IGBidW1wYCwgc28gdGhlIG1hdGNoaW5nIGVuZ2luZSBhbHdheXMgZXhpc3RzIG9uIHRoZSByZWdpc3RyeS5cbiAqXG4gKiBOb3QgYEBsYXRlc3RgLCBhbmQgbm90IGEgYmFyZSBgQGRieC10b29scy9wcm9qZW5gLiBBIGJhcmUgc3BlY2lmaWVyIGNhbiBsYW5kIG9uXG4gKiBhIHN0cmF5IGAwLjAuMGAsIHdob3NlIGBeMC4wLjBgIGNhcmV0IHRoZW4gcmVhY2hlcyBubyByZWFsIHJlbGVhc2UuIGBAbGF0ZXN0YFxuICogaGFzIGEgc3VidGxlciBmYWlsdXJlOiBwbnBtIDExIGFwcGxpZXMgYSBgbWluaW11bVJlbGVhc2VBZ2VgIGRlbGF5LCBzbyBmb3IgdGhlXG4gKiBmaXJzdCBkYXkgYWZ0ZXIgYSByZWxlYXNlIGl0IGRlbGliZXJhdGVseSByZXNvbHZlcyBhIGRpc3QtdGFnIHRvIHRoZSBuZXdlc3RcbiAqIHZlcnNpb24gT0xERVIgdGhhbiB0aGUgdGhyZXNob2xkIGFuZCBtZXJlbHkgbm90ZXMgdGhlIG5ld2VyIG9uZVxuICogKGArIEBkYngtdG9vbHMvcHJvamVuIDAuMS4yNCAoMC4zLjQyIGlzIGF2YWlsYWJsZSlgKS4gQSBib290c3RyYXAgcnVuIHJpZ2h0XG4gKiBhZnRlciBhIHJlbGVhc2UgdGhlcmVmb3JlIGluc3RhbGxlZCBhIG1vbnRocy1vbGQgZW5naW5lIGFnYWluc3QgYSBjdXJyZW50IENMSSxcbiAqIHdoaWNoIGlzIGhvdyBgc3luYyAtLXdhdGNoYCBkaWVkIG9uIGFuIGVuZ2luZSBwcmVkYXRpbmcgaXRzIGBjb25jdXJyZW50bHlgXG4gKiBkZXBlbmRlbmN5LiBBbiBleHBsaWNpdCByYW5nZSBhZG1pdHMgb25seSB0aGUgdmVyc2lvbiB3ZSB3YW50LCBzbyB0aGUgYWdlXG4gKiBoZXVyaXN0aWMgaGFzIG5vdGhpbmcgb2xkZXIgdG8gZmFsbCBiYWNrIHRvLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0UHJvamVuU3BlY2lmaWVyKCk6IHN0cmluZyB7XG4gIGNvbnN0IHZlcnNpb24gPSBvd25WZXJzaW9uKCk7XG4gIHJldHVybiB2ZXJzaW9uID8gYEBkYngtdG9vbHMvcHJvamVuQF4ke3ZlcnNpb259YCA6IEZBTExCQUNLX1BST0pFTl9TUEVDSUZJRVI7XG59XG5cbi8qKiBUaGlzIENMSSdzIG93biByZWxlYXNlZCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCBmb3IgYW4gaW4tcmVwbyBgMC4wLjBgIGJ1aWxkLiAqL1xuZnVuY3Rpb24gb3duVmVyc2lvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIC8vIFJlc29sdmUgdGhyb3VnaCB0aGUgcGFja2FnZSdzIGV4cG9ydGVkIGAuL3BhY2thZ2UuanNvbmAsIHdoaWNoIHdvcmtzIGZyb21cbiAgICAvLyBib3RoIHNvdXJjZSAoYHNyYy9ib290c3RyYXAudHNgKSBhbmQgcHVibGlzaGVkIG91dHB1dFxuICAgIC8vIChgbGliL3NyYy9ib290c3RyYXAuanNgKS4gQSByZWxhdGl2ZSBVUkwgaXMgb25lIGxldmVsIGZyb20gdGhlIG1hbmlmZXN0XG4gICAgLy8gaW4gc291cmNlIGJ1dCB0d28gbGV2ZWxzIGF3YXkgYWZ0ZXIgY29tcGlsYXRpb24gYW5kIHNpbGVudGx5IGZlbGwgYmFjayB0b1xuICAgIC8vIGBAbGF0ZXN0YCBpbiBldmVyeSBpbnN0YWxsZWQgQ0xJLlxuICAgIGNvbnN0IG1hbmlmZXN0UGF0aCA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKS5yZXNvbHZlKGAke0NMSV9QQUNLQUdFfS9wYWNrYWdlLmpzb25gKTtcbiAgICBjb25zdCB2ZXJzaW9uID0ganNvbi5wYXJzZVJlY29yZChyZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCBcInV0ZjhcIikpPy52ZXJzaW9uO1xuICAgIHJldHVybiB0eXBlb2YgdmVyc2lvbiA9PT0gXCJzdHJpbmdcIiAmJiB2ZXJzaW9uICE9PSBcIjAuMC4wXCIgPyB2ZXJzaW9uIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKiBDb21wYXJlIGB4LnkuemAgdHJpcGxlczsgcmV0dXJucyA8MCwgMCwgb3IgPjAuIE1pc3NpbmcgcGFydHMgY291bnQgYXMgMC4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyhhOiBzdHJpbmcsIGI6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IHBhcnRzID0gKHY6IHN0cmluZykgPT4gdi5zcGxpdChcIi5cIikubWFwKChwKSA9PiBOdW1iZXIucGFyc2VJbnQocCwgMTApIHx8IDApO1xuICBjb25zdCBbeCwgeV0gPSBbcGFydHMoYSksIHBhcnRzKGIpXTtcbiAgcmV0dXJuIHhbMF0gLSB5WzBdIHx8IHhbMV0gLSB5WzFdIHx8IHhbMl0gLSB5WzJdO1xufVxuXG4vKiogVmVyc2lvbiBvZiB0aGUgZW5naW5lIGN1cnJlbnRseSBpbnN0YWxsZWQgYXQgYHJvb3RgLCBpZiBhbnkuICovXG5mdW5jdGlvbiBpbnN0YWxsZWRFbmdpbmVWZXJzaW9uKHJvb3Q6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBqb2luKHJvb3QsIFwibm9kZV9tb2R1bGVzXCIsIFwiQGRieC10b29sc1wiLCBcInByb2plblwiLCBcInBhY2thZ2UuanNvblwiKTtcbiAgICBjb25zdCB2ZXJzaW9uID0ganNvbi5wYXJzZVJlY29yZChyZWFkRmlsZVN5bmMobWFuaWZlc3QsIFwidXRmOFwiKSk/LnZlcnNpb247XG4gICAgcmV0dXJuIHR5cGVvZiB2ZXJzaW9uID09PSBcInN0cmluZ1wiID8gdmVyc2lvbiA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFVwZ3JhZGUgYW4gZXN0YWJsaXNoZWQgd29ya3NwYWNlIHdob3NlIGluc3RhbGxlZCBlbmdpbmUgcHJlZGF0ZXMgdGhpcyBDTEkuXG4gKlxuICogQm9vdHN0cmFwcGluZyBwaW5zIHRoZSBlbmdpbmUgb25jZSwgYW5kIG5vdGhpbmcgYWZ0ZXJ3YXJkcyByZXZpc2l0cyBpdCAtIHNvIGFcbiAqIHdvcmtzcGFjZSBjcmVhdGVkIG1vbnRocyBhZ28ga2VwdCByZXNvbHZpbmcgaXRzIG9yaWdpbmFsIGVuZ2luZSBubyBtYXR0ZXIgaG93XG4gKiBjdXJyZW50IHRoZSBDTEkgaW52b2tpbmcgaXQgd2FzLCBhbmQgZmFpbGVkIGluc2lkZSB0aGUgT0xEIGVuZ2luZSdzIGNvZGVcbiAqIChgc3luYyAtLXdhdGNoYCBkeWluZyBvbiBhIGBjb25jdXJyZW50bHlgIHRoYXQgZW5naW5lIG5ldmVyIGRlY2xhcmVkKS4gVGhlIHR3b1xuICogYXJlIHJlbGVhc2VkIGluIGxvY2tzdGVwLCBzbyB0aGlzIENMSSdzIHZlcnNpb24gaXMgZXhhY3RseSB0aGUgZW5naW5lIGl0XG4gKiBleHBlY3RzLlxuICpcbiAqIE9ubHkgZXZlciBtb3ZlcyBGT1JXQVJEOiBhbiBlbmdpbmUgYXQgb3IgYWhlYWQgb2YgdGhpcyBDTEkgaXMgbGVmdCBhbG9uZSwgc29cbiAqIGFuIG9sZGVyIENMSSBjYW5ub3QgZG93bmdyYWRlIGEgd29ya3NwYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlRW5naW5lQ3VycmVudChyb290OiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgZXhwZWN0ZWQgPSBvd25WZXJzaW9uKCk7XG4gIGlmICghZXhwZWN0ZWQpIHJldHVybjtcbiAgY29uc3QgaW5zdGFsbGVkID0gaW5zdGFsbGVkRW5naW5lVmVyc2lvbihyb290KTtcbiAgaWYgKGluc3RhbGxlZCAmJiBjb21wYXJlVmVyc2lvbnMoaW5zdGFsbGVkLCBleHBlY3RlZCkgPj0gMCkgcmV0dXJuO1xuICBydW5QbnBtKFtcImFkZFwiLCBcIi1EXCIsIGRlZmF1bHRQcm9qZW5TcGVjaWZpZXIoKV0sIHJvb3QpO1xufVxuXG4vLyBSZWFjaCB0aGUgY2xhc3MgdGhyb3VnaCBpdHMgbW9kdWxlIE5BTUVTUEFDRS4gQ3VycmVudCBlbmdpbmVzIGFsc28gaG9pc3QgaXRcbi8vIGZsYXQsIGJ1dCBldmVyeSBlbmdpbmUgZXZlciBwdWJsaXNoZWQgZXhwb3J0cyB0aGUgbmFtZXNwYWNlLCBhbmQgdGhpcyB0ZW1wbGF0ZVxuLy8gaXMgcmVzb2x2ZWQgYWdhaW5zdCBgQGxhdGVzdGAgLSBhIGZsYXQgaW1wb3J0IGRpZXMgb24gYW4gb2xkZXIgb25lIHdpdGhcbi8vIFwiZG9lcyBub3QgcHJvdmlkZSBhbiBleHBvcnQgbmFtZWQgJ0RCWFRvb2xzTm9kZVByb2plY3QnXCIuXG5jb25zdCBQUk9KRU5SQ19URU1QTEFURSA9IGBpbXBvcnQgeyBwcm9qZWN0IGFzIHByb2plY3RBcGkgfSBmcm9tIFwiQGRieC10b29scy9wcm9qZW5cIjtcblxuY29uc3QgcHJvamVjdCA9IG5ldyBwcm9qZWN0QXBpLkRCWFRvb2xzTm9kZVByb2plY3QoKTtcbnByb2plY3Quc3ludGgoKTtcbmA7XG5cbi8qKiBTZWVkIGBwbnBtLXdvcmtzcGFjZS55YW1sYCBzbyB0aGUgZmlyc3QgXFxgcG5wbSBhZGRcXGAgY2FuIGFsbG93IGVzYnVpbGQgbm9uLWludGVyYWN0aXZlbHkuICovXG5jb25zdCBXT1JLU1BBQ0VfU0VFRCA9IGBwYWNrYWdlczogW11cbmFsbG93QnVpbGRzOlxuICBlc2J1aWxkOiB0cnVlXG5gO1xuXG4vKipcbiAqIFR1cm4gYSBmb2xkZXIgaW50byBhIGZ1bmN0aW9uaW5nIGRieC10b29scyB3b3Jrc3BhY2U6IGBwbnBtIGluaXRgLCBzZWVkXG4gKiBgcG5wbS13b3Jrc3BhY2UueWFtbGAsIGFkZCBgcHJvamVuYC9gdHlwZXNjcmlwdGAvYHRzeGAgKyB0aGUgZW5naW5lIHBhY2thZ2UsXG4gKiB3cml0ZSBhIG1pbmltYWwgYC5wcm9qZW5yYy50c2AsIHN5bnRoIG9uY2UgKHdpdGggYFBST0pFTl9ESVNBQkxFX1BPU1RgKSwgdGhlblxuICogaW5zdGFsbC4gRG9lcyBub3QgcnVuIGJhcnJlbHMgLSBydW4gYHBucG0gcnVuIGJhcnJlbHNgIG9yIGEgZnVsbCBwcm9qZW4gc3ludGhcbiAqIHBvc3QtaW5zdGFsbCB0byBnZW5lcmF0ZSBwYWNrYWdlIGJhcnJlbHMuXG4gKlxuICogRXZlcnkgc3RlcCBpcyBpZGVtcG90ZW50IGFuZCBzZWxmLWd1YXJkZWQsIHNvIHRoaXMgaXMgc2FmZSB0byBydW4gYWdhaW5zdCBhXG4gKiBmb2xkZXIgdGhhdCBBTFJFQURZIGhhcyBhIGhhbmQtYXV0aG9yZWQgYC5wcm9qZW5yYy50c2AgKGFuZCBldmVuIGEgY29tbWl0dGVkXG4gKiBgcGFja2FnZS5qc29uYCkgYnV0IGlzIG1pc3NpbmcgdGhlIGluc3RhbGxlZCB0b29sY2hhaW4gLSBlLmcuIGEgZnJlc2hseSBjb3BpZWRcbiAqIHByb2plY3Qgd2hvc2UgZ2VuZXJhdGVkIGZpbGVzIChpbmNsdWRpbmcgbWFuaWZlc3RzKSBhcmUgZ2l0aWdub3JlZC4gSW4gdGhhdFxuICogY2FzZSBgcG5wbSBpbml0YCBhbmQgdGhlIGAucHJvamVucmMudHNgIHNjYWZmb2xkIGFyZSBza2lwcGVkLCBidXQgdGhlIGVuZ2luZSArXG4gKiBwcm9qZW4gKyB0c3ggYXJlIChyZSlpbnN0YWxsZWQgc28gdGhlIHN1YnNlcXVlbnQgc3ludGggY2FuIHJlZ2VuZXJhdGVcbiAqIGV2ZXJ5dGhpbmcuIFNlZSB7QGxpbmsgc2VlZFRvb2xjaGFpbn0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBib290c3RyYXBXb3Jrc3BhY2UoXG4gIHJvb3Q6IHN0cmluZyxcbiAgcHJvamVuU3BlY2lmaWVyOiBzdHJpbmcgPSBkZWZhdWx0UHJvamVuU3BlY2lmaWVyKCksXG4pOiB2b2lkIHtcbiAgaW50cm8oYEJvb3RzdHJhcHBpbmcgZGJ4LXRvb2xzIHdvcmtzcGFjZSBpbiAke3Jvb3RMYWJlbChyb290KX1gKTtcblxuICBzZWVkVG9vbGNoYWluKHJvb3QsIHByb2plblNwZWNpZmllcik7XG5cbiAgY29uc3QgcHJvamVucmMgPSBqb2luKHJvb3QsIFwiLnByb2plbnJjLnRzXCIpO1xuICBpZiAoIWV4aXN0c1N5bmMocHJvamVucmMpKSB7XG4gICAgd3JpdGVGaWxlU3luYyhwcm9qZW5yYywgUFJPSkVOUkNfVEVNUExBVEUpO1xuICB9XG5cbiAgcnVuSW5pdGlhbFN5bnRoKHJvb3QpO1xuXG4gIHJ1blBucG0oW1wiaW5zdGFsbFwiLCBcIi0tbm8tZnJvemVuLWxvY2tmaWxlXCIsIFwiLS1mb3JjZVwiXSwgcm9vdCk7XG4gIG91dHJvKFwiV29ya3NwYWNlIHJlYWR5IC0gcmUtcnVuIGRieC10b29scyBvciBhZGQgcGFja2FnZXMgdW5kZXIgcGFja2FnZXMvXCIpO1xufVxuXG4vKipcbiAqIEluc3RhbGwgdGhlIHRvb2xjaGFpbiBhIHN5bnRoIG5lZWRzIChgcHJvamVuYCwgYHR5cGVzY3JpcHRgLCBgdHN4YCwgYW5kIHRoZVxuICogZGJ4LXRvb2xzIGVuZ2luZSksIHNlZWRpbmcgYSBgcGFja2FnZS5qc29uYCBhbmQgYHBucG0td29ya3NwYWNlLnlhbWxgIGZpcnN0XG4gKiB3aGVuIGFic2VudC4gSWRlbXBvdGVudDogcnVuIGl0IHdoZW5ldmVyIHRoZSBlbmdpbmUgaXMgbWlzc2luZywgc28gYSBjb3BpZWRcbiAqIHByb2plY3Qgd2l0aCBhIGAucHJvamVucmMudHNgIGJ1dCBubyBgbm9kZV9tb2R1bGVzYC9tYW5pZmVzdHMgY2FuIGJlIGJyb3VnaHRcbiAqIHVwIHRvIGEgc3ludGgtcmVhZHkgc3RhdGUgd2l0aG91dCBmdWxsIGJvb3RzdHJhcHBpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWVkVG9vbGNoYWluKFxuICByb290OiBzdHJpbmcsXG4gIHByb2plblNwZWNpZmllcjogc3RyaW5nID0gZGVmYXVsdFByb2plblNwZWNpZmllcigpLFxuKTogdm9pZCB7XG4gIGNvbnN0IG1hbmlmZXN0UGF0aCA9IGpvaW4ocm9vdCwgXCJwYWNrYWdlLmpzb25cIik7XG4gIGlmICghZXhpc3RzU3luYyhtYW5pZmVzdFBhdGgpKSB7XG4gICAgcnVuUG5wbShbXCJpbml0XCJdLCByb290KTtcbiAgICBub3JtYWxpemVTZWVkTWFuaWZlc3QobWFuaWZlc3RQYXRoKTtcbiAgfVxuXG4gIGNvbnN0IHdvcmtzcGFjZUZpbGUgPSBqb2luKHJvb3QsIFwicG5wbS13b3Jrc3BhY2UueWFtbFwiKTtcbiAgaWYgKCFleGlzdHNTeW5jKHdvcmtzcGFjZUZpbGUpKSB7XG4gICAgd3JpdGVGaWxlU3luYyh3b3Jrc3BhY2VGaWxlLCBXT1JLU1BBQ0VfU0VFRCk7XG4gIH1cblxuICBzZWVkUmVnaXN0cnkocm9vdCk7XG5cbiAgY29uc3Qga2VybmVsQXJjaCA9IGV4ZWMuc3Bhd25TeW5jKFwidW5hbWVcIiwgW1wiLW1cIl0sIHtcbiAgICBzdGRpbjogXCJpZ25vcmVcIixcbiAgICBzdGRvdXQ6IFwiY2FwdHVyZVwiLFxuICAgIHN0ZGVycjogXCJpZ25vcmVcIixcbiAgfSkuc3Rkb3V0O1xuICBsb2dnZXIuaW5mbyhcInNlZWRpbmcgdG9vbGNoYWluXCIsIHtcbiAgICBub2RlOiBwcm9jZXNzLnZlcnNpb24sXG4gICAgcGxhdGZvcm06IHByb2Nlc3MucGxhdGZvcm0sXG4gICAgYXJjaDogcHJvY2Vzcy5hcmNoLFxuICAgIGtlcm5lbEFyY2g6IGtlcm5lbEFyY2ggfHwgXCJ1bmtub3duXCIsXG4gICAgZW5naW5lOiBwcm9qZW5TcGVjaWZpZXIsXG4gIH0pO1xuICBydW5QbnBtKFxuICAgIFtcbiAgICAgIFwiYWRkXCIsXG4gICAgICBcIi0tcmVwb3J0ZXI9YXBwZW5kLW9ubHlcIixcbiAgICAgIFwiLURcIixcbiAgICAgIFwicHJvamVuXCIsXG4gICAgICBcInR5cGVzY3JpcHRAXjUuOS4zXCIsXG4gICAgICBcInRzeEBeNC4yMy4wXCIsXG4gICAgICBwcm9qZW5TcGVjaWZpZXIsXG4gICAgXSxcbiAgICByb290LFxuICApO1xufVxuXG4vKipcbiAqIFBpbiBhIG5vbi1kZWZhdWx0IHJlZ2lzdHJ5IGludG8gdGhlIG5ldyByb290J3MgYC5ucG1yY2AuXG4gKlxuICogVGhlIENMSSBhbHJlYWR5IGZvcmNlcyBgLS1yZWdpc3RyeWAgb250byB0aGUgcG5wbSBpbnZvY2F0aW9ucyBpdCBtYWtlcyBpdHNlbGYsXG4gKiBidXQgYSBib290c3RyYXBwZWQgd29ya3NwYWNlIG91dGxpdmVzIHRoaXMgcHJvY2VzczogZXZlcnkgbGF0ZXIgYHBucG0gaW5zdGFsbGBcbiAqIHRoZSBkZXZlbG9wZXIgKG9yIHByb2plbidzIHBvc3Qtc3ludGggc3RlcCkgcnVucyBpcyBvbiBpdHMgb3duLiBwbnBtIGlnbm9yZXNcbiAqIGBucG1fY29uZmlnX3JlZ2lzdHJ5YCBmcm9tIHRoZSBlbnZpcm9ubWVudCwgc28gd2l0aG91dCBhIGZpbGUgb24gZGlzayB0aG9zZVxuICogcnVucyByZXZlcnQgdG8gYGh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2AgLSB3aGljaCBpcyBhIGhhcmQgZmFpbHVyZSB3aGVyZVxuICogdGhlIGN1c3RvbSByZWdpc3RyeSB3YXMgdGhlIG9ubHkgcmVhY2hhYmxlIG9uZS5cbiAqXG4gKiBPbmx5IHdyaXRlcyBmb3IgYW4gYWN0dWFsIG92ZXJyaWRlLCBuZXZlciBjcmVhdGVzIGEgZmlsZSBqdXN0IHRvIG5hbWUgbnBtanMsXG4gKiBhbmQgbmV2ZXIgb3ZlcndyaXRlcyBhbiBleGlzdGluZyBgLm5wbXJjYCAodGhlIGRldmVsb3BlcidzIG93biB3aW5zKS5cbiAqL1xuZnVuY3Rpb24gc2VlZFJlZ2lzdHJ5KHJvb3Q6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCByZWdpc3RyeSA9IHByb2plY3QubnBtUmVnaXN0cnkobnVsbCwgeyBvdmVycmlkZU9ubHk6IHRydWUsIGVudlZhcnM6IHRydWUgfSk/LnRvU3RyaW5nKCk7XG4gIGlmICghcmVnaXN0cnkpIHJldHVybjtcbiAgY29uc3QgbnBtcmMgPSBqb2luKHJvb3QsIFwiLm5wbXJjXCIpO1xuICBpZiAoZXhpc3RzU3luYyhucG1yYykpIHJldHVybjtcbiAgd3JpdGVGaWxlU3luYyhucG1yYywgYHJlZ2lzdHJ5PSR7cmVnaXN0cnl9XFxuYCk7XG59XG5cbi8qKlxuICogTWFrZSB3aGF0IGBwbnBtIGluaXRgIHByb2R1Y2VkIHNhZmUgdG8gc3ludGggYWdhaW5zdC4gVHdvIGNvcnJlY3Rpb25zLCBib3RoXG4gKiBiZWNhdXNlIHRoYXQgb3V0cHV0IHZhcmllcyBieSBwbnBtIHZlcnNpb246XG4gKlxuICogICAtIGRyb3AgYGRldkVuZ2luZXNgLCB3aGljaCBwbnBtIDExIHNlZWRzIGFzIGBwYWNrYWdlTWFuYWdlcjogeyBuYW1lOiBcInBucG1cIixcbiAqICAgICBvbkZhaWw6IFwiZG93bmxvYWRcIiB9YC4gQW55IG5wbS1iYXNlZCB0b29sIGxhdGVyIGluIHRoZSBjaGFpbiAoYW5cbiAqICAgICBgbnB4YC9kbHggZmFsbGJhY2spIHRoZW4gcmVmdXNlcyB3aXRoIEVCQURERVZFTkdJTkVTLCBpdHMgcnVubmVyIGJlaW5nIG5wbTtcbiAqICAgLSBmb3JjZSBgdHlwZTogXCJtb2R1bGVcImAsIHdoaWNoIHBucG0gMTEgd3JpdGVzIGFuZCBwbnBtIDEwIGRvZXMgbm90LiB0c3hcbiAqICAgICBwaWNrcyB0aGUgZW50cnkncyBmb3JtYXQgZnJvbSB0aGUgbmVhcmVzdCBtYW5pZmVzdCwgc28gd2l0aG91dCBpdFxuICogICAgIGAucHJvamVucmMudHNgIGxvYWRzIGFzIENKUyBhbmQgdGhlIGZpcnN0IGRlcGVuZGVuY3kgdXNpbmcgdG9wLWxldmVsIGF3YWl0XG4gKiAgICAgZGllcyBvbiBcIm5vdCBzdXBwb3J0ZWQgd2l0aCB0aGUgY2pzIG91dHB1dCBmb3JtYXRcIi5cbiAqXG4gKiBwcm9qZW4gcmVnZW5lcmF0ZXMgdGhlIHdob2xlIG1hbmlmZXN0IGF0IHN5bnRoLCBzbyB0aGlzIG9ubHkgaGFzIHRvIGhvbGQgdGhlXG4gKiBzZWVkIHRvZ2V0aGVyIGxvbmcgZW5vdWdoIHRvIGdldCB0aGVyZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU2VlZE1hbmlmZXN0KG1hbmlmZXN0UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBqc29uLnBhcnNlUmVjb3JkKHJlYWRGaWxlU3luYyhtYW5pZmVzdFBhdGgsIFwidXRmOFwiKSk7XG4gICAgaWYgKCFtYW5pZmVzdCkgcmV0dXJuO1xuICAgIGRlbGV0ZSBtYW5pZmVzdC5kZXZFbmdpbmVzO1xuICAgIG1hbmlmZXN0LnR5cGUgPSBcIm1vZHVsZVwiO1xuICAgIHdyaXRlRmlsZVN5bmMobWFuaWZlc3RQYXRoLCBgJHtKU09OLnN0cmluZ2lmeShtYW5pZmVzdCwgbnVsbCwgMil9XFxuYCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEEgbWFsZm9ybWVkL2Fic2VudCBtYW5pZmVzdCBoZXJlIGp1c3QgbWVhbnMgdGhlIGxhdGVyIGBwbnBtIGFkZGAgcmVjcmVhdGVzIGl0LlxuICB9XG59XG5cbi8qKlxuICogUnVuIHRoZSBpbml0aWFsIHN5bnRoIGJ5IGV4ZWN1dGluZyBgLnByb2plbnJjLnRzYCBkaXJlY3RseSB3aXRoIHRzeCAod2l0aFxuICogYFBST0pFTl9ESVNBQkxFX1BPU1RgIHNldCksIE5PVCBgcHJvamVuIDx0YXNrPmAuIFVzZSByaWdodCBhZnRlciBzZWVkaW5nIGFcbiAqIGZyZXNoIHdvcmtzcGFjZTogdGhlIHByb2plbiBUQVNLUyAoYHN5bmNgLCBgYmFycmVsc2AsIC4uLikgb25seSBleGlzdCBvbmNlXG4gKiBgLnByb2plbnJjLnRzYCBoYXMgcnVuIG9uY2UsIHNvIGBwcm9qZW4gc3luY2AgY2FuJ3QgYmUgdGhlIGJvb3RzdHJhcHBpbmcgc3RlcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bkluaXRpYWxTeW50aChyb290OiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgW2NvbW1hbmQsIC4uLnByZWZpeF0gPSByZXNvbHZlUG5wbUFyZ3YoKTtcbiAgLy8gTm8gYC0tcmVnaXN0cnlgIGhlcmU6IHRoaXMgaXMgYHBucG0gZXhlY2AsIHdob3NlIHRyYWlsaW5nIGFyZ3VtZW50cyBiZWxvbmcgdG9cbiAgLy8gdHN4LiBUaGUgcmVnaXN0cnkgcmVhY2hlcyBhbnl0aGluZyBuZXN0ZWQgdGhyb3VnaCBgY2hpbGRFbnZgIGFuZCB0aGUgc2VlZGVkXG4gIC8vIGAubnBtcmNgIGluc3RlYWQuXG4gIGV4ZWMuc3Bhd25TeW5jKGNvbW1hbmQsIFsuLi5wcmVmaXgsIFwiZXhlY1wiLCBcInRzeFwiLCBcIi5wcm9qZW5yYy50c1wiXSwge1xuICAgIGN3ZDogcm9vdCxcbiAgICBlbnY6IGNoaWxkRW52KHsgUFJPSkVOX0RJU0FCTEVfUE9TVDogXCJ0cnVlXCIgfSksXG4gICAgY2hlY2s6IHRydWUsXG4gIH0pO1xufVxuIl19
package/lib/src/pnpm.d.ts CHANGED
@@ -2,10 +2,15 @@
2
2
  export declare function npxRegistryArgs(): string[];
3
3
  /** `--registry <url>` for a pnpm invocation, or `[]` when the subcommand does not resolve. */
4
4
  export declare function pnpmRegistryArgs(args: readonly string[]): string[];
5
+ /** Whether the first pnpm subcommand resolves packages and accepts `--registry`. */
6
+ export declare function pnpmUsesRegistry(args: readonly string[]): boolean;
5
7
  /**
6
- * `process.env` plus the registry under npm's env-var convention, for children
7
- * that read it (npm, npx, and anything they spawn). pnpm ignores it, which is
8
- * why the CLI flags above exist.
8
+ * `process.env` plus the current Node executable directory and registry aliases.
9
+ *
10
+ * The executable directory matters when this CLI was launched by absolute path
11
+ * (for example from QuickJS or mise activation that was not exported): pnpm
12
+ * itself runs, but lifecycle scripts invoke `node` by name and otherwise fail
13
+ * with `sh: node: not found`.
9
14
  */
10
15
  export declare function childEnv(extra?: Record<string, string>): NodeJS.ProcessEnv;
11
16
  /** Memoized `[command, ...prefix]` argv prefix to run pnpm (resolved install, else corepack, else npx). */
package/lib/src/pnpm.js CHANGED
@@ -34,7 +34,7 @@
34
34
  * @module
35
35
  */
36
36
  import { createRequire } from "node:module";
37
- import { dirname, join } from "node:path";
37
+ import { delimiter, dirname, join } from "node:path";
38
38
  import { exec, project } from "@dbx-tools/core";
39
39
  import { functionModule, log } from "@dbx-tools/shared-core";
40
40
  import { needsInstall } from "./root.js";
@@ -51,7 +51,6 @@ const REGISTRY_SUBCOMMANDS = new Set([
51
51
  "dlx",
52
52
  "i",
53
53
  "import",
54
- "init",
55
54
  "install",
56
55
  "link",
57
56
  "up",
@@ -69,23 +68,35 @@ const registryOverride = functionModule.memoize(() => project.npmRegistry(null,
69
68
  /** `--registry <url>` for npx, or `[]`. Placed BEFORE the package name by callers. */
70
69
  export function npxRegistryArgs() {
71
70
  const url = registryOverride();
72
- return url ? ["--registry", url] : [];
71
+ return url ? ["--registrsy", url] : [];
73
72
  }
74
73
  /** `--registry <url>` for a pnpm invocation, or `[]` when the subcommand does not resolve. */
75
74
  export function pnpmRegistryArgs(args) {
76
75
  const url = registryOverride();
77
76
  if (!url)
78
77
  return [];
78
+ return pnpmUsesRegistry(args) ? ["--registry", url] : [];
79
+ }
80
+ /** Whether the first pnpm subcommand resolves packages and accepts `--registry`. */
81
+ export function pnpmUsesRegistry(args) {
79
82
  const subcommand = args.find((arg) => !arg.startsWith("-"));
80
- return subcommand && REGISTRY_SUBCOMMANDS.has(subcommand) ? ["--registry", url] : [];
83
+ return subcommand !== undefined && REGISTRY_SUBCOMMANDS.has(subcommand);
81
84
  }
82
85
  /**
83
- * `process.env` plus the registry under npm's env-var convention, for children
84
- * that read it (npm, npx, and anything they spawn). pnpm ignores it, which is
85
- * why the CLI flags above exist.
86
+ * `process.env` plus the current Node executable directory and registry aliases.
87
+ *
88
+ * The executable directory matters when this CLI was launched by absolute path
89
+ * (for example from QuickJS or mise activation that was not exported): pnpm
90
+ * itself runs, but lifecycle scripts invoke `node` by name and otherwise fail
91
+ * with `sh: node: not found`.
86
92
  */
87
93
  export function childEnv(extra) {
88
94
  const env = { ...process.env, ...extra };
95
+ const nodeBin = dirname(process.execPath);
96
+ const pathEntries = (env.PATH ?? "").split(delimiter).filter(Boolean);
97
+ if (!pathEntries.includes(nodeBin)) {
98
+ env.PATH = [nodeBin, ...pathEntries].join(delimiter);
99
+ }
89
100
  const url = registryOverride();
90
101
  if (url) {
91
102
  // Both cases: env is case-sensitive on POSIX, and npm lowercases when reading.
@@ -176,4 +187,4 @@ export function ensureWorkspaceReady(root) {
176
187
  export function runProjen(args, root) {
177
188
  runPnpm(["exec", "projen", ...args], root);
178
189
  }
179
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG5wbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wbnBtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0NHO0FBQ0gsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1QyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMxQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxjQUFjLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV6QyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFLNUM7Ozs7O0dBS0c7QUFDSCxNQUFNLG9CQUFvQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQ25DLEtBQUs7SUFDTCxRQUFRO0lBQ1IsS0FBSztJQUNMLEdBQUc7SUFDSCxRQUFRO0lBQ1IsTUFBTTtJQUNOLFNBQVM7SUFDVCxNQUFNO0lBQ04sSUFBSTtJQUNKLFFBQVE7Q0FDVCxDQUFDLENBQUM7QUFFSDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLEdBQXVCLEVBQUUsQ0FDdkUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUM3RSxDQUFDO0FBRUYsc0ZBQXNGO0FBQ3RGLE1BQU0sVUFBVSxlQUFlO0lBQzdCLE1BQU0sR0FBRyxHQUFHLGdCQUFnQixFQUFFLENBQUM7SUFDL0IsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFB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Q0FBQztRQUN2QixPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNyRCxDQUFDO0FBQ0gsQ0FBQztBQUVELDhEQUE4RDtBQUM5RCxNQUFNLFVBQVUsU0FBUyxDQUFDLElBQWMsRUFBRSxJQUFZO0lBQ3BELE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBwbnBtIGRpc2NvdmVyeSwgd29ya3NwYWNlIGluc3RhbGwsIGFuZCBwcm9qZW4gZm9yd2FyZGluZyBmb3IgdGhlIGBkYngtdG9vbHNgIENMSS5cbiAqXG4gKiAjIyBGb3JjaW5nIGEgY3VzdG9tIHJlZ2lzdHJ5XG4gKlxuICogcG5wbSBhbmQgbnBtIGRvIE5PVCBhZ3JlZSBvbiBob3cgYSByZWdpc3RyeSBpcyBjb25maWd1cmVkLCBhbmQgZ2V0dGluZyB0aGlzXG4gKiB3cm9uZyBpcyBzaWxlbnQuIE1lYXN1cmVkIGFnYWluc3QgcG5wbSAxMS4wLjYgYW5kIG5wbSAxMTpcbiAqXG4gKiB8IG1lY2hhbmlzbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBucG0gfCBwbnBtIHxcbiAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLSB8IC0tLS0gfFxuICogfCBgLS1yZWdpc3RyeSA8dXJsPmAgQ0xJIGZsYWcgICAgICAgICAgICAgIHwgeWVzIHwgeWVzICB8XG4gKiB8IHByb2plY3QgYC5ucG1yY2AgICAgICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgfCB5ZXMgIHxcbiAqIHwgYG5wbV9jb25maWdfcmVnaXN0cnlgIGVudiB2YXIgICAgICAgICAgICB8IHllcyB8IE5PICAgfFxuICpcbiAqIFNvIGFuIGVudiB2YXIgYWxvbmUgcmVhZHMgYmFjayBjb3JyZWN0bHkgZnJvbSBgbnBtIGNvbmZpZyBnZXQgcmVnaXN0cnlgIHdoaWxlXG4gKiBwbnBtIGlnbm9yZXMgaXQgYW5kIHNpbGVudGx5IGZhbGxzIHRocm91Z2ggdG8gaXRzIGJ1aWx0LWluXG4gKiBgaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYC4gVGhhdCBwcm9kdWNlZCBhIGJvb3RzdHJhcCB3aGljaCBsb2dnZWQgdGhlXG4gKiBsb2NhbCByZWdpc3RyeSBhbmQgdGhlbiB0cmllZCB0byBmZXRjaCBgdHlwZXNjcmlwdGAgLyBgcHJvamVuYCAvIGB0c3hgIGZyb21cbiAqIG5wbWpzLCBmYWlsaW5nIHdpdGggRUNPTk5SRUZVU0VEIG9uIGEgbWFjaGluZSB0aGF0IGhhZCBubyByb3V0ZSB0byBpdC5cbiAqXG4gKiBIZW5jZSBhbGwgdGhyZWUgY2hhbm5lbHMsIGVhY2ggd2hlcmUgaXQgYWN0dWFsbHkgYXBwbGllczpcbiAqXG4gKiAgLSB7QGxpbmsgcG5wbVJlZ2lzdHJ5QXJnc30gcGFzc2VzIGAtLXJlZ2lzdHJ5YCB0byBwbnBtLCBidXQgb25seSBmb3IgdGhlXG4gKiAgICBzdWJjb21tYW5kcyB0aGF0IHJlc29sdmUgcGFja2FnZXMuIEl0IG11c3QgTk9UIGJlIGFwcGVuZGVkIHRvXG4gKiAgICBgcG5wbSBleGVjIDxjbWQ+YCwgd2hlcmUgdHJhaWxpbmcgYXJndW1lbnRzIGJlbG9uZyB0byBgPGNtZD5gLCBub3QgcG5wbS5cbiAqICAtIHtAbGluayBucHhSZWdpc3RyeUFyZ3N9IHBhc3NlcyBgLS1yZWdpc3RyeWAgdG8gbnB4LCBiZWZvcmUgdGhlIHBhY2thZ2VcbiAqICAgIG5hbWUsIHNvIHRoZSBucHggZmFsbGJhY2sgY2FuIGZldGNoIHBucG0gaXRzZWxmIGZyb20gdGhlIHNhbWUgcmVnaXN0cnkuXG4gKiAgLSB7QGxpbmsgY2hpbGRFbnZ9IGtlZXBzIGBucG1fY29uZmlnX3JlZ2lzdHJ5YCBzZXQgZm9yIG5wbS1iYXNlZCBjaGlsZHJlblxuICogICAgKG5weCBpbmNsdWRlZCksIHdoaWNoIGlzIHRoZSBvbmx5IGNoYW5uZWwgbnBtIGV4cG9zZXMgdG8gbmVzdGVkIHRvb2xzLlxuICpcbiAqIGBAZGJ4LXRvb2xzL2NvcmVgJ3MgYG5wbVJlZ2lzdHJ5KHsgb3ZlcnJpZGVPbmx5OiB0cnVlIH0pYCByZXR1cm5zIG5vdGhpbmcgd2hlblxuICogdGhlIGVmZmVjdGl2ZSByZWdpc3RyeSBJUyBucG1qcywgc28gbm9uZSBvZiB0aGlzIHRvdWNoZXMgYSBkZWZhdWx0IGluc3RhbGwuXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZXhlYywgcHJvamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB7IGZ1bmN0aW9uTW9kdWxlLCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgbmVlZHNJbnN0YWxsIH0gZnJvbSBcIi4vcm9vdC50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiZGJ4LXRvb2xzOnBucG1cIik7XG5cbi8qKiBBIHBhY2thZ2UuanNvbiBgYmluYCBmaWVsZDogZWl0aGVyIGEgc2luZ2xlIGNvbW1hbmQgc3RyaW5nLCBvciBhIG5hbWUgLT4gcGF0aCBtYXAuICovXG50eXBlIEJpbkZpZWxkID0gc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuLyoqXG4gKiBwbnBtIHN1YmNvbW1hbmRzIHRoYXQgcmVzb2x2ZSBwYWNrYWdlcyBmcm9tIGEgcmVnaXN0cnksIGFuZCB0aGVyZWZvcmUgYWNjZXB0IGFcbiAqIG1lYW5pbmdmdWwgYC0tcmVnaXN0cnlgLiBFdmVyeXRoaW5nIGVsc2UgKGBleGVjYCwgYHJ1bmAsIGBjb25maWdgLCAuLi4pIGlzIGxlZnRcbiAqIGFsb25lOiBgZXhlY2AgaW4gcGFydGljdWxhciBmb3J3YXJkcyB0cmFpbGluZyBhcmd1bWVudHMgdG8gdGhlIGNvbW1hbmQgaXQgcnVucyxcbiAqIHNvIGEgYC0tcmVnaXN0cnlgIGFwcGVuZGVkIHRoZXJlIHdvdWxkIGxhbmQgb24gcHJvamVuIG9yIHRzeCBpbnN0ZWFkLlxuICovXG5jb25zdCBSRUdJU1RSWV9TVUJDT01NQU5EUyA9IG5ldyBTZXQoW1xuICBcImFkZFwiLFxuICBcImNyZWF0ZVwiLFxuICBcImRseFwiLFxuICBcImlcIixcbiAgXCJpbXBvcnRcIixcbiAgXCJpbml0XCIsXG4gIFwiaW5zdGFsbFwiLFxuICBcImxpbmtcIixcbiAgXCJ1cFwiLFxuICBcInVwZGF0ZVwiLFxuXSk7XG5cbi8qKlxuICogVGhlIHJlZ2lzdHJ5IHRvIGZvcmNlIG9udG8gY2hpbGQgcGFja2FnZSBtYW5hZ2Vycywgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVcbiAqIGVmZmVjdGl2ZSBvbmUgaXMgYWxyZWFkeSB0aGUgcHVibGljIGRlZmF1bHQuXG4gKlxuICogYGVudlZhcnM6IHRydWVgIGFsc28gY29uc3VsdHMgYG5wbV9jb25maWdfcmVnaXN0cnlgIGRpcmVjdGx5LCBiZWNhdXNlIGFcbiAqIGNvbnRhaW5lciBtYXkgZXhwb3J0IGl0IHdpdGhvdXQgYW55IGAubnBtcmNgIGZvciBgbnBtIGNvbmZpZyBnZXRgIHRvIHJlYWQuXG4gKiBNZW1vaXplZDogcmVzb2x1dGlvbiBzaGVsbHMgb3V0IHRvIG5wbS5cbiAqL1xuY29uc3QgcmVnaXN0cnlPdmVycmlkZSA9IGZ1bmN0aW9uTW9kdWxlLm1lbW9pemUoKCk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PlxuICBwcm9qZWN0Lm5wbVJlZ2lzdHJ5KG51bGwsIHsgb3ZlcnJpZGVPbmx5OiB0cnVlLCBlbnZWYXJzOiB0cnVlIH0pPy50b1N0cmluZygpLFxuKTtcblxuLyoqIGAtLXJlZ2lzdHJ5IDx1cmw+YCBmb3IgbnB4LCBvciBgW11gLiBQbGFjZWQgQkVGT1JFIHRoZSBwYWNrYWdlIG5hbWUgYnkgY2FsbGVycy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBucHhSZWdpc3RyeUFyZ3MoKTogc3RyaW5nW10ge1xuICBjb25zdCB1cmwgPSByZWdpc3RyeU92ZXJyaWRlKCk7XG4gIHJldHVybiB1cmwgPyBbXCItLXJlZ2lzdHJ5XCIsIHVybF0gOiBbXTtcbn1cblxuLyoqIGAtLXJlZ2lzdHJ5IDx1cmw+YCBmb3IgYSBwbnBtIGludm9jYXRpb24sIG9yIGBbXWAgd2hlbiB0aGUgc3ViY29tbWFuZCBkb2VzIG5vdCByZXNvbHZlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBucG1SZWdpc3RyeUFyZ3MoYXJnczogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHVybCA9IHJlZ2lzdHJ5T3ZlcnJpZGUoKTtcbiAgaWYgKCF1cmwpIHJldHVybiBbXTtcbiAgY29uc3Qgc3ViY29tbWFuZCA9IGFyZ3MuZmluZCgoYXJnKSA9PiAhYXJnLnN0YXJ0c1dpdGgoXCItXCIpKTtcbiAgcmV0dXJuIHN1YmNvbW1hbmQgJiYgUkVHSVNUUllfU1VCQ09NTUFORFMuaGFzKHN1YmNvbW1hbmQpID8gW1wiLS1yZWdpc3RyeVwiLCB1cmxdIDogW107XG59XG5cbi8qKlxuICogYHByb2Nlc3MuZW52YCBwbHVzIHRoZSByZWdpc3RyeSB1bmRlciBucG0ncyBlbnYtdmFyIGNvbnZlbnRpb24sIGZvciBjaGlsZHJlblxuICogdGhhdCByZWFkIGl0IChucG0sIG5weCwgYW5kIGFueXRoaW5nIHRoZXkgc3Bhd24pLiBwbnBtIGlnbm9yZXMgaXQsIHdoaWNoIGlzXG4gKiB3aHkgdGhlIENMSSBmbGFncyBhYm92ZSBleGlzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoaWxkRW52KGV4dHJhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IE5vZGVKUy5Qcm9jZXNzRW52IHtcbiAgY29uc3QgZW52OiBOb2RlSlMuUHJvY2Vzc0VudiA9IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLmV4dHJhIH07XG4gIGNvbnN0IHVybCA9IHJlZ2lzdHJ5T3ZlcnJpZGUoKTtcbiAgaWYgKHVybCkge1xuICAgIC8vIEJvdGggY2FzZXM6IGVudiBpcyBjYXNlLXNlbnNpdGl2ZSBvbiBQT1NJWCwgYW5kIG5wbSBsb3dlcmNhc2VzIHdoZW4gcmVhZGluZy5cbiAgICBlbnYubnBtX2NvbmZpZ19yZWdpc3RyeSA9IHVybDtcbiAgICBlbnYuTlBNX0NPTkZJR19SRUdJU1RSWSA9IHVybDtcbiAgfVxuICByZXR1cm4gZW52O1xufVxuXG4vKiogVHJ1ZSB3aGVuIGBwbnBtIC0tdmVyc2lvbmAgcnVucywgaS5lLiBwbnBtIGlzIGFscmVhZHkgb24gUEFUSC4gKi9cbmZ1bmN0aW9uIHBucG1PblBhdGgoKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgZXhlYy5zcGF3blN5bmMoXCJwbnBtXCIsIFtcIi0tdmVyc2lvblwiXSwge1xuICAgICAgc3RkZXJyOiBcImlnbm9yZVwiLFxuICAgICAgc3RkaW46IFwiaWdub3JlXCIsXG4gICAgICBzdGRvdXQ6IFwiaWdub3JlXCIsXG4gICAgICBjaGVjazogdHJ1ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVQbnBtQXJndkltcGwoKTogc3RyaW5nW10ge1xuICAvLyAxLiBBIHJlc29sdmFibGUgYHBucG1gIGRlcGVuZGVuY3kgKHRoZSBub3JtYWwgaW4td29ya3NwYWNlIGNhc2UpOiBydW4gaXRzXG4gIC8vICAgIGJpbiBkaXJlY3RseSB3aXRoIHRoZSBjdXJyZW50IG5vZGUgLSBubyBQQVRIIG9yIHBhY2thZ2UtbWFuYWdlciBzaGltLlxuICAvLyAgICBwbnBtJ3Mgb3duIGAtLXJlZ2lzdHJ5YCByaWRlcyBpbiB3aXRoIHRoZSBBUkdTLCBhZnRlciB0aGlzIGVudHJ5IHBvaW50LlxuICB0cnkge1xuICAgIGNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG4gICAgY29uc3QgcGtnSnNvblBhdGggPSByZXF1aXJlLnJlc29sdmUoXCJwbnBtL3BhY2thZ2UuanNvblwiKTtcbiAgICBjb25zdCBwa2cgPSByZXF1aXJlKHBrZ0pzb25QYXRoKSBhcyB7IGJpbjogQmluRmllbGQgfTtcbiAgICBjb25zdCBiaW4gPSB0eXBlb2YgcGtnLmJpbiA9PT0gXCJzdHJpbmdcIiA/IHBrZy5iaW4gOiBwa2cuYmluLnBucG07XG4gICAgaWYgKGJpbikgcmV0dXJuIFtwcm9jZXNzLmV4ZWNQYXRoLCBqb2luKGRpcm5hbWUocGtnSnNvblBhdGgpLCBiaW4pXTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZmFsbCB0aHJvdWdoXG4gIH1cblxuICAvLyAyLiBBIGJhcmUgYHBucG1gIGFscmVhZHkgb24gUEFUSCAoZS5nLiBydW5uaW5nIHVuZGVyIGBwbnBtIGRseGApLiBQcmVmZXJcbiAgLy8gICAgdGhpcyBvdmVyIHRoZSBjb3JlcGFjay9ucHggZmFsbGJhY2tzIHNvIHdlIG5ldmVyIHNoZWxsIHRocm91Z2ggbnBtIC1cbiAgLy8gICAgYG5weCAteSBwbnBtYCBydW5zIHVuZGVyIG5wbSwgd2hpY2ggcmVqZWN0cyBhIGJvb3RzdHJhcHBlZFxuICAvLyAgICBgZGV2RW5naW5lcy5wYWNrYWdlTWFuYWdlcjogcG5wbWAgbWFuaWZlc3Qgd2l0aCBFQkFEREVWRU5HSU5FUy5cbiAgaWYgKHBucG1PblBhdGgoKSkgcmV0dXJuIFtcInBucG1cIl07XG5cbiAgLy8gMy4gVHJ5IHRvIGVuYWJsZSBwbnBtIHZpYSBjb3JlcGFjaywgdGhlbiB1c2UgaXQuXG4gIHRyeSB7XG4gICAgZXhlYy5zcGF3blN5bmMoXCJjb3JlcGFja1wiLCBbXCJlbmFibGVcIiwgXCJwbnBtXCJdLCB7XG4gICAgICBzdGRlcnI6IFwiaWdub3JlXCIsXG4gICAgICBzdGRpbjogXCJpZ25vcmVcIixcbiAgICAgIHN0ZG91dDogXCJpZ25vcmVcIixcbiAgICAgIGNoZWNrOiB0cnVlLFxuICAgIH0pO1xuICAgIGlmIChwbnBtT25QYXRoKCkpIHJldHVybiBbXCJwbnBtXCJdO1xuICB9IGNhdGNoIHtcbiAgICAvLyBmYWxsIHRocm91Z2hcbiAgfVxuXG4gIC8vIDQuIExhc3QgcmVzb3J0OiBmZXRjaCBwbnBtIG9uIGRlbWFuZCB2aWEgbnB4LiBQYXNzIGAtLWVuZ2luZS1zdHJpY3Q9ZmFsc2VgXG4gIC8vICAgIChhbmQgc2tpcCBucG0ncyBkZXZFbmdpbmVzIGdhdGUpIHNvIG5wbSBkb2Vzbid0IHJlZnVzZSB0byBydW4ganVzdFxuICAvLyAgICBiZWNhdXNlIHRoZSB0YXJnZXQgbWFuaWZlc3QgZGVjbGFyZXMgYGRldkVuZ2luZXMucGFja2FnZU1hbmFnZXI6IHBucG1gLlxuICAvLyAgICBucG0tbGV2ZWwgZmxhZ3MsIGAtLXJlZ2lzdHJ5YCBhbW9uZyB0aGVtLCBtdXN0IHByZWNlZGUgdGhlIHBhY2thZ2UgbmFtZSxcbiAgLy8gICAgb3IgbnB4IGZvcndhcmRzIHRoZW0gdG8gcG5wbSBpbnN0ZWFkIG9mIGFjdGluZyBvbiB0aGVtIGl0c2VsZi5cbiAgcmV0dXJuIFtcIm5weFwiLCAuLi5ucHhSZWdpc3RyeUFyZ3MoKSwgXCIteVwiLCBcIi0tZW5naW5lLXN0cmljdD1mYWxzZVwiLCBcInBucG1cIl07XG59XG5cbi8qKiBNZW1vaXplZCBgW2NvbW1hbmQsIC4uLnByZWZpeF1gIGFyZ3YgcHJlZml4IHRvIHJ1biBwbnBtIChyZXNvbHZlZCBpbnN0YWxsLCBlbHNlIGNvcmVwYWNrLCBlbHNlIG5weCkuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZVBucG1Bcmd2ID0gZnVuY3Rpb25Nb2R1bGUubWVtb2l6ZShyZXNvbHZlUG5wbUFyZ3ZJbXBsKTtcblxuLyoqIFJ1biBwbnBtIHdpdGggaW5oZXJpdGVkIHN0ZGlvIGZyb20gYGN3ZGAsIGZvcmNpbmcgdGhlIHJlc29sdmVkIHJlZ2lzdHJ5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1blBucG0oYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IFtjb21tYW5kLCAuLi5wcmVmaXhdID0gcmVzb2x2ZVBucG1Bcmd2KCk7XG4gIGNvbnN0IHJlZ2lzdHJ5QXJncyA9IHBucG1SZWdpc3RyeUFyZ3MoYXJncyk7XG4gIGlmIChyZWdpc3RyeUFyZ3MubGVuZ3RoID4gMCkge1xuICAgIGxvZ2dlci5pbmZvKGBydW5uaW5nIHBucG0gd2l0aCByZWdpc3RyeTogJHtyZWdpc3RyeUFyZ3NbMV19YCk7XG4gIH1cbiAgZXhlYy5zcGF3blN5bmMoY29tbWFuZCwgWy4uLnByZWZpeCwgLi4uYXJncywgLi4ucmVnaXN0cnlBcmdzXSwge1xuICAgIGN3ZCxcbiAgICBjaGVjazogdHJ1ZSxcbiAgICBlbnY6IGNoaWxkRW52KCksXG4gIH0pO1xufVxuXG4vKiogSW5zdGFsbCB3b3Jrc3BhY2UgZGVwZW5kZW5jaWVzIHdoZW4gYG5vZGVfbW9kdWxlc2Agb3IgcHJvamVuIGlzIG1pc3NpbmcuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlV29ya3NwYWNlUmVhZHkocm9vdDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChuZWVkc0luc3RhbGwocm9vdCkpIHtcbiAgICBydW5QbnBtKFtcImluc3RhbGxcIiwgXCItLW5vLWZyb3plbi1sb2NrZmlsZVwiXSwgcm9vdCk7XG4gIH1cbn1cblxuLyoqIFJ1biBgcG5wbSBleGVjIHByb2plbmAgd2l0aCB0aGUgZ2l2ZW4gYXJncyBmcm9tIGByb290YC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5Qcm9qZW4oYXJnczogc3RyaW5nW10sIHJvb3Q6IHN0cmluZyk6IHZvaWQge1xuICBydW5QbnBtKFtcImV4ZWNcIiwgXCJwcm9qZW5cIiwgLi4uYXJnc10sIHJvb3QpO1xufVxuIl19
190
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG5wbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wbnBtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0NHO0FBQ0gsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDckQsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFekMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBSzVDOzs7OztHQUtHO0FBQ0gsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNuQyxLQUFLO0lBQ0wsUUFBUTtJQUNSLEtBQUs7SUFDTCxHQUFHO0lBQ0gsUUFBUTtJQUNSLFNBQVM7SUFDVCxNQUFNO0lBQ04sSUFBSTtJQUNKLFFBQVE7Q0FDVCxDQUFDLENBQUM7QUFFSDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLEdBQXVCLEVBQUUsQ0FDdkUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUM3RSxDQUFDO0FBRUYsc0ZBQXNGO0FBQ3RGLE1BQU0sVUFBVSxlQUFlO0lBQzdCLE1BQU0sR0FBRyxHQUFHLGdCQUFnQixFQUFFLENBQUM7SUFDL0IsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDekMsQ0FBQztBQUVELDhGQUE4RjtBQUM5RixNQUFNLFVBQVUsZ0JBQWdCLENBQUMsSUFBdUI7SUFDdEQsTUFBTSxHQUFHLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztJQUMvQixJQUFJLENBQUMsR0FBRztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3BCLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDM0QsQ0FBQztBQUVELG9GQUFvRjtBQUNwRixNQUFNLFVBQVUsZ0JBQWdCLENBQUMsSUFBdUI7SUFDdEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUQsT0FBTyxVQUFVLEtBQUssU0FBUyxJQUFJLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQUMsS0FBOEI7SUFDckQsTUFBTSxHQUFHLEdBQXNCLEVBQUUsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUM7SUFDNUQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxQyxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0RSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ25DLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUNELE1BQU0sR0FBRyxHQUFHLGdCQUFnQixFQUFFLENBQUM7SUFDL0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNSLCtFQUErRTtRQUMvRSxHQUFHLENBQUMsbUJBQW1CLEdBQUcsR0FBRyxDQUFDO1FBQzlCLEdBQUcsQ0FBQyxtQkFBbUIsR0FBRyxHQUFHLENBQUM7SUFDaEMsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELHFFQUFxRTtBQUNyRSxTQUFTLFVBQVU7SUFDakIsSUFBSSxDQUFDO1FBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUNwQyxNQUFNLEVBQUUsUUFBUTtZQUNoQixLQUFLLEVBQUUsUUFBUTtZQUNmLE1BQU0sRUFBRSxRQUFRO1lBQ2hCLEtBQUssRUFBRSxJQUFJO1NBQ1osQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsbUJBQW1CO0lBQzFCLDRFQUE0RTtJQUM1RSwyRUFBMkU7SUFDM0UsNkVBQTZFO0lBQzdFLElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN6RCxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFzQixDQUFDO1FBQ3RELE1BQU0sR0FBRyxHQUFHLE9BQU8sR0FBRyxDQUFDLEdBQUcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ2pFLElBQUksR0FBRztZQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsZUFBZTtJQUNqQixDQUFDO0lBRUQsMkVBQTJFO0lBQzNFLDBFQUEwRTtJQUMxRSxnRUFBZ0U7SUFDaEUscUVBQXFFO0lBQ3JFLElBQUksVUFBVSxFQUFFO1FBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRWxDLG1EQUFtRDtJQUNuRCxJQUFJLENBQUM7UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBRTtZQUM3QyxNQUFNLEVBQUUsUUFBUTtZQUNoQixLQUFLLEVBQUUsUUFBUTtZQUNmLE1BQU0sRUFBRSxRQUFRO1lBQ2hCLEtBQUssRUFBRSxJQUFJO1NBQ1osQ0FBQyxDQUFDO1FBQ0gsSUFBSSxVQUFVLEVBQUU7WUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLGVBQWU7SUFDakIsQ0FBQztJQUVELDZFQUE2RTtJQUM3RSx3RUFBd0U7SUFDeEUsNkVBQTZFO0lBQzdFLDhFQUE4RTtJQUM5RSxvRUFBb0U7SUFDcEUsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLGVBQWUsRUFBRSxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUM5RSxDQUFDO0FBRUQsMkdBQTJHO0FBQzNHLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFFM0UsK0VBQStFO0FBQy9FLE1BQU0sVUFBVSxPQUFPLENBQUMsSUFBYyxFQUFFLEdBQVc7SUFDakQsTUFBTSxDQUFDLE9BQU8sRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLGVBQWUsRUFBRSxDQUFDO0lBQy9DLE1BQU0sWUFBWSxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVDLElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM1QixNQUFNLENBQUMsSUFBSSxDQUFDLCtCQUErQixZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsWUFBWSxDQUFDLEVBQUU7UUFDN0QsR0FBRztRQUNILEtBQUssRUFBRSxJQUFJO1FBQ1gsR0FBRyxFQUFFLFFBQVEsRUFBRTtLQUNoQixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsK0VBQStFO0FBQy9FLE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxJQUFZO0lBQy9DLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDdkIsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLHNCQUFzQixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDckQsQ0FBQztBQUNILENBQUM7QUFFRCw4REFBOEQ7QUFDOUQsTUFBTSxVQUFVLFNBQVMsQ0FBQyxJQUFjLEVBQUUsSUFBWTtJQUNwRCxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDN0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcG5wbSBkaXNjb3ZlcnksIHdvcmtzcGFjZSBpbnN0YWxsLCBhbmQgcHJvamVuIGZvcndhcmRpbmcgZm9yIHRoZSBgZGJ4LXRvb2xzYCBDTEkuXG4gKlxuICogIyMgRm9yY2luZyBhIGN1c3RvbSByZWdpc3RyeVxuICpcbiAqIHBucG0gYW5kIG5wbSBkbyBOT1QgYWdyZWUgb24gaG93IGEgcmVnaXN0cnkgaXMgY29uZmlndXJlZCwgYW5kIGdldHRpbmcgdGhpc1xuICogd3JvbmcgaXMgc2lsZW50LiBNZWFzdXJlZCBhZ2FpbnN0IHBucG0gMTEuMC42IGFuZCBucG0gMTE6XG4gKlxuICogfCBtZWNoYW5pc20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbnBtIHwgcG5wbSB8XG4gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0gfCAtLS0tIHxcbiAqIHwgYC0tcmVnaXN0cnkgPHVybD5gIENMSSBmbGFnICAgICAgICAgICAgICB8IHllcyB8IHllcyAgfFxuICogfCBwcm9qZWN0IGAubnBtcmNgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeWVzIHwgeWVzICB8XG4gKiB8IGBucG1fY29uZmlnX3JlZ2lzdHJ5YCBlbnYgdmFyICAgICAgICAgICAgfCB5ZXMgfCBOTyAgIHxcbiAqXG4gKiBTbyBhbiBlbnYgdmFyIGFsb25lIHJlYWRzIGJhY2sgY29ycmVjdGx5IGZyb20gYG5wbSBjb25maWcgZ2V0IHJlZ2lzdHJ5YCB3aGlsZVxuICogcG5wbSBpZ25vcmVzIGl0IGFuZCBzaWxlbnRseSBmYWxscyB0aHJvdWdoIHRvIGl0cyBidWlsdC1pblxuICogYGh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2AuIFRoYXQgcHJvZHVjZWQgYSBib290c3RyYXAgd2hpY2ggbG9nZ2VkIHRoZVxuICogbG9jYWwgcmVnaXN0cnkgYW5kIHRoZW4gdHJpZWQgdG8gZmV0Y2ggYHR5cGVzY3JpcHRgIC8gYHByb2plbmAgLyBgdHN4YCBmcm9tXG4gKiBucG1qcywgZmFpbGluZyB3aXRoIEVDT05OUkVGVVNFRCBvbiBhIG1hY2hpbmUgdGhhdCBoYWQgbm8gcm91dGUgdG8gaXQuXG4gKlxuICogSGVuY2UgYWxsIHRocmVlIGNoYW5uZWxzLCBlYWNoIHdoZXJlIGl0IGFjdHVhbGx5IGFwcGxpZXM6XG4gKlxuICogIC0ge0BsaW5rIHBucG1SZWdpc3RyeUFyZ3N9IHBhc3NlcyBgLS1yZWdpc3RyeWAgdG8gcG5wbSwgYnV0IG9ubHkgZm9yIHRoZVxuICogICAgc3ViY29tbWFuZHMgdGhhdCByZXNvbHZlIHBhY2thZ2VzLiBJdCBtdXN0IE5PVCBiZSBhcHBlbmRlZCB0b1xuICogICAgYHBucG0gZXhlYyA8Y21kPmAsIHdoZXJlIHRyYWlsaW5nIGFyZ3VtZW50cyBiZWxvbmcgdG8gYDxjbWQ+YCwgbm90IHBucG0uXG4gKiAgLSB7QGxpbmsgbnB4UmVnaXN0cnlBcmdzfSBwYXNzZXMgYC0tcmVnaXN0cnlgIHRvIG5weCwgYmVmb3JlIHRoZSBwYWNrYWdlXG4gKiAgICBuYW1lLCBzbyB0aGUgbnB4IGZhbGxiYWNrIGNhbiBmZXRjaCBwbnBtIGl0c2VsZiBmcm9tIHRoZSBzYW1lIHJlZ2lzdHJ5LlxuICogIC0ge0BsaW5rIGNoaWxkRW52fSBrZWVwcyBgbnBtX2NvbmZpZ19yZWdpc3RyeWAgc2V0IGZvciBucG0tYmFzZWQgY2hpbGRyZW5cbiAqICAgIChucHggaW5jbHVkZWQpLCB3aGljaCBpcyB0aGUgb25seSBjaGFubmVsIG5wbSBleHBvc2VzIHRvIG5lc3RlZCB0b29scy5cbiAqXG4gKiBgQGRieC10b29scy9jb3JlYCdzIGBucG1SZWdpc3RyeSh7IG92ZXJyaWRlT25seTogdHJ1ZSB9KWAgcmV0dXJucyBub3RoaW5nIHdoZW5cbiAqIHRoZSBlZmZlY3RpdmUgcmVnaXN0cnkgSVMgbnBtanMsIHNvIG5vbmUgb2YgdGhpcyB0b3VjaGVzIGEgZGVmYXVsdCBpbnN0YWxsLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgZGVsaW1pdGVyLCBkaXJuYW1lLCBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZXhlYywgcHJvamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB7IGZ1bmN0aW9uTW9kdWxlLCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgbmVlZHNJbnN0YWxsIH0gZnJvbSBcIi4vcm9vdC50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiZGJ4LXRvb2xzOnBucG1cIik7XG5cbi8qKiBBIHBhY2thZ2UuanNvbiBgYmluYCBmaWVsZDogZWl0aGVyIGEgc2luZ2xlIGNvbW1hbmQgc3RyaW5nLCBvciBhIG5hbWUgLT4gcGF0aCBtYXAuICovXG50eXBlIEJpbkZpZWxkID0gc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuLyoqXG4gKiBwbnBtIHN1YmNvbW1hbmRzIHRoYXQgcmVzb2x2ZSBwYWNrYWdlcyBmcm9tIGEgcmVnaXN0cnksIGFuZCB0aGVyZWZvcmUgYWNjZXB0IGFcbiAqIG1lYW5pbmdmdWwgYC0tcmVnaXN0cnlgLiBFdmVyeXRoaW5nIGVsc2UgKGBleGVjYCwgYHJ1bmAsIGBjb25maWdgLCAuLi4pIGlzIGxlZnRcbiAqIGFsb25lOiBgZXhlY2AgaW4gcGFydGljdWxhciBmb3J3YXJkcyB0cmFpbGluZyBhcmd1bWVudHMgdG8gdGhlIGNvbW1hbmQgaXQgcnVucyxcbiAqIHNvIGEgYC0tcmVnaXN0cnlgIGFwcGVuZGVkIHRoZXJlIHdvdWxkIGxhbmQgb24gcHJvamVuIG9yIHRzeCBpbnN0ZWFkLlxuICovXG5jb25zdCBSRUdJU1RSWV9TVUJDT01NQU5EUyA9IG5ldyBTZXQoW1xuICBcImFkZFwiLFxuICBcImNyZWF0ZVwiLFxuICBcImRseFwiLFxuICBcImlcIixcbiAgXCJpbXBvcnRcIixcbiAgXCJpbnN0YWxsXCIsXG4gIFwibGlua1wiLFxuICBcInVwXCIsXG4gIFwidXBkYXRlXCIsXG5dKTtcblxuLyoqXG4gKiBUaGUgcmVnaXN0cnkgdG8gZm9yY2Ugb250byBjaGlsZCBwYWNrYWdlIG1hbmFnZXJzLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZVxuICogZWZmZWN0aXZlIG9uZSBpcyBhbHJlYWR5IHRoZSBwdWJsaWMgZGVmYXVsdC5cbiAqXG4gKiBgZW52VmFyczogdHJ1ZWAgYWxzbyBjb25zdWx0cyBgbnBtX2NvbmZpZ19yZWdpc3RyeWAgZGlyZWN0bHksIGJlY2F1c2UgYVxuICogY29udGFpbmVyIG1heSBleHBvcnQgaXQgd2l0aG91dCBhbnkgYC5ucG1yY2AgZm9yIGBucG0gY29uZmlnIGdldGAgdG8gcmVhZC5cbiAqIE1lbW9pemVkOiByZXNvbHV0aW9uIHNoZWxscyBvdXQgdG8gbnBtLlxuICovXG5jb25zdCByZWdpc3RyeU92ZXJyaWRlID0gZnVuY3Rpb25Nb2R1bGUubWVtb2l6ZSgoKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+XG4gIHByb2plY3QubnBtUmVnaXN0cnkobnVsbCwgeyBvdmVycmlkZU9ubHk6IHRydWUsIGVudlZhcnM6IHRydWUgfSk/LnRvU3RyaW5nKCksXG4pO1xuXG4vKiogYC0tcmVnaXN0cnkgPHVybD5gIGZvciBucHgsIG9yIGBbXWAuIFBsYWNlZCBCRUZPUkUgdGhlIHBhY2thZ2UgbmFtZSBieSBjYWxsZXJzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5weFJlZ2lzdHJ5QXJncygpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHVybCA9IHJlZ2lzdHJ5T3ZlcnJpZGUoKTtcbiAgcmV0dXJuIHVybCA/IFtcIi0tcmVnaXN0cnN5XCIsIHVybF0gOiBbXTtcbn1cblxuLyoqIGAtLXJlZ2lzdHJ5IDx1cmw+YCBmb3IgYSBwbnBtIGludm9jYXRpb24sIG9yIGBbXWAgd2hlbiB0aGUgc3ViY29tbWFuZCBkb2VzIG5vdCByZXNvbHZlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBucG1SZWdpc3RyeUFyZ3MoYXJnczogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHVybCA9IHJlZ2lzdHJ5T3ZlcnJpZGUoKTtcbiAgaWYgKCF1cmwpIHJldHVybiBbXTtcbiAgcmV0dXJuIHBucG1Vc2VzUmVnaXN0cnkoYXJncykgPyBbXCItLXJlZ2lzdHJ5XCIsIHVybF0gOiBbXTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIGZpcnN0IHBucG0gc3ViY29tbWFuZCByZXNvbHZlcyBwYWNrYWdlcyBhbmQgYWNjZXB0cyBgLS1yZWdpc3RyeWAuICovXG5leHBvcnQgZnVuY3Rpb24gcG5wbVVzZXNSZWdpc3RyeShhcmdzOiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICBjb25zdCBzdWJjb21tYW5kID0gYXJncy5maW5kKChhcmcpID0+ICFhcmcuc3RhcnRzV2l0aChcIi1cIikpO1xuICByZXR1cm4gc3ViY29tbWFuZCAhPT0gdW5kZWZpbmVkICYmIFJFR0lTVFJZX1NVQkNPTU1BTkRTLmhhcyhzdWJjb21tYW5kKTtcbn1cblxuLyoqXG4gKiBgcHJvY2Vzcy5lbnZgIHBsdXMgdGhlIGN1cnJlbnQgTm9kZSBleGVjdXRhYmxlIGRpcmVjdG9yeSBhbmQgcmVnaXN0cnkgYWxpYXNlcy5cbiAqXG4gKiBUaGUgZXhlY3V0YWJsZSBkaXJlY3RvcnkgbWF0dGVycyB3aGVuIHRoaXMgQ0xJIHdhcyBsYXVuY2hlZCBieSBhYnNvbHV0ZSBwYXRoXG4gKiAoZm9yIGV4YW1wbGUgZnJvbSBRdWlja0pTIG9yIG1pc2UgYWN0aXZhdGlvbiB0aGF0IHdhcyBub3QgZXhwb3J0ZWQpOiBwbnBtXG4gKiBpdHNlbGYgcnVucywgYnV0IGxpZmVjeWNsZSBzY3JpcHRzIGludm9rZSBgbm9kZWAgYnkgbmFtZSBhbmQgb3RoZXJ3aXNlIGZhaWxcbiAqIHdpdGggYHNoOiBub2RlOiBub3QgZm91bmRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hpbGRFbnYoZXh0cmE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogTm9kZUpTLlByb2Nlc3NFbnYge1xuICBjb25zdCBlbnY6IE5vZGVKUy5Qcm9jZXNzRW52ID0geyAuLi5wcm9jZXNzLmVudiwgLi4uZXh0cmEgfTtcbiAgY29uc3Qgbm9kZUJpbiA9IGRpcm5hbWUocHJvY2Vzcy5leGVjUGF0aCk7XG4gIGNvbnN0IHBhdGhFbnRyaWVzID0gKGVudi5QQVRIID8/IFwiXCIpLnNwbGl0KGRlbGltaXRlcikuZmlsdGVyKEJvb2xlYW4pO1xuICBpZiAoIXBhdGhFbnRyaWVzLmluY2x1ZGVzKG5vZGVCaW4pKSB7XG4gICAgZW52LlBBVEggPSBbbm9kZUJpbiwgLi4ucGF0aEVudHJpZXNdLmpvaW4oZGVsaW1pdGVyKTtcbiAgfVxuICBjb25zdCB1cmwgPSByZWdpc3RyeU92ZXJyaWRlKCk7XG4gIGlmICh1cmwpIHtcbiAgICAvLyBCb3RoIGNhc2VzOiBlbnYgaXMgY2FzZS1zZW5zaXRpdmUgb24gUE9TSVgsIGFuZCBucG0gbG93ZXJjYXNlcyB3aGVuIHJlYWRpbmcuXG4gICAgZW52Lm5wbV9jb25maWdfcmVnaXN0cnkgPSB1cmw7XG4gICAgZW52Lk5QTV9DT05GSUdfUkVHSVNUUlkgPSB1cmw7XG4gIH1cbiAgcmV0dXJuIGVudjtcbn1cblxuLyoqIFRydWUgd2hlbiBgcG5wbSAtLXZlcnNpb25gIHJ1bnMsIGkuZS4gcG5wbSBpcyBhbHJlYWR5IG9uIFBBVEguICovXG5mdW5jdGlvbiBwbnBtT25QYXRoKCk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGV4ZWMuc3Bhd25TeW5jKFwicG5wbVwiLCBbXCItLXZlcnNpb25cIl0sIHtcbiAgICAgIHN0ZGVycjogXCJpZ25vcmVcIixcbiAgICAgIHN0ZGluOiBcImlnbm9yZVwiLFxuICAgICAgc3Rkb3V0OiBcImlnbm9yZVwiLFxuICAgICAgY2hlY2s6IHRydWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlUG5wbUFyZ3ZJbXBsKCk6IHN0cmluZ1tdIHtcbiAgLy8gMS4gQSByZXNvbHZhYmxlIGBwbnBtYCBkZXBlbmRlbmN5ICh0aGUgbm9ybWFsIGluLXdvcmtzcGFjZSBjYXNlKTogcnVuIGl0c1xuICAvLyAgICBiaW4gZGlyZWN0bHkgd2l0aCB0aGUgY3VycmVudCBub2RlIC0gbm8gUEFUSCBvciBwYWNrYWdlLW1hbmFnZXIgc2hpbS5cbiAgLy8gICAgcG5wbSdzIG93biBgLS1yZWdpc3RyeWAgcmlkZXMgaW4gd2l0aCB0aGUgQVJHUywgYWZ0ZXIgdGhpcyBlbnRyeSBwb2ludC5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuICAgIGNvbnN0IHBrZ0pzb25QYXRoID0gcmVxdWlyZS5yZXNvbHZlKFwicG5wbS9wYWNrYWdlLmpzb25cIik7XG4gICAgY29uc3QgcGtnID0gcmVxdWlyZShwa2dKc29uUGF0aCkgYXMgeyBiaW46IEJpbkZpZWxkIH07XG4gICAgY29uc3QgYmluID0gdHlwZW9mIHBrZy5iaW4gPT09IFwic3RyaW5nXCIgPyBwa2cuYmluIDogcGtnLmJpbi5wbnBtO1xuICAgIGlmIChiaW4pIHJldHVybiBbcHJvY2Vzcy5leGVjUGF0aCwgam9pbihkaXJuYW1lKHBrZ0pzb25QYXRoKSwgYmluKV07XG4gIH0gY2F0Y2gge1xuICAgIC8vIGZhbGwgdGhyb3VnaFxuICB9XG5cbiAgLy8gMi4gQSBiYXJlIGBwbnBtYCBhbHJlYWR5IG9uIFBBVEggKGUuZy4gcnVubmluZyB1bmRlciBgcG5wbSBkbHhgKS4gUHJlZmVyXG4gIC8vICAgIHRoaXMgb3ZlciB0aGUgY29yZXBhY2svbnB4IGZhbGxiYWNrcyBzbyB3ZSBuZXZlciBzaGVsbCB0aHJvdWdoIG5wbSAtXG4gIC8vICAgIGBucHggLXkgcG5wbWAgcnVucyB1bmRlciBucG0sIHdoaWNoIHJlamVjdHMgYSBib290c3RyYXBwZWRcbiAgLy8gICAgYGRldkVuZ2luZXMucGFja2FnZU1hbmFnZXI6IHBucG1gIG1hbmlmZXN0IHdpdGggRUJBRERFVkVOR0lORVMuXG4gIGlmIChwbnBtT25QYXRoKCkpIHJldHVybiBbXCJwbnBtXCJdO1xuXG4gIC8vIDMuIFRyeSB0byBlbmFibGUgcG5wbSB2aWEgY29yZXBhY2ssIHRoZW4gdXNlIGl0LlxuICB0cnkge1xuICAgIGV4ZWMuc3Bhd25TeW5jKFwiY29yZXBhY2tcIiwgW1wiZW5hYmxlXCIsIFwicG5wbVwiXSwge1xuICAgICAgc3RkZXJyOiBcImlnbm9yZVwiLFxuICAgICAgc3RkaW46IFwiaWdub3JlXCIsXG4gICAgICBzdGRvdXQ6IFwiaWdub3JlXCIsXG4gICAgICBjaGVjazogdHJ1ZSxcbiAgICB9KTtcbiAgICBpZiAocG5wbU9uUGF0aCgpKSByZXR1cm4gW1wicG5wbVwiXTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZmFsbCB0aHJvdWdoXG4gIH1cblxuICAvLyA0LiBMYXN0IHJlc29ydDogZmV0Y2ggcG5wbSBvbiBkZW1hbmQgdmlhIG5weC4gUGFzcyBgLS1lbmdpbmUtc3RyaWN0PWZhbHNlYFxuICAvLyAgICAoYW5kIHNraXAgbnBtJ3MgZGV2RW5naW5lcyBnYXRlKSBzbyBucG0gZG9lc24ndCByZWZ1c2UgdG8gcnVuIGp1c3RcbiAgLy8gICAgYmVjYXVzZSB0aGUgdGFyZ2V0IG1hbmlmZXN0IGRlY2xhcmVzIGBkZXZFbmdpbmVzLnBhY2thZ2VNYW5hZ2VyOiBwbnBtYC5cbiAgLy8gICAgbnBtLWxldmVsIGZsYWdzLCBgLS1yZWdpc3RyeWAgYW1vbmcgdGhlbSwgbXVzdCBwcmVjZWRlIHRoZSBwYWNrYWdlIG5hbWUsXG4gIC8vICAgIG9yIG5weCBmb3J3YXJkcyB0aGVtIHRvIHBucG0gaW5zdGVhZCBvZiBhY3Rpbmcgb24gdGhlbSBpdHNlbGYuXG4gIHJldHVybiBbXCJucHhcIiwgLi4ubnB4UmVnaXN0cnlBcmdzKCksIFwiLXlcIiwgXCItLWVuZ2luZS1zdHJpY3Q9ZmFsc2VcIiwgXCJwbnBtXCJdO1xufVxuXG4vKiogTWVtb2l6ZWQgYFtjb21tYW5kLCAuLi5wcmVmaXhdYCBhcmd2IHByZWZpeCB0byBydW4gcG5wbSAocmVzb2x2ZWQgaW5zdGFsbCwgZWxzZSBjb3JlcGFjaywgZWxzZSBucHgpLiAqL1xuZXhwb3J0IGNvbnN0IHJlc29sdmVQbnBtQXJndiA9IGZ1bmN0aW9uTW9kdWxlLm1lbW9pemUocmVzb2x2ZVBucG1Bcmd2SW1wbCk7XG5cbi8qKiBSdW4gcG5wbSB3aXRoIGluaGVyaXRlZCBzdGRpbyBmcm9tIGBjd2RgLCBmb3JjaW5nIHRoZSByZXNvbHZlZCByZWdpc3RyeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5QbnBtKGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBbY29tbWFuZCwgLi4ucHJlZml4XSA9IHJlc29sdmVQbnBtQXJndigpO1xuICBjb25zdCByZWdpc3RyeUFyZ3MgPSBwbnBtUmVnaXN0cnlBcmdzKGFyZ3MpO1xuICBpZiAocmVnaXN0cnlBcmdzLmxlbmd0aCA+IDApIHtcbiAgICBsb2dnZXIuaW5mbyhgcnVubmluZyBwbnBtIHdpdGggcmVnaXN0cnk6ICR7cmVnaXN0cnlBcmdzWzFdfWApO1xuICB9XG4gIGV4ZWMuc3Bhd25TeW5jKGNvbW1hbmQsIFsuLi5wcmVmaXgsIC4uLmFyZ3MsIC4uLnJlZ2lzdHJ5QXJnc10sIHtcbiAgICBjd2QsXG4gICAgY2hlY2s6IHRydWUsXG4gICAgZW52OiBjaGlsZEVudigpLFxuICB9KTtcbn1cblxuLyoqIEluc3RhbGwgd29ya3NwYWNlIGRlcGVuZGVuY2llcyB3aGVuIGBub2RlX21vZHVsZXNgIG9yIHByb2plbiBpcyBtaXNzaW5nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZVdvcmtzcGFjZVJlYWR5KHJvb3Q6IHN0cmluZyk6IHZvaWQge1xuICBpZiAobmVlZHNJbnN0YWxsKHJvb3QpKSB7XG4gICAgcnVuUG5wbShbXCJpbnN0YWxsXCIsIFwiLS1uby1mcm96ZW4tbG9ja2ZpbGVcIl0sIHJvb3QpO1xuICB9XG59XG5cbi8qKiBSdW4gYHBucG0gZXhlYyBwcm9qZW5gIHdpdGggdGhlIGdpdmVuIGFyZ3MgZnJvbSBgcm9vdGAuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuUHJvamVuKGFyZ3M6IHN0cmluZ1tdLCByb290OiBzdHJpbmcpOiB2b2lkIHtcbiAgcnVuUG5wbShbXCJleGVjXCIsIFwicHJvamVuXCIsIC4uLmFyZ3NdLCByb290KTtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -18,15 +18,15 @@
18
18
  "@clack/prompts": "^1.7.0",
19
19
  "commander": "^15.0.0",
20
20
  "pnpm": "^11.0.6",
21
- "@dbx-tools/core": "0.6.27",
22
- "@dbx-tools/shared-core": "0.6.27"
21
+ "@dbx-tools/core": "0.6.35",
22
+ "@dbx-tools/shared-core": "0.6.35"
23
23
  },
24
24
  "main": "./lib/index.js",
25
25
  "license": "UNLICENSED",
26
26
  "publishConfig": {
27
27
  "access": "public"
28
28
  },
29
- "version": "0.6.27",
29
+ "version": "0.6.35",
30
30
  "types": "./lib/index.d.ts",
31
31
  "type": "module",
32
32
  "exports": {
package/src/bootstrap.ts CHANGED
@@ -4,14 +4,19 @@
4
4
  * @module
5
5
  */
6
6
  import { existsSync, readFileSync, writeFileSync } from "node:fs";
7
+ import { createRequire } from "node:module";
7
8
  import { join } from "node:path";
8
- import { fileURLToPath } from "node:url";
9
9
  import { intro, outro } from "@clack/prompts";
10
10
  import { exec, project } from "@dbx-tools/core";
11
- import { json } from "@dbx-tools/shared-core";
11
+ import { json, log } from "@dbx-tools/shared-core";
12
12
  import { childEnv, resolvePnpmArgv, runPnpm } from "./pnpm.ts";
13
13
  import { rootLabel } from "./root.ts";
14
14
 
15
+ const logger = log.logger("dbx-tools:bootstrap");
16
+
17
+ /** Published package name used for Node's self-reference manifest resolution. */
18
+ const CLI_PACKAGE = "@dbx-tools/cli";
19
+
15
20
  /** Fallback when this CLI's own version isn't a real release (an in-repo `0.0.0`). */
16
21
  const FALLBACK_PROJEN_SPECIFIER = "@dbx-tools/projen@latest";
17
22
 
@@ -38,7 +43,12 @@ function defaultProjenSpecifier(): string {
38
43
  /** This CLI's own released version, or `undefined` for an in-repo `0.0.0` build. */
39
44
  function ownVersion(): string | undefined {
40
45
  try {
41
- const manifestPath = fileURLToPath(new URL("../package.json", import.meta.url));
46
+ // Resolve through the package's exported `./package.json`, which works from
47
+ // both source (`src/bootstrap.ts`) and published output
48
+ // (`lib/src/bootstrap.js`). A relative URL is one level from the manifest
49
+ // in source but two levels away after compilation and silently fell back to
50
+ // `@latest` in every installed CLI.
51
+ const manifestPath = createRequire(import.meta.url).resolve(`${CLI_PACKAGE}/package.json`);
42
52
  const version = json.parseRecord(readFileSync(manifestPath, "utf8"))?.version;
43
53
  return typeof version === "string" && version !== "0.0.0" ? version : undefined;
44
54
  } catch {
@@ -159,7 +169,30 @@ export function seedToolchain(
159
169
 
160
170
  seedRegistry(root);
161
171
 
162
- runPnpm(["add", "-D", "projen", "typescript@^5.9.3", "tsx@^4.23.0", projenSpecifier], root);
172
+ const kernelArch = exec.spawnSync("uname", ["-m"], {
173
+ stdin: "ignore",
174
+ stdout: "capture",
175
+ stderr: "ignore",
176
+ }).stdout;
177
+ logger.info("seeding toolchain", {
178
+ node: process.version,
179
+ platform: process.platform,
180
+ arch: process.arch,
181
+ kernelArch: kernelArch || "unknown",
182
+ engine: projenSpecifier,
183
+ });
184
+ runPnpm(
185
+ [
186
+ "add",
187
+ "--reporter=append-only",
188
+ "-D",
189
+ "projen",
190
+ "typescript@^5.9.3",
191
+ "tsx@^4.23.0",
192
+ projenSpecifier,
193
+ ],
194
+ root,
195
+ );
163
196
  }
164
197
 
165
198
  /**
package/src/pnpm.ts CHANGED
@@ -34,7 +34,7 @@
34
34
  * @module
35
35
  */
36
36
  import { createRequire } from "node:module";
37
- import { dirname, join } from "node:path";
37
+ import { delimiter, dirname, join } from "node:path";
38
38
  import { exec, project } from "@dbx-tools/core";
39
39
  import { functionModule, log } from "@dbx-tools/shared-core";
40
40
  import { needsInstall } from "./root.ts";
@@ -56,7 +56,6 @@ const REGISTRY_SUBCOMMANDS = new Set([
56
56
  "dlx",
57
57
  "i",
58
58
  "import",
59
- "init",
60
59
  "install",
61
60
  "link",
62
61
  "up",
@@ -78,24 +77,37 @@ const registryOverride = functionModule.memoize((): string | undefined =>
78
77
  /** `--registry <url>` for npx, or `[]`. Placed BEFORE the package name by callers. */
79
78
  export function npxRegistryArgs(): string[] {
80
79
  const url = registryOverride();
81
- return url ? ["--registry", url] : [];
80
+ return url ? ["--registrsy", url] : [];
82
81
  }
83
82
 
84
83
  /** `--registry <url>` for a pnpm invocation, or `[]` when the subcommand does not resolve. */
85
84
  export function pnpmRegistryArgs(args: readonly string[]): string[] {
86
85
  const url = registryOverride();
87
86
  if (!url) return [];
87
+ return pnpmUsesRegistry(args) ? ["--registry", url] : [];
88
+ }
89
+
90
+ /** Whether the first pnpm subcommand resolves packages and accepts `--registry`. */
91
+ export function pnpmUsesRegistry(args: readonly string[]): boolean {
88
92
  const subcommand = args.find((arg) => !arg.startsWith("-"));
89
- return subcommand && REGISTRY_SUBCOMMANDS.has(subcommand) ? ["--registry", url] : [];
93
+ return subcommand !== undefined && REGISTRY_SUBCOMMANDS.has(subcommand);
90
94
  }
91
95
 
92
96
  /**
93
- * `process.env` plus the registry under npm's env-var convention, for children
94
- * that read it (npm, npx, and anything they spawn). pnpm ignores it, which is
95
- * why the CLI flags above exist.
97
+ * `process.env` plus the current Node executable directory and registry aliases.
98
+ *
99
+ * The executable directory matters when this CLI was launched by absolute path
100
+ * (for example from QuickJS or mise activation that was not exported): pnpm
101
+ * itself runs, but lifecycle scripts invoke `node` by name and otherwise fail
102
+ * with `sh: node: not found`.
96
103
  */
97
104
  export function childEnv(extra?: Record<string, string>): NodeJS.ProcessEnv {
98
105
  const env: NodeJS.ProcessEnv = { ...process.env, ...extra };
106
+ const nodeBin = dirname(process.execPath);
107
+ const pathEntries = (env.PATH ?? "").split(delimiter).filter(Boolean);
108
+ if (!pathEntries.includes(nodeBin)) {
109
+ env.PATH = [nodeBin, ...pathEntries].join(delimiter);
110
+ }
99
111
  const url = registryOverride();
100
112
  if (url) {
101
113
  // Both cases: env is case-sensitive on POSIX, and npm lowercases when reading.