@dbx-tools/cli-args 0.9.105 → 0.9.108

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/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-args";
6
- export const PACKAGE_VERSION = "0.9.105";
6
+ export const PACKAGE_VERSION = "0.9.108";
7
7
  export * as args from "./src/args.ts";
8
- export type { CliArgsOptions, CliArgMeta, ArgumentSource } from "./src/args.ts";
8
+ export type { CliArgsOptions, CliArgMeta, CliObjectSchema, ArgumentSource } from "./src/args.ts";
9
9
  export * from "./exports.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/cli-args";
2
- export declare const PACKAGE_VERSION = "0.9.105";
2
+ export declare const PACKAGE_VERSION = "0.9.108";
3
3
  export * as args from "./src/args.ts";
4
- export type { CliArgsOptions, CliArgMeta, ArgumentSource } from "./src/args.ts";
4
+ export type { CliArgsOptions, CliArgMeta, CliObjectSchema, ArgumentSource } from "./src/args.ts";
5
5
  export * from "./exports.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-args";
5
- export const PACKAGE_VERSION = "0.9.105";
5
+ export const PACKAGE_VERSION = "0.9.108";
6
6
  export * as args from "./src/args.js";
7
7
  export * from "./exports.js";
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxxQkFBcUIsQ0FBQztBQUN4RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFDO0FBRXRDLGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9jbGktYXJnc1wiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45LjEwNVwiO1xuZXhwb3J0ICogYXMgYXJncyBmcm9tIFwiLi9zcmMvYXJncy50c1wiO1xuZXhwb3J0IHR5cGUgeyBDbGlBcmdzT3B0aW9ucywgQ2xpQXJnTWV0YSwgQXJndW1lbnRTb3VyY2UgfSBmcm9tIFwiLi9zcmMvYXJncy50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXhwb3J0cy50c1wiO1xuIl19
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxxQkFBcUIsQ0FBQztBQUN4RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFDO0FBRXRDLGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9jbGktYXJnc1wiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45LjEwOFwiO1xuZXhwb3J0ICogYXMgYXJncyBmcm9tIFwiLi9zcmMvYXJncy50c1wiO1xuZXhwb3J0IHR5cGUgeyBDbGlBcmdzT3B0aW9ucywgQ2xpQXJnTWV0YSwgQ2xpT2JqZWN0U2NoZW1hLCBBcmd1bWVudFNvdXJjZSB9IGZyb20gXCIuL3NyYy9hcmdzLnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9leHBvcnRzLnRzXCI7XG4iXX0=
package/lib/src/args.d.ts CHANGED
@@ -9,7 +9,6 @@
9
9
  */
10
10
  import { configUtils } from "@dbx-tools/core";
11
11
  import { Command } from "commander";
12
- import { z } from "zod";
13
12
  /** Layered config lookup used to resolve argument values and help defaults. */
14
13
  export type CliArgsOptions = configUtils.ConfigOptions;
15
14
  /** CLI metadata read from a field's Zod `.meta()` value. */
@@ -20,12 +19,19 @@ export interface CliArgMeta {
20
19
  readonly flag?: boolean;
21
20
  /** Set false to keep schema and configured defaults out of generated help. */
22
21
  readonly helpDefault?: boolean;
22
+ /** One-character short flag without a dash, or false to disable automatic generation. */
23
+ readonly short?: string | false;
24
+ }
25
+ /** Structural Zod object contract that remains compatible across Zod v4 minors. */
26
+ export interface CliObjectSchema<TOutput extends Readonly<Record<string, unknown>> = Readonly<Record<string, unknown>>> {
27
+ parse(value: unknown): TOutput;
28
+ toJSONSchema(): unknown;
23
29
  }
24
30
  /** Zod defaults or concrete option values serialized by {@link serializeArgs}. */
25
- export type ArgumentSource = z.ZodObject<z.ZodRawShape> | Readonly<Record<string, unknown>>;
31
+ export type ArgumentSource = CliObjectSchema | Readonly<Record<string, unknown>>;
26
32
  /** Register Commander arguments for every enabled field on a Zod object schema. */
27
- export declare function addArgs<T extends z.ZodRawShape>(command: Command, schema: z.ZodObject<T>, options?: CliArgsOptions): Command;
33
+ export declare function addArgs<TSchema extends CliObjectSchema>(command: Command, schema: TSchema, options?: CliArgsOptions): Command;
28
34
  /** Merge CLI values over layered config, then validate and default through Zod. */
29
- export declare function parseArgs<T extends z.ZodRawShape>(command: Command, schema: z.ZodObject<T>, options?: CliArgsOptions): z.output<z.ZodObject<T>>;
35
+ export declare function parseArgs<TSchema extends CliObjectSchema>(command: Command, schema: TSchema, options?: CliArgsOptions): ReturnType<TSchema["parse"]>;
30
36
  /** Convert schema defaults or concrete option values into Commander arguments. */
31
37
  export declare function serializeArgs(source: ArgumentSource): string[];
package/lib/src/args.js CHANGED
@@ -10,17 +10,18 @@
10
10
  import { configUtils } from "@dbx-tools/core";
11
11
  import { object, options as sharedOptions, stringUtils } from "@dbx-tools/shared-core";
12
12
  import { Option } from "commander";
13
- import { z } from "zod";
14
13
  const boundOptions = new WeakMap();
15
14
  /** Register Commander arguments for every enabled field on a Zod object schema. */
