@dbx-tools/cli-service 0.9.93 → 0.9.95

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/README.md CHANGED
@@ -46,6 +46,12 @@ the Python version uv manages and defaults to `3.11`. uv must be available on
46
46
  `PATH` during installation. Uninstalling the service removes the environment
47
47
  with the rest of the service-owned data.
48
48
 
49
+ Pass `--python-project <path>` to `service install` to install the primary
50
+ Python package from a local project instead of the versioned registry package.
51
+ Package extras such as `[dev]` and companion dependencies remain active. Add
52
+ `--offline` to resolve entirely from uv's cache and fail immediately when an
53
+ artifact is unavailable instead of contacting a package index.
54
+
49
55
  `command.options` accepts either a concrete option object or a Zod object
50
56
  schema. Objects serialize their current values. Schemas parse `{}` and serialize
51
57
  their defaults. Boolean values become positive or negated flags, arrays become
@@ -70,15 +76,21 @@ For the example program above:
70
76
 
71
77
  ```sh
72
78
  example service install
79
+ example service install --python-project packages/py/example --offline
73
80
  example service status
74
81
  example service stop
75
82
  example service start
76
83
  example service restart
84
+ example service logs
85
+ example service logs -- tail -f
77
86
  example service uninstall
78
87
  ```
79
88
 
80
89
  Installation starts the service by default. Pass `--no-start` to install without
81
- launching it. `status` reports installation and process state as JSON.
90
+ launching it. `status` reports installation and process state as JSON. `logs`
91
+ prints the managed process log path. Arguments after `--` run as a command with
92
+ that path appended, so `logs -- cat` prints the log and `logs -- tail -f` follows
93
+ it.
82
94
 
83
95
  The service belongs to the current user. Login startup uses a LaunchAgent on
84
96
  macOS, an XDG autostart entry on Linux, and a Startup command on Windows. Package
@@ -120,6 +132,7 @@ Install and manage the desktop service
120
132
  | `stop` | Stop the running service |
121
133
  | `restart` | Restart the installed service |
122
134
  | `status` | Print service installation and process state as JSON |
135
+ | `logs [command...]` | Print the service log path or append it to a command |
123
136
  | `uninstall` | Stop and remove the service for the current user |
124
137
 
125
138
  ### `<cli> service install`
@@ -132,9 +145,11 @@ Install the service for the current user and start it
132
145
 
133
146
  #### Options
134
147
 
135
- | Option | Description |
136
- | ------------ | ------------------------------------------- |
137
- | `--no-start` | Do not start the service after installation |
148
+ | Option | Description |
149
+ | ------------------------- | ---------------------------------------------------------------- |
150
+ | `--no-start` | Do not start the service after installation |
151
+ | `--python-project <path>` | Install a local Python project instead of the registry package |
152
+ | `--offline` | Install Python packages from the uv cache without network access |
138
153
 
139
154
  ### `<cli> service start`
140
155
 
@@ -168,6 +183,20 @@ Print service installation and process state as JSON
168
183
  <cli> service status