16
15
  export function addArgs(command, schema, options = {}) {
17
16
  boundOptions.set(command, options);
18
- for (const field of fields(schema)) {
17
+ const schemaFields = fields(schema);
18
+ const shortFlags = fieldShortFlags(schemaFields);
19
+ for (const field of schemaFields) {
19
20
  if (field.flag === false)
20
21
  continue;
21
22
  const envKeys = fieldEnvKeys(field);
22
23
  const envName = envArgName(field, envKeys, options);
23
- const flags = argFlags(field);
24
+ const flags = argFlags(field, shortFlags.get(field.key));
24
25
  const sourced = configValue(field, envKeys, options);
25
26
  const fallback = sourced ?? field.fallback;
26
27
  const option = new Option(flags, field.description);
@@ -61,14 +62,14 @@ export function parseArgs(command, schema, options = boundOptions.get(command) ?
61
62
  }
62
63
  /** Convert schema defaults or concrete option values into Commander arguments. */
63
64
  export function serializeArgs(source) {
64
- if (source instanceof z.ZodObject) {
65
+ if (isCliObjectSchema(source)) {
65
66
  const values = source.parse({});
66
67
  return fields(source).flatMap((field) => field.flag === false ? [] : valueArguments(field.key, values[field.key]));
67
68
  }
68
69
  return Object.entries(source).flatMap(([key, value]) => valueArguments(key, value));
69
70
  }
70
71
  function fields(schema) {
71
- const document = z.toJSONSchema(schema);
72
+ const document = schema.toJSONSchema();
72
73
  const properties = object.isRecord(document) ? document.properties : undefined;
73
74
  if (!object.isRecord(properties)) {
74
75
  throw new TypeError("Zod Commander binding requires a z.object() schema");
@@ -88,12 +89,53 @@ function fields(schema) {
88
89
  env: json.env,
89
90
  flag: json.flag,
90
91
  helpDefault: json.helpDefault,
92
+ short: json.short,
91
93
  };
92
94
  });
93
95
  }
94
- function argFlags(field) {
95
- const flag = `--${stringUtils.toSlug(field.key)}`;
96
- return field.type === "boolean" ? flag : `${flag} <value>`;
96
+ function isCliObjectSchema(value) {
97
+ return typeof value.parse === "function" && typeof value.toJSONSchema === "function";
98
+ }
99
+ function argFlags(field, short) {
100
+ const long = `--${stringUtils.toSlug(field.key)}`;
101
+ const value = field.type === "boolean" ? "" : " <value>";
102
+ if (short)
103
+ return `-${short}, ${long}${value}`;
104
+ return `${long}${value}`;
105
+ }
106
+ function fieldShortFlags(fields) {
107
+ const result = new Map();
108
+ const reserved = new Map([["h", "help"]]);
109
+ for (const field of fields) {
110
+ if (field.short === false || field.short === undefined)
111
+ continue;
112
+ if (!/^[A-Za-z]$/.test(field.short)) {
113
+ throw new TypeError(`Short flag for "${field.key}" must be one letter or false`);
114
+ }
115
+ const short = field.short.toLowerCase();
116
+ const existing = reserved.get(short);
117
+ if (existing) {
118
+ throw new TypeError(`Short flag -${short} is shared by "${existing}" and "${field.key}"`);
119
+ }
120
+ reserved.set(short, field.key);
121
+ result.set(field.key, short);
122
+ }
123
+ const candidates = new Map();
124
+ for (const field of fields) {
125
+ if (field.short !== undefined)
126
+ continue;
127
+ const short = [...stringUtils.tokenize(field.key)][0]?.[0]?.toLowerCase();
128
+ if (!short || reserved.has(short))
129
+ continue;
130
+ const matching = candidates.get(short) ?? [];
131
+ matching.push(field);
132
+ candidates.set(short, matching);
133
+ }
134
+ for (const [short, matching] of candidates) {
135
+ if (matching.length === 1)
136
+ result.set(matching[0].key, short);
137
+ }
138
+ return result;
97
139
  }
98
140
  function fieldEnvKeys(field) {
99
141
  if (typeof field.env === "string")
@@ -152,4 +194,4 @@ function listenAddress(value) {
152
194
  }
153
195
  return undefined;
154
196
  }
155
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcmdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxJQUFJLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RixPQUFPLEVBQVcsTUFBTSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFrQ3hCLE1BQU0sWUFBWSxHQUFHLElBQUksT0FBTyxFQUEyQixDQUFDO0FBRTVELG1GQUFtRjtBQUNuRixNQUFNLFVBQVUsT0FBTyxDQUNyQixPQUFnQixFQUNoQixNQUFzQixFQUN0QixVQUEwQixFQUFFO0lBRTVCLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLEtBQUs7WUFBRSxTQUFTO1FBQ25DLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQyxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNwRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDckQsTUFBTSxRQUFRLEdBQUcsT0FBTyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDM0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsS0FB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QUFLLFFBQVEsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN4RixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBQ0QsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLElBQUksT0FBTztRQUFFLE9BQU8sYUFBYSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9ELE1BQU0sSUFBSSxTQUFTLENBQUMsa0NBQWtDLEdBQUcsMkJBQTJCLENBQUMsQ0FBQztBQUN4RixDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsS0FBYztJQUNuQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM5QyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxJQUFJLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQy9GLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDL0QsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxNQUFNLElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbW1hbmRlciBhcmd1bWVudHMgZ2VuZXJhdGVkIGZyb20gYSBab2Qgb2JqZWN0IHNjaGVtYS5cbiAqXG4gKiBab2Qgb3ducyB2YWxpZGF0aW9uLCBjb2VyY2lvbiwgbWV0YWRhdGEsIGFuZCBkZWZhdWx0cy4gQ29tbWFuZGVyIG93bnMgZmxhZ3MsXG4gKiBoZWxwLCBhbmQgZW52aXJvbm1lbnQgZGlzcGxheS4ge0BsaW5rIGNvbmZpZ1V0aWxzfSBzdXBwbGllcyBsYXllcmVkIGxvY2FsXG4gKiBjb25maWd1cmF0aW9uIGJlZm9yZSB0aGUgZmluYWwgWm9kIHBhcnNlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBjb25maWdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB7IG9iamVjdCwgb3B0aW9ucyBhcyBzaGFyZWRPcHRpb25zLCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBDb21tYW5kLCBPcHRpb24gfSBmcm9tIFwiY29tbWFuZGVyXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG4vKiogTGF5ZXJlZCBjb25maWcgbG9va3VwIHVzZWQgdG8gcmVzb2x2ZSBhcmd1bWVudCB2YWx1ZXMgYW5kIGhlbHAgZGVmYXVsdHMuICovXG5leHBvcnQgdHlwZSBDbGlBcmdzT3B0aW9ucyA9IGNvbmZpZ1V0aWxzLkNvbmZpZ09wdGlvbnM7XG5cbi8qKiBDTEkgbWV0YWRhdGEgcmVhZCBmcm9tIGEgZmllbGQncyBab2QgYC5tZXRhKClgIHZhbHVlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGlBcmdNZXRhIHtcbiAgLyoqIEV4YWN0IGVudmlyb25tZW50IG5hbWUgb3Igb3JkZXJlZCBhbGlhc2VzIHVzZWQgaW5zdGVhZCBvZiBmaWVsZC1uYW1lIGRlcml2YXRpb24uICovXG4gIHJlYWRvbmx5IGVudj86IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogU2V0IGZhbHNlIHRvIHJlc29sdmUgdGhlIGZpZWxkIGZyb20gY29uZmlnIHdpdGhvdXQgZ2VuZXJhdGluZyBhIENvbW1hbmRlciBmbGFnLiAqL1xuICByZWFkb25seSBmbGFnPzogYm9vbGVhbjtcbiAgLyoqIFNldCBmYWxzZSB0byBrZWVwIHNjaGVtYSBhbmQgY29uZmlndXJlZCBkZWZhdWx0cyBvdXQgb2YgZ2VuZXJhdGVkIGhlbHAuICovXG4gIHJlYWRvbmx5IGhlbHBEZWZhdWx0PzogYm9vbGVhbjtcbn1cblxuLyoqIFpvZCBkZWZhdWx0cyBvciBjb25jcmV0ZSBvcHRpb24gdmFsdWVzIHNlcmlhbGl6ZWQgYnkge0BsaW5rIHNlcmlhbGl6ZUFyZ3N9LiAqL1xuZXhwb3J0IHR5cGUgQXJndW1lbnRTb3VyY2UgPSB6LlpvZE9iamVjdDx6LlpvZFJhd1NoYXBlPiB8IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcblxuaW50ZXJmYWNlIEpzb25GaWVsZCBleHRlbmRzIENsaUFyZ01ldGEge1xuICB0eXBlPzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgZGVmYXVsdD86IHVua25vd247XG4gIGVudW0/OiB1bmtub3duW107XG4gIGNvbnN0PzogdW5rbm93bjtcbn1cblxuaW50ZXJmYWNlIEZpZWxkIGV4dGVuZHMgQ2xpQXJnTWV0YSB7XG4gIGtleTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICB0eXBlPzogc3RyaW5nO1xuICBjaG9pY2VzPzogc3RyaW5nW107XG4gIGZhbGxiYWNrPzogdW5rbm93bjtcbn1cblxuY29uc3QgYm91bmRPcHRpb25zID0gbmV3IFdlYWtNYXA8Q29tbWFuZCwgQ2xpQXJnc09wdGlvbnM+KCk7XG5cbi8qKiBSZWdpc3RlciBDb21tYW5kZXIgYXJndW1lbnRzIGZvciBldmVyeSBlbmFibGVkIGZpZWxkIG9uIGEgWm9kIG9iamVjdCBzY2hlbWEuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkQXJnczxUIGV4dGVuZHMgei5ab2RSYXdTaGFwZT4oXG4gIGNvbW1hbmQ6IENvbW1hbmQsXG4gIHNjaGVtYTogei5ab2RPYmplY3Q8VD4sXG4gIG9wdGlvbnM6IENsaUFyZ3NPcHRpb25zID0ge30sXG4pOiBDb21tYW5kIHtcbiAgYm91bmRPcHRpb25zLnNldChjb21tYW5kLCBvcHRpb25zKTtcbiAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMoc2NoZW1hKSkge1xuICAgIGlmIChmaWVsZC5mbGFnID09PSBmYWxzZSkgY29udGludWU7XG4gICAgY29uc3QgZW52S2V5cyA9IGZpZWxkRW52S2V5cyhmaWVsZCk7XG4gICAgY29uc3QgZW52TmFtZSA9IGVudkFyZ05hbWUoZmllbGQsIGVudktleXMsIG9wdGlvbnMpO1xuICAgIGNvbnN0IGZsYWdzID0gYXJnRmxhZ3MoZmllbGQpO1xuICAgIGNvbnN0IHNvdXJjZWQgPSBjb25maWdWYWx1ZShmaWVsZCwgZW52S2V5cywgb3B0aW9ucyk7XG4gICAgY29uc3QgZmFsbGJhY2sgPSBzb3VyY2VkID8/IGZpZWxkLmZhbGxiYWNrO1xuICAgIGNvbnN0IG9wdGlvbiA9IG5ldyBPcHRpb24oZmxhZ3MsIGZpZWxkLmRlc2NyaXB0aW9uKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3B0aW9uLCBcInNjaGVtYUhlbHBEZWZhdWx0XCIsIHtcbiAgICAgIHZhbHVlOiBmaWVsZC5oZWxwRGVmYXVsdCA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBmaWVsZC5mYWxsYmFjayxcbiAgICB9KTtcbiAgICBpZiAoZW52TmFtZSkgb3B0aW9uLmVudihlbnZOYW1lKTtcbiAgICBpZiAoZmllbGQuY2hvaWNlcyAmJiBmaWVsZC5jaG9pY2VzLmxlbmd0aCA+IDApIG9wdGlvbi5jaG9pY2VzKGZpZWxkLmNob2ljZXMpO1xuICAgIGlmIChmYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGZpZWxkLmhlbHBEZWZhdWx0ICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgYWRkcmVzcyA9IGxpc3RlbkFkZHJlc3MoZmFsbGJhY2spO1xuICAgICAgb3B0aW9uLmRlZmF1bHQoZmFsbGJhY2ssIGFkZHJlc3MgPyBzaGFyZWRPcHRpb25zLmZvcm1hdExpc3RlbkFkZHJlc3MoYWRkcmVzcykgOiB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBpZiAoZmllbGQudHlwZSA9PT0gXCJhcnJheVwiKSB7XG4gICAgICBvcHRpb24uYXJnUGFyc2VyKCh2YWx1ZTogc3RyaW5nLCBwcmV2aW91czogdW5rbm93bikgPT5cbiAgICAgICAgcHJldmlvdXMgPT09IGZhbGxiYWNrIHx8ICFBcnJheS5pc0FycmF5KHByZXZpb3VzKSA/IFt2YWx1ZV0gOiBbLi4ucHJldmlvdXMsIHZhbHVlXSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbW1hbmQuYWRkT3B0aW9uKG9wdGlvbik7XG4gICAgaWYgKGZpZWxkLnR5cGUgPT09IFwiYm9vbGVhblwiICYmIG9wdGlvbi5sb25nKSB7XG4gICAgICBjb21tYW5kLmFkZE9wdGlvbihcbiAgICAgICAgbmV3IE9wdGlvbihgLS1uby0ke29wdGlvbi5sb25nLnNsaWNlKDIpfWAsIGBEaXNhYmxlICR7ZmllbGQuZGVzY3JpcHRpb24udG9Mb3dlckNhc2UoKX1gKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjb21tYW5kO1xufVxuXG4vKiogTWVyZ2UgQ0xJIHZhbHVlcyBvdmVyIGxheWVyZWQgY29uZmlnLCB0aGVuIHZhbGlkYXRlIGFuZCBkZWZhdWx0IHRocm91Z2ggWm9kLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQXJnczxUIGV4dGVuZHMgei5ab2RSYXdTaGFwZT4oXG4gIGNvbW1hbmQ6IENvbW1hbmQsXG4gIHNjaGVtYTogei5ab2RPYmplY3Q8VD4sXG4gIG9wdGlvbnM6IENsaUFyZ3NPcHRpb25zID0gYm91bmRPcHRpb25zLmdldChjb21tYW5kKSA/PyB7fSxcbik6IHoub3V0cHV0PHouWm9kT2JqZWN0PFQ+PiB7XG4gIGNvbnN0IHZhbHVlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMoc2NoZW1hKSkge1xuICAgIGlmIChjb21tYW5kLmdldE9wdGlvblZhbHVlU291cmNlKGZpZWxkLmtleSkgPT09IFwiY2xpXCIpIHtcbiAgICAgIHZhbHVlc1tmaWVsZC5rZXldID0gY29tbWFuZC5nZXRPcHRpb25WYWx1ZShmaWVsZC5rZXkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHNvdXJjZWQgPSBjb25maWdWYWx1ZShmaWVsZCwgZmllbGRFbnZLZXlzKGZpZWxkKSwgb3B0aW9ucyk7XG4gICAgaWYgKHNvdXJjZWQgIT09IHVuZGVmaW5lZCkgdmFsdWVzW2ZpZWxkLmtleV0gPSBzb3VyY2VkO1xuICB9XG4gIHJldHVybiBzY2hlbWEucGFyc2UodmFsdWVzKTtcbn1cblxuLyoqIENvbnZlcnQgc2NoZW1hIGRlZmF1bHRzIG9yIGNvbmNyZXRlIG9wdGlvbiB2YWx1ZXMgaW50byBDb21tYW5kZXIgYXJndW1lbnRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUFyZ3Moc291cmNlOiBBcmd1bWVudFNvdXJjZSk6IHN0cmluZ1tdIHtcbiAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIHouWm9kT2JqZWN0KSB7XG4gICAgY29uc3QgdmFsdWVzID0gc291cmNlLnBhcnNlKHt9KSBhcyBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gICAgcmV0dXJuIGZpZWxkcyhzb3VyY2UpLmZsYXRNYXAoKGZpZWxkKSA9PlxuICAgICAgZmllbGQuZmxhZyA9PT0gZmFsc2UgPyBbXSA6IHZhbHVlQXJndW1lbnRzKGZpZWxkLmtleSwgdmFsdWVzW2ZpZWxkLmtleV0pLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHNvdXJjZSkuZmxhdE1hcCgoW2tleSwgdmFsdWVdKSA9PiB2YWx1ZUFyZ3VtZW50cyhrZXksIHZhbHVlKSk7XG59XG5cbmZ1bmN0aW9uIGZpZWxkcyhzY2hlbWE6IHouWm9kT2JqZWN0PHouWm9kUmF3U2hhcGU+KTogRmllbGRbXSB7XG4gIGNvbnN0IGRvY3VtZW50ID0gei50b0pTT05TY2hlbWEoc2NoZW1hKTtcbiAgY29uc3QgcHJvcGVydGllcyA9IG9iamVjdC5pc1JlY29yZChkb2N1bWVudCkgPyBkb2N1bWVudC5wcm9wZXJ0aWVzIDogdW5kZWZpbmVkO1xuICBpZiAoIW9iamVjdC5pc1JlY29yZChwcm9wZXJ0aWVzKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJab2QgQ29tbWFuZGVyIGJpbmRpbmcgcmVxdWlyZXMgYSB6Lm9iamVjdCgpIHNjaGVtYVwiKTtcbiAgfVxuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocHJvcGVydGllcykubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBpZiAoIW9iamVjdC5pc1JlY29yZCh2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYENhbm5vdCBiaW5kIENMSSBhcmd1bWVudCBcIiR7a2V5fVwiYCk7XG4gICAgfVxuICAgIGNvbnN0IGpzb24gPSB2YWx1ZSBhcyBKc29uRmllbGQ7XG4gICAgY29uc3QgY2hvaWNlcyA9XG4gICAgICBqc29uLmVudW0/Lm1hcChTdHJpbmcpID8/IChqc29uLmNvbnN0ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBbU3RyaW5nKGpzb24uY29uc3QpXSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0eXBlb2YganNvbi5kZXNjcmlwdGlvbiA9PT0gXCJzdHJpbmdcIiA/IGpzb24uZGVzY3JpcHRpb24gOiBcIlwiLFxuICAgICAgdHlwZToganNvbi50eXBlLFxuICAgICAgY2hvaWNlcyxcbiAgICAgIGZhbGxiYWNrOiBqc29uLmRlZmF1bHQsXG4gICAgICBlbnY6IGpzb24uZW52LFxuICAgICAgZmxhZzoganNvbi5mbGFnLFxuICAgICAgaGVscERlZmF1bHQ6IGpzb24uaGVscERlZmF1bHQsXG4gICAgfTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFyZ0ZsYWdzKGZpZWxkOiBGaWVsZCk6IHN0cmluZyB7XG4gIGNvbnN0IGZsYWcgPSBgLS0ke3N0cmluZ1V0aWxzLnRvU2x1ZyhmaWVsZC5rZXkpfWA7XG4gIHJldHVybiBmaWVsZC50eXBlID09PSBcImJvb2xlYW5cIiA/IGZsYWcgOiBgJHtmbGFnfSA8dmFsdWU+YDtcbn1cblxuZnVuY3Rpb24gZmllbGRFbnZLZXlzKGZpZWxkOiBGaWVsZCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiBmaWVsZC5lbnYgPT09IFwic3RyaW5nXCIpIHJldHVybiBbZmllbGQuZW52XTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQuZW52KSkgcmV0dXJuIFsuLi5maWVsZC5lbnZdO1xuICByZXR1cm4gY29uZmlnVXRpbHMuZW52aXJvbm1lbnRLZXlzKGZpZWxkLmtleSk7XG59XG5cbmZ1bmN0aW9uIGVudkFyZ05hbWUoZmllbGQ6IEZpZWxkLCBlbnZLZXlzOiByZWFkb25seSBzdHJpbmdbXSwgb3B0aW9uczogQ2xpQXJnc09wdGlvbnMpOiBzdHJpbmcge1xuICBpZiAoZmllbGQuZW52ICE9PSB1bmRlZmluZWQpIHJldHVybiBlbnZLZXlzWzBdID8/IFwiXCI7XG4gIGNvbnN0IGNhbm9uaWNhbCA9XG4gICAgZW52S2V5cy5maW5kKChrZXkpID0+IC9eW0EtWl1bQS1aMC05XSooX1tBLVowLTldKykrJC8udGVzdChrZXkpKSA/P1xuICAgIGVudktleXMuZmluZCgoa2V5KSA9PiBrZXkgPT09IGtleS50b1VwcGVyQ2FzZSgpICYmIC9bQS1aXS8udGVzdChrZXkpKSA/P1xuICAgIGVudktleXMuYXQoLTEpID8/XG4gICAgXCJcIjtcbiAgLy8gSGVscCBzaG93cyB0aGUgdW5zY29wZWQgbmFtZTsgY29uZmlnVXRpbHMgc3RpbGwgcmVhZHMgREJYX1RPT0xTXyBhbGlhc2VzLlxuICByZXR1cm4gY29uZmlnVXRpbHMubmFtZShjYW5vbmljYWwsIHsgLi4ub3B0aW9ucywgc2NvcGU6IFtdIH0pO1xufVxuXG5mdW5jdGlvbiBjb25maWdWYWx1ZShcbiAgZmllbGQ6IEZpZWxkLFxuICBlbnZLZXlzOiBzdHJpbmcgfCByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9uczogQ2xpQXJnc09wdGlvbnMsXG4pOiB1bmtub3duIHtcbiAgaWYgKGZpZWxkLnR5cGUgPT09IFwiYXJyYXlcIikge1xuICAgIGNvbnN0IHZhbHVlcyA9IGNvbmZpZ1V0aWxzLmxpc3QodW5kZWZpbmVkLCBlbnZLZXlzLCB1bmRlZmluZWQsIG9wdGlvbnMpO1xuICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoID4gMCA/IHZhbHVlcyA6IHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiBjb25maWdVdGlscy5ib29sZWFuKHVuZGVmaW5lZCwgZW52S2V5cywgb3B0aW9ucyk7XG4gIHJldHVybiBjb25maWdVdGlscy50ZXh0KGVudktleXMsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiB2YWx1ZUFyZ3VtZW50cyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSByZXR1cm4gW107XG4gIGNvbnN0IGZsYWcgPSBgLS0ke3N0cmluZ1V0aWxzLnRvU2x1ZyhrZXkpfWA7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSByZXR1cm4gW3ZhbHVlID8gZmxhZyA6IGAtLW5vLSR7ZmxhZy5zbGljZSgyKX1gXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLmZsYXRNYXAoKGVudHJ5KSA9PiBbZmxhZywgc2NhbGFyQXJndW1lbnQoa2V5LCBlbnRyeSldKTtcbiAgfVxuICByZXR1cm4gW2ZsYWcsIHNjYWxhckFyZ3VtZW50KGtleSwgdmFsdWUpXTtcbn1cblxuZnVuY3Rpb24gc2NhbGFyQXJndW1lbnQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJpZ2ludFwiKSB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cbiAgY29uc3QgYWRkcmVzcyA9IGxpc3RlbkFkZHJlc3ModmFsdWUpO1xuICBpZiAoYWRkcmVzcykgcmV0dXJuIHNoYXJlZE9wdGlvbnMuZm9ybWF0TGlzdGVuQWRkcmVzcyhhZGRyZXNzKTtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihgQ2Fubm90IHNlcmlhbGl6ZSBDTEkgYXJndW1lbnQgXCIke2tleX1cIiB3aXRoIGEgbm9uLXNjYWxhciB2YWx1ZWApO1xufVxuXG5mdW5jdGlvbiBsaXN0ZW5BZGRyZXNzKHZhbHVlOiB1bmtub3duKTogc2hhcmVkT3B0aW9ucy5MaXN0ZW5BZGRyZXNzIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFvYmplY3QuaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodmFsdWUuc2NoZW1lID09PSBcInRjcFwiICYmIHR5cGVvZiB2YWx1ZS5ob3N0ID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiB2YWx1ZS5wb3J0ID09PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIHsgc2NoZW1lOiBcInRjcFwiLCBob3N0OiB2YWx1ZS5ob3N0LCBwb3J0OiB2YWx1ZS5wb3J0IH07XG4gIH1cbiAgaWYgKHZhbHVlLnNjaGVtZSA9PT0gXCJ1bml4XCIgJiYgdHlwZW9mIHZhbHVlLnBhdGggPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4geyBzY2hlbWU6IFwidW5peFwiLCBwYXRoOiB2YWx1ZS5wYXRoIH07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiJdfQ==
197
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcmdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxJQUFJLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RixPQUFPLEVBQVcsTUFBTSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBNEM1QyxNQUFNLFlBQVksR0FBRyxJQUFJLE9BQU8sRUFBMkIsQ0FBQztBQUU1RCxtRkFBbUY7QUFDbkYsTUFBTSxVQUFVLE9BQU8sQ0FDckIsT0FBZ0IsRUFDaEIsTUFBZSxFQUNmLFVBQTBCLEVBQUU7SUFFNUIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sVUFBVSxHQUFHLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNqRCxLQUFLLE1BQU0sS0FBSyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pDLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLO1lBQUUsU0FBUztRQUNuQyxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDcEQsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3JELE1BQU0s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QUM7UUFDRCxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFDRCxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBbUIsQ0FBQztJQUM5QyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzNCLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTO1lBQUUsU0FBUztRQUN4QyxNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQzFFLElBQUksQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFBRSxTQUFTO1FBQzVDLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzdDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckIsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUNELEtBQUssTUFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUMzQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBRSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEtBQVk7SUFDaEMsSUFBSSxPQUFPLEtBQUssQ0FBQyxHQUFHLEtB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LE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN4RixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBQ0QsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLElBQUksT0FBTztRQUFFLE9BQU8sYUFBYSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9ELE1BQU0sSUFBSSxTQUFTLENBQUMsa0NBQWtDLEdBQUcsMkJBQTJCLENBQUMsQ0FBQztBQUN4RixDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsS0FBYztJQUNuQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM5QyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxJQUFJLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQy9GLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDL0QsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxNQUFNLElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbW1hbmRlciBhcmd1bWVudHMgZ2VuZXJhdGVkIGZyb20gYSBab2Qgb2JqZWN0IHNjaGVtYS5cbiAqXG4gKiBab2Qgb3ducyB2YWxpZGF0aW9uLCBjb2VyY2lvbiwgbWV0YWRhdGEsIGFuZCBkZWZhdWx0cy4gQ29tbWFuZGVyIG93bnMgZmxhZ3MsXG4gKiBoZWxwLCBhbmQgZW52aXJvbm1lbnQgZGlzcGxheS4ge0BsaW5rIGNvbmZpZ1V0aWxzfSBzdXBwbGllcyBsYXllcmVkIGxvY2FsXG4gKiBjb25maWd1cmF0aW9uIGJlZm9yZSB0aGUgZmluYWwgWm9kIHBhcnNlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBjb25maWdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB7IG9iamVjdCwgb3B0aW9ucyBhcyBzaGFyZWRPcHRpb25zLCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBDb21tYW5kLCBPcHRpb24gfSBmcm9tIFwiY29tbWFuZGVyXCI7XG5cbi8qKiBMYXllcmVkIGNvbmZpZyBsb29rdXAgdXNlZCB0byByZXNvbHZlIGFyZ3VtZW50IHZhbHVlcyBhbmQgaGVscCBkZWZhdWx0cy4gKi9cbmV4cG9ydCB0eXBlIENsaUFyZ3NPcHRpb25zID0gY29uZmlnVXRpbHMuQ29uZmlnT3B0aW9ucztcblxuLyoqIENMSSBtZXRhZGF0YSByZWFkIGZyb20gYSBmaWVsZCdzIFpvZCBgLm1ldGEoKWAgdmFsdWUuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaUFyZ01ldGEge1xuICAvKiogRXhhY3QgZW52aXJvbm1lbnQgbmFtZSBvciBvcmRlcmVkIGFsaWFzZXMgdXNlZCBpbnN0ZWFkIG9mIGZpZWxkLW5hbWUgZGVyaXZhdGlvbi4gKi9cbiAgcmVhZG9ubHkgZW52Pzogc3RyaW5nIHwgcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKiBTZXQgZmFsc2UgdG8gcmVzb2x2ZSB0aGUgZmllbGQgZnJvbSBjb25maWcgd2l0aG91dCBnZW5lcmF0aW5nIGEgQ29tbWFuZGVyIGZsYWcuICovXG4gIHJlYWRvbmx5IGZsYWc/OiBib29sZWFuO1xuICAvKiogU2V0IGZhbHNlIHRvIGtlZXAgc2NoZW1hIGFuZCBjb25maWd1cmVkIGRlZmF1bHRzIG91dCBvZiBnZW5lcmF0ZWQgaGVscC4gKi9cbiAgcmVhZG9ubHkgaGVscERlZmF1bHQ/OiBib29sZWFuO1xuICAvKiogT25lLWNoYXJhY3RlciBzaG9ydCBmbGFnIHdpdGhvdXQgYSBkYXNoLCBvciBmYWxzZSB0byBkaXNhYmxlIGF1dG9tYXRpYyBnZW5lcmF0aW9uLiAqL1xuICByZWFkb25seSBzaG9ydD86IHN0cmluZyB8IGZhbHNlO1xufVxuXG4vKiogU3RydWN0dXJhbCBab2Qgb2JqZWN0IGNvbnRyYWN0IHRoYXQgcmVtYWlucyBjb21wYXRpYmxlIGFjcm9zcyBab2QgdjQgbWlub3JzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGlPYmplY3RTY2hlbWE8XG4gIFRPdXRwdXQgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPSBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4+IHtcbiAgcGFyc2UodmFsdWU6IHVua25vd24pOiBUT3V0cHV0O1xuICB0b0pTT05TY2hlbWEoKTogdW5rbm93bjtcbn1cblxuLyoqIFpvZCBkZWZhdWx0cyBvciBjb25jcmV0ZSBvcHRpb24gdmFsdWVzIHNlcmlhbGl6ZWQgYnkge0BsaW5rIHNlcmlhbGl6ZUFyZ3N9LiAqL1xuZXhwb3J0IHR5cGUgQXJndW1lbnRTb3VyY2UgPSBDbGlPYmplY3RTY2hlbWEgfCBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG5cbmludGVyZmFjZSBKc29uRmllbGQgZXh0ZW5kcyBDbGlBcmdNZXRhIHtcbiAgdHlwZT86IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGRlZmF1bHQ/OiB1bmtub3duO1xuICBlbnVtPzogdW5rbm93bltdO1xuICBjb25zdD86IHVua25vd247XG59XG5cbmludGVyZmFjZSBGaWVsZCBleHRlbmRzIENsaUFyZ01ldGEge1xuICBrZXk6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgdHlwZT86IHN0cmluZztcbiAgY2hvaWNlcz86IHN0cmluZ1tdO1xuICBmYWxsYmFjaz86IHVua25vd247XG59XG5cbmNvbnN0IGJvdW5kT3B0aW9ucyA9IG5ldyBXZWFrTWFwPENvbW1hbmQsIENsaUFyZ3NPcHRpb25zPigpO1xuXG4vKiogUmVnaXN0ZXIgQ29tbWFuZGVyIGFyZ3VtZW50cyBmb3IgZXZlcnkgZW5hYmxlZCBmaWVsZCBvbiBhIFpvZCBvYmplY3Qgc2NoZW1hLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEFyZ3M8VFNjaGVtYSBleHRlbmRzIENsaU9iamVjdFNjaGVtYT4oXG4gIGNvbW1hbmQ6IENvbW1hbmQsXG4gIHNjaGVtYTogVFNjaGVtYSxcbiAgb3B0aW9uczogQ2xpQXJnc09wdGlvbnMgPSB7fSxcbik6IENvbW1hbmQge1xuICBib3VuZE9wdGlvbnMuc2V0KGNvbW1hbmQsIG9wdGlvbnMpO1xuICBjb25zdCBzY2hlbWFGaWVsZHMgPSBmaWVsZHMoc2NoZW1hKTtcbiAgY29uc3Qgc2hvcnRGbGFncyA9IGZpZWxkU2hvcnRGbGFncyhzY2hlbWFGaWVsZHMpO1xuICBmb3IgKGNvbnN0IGZpZWxkIG9mIHNjaGVtYUZpZWxkcykge1xuICAgIGlmIChmaWVsZC5mbGFnID09PSBmYWxzZSkgY29udGludWU7XG4gICAgY29uc3QgZW52S2V5cyA9IGZpZWxkRW52S2V5cyhmaWVsZCk7XG4gICAgY29uc3QgZW52TmFtZSA9IGVudkFyZ05hbWUoZmllbGQsIGVudktleXMsIG9wdGlvbnMpO1xuICAgIGNvbnN0IGZsYWdzID0gYXJnRmxhZ3MoZmllbGQsIHNob3J0RmxhZ3MuZ2V0KGZpZWxkLmtleSkpO1xuICAgIGNvbnN0IHNvdXJjZWQgPSBjb25maWdWYWx1ZShmaWVsZCwgZW52S2V5cywgb3B0aW9ucyk7XG4gICAgY29uc3QgZmFsbGJhY2sgPSBzb3VyY2VkID8/IGZpZWxkLmZhbGxiYWNrO1xuICAgIGNvbnN0IG9wdGlvbiA9IG5ldyBPcHRpb24oZmxhZ3MsIGZpZWxkLmRlc2NyaXB0aW9uKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3B0aW9uLCBcInNjaGVtYUhlbHBEZWZhdWx0XCIsIHtcbiAgICAgIHZhbHVlOiBmaWVsZC5oZWxwRGVmYXVsdCA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBmaWVsZC5mYWxsYmFjayxcbiAgICB9KTtcbiAgICBpZiAoZW52TmFtZSkgb3B0aW9uLmVudihlbnZOYW1lKTtcbiAgICBpZiAoZmllbGQuY2hvaWNlcyAmJiBmaWVsZC5jaG9pY2VzLmxlbmd0aCA+IDApIG9wdGlvbi5jaG9pY2VzKGZpZWxkLmNob2ljZXMpO1xuICAgIGlmIChmYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGZpZWxkLmhlbHBEZWZhdWx0ICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgYWRkcmVzcyA9IGxpc3RlbkFkZHJlc3MoZmFsbGJhY2spO1xuICAgICAgb3B0aW9uLmRlZmF1bHQoZmFsbGJhY2ssIGFkZHJlc3MgPyBzaGFyZWRPcHRpb25zLmZvcm1hdExpc3RlbkFkZHJlc3MoYWRkcmVzcykgOiB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBpZiAoZmllbGQudHlwZSA9PT0gXCJhcnJheVwiKSB7XG4gICAgICBvcHRpb24uYXJnUGFyc2VyKCh2YWx1ZTogc3RyaW5nLCBwcmV2aW91czogdW5rbm93bikgPT5cbiAgICAgICAgcHJldmlvdXMgPT09IGZhbGxiYWNrIHx8ICFBcnJheS5pc0FycmF5KHByZXZpb3VzKSA/IFt2YWx1ZV0gOiBbLi4ucHJldmlvdXMsIHZhbHVlXSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbW1hbmQuYWRkT3B0aW9uKG9wdGlvbik7XG4gICAgaWYgKGZpZWxkLnR5cGUgPT09IFwiYm9vbGVhblwiICYmIG9wdGlvbi5sb25nKSB7XG4gICAgICBjb21tYW5kLmFkZE9wdGlvbihcbiAgICAgICAgbmV3IE9wdGlvbihgLS1uby0ke29wdGlvbi5sb25nLnNsaWNlKDIpfWAsIGBEaXNhYmxlICR7ZmllbGQuZGVzY3JpcHRpb24udG9Mb3dlckNhc2UoKX1gKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjb21tYW5kO1xufVxuXG4vKiogTWVyZ2UgQ0xJIHZhbHVlcyBvdmVyIGxheWVyZWQgY29uZmlnLCB0aGVuIHZhbGlkYXRlIGFuZCBkZWZhdWx0IHRocm91Z2ggWm9kLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQXJnczxUU2NoZW1hIGV4dGVuZHMgQ2xpT2JqZWN0U2NoZW1hPihcbiAgY29tbWFuZDogQ29tbWFuZCxcbiAgc2NoZW1hOiBUU2NoZW1hLFxuICBvcHRpb25zOiBDbGlBcmdzT3B0aW9ucyA9IGJvdW5kT3B0aW9ucy5nZXQoY29tbWFuZCkgPz8ge30sXG4pOiBSZXR1cm5UeXBlPFRTY2hlbWFbXCJwYXJzZVwiXT4ge1xuICBjb25zdCB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKHNjaGVtYSkpIHtcbiAgICBpZiAoY29tbWFuZC5nZXRPcHRpb25WYWx1ZVNvdXJjZShmaWVsZC5rZXkpID09PSBcImNsaVwiKSB7XG4gICAgICB2YWx1ZXNbZmllbGQua2V5XSA9IGNvbW1hbmQuZ2V0T3B0aW9uVmFsdWUoZmllbGQua2V5KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBzb3VyY2VkID0gY29uZmlnVmFsdWUoZmllbGQsIGZpZWxkRW52S2V5cyhmaWVsZCksIG9wdGlvbnMpO1xuICAgIGlmIChzb3VyY2VkICE9PSB1bmRlZmluZWQpIHZhbHVlc1tmaWVsZC5rZXldID0gc291cmNlZDtcbiAgfVxuICByZXR1cm4gc2NoZW1hLnBhcnNlKHZhbHVlcykgYXMgUmV0dXJuVHlwZTxUU2NoZW1hW1wicGFyc2VcIl0+O1xufVxuXG4vKiogQ29udmVydCBzY2hlbWEgZGVmYXVsdHMgb3IgY29uY3JldGUgb3B0aW9uIHZhbHVlcyBpbnRvIENvbW1hbmRlciBhcmd1bWVudHMuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplQXJncyhzb3VyY2U6IEFyZ3VtZW50U291cmNlKTogc3RyaW5nW10ge1xuICBpZiAoaXNDbGlPYmplY3RTY2hlbWEoc291cmNlKSkge1xuICAgIGNvbnN0IHZhbHVlcyA9IHNvdXJjZS5wYXJzZSh7fSkgYXMgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICAgIHJldHVybiBmaWVsZHMoc291cmNlKS5mbGF0TWFwKChmaWVsZCkgPT5cbiAgICAgIGZpZWxkLmZsYWcgPT09IGZhbHNlID8gW10gOiB2YWx1ZUFyZ3VtZW50cyhmaWVsZC5rZXksIHZhbHVlc1tmaWVsZC5rZXldKSxcbiAgICApO1xuICB9XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhzb3VyY2UpLmZsYXRNYXAoKFtrZXksIHZhbHVlXSkgPT4gdmFsdWVBcmd1bWVudHMoa2V5LCB2YWx1ZSkpO1xufVxuXG5mdW5jdGlvbiBmaWVsZHMoc2NoZW1hOiBDbGlPYmplY3RTY2hlbWEpOiBGaWVsZFtdIHtcbiAgY29uc3QgZG9jdW1lbnQgPSBzY2hlbWEudG9KU09OU2NoZW1hKCk7XG4gIGNvbnN0IHByb3BlcnRpZXMgPSBvYmplY3QuaXNSZWNvcmQoZG9jdW1lbnQpID8gZG9jdW1lbnQucHJvcGVydGllcyA6IHVuZGVmaW5lZDtcbiAgaWYgKCFvYmplY3QuaXNSZWNvcmQocHJvcGVydGllcykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiWm9kIENvbW1hbmRlciBiaW5kaW5nIHJlcXVpcmVzIGEgei5vYmplY3QoKSBzY2hlbWFcIik7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHByb3BlcnRpZXMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgaWYgKCFvYmplY3QuaXNSZWNvcmQodmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBDYW5ub3QgYmluZCBDTEkgYXJndW1lbnQgXCIke2tleX1cImApO1xuICAgIH1cbiAgICBjb25zdCBqc29uID0gdmFsdWUgYXMgSnNvbkZpZWxkO1xuICAgIGNvbnN0IGNob2ljZXMgPVxuICAgICAganNvbi5lbnVtPy5tYXAoU3RyaW5nKSA/PyAoanNvbi5jb25zdCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogW1N0cmluZyhqc29uLmNvbnN0KV0pO1xuICAgIHJldHVybiB7XG4gICAgICBrZXksXG4gICAgICBkZXNjcmlwdGlvbjogdHlwZW9mIGpzb24uZGVzY3JpcHRpb24gPT09IFwic3RyaW5nXCIgPyBqc29uLmRlc2NyaXB0aW9uIDogXCJcIixcbiAgICAgIHR5cGU6IGpzb24udHlwZSxcbiAgICAgIGNob2ljZXMsXG4gICAgICBmYWxsYmFjazoganNvbi5kZWZhdWx0LFxuICAgICAgZW52OiBqc29uLmVudixcbiAgICAgIGZsYWc6IGpzb24uZmxhZyxcbiAgICAgIGhlbHBEZWZhdWx0OiBqc29uLmhlbHBEZWZhdWx0LFxuICAgICAgc2hvcnQ6IGpzb24uc2hvcnQsXG4gICAgfTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzQ2xpT2JqZWN0U2NoZW1hKHZhbHVlOiBBcmd1bWVudFNvdXJjZSk6IHZhbHVlIGlzIENsaU9iamVjdFNjaGVtYSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUucGFyc2UgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgdmFsdWUudG9KU09OU2NoZW1hID09PSBcImZ1bmN0aW9uXCI7XG59XG5cbmZ1bmN0aW9uIGFyZ0ZsYWdzKGZpZWxkOiBGaWVsZCwgc2hvcnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGNvbnN0IGxvbmcgPSBgLS0ke3N0cmluZ1V0aWxzLnRvU2x1ZyhmaWVsZC5rZXkpfWA7XG4gIGNvbnN0IHZhbHVlID0gZmllbGQudHlwZSA9PT0gXCJib29sZWFuXCIgPyBcIlwiIDogXCIgPHZhbHVlPlwiO1xuICBpZiAoc2hvcnQpIHJldHVybiBgLSR7c2hvcnR9LCAke2xvbmd9JHt2YWx1ZX1gO1xuICByZXR1cm4gYCR7bG9uZ30ke3ZhbHVlfWA7XG59XG5cbmZ1bmN0aW9uIGZpZWxkU2hvcnRGbGFncyhmaWVsZHM6IHJlYWRvbmx5IEZpZWxkW10pOiBSZWFkb25seU1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBjb25zdCByZXNlcnZlZCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KFtbXCJoXCIsIFwiaGVscFwiXV0pO1xuICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgIGlmIChmaWVsZC5zaG9ydCA9PT0gZmFsc2UgfHwgZmllbGQuc2hvcnQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgaWYgKCEvXltBLVphLXpdJC8udGVzdChmaWVsZC5zaG9ydCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFNob3J0IGZsYWcgZm9yIFwiJHtmaWVsZC5rZXl9XCIgbXVzdCBiZSBvbmUgbGV0dGVyIG9yIGZhbHNlYCk7XG4gICAgfVxuICAgIGNvbnN0IHNob3J0ID0gZmllbGQuc2hvcnQudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBleGlzdGluZyA9IHJlc2VydmVkLmdldChzaG9ydCk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBTaG9ydCBmbGFnIC0ke3Nob3J0fSBpcyBzaGFyZWQgYnkgXCIke2V4aXN0aW5nfVwiIGFuZCBcIiR7ZmllbGQua2V5fVwiYCk7XG4gICAgfVxuICAgIHJlc2VydmVkLnNldChzaG9ydCwgZmllbGQua2V5KTtcbiAgICByZXN1bHQuc2V0KGZpZWxkLmtleSwgc2hvcnQpO1xuICB9XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBuZXcgTWFwPHN0cmluZywgRmllbGRbXT4oKTtcbiAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICBpZiAoZmllbGQuc2hvcnQgIT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgY29uc3Qgc2hvcnQgPSBbLi4uc3RyaW5nVXRpbHMudG9rZW5pemUoZmllbGQua2V5KV1bMF0/LlswXT8udG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIXNob3J0IHx8IHJlc2VydmVkLmhhcyhzaG9ydCkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IG1hdGNoaW5nID0gY2FuZGlkYXRlcy5nZXQoc2hvcnQpID8/IFtdO1xuICAgIG1hdGNoaW5nLnB1c2goZmllbGQpO1xuICAgIGNhbmRpZGF0ZXMuc2V0KHNob3J0LCBtYXRjaGluZyk7XG4gIH1cbiAgZm9yIChjb25zdCBbc2hvcnQsIG1hdGNoaW5nXSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgaWYgKG1hdGNoaW5nLmxlbmd0aCA9PT0gMSkgcmVzdWx0LnNldChtYXRjaGluZ1swXSEua2V5LCBzaG9ydCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZmllbGRFbnZLZXlzKGZpZWxkOiBGaWVsZCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiBmaWVsZC5lbnYgPT09IFwic3RyaW5nXCIpIHJldHVybiBbZmllbGQuZW52XTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQuZW52KSkgcmV0dXJuIFsuLi5maWVsZC5lbnZdO1xuICByZXR1cm4gY29uZmlnVXRpbHMuZW52aXJvbm1lbnRLZXlzKGZpZWxkLmtleSk7XG59XG5cbmZ1bmN0aW9uIGVudkFyZ05hbWUoZmllbGQ6IEZpZWxkLCBlbnZLZXlzOiByZWFkb25seSBzdHJpbmdbXSwgb3B0aW9uczogQ2xpQXJnc09wdGlvbnMpOiBzdHJpbmcge1xuICBpZiAoZmllbGQuZW52ICE9PSB1bmRlZmluZWQpIHJldHVybiBlbnZLZXlzWzBdID8/IFwiXCI7XG4gIGNvbnN0IGNhbm9uaWNhbCA9XG4gICAgZW52S2V5cy5maW5kKChrZXkpID0+IC9eW0EtWl1bQS1aMC05XSooX1tBLVowLTldKykrJC8udGVzdChrZXkpKSA/P1xuICAgIGVudktleXMuZmluZCgoa2V5KSA9PiBrZXkgPT09IGtleS50b1VwcGVyQ2FzZSgpICYmIC9bQS1aXS8udGVzdChrZXkpKSA/P1xuICAgIGVudktleXMuYXQoLTEpID8/XG4gICAgXCJcIjtcbiAgLy8gSGVscCBzaG93cyB0aGUgdW5zY29wZWQgbmFtZTsgY29uZmlnVXRpbHMgc3RpbGwgcmVhZHMgREJYX1RPT0xTXyBhbGlhc2VzLlxuICByZXR1cm4gY29uZmlnVXRpbHMubmFtZShjYW5vbmljYWwsIHsgLi4ub3B0aW9ucywgc2NvcGU6IFtdIH0pO1xufVxuXG5mdW5jdGlvbiBjb25maWdWYWx1ZShcbiAgZmllbGQ6IEZpZWxkLFxuICBlbnZLZXlzOiBzdHJpbmcgfCByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9uczogQ2xpQXJnc09wdGlvbnMsXG4pOiB1bmtub3duIHtcbiAgaWYgKGZpZWxkLnR5cGUgPT09IFwiYXJyYXlcIikge1xuICAgIGNvbnN0IHZhbHVlcyA9IGNvbmZpZ1V0aWxzLmxpc3QodW5kZWZpbmVkLCBlbnZLZXlzLCB1bmRlZmluZWQsIG9wdGlvbnMpO1xuICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoID4gMCA/IHZhbHVlcyA6IHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiBjb25maWdVdGlscy5ib29sZWFuKHVuZGVmaW5lZCwgZW52S2V5cywgb3B0aW9ucyk7XG4gIHJldHVybiBjb25maWdVdGlscy50ZXh0KGVudktleXMsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiB2YWx1ZUFyZ3VtZW50cyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSByZXR1cm4gW107XG4gIGNvbnN0IGZsYWcgPSBgLS0ke3N0cmluZ1V0aWxzLnRvU2x1ZyhrZXkpfWA7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSByZXR1cm4gW3ZhbHVlID8gZmxhZyA6IGAtLW5vLSR7ZmxhZy5zbGljZSgyKX1gXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLmZsYXRNYXAoKGVudHJ5KSA9PiBbZmxhZywgc2NhbGFyQXJndW1lbnQoa2V5LCBlbnRyeSldKTtcbiAgfVxuICByZXR1cm4gW2ZsYWcsIHNjYWxhckFyZ3VtZW50KGtleSwgdmFsdWUpXTtcbn1cblxuZnVuY3Rpb24gc2NhbGFyQXJndW1lbnQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJpZ2ludFwiKSB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cbiAgY29uc3QgYWRkcmVzcyA9IGxpc3RlbkFkZHJlc3ModmFsdWUpO1xuICBpZiAoYWRkcmVzcykgcmV0dXJuIHNoYXJlZE9wdGlvbnMuZm9ybWF0TGlzdGVuQWRkcmVzcyhhZGRyZXNzKTtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihgQ2Fubm90IHNlcmlhbGl6ZSBDTEkgYXJndW1lbnQgXCIke2tleX1cIiB3aXRoIGEgbm9uLXNjYWxhciB2YWx1ZWApO1xufVxuXG5mdW5jdGlvbiBsaXN0ZW5BZGRyZXNzKHZhbHVlOiB1bmtub3duKTogc2hhcmVkT3B0aW9ucy5MaXN0ZW5BZGRyZXNzIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFvYmplY3QuaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodmFsdWUuc2NoZW1lID09PSBcInRjcFwiICYmIHR5cGVvZiB2YWx1ZS5ob3N0ID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiB2YWx1ZS5wb3J0ID09PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIHsgc2NoZW1lOiBcInRjcFwiLCBob3N0OiB2YWx1ZS5ob3N0LCBwb3J0OiB2YWx1ZS5wb3J0IH07XG4gIH1cbiAgaWYgKHZhbHVlLnNjaGVtZSA9PT0gXCJ1bml4XCIgJiYgdHlwZW9mIHZhbHVlLnBhdGggPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4geyBzY2hlbWU6IFwidW5peFwiLCBwYXRoOiB2YWx1ZS5wYXRoIH07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -23,8 +23,8 @@
23
23
  "typescript": "^5.9.3"
24
24
  },
25
25
  "dependencies": {
26
- "@dbx-tools/core": "^0.9.105",
27
- "@dbx-tools/shared-core": "^0.9.105",
26
+ "@dbx-tools/core": "^0.9.108",
27
+ "@dbx-tools/shared-core": "^0.9.108",
28
28
  "commander": "^15.0.0",
29
29
  "zod": "4.3.6"
30
30
  },
@@ -46,7 +46,7 @@
46
46
  "./package.json": "./package.json"
47
47
  }
48
48
  },
49
- "version": "0.9.105",
49
+ "version": "0.9.108",
50
50
  "types": "./lib/index.d.ts",
51
51
  "dbxToolsConfig": {
52
52
  "tags": [
package/src/args.ts CHANGED
@@ -11,7 +11,6 @@
11
11
  import { configUtils } from "@dbx-tools/core";
12
12
  import { object, options as sharedOptions, stringUtils } from "@dbx-tools/shared-core";
13
13
  import { Command, Option } from "commander";
14
- import { z } from "zod";
15
14
 
16
15
  /** Layered config lookup used to resolve argument values and help defaults. */
17
16
  export type CliArgsOptions = configUtils.ConfigOptions;
@@ -24,10 +23,20 @@ export interface CliArgMeta {
24
23
  readonly flag?: boolean;
25
24
  /** Set false to keep schema and configured defaults out of generated help. */
26
25
  readonly helpDefault?: boolean;
26
+ /** One-character short flag without a dash, or false to disable automatic generation. */
27
+ readonly short?: string | false;
28
+ }
29
+
30
+ /** Structural Zod object contract that remains compatible across Zod v4 minors. */
31
+ export interface CliObjectSchema<
32
+ TOutput extends Readonly<Record<string, unknown>> = Readonly<Record<string, unknown>>,
33
+ > {
34
+ parse(value: unknown): TOutput;
35
+ toJSONSchema(): unknown;
27
36
  }
28
37
 
29
38
  /** Zod defaults or concrete option values serialized by {@link serializeArgs}. */
30
- export type ArgumentSource = z.ZodObject<z.ZodRawShape> | Readonly<Record<string, unknown>>;
39
+ export type ArgumentSource = CliObjectSchema | Readonly<Record<string, unknown>>;
31
40
 
32
41
  interface JsonField extends CliArgMeta {
33
42
  type?: string;
@@ -48,17 +57,19 @@ interface Field extends CliArgMeta {
48
57
  const boundOptions = new WeakMap<Command, CliArgsOptions>();
49
58
 
50
59
  /** Register Commander arguments for every enabled field on a Zod object schema. */
51
- export function addArgs<T extends z.ZodRawShape>(
60
+ export function addArgs<TSchema extends CliObjectSchema>(
52
61
  command: Command,
53
- schema: z.ZodObject<T>,
62
+ schema: TSchema,
54
63
  options: CliArgsOptions = {},
55
64
  ): Command {
56
65
  boundOptions.set(command, options);
57
- for (const field of fields(schema)) {
66
+ const schemaFields = fields(schema);
67
+ const shortFlags = fieldShortFlags(schemaFields);
68
+ for (const field of schemaFields) {
58
69
  if (field.flag === false) continue;
59
70
  const envKeys = fieldEnvKeys(field);
60
71
  const envName = envArgName(field, envKeys, options);
61
- const flags = argFlags(field);
72
+ const flags = argFlags(field, shortFlags.get(field.key));
62
73
  const sourced = configValue(field, envKeys, options);
63
74
  const fallback = sourced ?? field.fallback;
64
75
  const option = new Option(flags, field.description);
@@ -87,11 +98,11 @@ export function addArgs<T extends z.ZodRawShape>(
87
98
  }
88
99
 
89
100
  /** Merge CLI values over layered config, then validate and default through Zod. */
90
- export function parseArgs<T extends z.ZodRawShape>(
101
+ export function parseArgs<TSchema extends CliObjectSchema>(
91
102
  command: Command,
92
- schema: z.ZodObject<T>,
103
+ schema: TSchema,
93
104
  options: CliArgsOptions = boundOptions.get(command) ?? {},
94
- ): z.output<z.ZodObject<T>> {
105
+ ): ReturnType<TSchema["parse"]> {
95
106
  const values: Record<string, unknown> = {};
96
107
  for (const field of fields(schema)) {
97
108
  if (command.getOptionValueSource(field.key) === "cli") {
@@ -101,12 +112,12 @@ export function parseArgs<T extends z.ZodRawShape>(
101
112
  const sourced = configValue(field, fieldEnvKeys(field), options);
102
113
  if (sourced !== undefined) values[field.key] = sourced;
103
114
  }
104
- return schema.parse(values);
115
+ return schema.parse(values) as ReturnType<TSchema["parse"]>;
105
116
  }
106
117
 
107
118
  /** Convert schema defaults or concrete option values into Commander arguments. */
108
119
  export function serializeArgs(source: ArgumentSource): string[] {
109
- if (source instanceof z.ZodObject) {
120
+ if (isCliObjectSchema(source)) {
110
121
  const values = source.parse({}) as Readonly<Record<string, unknown>>;
111
122
  return fields(source).flatMap((field) =>
112
123
  field.flag === false ? [] : valueArguments(field.key, values[field.key]),
@@ -115,8 +126,8 @@ export function serializeArgs(source: ArgumentSource): string[] {
115
126
  return Object.entries(source).flatMap(([key, value]) => valueArguments(key, value));
116
127
  }
117
128
 
118
- function fields(schema: z.ZodObject<z.ZodRawShape>): Field[] {
119
- const document = z.toJSONSchema(schema);
129
+ function fields(schema: CliObjectSchema): Field[] {
130
+ const document = schema.toJSONSchema();
120
131
  const properties = object.isRecord(document) ? document.properties : undefined;
121
132
  if (!object.isRecord(properties)) {
122
133
  throw new TypeError("Zod Commander binding requires a z.object() schema");
@@ -137,13 +148,51 @@ function fields(schema: z.ZodObject<z.ZodRawShape>): Field[] {
137
148
  env: json.env,
138
149
  flag: json.flag,
139
150
  helpDefault: json.helpDefault,
151
+ short: json.short,
140
152
  };
141
153
  });
142
154
  }
143
155
 
144
- function argFlags(field: Field): string {
145
- const flag = `--${stringUtils.toSlug(field.key)}`;
146
- return field.type === "boolean" ? flag : `${flag} <value>`;
156
+ function isCliObjectSchema(value: ArgumentSource): value is CliObjectSchema {
157
+ return typeof value.parse === "function" && typeof value.toJSONSchema === "function";
158
+ }
159
+
160
+ function argFlags(field: Field, short: string | undefined): string {
161
+ const long = `--${stringUtils.toSlug(field.key)}`;
162
+ const value = field.type === "boolean" ? "" : " <value>";
163
+ if (short) return `-${short}, ${long}${value}`;
164
+ return `${long}${value}`;
165
+ }
166
+
167
+ function fieldShortFlags(fields: readonly Field[]): ReadonlyMap<string, string> {
168
+ const result = new Map<string, string>();
169
+ const reserved = new Map<string, string>([["h", "help"]]);
170
+ for (const field of fields) {
171
+ if (field.short === false || field.short === undefined) continue;
172
+ if (!/^[A-Za-z]$/.test(field.short)) {
173
+ throw new TypeError(`Short flag for "${field.key}" must be one letter or false`);
174
+ }
175
+ const short = field.short.toLowerCase();
176
+ const existing = reserved.get(short);
177
+ if (existing) {
178
+ throw new TypeError(`Short flag -${short} is shared by "${existing}" and "${field.key}"`);
179
+ }
180
+ reserved.set(short, field.key);
181
+ result.set(field.key, short);
182
+ }
183
+ const candidates = new Map<string, Field[]>();
184
+ for (const field of fields) {
185
+ if (field.short !== undefined) continue;
186
+ const short = [...stringUtils.tokenize(field.key)][0]?.[0]?.toLowerCase();
187
+ if (!short || reserved.has(short)) continue;
188
+ const matching = candidates.get(short) ?? [];
189
+ matching.push(field);
190
+ candidates.set(short, matching);
191
+ }
192
+ for (const [short, matching] of candidates) {
193
+ if (matching.length === 1) result.set(matching[0]!.key, short);
194
+ }
195
+ return result;
147
196
  }
148
197
 
149
198
  function fieldEnvKeys(field: Field): readonly string[] {