169
184
  ```
170
185
 
186
+ ### `<cli> service logs`
187
+
188
+ Print the service log path or append it to a command
189
+
190
+ ```sh
191
+ <cli> service logs [command...]
192
+ ```
193
+
194
+ #### Arguments
195
+
196
+ | Argument | Description |
197
+ | --------- | -------------------------------------------------------- |
198
+ | `command` | Command and arguments to run before the service log path |
199
+
171
200
  ### `<cli> service uninstall`
172
201
 
173
202
  Stop and remove the service for the current user
package/index.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/cli-service";
6
- export const PACKAGE_VERSION = "0.9.93";
6
+ export const PACKAGE_VERSION = "0.9.95";
7
7
  export * as cli from "./src/cli.ts";
8
8
  export * as definition from "./src/definition.ts";
9
9
  export * as icon from "./src/icon.ts";
@@ -12,5 +12,6 @@ export { CliServiceInstallOptionsSchema } from "./src/cli.ts";
12
12
  export type { CliServiceDefinitionSource, CliServiceCliDependencies } from "./src/cli.ts";
13
13
  export { CliServiceCommandSchema, CliServiceMenuItemSchema, CliServicePythonPackageSchema, CliServiceDefinitionSchema } from "./src/definition.ts";
14
14
  export type { CliServiceCommand, CliServiceCommandInput, CliServiceMenuItem, CliServicePythonPackage, CliServicePythonPackageInput, CliServiceDefinition, CliServiceDefinitionOptions } from "./src/definition.ts";
15
+ export type { ServiceTrayGlyph } from "./src/icon.ts";
15
16
  export { CliService } from "./src/service.ts";
16
17
  export type { CliServiceCompiler, CliServiceRuntimeInstaller, CliServicePythonInstaller, CliServiceRuntimeOptions, CliServiceStatus, CliServiceLifecycle } from "./src/service.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/cli-service";
2
- export declare const PACKAGE_VERSION = "0.9.93";
2
+ export declare const PACKAGE_VERSION = "0.9.95";
3
3
  export * as cli from "./src/cli.ts";
4
4
  export * as definition from "./src/definition.ts";
5
5
  export * as icon from "./src/icon.ts";
@@ -8,5 +8,6 @@ export { CliServiceInstallOptionsSchema } from "./src/cli.ts";
8
8
  export type { CliServiceDefinitionSource, CliServiceCliDependencies } from "./src/cli.ts";
9
9
  export { CliServiceCommandSchema, CliServiceMenuItemSchema, CliServicePythonPackageSchema, CliServiceDefinitionSchema } from "./src/definition.ts";
10
10
  export type { CliServiceCommand, CliServiceCommandInput, CliServiceMenuItem, CliServicePythonPackage, CliServicePythonPackageInput, CliServiceDefinition, CliServiceDefinitionOptions } from "./src/definition.ts";
11
+ export type { ServiceTrayGlyph } from "./src/icon.ts";
11
12
  export { CliService } from "./src/service.ts";
12
13
  export type { CliServiceCompiler, CliServiceRuntimeInstaller, CliServicePythonInstaller, CliServiceRuntimeOptions, CliServiceStatus, CliServiceLifecycle } from "./src/service.ts";
package/lib/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export const PACKAGE_IDENTIFIER = "@dbx-tools/cli-service";
5
- export const PACKAGE_VERSION = "0.9.93";
5
+ export const PACKAGE_VERSION = "0.9.95";
6
6
  export * as cli from "./src/cli.js";
7
7
  export * as definition from "./src/definition.js";
8
8
  export * as icon from "./src/icon.js";
@@ -10,4 +10,4 @@ export * as service from "./src/service.js";
10
10
  export { CliServiceInstallOptionsSchema } from "./src/cli.js";
11
11
  export { CliServiceCommandSchema, CliServiceMenuItemSchema, CliServicePythonPackageSchema, CliServiceDefinitionSchema } from "./src/definition.js";
12
12
  export { CliService } from "./src/service.js";
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx3QkFBd0IsQ0FBQztBQUMzRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFOUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLHdCQUF3QixFQUFFLDZCQUE2QixFQUFFLDBCQUEwQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFbkosT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9jbGktc2VydmljZVwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45LjkzXCI7XG5leHBvcnQgKiBhcyBjbGkgZnJvbSBcIi4vc3JjL2NsaS50c1wiO1xuZXhwb3J0ICogYXMgZGVmaW5pdGlvbiBmcm9tIFwiLi9zcmMvZGVmaW5pdGlvbi50c1wiO1xuZXhwb3J0ICogYXMgaWNvbiBmcm9tIFwiLi9zcmMvaWNvbi50c1wiO1xuZXhwb3J0ICogYXMgc2VydmljZSBmcm9tIFwiLi9zcmMvc2VydmljZS50c1wiO1xuZXhwb3J0IHsgQ2xpU2VydmljZUluc3RhbGxPcHRpb25zU2NoZW1hIH0gZnJvbSBcIi4vc3JjL2NsaS50c1wiO1xuZXhwb3J0IHR5cGUgeyBDbGlTZXJ2aWNlRGVmaW5pdGlvblNvdXJjZSwgQ2xpU2VydmljZUNsaURlcGVuZGVuY2llcyB9IGZyb20gXCIuL3NyYy9jbGkudHNcIjtcbmV4cG9ydCB7IENsaVNlcnZpY2VDb21tYW5kU2NoZW1hLCBDbGlTZXJ2aWNlTWVudUl0ZW1TY2hlbWEsIENsaVNlcnZpY2VQeXRob25QYWNrYWdlU2NoZW1hLCBDbGlTZXJ2aWNlRGVmaW5pdGlvblNjaGVtYSB9IGZyb20gXCIuL3NyYy9kZWZpbml0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IENsaVNlcnZpY2VDb21tYW5kLCBDbGlTZXJ2aWNlQ29tbWFuZElucHV0LCBDbGlTZXJ2aWNlTWVudUl0ZW0sIENsaVNlcnZpY2VQeXRob25QYWNrYWdlLCBDbGlTZXJ2aWNlUHl0aG9uUGFja2FnZUlucHV0LCBDbGlTZXJ2aWNlRGVmaW5pdGlvbiwgQ2xpU2VydmljZURlZmluaXRpb25PcHRpb25zIH0gZnJvbSBcIi4vc3JjL2RlZmluaXRpb24udHNcIjtcbmV4cG9ydCB7IENsaVNlcnZpY2UgfSBmcm9tIFwiLi9zcmMvc2VydmljZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBDbGlTZXJ2aWNlQ29tcGlsZXIsIENsaVNlcnZpY2VSdW50aW1lSW5zdGFsbGVyLCBDbGlTZXJ2aWNlUHl0aG9uSW5zdGFsbGVyLCBDbGlTZXJ2aWNlUnVudGltZU9wdGlvbnMsIENsaVNlcnZpY2VTdGF0dXMsIENsaVNlcnZpY2VMaWZlY3ljbGUgfSBmcm9tIFwiLi9zcmMvc2VydmljZS50c1wiO1xuIl19
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx3QkFBd0IsQ0FBQztBQUMzRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFOUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLHdCQUF3QixFQUFFLDZCQUE2QixFQUFFLDBCQUEwQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHbkosT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9jbGktc2VydmljZVwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45Ljk1XCI7XG5leHBvcnQgKiBhcyBjbGkgZnJvbSBcIi4vc3JjL2NsaS50c1wiO1xuZXhwb3J0ICogYXMgZGVmaW5pdGlvbiBmcm9tIFwiLi9zcmMvZGVmaW5pdGlvbi50c1wiO1xuZXhwb3J0ICogYXMgaWNvbiBmcm9tIFwiLi9zcmMvaWNvbi50c1wiO1xuZXhwb3J0ICogYXMgc2VydmljZSBmcm9tIFwiLi9zcmMvc2VydmljZS50c1wiO1xuZXhwb3J0IHsgQ2xpU2VydmljZUluc3RhbGxPcHRpb25zU2NoZW1hIH0gZnJvbSBcIi4vc3JjL2NsaS50c1wiO1xuZXhwb3J0IHR5cGUgeyBDbGlTZXJ2aWNlRGVmaW5pdGlvblNvdXJjZSwgQ2xpU2VydmljZUNsaURlcGVuZGVuY2llcyB9IGZyb20gXCIuL3NyYy9jbGkudHNcIjtcbmV4cG9ydCB7IENsaVNlcnZpY2VDb21tYW5kU2NoZW1hLCBDbGlTZXJ2aWNlTWVudUl0ZW1TY2hlbWEsIENsaVNlcnZpY2VQeXRob25QYWNrYWdlU2NoZW1hLCBDbGlTZXJ2aWNlRGVmaW5pdGlvblNjaGVtYSB9IGZyb20gXCIuL3NyYy9kZWZpbml0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IENsaVNlcnZpY2VDb21tYW5kLCBDbGlTZXJ2aWNlQ29tbWFuZElucHV0LCBDbGlTZXJ2aWNlTWVudUl0ZW0sIENsaVNlcnZpY2VQeXRob25QYWNrYWdlLCBDbGlTZXJ2aWNlUHl0aG9uUGFja2FnZUlucHV0LCBDbGlTZXJ2aWNlRGVmaW5pdGlvbiwgQ2xpU2VydmljZURlZmluaXRpb25PcHRpb25zIH0gZnJvbSBcIi4vc3JjL2RlZmluaXRpb24udHNcIjtcbmV4cG9ydCB0eXBlIHsgU2VydmljZVRyYXlHbHlwaCB9IGZyb20gXCIuL3NyYy9pY29uLnRzXCI7XG5leHBvcnQgeyBDbGlTZXJ2aWNlIH0gZnJvbSBcIi4vc3JjL3NlcnZpY2UudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ2xpU2VydmljZUNvbXBpbGVyLCBDbGlTZXJ2aWNlUnVudGltZUluc3RhbGxlciwgQ2xpU2VydmljZVB5dGhvbkluc3RhbGxlciwgQ2xpU2VydmljZVJ1bnRpbWVPcHRpb25zLCBDbGlTZXJ2aWNlU3RhdHVzLCBDbGlTZXJ2aWNlTGlmZWN5Y2xlIH0gZnJvbSBcIi4vc3JjL3NlcnZpY2UudHNcIjtcbiJdfQ==
@@ -2,12 +2,18 @@ import { mkdtemp, readdir, rm } from "node:fs/promises";
2
2
  import { tmpdir } from "node:os";
3
3
  import { join, resolve } from "node:path";
4
4
  import * as exec from "@dbx-tools/core/exec";
5
+ import { log } from "@dbx-tools/shared-core";
6
+ const logger = log.logger("cli:service");
5
7
  /** Compile an entrypoint while containing Bun's intermediate executables. */
6
8
  export async function compileWithBun(bunExecutable, entrypoint, output, workingDirectory, external = [], temporaryDirectory = tmpdir()) {
7
9
  const absoluteEntrypoint = resolve(workingDirectory, entrypoint);
8
10
  const absoluteOutput = resolve(workingDirectory, output);
9
11
  const before = await bunBuildArtifacts(workingDirectory);
10
12
  const compileDirectory = await mkdtemp(join(temporaryDirectory, "dbx-tools-bun-compile-"));
13
+ logger.info("compiling service executable with Bun", {
14
+ entrypoint: absoluteEntrypoint,
15
+ output: absoluteOutput,
16
+ });
11
17
  try {
12
18
  await exec.spawn(bunExecutable, [
13
19
  "build",
@@ -24,6 +30,10 @@ export async function compileWithBun(bunExecutable, entrypoint, output, workingD
24
30
  stdout: "capture",
25
31
  stderr: "capture",
26
32
  });
33
+ logger.info("service executable compiled", {
34
+ entrypoint: absoluteEntrypoint,
35
+ output: absoluteOutput,
36
+ });
27
37
  }
28
38
  finally {
29
39
  try {
@@ -46,4 +56,4 @@ async function bunBuildArtifacts(directory) {
46
56
  .filter((name) => name.startsWith(".") && name.endsWith(".bun-build"))
47
57
  .sort());
48
58
  }
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2NvbXBpbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX2NvbXBpbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUUxQyxPQUFPLEtBQUssSUFBSSxNQUFNLHNCQUFzQixDQUFDO0FBRTdDLDZFQUE2RTtBQUM3RSxNQUFNLENBQUMsS0FBSyxVQUFVLGNBQWMsQ0FDbEMsYUFBcUIsRUFDckIsVUFBa0IsRUFDbEIsTUFBYyxFQUNkLGdCQUF3QixFQUN4QixXQUE4QixFQUFFLEVBQ2hDLHFCQUE2QixNQUFNLEVBQUU7SUFFckMsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDakUsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3pELE1BQU0sTUFBTSxHQUFHLE1BQU0saUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN6RCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDLENBQUM7SUFDM0YsSUFBSSxDQUFDO1FBQ0gsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUNkLGFBQWEsRUFDYjtZQUNFLE9BQU87WUFDUCxrQkFBa0I7WUFDbEIsV0FBVztZQUNYLGlDQUFpQztZQUNqQyxXQUFXO1lBQ1gsY0FBYztZQUNkLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FDaEUsRUFDRDtZQUNFLEtBQUssRUFBRSxJQUFJO1lBQ1gsR0FBRyxFQUFFLGdCQUFnQjtZQUNyQixLQUFLLEVBQUUsUUFBUTtZQUNmLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLE1BQU0sRUFBRSxTQUFTO1NBQ2xCLENBQ0YsQ0FBQztJQUNKLENBQUM7WUFBUyxDQUFDO1FBQ1QsSUFBSSxDQUFDO1lBQ0gsS0FBSyxNQUFNLFFBQVEsSUFBSSxNQUFNLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztnQkFDakUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztvQkFDMUIsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxFQUFFO3dCQUN6QyxTQUFTLEVBQUUsSUFBSTt3QkFDZixLQUFLLEVBQUUsSUFBSTtxQkFDWixDQUFDLENBQUM7Z0JBQ0wsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO2dCQUFTLENBQUM7WUFDVCxNQUFNLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDL0QsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQsS0FBSyxVQUFVLGlCQUFpQixDQUFDLFNBQWlCO0lBQ2hELE9BQU8sSUFBSSxHQUFHLENBQ1osQ0FBQyxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUN2QixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNyRSxJQUFJLEVBQUUsQ0FDVixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1rZHRlbXAsIHJlYWRkaXIsIHJtIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBqb2luLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG5pbXBvcnQgKiBhcyBleGVjIGZyb20gXCJAZGJ4LXRvb2xzL2NvcmUvZXhlY1wiO1xuXG4vKiogQ29tcGlsZSBhbiBlbnRyeXBvaW50IHdoaWxlIGNvbnRhaW5pbmcgQnVuJ3MgaW50ZXJtZWRpYXRlIGV4ZWN1dGFibGVzLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbXBpbGVXaXRoQnVuKFxuICBidW5FeGVjdXRhYmxlOiBzdHJpbmcsXG4gIGVudHJ5cG9pbnQ6IHN0cmluZyxcbiAgb3V0cHV0OiBzdHJpbmcsXG4gIHdvcmtpbmdEaXJlY3Rvcnk6IHN0cmluZyxcbiAgZXh0ZXJuYWw6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10sXG4gIHRlbXBvcmFyeURpcmVjdG9yeTogc3RyaW5nID0gdG1wZGlyKCksXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYWJzb2x1dGVFbnRyeXBvaW50ID0gcmVzb2x2ZSh3b3JraW5nRGlyZWN0b3J5LCBlbnRyeXBvaW50KTtcbiAgY29uc3QgYWJzb2x1dGVPdXRwdXQgPSByZXNvbHZlKHdvcmtpbmdEaXJlY3RvcnksIG91dHB1dCk7XG4gIGNvbnN0IGJlZm9yZSA9IGF3YWl0IGJ1bkJ1aWxkQXJ0aWZhY3RzKHdvcmtpbmdEaXJlY3RvcnkpO1xuICBjb25zdCBjb21waWxlRGlyZWN0b3J5ID0gYXdhaXQgbWtkdGVtcChqb2luKHRlbXBvcmFyeURpcmVjdG9yeSwgXCJkYngtdG9vbHMtYnVuLWNvbXBpbGUtXCIpKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBleGVjLnNwYXduKFxuICAgICAgYnVuRXhlY3V0YWJsZSxcbiAgICAgIFtcbiAgICAgICAgXCJidWlsZFwiLFxuICAgICAgICBhYnNvbHV0ZUVudHJ5cG9pbnQsXG4gICAgICAgIFwiLS1jb21waWxlXCIsXG4gICAgICAgIFwiLS1jb21waWxlLWF1dG9sb2FkLXBhY2thZ2UtanNvblwiLFxuICAgICAgICBcIi0tb3V0ZmlsZVwiLFxuICAgICAgICBhYnNvbHV0ZU91dHB1dCxcbiAgICAgICAgLi4uZXh0ZXJuYWwuZmxhdE1hcCgoZGVwZW5kZW5jeSkgPT4gW1wiLS1leHRlcm5hbFwiLCBkZXBlbmRlbmN5XSksXG4gICAgICBdLFxuICAgICAge1xuICAgICAgICBjaGVjazogdHJ1ZSxcbiAgICAgICAgY3dkOiBjb21waWxlRGlyZWN0b3J5LFxuICAgICAgICBzdGRpbjogXCJpZ25vcmVcIixcbiAgICAgICAgc3Rkb3V0OiBcImNhcHR1cmVcIixcbiAgICAgICAgc3RkZXJyOiBcImNhcHR1cmVcIixcbiAgICAgIH0sXG4gICAgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBhcnRpZmFjdCBvZiBhd2FpdCBidW5CdWlsZEFydGlmYWN0cyh3b3JraW5nRGlyZWN0b3J5KSkge1xuICAgICAgICBpZiAoIWJlZm9yZS5oYXMoYXJ0aWZhY3QpKSB7XG4gICAgICAgICAgYXdhaXQgcm0oam9pbih3b3JraW5nRGlyZWN0b3J5LCBhcnRpZmFjdCksIHtcbiAgICAgICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHJtKGNvbXBpbGVEaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gYnVuQnVpbGRBcnRpZmFjdHMoZGlyZWN0b3J5OiBzdHJpbmcpOiBQcm9taXNlPFNldDxzdHJpbmc+PiB7XG4gIHJldHVybiBuZXcgU2V0KFxuICAgIChhd2FpdCByZWFkZGlyKGRpcmVjdG9yeSkpXG4gICAgICAuZmlsdGVyKChuYW1lKSA9PiBuYW1lLnN0YXJ0c1dpdGgoXCIuXCIpICYmIG5hbWUuZW5kc1dpdGgoXCIuYnVuLWJ1aWxkXCIpKVxuICAgICAgLnNvcnQoKSxcbiAgKTtcbn1cbiJdfQ==
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2NvbXBpbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX2NvbXBpbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUUxQyxPQUFPLEtBQUssSUFBSSxNQUFNLHNCQUFzQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU3QyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBRXpDLDZFQUE2RTtBQUM3RSxNQUFNLENBQUMsS0FBSyxVQUFVLGNBQWMsQ0FDbEMsYUFBcUIsRUFDckIsVUFBa0IsRUFDbEIsTUFBYyxFQUNkLGdCQUF3QixFQUN4QixXQUE4QixFQUFFLEVBQ2hDLHFCQUE2QixNQUFNLEVBQUU7SUFFckMsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDakUsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3pELE1BQU0sTUFBTSxHQUFHLE1BQU0saUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN6RCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDLENBQUM7SUFDM0YsTUFBTSxDQUFDLElBQUksQ0FBQyx1Q0FBdUMsRUFBRTtRQUNuRCxVQUFVLEVBQUUsa0JBQWtCO1FBQzlCLE1BQU0sRUFBRSxjQUFjO0tBQ3ZCLENBQUMsQ0FBQztJQUNILElBQUksQ0FBQztRQUNILE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FDZCxhQUFhLEVBQ2I7WUFDRSxPQUFPO1lBQ1Asa0JBQWtCO1lBQ2xCLFdBQVc7WUFDWCxpQ0FBaUM7WUFDakMsV0FBVztZQUNYLGNBQWM7WUFDZCxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQ2hFLEVBQ0Q7WUFDRSxLQUFLLEVBQUUsSUFBSTtZQUNYLEdBQUcsRUFBRSxnQkFBZ0I7WUFDckIsS0FBSyxFQUFFLFFBQVE7WUFDZixNQUFNLEVBQUUsU0FBUztZQUNqQixNQUFNLEVBQUUsU0FBUztTQUNsQixDQUNGLENBQUM7UUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLDZCQUE2QixFQUFFO1lBQ3pDLFVBQVUsRUFBRSxrQkFBa0I7WUFDOUIsTUFBTSxFQUFFLGNBQWM7U0FDdkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztZQUFTLENBQUM7UUFDVCxJQUFJLENBQUM7WUFDSCxLQUFLLE1BQU0sUUFBUSxJQUFJLE1BQU0saUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO2dCQUNqRSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO29CQUMxQixNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLEVBQUU7d0JBQ3pDLFNBQVMsRUFBRSxJQUFJO3dCQUNmLEtBQUssRUFBRSxJQUFJO3FCQUNaLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7Z0JBQVMsQ0FBQztZQUNULE1BQU0sRUFBRSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMvRCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRCxLQUFLLFVBQVUsaUJBQWlCLENBQUMsU0FBaUI7SUFDaEQsT0FBTyxJQUFJLEdBQUcsQ0FDWixDQUFDLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ3ZCLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ3JFLElBQUksRUFBRSxDQUNWLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWtkdGVtcCwgcmVhZGRpciwgcm0gfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSBcIm5vZGU6b3NcIjtcbmltcG9ydCB7IGpvaW4sIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCAqIGFzIGV4ZWMgZnJvbSBcIkBkYngtdG9vbHMvY29yZS9leGVjXCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiY2xpOnNlcnZpY2VcIik7XG5cbi8qKiBDb21waWxlIGFuIGVudHJ5cG9pbnQgd2hpbGUgY29udGFpbmluZyBCdW4ncyBpbnRlcm1lZGlhdGUgZXhlY3V0YWJsZXMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29tcGlsZVdpdGhCdW4oXG4gIGJ1bkV4ZWN1dGFibGU6IHN0cmluZyxcbiAgZW50cnlwb2ludDogc3RyaW5nLFxuICBvdXRwdXQ6IHN0cmluZyxcbiAgd29ya2luZ0RpcmVjdG9yeTogc3RyaW5nLFxuICBleHRlcm5hbDogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSxcbiAgdGVtcG9yYXJ5RGlyZWN0b3J5OiBzdHJpbmcgPSB0bXBkaXIoKSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhYnNvbHV0ZUVudHJ5cG9pbnQgPSByZXNvbHZlKHdvcmtpbmdEaXJlY3RvcnksIGVudHJ5cG9pbnQpO1xuICBjb25zdCBhYnNvbHV0ZU91dHB1dCA9IHJlc29sdmUod29ya2luZ0RpcmVjdG9yeSwgb3V0cHV0KTtcbiAgY29uc3QgYmVmb3JlID0gYXdhaXQgYnVuQnVpbGRBcnRpZmFjdHMod29ya2luZ0RpcmVjdG9yeSk7XG4gIGNvbnN0IGNvbXBpbGVEaXJlY3RvcnkgPSBhd2FpdCBta2R0ZW1wKGpvaW4odGVtcG9yYXJ5RGlyZWN0b3J5LCBcImRieC10b29scy1idW4tY29tcGlsZS1cIikpO1xuICBsb2dnZXIuaW5mbyhcImNvbXBpbGluZyBzZXJ2aWNlIGV4ZWN1dGFibGUgd2l0aCBCdW5cIiwge1xuICAgIGVudHJ5cG9pbnQ6IGFic29sdXRlRW50cnlwb2ludCxcbiAgICBvdXRwdXQ6IGFic29sdXRlT3V0cHV0LFxuICB9KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBleGVjLnNwYXduKFxuICAgICAgYnVuRXhlY3V0YWJsZSxcbiAgICAgIFtcbiAgICAgICAgXCJidWlsZFwiLFxuICAgICAgICBhYnNvbHV0ZUVudHJ5cG9pbnQsXG4gICAgICAgIFwiLS1jb21waWxlXCIsXG4gICAgICAgIFwiLS1jb21waWxlLWF1dG9sb2FkLXBhY2thZ2UtanNvblwiLFxuICAgICAgICBcIi0tb3V0ZmlsZVwiLFxuICAgICAgICBhYnNvbHV0ZU91dHB1dCxcbiAgICAgICAgLi4uZXh0ZXJuYWwuZmxhdE1hcCgoZGVwZW5kZW5jeSkgPT4gW1wiLS1leHRlcm5hbFwiLCBkZXBlbmRlbmN5XSksXG4gICAgICBdLFxuICAgICAge1xuICAgICAgICBjaGVjazogdHJ1ZSxcbiAgICAgICAgY3dkOiBjb21waWxlRGlyZWN0b3J5LFxuICAgICAgICBzdGRpbjogXCJpZ25vcmVcIixcbiAgICAgICAgc3Rkb3V0OiBcImNhcHR1cmVcIixcbiAgICAgICAgc3RkZXJyOiBcImNhcHR1cmVcIixcbiAgICAgIH0sXG4gICAgKTtcbiAgICBsb2dnZXIuaW5mbyhcInNlcnZpY2UgZXhlY3V0YWJsZSBjb21waWxlZFwiLCB7XG4gICAgICBlbnRyeXBvaW50OiBhYnNvbHV0ZUVudHJ5cG9pbnQsXG4gICAgICBvdXRwdXQ6IGFic29sdXRlT3V0cHV0LFxuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IGFydGlmYWN0IG9mIGF3YWl0IGJ1bkJ1aWxkQXJ0aWZhY3RzKHdvcmtpbmdEaXJlY3RvcnkpKSB7XG4gICAgICAgIGlmICghYmVmb3JlLmhhcyhhcnRpZmFjdCkpIHtcbiAgICAgICAgICBhd2FpdCBybShqb2luKHdvcmtpbmdEaXJlY3RvcnksIGFydGlmYWN0KSwge1xuICAgICAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgcm0oY29tcGlsZURpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBidW5CdWlsZEFydGlmYWN0cyhkaXJlY3Rvcnk6IHN0cmluZyk6IFByb21pc2U8U2V0PHN0cmluZz4+IHtcbiAgcmV0dXJuIG5ldyBTZXQoXG4gICAgKGF3YWl0IHJlYWRkaXIoZGlyZWN0b3J5KSlcbiAgICAgIC5maWx0ZXIoKG5hbWUpID0+IG5hbWUuc3RhcnRzV2l0aChcIi5cIikgJiYgbmFtZS5lbmRzV2l0aChcIi5idW4tYnVpbGRcIikpXG4gICAgICAuc29ydCgpLFxuICApO1xufVxuIl19
@@ -1,4 +1,4 @@
1
1
  export declare function externalRuntimePackages(dependencies: Readonly<Record<string, string>>): string[];
2
2
  export declare function installServiceRuntime(bunExecutable: string, directory: string, dependencies: Readonly<Record<string, string>>): Promise<void>;
3
3
  /** Create a clean uv environment and install the primary and companion Python packages. */
4
- export declare function installServicePythonPackage(uvExecutable: string, directory: string, packageSpecifiers: readonly string[], python: string, platform: NodeJS.Platform): Promise<string>;
4
+ export declare function installServicePythonPackage(uvExecutable: string, directory: string, packageSpecifiers: readonly string[], python: string, platform: NodeJS.Platform, offline: boolean): Promise<string>;
@@ -1,11 +1,13 @@
1
1
  import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
3
  import * as exec from "@dbx-tools/core/exec";
4
- import { object } from "@dbx-tools/shared-core";
4
+ import { log, object } from "@dbx-tools/shared-core";
5
+ const logger = log.logger("cli:service");
5
6
  export function externalRuntimePackages(dependencies) {
6
7
  return Object.keys(dependencies).filter((name) => !name.startsWith("@dbx-tools/"));
7
8
  }
8
9
  export async function installServiceRuntime(bunExecutable, directory, dependencies) {
10
+ const packages = Object.keys(dependencies);
9
11
  await mkdir(directory, { recursive: true });
10
12
  const manifestPath = join(directory, "package.json");
11
13
  const current = await readOptionalRecord(manifestPath);
@@ -18,6 +20,9 @@ export async function installServiceRuntime(bunExecutable, directory, dependenci
18
20
  ...dependencies,
19
21
  },
20
22
  }, null, 2)}\n`, "utf8");
23
+ if (packages.length > 0) {
24
+ logger.info("installing service runtime packages", { directory, packages });
25
+ }
21
26
  await exec.spawn(bunExecutable, ["install", "--production", "--cwd", directory], {
22
27
  check: true,
23
28
  cwd: directory,
@@ -25,9 +30,13 @@ export async function installServiceRuntime(bunExecutable, directory, dependenci
25
30
  stdout: "capture",
26
31
  stderr: "capture",
27
32
  });
33
+ if (packages.length > 0) {
34
+ logger.info("service runtime packages installed", { directory, packages });
35
+ }
28
36
  }
29
37
  /** Create a clean uv environment and install the primary and companion Python packages. */
30
- export async function installServicePythonPackage(uvExecutable, directory, packageSpecifiers, python, platform) {
38
+ export async function installServicePythonPackage(uvExecutable, directory, packageSpecifiers, python, platform, offline) {
39
+ logger.info("creating service Python environment", { directory, python });
31
40
  await rm(directory, { recursive: true, force: true });
32
41
  await exec.spawn(uvExecutable, ["venv", "--managed-python", "--no-project", "--python", python, directory], {
33
42
  check: true,
@@ -36,12 +45,29 @@ export async function installServicePythonPackage(uvExecutable, directory, packa
36
45
  stderr: "capture",
37
46
  });
38
47
  const executable = join(directory, platform === "win32" ? "Scripts/python.exe" : "bin/python");
39
- await exec.spawn(uvExecutable, ["pip", "install", "--python", executable, "--upgrade", ...packageSpecifiers], {
48
+ logger.info("installing service Python packages", {
49
+ executable,
50
+ offline,
51
+ packages: packageSpecifiers,
52
+ });
53
+ await exec.spawn(uvExecutable, [
54
+ "pip",
55
+ "install",
56
+ "--python",
57
+ executable,
58
+ ...(offline ? ["--offline"] : []),
59
+ ...packageSpecifiers,
60
+ ], {
40
61
  check: true,
41
62
  stdin: "ignore",
42
63
  stdout: "capture",
43
64
  stderr: "capture",
44
65
  });
66
+ logger.info("service Python packages installed", {
67
+ executable,
68
+ offline,
69
+ packages: packageSpecifiers,
70
+ });
45
71
  return executable;
46
72
  }
47
73
  async function readOptionalRecord(path) {
@@ -62,4 +88,4 @@ function stringRecord(value) {
62
88
  return {};
63
89
  return Object.fromEntries(Object.entries(value).filter((entry) => typeof entry[1] === "string"));
64
90
  }
65
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3J1bnRpbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX3J1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFakMsT0FBTyxLQUFLLElBQUksTUFBTSxzQkFBc0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFaEQsTUFBTSxVQUFVLHVCQUF1QixDQUFDLFlBQThDO0lBQ3BGLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0FBQ3JGLENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLHFCQUFxQixDQUN6QyxhQUFxQixFQUNyQixTQUFpQixFQUNqQixZQUE4QztJQUU5QyxNQUFNLEtBQUssQ0FBQyxTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM1QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sT0FBTyxHQUFHLE1BQU0sa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDdkQsTUFBTSxTQUFTLENBQ2IsWUFBWSxFQUNaLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FDZjtRQUNFLEdBQUcsT0FBTztRQUNWLElBQUksRUFBRSw0QkFBNEI7UUFDbEMsT0FBTyxFQUFFLElBQUk7UUFDYixZQUFZLEVBQUU7WUFDWixHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO1lBQ3JDLEdBQUcsWUFBWTtTQUNoQjtLQUNGLEVBQ0QsSUFBSSxFQUNKLENBQUMsQ0FDRixJQUFJLEVBQ0wsTUFBTSxDQUNQLENBQUM7SUFDRixNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUMsU0FBUyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLEVBQUU7UUFDL0UsS0FBSyxFQUFFLElBQUk7UUFDWCxHQUFHLEVBQUUsU0FBUztRQUNkLEtBQUssRUFBRSxRQUFRO1FBQ2YsTUFBTSxFQUFFLFNBQVM7UUFDakIsTUFBTSxFQUFFLFNBQVM7S0FDbEIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELDJGQUEyRjtBQUMzRixNQUFNLENBQUMsS0FBSyxVQUFVLDJCQUEyQixDQUMvQyxZQUFvQixFQUNwQixTQUFpQixFQUNqQixpQkFBb0MsRUFDcEMsTUFBYyxFQUNkLFFBQXlCO0lBRXpCLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdEQsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUNkLFlBQVksRUFDWixDQUFDLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsRUFDM0U7UUFDRSxLQUFLLEVBQUUsSUFBSTtRQUNYLEtBQUssRUFBRSxRQUFRO1FBQ2YsTUFBTSxFQUFFLFNBQVM7UUFDakIsTUFBTSxFQUFFLFNBQVM7S0FDbEIsQ0FDRixDQUFDO0lBQ0YsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDL0YsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUNkLFlBQVksRUFDWixDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsR0FBRyxpQkFBaUIsQ0FBQyxFQUM3RTtRQUNFLEtBQUssRUFBRSxJQUFJO1FBQ1gsS0FBSyxFQUFFLFFBQVE7UUFDZixNQUFNLEVBQUUsU0FBUztRQUNqQixNQUFNLEVBQUUsU0FBUztLQUNsQixDQUNGLENBQUM7SUFDRixPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDO0FBRUQsS0FBSyxVQUFVLGtCQUFrQixDQUFDLElBQVk7SUFDNUMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxLQUFLLEdBQVksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3BGLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFLLEtBQStCLENBQUMsSUFBSSxLQUFLLFFBQVE7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNsRSxNQUFNLEtBQUssQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsS0FBYztJQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN2QyxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQ3ZCLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUMxQixDQUFDLEtBQUssRUFBNkIsRUFBRSxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsQ0FDbkUsQ0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1rZGlyLCByZWFkRmlsZSwgcm0sIHdyaXRlRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG5pbXBvcnQgKiBhcyBleGVjIGZyb20gXCJAZGJ4LXRvb2xzL2NvcmUvZXhlY1wiO1xuaW1wb3J0IHsgb2JqZWN0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVybmFsUnVudGltZVBhY2thZ2VzKGRlcGVuZGVuY2llczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhkZXBlbmRlbmNpZXMpLmZpbHRlcigobmFtZSkgPT4gIW5hbWUuc3RhcnRzV2l0aChcIkBkYngtdG9vbHMvXCIpKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxTZXJ2aWNlUnVudGltZShcbiAgYnVuRXhlY3V0YWJsZTogc3RyaW5nLFxuICBkaXJlY3Rvcnk6IHN0cmluZyxcbiAgZGVwZW5kZW5jaWVzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pixcbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBta2RpcihkaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBtYW5pZmVzdFBhdGggPSBqb2luKGRpcmVjdG9yeSwgXCJwYWNrYWdlLmpzb25cIik7XG4gIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCByZWFkT3B0aW9uYWxSZWNvcmQobWFuaWZlc3RQYXRoKTtcbiAgYXdhaXQgd3JpdGVGaWxlKFxuICAgIG1hbmlmZXN0UGF0aCxcbiAgICBgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgIHtcbiAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgbmFtZTogXCJAZGJ4LXRvb2xzL3NlcnZpY2UtcnVudGltZVwiLFxuICAgICAgICBwcml2YXRlOiB0cnVlLFxuICAgICAgICBkZXBlbmRlbmNpZXM6IHtcbiAgICAgICAgICAuLi5zdHJpbmdSZWNvcmQoY3VycmVudC5kZXBlbmRlbmNpZXMpLFxuICAgICAgICAgIC4uLmRlcGVuZGVuY2llcyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBudWxsLFxuICAgICAgMixcbiAgICApfVxcbmAsXG4gICAgXCJ1dGY4XCIsXG4gICk7XG4gIGF3YWl0IGV4ZWMuc3Bhd24oYnVuRXhlY3V0YWJsZSwgW1wiaW5zdGFsbFwiLCBcIi0tcHJvZHVjdGlvblwiLCBcIi0tY3dkXCIsIGRpcmVjdG9yeV0sIHtcbiAgICBjaGVjazogdHJ1ZSxcbiAgICBjd2Q6IGRpcmVjdG9yeSxcbiAgICBzdGRpbjogXCJpZ25vcmVcIixcbiAgICBzdGRvdXQ6IFwiY2FwdHVyZVwiLFxuICAgIHN0ZGVycjogXCJjYXB0dXJlXCIsXG4gIH0pO1xufVxuXG4vKiogQ3JlYXRlIGEgY2xlYW4gdXYgZW52aXJvbm1lbnQgYW5kIGluc3RhbGwgdGhlIHByaW1hcnkgYW5kIGNvbXBhbmlvbiBQeXRob24gcGFja2FnZXMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbFNlcnZpY2VQeXRob25QYWNrYWdlKFxuICB1dkV4ZWN1dGFibGU6IHN0cmluZyxcbiAgZGlyZWN0b3J5OiBzdHJpbmcsXG4gIHBhY2thZ2VTcGVjaWZpZXJzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgcHl0aG9uOiBzdHJpbmcsXG4gIHBsYXRmb3JtOiBOb2RlSlMuUGxhdGZvcm0sXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBhd2FpdCBybShkaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZXhlYy5zcGF3bihcbiAgICB1dkV4ZWN1dGFibGUsXG4gICAgW1widmVudlwiLCBcIi0tbWFuYWdlZC1weXRob25cIiwgXCItLW5vLXByb2plY3RcIiwgXCItLXB5dGhvblwiLCBweXRob24sIGRpcmVjdG9yeV0sXG4gICAge1xuICAgICAgY2hlY2s6IHRydWUsXG4gICAgICBzdGRpbjogXCJpZ25vcmVcIixcbiAgICAgIHN0ZG91dDogXCJjYXB0dXJlXCIsXG4gICAgICBzdGRlcnI6IFwiY2FwdHVyZVwiLFxuICAgIH0sXG4gICk7XG4gIGNvbnN0IGV4ZWN1dGFibGUgPSBqb2luKGRpcmVjdG9yeSwgcGxhdGZvcm0gPT09IFwid2luMzJcIiA/IFwiU2NyaXB0cy9weXRob24uZXhlXCIgOiBcImJpbi9weXRob25cIik7XG4gIGF3YWl0IGV4ZWMuc3Bhd24oXG4gICAgdXZFeGVjdXRhYmxlLFxuICAgIFtcInBpcFwiLCBcImluc3RhbGxcIiwgXCItLXB5dGhvblwiLCBleGVjdXRhYmxlLCBcIi0tdXBncmFkZVwiLCAuLi5wYWNrYWdlU3BlY2lmaWVyc10sXG4gICAge1xuICAgICAgY2hlY2s6IHRydWUsXG4gICAgICBzdGRpbjogXCJpZ25vcmVcIixcbiAgICAgIHN0ZG91dDogXCJjYXB0dXJlXCIsXG4gICAgICBzdGRlcnI6IFwiY2FwdHVyZVwiLFxuICAgIH0sXG4gICk7XG4gIHJldHVybiBleGVjdXRhYmxlO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkT3B0aW9uYWxSZWNvcmQocGF0aDogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICB0cnkge1xuICAgIGNvbnN0IHZhbHVlOiB1bmtub3duID0gSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShwYXRoLCBcInV0ZjhcIikpO1xuICAgIGlmICghb2JqZWN0LmlzUmVjb3JkKHZhbHVlKSkgdGhyb3cgbmV3IEVycm9yKGBKU09OIGZpbGUgaXMgbm90IGFuIG9iamVjdDogJHtwYXRofWApO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gXCJFTk9FTlRcIikgcmV0dXJuIHt9O1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0cmluZ1JlY29yZCh2YWx1ZTogdW5rbm93bik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBpZiAoIW9iamVjdC5pc1JlY29yZCh2YWx1ZSkpIHJldHVybiB7fTtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyh2YWx1ZSkuZmlsdGVyKFxuICAgICAgKGVudHJ5KTogZW50cnkgaXMgW3N0cmluZywgc3RyaW5nXSA9PiB0eXBlb2YgZW50cnlbMV0gPT09IFwic3RyaW5nXCIsXG4gICAgKSxcbiAgKTtcbn1cbiJdfQ==
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3J1bnRpbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX3J1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFakMsT0FBTyxLQUFLLElBQUksTUFBTSxzQkFBc0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXJELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7QUFFekMsTUFBTSxVQUFVLHVCQUF1QixDQUFDLFlBQThDO0lBQ3BGLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0FBQ3JGLENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLHFCQUFxQixDQUN6QyxhQUFxQixFQUNyQixTQUFpQixFQUNqQixZQUE4QztJQUU5QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzNDLE1BQU0sS0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDckQsTUFBTSxPQUFPLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN2RCxNQUFNLFNBQVMsQ0FDYixZQUFZLEVBQ1osR0FBRyxJQUFJLENBQUMsU0FBUyxDQUNmO1FBQ0Us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SSxDQUFDO1FBQ0gsTUFBTSxLQUFLLEdBQVksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3BGLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFLLEtBQStCLENBQUMsSUFBSSxLQUFLLFFBQVE7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNsRSxNQUFNLEtBQUssQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsS0FBYztJQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN2QyxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQ3ZCLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUMxQixDQUFDLEtBQUssRUFBNkIsRUFBRSxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsQ0FDbkUsQ0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1rZGlyLCByZWFkRmlsZSwgcm0sIHdyaXRlRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG5pbXBvcnQgKiBhcyBleGVjIGZyb20gXCJAZGJ4LXRvb2xzL2NvcmUvZXhlY1wiO1xuaW1wb3J0IHsgbG9nLCBvYmplY3QgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiY2xpOnNlcnZpY2VcIik7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRlcm5hbFJ1bnRpbWVQYWNrYWdlcyhkZXBlbmRlbmNpZXM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KTogc3RyaW5nW10ge1xuICByZXR1cm4gT2JqZWN0LmtleXMoZGVwZW5kZW5jaWVzKS5maWx0ZXIoKG5hbWUpID0+ICFuYW1lLnN0YXJ0c1dpdGgoXCJAZGJ4LXRvb2xzL1wiKSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsU2VydmljZVJ1bnRpbWUoXG4gIGJ1bkV4ZWN1dGFibGU6IHN0cmluZyxcbiAgZGlyZWN0b3J5OiBzdHJpbmcsXG4gIGRlcGVuZGVuY2llczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGFja2FnZXMgPSBPYmplY3Qua2V5cyhkZXBlbmRlbmNpZXMpO1xuICBhd2FpdCBta2RpcihkaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBtYW5pZmVzdFBhdGggPSBqb2luKGRpcmVjdG9yeSwgXCJwYWNrYWdlLmpzb25cIik7XG4gIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCByZWFkT3B0aW9uYWxSZWNvcmQobWFuaWZlc3RQYXRoKTtcbiAgYXdhaXQgd3JpdGVGaWxlKFxuICAgIG1hbmlmZXN0UGF0aCxcbiAgICBgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgIHtcbiAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgbmFtZTogXCJAZGJ4LXRvb2xzL3NlcnZpY2UtcnVudGltZVwiLFxuICAgICAgICBwcml2YXRlOiB0cnVlLFxuICAgICAgICBkZXBlbmRlbmNpZXM6IHtcbiAgICAgICAgICAuLi5zdHJpbmdSZWNvcmQoY3VycmVudC5kZXBlbmRlbmNpZXMpLFxuICAgICAgICAgIC4uLmRlcGVuZGVuY2llcyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBudWxsLFxuICAgICAgMixcbiAgICApfVxcbmAsXG4gICAgXCJ1dGY4XCIsXG4gICk7XG4gIGlmIChwYWNrYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgbG9nZ2VyLmluZm8oXCJpbnN0YWxsaW5nIHNlcnZpY2UgcnVudGltZSBwYWNrYWdlc1wiLCB7IGRpcmVjdG9yeSwgcGFja2FnZXMgfSk7XG4gIH1cbiAgYXdhaXQgZXhlYy5zcGF3bihidW5FeGVjdXRhYmxlLCBbXCJpbnN0YWxsXCIsIFwiLS1wcm9kdWN0aW9uXCIsIFwiLS1jd2RcIiwgZGlyZWN0b3J5XSwge1xuICAgIGNoZWNrOiB0cnVlLFxuICAgIGN3ZDogZGlyZWN0b3J5LFxuICAgIHN0ZGluOiBcImlnbm9yZVwiLFxuICAgIHN0ZG91dDogXCJjYXB0dXJlXCIsXG4gICAgc3RkZXJyOiBcImNhcHR1cmVcIixcbiAgfSk7XG4gIGlmIChwYWNrYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgbG9nZ2VyLmluZm8oXCJzZXJ2aWNlIHJ1bnRpbWUgcGFja2FnZXMgaW5zdGFsbGVkXCIsIHsgZGlyZWN0b3J5LCBwYWNrYWdlcyB9KTtcbiAgfVxufVxuXG4vKiogQ3JlYXRlIGEgY2xlYW4gdXYgZW52aXJvbm1lbnQgYW5kIGluc3RhbGwgdGhlIHByaW1hcnkgYW5kIGNvbXBhbmlvbiBQeXRob24gcGFja2FnZXMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbFNlcnZpY2VQeXRob25QYWNrYWdlKFxuICB1dkV4ZWN1dGFibGU6IHN0cmluZyxcbiAgZGlyZWN0b3J5OiBzdHJpbmcsXG4gIHBhY2thZ2VTcGVjaWZpZXJzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgcHl0aG9uOiBzdHJpbmcsXG4gIHBsYXRmb3JtOiBOb2RlSlMuUGxhdGZvcm0sXG4gIG9mZmxpbmU6IGJvb2xlYW4sXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBsb2dnZXIuaW5mbyhcImNyZWF0aW5nIHNlcnZpY2UgUHl0aG9uIGVudmlyb25tZW50XCIsIHsgZGlyZWN0b3J5LCBweXRob24gfSk7XG4gIGF3YWl0IHJtKGRpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICBhd2FpdCBleGVjLnNwYXduKFxuICAgIHV2RXhlY3V0YWJsZSxcbiAgICBbXCJ2ZW52XCIsIFwiLS1tYW5hZ2VkLXB5dGhvblwiLCBcIi0tbm8tcHJvamVjdFwiLCBcIi0tcHl0aG9uXCIsIHB5dGhvbiwgZGlyZWN0b3J5XSxcbiAgICB7XG4gICAgICBjaGVjazogdHJ1ZSxcbiAgICAgIHN0ZGluOiBcImlnbm9yZVwiLFxuICAgICAgc3Rkb3V0OiBcImNhcHR1cmVcIixcbiAgICAgIHN0ZGVycjogXCJjYXB0dXJlXCIsXG4gICAgfSxcbiAgKTtcbiAgY29uc3QgZXhlY3V0YWJsZSA9IGpvaW4oZGlyZWN0b3J5LCBwbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiID8gXCJTY3JpcHRzL3B5dGhvbi5leGVcIiA6IFwiYmluL3B5dGhvblwiKTtcbiAgbG9nZ2VyLmluZm8oXCJpbnN0YWxsaW5nIHNlcnZpY2UgUHl0aG9uIHBhY2thZ2VzXCIsIHtcbiAgICBleGVjdXRhYmxlLFxuICAgIG9mZmxpbmUsXG4gICAgcGFja2FnZXM6IHBhY2thZ2VTcGVjaWZpZXJzLFxuICB9KTtcbiAgYXdhaXQgZXhlYy5zcGF3bihcbiAgICB1dkV4ZWN1dGFibGUsXG4gICAgW1xuICAgICAgXCJwaXBcIixcbiAgICAgIFwiaW5zdGFsbFwiLFxuICAgICAgXCItLXB5dGhvblwiLFxuICAgICAgZXhlY3V0YWJsZSxcbiAgICAgIC4uLihvZmZsaW5lID8gW1wiLS1vZmZsaW5lXCJdIDogW10pLFxuICAgICAgLi4ucGFja2FnZVNwZWNpZmllcnMsXG4gICAgXSxcbiAgICB7XG4gICAgICBjaGVjazogdHJ1ZSxcbiAgICAgIHN0ZGluOiBcImlnbm9yZVwiLFxuICAgICAgc3Rkb3V0OiBcImNhcHR1cmVcIixcbiAgICAgIHN0ZGVycjogXCJjYXB0dXJlXCIsXG4gICAgfSxcbiAgKTtcbiAgbG9nZ2VyLmluZm8oXCJzZXJ2aWNlIFB5dGhvbiBwYWNrYWdlcyBpbnN0YWxsZWRcIiwge1xuICAgIGV4ZWN1dGFibGUsXG4gICAgb2ZmbGluZSxcbiAgICBwYWNrYWdlczogcGFja2FnZVNwZWNpZmllcnMsXG4gIH0pO1xuICByZXR1cm4gZXhlY3V0YWJsZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZE9wdGlvbmFsUmVjb3JkKHBhdGg6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB2YWx1ZTogdW5rbm93biA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUocGF0aCwgXCJ1dGY4XCIpKTtcbiAgICBpZiAoIW9iamVjdC5pc1JlY29yZCh2YWx1ZSkpIHRocm93IG5ldyBFcnJvcihgSlNPTiBmaWxlIGlzIG5vdCBhbiBvYmplY3Q6ICR7cGF0aH1gKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09IFwiRU5PRU5UXCIpIHJldHVybiB7fTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdHJpbmdSZWNvcmQodmFsdWU6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgaWYgKCFvYmplY3QuaXNSZWNvcmQodmFsdWUpKSByZXR1cm4ge307XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXModmFsdWUpLmZpbHRlcihcbiAgICAgIChlbnRyeSk6IGVudHJ5IGlzIFtzdHJpbmcsIHN0cmluZ10gPT4gdHlwZW9mIGVudHJ5WzFdID09PSBcInN0cmluZ1wiLFxuICAgICksXG4gICk7XG59XG4iXX0=
package/lib/src/cli.d.ts CHANGED
@@ -18,10 +18,14 @@ export interface CliServiceCliDependencies {
18
18
  create(definition: CliServiceDefinition): CliServiceLifecycle;
19
19
  /** Write the JSON result of the status command. */
20
20
  write(value: string): void;
21
+ /** Run a caller-supplied command with inherited terminal input and output. */
22
+ readonly execute?: (command: string, arguments_: readonly string[]) => Promise<void>;
21
23
  }
22
24
  export declare const CliServiceInstallOptionsSchema: z.ZodObject<{
23
25
  start: z.ZodDefault<z.ZodBoolean>;
26
+ pythonProject: z.ZodOptional<z.ZodString>;
27
+ offline: z.ZodDefault<z.ZodBoolean>;
24
28
  }, z.core.$strict>;
25
29
  export type CliServiceInstallOptions = z.output<typeof CliServiceInstallOptionsSchema>;
26
- /** Build install, start, stop, restart, status, and uninstall commands for a service. */
30
+ /** Build install, start, stop, restart, status, logs, and uninstall commands for a service. */
27
31
  export declare function buildServiceCommand(source: CliServiceDefinitionSource, dependencies?: CliServiceCliDependencies): Command;
package/lib/src/cli.js CHANGED
@@ -6,35 +6,55 @@
6
6
  *
7
7
  * @module
8
8
  */
9
+ import * as exec from "@dbx-tools/core/exec";
9
10
  import { Command } from "commander";
10
11
  import { z } from "zod";
11
12
  import { CliService } from "./service.js";
12
13
  const DEFAULT_DEPENDENCIES = {
13
14
  create: (definition) => new CliService(definition),
14
15
  write: (value) => process.stdout.write(value),
16
+ execute: async (command, arguments_) => {
17
+ await exec.spawn(command, arguments_, { check: true });
18
+ },
15
19
  };
16
20
  export const CliServiceInstallOptionsSchema = z
17
21
  .object({
18
22
  start: z.boolean().default(true).describe("Start the service after installation."),
23
+ pythonProject: z
24
+ .string()
25
+ .min(1)
26
+ .optional()
27
+ .describe("Local Python project installed instead of the registry package."),
28
+ offline: z
29
+ .boolean()
30
+ .default(false)
31
+ .describe("Install Python packages from the uv cache without network access."),
19
32
  })
20
33
  .strict()
21
34
  .describe("Options for installing a current-user CLI service.");
22
- /** Build install, start, stop, restart, status, and uninstall commands for a service. */
35
+ /** Build install, start, stop, restart, status, logs, and uninstall commands for a service. */
23
36
  export function buildServiceCommand(source, dependencies = DEFAULT_DEPENDENCIES) {
24
37
  const definition = resolveDefinition(source);
25
38
  const service = () => dependencies.create(definition());
26
- const command = new Command("service").description(typeof source === "function"
39
+ const execute = dependencies.execute ?? DEFAULT_DEPENDENCIES.execute;
40
+ const command = new Command("service")
41
+ .enablePositionalOptions()
42
+ .description(typeof source === "function"
27
43
  ? "Install and manage the desktop service"
28
44
  : `Install and manage the ${source.name} desktop service`);
29
45
  const install = command
30
46
  .command("install")
31
47
  .description("Install the service for the current user and start it")
32
- .option("--no-start", "Do not start the service after installation");
48
+ .option("--no-start", "Do not start the service after installation")
49
+ .option("--python-project <path>", "Install a local Python project instead of the registry package")
50
+ .option("--offline", "Install Python packages from the uv cache without network access");
33
51
  install.action(async () => {
34
52
  const options = CliServiceInstallOptionsSchema.parse({
35
53
  start: install.getOptionValue("start"),
54
+ pythonProject: install.getOptionValue("pythonProject"),
55
+ offline: install.getOptionValue("offline"),
36
56
  });
37
- await service().install({ start: options.start });
57
+ await service().install(options);
38
58
  });
39
59
  command
40
60
  .command("start")
@@ -60,6 +80,22 @@ export function buildServiceCommand(source, dependencies = DEFAULT_DEPENDENCIES)
60
80
  .action(async () => {
61
81
  dependencies.write(`${JSON.stringify(await service().status(), null, 2)}\n`);
62
82
  });
83
+ command
84
+ .command("logs")
85
+ .description("Print the service log path or append it to a command")
86
+ .argument("[command...]", "Command and arguments to run before the service log path")
87
+ .allowUnknownOption()
88
+ .passThroughOptions()
89
+ .allowExcessArguments()
90
+ .action(async (commandArguments) => {
91
+ const logPath = service().logPath();
92
+ if (commandArguments.length === 0) {
93
+ dependencies.write(`${logPath}\n`);
94
+ return;
95
+ }
96
+ const [executable, ...arguments_] = commandArguments;
97
+ await execute(executable, [...arguments_, logPath]);
98
+ });
63
99
  command
64
100
  .command("uninstall")
65
101
  .description("Stop and remove the service for the current user")
@@ -71,4 +107,4 @@ export function buildServiceCommand(source, dependencies = DEFAULT_DEPENDENCIES)
71
107
  function resolveDefinition(source) {
72
108
  return typeof source === "function" ? source : () => source;
73
109
  }
74
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUgsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBR3hCLE9BQU8sRUFBRSxVQUFVLEVBQTRCLE1BQU0sY0FBYyxDQUFDO0FBYXBFLE1BQU0sb0JBQW9CLEdBQThCO0lBQ3RELE1BQU0sRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDO0lBQ2xELEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO0NBQzlDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRyxDQUFDO0tBQzVDLE1BQU0sQ0FBQztJQUNOLEtBQUssRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyx1Q0FBdUMsQ0FBQztDQUNuRixDQUFDO0tBQ0QsTUFBTSxFQUFFO0tBQ1IsUUFBUSxDQUFDLG9EQUFvRCxDQUFDLENBQUM7QUFJbEUseUZBQXlGO0FBQ3pGLE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsTUFBa0MsRUFDbEMsZUFBMEMsb0JBQW9CO0lBRTlELE1BQU0sVUFBVSxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdDLE1BQU0sT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUN4RCxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLENBQ2hELE9BQU8sTUFBTSxLQUFLLFVBQVU7UUFDMUIsQ0FBQyxDQUFDLHdDQUF3QztRQUMxQyxDQUFDLENBQUMsMEJBQTBCLE1BQU0sQ0FBQyxJQUFJLGtCQUFrQixDQUM1RCxDQUFDO0lBRUYsTUFBTSxPQUFPLEdBQUcsT0FBTztTQUNwQixPQUFPLENBQUMsU0FBUyxDQUFDO1NBQ2xCLFdBQVcsQ0FBQyx1REFBdUQsQ0FBQztTQUNwRSxNQUFNLENBQUMsWUFBWSxFQUFFLDZDQUE2QyxDQUFDLENBQUM7SUFDdkUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRTtRQUN4QixNQUFNLE9BQU8sR0FBRyw4QkFBOEIsQ0FBQyxLQUFLLENBQUM7WUFDbkQsS0FBSyxFQUFFLE9BQU8sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDO1NBQ3ZDLENBQUMsQ0FBQztRQUNILE1BQU0sT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTztTQUNKLE9BQU8sQ0FBQyxPQUFPLENBQUM7U0FDaEIsV0FBVyxDQUFDLDZCQUE2QixDQUFDO1NBQzFDLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNqQixNQUFNLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzFCLENBQUMsQ0FBQyxDQUFDO0lBRUwsT0FBTztTQUNKLE9BQU8sQ0FBQyxNQUFNLENBQUM7U0FDZixXQUFXLENBQUMsMEJBQTBCLENBQUM7U0FDdkMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ2pCLE1BQU0sT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDekIsQ0FBQyxDQUFDLENBQUM7SUFFTCxPQUFPO1NBQ0osT0FBTyxDQUFDLFNBQVMsQ0FBQztTQUNsQixXQUFXLENBQUMsK0JBQStCLENBQUM7U0FDNUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ2pCLE1BQU0sT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDNUIsQ0FBQyxDQUFDLENBQUM7SUFFTCxPQUFPO1NBQ0osT0FBTyxDQUFDLFFBQVEsQ0FBQztTQUNqQixXQUFXLENBQUMsc0RBQXNELENBQUM7U0FDbkUsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ2pCLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sT0FBTyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvRSxDQUFDLENBQUMsQ0FBQztJQUVMLE9BQU87U0FDSixPQUFPLENBQUMsV0FBVyxDQUFDO1NBQ3BCLFdBQVcsQ0FBQyxrREFBa0QsQ0FBQztTQUMvRCxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDakIsTUFBTSxPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUM5QixDQUFDLENBQUMsQ0FBQztJQUVMLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLE1BQWtDO0lBQzNELE9BQU8sT0FBTyxNQUFNLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztBQUM5RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb21tYW5kZXIgY29tbWFuZCBncm91cCBmb3IgdGhlIHNoYXJlZCBzeXN0ZW0tdHJheSBzZXJ2aWNlIGxpZmVjeWNsZS5cbiAqXG4gKiBDb25zdW1pbmcgQ0xJcyBzaG91bGQgbW91bnQge0BsaW5rIGJ1aWxkU2VydmljZUNvbW1hbmR9IGluc3RlYWQgb2YgZGVmaW5pbmdcbiAqIHBhY2thZ2UtbG9jYWwgaW5zdGFsbC9zdGFydC9zdG9wL3N0YXR1cyBjb21tYW5kcyB3aXRoIGRpdmVyZ2VudCBiZWhhdmlvci5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB0eXBlIHsgQ2xpU2VydmljZURlZmluaXRpb24gfSBmcm9tIFwiLi9kZWZpbml0aW9uLnRzXCI7XG5pbXBvcnQgeyBDbGlTZXJ2aWNlLCB0eXBlIENsaVNlcnZpY2VMaWZlY3ljbGUgfSBmcm9tIFwiLi9zZXJ2aWNlLnRzXCI7XG5cbi8qKiBTdGF0aWMgZGVmaW5pdGlvbiBvciBhY3Rpb24tdGltZSBmYWN0b3J5IHVzZWQgYnkgYSBzZXJ2aWNlIGNvbW1hbmQgZ3JvdXAuICovXG5leHBvcnQgdHlwZSBDbGlTZXJ2aWNlRGVmaW5pdGlvblNvdXJjZSA9IENsaVNlcnZpY2VEZWZpbml0aW9uIHwgKCgpID0+IENsaVNlcnZpY2VEZWZpbml0aW9uKTtcblxuLyoqIEluamVjdGFibGUgbGlmZWN5Y2xlIGFuZCBvdXRwdXQgYm91bmRhcnkgZm9yIHNlcnZpY2UgQ0xJIHRlc3RzIGFuZCBjb21wb3NpdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpU2VydmljZUNsaURlcGVuZGVuY2llcyB7XG4gIC8qKiBDb25zdHJ1Y3QgdGhlIGxpZmVjeWNsZSBtYW5hZ2VyIHVzZWQgYnkgY29tbWFuZCBhY3Rpb25zLiAqL1xuICBjcmVhdGUoZGVmaW5pdGlvbjogQ2xpU2VydmljZURlZmluaXRpb24pOiBDbGlTZXJ2aWNlTGlmZWN5Y2xlO1xuICAvKiogV3JpdGUgdGhlIEpTT04gcmVzdWx0IG9mIHRoZSBzdGF0dXMgY29tbWFuZC4gKi9cbiAgd3JpdGUodmFsdWU6IHN0cmluZyk6IHZvaWQ7XG59XG5cbmNvbnN0IERFRkFVTFRfREVQRU5ERU5DSUVTOiBDbGlTZXJ2aWNlQ2xpRGVwZW5kZW5jaWVzID0ge1xuICBjcmVhdGU6IChkZWZpbml0aW9uKSA9PiBuZXcgQ2xpU2VydmljZShkZWZpbml0aW9uKSxcbiAgd3JpdGU6ICh2YWx1ZSkgPT4gcHJvY2Vzcy5zdGRvdXQud3JpdGUodmFsdWUpLFxufTtcblxuZXhwb3J0IGNvbnN0IENsaVNlcnZpY2VJbnN0YWxsT3B0aW9uc1NjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgc3RhcnQ6IHouYm9vbGVhbigpLmRlZmF1bHQodHJ1ZSkuZGVzY3JpYmUoXCJTdGFydCB0aGUgc2VydmljZSBhZnRlciBpbnN0YWxsYXRpb24uXCIpLFxuICB9KVxuICAuc3RyaWN0KClcbiAgLmRlc2NyaWJlKFwiT3B0aW9ucyBmb3IgaW5zdGFsbGluZyBhIGN1cnJlbnQtdXNlciBDTEkgc2VydmljZS5cIik7XG5cbmV4cG9ydCB0eXBlIENsaVNlcnZpY2VJbnN0YWxsT3B0aW9ucyA9IHoub3V0cHV0PHR5cGVvZiBDbGlTZXJ2aWNlSW5zdGFsbE9wdGlvbnNTY2hlbWE+O1xuXG4vKiogQnVpbGQgaW5zdGFsbCwgc3RhcnQsIHN0b3AsIHJlc3RhcnQsIHN0YXR1cywgYW5kIHVuaW5zdGFsbCBjb21tYW5kcyBmb3IgYSBzZXJ2aWNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2VydmljZUNvbW1hbmQoXG4gIHNvdXJjZTogQ2xpU2VydmljZURlZmluaXRpb25Tb3VyY2UsXG4gIGRlcGVuZGVuY2llczogQ2xpU2VydmljZUNsaURlcGVuZGVuY2llcyA9IERFRkFVTFRfREVQRU5ERU5DSUVTLFxuKTogQ29tbWFuZCB7XG4gIGNvbnN0IGRlZmluaXRpb24gPSByZXNvbHZlRGVmaW5pdGlvbihzb3VyY2UpO1xuICBjb25zdCBzZXJ2aWNlID0gKCkgPT4gZGVwZW5kZW5jaWVzLmNyZWF0ZShkZWZpbml0aW9uKCkpO1xuICBjb25zdCBjb21tYW5kID0gbmV3IENvbW1hbmQoXCJzZXJ2aWNlXCIpLmRlc2NyaXB0aW9uKFxuICAgIHR5cGVvZiBzb3VyY2UgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBcIkluc3RhbGwgYW5kIG1hbmFnZSB0aGUgZGVza3RvcCBzZXJ2aWNlXCJcbiAgICAgIDogYEluc3RhbGwgYW5kIG1hbmFnZSB0aGUgJHtzb3VyY2UubmFtZX0gZGVza3RvcCBzZXJ2aWNlYCxcbiAgKTtcblxuICBjb25zdCBpbnN0YWxsID0gY29tbWFuZFxuICAgIC5jb21tYW5kKFwiaW5zdGFsbFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkluc3RhbGwgdGhlIHNlcnZpY2UgZm9yIHRoZSBjdXJyZW50IHVzZXIgYW5kIHN0YXJ0IGl0XCIpXG4gICAgLm9wdGlvbihcIi0tbm8tc3RhcnRcIiwgXCJEbyBub3Qgc3RhcnQgdGhlIHNlcnZpY2UgYWZ0ZXIgaW5zdGFsbGF0aW9uXCIpO1xuICBpbnN0YWxsLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IENsaVNlcnZpY2VJbnN0YWxsT3B0aW9uc1NjaGVtYS5wYXJzZSh7XG4gICAgICBzdGFydDogaW5zdGFsbC5nZXRPcHRpb25WYWx1ZShcInN0YXJ0XCIpLFxuICAgIH0pO1xuICAgIGF3YWl0IHNlcnZpY2UoKS5pbnN0YWxsKHsgc3RhcnQ6IG9wdGlvbnMuc3RhcnQgfSk7XG4gIH0pO1xuXG4gIGNvbW1hbmRcbiAgICAuY29tbWFuZChcInN0YXJ0XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiU3RhcnQgdGhlIGluc3RhbGxlZCBzZXJ2aWNlXCIpXG4gICAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBzZXJ2aWNlKCkuc3RhcnQoKTtcbiAgICB9KTtcblxuICBjb21tYW5kXG4gICAgLmNvbW1hbmQoXCJzdG9wXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiU3RvcCB0aGUgcnVubmluZyBzZXJ2aWNlXCIpXG4gICAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBzZXJ2aWNlKCkuc3RvcCgpO1xuICAgIH0pO1xuXG4gIGNvbW1hbmRcbiAgICAuY29tbWFuZChcInJlc3RhcnRcIilcbiAgICAuZGVzY3JpcHRpb24oXCJSZXN0YXJ0IHRoZSBpbnN0YWxsZWQgc2VydmljZVwiKVxuICAgIC5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgc2VydmljZSgpLnJlc3RhcnQoKTtcbiAgICB9KTtcblxuICBjb21tYW5kXG4gICAgLmNvbW1hbmQoXCJzdGF0dXNcIilcbiAgICAuZGVzY3JpcHRpb24oXCJQcmludCBzZXJ2aWNlIGluc3RhbGxhdGlvbiBhbmQgcHJvY2VzcyBzdGF0ZSBhcyBKU09OXCIpXG4gICAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBkZXBlbmRlbmNpZXMud3JpdGUoYCR7SlNPTi5zdHJpbmdpZnkoYXdhaXQgc2VydmljZSgpLnN0YXR1cygpLCBudWxsLCAyKX1cXG5gKTtcbiAgICB9KTtcblxuICBjb21tYW5kXG4gICAgLmNvbW1hbmQoXCJ1bmluc3RhbGxcIilcbiAgICAuZGVzY3JpcHRpb24oXCJTdG9wIGFuZCByZW1vdmUgdGhlIHNlcnZpY2UgZm9yIHRoZSBjdXJyZW50IHVzZXJcIilcbiAgICAuYWN0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHNlcnZpY2UoKS51bmluc3RhbGwoKTtcbiAgICB9KTtcblxuICByZXR1cm4gY29tbWFuZDtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZURlZmluaXRpb24oc291cmNlOiBDbGlTZXJ2aWNlRGVmaW5pdGlvblNvdXJjZSk6ICgpID0+IENsaVNlcnZpY2VEZWZpbml0aW9uIHtcbiAgcmV0dXJuIHR5cGVvZiBzb3VyY2UgPT09IFwiZnVuY3Rpb25cIiA/IHNvdXJjZSA6ICgpID0+IHNvdXJjZTtcbn1cbiJdfQ==
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUgsT0FBTyxLQUFLLElBQUksTUFBTSxzQkFBc0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFHeEIsT0FBTyxFQUFFLFVBQVUsRUFBNEIsTUFBTSxjQUFjLENBQUM7QUFlcEUsTUFBTSxvQkFBb0IsR0FBRztJQUMzQixNQUFNLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQztJQUNsRCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUM3QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQWUsRUFBRSxVQUE2QixFQUFFLEVBQUU7UUFDaEUsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0NBQ2tDLENBQUM7QUFFdEMsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsQ0FBQztLQUM1QyxNQUFNLENBQUM7SUFDTixLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsdUNBQXVDLENBQUM7SUFDbEYsYUFBYSxFQUFFLENBQUM7U0FDYixNQUFNLEVBQUU7U0FDUixHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ04sUUFBUSxFQUFFO1NBQ1YsUUFBUSxDQUFDLGlFQUFpRSxDQUFDO0lBQzlFLE9BQU8sRUFBRSxDQUFDO1NBQ1AsT0FBTyxFQUFFO1NBQ1QsT0FBTyxDQUFD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QUFDO1NBQ25FLFFBQVEsQ0FBQyxjQUFjLEVBQUUsMERBQTBELENBQUM7U0FDcEYsa0JBQWtCLEVBQUU7U0FDcEIsa0JBQWtCLEVBQUU7U0FDcEIsb0JBQW9CLEVBQUU7U0FDdEIsTUFBTSxDQUFDLEtBQUssRUFBRSxnQkFBMEIsRUFBRSxFQUFFO1FBQzNDLE1BQU0sT0FBTyxHQUFHLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BDLElBQUksZ0JBQWdCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2xDLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLElBQUksQ0FBQyxDQUFDO1lBQ25DLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxDQUFDLFVBQVUsRUFBRSxHQUFHLFVBQVUsQ0FBQyxHQUFHLGdCQUFnQixDQUFDO1FBQ3JELE1BQU0sT0FBTyxDQUFDLFVBQVcsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDdkQsQ0FBQyxDQUFDLENBQUM7SUFFTCxPQUFPO1NBQ0osT0FBTyxDQUFDLFdBQVcsQ0FBQztTQUNwQixXQUFXLENBQUMsa0RBQWtELENBQUM7U0FDL0QsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ2pCLE1BQU0sT0FBTyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDOUIsQ0FBQyxDQUFDLENBQUM7SUFFTCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxNQUFrQztJQUMzRCxPQUFPLE9BQU8sTUFBTSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUM7QUFDOUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29tbWFuZGVyIGNvbW1hbmQgZ3JvdXAgZm9yIHRoZSBzaGFyZWQgc3lzdGVtLXRyYXkgc2VydmljZSBsaWZlY3ljbGUuXG4gKlxuICogQ29uc3VtaW5nIENMSXMgc2hvdWxkIG1vdW50IHtAbGluayBidWlsZFNlcnZpY2VDb21tYW5kfSBpbnN0ZWFkIG9mIGRlZmluaW5nXG4gKiBwYWNrYWdlLWxvY2FsIGluc3RhbGwvc3RhcnQvc3RvcC9zdGF0dXMgY29tbWFuZHMgd2l0aCBkaXZlcmdlbnQgYmVoYXZpb3IuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCAqIGFzIGV4ZWMgZnJvbSBcIkBkYngtdG9vbHMvY29yZS9leGVjXCI7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHR5cGUgeyBDbGlTZXJ2aWNlRGVmaW5pdGlvbiB9IGZyb20gXCIuL2RlZmluaXRpb24udHNcIjtcbmltcG9ydCB7IENsaVNlcnZpY2UsIHR5cGUgQ2xpU2VydmljZUxpZmVjeWNsZSB9IGZyb20gXCIuL3NlcnZpY2UudHNcIjtcblxuLyoqIFN0YXRpYyBkZWZpbml0aW9uIG9yIGFjdGlvbi10aW1lIGZhY3RvcnkgdXNlZCBieSBhIHNlcnZpY2UgY29tbWFuZCBncm91cC4gKi9cbmV4cG9ydCB0eXBlIENsaVNlcnZpY2VEZWZpbml0aW9uU291cmNlID0gQ2xpU2VydmljZURlZmluaXRpb24gfCAoKCkgPT4gQ2xpU2VydmljZURlZmluaXRpb24pO1xuXG4vKiogSW5qZWN0YWJsZSBsaWZlY3ljbGUgYW5kIG91dHB1dCBib3VuZGFyeSBmb3Igc2VydmljZSBDTEkgdGVzdHMgYW5kIGNvbXBvc2l0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGlTZXJ2aWNlQ2xpRGVwZW5kZW5jaWVzIHtcbiAgLyoqIENvbnN0cnVjdCB0aGUgbGlmZWN5Y2xlIG1hbmFnZXIgdXNlZCBieSBjb21tYW5kIGFjdGlvbnMuICovXG4gIGNyZWF0ZShkZWZpbml0aW9uOiBDbGlTZXJ2aWNlRGVmaW5pdGlvbik6IENsaVNlcnZpY2VMaWZlY3ljbGU7XG4gIC8qKiBXcml0ZSB0aGUgSlNPTiByZXN1bHQgb2YgdGhlIHN0YXR1cyBjb21tYW5kLiAqL1xuICB3cml0ZSh2YWx1ZTogc3RyaW5nKTogdm9pZDtcbiAgLyoqIFJ1biBhIGNhbGxlci1zdXBwbGllZCBjb21tYW5kIHdpdGggaW5oZXJpdGVkIHRlcm1pbmFsIGlucHV0IGFuZCBvdXRwdXQuICovXG4gIHJlYWRvbmx5IGV4ZWN1dGU/OiAoY29tbWFuZDogc3RyaW5nLCBhcmd1bWVudHNfOiByZWFkb25seSBzdHJpbmdbXSkgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuY29uc3QgREVGQVVMVF9ERVBFTkRFTkNJRVMgPSB7XG4gIGNyZWF0ZTogKGRlZmluaXRpb24pID0+IG5ldyBDbGlTZXJ2aWNlKGRlZmluaXRpb24pLFxuICB3cml0ZTogKHZhbHVlKSA9PiBwcm9jZXNzLnN0ZG91dC53cml0ZSh2YWx1ZSksXG4gIGV4ZWN1dGU6IGFzeW5jIChjb21tYW5kOiBzdHJpbmcsIGFyZ3VtZW50c186IHJlYWRvbmx5IHN0cmluZ1tdKSA9PiB7XG4gICAgYXdhaXQgZXhlYy5zcGF3bihjb21tYW5kLCBhcmd1bWVudHNfLCB7IGNoZWNrOiB0cnVlIH0pO1xuICB9LFxufSBzYXRpc2ZpZXMgQ2xpU2VydmljZUNsaURlcGVuZGVuY2llcztcblxuZXhwb3J0IGNvbnN0IENsaVNlcnZpY2VJbnN0YWxsT3B0aW9uc1NjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgc3RhcnQ6IHouYm9vbGVhbigpLmRlZmF1bHQodHJ1ZSkuZGVzY3JpYmUoXCJTdGFydCB0aGUgc2VydmljZSBhZnRlciBpbnN0YWxsYXRpb24uXCIpLFxuICAgIHB5dGhvblByb2plY3Q6IHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLm1pbigxKVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcIkxvY2FsIFB5dGhvbiBwcm9qZWN0IGluc3RhbGxlZCBpbnN0ZWFkIG9mIHRoZSByZWdpc3RyeSBwYWNrYWdlLlwiKSxcbiAgICBvZmZsaW5lOiB6XG4gICAgICAuYm9vbGVhbigpXG4gICAgICAuZGVmYXVsdChmYWxzZSlcbiAgICAgIC5kZXNjcmliZShcIkluc3RhbGwgUHl0aG9uIHBhY2thZ2VzIGZyb20gdGhlIHV2IGNhY2hlIHdpdGhvdXQgbmV0d29yayBhY2Nlc3MuXCIpLFxuICB9KVxuICAuc3RyaWN0KClcbiAgLmRlc2NyaWJlKFwiT3B0aW9ucyBmb3IgaW5zdGFsbGluZyBhIGN1cnJlbnQtdXNlciBDTEkgc2VydmljZS5cIik7XG5cbmV4cG9ydCB0eXBlIENsaVNlcnZpY2VJbnN0YWxsT3B0aW9ucyA9IHoub3V0cHV0PHR5cGVvZiBDbGlTZXJ2aWNlSW5zdGFsbE9wdGlvbnNTY2hlbWE+O1xuXG4vKiogQnVpbGQgaW5zdGFsbCwgc3RhcnQsIHN0b3AsIHJlc3RhcnQsIHN0YXR1cywgbG9ncywgYW5kIHVuaW5zdGFsbCBjb21tYW5kcyBmb3IgYSBzZXJ2aWNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2VydmljZUNvbW1hbmQoXG4gIHNvdXJjZTogQ2xpU2VydmljZURlZmluaXRpb25Tb3VyY2UsXG4gIGRlcGVuZGVuY2llczogQ2xpU2VydmljZUNsaURlcGVuZGVuY2llcyA9IERFRkFVTFRfREVQRU5ERU5DSUVTLFxuKTogQ29tbWFuZCB7XG4gIGNvbnN0IGRlZmluaXRpb24gPSByZXNvbHZlRGVmaW5pdGlvbihzb3VyY2UpO1xuICBjb25zdCBzZXJ2aWNlID0gKCkgPT4gZGVwZW5kZW5jaWVzLmNyZWF0ZShkZWZpbml0aW9uKCkpO1xuICBjb25zdCBleGVjdXRlID0gZGVwZW5kZW5jaWVzLmV4ZWN1dGUgPz8gREVGQVVMVF9ERVBFTkRFTkNJRVMuZXhlY3V0ZTtcbiAgY29uc3QgY29tbWFuZCA9IG5ldyBDb21tYW5kKFwic2VydmljZVwiKVxuICAgIC5lbmFibGVQb3NpdGlvbmFsT3B0aW9ucygpXG4gICAgLmRlc2NyaXB0aW9uKFxuICAgICAgdHlwZW9mIHNvdXJjZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gXCJJbnN0YWxsIGFuZCBtYW5hZ2UgdGhlIGRlc2t0b3Agc2VydmljZVwiXG4gICAgICAgIDogYEluc3RhbGwgYW5kIG1hbmFnZSB0aGUgJHtzb3VyY2UubmFtZX0gZGVza3RvcCBzZXJ2aWNlYCxcbiAgICApO1xuXG4gIGNvbnN0IGluc3RhbGwgPSBjb21tYW5kXG4gICAgLmNvbW1hbmQoXCJpbnN0YWxsXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiSW5zdGFsbCB0aGUgc2VydmljZSBmb3IgdGhlIGN1cnJlbnQgdXNlciBhbmQgc3RhcnQgaXRcIilcbiAgICAub3B0aW9uKFwiLS1uby1zdGFydFwiLCBcIkRvIG5vdCBzdGFydCB0aGUgc2VydmljZSBhZnRlciBpbnN0YWxsYXRpb25cIilcbiAgICAub3B0aW9uKFxuICAgICAgXCItLXB5dGhvbi1wcm9qZWN0IDxwYXRoPlwiLFxuICAgICAgXCJJbnN0YWxsIGEgbG9jYWwgUHl0aG9uIHByb2plY3QgaW5zdGVhZCBvZiB0aGUgcmVnaXN0cnkgcGFja2FnZVwiLFxuICAgIClcbiAgICAub3B0aW9uKFwiLS1vZmZsaW5lXCIsIFwiSW5zdGFsbCBQeXRob24gcGFja2FnZXMgZnJvbSB0aGUgdXYgY2FjaGUgd2l0aG91dCBuZXR3b3JrIGFjY2Vzc1wiKTtcbiAgaW5zdGFsbC5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBDbGlTZXJ2aWNlSW5zdGFsbE9wdGlvbnNTY2hlbWEucGFyc2Uoe1xuICAgICAgc3RhcnQ6IGluc3RhbGwuZ2V0T3B0aW9uVmFsdWUoXCJzdGFydFwiKSxcbiAgICAgIHB5dGhvblByb2plY3Q6IGluc3RhbGwuZ2V0T3B0aW9uVmFsdWUoXCJweXRob25Qcm9qZWN0XCIpLFxuICAgICAgb2ZmbGluZTogaW5zdGFsbC5nZXRPcHRpb25WYWx1ZShcIm9mZmxpbmVcIiksXG4gICAgfSk7XG4gICAgYXdhaXQgc2VydmljZSgpLmluc3RhbGwob3B0aW9ucyk7XG4gIH0pO1xuXG4gIGNvbW1hbmRcbiAgICAuY29tbWFuZChcInN0YXJ0XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiU3RhcnQgdGhlIGluc3RhbGxlZCBzZXJ2aWNlXCIpXG4gICAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBzZXJ2aWNlKCkuc3RhcnQoKTtcbiAgICB9KTtcblxuICBjb21tYW5kXG4gICAgLmNvbW1hbmQoXCJzdG9wXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiU3RvcCB0aGUgcnVubmluZyBzZXJ2aWNlXCIpXG4gICAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBzZXJ2aWNlKCkuc3RvcCgpO1xuICAgIH0pO1xuXG4gIGNvbW1hbmRcbiAgICAuY29tbWFuZChcInJlc3RhcnRcIilcbiAgICAuZGVzY3JpcHRpb24oXCJSZXN0YXJ0IHRoZSBpbnN0YWxsZWQgc2VydmljZVwiKVxuICAgIC5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgc2VydmljZSgpLnJlc3RhcnQoKTtcbiAgICB9KTtcblxuICBjb21tYW5kXG4gICAgLmNvbW1hbmQoXCJzdGF0dXNcIilcbiAgICAuZGVzY3JpcHRpb24oXCJQcmludCBzZXJ2aWNlIGluc3RhbGxhdGlvbiBhbmQgcHJvY2VzcyBzdGF0ZSBhcyBKU09OXCIpXG4gICAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBkZXBlbmRlbmNpZXMud3JpdGUoYCR7SlNPTi5zdHJpbmdpZnkoYXdhaXQgc2VydmljZSgpLnN0YXR1cygpLCBudWxsLCAyKX1cXG5gKTtcbiAgICB9KTtcblxuICBjb21tYW5kXG4gICAgLmNvbW1hbmQoXCJsb2dzXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiUHJpbnQgdGhlIHNlcnZpY2UgbG9nIHBhdGggb3IgYXBwZW5kIGl0IHRvIGEgY29tbWFuZFwiKVxuICAgIC5hcmd1bWVudChcIltjb21tYW5kLi4uXVwiLCBcIkNvbW1hbmQgYW5kIGFyZ3VtZW50cyB0byBydW4gYmVmb3JlIHRoZSBzZXJ2aWNlIGxvZyBwYXRoXCIpXG4gICAgLmFsbG93VW5rbm93bk9wdGlvbigpXG4gICAgLnBhc3NUaHJvdWdoT3B0aW9ucygpXG4gICAgLmFsbG93RXhjZXNzQXJndW1lbnRzKClcbiAgICAuYWN0aW9uKGFzeW5jIChjb21tYW5kQXJndW1lbnRzOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgY29uc3QgbG9nUGF0aCA9IHNlcnZpY2UoKS5sb2dQYXRoKCk7XG4gICAgICBpZiAoY29tbWFuZEFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVwZW5kZW5jaWVzLndyaXRlKGAke2xvZ1BhdGh9XFxuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IFtleGVjdXRhYmxlLCAuLi5hcmd1bWVudHNfXSA9IGNvbW1hbmRBcmd1bWVudHM7XG4gICAgICBhd2FpdCBleGVjdXRlKGV4ZWN1dGFibGUhLCBbLi4uYXJndW1lbnRzXywgbG9nUGF0aF0pO1xuICAgIH0pO1xuXG4gIGNvbW1hbmRcbiAgICAuY29tbWFuZChcInVuaW5zdGFsbFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIlN0b3AgYW5kIHJlbW92ZSB0aGUgc2VydmljZSBmb3IgdGhlIGN1cnJlbnQgdXNlclwiKVxuICAgIC5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgc2VydmljZSgpLnVuaW5zdGFsbCgpO1xuICAgIH0pO1xuXG4gIHJldHVybiBjb21tYW5kO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRGVmaW5pdGlvbihzb3VyY2U6IENsaVNlcnZpY2VEZWZpbml0aW9uU291cmNlKTogKCkgPT4gQ2xpU2VydmljZURlZmluaXRpb24ge1xuICByZXR1cm4gdHlwZW9mIHNvdXJjZSA9PT0gXCJmdW5jdGlvblwiID8gc291cmNlIDogKCkgPT4gc291cmNlO1xufVxuIl19
package/lib/src/icon.d.ts CHANGED
@@ -1,2 +1,4 @@
1
- /** Return the dbx-tools service glyph as a systray2 PNG or Windows ICO payload. */
2
- export declare function serviceTrayIcon(platform?: NodeJS.Platform): string;
1
+ /** Plain glyphs available to identify dbx-tools system-tray services. */
2
+ export type ServiceTrayGlyph = "model-proxy" | "graphiti" | "lakebase";
3
+ /** Return a service glyph as a systray2 PNG or Windows ICO payload. */
4
+ export declare function serviceTrayIcon(glyph?: ServiceTrayGlyph, platform?: NodeJS.Platform): string;
package/lib/src/icon.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { deflateSync } from "node:zlib";
2
2
  const SIZE = 32;
3
- const RECTANGLES = [
3
+ const MODEL_PROXY_RECTANGLES = [
4
4
  [4, 13, 6, 6],
5
5
  [24, 4, 6, 6],
6
6
  [24, 13, 6, 6],
@@ -11,26 +11,73 @@ const RECTANGLES = [
11
11
  [18, 15, 6, 2],
12
12
  [18, 24, 6, 2],
13
13
  ];
14
- /** Return the dbx-tools service glyph as a systray2 PNG or Windows ICO payload. */
15
- export function serviceTrayIcon(platform = process.platform) {
14
+ const GRAPHITI_BOLT_RECTANGLES = [
15
+ [10, 5, 10, 2],
16
+ [17, 7, 2, 2],
17
+ [15, 9, 7, 2],
18
+ ];
19
+ /** Return a service glyph as a systray2 PNG or Windows ICO payload. */
20
+ export function serviceTrayIcon(glyph = "model-proxy", platform = process.platform) {
16
21
  const color = platform === "darwin"
17
22
  ? [0x00, 0x00, 0x00, 0xff]
18
23
  : [0xff, 0x36, 0x21, 0xff];
19
- const png = encodePng(renderGlyph(color));
24
+ const png = encodePng(renderGlyph(glyph, color));
20
25
  return (platform === "win32" ? encodeIco(png) : png).toString("base64");
21
26
  }
22
- function renderGlyph(color) {
27
+ function renderGlyph(glyph, color) {
23
28
  const rgba = Buffer.alloc(SIZE * SIZE * 4);
24
29
  for (let y = 0; y < SIZE; y += 1) {
25
30
  for (let x = 0; x < SIZE; x += 1) {
26
- if (!RECTANGLES.some(([left, top, width, height]) => x >= left && x < left + width && y >= top && y < top + height)) {
31
+ const opacity = glyphOpacity(glyph, x, y);
32
+ if (opacity === 0)
27
33
  continue;
28
- }
29
- rgba.set(color, (y * SIZE + x) * 4);
34
+ rgba.set([color[0], color[1], color[2], Math.round(color[3] * opacity)], (y * SIZE + x) * 4);
30
35
  }
31
36
  }
32
37
  return rgba;
33
38
  }
39
+ function glyphOpacity(glyph, x, y) {
40
+ switch (glyph) {
41
+ case "model-proxy":
42
+ return modelProxyGlyphContains(x, y) ? 1 : 0;
43
+ case "graphiti":
44
+ return graphitiGlyphContains(x, y) ? 1 : 0;
45
+ case "lakebase":
46
+ return lakebaseGlyphOpacity(x, y);
47
+ }
48
+ }
49
+ function modelProxyGlyphContains(x, y) {
50
+ return MODEL_PROXY_RECTANGLES.some(([left, top, width, height]) => x >= left && x < left + width && y >= top && y < top + height);
51
+ }
52
+ function graphitiGlyphContains(x, y) {
53
+ // Preserve the Graphiti bot mark through its bolt, antennae, outlined head, and ringed eyes.
54
+ const bolt = GRAPHITI_BOLT_RECTANGLES.some(([left, top, width, height]) => x >= left && x < left + width && y >= top && y < top + height);
55
+ const head = (y >= 10 && y < 13 && x >= 6 && x < 26) ||
56
+ (y >= 13 && y < 25 && x >= 4 && x < 7) ||
57
+ (y >= 13 && y < 25 && x >= 25 && x < 28) ||
58
+ (y >= 24 && y < 27 && x >= 6 && x < 26);
59
+ const antenna = y >= 3 &&
60
+ y < 11 &&
61
+ ((x >= 7 && x < 9) || (x >= 23 && x < 25));
62
+ return bolt || head || antenna || graphitiEyeContains(x, y, 11) || graphitiEyeContains(x, y, 21);
63
+ }
64
+ function graphitiEyeContains(x, y, centerX) {
65
+ const distance = (x - centerX) ** 2 + (y - 18) ** 2;
66
+ return distance >= 10 && distance <= 25;
67
+ }
68
+ function lakebaseGlyphOpacity(x, y) {
69
+ if (x < 5 || x >= 27)
70
+ return 0;
71
+ if (y >= 5 && y < 11)
72
+ return 0.45;
73
+ // Keep the official mark's light middle band, dark wave channel, and solid lower band.
74
+ const middleBoundary = 19 - Math.round(Math.sin(((x - 5) / 21) * Math.PI * 2));
75
+ if (y >= 13 && y < middleBoundary)
76
+ return 0.45;
77
+ if (y >= middleBoundary + 3 && y < 27)
78
+ return 1;
79
+ return 0;
80
+ }
34
81
  function encodePng(rgba) {
35
82
  const header = Buffer.alloc(13);
36
83
  header.writeUInt32BE(SIZE, 0);
@@ -81,4 +128,4 @@ function encodeIco(png) {
81
128
  header.writeUInt32LE(header.length, 18);
82
129
  return Buffer.concat([header, png]);
83
130
  }
84
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pY29uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFeEMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ2hCLE1BQU0sVUFBVSxHQUFHO0lBQ2pCLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDYixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNkLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2QsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDZCxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUNkLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDZCxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztDQUNOLENBQUM7QUFFWCxtRkFBbUY7QUFDbkYsTUFBTSxVQUFVLGVBQWUsQ0FBQyxXQUE0QixPQUFPLENBQUMsUUFBUTtJQUMxRSxNQUFNLEtBQUssR0FDVCxRQUFRLEtBQUssUUFBUTtRQUNuQixDQUFDLENBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQVc7UUFDckMsQ0FBQyxDQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFXLENBQUM7SUFDMUMsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzFDLE9BQU8sQ0FBQyxRQUFRLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsS0FBZ0Q7SUFDbkUsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2pDLElBQ0UsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUNkLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQzdCLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxLQUFLLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FDaEUsRUFDRCxDQUFDO2dCQUNELFNBQVM7WUFDWCxDQUFDO1lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsSUFBWTtJQUM3QixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlCLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRWQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDdEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDakMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNsQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDbkIsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM3RCxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztRQUN4QixRQUFRLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4QyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDbEMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFDLElBQVksRUFBRSxJQUFZO0lBQzFDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEIsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6RSxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFTLEtBQUssQ0FBQyxJQUFZO0lBQ3pCLElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQztJQUN2QixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3hCLEtBQUssSUFBSSxJQUFJLENBQUM7UUFDZCxLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNwQyxLQUFLLEdBQUcsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDcEMsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLEdBQVc7SUFDNUIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzQixNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ2pCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDakIsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDNUIsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDN0IsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN4QyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVmbGF0ZVN5bmMgfSBmcm9tIFwibm9kZTp6bGliXCI7XG5cbmNvbnN0IFNJWkUgPSAzMjtcbmNvbnN0IFJFQ1RBTkdMRVMgPSBbXG4gIFs0LCAxMywgNiwgNl0sXG4gIFsyNCwgNCwgNiwgNl0sXG4gIFsyNCwgMTMsIDYsIDZdLFxuICBbMjQsIDIyLCA2LCA2XSxcbiAgWzEwLCAxNSwgNiwgMl0sXG4gIFsxNiwgNiwgMiwgMjBdLFxuICBbMTgsIDYsIDYsIDJdLFxuICBbMTgsIDE1LCA2LCAyXSxcbiAgWzE4LCAyNCwgNiwgMl0sXG5dIGFzIGNvbnN0O1xuXG4vKiogUmV0dXJuIHRoZSBkYngtdG9vbHMgc2VydmljZSBnbHlwaCBhcyBhIHN5c3RyYXkyIFBORyBvciBXaW5kb3dzIElDTyBwYXlsb2FkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZpY2VUcmF5SWNvbihwbGF0Zm9ybTogTm9kZUpTLlBsYXRmb3JtID0gcHJvY2Vzcy5wbGF0Zm9ybSk6IHN0cmluZyB7XG4gIGNvbnN0IGNvbG9yID1cbiAgICBwbGF0Zm9ybSA9PT0gXCJkYXJ3aW5cIlxuICAgICAgPyAoWzB4MDAsIDB4MDAsIDB4MDAsIDB4ZmZdIGFzIGNvbnN0KVxuICAgICAgOiAoWzB4ZmYsIDB4MzYsIDB4MjEsIDB4ZmZdIGFzIGNvbnN0KTtcbiAgY29uc3QgcG5nID0gZW5jb2RlUG5nKHJlbmRlckdseXBoKGNvbG9yKSk7XG4gIHJldHVybiAocGxhdGZvcm0gPT09IFwid2luMzJcIiA/IGVuY29kZUljbyhwbmcpIDogcG5nKS50b1N0cmluZyhcImJhc2U2NFwiKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyR2x5cGgoY29sb3I6IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdKTogQnVmZmVyIHtcbiAgY29uc3QgcmdiYSA9IEJ1ZmZlci5hbGxvYyhTSVpFICogU0laRSAqIDQpO1xuICBmb3IgKGxldCB5ID0gMDsgeSA8IFNJWkU7IHkgKz0gMSkge1xuICAgIGZvciAobGV0IHggPSAwOyB4IDwgU0laRTsgeCArPSAxKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFSRUNUQU5HTEVTLnNvbWUoXG4gICAgICAgICAgKFtsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHRdKSA9PlxuICAgICAgICAgICAgeCA+PSBsZWZ0ICYmIHggPCBsZWZ0ICsgd2lkdGggJiYgeSA+PSB0b3AgJiYgeSA8IHRvcCArIGhlaWdodCxcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmdiYS5zZXQoY29sb3IsICh5ICogU0laRSArIHgpICogNCk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZ2JhO1xufVxuXG5mdW5jdGlvbiBlbmNvZGVQbmcocmdiYTogQnVmZmVyKTogQnVmZmVyIHtcbiAgY29uc3QgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDEzKTtcbiAgaGVhZGVyLndyaXRlVUludDMyQkUoU0laRSwgMCk7XG4gIGhlYWRlci53cml0ZVVJbnQzMkJFKFNJWkUsIDQpO1xuICBoZWFkZXJbOF0gPSA4O1xuICBoZWFkZXJbOV0gPSA2O1xuXG4gIGNvbnN0IHNjYW5saW5lcyA9IEJ1ZmZlci5hbGxvYygoU0laRSAqIDQgKyAxKSAqIFNJWkUpO1xuICBmb3IgKGxldCB5ID0gMDsgeSA8IFNJWkU7IHkgKz0gMSkge1xuICAgIGNvbnN0IG9mZnNldCA9IHkgKiAoU0laRSAqIDQgKyAxKTtcbiAgICBzY2FubGluZXNbb2Zmc2V0XSA9IDA7XG4gICAgcmdiYS5jb3B5KHNjYW5saW5lcywgb2Zmc2V0ICsgMSwgeSAqIFNJWkUgKiA0LCAoeSArIDEpICogU0laRSAqIDQpO1xuICB9XG5cbiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW1xuICAgIEJ1ZmZlci5mcm9tKFsweDg5LCAweDUwLCAweDRlLCAweDQ3LCAweDBkLCAweDBhLCAweDFhLCAweDBhXSksXG4gICAgcG5nQ2h1bmsoXCJJSERSXCIsIGhlYWRlciksXG4gICAgcG5nQ2h1bmsoXCJJREFUXCIsIGRlZmxhdGVTeW5jKHNjYW5saW5lcykpLFxuICAgIHBuZ0NodW5rKFwiSUVORFwiLCBCdWZmZXIuYWxsb2MoMCkpLFxuICBdKTtcbn1cblxuZnVuY3Rpb24gcG5nQ2h1bmsodHlwZTogc3RyaW5nLCBkYXRhOiBCdWZmZXIpOiBCdWZmZXIge1xuICBjb25zdCBuYW1lID0gQnVmZmVyLmZyb20odHlwZSwgXCJhc2NpaVwiKTtcbiAgY29uc3QgY2h1bmsgPSBCdWZmZXIuYWxsb2MoMTIgKyBkYXRhLmxlbmd0aCk7XG4gIGNodW5rLndyaXRlVUludDMyQkUoZGF0YS5sZW5ndGgsIDApO1xuICBuYW1lLmNvcHkoY2h1bmssIDQpO1xuICBkYXRhLmNvcHkoY2h1bmssIDgpO1xuICBjaHVuay53cml0ZVVJbnQzMkJFKGNyYzMyKEJ1ZmZlci5jb25jYXQoW25hbWUsIGRhdGFdKSksIDggKyBkYXRhLmxlbmd0aCk7XG4gIHJldHVybiBjaHVuaztcbn1cblxuZnVuY3Rpb24gY3JjMzIoZGF0YTogQnVmZmVyKTogbnVtYmVyIHtcbiAgbGV0IHZhbHVlID0gMHhmZmZmZmZmZjtcbiAgZm9yIChjb25zdCBieXRlIG9mIGRhdGEpIHtcbiAgICB2YWx1ZSBePSBieXRlO1xuICAgIGZvciAobGV0IGJpdCA9IDA7IGJpdCA8IDg7IGJpdCArPSAxKSB7XG4gICAgICB2YWx1ZSA9ICh2YWx1ZSA+Pj4gMSkgXiAodmFsdWUgJiAxID8gMHhlZGI4ODMyMCA6IDApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gKHZhbHVlIF4gMHhmZmZmZmZmZikgPj4+IDA7XG59XG5cbmZ1bmN0aW9uIGVuY29kZUljbyhwbmc6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gIGNvbnN0IGhlYWRlciA9IEJ1ZmZlci5hbGxvYygyMik7XG4gIGhlYWRlci53cml0ZVVJbnQxNkxFKDEsIDIpO1xuICBoZWFkZXIud3JpdGVVSW50MTZMRSgxLCA0KTtcbiAgaGVhZGVyWzZdID0gU0laRTtcbiAgaGVhZGVyWzddID0gU0laRTtcbiAgaGVhZGVyLndyaXRlVUludDE2TEUoMSwgMTApO1xuICBoZWFkZXIud3JpdGVVSW50MTZMRSgzMiwgMTIpO1xuICBoZWFkZXIud3JpdGVVSW50MzJMRShwbmcubGVuZ3RoLCAxNCk7XG4gIGhlYWRlci53cml0ZVVJbnQzMkxFKGhlYWRlci5sZW5ndGgsIDE4KTtcbiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW2hlYWRlciwgcG5nXSk7XG59XG4iXX0=
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pY29uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFeEMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ2hCLE1BQU0sc0JBQXNCLEdBQUc7SUFDN0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDYixDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNiLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2QsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDZCxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNkLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQ2QsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDYixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNkLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0NBQ04sQ0FBQztBQUNYLE1BQU0sd0JBQXdCLEdBQUc7SUFDL0IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDZCxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNiLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0NBQ0wsQ0FBQztBQUtYLHVFQUF1RTtBQUN2RSxNQUFNLFVBQVUsZUFBZSxDQUM3QixRQUEwQixhQUFhLEVBQ3ZDLFdBQTRC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QUM7SUFDM0IsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNqQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ2pCLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzVCLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzdCLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNyQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDeEMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlZmxhdGVTeW5jIH0gZnJvbSBcIm5vZGU6emxpYlwiO1xuXG5jb25zdCBTSVpFID0gMzI7XG5jb25zdCBNT0RFTF9QUk9YWV9SRUNUQU5HTEVTID0gW1xuICBbNCwgMTMsIDYsIDZdLFxuICBbMjQsIDQsIDYsIDZdLFxuICBbMjQsIDEzLCA2LCA2XSxcbiAgWzI0LCAyMiwgNiwgNl0sXG4gIFsxMCwgMTUsIDYsIDJdLFxuICBbMTYsIDYsIDIsIDIwXSxcbiAgWzE4LCA2LCA2LCAyXSxcbiAgWzE4LCAxNSwgNiwgMl0sXG4gIFsxOCwgMjQsIDYsIDJdLFxuXSBhcyBjb25zdDtcbmNvbnN0IEdSQVBISVRJX0JPTFRfUkVDVEFOR0xFUyA9IFtcbiAgWzEwLCA1LCAxMCwgMl0sXG4gIFsxNywgNywgMiwgMl0sXG4gIFsxNSwgOSwgNywgMl0sXG5dIGFzIGNvbnN0O1xuXG4vKiogUGxhaW4gZ2x5cGhzIGF2YWlsYWJsZSB0byBpZGVudGlmeSBkYngtdG9vbHMgc3lzdGVtLXRyYXkgc2VydmljZXMuICovXG5leHBvcnQgdHlwZSBTZXJ2aWNlVHJheUdseXBoID0gXCJtb2RlbC1wcm94eVwiIHwgXCJncmFwaGl0aVwiIHwgXCJsYWtlYmFzZVwiO1xuXG4vKiogUmV0dXJuIGEgc2VydmljZSBnbHlwaCBhcyBhIHN5c3RyYXkyIFBORyBvciBXaW5kb3dzIElDTyBwYXlsb2FkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZpY2VUcmF5SWNvbihcbiAgZ2x5cGg6IFNlcnZpY2VUcmF5R2x5cGggPSBcIm1vZGVsLXByb3h5XCIsXG4gIHBsYXRmb3JtOiBOb2RlSlMuUGxhdGZvcm0gPSBwcm9jZXNzLnBsYXRmb3JtLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgY29sb3IgPVxuICAgIHBsYXRmb3JtID09PSBcImRhcndpblwiXG4gICAgICA/IChbMHgwMCwgMHgwMCwgMHgwMCwgMHhmZl0gYXMgY29uc3QpXG4gICAgICA6IChbMHhmZiwgMHgzNiwgMHgyMSwgMHhmZl0gYXMgY29uc3QpO1xuICBjb25zdCBwbmcgPSBlbmNvZGVQbmcocmVuZGVyR2x5cGgoZ2x5cGgsIGNvbG9yKSk7XG4gIHJldHVybiAocGxhdGZvcm0gPT09IFwid2luMzJcIiA/IGVuY29kZUljbyhwbmcpIDogcG5nKS50b1N0cmluZyhcImJhc2U2NFwiKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyR2x5cGgoXG4gIGdseXBoOiBTZXJ2aWNlVHJheUdseXBoLFxuICBjb2xvcjogcmVhZG9ubHkgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4pOiBCdWZmZXIge1xuICBjb25zdCByZ2JhID0gQnVmZmVyLmFsbG9jKFNJWkUgKiBTSVpFICogNCk7XG4gIGZvciAobGV0IHkgPSAwOyB5IDwgU0laRTsgeSArPSAxKSB7XG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCBTSVpFOyB4ICs9IDEpIHtcbiAgICAgIGNvbnN0IG9wYWNpdHkgPSBnbHlwaE9wYWNpdHkoZ2x5cGgsIHgsIHkpO1xuICAgICAgaWYgKG9wYWNpdHkgPT09IDApIGNvbnRpbnVlO1xuICAgICAgcmdiYS5zZXQoW2NvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0sIE1hdGgucm91bmQoY29sb3JbM10gKiBvcGFjaXR5KV0sICh5ICogU0laRSArIHgpICogNCk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZ2JhO1xufVxuXG5mdW5jdGlvbiBnbHlwaE9wYWNpdHkoZ2x5cGg6IFNlcnZpY2VUcmF5R2x5cGgsIHg6IG51bWJlciwgeTogbnVtYmVyKTogbnVtYmVyIHtcbiAgc3dpdGNoIChnbHlwaCkge1xuICAgIGNhc2UgXCJtb2RlbC1wcm94eVwiOlxuICAgICAgcmV0dXJuIG1vZGVsUHJveHlHbHlwaENvbnRhaW5zKHgsIHkpID8gMSA6IDA7XG4gICAgY2FzZSBcImdyYXBoaXRpXCI6XG4gICAgICByZXR1cm4gZ3JhcGhpdGlHbHlwaENvbnRhaW5zKHgsIHkpID8gMSA6IDA7XG4gICAgY2FzZSBcImxha2ViYXNlXCI6XG4gICAgICByZXR1cm4gbGFrZWJhc2VHbHlwaE9wYWNpdHkoeCwgeSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbW9kZWxQcm94eUdseXBoQ29udGFpbnMoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIE1PREVMX1BST1hZX1JFQ1RBTkdMRVMuc29tZShcbiAgICAoW2xlZnQsIHRvcCwgd2lkdGgsIGhlaWdodF0pID0+IHggPj0gbGVmdCAmJiB4IDwgbGVmdCArIHdpZHRoICYmIHkgPj0gdG9wICYmIHkgPCB0b3AgKyBoZWlnaHQsXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdyYXBoaXRpR2x5cGhDb250YWlucyh4OiBudW1iZXIsIHk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAvLyBQcmVzZXJ2ZSB0aGUgR3JhcGhpdGkgYm90IG1hcmsgdGhyb3VnaCBpdHMgYm9sdCwgYW50ZW5uYWUsIG91dGxpbmVkIGhlYWQsIGFuZCByaW5nZWQgZXllcy5cbiAgY29uc3QgYm9sdCA9IEdSQVBISVRJX0JPTFRfUkVDVEFOR0xFUy5zb21lKFxuICAgIChbbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0XSkgPT4geCA+PSBsZWZ0ICYmIHggPCBsZWZ0ICsgd2lkdGggJiYgeSA+PSB0b3AgJiYgeSA8IHRvcCArIGhlaWdodCxcbiAgKTtcbiAgY29uc3QgaGVhZCA9XG4gICAgKHkgPj0gMTAgJiYgeSA8IDEzICYmIHggPj0gNiAmJiB4IDwgMjYpIHx8XG4gICAgKHkgPj0gMTMgJiYgeSA8IDI1ICYmIHggPj0gNCAmJiB4IDwgNykgfHxcbiAgICAoeSA+PSAxMyAmJiB5IDwgMjUgJiYgeCA+PSAyNSAmJiB4IDwgMjgpIHx8XG4gICAgKHkgPj0gMjQgJiYgeSA8IDI3ICYmIHggPj0gNiAmJiB4IDwgMjYpO1xuICBjb25zdCBhbnRlbm5hID1cbiAgICB5ID49IDMgJiZcbiAgICB5IDwgMTEgJiZcbiAgICAoKHggPj0gNyAmJiB4IDwgOSkgfHwgKHggPj0gMjMgJiYgeCA8IDI1KSk7XG4gIHJldHVybiBib2x0IHx8IGhlYWQgfHwgYW50ZW5uYSB8fCBncmFwaGl0aUV5ZUNvbnRhaW5zKHgsIHksIDExKSB8fCBncmFwaGl0aUV5ZUNvbnRhaW5zKHgsIHksIDIxKTtcbn1cblxuZnVuY3Rpb24gZ3JhcGhpdGlFeWVDb250YWlucyh4OiBudW1iZXIsIHk6IG51bWJlciwgY2VudGVyWDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGNvbnN0IGRpc3RhbmNlID0gKHggLSBjZW50ZXJYKSAqKiAyICsgKHkgLSAxOCkgKiogMjtcbiAgcmV0dXJuIGRpc3RhbmNlID49IDEwICYmIGRpc3RhbmNlIDw9IDI1O1xufVxuXG5mdW5jdGlvbiBsYWtlYmFzZUdseXBoT3BhY2l0eSh4OiBudW1iZXIsIHk6IG51bWJlcik6IG51bWJlciB7XG4gIGlmICh4IDwgNSB8fCB4ID49IDI3KSByZXR1cm4gMDtcbiAgaWYgKHkgPj0gNSAmJiB5IDwgMTEpIHJldHVybiAwLjQ1O1xuXG4gIC8vIEtlZXAgdGhlIG9mZmljaWFsIG1hcmsncyBsaWdodCBtaWRkbGUgYmFuZCwgZGFyayB3YXZlIGNoYW5uZWwsIGFuZCBzb2xpZCBsb3dlciBiYW5kLlxuICBjb25zdCBtaWRkbGVCb3VuZGFyeSA9IDE5IC0gTWF0aC5yb3VuZChNYXRoLnNpbigoKHggLSA1KSAvIDIxKSAqIE1hdGguUEkgKiAyKSk7XG4gIGlmICh5ID49IDEzICYmIHkgPCBtaWRkbGVCb3VuZGFyeSkgcmV0dXJuIDAuNDU7XG4gIGlmICh5ID49IG1pZGRsZUJvdW5kYXJ5ICsgMyAmJiB5IDwgMjcpIHJldHVybiAxO1xuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gZW5jb2RlUG5nKHJnYmE6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gIGNvbnN0IGhlYWRlciA9IEJ1ZmZlci5hbGxvYygxMyk7XG4gIGhlYWRlci53cml0ZVVJbnQzMkJFKFNJWkUsIDApO1xuICBoZWFkZXIud3JpdGVVSW50MzJCRShTSVpFLCA0KTtcbiAgaGVhZGVyWzhdID0gODtcbiAgaGVhZGVyWzldID0gNjtcblxuICBjb25zdCBzY2FubGluZXMgPSBCdWZmZXIuYWxsb2MoKFNJWkUgKiA0ICsgMSkgKiBTSVpFKTtcbiAgZm9yIChsZXQgeSA9IDA7IHkgPCBTSVpFOyB5ICs9IDEpIHtcbiAgICBjb25zdCBvZmZzZXQgPSB5ICogKFNJWkUgKiA0ICsgMSk7XG4gICAgc2NhbmxpbmVzW29mZnNldF0gPSAwO1xuICAgIHJnYmEuY29weShzY2FubGluZXMsIG9mZnNldCArIDEsIHkgKiBTSVpFICogNCwgKHkgKyAxKSAqIFNJWkUgKiA0KTtcbiAgfVxuXG4gIHJldHVybiBCdWZmZXIuY29uY2F0KFtcbiAgICBCdWZmZXIuZnJvbShbMHg4OSwgMHg1MCwgMHg0ZSwgMHg0NywgMHgwZCwgMHgwYSwgMHgxYSwgMHgwYV0pLFxuICAgIHBuZ0NodW5rKFwiSUhEUlwiLCBoZWFkZXIpLFxuICAgIHBuZ0NodW5rKFwiSURBVFwiLCBkZWZsYXRlU3luYyhzY2FubGluZXMpKSxcbiAgICBwbmdDaHVuayhcIklFTkRcIiwgQnVmZmVyLmFsbG9jKDApKSxcbiAgXSk7XG59XG5cbmZ1bmN0aW9uIHBuZ0NodW5rKHR5cGU6IHN0cmluZywgZGF0YTogQnVmZmVyKTogQnVmZmVyIHtcbiAgY29uc3QgbmFtZSA9IEJ1ZmZlci5mcm9tKHR5cGUsIFwiYXNjaWlcIik7XG4gIGNvbnN0IGNodW5rID0gQnVmZmVyLmFsbG9jKDEyICsgZGF0YS5sZW5ndGgpO1xuICBjaHVuay53cml0ZVVJbnQzMkJFKGRhdGEubGVuZ3RoLCAwKTtcbiAgbmFtZS5jb3B5KGNodW5rLCA0KTtcbiAgZGF0YS5jb3B5KGNodW5rLCA4KTtcbiAgY2h1bmsud3JpdGVVSW50MzJCRShjcmMzMihCdWZmZXIuY29uY2F0KFtuYW1lLCBkYXRhXSkpLCA4ICsgZGF0YS5sZW5ndGgpO1xuICByZXR1cm4gY2h1bms7XG59XG5cbmZ1bmN0aW9uIGNyYzMyKGRhdGE6IEJ1ZmZlcik6IG51bWJlciB7XG4gIGxldCB2YWx1ZSA9IDB4ZmZmZmZmZmY7XG4gIGZvciAoY29uc3QgYnl0ZSBvZiBkYXRhKSB7XG4gICAgdmFsdWUgXj0gYnl0ZTtcbiAgICBmb3IgKGxldCBiaXQgPSAwOyBiaXQgPCA4OyBiaXQgKz0gMSkge1xuICAgICAgdmFsdWUgPSAodmFsdWUgPj4+IDEpIF4gKHZhbHVlICYgMSA/IDB4ZWRiODgzMjAgOiAwKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuICh2YWx1ZSBeIDB4ZmZmZmZmZmYpID4+PiAwO1xufVxuXG5mdW5jdGlvbiBlbmNvZGVJY28ocG5nOiBCdWZmZXIpOiBCdWZmZXIge1xuICBjb25zdCBoZWFkZXIgPSBCdWZmZXIuYWxsb2MoMjIpO1xuICBoZWFkZXIud3JpdGVVSW50MTZMRSgxLCAyKTtcbiAgaGVhZGVyLndyaXRlVUludDE2TEUoMSwgNCk7XG4gIGhlYWRlcls2XSA9IFNJWkU7XG4gIGhlYWRlcls3XSA9IFNJWkU7XG4gIGhlYWRlci53cml0ZVVJbnQxNkxFKDEsIDEwKTtcbiAgaGVhZGVyLndyaXRlVUludDE2TEUoMzIsIDEyKTtcbiAgaGVhZGVyLndyaXRlVUludDMyTEUocG5nLmxlbmd0aCwgMTQpO1xuICBoZWFkZXIud3JpdGVVSW50MzJMRShoZWFkZXIubGVuZ3RoLCAxOCk7XG4gIHJldHVybiBCdWZmZXIuY29uY2F0KFtoZWFkZXIsIHBuZ10pO1xufVxuIl19