strict-env-resolver 0.5.4 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,14 +1,15 @@
1
1
  {
2
2
  "name": "dev-strict-env-resolver",
3
- "image": "mcr.microsoft.com/devcontainers/base:bookworm",
3
+ "image": "mcr.microsoft.com/devcontainers/base:trixie",
4
4
  "features": {
5
5
  "ghcr.io/devcontainers/features/common-utils:2": {
6
6
  "username": "developer",
7
7
  "upgradePackages": true
8
8
  },
9
9
  "ghcr.io/devcontainers/features/git:1": {},
10
- "ghcr.io/devcontainers/features/node:1": {
11
- "version": "24"
10
+ "ghcr.io/devcontainers/features/node:2": {
11
+ "version": "24",
12
+ "npmVersion": "12"
12
13
  }
13
14
  },
14
15
  "workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind",
package/lib/index.d.ts CHANGED
@@ -1,44 +1,55 @@
1
1
  /**
2
2
  * Spec for a string environment variable.
3
- * Returned as-is by default (`trim` defaults to `false`). Set `trim: true` in options to trim
4
- * whitespace and treat whitespace-only values as missing.
5
- * The default value is passed via the third argument of `resolve` or a `[spec, options]` tuple in `resolveAll`, not in the spec.
3
+ * Values are returned as-is unless `trim: true` is set in {@link StrictEnvOptions}
4
+ * (whitespace-only values are then treated as missing).
5
+ * Defaults belong in {@link StrictEnvOptions}, not on this spec.
6
6
  */
7
7
  export type StrictEnvTypeString = {
8
8
  type: 'string';
9
- default?: string;
9
+ };
10
+ /**
11
+ * Optional constraints for a numeric environment variable spec.
12
+ * Used by {@link StrictEnvType.Number} when called as a factory, and by sugar specs
13
+ * such as {@link StrictEnvType.PositiveInt} / {@link StrictEnvType.NegativeInt}.
14
+ */
15
+ export type StrictEnvNumberConstraints = {
16
+ /** Inclusive lower bound. */
17
+ min?: number;
18
+ /** Inclusive upper bound. */
19
+ max?: number;
20
+ /** When `true`, the value must be an integer (`Number.isInteger`). */
21
+ integer?: boolean;
10
22
  };
11
23
  /**
12
24
  * Spec for a numeric environment variable.
13
25
  * Values are parsed with `Number()`; `NaN`, `Infinity`, and `-Infinity` are rejected.
14
- * The default value is passed via the third argument of `resolve` or a `[spec, options]` tuple in `resolveAll`, not in the spec.
26
+ * Optional {@link StrictEnvNumberConstraints} (`min`, `max`, `integer`) narrow accepted values.
27
+ * Defaults belong in {@link StrictEnvOptions}, not on this spec.
15
28
  */
16
29
  export type StrictEnvTypeNumber = {
17
30
  type: 'number';
18
- default?: number;
19
- };
31
+ } & StrictEnvNumberConstraints;
20
32
  /**
21
33
  * Spec for a boolean environment variable.
22
- * Parses `1`, `true`, `yes`, `on` (case-insensitive, after trim) as `true`; any other non-empty value as `false`.
23
- * Trims leading/trailing whitespace by default (see `StrictEnvOptions.trim`).
24
- * The default value is passed via the third argument of `resolve` or a `[spec, options]` tuple in `resolveAll`, not in the spec.
34
+ * Parses `1`, `true`, `yes`, `on` (case-insensitive, after normalization) as `true`;
35
+ * any other non-empty value as `false`.
36
+ * Trims leading/trailing whitespace by default (see {@link StrictEnvOptions.trim}).
37
+ * Defaults belong in {@link StrictEnvOptions}, not on this spec.
25
38
  */
26
39
  export type StrictEnvTypeBoolean = {
27
40
  type: 'boolean';
28
- default?: boolean;
29
41
  };
30
42
  /**
31
43
  * Spec for an enum environment variable with a fixed set of choices.
32
- * The value must be one of `choices` (compared after trim); otherwise validation fails.
33
- * Trims leading/trailing whitespace by default (see `StrictEnvOptions.trim`).
34
- * The default value is passed via the third argument of `resolve` or a `[spec, options]` tuple in `resolveAll`, not in the spec.
44
+ * The value must be one of `choices` (compared after normalization); otherwise validation fails.
45
+ * Trims leading/trailing whitespace by default (see {@link StrictEnvOptions.trim}).
46
+ * Defaults belong in {@link StrictEnvOptions}, not on this spec.
35
47
  *
36
48
  * @template T - Literal string union of allowed values.
37
49
  */
38
50
  export type StrictEnvTypeEnum<T extends string = string> = {
39
51
  type: 'enum';
40
52
  choices: readonly T[];
41
- default?: T;
42
53
  };
43
54
  /** Union of all environment variable spec types. */
44
55
  export type StrictEnvSpec = StrictEnvTypeString | StrictEnvTypeNumber | StrictEnvTypeBoolean | StrictEnvTypeEnum;
@@ -46,7 +57,8 @@ export type StrictEnvSpec = StrictEnvTypeString | StrictEnvTypeNumber | StrictEn
46
57
  * Discriminated union of error kinds emitted during environment variable parsing.
47
58
  *
48
59
  * - `missing` — Variable unset, empty string, or whitespace-only (when trim is enabled) without a default.
49
- * - `invalid_number` — Value is not a finite number (see `StrictEnvTypeNumber`).
60
+ * - `invalid_number` — Value is not a finite number, not an integer when required, or outside `min`/`max`
61
+ * (see {@link StrictEnvTypeNumber}).
50
62
  * - `invalid_enum` — Value is not one of the allowed enum choices.
51
63
  */
52
64
  export type StrictEnvErrorKind = 'missing' | 'invalid_number' | 'invalid_enum';
@@ -118,9 +130,23 @@ export declare class StrictEnvValidationError<K extends string = string> extends
118
130
  */
119
131
  constructor(errors: readonly StrictEnvValidationEntry<K>[]);
120
132
  }
133
+ /**
134
+ * Unconstrained finite-number spec, also callable as a factory for constrained specs.
135
+ *
136
+ * @example
137
+ * ```ts
138
+ * StrictEnvType.Number
139
+ * StrictEnvType.Number({ min: 0 })
140
+ * StrictEnvType.Number({ min: 1, max: 65535, integer: true })
141
+ * ```
142
+ */
143
+ type StrictEnvNumberSpecFactory = {
144
+ (constraints?: StrictEnvNumberConstraints): StrictEnvTypeNumber;
145
+ } & StrictEnvTypeNumber;
121
146
  /**
122
147
  * Predefined spec constants for use with `resolve` or as schema values in `resolveAll`.
123
- * Provide defaults via the third argument of `resolve` or a `[spec, { default }]` tuple in `resolveAll`.
148
+ * Specs describe type only; provide `default` / `trim` via {@link StrictEnvOptions}
149
+ * (third argument of `resolve`, or a `[spec, options]` tuple in `resolveAll`).
124
150
  */
125
151
  export declare const StrictEnvType: {
126
152
  /** Spec for a string value (returned as-is unless `trim: true` is set in options). */
@@ -129,10 +155,17 @@ export declare const StrictEnvType: {
129
155
  };
130
156
  /**
131
157
  * Spec for a finite numeric value (`Number()` parsing; rejects `NaN` and `Infinity`).
158
+ * Use as `StrictEnvType.Number`, or call as `StrictEnvType.Number({ min, max, integer })`.
132
159
  */
133
- readonly Number: {
134
- readonly type: "number";
135
- };
160
+ readonly Number: StrictEnvNumberSpecFactory;
161
+ /**
162
+ * Spec for a positive integer (`>= 1`). Sugar for `Number({ min: 1, integer: true })`.
163
+ */
164
+ readonly PositiveInt: StrictEnvTypeNumber;
165
+ /**
166
+ * Spec for a negative integer (`<= -1`). Sugar for `Number({ max: -1, integer: true })`.
167
+ */
168
+ readonly NegativeInt: StrictEnvTypeNumber;
136
169
  /** Spec for a boolean value (`1`/`true`/`yes`/`on` → `true`; other non-empty values → `false`). */
137
170
  readonly Boolean: {
138
171
  readonly type: "boolean";
@@ -160,6 +193,7 @@ export type StrictEnvSpecToType<S> = S extends StrictEnvTypeString ? string : S
160
193
  * @template S - Environment variable spec type.
161
194
  */
162
195
  export type StrictEnvOptions<S extends StrictEnvSpec> = {
196
+ /** Fallback when the variable is unset, empty (`""`), or whitespace-only (when `trim` is enabled). */
163
197
  default?: StrictEnvSpecToType<S>;
164
198
  /** When `true`, trims leading/trailing whitespace before validation. */
165
199
  trim?: boolean;
@@ -167,13 +201,14 @@ export type StrictEnvOptions<S extends StrictEnvSpec> = {
167
201
  /**
168
202
  * Schema entry for a single env var.
169
203
  *
170
- * Either provide a spec directly, or a tuple of `[spec, options]` to attach a default.
204
+ * Either a spec alone, or a `[spec, options]` tuple to attach {@link StrictEnvOptions}
205
+ * (for example `default` and/or `trim`).
171
206
  */
172
207
  export type StrictEnvSchemaEntry<S extends StrictEnvSpec = StrictEnvSpec> = S | readonly [S, StrictEnvOptions<S>];
173
208
  /**
174
209
  * Schema object used by `resolveAll()`.
175
210
  *
176
- * Keys are env var names, values are specs (optionally with defaults).
211
+ * Keys are env var names; values are specs or `[spec, options]` tuples.
177
212
  */
178
213
  export type StrictEnvSchema = Record<string, StrictEnvSchemaEntry>;
179
214
  /**
@@ -195,9 +230,9 @@ export type StrictEnvSchemaToType<TSchema extends StrictEnvSchema> = {
195
230
  *
196
231
  * @example
197
232
  * ```ts
198
- * const port = StrictEnvResolver.resolve('PORT', StrictEnvType.Number);
233
+ * const port = StrictEnvResolver.resolve('PORT', StrictEnvType.PositiveInt);
199
234
  * const envs = StrictEnvResolver.resolveAll({
200
- * PORT: StrictEnvType.Number,
235
+ * PORT: StrictEnvType.PositiveInt,
201
236
  * DEBUG: [StrictEnvType.Boolean, { default: false }],
202
237
  * });
203
238
  * ```
package/lib/index.js CHANGED
@@ -9,7 +9,7 @@ const TRUE_BOOLEAN_PATTERN = /^(1|true|yes|on)$/i;
9
9
  /**
10
10
  * Parses a string as a finite number for environment variables.
11
11
  *
12
- * @param raw - Trimmed environment variable value.
12
+ * @param raw - Normalized environment variable value (trimmed when `trim` is enabled).
13
13
  * @returns Parsed number, or `undefined` when the value is not a finite number.
14
14
  */
15
15
  const parseNumber = (raw) => {
@@ -20,9 +20,9 @@ const parseNumber = (raw) => {
20
20
  return n;
21
21
  };
22
22
  /**
23
- * Parses a trimmed string as a boolean environment variable value.
23
+ * Parses a normalized string as a boolean environment variable value.
24
24
  *
25
- * @param normalizedRaw - Trimmed raw environment variable value.
25
+ * @param normalizedRaw - Normalized environment variable value (trimmed when `trim` is enabled).
26
26
  * @returns `true` for `1`/`true`/`yes`/`on` (case-insensitive); otherwise `false`.
27
27
  */
28
28
  const parseBooleanEnvValue = (normalizedRaw) => TRUE_BOOLEAN_PATTERN.test(normalizedRaw);
@@ -85,17 +85,40 @@ class StrictEnvValidationError extends StrictEnvError {
85
85
  }
86
86
  }
87
87
  exports.StrictEnvValidationError = StrictEnvValidationError;
88
+ /**
89
+ * Builds a numeric env spec from optional constraints.
90
+ *
91
+ * @param constraints - Optional `min`, `max`, and/or `integer` bounds.
92
+ * @returns Number spec for use with `resolve` or `resolveAll`.
93
+ */
94
+ const createNumberSpec = (constraints) => ({
95
+ type: 'number',
96
+ ...(constraints?.min !== undefined ? { min: constraints.min } : {}),
97
+ ...(constraints?.max !== undefined ? { max: constraints.max } : {}),
98
+ ...(constraints?.integer !== undefined ? { integer: constraints.integer } : {}),
99
+ });
100
+ const NumberSpec = Object.assign((constraints) => createNumberSpec(constraints), { type: 'number' });
88
101
  /**
89
102
  * Predefined spec constants for use with `resolve` or as schema values in `resolveAll`.
90
- * Provide defaults via the third argument of `resolve` or a `[spec, { default }]` tuple in `resolveAll`.
103
+ * Specs describe type only; provide `default` / `trim` via {@link StrictEnvOptions}
104
+ * (third argument of `resolve`, or a `[spec, options]` tuple in `resolveAll`).
91
105
  */
92
106
  exports.StrictEnvType = {
93
107
  /** Spec for a string value (returned as-is unless `trim: true` is set in options). */
94
108
  String: { type: 'string' },
95
109
  /**
96
110
  * Spec for a finite numeric value (`Number()` parsing; rejects `NaN` and `Infinity`).
111
+ * Use as `StrictEnvType.Number`, or call as `StrictEnvType.Number({ min, max, integer })`.
112
+ */
113
+ Number: NumberSpec,
114
+ /**
115
+ * Spec for a positive integer (`>= 1`). Sugar for `Number({ min: 1, integer: true })`.
97
116
  */
98
- Number: { type: 'number' },
117
+ PositiveInt: createNumberSpec({ min: 1, integer: true }),
118
+ /**
119
+ * Spec for a negative integer (`<= -1`). Sugar for `Number({ max: -1, integer: true })`.
120
+ */
121
+ NegativeInt: createNumberSpec({ max: -1, integer: true }),
99
122
  /** Spec for a boolean value (`1`/`true`/`yes`/`on` → `true`; other non-empty values → `false`). */
100
123
  Boolean: { type: 'boolean' },
101
124
  /**
@@ -130,6 +153,38 @@ const normalizeEnvRaw = (raw, trim) => {
130
153
  }
131
154
  return raw.trim();
132
155
  };
156
+ /**
157
+ * Validates a parsed number against optional {@link StrictEnvNumberConstraints}.
158
+ *
159
+ * @template K - Environment variable key type.
160
+ * @param key - Environment variable name.
161
+ * @param raw - Raw value from `process.env`, if present.
162
+ * @param n - Parsed finite number.
163
+ * @param constraints - Optional `min`, `max`, and/or `integer` constraints.
164
+ * @returns `undefined` when valid; otherwise a structured validation error.
165
+ */
166
+ const validateNumberConstraints = (key, raw, n, constraints) => {
167
+ if (constraints.integer === true && !Number.isInteger(n)) {
168
+ return { key, message: `Env ${key}: expected integer, got "${raw}"`, raw, kind: 'invalid_number' };
169
+ }
170
+ if (constraints.min !== undefined && n < constraints.min) {
171
+ return {
172
+ key,
173
+ message: `Env ${key}: must be >= ${constraints.min}, got ${n}`,
174
+ raw,
175
+ kind: 'invalid_number',
176
+ };
177
+ }
178
+ if (constraints.max !== undefined && n > constraints.max) {
179
+ return {
180
+ key,
181
+ message: `Env ${key}: must be <= ${constraints.max}, got ${n}`,
182
+ raw,
183
+ kind: 'invalid_number',
184
+ };
185
+ }
186
+ return undefined;
187
+ };
133
188
  /**
134
189
  * Resolves a schema entry into its spec and optional per-key options.
135
190
  *
@@ -147,16 +202,17 @@ const resolveSchemaEntry = (entry) => ({
147
202
  * callers decide whether to throw immediately or collect errors.
148
203
  *
149
204
  * Missing or empty (`""`) values use `defaultValue` when provided. When `trim` is enabled,
150
- * whitespace-only values are treated as empty. Number specs delegate to `parseNumber`.
151
- * Boolean specs treat `1`/`true`/`yes`/`on` (case-insensitive, after trim) as `true`.
152
- * Enum specs require an exact match in `choices` (after trim).
205
+ * whitespace-only values are treated as empty. Number specs delegate to `parseNumber`, then
206
+ * optional `min` / `max` / `integer` constraints (see {@link StrictEnvNumberConstraints}).
207
+ * Boolean specs treat `1`/`true`/`yes`/`on` (case-insensitive, after normalization) as `true`.
208
+ * Enum specs require an exact match in `choices` (after normalization).
153
209
  *
154
210
  * @template K - Environment variable key type.
155
211
  * @template S - Environment variable spec type.
156
212
  * @param key - Environment variable name.
157
213
  * @param spec - Type spec for the value.
158
214
  * @param raw - Raw value from `process.env`, if present.
159
- * @param defaultValue - Fallback when `raw` is missing or empty.
215
+ * @param defaultValue - Fallback from {@link StrictEnvOptions.default} when `raw` is missing or empty.
160
216
  * @param options - Optional trim override (`trim` defaults per spec type).
161
217
  * @returns Parsed value or a structured validation error.
162
218
  */
@@ -182,6 +238,10 @@ const parseEnvValue = (key, spec, raw, defaultValue, options) => {
182
238
  error: { key, message: `Env ${key}: expected number, got "${raw}"`, raw, kind: 'invalid_number' },
183
239
  };
184
240
  }
241
+ const constraintError = validateNumberConstraints(key, raw, n, spec);
242
+ if (constraintError !== undefined) {
243
+ return { ok: false, error: constraintError };
244
+ }
185
245
  return { ok: true, value: n };
186
246
  }
187
247
  case 'boolean':
@@ -208,7 +268,8 @@ const parseEnvValue = (key, spec, raw, defaultValue, options) => {
208
268
  *
209
269
  * Delegates validation to `parseEnvValue`. Missing or empty (`""`) values use
210
270
  * `options.default` when provided; otherwise a `StrictEnvValidationError` is thrown.
211
- * For `StrictEnvType.Number`, values are parsed as finite numbers (see `StrictEnvTypeNumber`).
271
+ * Whitespace-only values are treated as missing when `trim` is enabled.
272
+ * For `StrictEnvType.Number`, values are parsed as finite numbers (see {@link StrictEnvTypeNumber}).
212
273
  *
213
274
  * @template K - Environment variable key type.
214
275
  * @template S - Environment variable spec type.
@@ -216,7 +277,8 @@ const parseEnvValue = (key, spec, raw, defaultValue, options) => {
216
277
  * @param spec - Type spec; defaults to `StrictEnvType.String` when omitted.
217
278
  * @param options - Optional `{ default, trim }`; see {@link StrictEnvOptions}.
218
279
  * @returns Parsed value with type inferred from `spec`.
219
- * @throws {StrictEnvValidationError} When the variable is missing, empty without a default, or invalid for the spec.
280
+ * @throws {StrictEnvValidationError} When the variable is missing, empty without a default,
281
+ * whitespace-only without a default (when trimming), or invalid for the spec.
220
282
  */
221
283
  const resolve = (key, spec = exports.StrictEnvType.String, options) => {
222
284
  const result = parseEnvValue(key, spec, process.env[key], options?.default, options);
@@ -233,9 +295,11 @@ const resolve = (key, spec = exports.StrictEnvType.String, options) => {
233
295
  * Number specs use the same finite-number rules as `resolve`.
234
296
  *
235
297
  * @template TSchema - Schema object type.
236
- * @param schema - Map of environment variable names to specs, optionally with per-key defaults via `[spec, { default }]`.
298
+ * @param schema - Map of environment variable names to specs or `[spec, options]` tuples
299
+ * (see {@link StrictEnvOptions} for per-key `default` / `trim`).
237
300
  * @returns Parsed environment object with types inferred from the schema.
238
- * @throws {StrictEnvValidationError} When one or more variables are missing, empty without a default, or invalid.
301
+ * @throws {StrictEnvValidationError} When one or more variables are missing, empty without a default,
302
+ * whitespace-only without a default (when trimming), or invalid.
239
303
  */
240
304
  const resolveAll = (schema) => {
241
305
  const envs = {};
@@ -258,9 +322,9 @@ const resolveAll = (schema) => {
258
322
  *
259
323
  * @example
260
324
  * ```ts
261
- * const port = StrictEnvResolver.resolve('PORT', StrictEnvType.Number);
325
+ * const port = StrictEnvResolver.resolve('PORT', StrictEnvType.PositiveInt);
262
326
  * const envs = StrictEnvResolver.resolveAll({
263
- * PORT: StrictEnvType.Number,
327
+ * PORT: StrictEnvType.PositiveInt,
264
328
  * DEBUG: [StrictEnvType.Boolean, { default: false }],
265
329
  * });
266
330
  * ```
@@ -271,4 +335,4 @@ exports.StrictEnvResolver = {
271
335
  /** Reads and parses multiple environment variables in one pass. See {@link resolveAll}. */
272
336
  resolveAll,
273
337
  };
274
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBZUE7OztHQUdHO0FBQ0gsTUFBTSxvQkFBb0IsR0FBRyxvQkFBb0IsQ0FBQztBQUVsRDs7Ozs7R0FLRztBQUNILE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBVyxFQUFzQixFQUFFO0lBQ3RELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUMsQ0FBQztBQUVGOzs7OztHQUtHO0FBQ0gsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLGFBQXFCLEVBQVcsRUFBRSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztBQW9EMUc7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQXNCLGNBQWUsU0FBUSxLQUFLO0lBQ2hEOztPQUVHO0lBQ0gsWUFBc0IsT0FBZTtRQUNuQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7Q0FDRjtBQVJELHdDQVFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFhLHdCQUFvRCxTQUFRLGNBQWM7SUFDckY7Ozs7OztPQU1HO0lBQ0ksTUFBTSxDQUFDLE1BQU0sQ0FBbUIsTUFBOEM7UUFDbkYsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxD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LEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3JGLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDZixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixTQUFTO1FBQ1gsQ0FBQztRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBbUQsQ0FBQztJQUN6RSxDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxNQUFNLElBQUksd0JBQXdCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEUsT0FBTyxJQUFzQyxDQUFDO0FBQ2hELENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7OztHQVdHO0FBQ1UsUUFBQSxpQkFBaUIsR0FBRztJQUMvQiwyRUFBMkU7SUFDM0UsT0FBTztJQUNQLDJGQUEyRjtJQUMzRixVQUFVO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3BlYyBmb3IgYSBzdHJpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKiBSZXR1cm5lZCBhcy1pcyBieSBkZWZhdWx0IChgdHJpbWAgZGVmYXVsdHMgdG8gYGZhbHNlYCkuIFNldCBgdHJpbTogdHJ1ZWAgaW4gb3B0aW9ucyB0byB0cmltXG4gKiB3aGl0ZXNwYWNlIGFuZCB0cmVhdCB3aGl0ZXNwYWNlLW9ubHkgdmFsdWVzIGFzIG1pc3NpbmcuXG4gKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBwYXNzZWQgdmlhIHRoZSB0aGlyZCBhcmd1bWVudCBvZiBgcmVzb2x2ZWAgb3IgYSBgW3NwZWMsIG9wdGlvbnNdYCB0dXBsZSBpbiBgcmVzb2x2ZUFsbGAsIG5vdCBpbiB0aGUgc3BlYy5cbiAqL1xuZXhwb3J0IHR5cGUgU3RyaWN0RW52VHlwZVN0cmluZyA9IHsgdHlwZTogJ3N0cmluZyc7IGRlZmF1bHQ/OiBzdHJpbmcgfTtcblxuLyoqXG4gKiBTcGVjIGZvciBhIG51bWVyaWMgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKiBWYWx1ZXMgYXJlIHBhcnNlZCB3aXRoIGBOdW1iZXIoKWA7IGBOYU5gLCBgSW5maW5pdHlgLCBhbmQgYC1JbmZpbml0eWAgYXJlIHJlamVjdGVkLlxuICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgcGFzc2VkIHZpYSB0aGUgdGhpcmQgYXJndW1lbnQgb2YgYHJlc29sdmVgIG9yIGEgYFtzcGVjLCBvcHRpb25zXWAgdHVwbGUgaW4gYHJlc29sdmVBbGxgLCBub3QgaW4gdGhlIHNwZWMuXG4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdEVudlR5cGVOdW1iZXIgPSB7IHR5cGU6ICdudW1iZXInOyBkZWZhdWx0PzogbnVtYmVyIH07XG5cbi8qKlxuICogUGF0dGVybiBmb3IgYm9vbGVhbiBlbnYgdmFsdWVzIHRoYXQgcGFyc2UgYXMgYHRydWVgLlxuICogTWF0Y2hlcyBgMWAsIGB0cnVlYCwgYHllc2AsIGFuZCBgb25gIChjYXNlLWluc2Vuc2l0aXZlKSBvbiB0aGUgZnVsbCB0cmltbWVkIHN0cmluZy5cbiAqL1xuY29uc3QgVFJVRV9CT09MRUFOX1BBVFRFUk4gPSAvXigxfHRydWV8eWVzfG9uKSQvaTtcblxuLyoqXG4gKiBQYXJzZXMgYSBzdHJpbmcgYXMgYSBmaW5pdGUgbnVtYmVyIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKlxuICogQHBhcmFtIHJhdyAtIFRyaW1tZWQgZW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWUuXG4gKiBAcmV0dXJucyBQYXJzZWQgbnVtYmVyLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSB2YWx1ZSBpcyBub3QgYSBmaW5pdGUgbnVtYmVyLlxuICovXG5jb25zdCBwYXJzZU51bWJlciA9IChyYXc6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IG4gPSBOdW1iZXIocmF3KTtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobikpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBuO1xufTtcblxuLyoqXG4gKiBQYXJzZXMgYSB0cmltbWVkIHN0cmluZyBhcyBhIGJvb2xlYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWUuXG4gKlxuICogQHBhcmFtIG5vcm1hbGl6ZWRSYXcgLSBUcmltbWVkIHJhdyBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZS5cbiAqIEByZXR1cm5zIGB0cnVlYCBmb3IgYDFgL2B0cnVlYC9geWVzYC9gb25gIChjYXNlLWluc2Vuc2l0aXZlKTsgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gKi9cbmNvbnN0IHBhcnNlQm9vbGVhbkVudlZhbHVlID0gKG5vcm1hbGl6ZWRSYXc6IHN0cmluZyk6IGJvb2xlYW4gPT4gVFJVRV9CT09MRUFOX1BBVFRFUk4udGVzdChub3JtYWxpemVkUmF3KTtcblxuLyoqXG4gKiBTcGVjIGZvciBhIGJvb2xlYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKiBQYXJzZXMgYDFgLCBgdHJ1ZWAsIGB5ZXNgLCBgb25gIChjYXNlLWluc2Vuc2l0aXZlLCBhZnRlciB0cmltKSBhcyBgdHJ1ZWA7IGFueSBvdGhlciBub24tZW1wdHkgdmFsdWUgYXMgYGZhbHNlYC5cbiAqIFRyaW1zIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZSBieSBkZWZhdWx0IChzZWUgYFN0cmljdEVudk9wdGlvbnMudHJpbWApLlxuICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgcGFzc2VkIHZpYSB0aGUgdGhpcmQgYXJndW1lbnQgb2YgYHJlc29sdmVgIG9yIGEgYFtzcGVjLCBvcHRpb25zXWAgdHVwbGUgaW4gYHJlc29sdmVBbGxgLCBub3QgaW4gdGhlIHNwZWMuXG4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdEVudlR5cGVCb29sZWFuID0geyB0eXBlOiAnYm9vbGVhbic7IGRlZmF1bHQ/OiBib29sZWFuIH07XG5cbi8qKlxuICogU3BlYyBmb3IgYW4gZW51bSBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aXRoIGEgZml4ZWQgc2V0IG9mIGNob2ljZXMuXG4gKiBUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgYGNob2ljZXNgIChjb21wYXJlZCBhZnRlciB0cmltKTsgb3RoZXJ3aXNlIHZhbGlkYXRpb24gZmFpbHMuXG4gKiBUcmltcyBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UgYnkgZGVmYXVsdCAoc2VlIGBTdHJpY3RFbnZPcHRpb25zLnRyaW1gKS5cbiAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHBhc3NlZCB2aWEgdGhlIHRoaXJkIGFyZ3VtZW50IG9mIGByZXNvbHZlYCBvciBhIGBbc3BlYywgb3B0aW9uc11gIHR1cGxlIGluIGByZXNvbHZlQWxsYCwgbm90IGluIHRoZSBzcGVjLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIC0gTGl0ZXJhbCBzdHJpbmcgdW5pb24gb2YgYWxsb3dlZCB2YWx1ZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdEVudlR5cGVFbnVtPFQgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+ID0geyB0eXBlOiAnZW51bSc7IGNob2ljZXM6IHJlYWRvbmx5IFRbXTsgZGVmYXVsdD86IFQgfTtcblxuLyoqIFVuaW9uIG9mIGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZSBzcGVjIHR5cGVzLiAqL1xuZXhwb3J0IHR5cGUgU3RyaWN0RW52U3BlYyA9XG4gIHwgU3RyaWN0RW52VHlwZVN0cmluZ1xuICB8IFN0cmljdEVudlR5cGVOdW1iZXJcbiAgfCBTdHJpY3RFbnZUeXBlQm9vbGVhblxuICB8IFN0cmljdEVudlR5cGVFbnVtO1xuXG4vKipcbiAqIERpc2NyaW1pbmF0ZWQgdW5pb24gb2YgZXJyb3Iga2luZHMgZW1pdHRlZCBkdXJpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgcGFyc2luZy5cbiAqXG4gKiAtIGBtaXNzaW5nYCDigJQgVmFyaWFibGUgdW5zZXQsIGVtcHR5IHN0cmluZywgb3Igd2hpdGVzcGFjZS1vbmx5ICh3aGVuIHRyaW0gaXMgZW5hYmxlZCkgd2l0aG91dCBhIGRlZmF1bHQuXG4gKiAtIGBpbnZhbGlkX251bWJlcmAg4oCUIFZhbHVlIGlzIG5vdCBhIGZpbml0ZSBudW1iZXIgKHNlZSBgU3RyaWN0RW52VHlwZU51bWJlcmApLlxuICogLSBgaW52YWxpZF9lbnVtYCDigJQgVmFsdWUgaXMgbm90IG9uZSBvZiB0aGUgYWxsb3dlZCBlbnVtIGNob2ljZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdEVudkVycm9yS2luZCA9ICdtaXNzaW5nJyB8ICdpbnZhbGlkX251bWJlcicgfCAnaW52YWxpZF9lbnVtJztcblxuLyoqXG4gKiBBIHN0cnVjdHVyZWQgdmFsaWRhdGlvbiBlcnJvciBlbnRyeSBmb3IgYSBzaW5nbGUgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKlxuICogQHRlbXBsYXRlIEsgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBrZXkgdHlwZS5cbiAqL1xuZXhwb3J0IHR5cGUgU3RyaWN0RW52VmFsaWRhdGlvbkVudHJ5PEsgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+ID0ge1xuICAvKiogRW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZS4gKi9cbiAga2V5OiBLO1xuICAvKiogSHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZS4gKi9cbiAgbWVzc2FnZTogc3RyaW5nO1xuICAvKiogUmF3IHZhbHVlIGZyb20gYHByb2Nlc3MuZW52YCwgaWYgcHJlc2VudC4gKi9cbiAgcmF3Pzogc3RyaW5nO1xuICAvKiogRXJyb3IgY2F0ZWdvcnkgZm9yIHByb2dyYW1tYXRpYyBoYW5kbGluZy4gKi9cbiAga2luZDogU3RyaWN0RW52RXJyb3JLaW5kO1xufTtcblxuLyoqXG4gKiBCYXNlIGVycm9yIGNsYXNzIGZvciB0aGlzIHBhY2thZ2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiB0cnkge1xuICogICBTdHJpY3RFbnZSZXNvbHZlci5yZXNvbHZlKCdQT1JUJywgU3RyaWN0RW52VHlwZS5OdW1iZXIpO1xuICogfSBjYXRjaCAoZSkge1xuICogICBpZiAoZSBpbnN0YW5jZW9mIFN0cmljdEVudkVycm9yKSB7XG4gKiAgICAgLy8gSGFuZGxlIGFsbCBzdHJpY3QtZW52LXJlc29sdmVyIGVycm9yc1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFN0cmljdEVudkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdTdHJpY3RFbnZFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0aW9uIGVycm9yIHRoYXQgY2FycmllcyBvbmUgb3IgbW9yZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpc3N1ZXMuXG4gKlxuICogVGhyb3duIGJ5IGBTdHJpY3RFbnZSZXNvbHZlci5yZXNvbHZlKClgIChzaW5nbGUtZW50cnkgYGVycm9yc2ApIGFuZFxuICogYFN0cmljdEVudlJlc29sdmVyLnJlc29sdmVBbGwoKWAgKG11bHRpLWVudHJ5IGBlcnJvcnNgKS5cbiAqIEluZGl2aWR1YWwgZW50cmllcyBhcmUgcHJvZHVjZWQgYnkgdGhlIGludGVybmFsIGBwYXJzZUVudlZhbHVlYCBoZWxwZXIuXG4gKlxuICogQHRlbXBsYXRlIEsgLSBVbmlvbiBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZSBrZXlzIGluY2x1ZGVkIGluIGBlcnJvcnNgLlxuICovXG5leHBvcnQgY2xhc3MgU3RyaWN0RW52VmFsaWRhdGlvbkVycm9yPEsgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+IGV4dGVuZHMgU3RyaWN0RW52RXJyb3Ige1xuICAvKipcbiAgICogRm9ybWF0cyB2YWxpZGF0aW9uIGVycm9ycyBpbnRvIGEgaHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZS5cbiAgICpcbiAgICogQHRlbXBsYXRlIEsgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBrZXkgdHlwZS5cbiAgICogQHBhcmFtIGVycm9ycyAtIFZhbGlkYXRpb24gZXJyb3IgZW50cmllcyB0byBmb3JtYXQuXG4gICAqIEByZXR1cm5zIE11bHRpLWxpbmUgc3VtbWFyeSBsaXN0aW5nIGVhY2gga2V5IGFuZCBtZXNzYWdlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmb3JtYXQ8SyBleHRlbmRzIHN0cmluZz4oZXJyb3JzOiByZWFkb25seSBTdHJpY3RFbnZWYWxpZGF0aW9uRW50cnk8Sz5bXSk6IHN0cmluZyB7XG4gICAgY29uc3QgbGluZXMgPSBlcnJvcnMubWFwKChlKSA9PiBgLSAke2Uua2V5fTogJHtlLm1lc3NhZ2V9JHtlLnJhdyA9PSBudWxsID8gJycgOiBgIChyYXc9XCIke2UucmF3fVwiKWB9YCk7XG4gICAgcmV0dXJuIGBJbnZhbGlkIGVudmlyb25tZW50IHZhcmlhYmxlcyAoJHtlcnJvcnMubGVuZ3RofSk6XFxuJHtsaW5lcy5qb2luKCdcXG4nKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cnVjdHVyZWQgbGlzdCBvZiB2YWxpZGF0aW9uIGVycm9ycy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlcnJvcnM6IHJlYWRvbmx5IFN0cmljdEVudlZhbGlkYXRpb25FbnRyeTxLPltdO1xuICAvKipcbiAgICogQ29udmVuaWVuY2UgbGlzdCBvZiBrZXlzIGluY2x1ZGVkIGluIGBlcnJvcnNgLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGtleXM6IHJlYWRvbmx5IEtbXTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyB2YWxpZGF0aW9uIGVycm9yIGZyb20gb25lIG9yIG1vcmUgYFN0cmljdEVudlZhbGlkYXRpb25FbnRyeWAgZW50cmllcy5cbiAgICpcbiAgICogQHBhcmFtIGVycm9ycyAtIE9uZSBvciBtb3JlIHN0cnVjdHVyZWQgdmFsaWRhdGlvbiBlcnJvcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoZXJyb3JzOiByZWFkb25seSBTdHJpY3RFbnZWYWxpZGF0aW9uRW50cnk8Sz5bXSkge1xuICAgIGNvbnN0IG1zZyA9IFN0cmljdEVudlZhbGlkYXRpb25FcnJvci5mb3JtYXQoZXJyb3JzKTtcbiAgICBzdXBlcihtc2cpO1xuICAgIHRoaXMubmFtZSA9ICdTdHJpY3RFbnZWYWxpZGF0aW9uRXJyb3InO1xuICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xuICAgIHRoaXMua2V5cyA9IGVycm9ycy5tYXAoKGUpID0+IGUua2V5KTtcbiAgfVxufVxuXG4vKipcbiAqIFByZWRlZmluZWQgc3BlYyBjb25zdGFudHMgZm9yIHVzZSB3aXRoIGByZXNvbHZlYCBvciBhcyBzY2hlbWEgdmFsdWVzIGluIGByZXNvbHZlQWxsYC5cbiAqIFByb3ZpZGUgZGVmYXVsdHMgdmlhIHRoZSB0aGlyZCBhcmd1bWVudCBvZiBgcmVzb2x2ZWAgb3IgYSBgW3NwZWMsIHsgZGVmYXVsdCB9XWAgdHVwbGUgaW4gYHJlc29sdmVBbGxgLlxuICovXG5leHBvcnQgY29uc3QgU3RyaWN0RW52VHlwZSA9IHtcbiAgLyoqIFNwZWMgZm9yIGEgc3RyaW5nIHZhbHVlIChyZXR1cm5lZCBhcy1pcyB1bmxlc3MgYHRyaW06IHRydWVgIGlzIHNldCBpbiBvcHRpb25zKS4gKi9cbiAgU3RyaW5nOiB7IHR5cGU6ICdzdHJpbmcnIH0gYXMgY29uc3Qgc2F0aXNmaWVzIFN0cmljdEVudlR5cGVTdHJpbmcsXG4gIC8qKlxuICAgKiBTcGVjIGZvciBhIGZpbml0ZSBudW1lcmljIHZhbHVlIChgTnVtYmVyKClgIHBhcnNpbmc7IHJlamVjdHMgYE5hTmAgYW5kIGBJbmZpbml0eWApLlxuICAgKi9cbiAgTnVtYmVyOiB7IHR5cGU6ICdudW1iZXInIH0gYXMgY29uc3Qgc2F0aXNmaWVzIFN0cmljdEVudlR5cGVOdW1iZXIsXG4gIC8qKiBTcGVjIGZvciBhIGJvb2xlYW4gdmFsdWUgKGAxYC9gdHJ1ZWAvYHllc2AvYG9uYCDihpIgYHRydWVgOyBvdGhlciBub24tZW1wdHkgdmFsdWVzIOKGkiBgZmFsc2VgKS4gKi9cbiAgQm9vbGVhbjogeyB0eXBlOiAnYm9vbGVhbicgfSBhcyBjb25zdCBzYXRpc2ZpZXMgU3RyaWN0RW52VHlwZUJvb2xlYW4sXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3BlYyB0aGF0IHJlc3RyaWN0cyB0aGUgdmFsdWUgdG8gb25lIG9mIHRoZSBnaXZlbiBjaG9pY2VzLlxuICAgKlxuICAgKiBAcGFyYW0gY2hvaWNlcyAtIEFsbG93ZWQgc3RyaW5nIGxpdGVyYWxzLlxuICAgKiBAcmV0dXJucyBFbnVtIHNwZWMgZm9yIHVzZSB3aXRoIGByZXNvbHZlYCBvciBgcmVzb2x2ZUFsbGAuXG4gICAqL1xuICBFbnVtOiA8VCBleHRlbmRzIHN0cmluZz4oY2hvaWNlczogcmVhZG9ubHkgVFtdKSA9PiAoeyB0eXBlOiAnZW51bScsIGNob2ljZXMgfSkgYXMgU3RyaWN0RW52VHlwZUVudW08VD4sXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIEluZmVycyB0aGUgcmV0dXJuIHR5cGUgZnJvbSB0aGUgZ2l2ZW4gc3BlYy5cbiAqIEB0ZW1wbGF0ZSBTIC0gQSBgU3RyaWN0RW52U3BlY2AgdmFyaWFudC5cbiAqL1xuZXhwb3J0IHR5cGUgU3RyaWN0RW52U3BlY1RvVHlwZTxTPiA9XG4gIFMgZXh0ZW5kcyBTdHJpY3RFbnZUeXBlU3RyaW5nID8gc3RyaW5nXG4gICAgOiBTIGV4dGVuZHMgU3RyaWN0RW52VHlwZU51bWJlciA/IG51bWJlclxuICAgICAgOiBTIGV4dGVuZHMgU3RyaWN0RW52VHlwZUJvb2xlYW4gPyBib29sZWFuXG4gICAgICAgIDogUyBleHRlbmRzIFN0cmljdEVudlR5cGVFbnVtPGluZmVyIFQ+ID8gVFxuICAgICAgICAgIDogbmV2ZXI7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgcmVhZGluZyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aXRoIGFuIG9wdGlvbmFsIGRlZmF1bHQuXG4gKiBVc2VkIGFzIHRoZSB0aGlyZCBhcmd1bWVudCB0byBgcmVzb2x2ZWAgb3IgYXMgdGhlIHNlY29uZCBlbGVtZW50IG9mIGEgYFtzcGVjLCBvcHRpb25zXWAgdHVwbGUgaW4gYHJlc29sdmVBbGxgLlxuICpcbiAqIGB0cmltYCBkZWZhdWx0cyB0byBgdHJ1ZWAgZm9yIGBudW1iZXJgLCBgYm9vbGVhbmAsIGFuZCBgZW51bWAgc3BlY3MgKHdoaXRlc3BhY2Utb25seSB2YWx1ZXMgYXJlXG4gKiB0cmVhdGVkIGFzIG1pc3NpbmcpLiBGb3IgYHN0cmluZ2Agc3BlY3MgaXQgZGVmYXVsdHMgdG8gYGZhbHNlYCAodmFsdWVzIGFyZSByZXR1cm5lZCBhcy1pcykuXG4gKlxuICogQHRlbXBsYXRlIFMgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBzcGVjIHR5cGUuXG4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdEVudk9wdGlvbnM8UyBleHRlbmRzIFN0cmljdEVudlNwZWM+ID0ge1xuICBkZWZhdWx0PzogU3RyaWN0RW52U3BlY1RvVHlwZTxTPjtcbiAgLyoqIFdoZW4gYHRydWVgLCB0cmltcyBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UgYmVmb3JlIHZhbGlkYXRpb24uICovXG4gIHRyaW0/OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBTY2hlbWEgZW50cnkgZm9yIGEgc2luZ2xlIGVudiB2YXIuXG4gKlxuICogRWl0aGVyIHByb3ZpZGUgYSBzcGVjIGRpcmVjdGx5LCBvciBhIHR1cGxlIG9mIGBbc3BlYywgb3B0aW9uc11gIHRvIGF0dGFjaCBhIGRlZmF1bHQuXG4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdEVudlNjaGVtYUVudHJ5PFMgZXh0ZW5kcyBTdHJpY3RFbnZTcGVjID0gU3RyaWN0RW52U3BlYz4gPSBTIHwgcmVhZG9ubHkgW1MsIFN0cmljdEVudk9wdGlvbnM8Uz5dO1xuXG4vKipcbiAqIFNjaGVtYSBvYmplY3QgdXNlZCBieSBgcmVzb2x2ZUFsbCgpYC5cbiAqXG4gKiBLZXlzIGFyZSBlbnYgdmFyIG5hbWVzLCB2YWx1ZXMgYXJlIHNwZWNzIChvcHRpb25hbGx5IHdpdGggZGVmYXVsdHMpLlxuICovXG5leHBvcnQgdHlwZSBTdHJpY3RFbnZTY2hlbWEgPSBSZWNvcmQ8c3RyaW5nLCBTdHJpY3RFbnZTY2hlbWFFbnRyeT47XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIHNwZWMgdHlwZSBmcm9tIGEgc2NoZW1hIGVudHJ5IG9yIGBbc3BlYywgb3B0aW9uc11gIHR1cGxlLlxuICpcbiAqIEB0ZW1wbGF0ZSBFIC0gU2NoZW1hIGVudHJ5IHR5cGUuXG4gKi9cbnR5cGUgU3RyaWN0RW52U2NoZW1hRW50cnlUb1NwZWM8RT4gPSBFIGV4dGVuZHMgcmVhZG9ubHkgW2luZmVyIFMsIHVua25vd25dID8gUyA6IEU7XG5cbi8qKlxuICogTWFwcyBhIHNjaGVtYSBvYmplY3QgdG8gdGhlIHJlc3VsdGluZyBwYXJzZWQgZW52aXJvbm1lbnQgb2JqZWN0IHR5cGUuXG4gKlxuICogQHRlbXBsYXRlIFRTY2hlbWEgLSBTY2hlbWEgb2JqZWN0IHR5cGUgcGFzc2VkIHRvIGByZXNvbHZlQWxsYC5cbiAqL1xuZXhwb3J0IHR5cGUgU3RyaWN0RW52U2NoZW1hVG9UeXBlPFRTY2hlbWEgZXh0ZW5kcyBTdHJpY3RFbnZTY2hlbWE+ID0ge1xuICBbSyBpbiBrZXlvZiBUU2NoZW1hXTogU3RyaWN0RW52U3BlY1RvVHlwZTxTdHJpY3RFbnZTY2hlbWFFbnRyeVRvU3BlYzxUU2NoZW1hW0tdPiAmIFN0cmljdEVudlNwZWM+O1xufTtcblxuLyoqXG4gKiBEaXNjcmltaW5hdGVkIHJlc3VsdCBvZiBwYXJzaW5nIGEgc2luZ2xlIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICpcbiAqIE9uIHN1Y2Nlc3MsIGB2YWx1ZWAgaG9sZHMgdGhlIHBhcnNlZCByZXN1bHQuIE9uIGZhaWx1cmUsIGBlcnJvcmAgaG9sZHMgYSBzdHJ1Y3R1cmVkXG4gKiBgU3RyaWN0RW52VmFsaWRhdGlvbkVudHJ5YCBlbnRyeSAobmV2ZXIgdGhyb3dzKS5cbiAqXG4gKiBAdGVtcGxhdGUgSyAtIEVudmlyb25tZW50IHZhcmlhYmxlIGtleSB0eXBlLlxuICogQHRlbXBsYXRlIFMgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBzcGVjIHR5cGUuXG4gKi9cbnR5cGUgUGFyc2VFbnZWYWx1ZVJlc3VsdDxLIGV4dGVuZHMgc3RyaW5nLCBTIGV4dGVuZHMgU3RyaWN0RW52U3BlYz4gPVxuICB8IHsgb2s6IHRydWU7IHZhbHVlOiBTdHJpY3RFbnZTcGVjVG9UeXBlPFM+IH1cbiAgfCB7IG9rOiBmYWxzZTsgZXJyb3I6IFN0cmljdEVudlZhbGlkYXRpb25FbnRyeTxLPiB9O1xuXG4vKipcbiAqIERlZmF1bHQgdHJpbSBiZWhhdmlvciBwZXIgc3BlYyB0eXBlLlxuICogUGFyc2VkIHR5cGVzIHRyaW0gYnkgZGVmYXVsdDsgc3RyaW5ncyBwcmVzZXJ2ZSB0aGUgcmF3IHZhbHVlIHVubGVzcyBvcHRlZCBpbi5cbiAqXG4gKiBAcGFyYW0gc3BlYyAtIEVudmlyb25tZW50IHZhcmlhYmxlIHNwZWMuXG4gKiBAcmV0dXJucyBXaGV0aGVyIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZSBzaG91bGQgYmUgdHJpbW1lZCBiZWZvcmUgdmFsaWRhdGlvbi5cbiAqL1xuY29uc3QgZGVmYXVsdFRyaW1Gb3JTcGVjID0gKHNwZWM6IFN0cmljdEVudlNwZWMpOiBib29sZWFuID0+IHNwZWMudHlwZSAhPT0gJ3N0cmluZyc7XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHJhdyBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZSBiZWZvcmUgdmFsaWRhdGlvbi5cbiAqXG4gKiBAcGFyYW0gcmF3IC0gUmF3IHZhbHVlIGZyb20gYHByb2Nlc3MuZW52YCwgaWYgcHJlc2VudC5cbiAqIEBwYXJhbSB0cmltIC0gV2hldGhlciB0byB0cmltIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZS5cbiAqIEByZXR1cm5zIE5vcm1hbGl6ZWQgdmFsdWUsIG9yIGB1bmRlZmluZWRgIHdoZW4gdW5zZXQuXG4gKi9cbmNvbnN0IG5vcm1hbGl6ZUVudlJhdyA9IChyYXc6IHN0cmluZyB8IHVuZGVmaW5lZCwgdHJpbTogYm9vbGVhbik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChyYXcgPT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKCF0cmltKSB7XG4gICAgcmV0dXJuIHJhdztcbiAgfVxuICByZXR1cm4gcmF3LnRyaW0oKTtcbn07XG5cbi8qKiBPcHRpb25zIGFjY2VwdGVkIGJ5IGBwYXJzZUVudlZhbHVlYCAoc3Vic2V0IG9mIGBTdHJpY3RFbnZPcHRpb25zYCkuICovXG50eXBlIFBhcnNlRW52VmFsdWVPcHRpb25zPFMgZXh0ZW5kcyBTdHJpY3RFbnZTcGVjPiA9IFBpY2s8U3RyaWN0RW52T3B0aW9uczxTPiwgJ3RyaW0nPjtcblxuLyoqXG4gKiBSZXNvbHZlcyBhIHNjaGVtYSBlbnRyeSBpbnRvIGl0cyBzcGVjIGFuZCBvcHRpb25hbCBwZXIta2V5IG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIGVudHJ5IC0gU2NoZW1hIGVudHJ5IG9yIGBbc3BlYywgb3B0aW9uc11gIHR1cGxlLlxuICogQHJldHVybnMgUGFyc2VkIHNwZWMgYW5kIG9wdGlvbnMgZm9yIGByZXNvbHZlQWxsYC5cbiAqL1xuY29uc3QgcmVzb2x2ZVNjaGVtYUVudHJ5ID0gKFxuICBlbnRyeTogU3RyaWN0RW52U2NoZW1hRW50cnksXG4pOiB7IHNwZWM6IFN0cmljdEVudlNwZWM7IG9wdGlvbnM6IFN0cmljdEVudk9wdGlvbnM8U3RyaWN0RW52U3BlYz4gfCB1bmRlZmluZWQgfSA9PiAoe1xuICBzcGVjOiAoQXJyYXkuaXNBcnJheShlbnRyeSkgPyBlbnRyeVswXSA6IGVudHJ5KSBhcyBTdHJpY3RFbnZTcGVjLFxuICBvcHRpb25zOiAoQXJyYXkuaXNBcnJheShlbnRyeSkgPyBlbnRyeVsxXSA6IHVuZGVmaW5lZCkgYXMgU3RyaWN0RW52T3B0aW9uczxTdHJpY3RFbnZTcGVjPiB8IHVuZGVmaW5lZCxcbn0pO1xuXG4vKipcbiAqIFBhcnNlcyBhIHNpbmdsZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHNwZWMuXG4gKlxuICogQ2VudHJhbCB2YWxpZGF0aW9uIGhlbHBlciBzaGFyZWQgYnkgYHJlc29sdmVgIGFuZCBgcmVzb2x2ZUFsbGAuIERvZXMgbm90IHRocm93O1xuICogY2FsbGVycyBkZWNpZGUgd2hldGhlciB0byB0aHJvdyBpbW1lZGlhdGVseSBvciBjb2xsZWN0IGVycm9ycy5cbiAqXG4gKiBNaXNzaW5nIG9yIGVtcHR5IChgXCJcImApIHZhbHVlcyB1c2UgYGRlZmF1bHRWYWx1ZWAgd2hlbiBwcm92aWRlZC4gV2hlbiBgdHJpbWAgaXMgZW5hYmxlZCxcbiAqIHdoaXRlc3BhY2Utb25seSB2YWx1ZXMgYXJlIHRyZWF0ZWQgYXMgZW1wdHkuIE51bWJlciBzcGVjcyBkZWxlZ2F0ZSB0byBgcGFyc2VOdW1iZXJgLlxuICogQm9vbGVhbiBzcGVjcyB0cmVhdCBgMWAvYHRydWVgL2B5ZXNgL2BvbmAgKGNhc2UtaW5zZW5zaXRpdmUsIGFmdGVyIHRyaW0pIGFzIGB0cnVlYC5cbiAqIEVudW0gc3BlY3MgcmVxdWlyZSBhbiBleGFjdCBtYXRjaCBpbiBgY2hvaWNlc2AgKGFmdGVyIHRyaW0pLlxuICpcbiAqIEB0ZW1wbGF0ZSBLIC0gRW52aXJvbm1lbnQgdmFyaWFibGUga2V5IHR5cGUuXG4gKiBAdGVtcGxhdGUgUyAtIEVudmlyb25tZW50IHZhcmlhYmxlIHNwZWMgdHlwZS5cbiAqIEBwYXJhbSBrZXkgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lLlxuICogQHBhcmFtIHNwZWMgLSBUeXBlIHNwZWMgZm9yIHRoZSB2YWx1ZS5cbiAqIEBwYXJhbSByYXcgLSBSYXcgdmFsdWUgZnJvbSBgcHJvY2Vzcy5lbnZgLCBpZiBwcmVzZW50LlxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAtIEZhbGxiYWNrIHdoZW4gYHJhd2AgaXMgbWlzc2luZyBvciBlbXB0eS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgdHJpbSBvdmVycmlkZSAoYHRyaW1gIGRlZmF1bHRzIHBlciBzcGVjIHR5cGUpLlxuICogQHJldHVybnMgUGFyc2VkIHZhbHVlIG9yIGEgc3RydWN0dXJlZCB2YWxpZGF0aW9uIGVycm9yLlxuICovXG5jb25zdCBwYXJzZUVudlZhbHVlID0gPEsgZXh0ZW5kcyBzdHJpbmcsIFMgZXh0ZW5kcyBTdHJpY3RFbnZTcGVjPihcbiAga2V5OiBLLFxuICBzcGVjOiBTLFxuICByYXc6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZGVmYXVsdFZhbHVlOiBTdHJpY3RFbnZTcGVjVG9UeXBlPFM+IHwgdW5kZWZpbmVkLFxuICBvcHRpb25zPzogUGFyc2VFbnZWYWx1ZU9wdGlvbnM8Uz4sXG4pOiBQYXJzZUVudlZhbHVlUmVzdWx0PEssIFM+ID0+IHtcbiAgY29uc3QgdHJpbSA9IG9wdGlvbnM/LnRyaW0gPz8gZGVmYXVsdFRyaW1Gb3JTcGVjKHNwZWMpO1xuICBjb25zdCBub3JtYWxpemVkUmF3ID0gbm9ybWFsaXplRW52UmF3KHJhdywgdHJpbSk7XG4gIGNvbnN0IGhhc0RlZmF1bHQgPSBkZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZDtcblxuICBpZiAobm9ybWFsaXplZFJhdyA9PSBudWxsIHx8IG5vcm1hbGl6ZWRSYXcgPT09ICcnKSB7XG4gICAgaWYgKGhhc0RlZmF1bHQpIHtcbiAgICAgIHJldHVybiB7IG9rOiB0cnVlLCB2YWx1ZTogZGVmYXVsdFZhbHVlIGFzIFN0cmljdEVudlNwZWNUb1R5cGU8Uz4gfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG9rOiBmYWxzZSxcbiAgICAgIGVycm9yOiB7IGtleSwgbWVzc2FnZTogYE1pc3NpbmcgcmVxdWlyZWQgZW52aXJvbm1lbnQgdmFyaWFibGU6ICR7a2V5fWAsIHJhdywga2luZDogJ21pc3NpbmcnIH0sXG4gICAgfTtcbiAgfVxuXG4gIHN3aXRjaCAoc3BlYy50eXBlKSB7XG4gICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgY29uc3QgbiA9IHBhcnNlTnVtYmVyKG5vcm1hbGl6ZWRSYXcpO1xuICAgICAgaWYgKG4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogeyBrZXksIG1lc3NhZ2U6IGBFbnYgJHtrZXl9OiBleHBlY3RlZCBudW1iZXIsIGdvdCBcIiR7cmF3fVwiYCwgcmF3LCBraW5kOiAnaW52YWxpZF9udW1iZXInIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBvazogdHJ1ZSwgdmFsdWU6IG4gYXMgU3RyaWN0RW52U3BlY1RvVHlwZTxTPiB9O1xuICAgIH1cbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHJldHVybiB7IG9rOiB0cnVlLCB2YWx1ZTogcGFyc2VCb29sZWFuRW52VmFsdWUobm9ybWFsaXplZFJhdykgYXMgU3RyaWN0RW52U3BlY1RvVHlwZTxTPiB9O1xuICAgIGNhc2UgJ2VudW0nOlxuICAgICAgaWYgKCFzcGVjLmNob2ljZXMuaW5jbHVkZXMobm9ybWFsaXplZFJhdykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBFbnYgJHtrZXl9OiBtdXN0IGJlIG9uZSBvZiBbJHtzcGVjLmNob2ljZXMuam9pbignLCAnKX1dYCxcbiAgICAgICAgICAgIHJhdyxcbiAgICAgICAgICAgIGtpbmQ6ICdpbnZhbGlkX2VudW0nLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBvazogdHJ1ZSwgdmFsdWU6IG5vcm1hbGl6ZWRSYXcgYXMgU3RyaWN0RW52U3BlY1RvVHlwZTxTPiB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4geyBvazogdHJ1ZSwgdmFsdWU6IG5vcm1hbGl6ZWRSYXcgYXMgU3RyaWN0RW52U3BlY1RvVHlwZTxTPiB9O1xuICB9XG59O1xuXG4vKipcbiAqIFJlYWRzIGFuZCBwYXJzZXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBzcGVjLlxuICpcbiAqIERlbGVnYXRlcyB2YWxpZGF0aW9uIHRvIGBwYXJzZUVudlZhbHVlYC4gTWlzc2luZyBvciBlbXB0eSAoYFwiXCJgKSB2YWx1ZXMgdXNlXG4gKiBgb3B0aW9ucy5kZWZhdWx0YCB3aGVuIHByb3ZpZGVkOyBvdGhlcndpc2UgYSBgU3RyaWN0RW52VmFsaWRhdGlvbkVycm9yYCBpcyB0aHJvd24uXG4gKiBGb3IgYFN0cmljdEVudlR5cGUuTnVtYmVyYCwgdmFsdWVzIGFyZSBwYXJzZWQgYXMgZmluaXRlIG51bWJlcnMgKHNlZSBgU3RyaWN0RW52VHlwZU51bWJlcmApLlxuICpcbiAqIEB0ZW1wbGF0ZSBLIC0gRW52aXJvbm1lbnQgdmFyaWFibGUga2V5IHR5cGUuXG4gKiBAdGVtcGxhdGUgUyAtIEVudmlyb25tZW50IHZhcmlhYmxlIHNwZWMgdHlwZS5cbiAqIEBwYXJhbSBrZXkgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lIChlLmcuIGBcIlBPUlRcImAsIGBcIk5PREVfRU5WXCJgKS5cbiAqIEBwYXJhbSBzcGVjIC0gVHlwZSBzcGVjOyBkZWZhdWx0cyB0byBgU3RyaWN0RW52VHlwZS5TdHJpbmdgIHdoZW4gb21pdHRlZC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgYHsgZGVmYXVsdCwgdHJpbSB9YDsgc2VlIHtAbGluayBTdHJpY3RFbnZPcHRpb25zfS5cbiAqIEByZXR1cm5zIFBhcnNlZCB2YWx1ZSB3aXRoIHR5cGUgaW5mZXJyZWQgZnJvbSBgc3BlY2AuXG4gKiBAdGhyb3dzIHtTdHJpY3RFbnZWYWxpZGF0aW9uRXJyb3J9IFdoZW4gdGhlIHZhcmlhYmxlIGlzIG1pc3NpbmcsIGVtcHR5IHdpdGhvdXQgYSBkZWZhdWx0LCBvciBpbnZhbGlkIGZvciB0aGUgc3BlYy5cbiAqL1xuY29uc3QgcmVzb2x2ZSA9IDxLIGV4dGVuZHMgc3RyaW5nLCBTIGV4dGVuZHMgU3RyaWN0RW52U3BlYyA9IFN0cmljdEVudlR5cGVTdHJpbmc+KFxuICBrZXk6IEssXG4gIHNwZWM6IFMgPSBTdHJpY3RFbnZUeXBlLlN0cmluZyBhcyBTLFxuICBvcHRpb25zPzogU3RyaWN0RW52T3B0aW9uczxTPixcbik6IFN0cmljdEVudlNwZWNUb1R5cGU8Uz4gPT4ge1xuICBjb25zdCByZXN1bHQgPSBwYXJzZUVudlZhbHVlKGtleSwgc3BlYywgcHJvY2Vzcy5lbnZba2V5XSwgb3B0aW9ucz8uZGVmYXVsdCwgb3B0aW9ucyk7XG4gIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgdGhyb3cgbmV3IFN0cmljdEVudlZhbGlkYXRpb25FcnJvcihbcmVzdWx0LmVycm9yXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbn07XG5cbi8qKlxuICogUmVhZHMgYW5kIHBhcnNlcyBtdWx0aXBsZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBzY2hlbWEuXG4gKlxuICogQWx3YXlzIGV2YWx1YXRlcyBldmVyeSBrZXkgaW4gYHNjaGVtYWAuIEVhY2ggZW50cnkgaXMgdmFsaWRhdGVkIHZpYSBgcGFyc2VFbnZWYWx1ZWA7XG4gKiBhbGwgZXJyb3JzIGFyZSBjb2xsZWN0ZWQgYW5kIHRocm93biBvbmNlIGluIGEgc2luZ2xlIGBTdHJpY3RFbnZWYWxpZGF0aW9uRXJyb3JgLlxuICogTnVtYmVyIHNwZWNzIHVzZSB0aGUgc2FtZSBmaW5pdGUtbnVtYmVyIHJ1bGVzIGFzIGByZXNvbHZlYC5cbiAqXG4gKiBAdGVtcGxhdGUgVFNjaGVtYSAtIFNjaGVtYSBvYmplY3QgdHlwZS5cbiAqIEBwYXJhbSBzY2hlbWEgLSBNYXAgb2YgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZXMgdG8gc3BlY3MsIG9wdGlvbmFsbHkgd2l0aCBwZXIta2V5IGRlZmF1bHRzIHZpYSBgW3NwZWMsIHsgZGVmYXVsdCB9XWAuXG4gKiBAcmV0dXJucyBQYXJzZWQgZW52aXJvbm1lbnQgb2JqZWN0IHdpdGggdHlwZXMgaW5mZXJyZWQgZnJvbSB0aGUgc2NoZW1hLlxuICogQHRocm93cyB7U3RyaWN0RW52VmFsaWRhdGlvbkVycm9yfSBXaGVuIG9uZSBvciBtb3JlIHZhcmlhYmxlcyBhcmUgbWlzc2luZywgZW1wdHkgd2l0aG91dCBhIGRlZmF1bHQsIG9yIGludmFsaWQuXG4gKi9cbmNvbnN0IHJlc29sdmVBbGwgPSA8VFNjaGVtYSBleHRlbmRzIFN0cmljdEVudlNjaGVtYT4oc2NoZW1hOiBUU2NoZW1hKTogU3RyaWN0RW52U2NoZW1hVG9UeXBlPFRTY2hlbWE+ID0+IHtcbiAgY29uc3QgZW52czogUGFydGlhbDxTdHJpY3RFbnZTY2hlbWFUb1R5cGU8VFNjaGVtYT4+ID0ge307XG4gIGNvbnN0IGVycm9yczogU3RyaWN0RW52VmFsaWRhdGlvbkVudHJ5PEV4dHJhY3Q8a2V5b2YgVFNjaGVtYSwgc3RyaW5nPj5bXSA9IFtdO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHNjaGVtYSkgYXMgQXJyYXk8RXh0cmFjdDxrZXlvZiBUU2NoZW1hLCBzdHJpbmc+Pikge1xuICAgIGNvbnN0IHsgc3BlYywgb3B0aW9ucyB9ID0gcmVzb2x2ZVNjaGVtYUVudHJ5KHNjaGVtYVtrZXldKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlRW52VmFsdWUoa2V5LCBzcGVjLCBwcm9jZXNzLmVudltrZXldLCBvcHRpb25zPy5kZWZhdWx0LCBvcHRpb25zKTtcbiAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgZXJyb3JzLnB1c2gocmVzdWx0LmVycm9yKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBlbnZzW2tleV0gPSByZXN1bHQudmFsdWUgYXMgU3RyaWN0RW52U2NoZW1hVG9UeXBlPFRTY2hlbWE+W3R5cGVvZiBrZXldO1xuICB9XG5cbiAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB0aHJvdyBuZXcgU3RyaWN0RW52VmFsaWRhdGlvbkVycm9yKGVycm9ycyk7XG4gIHJldHVybiBlbnZzIGFzIFN0cmljdEVudlNjaGVtYVRvVHlwZTxUU2NoZW1hPjtcbn07XG5cbi8qKlxuICogVHlwZS1zYWZlIGVudmlyb25tZW50IHZhcmlhYmxlIHJlc29sdmVyIGZvciBOb2RlLmpzIGBwcm9jZXNzLmVudmAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCBwb3J0ID0gU3RyaWN0RW52UmVzb2x2ZXIucmVzb2x2ZSgnUE9SVCcsIFN0cmljdEVudlR5cGUuTnVtYmVyKTtcbiAqIGNvbnN0IGVudnMgPSBTdHJpY3RFbnZSZXNvbHZlci5yZXNvbHZlQWxsKHtcbiAqICAgUE9SVDogU3RyaWN0RW52VHlwZS5OdW1iZXIsXG4gKiAgIERFQlVHOiBbU3RyaWN0RW52VHlwZS5Cb29sZWFuLCB7IGRlZmF1bHQ6IGZhbHNlIH1dLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IFN0cmljdEVudlJlc29sdmVyID0ge1xuICAvKiogUmVhZHMgYW5kIHBhcnNlcyBhIHNpbmdsZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4gU2VlIHtAbGluayByZXNvbHZlfS4gKi9cbiAgcmVzb2x2ZSxcbiAgLyoqIFJlYWRzIGFuZCBwYXJzZXMgbXVsdGlwbGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluIG9uZSBwYXNzLiBTZWUge0BsaW5rIHJlc29sdmVBbGx9LiAqL1xuICByZXNvbHZlQWxsLFxufSBhcyBjb25zdDtcbiJdfQ==
338
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBOEJBOzs7R0FHRztBQUNILE1BQU0sb0JBQW9CLEdBQUcsb0JBQW9CLENBQUM7QUFFbEQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQVcsRUFBc0IsRUFBRTtJQUN0RCxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN4QixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxhQUFxQixFQUFXLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7QUFzRDFHOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFzQixjQUFlLFNBQVEsS0FBSztJQUNoRDs7T0FFRztJQUNILFlBQXNCLE9BQWU7UUFDbkMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDO0NBQ0Y7QUFSRCx3Q0FRQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBYSx3QkFBb0QsU0FBUSxjQUFjO0lBQ3JGOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyxNQUFNLENBQW1CLE1BQThDO1FBQ25GLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMs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QyxFQUFFLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFCLFNBQVM7UUFDWCxDQUFDO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFtRCxDQUFDO0lBQ3pFLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE1BQU0sSUFBSSx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsRSxPQUFPLElBQXNDLENBQUM7QUFDaEQsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7Ozs7O0dBV0c7QUFDVSxRQUFBLGlCQUFpQixHQUFHO0lBQy9CLDJFQUEyRTtJQUMzRSxPQUFPO0lBQ1AsMkZBQTJGO0lBQzNGLFVBQVU7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTcGVjIGZvciBhIHN0cmluZyBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqIFZhbHVlcyBhcmUgcmV0dXJuZWQgYXMtaXMgdW5sZXNzIGB0cmltOiB0cnVlYCBpcyBzZXQgaW4ge0BsaW5rIFN0cmljdEVudk9wdGlvbnN9XG4gKiAod2hpdGVzcGFjZS1vbmx5IHZhbHVlcyBhcmUgdGhlbiB0cmVhdGVkIGFzIG1pc3NpbmcpLlxuICogRGVmYXVsdHMgYmVsb25nIGluIHtAbGluayBTdHJpY3RFbnZPcHRpb25zfSwgbm90IG9uIHRoaXMgc3BlYy5cbiAqL1xuZXhwb3J0IHR5cGUgU3RyaWN0RW52VHlwZVN0cmluZyA9IHsgdHlwZTogJ3N0cmluZycgfTtcblxuLyoqXG4gKiBPcHRpb25hbCBjb25zdHJhaW50cyBmb3IgYSBudW1lcmljIGVudmlyb25tZW50IHZhcmlhYmxlIHNwZWMuXG4gKiBVc2VkIGJ5IHtAbGluayBTdHJpY3RFbnZUeXBlLk51bWJlcn0gd2hlbiBjYWxsZWQgYXMgYSBmYWN0b3J5LCBhbmQgYnkgc3VnYXIgc3BlY3NcbiAqIHN1Y2ggYXMge0BsaW5rIFN0cmljdEVudlR5cGUuUG9zaXRpdmVJbnR9IC8ge0BsaW5rIFN0cmljdEVudlR5cGUuTmVnYXRpdmVJbnR9LlxuICovXG5leHBvcnQgdHlwZSBTdHJpY3RFbnZOdW1iZXJDb25zdHJhaW50cyA9IHtcbiAgLyoqIEluY2x1c2l2ZSBsb3dlciBib3VuZC4gKi9cbiAgbWluPzogbnVtYmVyO1xuICAvKiogSW5jbHVzaXZlIHVwcGVyIGJvdW5kLiAqL1xuICBtYXg/OiBudW1iZXI7XG4gIC8qKiBXaGVuIGB0cnVlYCwgdGhlIHZhbHVlIG11c3QgYmUgYW4gaW50ZWdlciAoYE51bWJlci5pc0ludGVnZXJgKS4gKi9cbiAgaW50ZWdlcj86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFNwZWMgZm9yIGEgbnVtZXJpYyBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqIFZhbHVlcyBhcmUgcGFyc2VkIHdpdGggYE51bWJlcigpYDsgYE5hTmAsIGBJbmZpbml0eWAsIGFuZCBgLUluZmluaXR5YCBhcmUgcmVqZWN0ZWQuXG4gKiBPcHRpb25hbCB7QGxpbmsgU3RyaWN0RW52TnVtYmVyQ29uc3RyYWludHN9IChgbWluYCwgYG1heGAsIGBpbnRlZ2VyYCkgbmFycm93IGFjY2VwdGVkIHZhbHVlcy5cbiAqIERlZmF1bHRzIGJlbG9uZyBpbiB7QGxpbmsgU3RyaWN0RW52T3B0aW9uc30sIG5vdCBvbiB0aGlzIHNwZWMuXG4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdEVudlR5cGVOdW1iZXIgPSB7IHR5cGU6ICdudW1iZXInIH0gJiBTdHJpY3RFbnZOdW1iZXJDb25zdHJhaW50cztcblxuLyoqXG4gKiBQYXR0ZXJuIGZvciBib29sZWFuIGVudiB2YWx1ZXMgdGhhdCBwYXJzZSBhcyBgdHJ1ZWAuXG4gKiBNYXRjaGVzIGAxYCwgYHRydWVgLCBgeWVzYCwgYW5kIGBvbmAgKGNhc2UtaW5zZW5zaXRpdmUpIG9uIHRoZSBmdWxsIHRyaW1tZWQgc3RyaW5nLlxuICovXG5jb25zdCBUUlVFX0JPT0xFQU5fUEFUVEVSTiA9IC9eKDF8dHJ1ZXx5ZXN8b24pJC9pO1xuXG4vKipcbiAqIFBhcnNlcyBhIHN0cmluZyBhcyBhIGZpbml0ZSBudW1iZXIgZm9yIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqXG4gKiBAcGFyYW0gcmF3IC0gTm9ybWFsaXplZCBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZSAodHJpbW1lZCB3aGVuIGB0cmltYCBpcyBlbmFibGVkKS5cbiAqIEByZXR1cm5zIFBhcnNlZCBudW1iZXIsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIHZhbHVlIGlzIG5vdCBhIGZpbml0ZSBudW1iZXIuXG4gKi9cbmNvbnN0IHBhcnNlTnVtYmVyID0gKHJhdzogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgbiA9IE51bWJlcihyYXcpO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShuKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIG47XG59O1xuXG4vKipcbiAqIFBhcnNlcyBhIG5vcm1hbGl6ZWQgc3RyaW5nIGFzIGEgYm9vbGVhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gbm9ybWFsaXplZFJhdyAtIE5vcm1hbGl6ZWQgZW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWUgKHRyaW1tZWQgd2hlbiBgdHJpbWAgaXMgZW5hYmxlZCkuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgZm9yIGAxYC9gdHJ1ZWAvYHllc2AvYG9uYCAoY2FzZS1pbnNlbnNpdGl2ZSk7IG90aGVyd2lzZSBgZmFsc2VgLlxuICovXG5jb25zdCBwYXJzZUJvb2xlYW5FbnZWYWx1ZSA9IChub3JtYWxpemVkUmF3OiBzdHJpbmcpOiBib29sZWFuID0+IFRSVUVfQk9PTEVBTl9QQVRURVJOLnRlc3Qobm9ybWFsaXplZFJhdyk7XG5cbi8qKlxuICogU3BlYyBmb3IgYSBib29sZWFuIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICogUGFyc2VzIGAxYCwgYHRydWVgLCBgeWVzYCwgYG9uYCAoY2FzZS1pbnNlbnNpdGl2ZSwgYWZ0ZXIgbm9ybWFsaXphdGlvbikgYXMgYHRydWVgO1xuICogYW55IG90aGVyIG5vbi1lbXB0eSB2YWx1ZSBhcyBgZmFsc2VgLlxuICogVHJpbXMgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlIGJ5IGRlZmF1bHQgKHNlZSB7QGxpbmsgU3RyaWN0RW52T3B0aW9ucy50cmltfSkuXG4gKiBEZWZhdWx0cyBiZWxvbmcgaW4ge0BsaW5rIFN0cmljdEVudk9wdGlvbnN9LCBub3Qgb24gdGhpcyBzcGVjLlxuICovXG5leHBvcnQgdHlwZSBTdHJpY3RFbnZUeXBlQm9vbGVhbiA9IHsgdHlwZTogJ2Jvb2xlYW4nIH07XG5cbi8qKlxuICogU3BlYyBmb3IgYW4gZW51bSBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aXRoIGEgZml4ZWQgc2V0IG9mIGNob2ljZXMuXG4gKiBUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgYGNob2ljZXNgIChjb21wYXJlZCBhZnRlciBub3JtYWxpemF0aW9uKTsgb3RoZXJ3aXNlIHZhbGlkYXRpb24gZmFpbHMuXG4gKiBUcmltcyBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UgYnkgZGVmYXVsdCAoc2VlIHtAbGluayBTdHJpY3RFbnZPcHRpb25zLnRyaW19KS5cbiAqIERlZmF1bHRzIGJlbG9uZyBpbiB7QGxpbmsgU3RyaWN0RW52T3B0aW9uc30sIG5vdCBvbiB0aGlzIHNwZWMuXG4gKlxuICogQHRlbXBsYXRlIFQgLSBMaXRlcmFsIHN0cmluZyB1bmlvbiBvZiBhbGxvd2VkIHZhbHVlcy5cbiAqL1xuZXhwb3J0IHR5cGUgU3RyaWN0RW52VHlwZUVudW08VCBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPSB7IHR5cGU6ICdlbnVtJzsgY2hvaWNlczogcmVhZG9ubHkgVFtdIH07XG5cbi8qKiBVbmlvbiBvZiBhbGwgZW52aXJvbm1lbnQgdmFyaWFibGUgc3BlYyB0eXBlcy4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdEVudlNwZWMgPVxuICB8IFN0cmljdEVudlR5cGVTdHJpbmdcbiAgfCBTdHJpY3RFbnZUeXBlTnVtYmVyXG4gIHwgU3RyaWN0RW52VHlwZUJvb2xlYW5cbiAgfCBTdHJpY3RFbnZUeXBlRW51bTtcblxuLyoqXG4gKiBEaXNjcmltaW5hdGVkIHVuaW9uIG9mIGVycm9yIGtpbmRzIGVtaXR0ZWQgZHVyaW5nIGVudmlyb25tZW50IHZhcmlhYmxlIHBhcnNpbmcuXG4gKlxuICogLSBgbWlzc2luZ2Ag4oCUIFZhcmlhYmxlIHVuc2V0LCBlbXB0eSBzdHJpbmcsIG9yIHdoaXRlc3BhY2Utb25seSAod2hlbiB0cmltIGlzIGVuYWJsZWQpIHdpdGhvdXQgYSBkZWZhdWx0LlxuICogLSBgaW52YWxpZF9udW1iZXJgIOKAlCBWYWx1ZSBpcyBub3QgYSBmaW5pdGUgbnVtYmVyLCBub3QgYW4gaW50ZWdlciB3aGVuIHJlcXVpcmVkLCBvciBvdXRzaWRlIGBtaW5gL2BtYXhgXG4gKiAgIChzZWUge0BsaW5rIFN0cmljdEVudlR5cGVOdW1iZXJ9KS5cbiAqIC0gYGludmFsaWRfZW51bWAg4oCUIFZhbHVlIGlzIG5vdCBvbmUgb2YgdGhlIGFsbG93ZWQgZW51bSBjaG9pY2VzLlxuICovXG5leHBvcnQgdHlwZSBTdHJpY3RFbnZFcnJvcktpbmQgPSAnbWlzc2luZycgfCAnaW52YWxpZF9udW1iZXInIHwgJ2ludmFsaWRfZW51bSc7XG5cbi8qKlxuICogQSBzdHJ1Y3R1cmVkIHZhbGlkYXRpb24gZXJyb3IgZW50cnkgZm9yIGEgc2luZ2xlIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICpcbiAqIEB0ZW1wbGF0ZSBLIC0gRW52aXJvbm1lbnQgdmFyaWFibGUga2V5IHR5cGUuXG4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdEVudlZhbGlkYXRpb25FbnRyeTxLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiA9IHtcbiAgLyoqIEVudmlyb25tZW50IHZhcmlhYmxlIG5hbWUuICovXG4gIGtleTogSztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuICovXG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgLyoqIFJhdyB2YWx1ZSBmcm9tIGBwcm9jZXNzLmVudmAsIGlmIHByZXNlbnQuICovXG4gIHJhdz86IHN0cmluZztcbiAgLyoqIEVycm9yIGNhdGVnb3J5IGZvciBwcm9ncmFtbWF0aWMgaGFuZGxpbmcuICovXG4gIGtpbmQ6IFN0cmljdEVudkVycm9yS2luZDtcbn07XG5cbi8qKlxuICogQmFzZSBlcnJvciBjbGFzcyBmb3IgdGhpcyBwYWNrYWdlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogdHJ5IHtcbiAqICAgU3RyaWN0RW52UmVzb2x2ZXIucmVzb2x2ZSgnUE9SVCcsIFN0cmljdEVudlR5cGUuTnVtYmVyKTtcbiAqIH0gY2F0Y2ggKGUpIHtcbiAqICAgaWYgKGUgaW5zdGFuY2VvZiBTdHJpY3RFbnZFcnJvcikge1xuICogICAgIC8vIEhhbmRsZSBhbGwgc3RyaWN0LWVudi1yZXNvbHZlciBlcnJvcnNcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTdHJpY3RFbnZFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gRXJyb3IgbWVzc2FnZS5cbiAgICovXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnU3RyaWN0RW52RXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGlvbiBlcnJvciB0aGF0IGNhcnJpZXMgb25lIG9yIG1vcmUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXNzdWVzLlxuICpcbiAqIFRocm93biBieSBgU3RyaWN0RW52UmVzb2x2ZXIucmVzb2x2ZSgpYCAoc2luZ2xlLWVudHJ5IGBlcnJvcnNgKSBhbmRcbiAqIGBTdHJpY3RFbnZSZXNvbHZlci5yZXNvbHZlQWxsKClgIChtdWx0aS1lbnRyeSBgZXJyb3JzYCkuXG4gKiBJbmRpdmlkdWFsIGVudHJpZXMgYXJlIHByb2R1Y2VkIGJ5IHRoZSBpbnRlcm5hbCBgcGFyc2VFbnZWYWx1ZWAgaGVscGVyLlxuICpcbiAqIEB0ZW1wbGF0ZSBLIC0gVW5pb24gb2YgZW52aXJvbm1lbnQgdmFyaWFibGUga2V5cyBpbmNsdWRlZCBpbiBgZXJyb3JzYC5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0cmljdEVudlZhbGlkYXRpb25FcnJvcjxLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiBleHRlbmRzIFN0cmljdEVudkVycm9yIHtcbiAgLyoqXG4gICAqIEZvcm1hdHMgdmFsaWRhdGlvbiBlcnJvcnMgaW50byBhIGh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBLIC0gRW52aXJvbm1lbnQgdmFyaWFibGUga2V5IHR5cGUuXG4gICAqIEBwYXJhbSBlcnJvcnMgLSBWYWxpZGF0aW9uIGVycm9yIGVudHJpZXMgdG8gZm9ybWF0LlxuICAgKiBAcmV0dXJucyBNdWx0aS1saW5lIHN1bW1hcnkgbGlzdGluZyBlYWNoIGtleSBhbmQgbWVzc2FnZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZm9ybWF0PEsgZXh0ZW5kcyBzdHJpbmc+KGVycm9yczogcmVhZG9ubHkgU3RyaWN0RW52VmFsaWRhdGlvbkVudHJ5PEs+W10pOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzID0gZXJyb3JzLm1hcCgoZSkgPT4gYC0gJHtlLmtleX06ICR7ZS5tZXNzYWdlfSR7ZS5yYXcgPT0gbnVsbCA/ICcnIDogYCAocmF3PVwiJHtlLnJhd31cIilgfWApO1xuICAgIHJldHVybiBgSW52YWxpZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKCR7ZXJyb3JzLmxlbmd0aH0pOlxcbiR7bGluZXMuam9pbignXFxuJyl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJ1Y3R1cmVkIGxpc3Qgb2YgdmFsaWRhdGlvbiBlcnJvcnMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZXJyb3JzOiByZWFkb25seSBTdHJpY3RFbnZWYWxpZGF0aW9uRW50cnk8Sz5bXTtcbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIGxpc3Qgb2Yga2V5cyBpbmNsdWRlZCBpbiBgZXJyb3JzYC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBrZXlzOiByZWFkb25seSBLW107XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgdmFsaWRhdGlvbiBlcnJvciBmcm9tIG9uZSBvciBtb3JlIGBTdHJpY3RFbnZWYWxpZGF0aW9uRW50cnlgIGVudHJpZXMuXG4gICAqXG4gICAqIEBwYXJhbSBlcnJvcnMgLSBPbmUgb3IgbW9yZSBzdHJ1Y3R1cmVkIHZhbGlkYXRpb24gZXJyb3JzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGVycm9yczogcmVhZG9ubHkgU3RyaWN0RW52VmFsaWRhdGlvbkVudHJ5PEs+W10pIHtcbiAgICBjb25zdCBtc2cgPSBTdHJpY3RFbnZWYWxpZGF0aW9uRXJyb3IuZm9ybWF0KGVycm9ycyk7XG4gICAgc3VwZXIobXNnKTtcbiAgICB0aGlzLm5hbWUgPSAnU3RyaWN0RW52VmFsaWRhdGlvbkVycm9yJztcbiAgICB0aGlzLmVycm9ycyA9IGVycm9ycztcbiAgICB0aGlzLmtleXMgPSBlcnJvcnMubWFwKChlKSA9PiBlLmtleSk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBudW1lcmljIGVudiBzcGVjIGZyb20gb3B0aW9uYWwgY29uc3RyYWludHMuXG4gKlxuICogQHBhcmFtIGNvbnN0cmFpbnRzIC0gT3B0aW9uYWwgYG1pbmAsIGBtYXhgLCBhbmQvb3IgYGludGVnZXJgIGJvdW5kcy5cbiAqIEByZXR1cm5zIE51bWJlciBzcGVjIGZvciB1c2Ugd2l0aCBgcmVzb2x2ZWAgb3IgYHJlc29sdmVBbGxgLlxuICovXG5jb25zdCBjcmVhdGVOdW1iZXJTcGVjID0gKGNvbnN0cmFpbnRzPzogU3RyaWN0RW52TnVtYmVyQ29uc3RyYWludHMpOiBTdHJpY3RFbnZUeXBlTnVtYmVyID0+ICh7XG4gIHR5cGU6ICdudW1iZXInLFxuICAuLi4oY29uc3RyYWludHM/Lm1pbiAhPT0gdW5kZWZpbmVkID8geyBtaW46IGNvbnN0cmFpbnRzLm1pbiB9IDoge30pLFxuICAuLi4oY29uc3RyYWludHM/Lm1heCAhPT0gdW5kZWZpbmVkID8geyBtYXg6IGNvbnN0cmFpbnRzLm1heCB9IDoge30pLFxuICAuLi4oY29uc3RyYWludHM/LmludGVnZXIgIT09IHVuZGVmaW5lZCA/IHsgaW50ZWdlcjogY29uc3RyYWludHMuaW50ZWdlciB9IDoge30pLFxufSk7XG5cbi8qKlxuICogVW5jb25zdHJhaW5lZCBmaW5pdGUtbnVtYmVyIHNwZWMsIGFsc28gY2FsbGFibGUgYXMgYSBmYWN0b3J5IGZvciBjb25zdHJhaW5lZCBzcGVjcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIFN0cmljdEVudlR5cGUuTnVtYmVyXG4gKiBTdHJpY3RFbnZUeXBlLk51bWJlcih7IG1pbjogMCB9KVxuICogU3RyaWN0RW52VHlwZS5OdW1iZXIoeyBtaW46IDEsIG1heDogNjU1MzUsIGludGVnZXI6IHRydWUgfSlcbiAqIGBgYFxuICovXG50eXBlIFN0cmljdEVudk51bWJlclNwZWNGYWN0b3J5ID0ge1xuICAoY29uc3RyYWludHM/OiBTdHJpY3RFbnZOdW1iZXJDb25zdHJhaW50cyk6IFN0cmljdEVudlR5cGVOdW1iZXI7XG59ICYgU3RyaWN0RW52VHlwZU51bWJlcjtcblxuY29uc3QgTnVtYmVyU3BlYzogU3RyaWN0RW52TnVtYmVyU3BlY0ZhY3RvcnkgPSBPYmplY3QuYXNzaWduKFxuICAoY29uc3RyYWludHM/OiBTdHJpY3RFbnZOdW1iZXJDb25zdHJhaW50cyk6IFN0cmljdEVudlR5cGVOdW1iZXIgPT4gY3JlYXRlTnVtYmVyU3BlYyhjb25zdHJhaW50cyksXG4gIHsgdHlwZTogJ251bWJlcicgfSBhcyBjb25zdCBzYXRpc2ZpZXMgU3RyaWN0RW52VHlwZU51bWJlcixcbik7XG5cbi8qKlxuICogUHJlZGVmaW5lZCBzcGVjIGNvbnN0YW50cyBmb3IgdXNlIHdpdGggYHJlc29sdmVgIG9yIGFzIHNjaGVtYSB2YWx1ZXMgaW4gYHJlc29sdmVBbGxgLlxuICogU3BlY3MgZGVzY3JpYmUgdHlwZSBvbmx5OyBwcm92aWRlIGBkZWZhdWx0YCAvIGB0cmltYCB2aWEge0BsaW5rIFN0cmljdEVudk9wdGlvbnN9XG4gKiAodGhpcmQgYXJndW1lbnQgb2YgYHJlc29sdmVgLCBvciBhIGBbc3BlYywgb3B0aW9uc11gIHR1cGxlIGluIGByZXNvbHZlQWxsYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBTdHJpY3RFbnZUeXBlID0ge1xuICAvKiogU3BlYyBmb3IgYSBzdHJpbmcgdmFsdWUgKHJldHVybmVkIGFzLWlzIHVubGVzcyBgdHJpbTogdHJ1ZWAgaXMgc2V0IGluIG9wdGlvbnMpLiAqL1xuICBTdHJpbmc6IHsgdHlwZTogJ3N0cmluZycgfSBhcyBjb25zdCBzYXRpc2ZpZXMgU3RyaWN0RW52VHlwZVN0cmluZyxcbiAgLyoqXG4gICAqIFNwZWMgZm9yIGEgZmluaXRlIG51bWVyaWMgdmFsdWUgKGBOdW1iZXIoKWAgcGFyc2luZzsgcmVqZWN0cyBgTmFOYCBhbmQgYEluZmluaXR5YCkuXG4gICAqIFVzZSBhcyBgU3RyaWN0RW52VHlwZS5OdW1iZXJgLCBvciBjYWxsIGFzIGBTdHJpY3RFbnZUeXBlLk51bWJlcih7IG1pbiwgbWF4LCBpbnRlZ2VyIH0pYC5cbiAgICovXG4gIE51bWJlcjogTnVtYmVyU3BlYyxcbiAgLyoqXG4gICAqIFNwZWMgZm9yIGEgcG9zaXRpdmUgaW50ZWdlciAoYD49IDFgKS4gU3VnYXIgZm9yIGBOdW1iZXIoeyBtaW46IDEsIGludGVnZXI6IHRydWUgfSlgLlxuICAgKi9cbiAgUG9zaXRpdmVJbnQ6IGNyZWF0ZU51bWJlclNwZWMoeyBtaW46IDEsIGludGVnZXI6IHRydWUgfSksXG4gIC8qKlxuICAgKiBTcGVjIGZvciBhIG5lZ2F0aXZlIGludGVnZXIgKGA8PSAtMWApLiBTdWdhciBmb3IgYE51bWJlcih7IG1heDogLTEsIGludGVnZXI6IHRydWUgfSlgLlxuICAgKi9cbiAgTmVnYXRpdmVJbnQ6IGNyZWF0ZU51bWJlclNwZWMoeyBtYXg6IC0xLCBpbnRlZ2VyOiB0cnVlIH0pLFxuICAvKiogU3BlYyBmb3IgYSBib29sZWFuIHZhbHVlIChgMWAvYHRydWVgL2B5ZXNgL2BvbmAg4oaSIGB0cnVlYDsgb3RoZXIgbm9uLWVtcHR5IHZhbHVlcyDihpIgYGZhbHNlYCkuICovXG4gIEJvb2xlYW46IHsgdHlwZTogJ2Jvb2xlYW4nIH0gYXMgY29uc3Qgc2F0aXNmaWVzIFN0cmljdEVudlR5cGVCb29sZWFuLFxuICAvKipcbiAgICogUmV0dXJucyBhIHNwZWMgdGhhdCByZXN0cmljdHMgdGhlIHZhbHVlIHRvIG9uZSBvZiB0aGUgZ2l2ZW4gY2hvaWNlcy5cbiAgICpcbiAgICogQHBhcmFtIGNob2ljZXMgLSBBbGxvd2VkIHN0cmluZyBsaXRlcmFscy5cbiAgICogQHJldHVybnMgRW51bSBzcGVjIGZvciB1c2Ugd2l0aCBgcmVzb2x2ZWAgb3IgYHJlc29sdmVBbGxgLlxuICAgKi9cbiAgRW51bTogPFQgZXh0ZW5kcyBzdHJpbmc+KGNob2ljZXM6IHJlYWRvbmx5IFRbXSkgPT4gKHsgdHlwZTogJ2VudW0nLCBjaG9pY2VzIH0pIGFzIFN0cmljdEVudlR5cGVFbnVtPFQ+LFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBJbmZlcnMgdGhlIHJldHVybiB0eXBlIGZyb20gdGhlIGdpdmVuIHNwZWMuXG4gKiBAdGVtcGxhdGUgUyAtIEEgYFN0cmljdEVudlNwZWNgIHZhcmlhbnQuXG4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdEVudlNwZWNUb1R5cGU8Uz4gPVxuICBTIGV4dGVuZHMgU3RyaWN0RW52VHlwZVN0cmluZyA/IHN0cmluZ1xuICAgIDogUyBleHRlbmRzIFN0cmljdEVudlR5cGVOdW1iZXIgPyBudW1iZXJcbiAgICAgIDogUyBleHRlbmRzIFN0cmljdEVudlR5cGVCb29sZWFuID8gYm9vbGVhblxuICAgICAgICA6IFMgZXh0ZW5kcyBTdHJpY3RFbnZUeXBlRW51bTxpbmZlciBUPiA/IFRcbiAgICAgICAgICA6IG5ldmVyO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHJlYWRpbmcgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgd2l0aCBhbiBvcHRpb25hbCBkZWZhdWx0LlxuICogVXNlZCBhcyB0aGUgdGhpcmQgYXJndW1lbnQgdG8gYHJlc29sdmVgIG9yIGFzIHRoZSBzZWNvbmQgZWxlbWVudCBvZiBhIGBbc3BlYywgb3B0aW9uc11gIHR1cGxlIGluIGByZXNvbHZlQWxsYC5cbiAqXG4gKiBgdHJpbWAgZGVmYXVsdHMgdG8gYHRydWVgIGZvciBgbnVtYmVyYCwgYGJvb2xlYW5gLCBhbmQgYGVudW1gIHNwZWNzICh3aGl0ZXNwYWNlLW9ubHkgdmFsdWVzIGFyZVxuICogdHJlYXRlZCBhcyBtaXNzaW5nKS4gRm9yIGBzdHJpbmdgIHNwZWNzIGl0IGRlZmF1bHRzIHRvIGBmYWxzZWAgKHZhbHVlcyBhcmUgcmV0dXJuZWQgYXMtaXMpLlxuICpcbiAqIEB0ZW1wbGF0ZSBTIC0gRW52aXJvbm1lbnQgdmFyaWFibGUgc3BlYyB0eXBlLlxuICovXG5leHBvcnQgdHlwZSBTdHJpY3RFbnZPcHRpb25zPFMgZXh0ZW5kcyBTdHJpY3RFbnZTcGVjPiA9IHtcbiAgLyoqIEZhbGxiYWNrIHdoZW4gdGhlIHZhcmlhYmxlIGlzIHVuc2V0LCBlbXB0eSAoYFwiXCJgKSwgb3Igd2hpdGVzcGFjZS1vbmx5ICh3aGVuIGB0cmltYCBpcyBlbmFibGVkKS4gKi9cbiAgZGVmYXVsdD86IFN0cmljdEVudlNwZWNUb1R5cGU8Uz47XG4gIC8qKiBXaGVuIGB0cnVlYCwgdHJpbXMgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlIGJlZm9yZSB2YWxpZGF0aW9uLiAqL1xuICB0cmltPzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogU2NoZW1hIGVudHJ5IGZvciBhIHNpbmdsZSBlbnYgdmFyLlxuICpcbiAqIEVpdGhlciBhIHNwZWMgYWxvbmUsIG9yIGEgYFtzcGVjLCBvcHRpb25zXWAgdHVwbGUgdG8gYXR0YWNoIHtAbGluayBTdHJpY3RFbnZPcHRpb25zfVxuICogKGZvciBleGFtcGxlIGBkZWZhdWx0YCBhbmQvb3IgYHRyaW1gKS5cbiAqL1xuZXhwb3J0IHR5cGUgU3RyaWN0RW52U2NoZW1hRW50cnk8UyBleHRlbmRzIFN0cmljdEVudlNwZWMgPSBTdHJpY3RFbnZTcGVjPiA9IFMgfCByZWFkb25seSBbUywgU3RyaWN0RW52T3B0aW9uczxTPl07XG5cbi8qKlxuICogU2NoZW1hIG9iamVjdCB1c2VkIGJ5IGByZXNvbHZlQWxsKClgLlxuICpcbiAqIEtleXMgYXJlIGVudiB2YXIgbmFtZXM7IHZhbHVlcyBhcmUgc3BlY3Mgb3IgYFtzcGVjLCBvcHRpb25zXWAgdHVwbGVzLlxuICovXG5leHBvcnQgdHlwZSBTdHJpY3RFbnZTY2hlbWEgPSBSZWNvcmQ8c3RyaW5nLCBTdHJpY3RFbnZTY2hlbWFFbnRyeT47XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIHNwZWMgdHlwZSBmcm9tIGEgc2NoZW1hIGVudHJ5IG9yIGBbc3BlYywgb3B0aW9uc11gIHR1cGxlLlxuICpcbiAqIEB0ZW1wbGF0ZSBFIC0gU2NoZW1hIGVudHJ5IHR5cGUuXG4gKi9cbnR5cGUgU3RyaWN0RW52U2NoZW1hRW50cnlUb1NwZWM8RT4gPSBFIGV4dGVuZHMgcmVhZG9ubHkgW2luZmVyIFMsIHVua25vd25dID8gUyA6IEU7XG5cbi8qKlxuICogTWFwcyBhIHNjaGVtYSBvYmplY3QgdG8gdGhlIHJlc3VsdGluZyBwYXJzZWQgZW52aXJvbm1lbnQgb2JqZWN0IHR5cGUuXG4gKlxuICogQHRlbXBsYXRlIFRTY2hlbWEgLSBTY2hlbWEgb2JqZWN0IHR5cGUgcGFzc2VkIHRvIGByZXNvbHZlQWxsYC5cbiAqL1xuZXhwb3J0IHR5cGUgU3RyaWN0RW52U2NoZW1hVG9UeXBlPFRTY2hlbWEgZXh0ZW5kcyBTdHJpY3RFbnZTY2hlbWE+ID0ge1xuICBbSyBpbiBrZXlvZiBUU2NoZW1hXTogU3RyaWN0RW52U3BlY1RvVHlwZTxTdHJpY3RFbnZTY2hlbWFFbnRyeVRvU3BlYzxUU2NoZW1hW0tdPiAmIFN0cmljdEVudlNwZWM+O1xufTtcblxuLyoqXG4gKiBEaXNjcmltaW5hdGVkIHJlc3VsdCBvZiBwYXJzaW5nIGEgc2luZ2xlIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICpcbiAqIE9uIHN1Y2Nlc3MsIGB2YWx1ZWAgaG9sZHMgdGhlIHBhcnNlZCByZXN1bHQuIE9uIGZhaWx1cmUsIGBlcnJvcmAgaG9sZHMgYSBzdHJ1Y3R1cmVkXG4gKiBgU3RyaWN0RW52VmFsaWRhdGlvbkVudHJ5YCBlbnRyeSAobmV2ZXIgdGhyb3dzKS5cbiAqXG4gKiBAdGVtcGxhdGUgSyAtIEVudmlyb25tZW50IHZhcmlhYmxlIGtleSB0eXBlLlxuICogQHRlbXBsYXRlIFMgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBzcGVjIHR5cGUuXG4gKi9cbnR5cGUgUGFyc2VFbnZWYWx1ZVJlc3VsdDxLIGV4dGVuZHMgc3RyaW5nLCBTIGV4dGVuZHMgU3RyaWN0RW52U3BlYz4gPVxuICB8IHsgb2s6IHRydWU7IHZhbHVlOiBTdHJpY3RFbnZTcGVjVG9UeXBlPFM+IH1cbiAgfCB7IG9rOiBmYWxzZTsgZXJyb3I6IFN0cmljdEVudlZhbGlkYXRpb25FbnRyeTxLPiB9O1xuXG4vKipcbiAqIERlZmF1bHQgdHJpbSBiZWhhdmlvciBwZXIgc3BlYyB0eXBlLlxuICogUGFyc2VkIHR5cGVzIHRyaW0gYnkgZGVmYXVsdDsgc3RyaW5ncyBwcmVzZXJ2ZSB0aGUgcmF3IHZhbHVlIHVubGVzcyBvcHRlZCBpbi5cbiAqXG4gKiBAcGFyYW0gc3BlYyAtIEVudmlyb25tZW50IHZhcmlhYmxlIHNwZWMuXG4gKiBAcmV0dXJucyBXaGV0aGVyIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZSBzaG91bGQgYmUgdHJpbW1lZCBiZWZvcmUgdmFsaWRhdGlvbi5cbiAqL1xuY29uc3QgZGVmYXVsdFRyaW1Gb3JTcGVjID0gKHNwZWM6IFN0cmljdEVudlNwZWMpOiBib29sZWFuID0+IHNwZWMudHlwZSAhPT0gJ3N0cmluZyc7XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHJhdyBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZSBiZWZvcmUgdmFsaWRhdGlvbi5cbiAqXG4gKiBAcGFyYW0gcmF3IC0gUmF3IHZhbHVlIGZyb20gYHByb2Nlc3MuZW52YCwgaWYgcHJlc2VudC5cbiAqIEBwYXJhbSB0cmltIC0gV2hldGhlciB0byB0cmltIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZS5cbiAqIEByZXR1cm5zIE5vcm1hbGl6ZWQgdmFsdWUsIG9yIGB1bmRlZmluZWRgIHdoZW4gdW5zZXQuXG4gKi9cbmNvbnN0IG5vcm1hbGl6ZUVudlJhdyA9IChyYXc6IHN0cmluZyB8IHVuZGVmaW5lZCwgdHJpbTogYm9vbGVhbik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChyYXcgPT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKCF0cmltKSB7XG4gICAgcmV0dXJuIHJhdztcbiAgfVxuICByZXR1cm4gcmF3LnRyaW0oKTtcbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgcGFyc2VkIG51bWJlciBhZ2FpbnN0IG9wdGlvbmFsIHtAbGluayBTdHJpY3RFbnZOdW1iZXJDb25zdHJhaW50c30uXG4gKlxuICogQHRlbXBsYXRlIEsgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBrZXkgdHlwZS5cbiAqIEBwYXJhbSBrZXkgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lLlxuICogQHBhcmFtIHJhdyAtIFJhdyB2YWx1ZSBmcm9tIGBwcm9jZXNzLmVudmAsIGlmIHByZXNlbnQuXG4gKiBAcGFyYW0gbiAtIFBhcnNlZCBmaW5pdGUgbnVtYmVyLlxuICogQHBhcmFtIGNvbnN0cmFpbnRzIC0gT3B0aW9uYWwgYG1pbmAsIGBtYXhgLCBhbmQvb3IgYGludGVnZXJgIGNvbnN0cmFpbnRzLlxuICogQHJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB2YWxpZDsgb3RoZXJ3aXNlIGEgc3RydWN0dXJlZCB2YWxpZGF0aW9uIGVycm9yLlxuICovXG5jb25zdCB2YWxpZGF0ZU51bWJlckNvbnN0cmFpbnRzID0gPEsgZXh0ZW5kcyBzdHJpbmc+KFxuICBrZXk6IEssXG4gIHJhdzogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBuOiBudW1iZXIsXG4gIGNvbnN0cmFpbnRzOiBTdHJpY3RFbnZOdW1iZXJDb25zdHJhaW50cyxcbik6IFN0cmljdEVudlZhbGlkYXRpb25FbnRyeTxLPiB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChjb25zdHJhaW50cy5pbnRlZ2VyID09PSB0cnVlICYmICFOdW1iZXIuaXNJbnRlZ2VyKG4pKSB7XG4gICAgcmV0dXJuIHsga2V5LCBtZXNzYWdlOiBgRW52ICR7a2V5fTogZXhwZWN0ZWQgaW50ZWdlciwgZ290IFwiJHtyYXd9XCJgLCByYXcsIGtpbmQ6ICdpbnZhbGlkX251bWJlcicgfTtcbiAgfVxuICBpZiAoY29uc3RyYWludHMubWluICE9PSB1bmRlZmluZWQgJiYgbiA8IGNvbnN0cmFpbnRzLm1pbikge1xuICAgIHJldHVybiB7XG4gICAgICBrZXksXG4gICAgICBtZXNzYWdlOiBgRW52ICR7a2V5fTogbXVzdCBiZSA+PSAke2NvbnN0cmFpbnRzLm1pbn0sIGdvdCAke259YCxcbiAgICAgIHJhdyxcbiAgICAgIGtpbmQ6ICdpbnZhbGlkX251bWJlcicsXG4gICAgfTtcbiAgfVxuICBpZiAoY29uc3RyYWludHMubWF4ICE9PSB1bmRlZmluZWQgJiYgbiA+IGNvbnN0cmFpbnRzLm1heCkge1xuICAgIHJldHVybiB7XG4gICAgICBrZXksXG4gICAgICBtZXNzYWdlOiBgRW52ICR7a2V5fTogbXVzdCBiZSA8PSAke2NvbnN0cmFpbnRzLm1heH0sIGdvdCAke259YCxcbiAgICAgIHJhdyxcbiAgICAgIGtpbmQ6ICdpbnZhbGlkX251bWJlcicsXG4gICAgfTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuLyoqIE9wdGlvbnMgYWNjZXB0ZWQgYnkgYHBhcnNlRW52VmFsdWVgIChzdWJzZXQgb2YgYFN0cmljdEVudk9wdGlvbnNgKS4gKi9cbnR5cGUgUGFyc2VFbnZWYWx1ZU9wdGlvbnM8UyBleHRlbmRzIFN0cmljdEVudlNwZWM+ID0gUGljazxTdHJpY3RFbnZPcHRpb25zPFM+LCAndHJpbSc+O1xuXG4vKipcbiAqIFJlc29sdmVzIGEgc2NoZW1hIGVudHJ5IGludG8gaXRzIHNwZWMgYW5kIG9wdGlvbmFsIHBlci1rZXkgb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0gZW50cnkgLSBTY2hlbWEgZW50cnkgb3IgYFtzcGVjLCBvcHRpb25zXWAgdHVwbGUuXG4gKiBAcmV0dXJucyBQYXJzZWQgc3BlYyBhbmQgb3B0aW9ucyBmb3IgYHJlc29sdmVBbGxgLlxuICovXG5jb25zdCByZXNvbHZlU2NoZW1hRW50cnkgPSAoXG4gIGVudHJ5OiBTdHJpY3RFbnZTY2hlbWFFbnRyeSxcbik6IHsgc3BlYzogU3RyaWN0RW52U3BlYzsgb3B0aW9uczogU3RyaWN0RW52T3B0aW9uczxTdHJpY3RFbnZTcGVjPiB8IHVuZGVmaW5lZCB9ID0+ICh7XG4gIHNwZWM6IChBcnJheS5pc0FycmF5KGVudHJ5KSA/IGVudHJ5WzBdIDogZW50cnkpIGFzIFN0cmljdEVudlNwZWMsXG4gIG9wdGlvbnM6IChBcnJheS5pc0FycmF5KGVudHJ5KSA/IGVudHJ5WzFdIDogdW5kZWZpbmVkKSBhcyBTdHJpY3RFbnZPcHRpb25zPFN0cmljdEVudlNwZWM+IHwgdW5kZWZpbmVkLFxufSk7XG5cbi8qKlxuICogUGFyc2VzIGEgc2luZ2xlIGVudmlyb25tZW50IHZhcmlhYmxlIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gc3BlYy5cbiAqXG4gKiBDZW50cmFsIHZhbGlkYXRpb24gaGVscGVyIHNoYXJlZCBieSBgcmVzb2x2ZWAgYW5kIGByZXNvbHZlQWxsYC4gRG9lcyBub3QgdGhyb3c7XG4gKiBjYWxsZXJzIGRlY2lkZSB3aGV0aGVyIHRvIHRocm93IGltbWVkaWF0ZWx5IG9yIGNvbGxlY3QgZXJyb3JzLlxuICpcbiAqIE1pc3Npbmcgb3IgZW1wdHkgKGBcIlwiYCkgdmFsdWVzIHVzZSBgZGVmYXVsdFZhbHVlYCB3aGVuIHByb3ZpZGVkLiBXaGVuIGB0cmltYCBpcyBlbmFibGVkLFxuICogd2hpdGVzcGFjZS1vbmx5IHZhbHVlcyBhcmUgdHJlYXRlZCBhcyBlbXB0eS4gTnVtYmVyIHNwZWNzIGRlbGVnYXRlIHRvIGBwYXJzZU51bWJlcmAsIHRoZW5cbiAqIG9wdGlvbmFsIGBtaW5gIC8gYG1heGAgLyBgaW50ZWdlcmAgY29uc3RyYWludHMgKHNlZSB7QGxpbmsgU3RyaWN0RW52TnVtYmVyQ29uc3RyYWludHN9KS5cbiAqIEJvb2xlYW4gc3BlY3MgdHJlYXQgYDFgL2B0cnVlYC9geWVzYC9gb25gIChjYXNlLWluc2Vuc2l0aXZlLCBhZnRlciBub3JtYWxpemF0aW9uKSBhcyBgdHJ1ZWAuXG4gKiBFbnVtIHNwZWNzIHJlcXVpcmUgYW4gZXhhY3QgbWF0Y2ggaW4gYGNob2ljZXNgIChhZnRlciBub3JtYWxpemF0aW9uKS5cbiAqXG4gKiBAdGVtcGxhdGUgSyAtIEVudmlyb25tZW50IHZhcmlhYmxlIGtleSB0eXBlLlxuICogQHRlbXBsYXRlIFMgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBzcGVjIHR5cGUuXG4gKiBAcGFyYW0ga2V5IC0gRW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZS5cbiAqIEBwYXJhbSBzcGVjIC0gVHlwZSBzcGVjIGZvciB0aGUgdmFsdWUuXG4gKiBAcGFyYW0gcmF3IC0gUmF3IHZhbHVlIGZyb20gYHByb2Nlc3MuZW52YCwgaWYgcHJlc2VudC5cbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgLSBGYWxsYmFjayBmcm9tIHtAbGluayBTdHJpY3RFbnZPcHRpb25zLmRlZmF1bHR9IHdoZW4gYHJhd2AgaXMgbWlzc2luZyBvciBlbXB0eS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgdHJpbSBvdmVycmlkZSAoYHRyaW1gIGRlZmF1bHRzIHBlciBzcGVjIHR5cGUpLlxuICogQHJldHVybnMgUGFyc2VkIHZhbHVlIG9yIGEgc3RydWN0dXJlZCB2YWxpZGF0aW9uIGVycm9yLlxuICovXG5jb25zdCBwYXJzZUVudlZhbHVlID0gPEsgZXh0ZW5kcyBzdHJpbmcsIFMgZXh0ZW5kcyBTdHJpY3RFbnZTcGVjPihcbiAga2V5OiBLLFxuICBzcGVjOiBTLFxuICByYXc6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZGVmYXVsdFZhbHVlOiBTdHJpY3RFbnZTcGVjVG9UeXBlPFM+IHwgdW5kZWZpbmVkLFxuICBvcHRpb25zPzogUGFyc2VFbnZWYWx1ZU9wdGlvbnM8Uz4sXG4pOiBQYXJzZUVudlZhbHVlUmVzdWx0PEssIFM+ID0+IHtcbiAgY29uc3QgdHJpbSA9IG9wdGlvbnM/LnRyaW0gPz8gZGVmYXVsdFRyaW1Gb3JTcGVjKHNwZWMpO1xuICBjb25zdCBub3JtYWxpemVkUmF3ID0gbm9ybWFsaXplRW52UmF3KHJhdywgdHJpbSk7XG4gIGNvbnN0IGhhc0RlZmF1bHQgPSBkZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZDtcblxuICBpZiAobm9ybWFsaXplZFJhdyA9PSBudWxsIHx8IG5vcm1hbGl6ZWRSYXcgPT09ICcnKSB7XG4gICAgaWYgKGhhc0RlZmF1bHQpIHtcbiAgICAgIHJldHVybiB7IG9rOiB0cnVlLCB2YWx1ZTogZGVmYXVsdFZhbHVlIGFzIFN0cmljdEVudlNwZWNUb1R5cGU8Uz4gfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG9rOiBmYWxzZSxcbiAgICAgIGVycm9yOiB7IGtleSwgbWVzc2FnZTogYE1pc3NpbmcgcmVxdWlyZWQgZW52aXJvbm1lbnQgdmFyaWFibGU6ICR7a2V5fWAsIHJhdywga2luZDogJ21pc3NpbmcnIH0sXG4gICAgfTtcbiAgfVxuXG4gIHN3aXRjaCAoc3BlYy50eXBlKSB7XG4gICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgY29uc3QgbiA9IHBhcnNlTnVtYmVyKG5vcm1hbGl6ZWRSYXcpO1xuICAgICAgaWYgKG4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogeyBrZXksIG1lc3NhZ2U6IGBFbnYgJHtrZXl9OiBleHBlY3RlZCBudW1iZXIsIGdvdCBcIiR7cmF3fVwiYCwgcmF3LCBraW5kOiAnaW52YWxpZF9udW1iZXInIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjb25zdCBjb25zdHJhaW50RXJyb3IgPSB2YWxpZGF0ZU51bWJlckNvbnN0cmFpbnRzKGtleSwgcmF3LCBuLCBzcGVjKTtcbiAgICAgIGlmIChjb25zdHJhaW50RXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiBjb25zdHJhaW50RXJyb3IgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IG9rOiB0cnVlLCB2YWx1ZTogbiBhcyBTdHJpY3RFbnZTcGVjVG9UeXBlPFM+IH07XG4gICAgfVxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgcmV0dXJuIHsgb2s6IHRydWUsIHZhbHVlOiBwYXJzZUJvb2xlYW5FbnZWYWx1ZShub3JtYWxpemVkUmF3KSBhcyBTdHJpY3RFbnZTcGVjVG9UeXBlPFM+IH07XG4gICAgY2FzZSAnZW51bSc6XG4gICAgICBpZiAoIXNwZWMuY2hvaWNlcy5pbmNsdWRlcyhub3JtYWxpemVkUmF3KSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgbWVzc2FnZTogYEVudiAke2tleX06IG11c3QgYmUgb25lIG9mIFske3NwZWMuY2hvaWNlcy5qb2luKCcsICcpfV1gLFxuICAgICAgICAgICAgcmF3LFxuICAgICAgICAgICAga2luZDogJ2ludmFsaWRfZW51bScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IG9rOiB0cnVlLCB2YWx1ZTogbm9ybWFsaXplZFJhdyBhcyBTdHJpY3RFbnZTcGVjVG9UeXBlPFM+IH07XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7IG9rOiB0cnVlLCB2YWx1ZTogbm9ybWFsaXplZFJhdyBhcyBTdHJpY3RFbnZTcGVjVG9UeXBlPFM+IH07XG4gIH1cbn07XG5cbi8qKlxuICogUmVhZHMgYW5kIHBhcnNlcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHNwZWMuXG4gKlxuICogRGVsZWdhdGVzIHZhbGlkYXRpb24gdG8gYHBhcnNlRW52VmFsdWVgLiBNaXNzaW5nIG9yIGVtcHR5IChgXCJcImApIHZhbHVlcyB1c2VcbiAqIGBvcHRpb25zLmRlZmF1bHRgIHdoZW4gcHJvdmlkZWQ7IG90aGVyd2lzZSBhIGBTdHJpY3RFbnZWYWxpZGF0aW9uRXJyb3JgIGlzIHRocm93bi5cbiAqIFdoaXRlc3BhY2Utb25seSB2YWx1ZXMgYXJlIHRyZWF0ZWQgYXMgbWlzc2luZyB3aGVuIGB0cmltYCBpcyBlbmFibGVkLlxuICogRm9yIGBTdHJpY3RFbnZUeXBlLk51bWJlcmAsIHZhbHVlcyBhcmUgcGFyc2VkIGFzIGZpbml0ZSBudW1iZXJzIChzZWUge0BsaW5rIFN0cmljdEVudlR5cGVOdW1iZXJ9KS5cbiAqXG4gKiBAdGVtcGxhdGUgSyAtIEVudmlyb25tZW50IHZhcmlhYmxlIGtleSB0eXBlLlxuICogQHRlbXBsYXRlIFMgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBzcGVjIHR5cGUuXG4gKiBAcGFyYW0ga2V5IC0gRW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZSAoZS5nLiBgXCJQT1JUXCJgLCBgXCJOT0RFX0VOVlwiYCkuXG4gKiBAcGFyYW0gc3BlYyAtIFR5cGUgc3BlYzsgZGVmYXVsdHMgdG8gYFN0cmljdEVudlR5cGUuU3RyaW5nYCB3aGVuIG9taXR0ZWQuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGB7IGRlZmF1bHQsIHRyaW0gfWA7IHNlZSB7QGxpbmsgU3RyaWN0RW52T3B0aW9uc30uXG4gKiBAcmV0dXJucyBQYXJzZWQgdmFsdWUgd2l0aCB0eXBlIGluZmVycmVkIGZyb20gYHNwZWNgLlxuICogQHRocm93cyB7U3RyaWN0RW52VmFsaWRhdGlvbkVycm9yfSBXaGVuIHRoZSB2YXJpYWJsZSBpcyBtaXNzaW5nLCBlbXB0eSB3aXRob3V0IGEgZGVmYXVsdCxcbiAqICAgd2hpdGVzcGFjZS1vbmx5IHdpdGhvdXQgYSBkZWZhdWx0ICh3aGVuIHRyaW1taW5nKSwgb3IgaW52YWxpZCBmb3IgdGhlIHNwZWMuXG4gKi9cbmNvbnN0IHJlc29sdmUgPSA8SyBleHRlbmRzIHN0cmluZywgUyBleHRlbmRzIFN0cmljdEVudlNwZWMgPSBTdHJpY3RFbnZUeXBlU3RyaW5nPihcbiAga2V5OiBLLFxuICBzcGVjOiBTID0gU3RyaWN0RW52VHlwZS5TdHJpbmcgYXMgUyxcbiAgb3B0aW9ucz86IFN0cmljdEVudk9wdGlvbnM8Uz4sXG4pOiBTdHJpY3RFbnZTcGVjVG9UeXBlPFM+ID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gcGFyc2VFbnZWYWx1ZShrZXksIHNwZWMsIHByb2Nlc3MuZW52W2tleV0sIG9wdGlvbnM/LmRlZmF1bHQsIG9wdGlvbnMpO1xuICBpZiAoIXJlc3VsdC5vaykge1xuICAgIHRocm93IG5ldyBTdHJpY3RFbnZWYWxpZGF0aW9uRXJyb3IoW3Jlc3VsdC5lcnJvcl0pO1xuICB9XG4gIHJldHVybiByZXN1bHQudmFsdWU7XG59O1xuXG4vKipcbiAqIFJlYWRzIGFuZCBwYXJzZXMgbXVsdGlwbGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gc2NoZW1hLlxuICpcbiAqIEFsd2F5cyBldmFsdWF0ZXMgZXZlcnkga2V5IGluIGBzY2hlbWFgLiBFYWNoIGVudHJ5IGlzIHZhbGlkYXRlZCB2aWEgYHBhcnNlRW52VmFsdWVgO1xuICogYWxsIGVycm9ycyBhcmUgY29sbGVjdGVkIGFuZCB0aHJvd24gb25jZSBpbiBhIHNpbmdsZSBgU3RyaWN0RW52VmFsaWRhdGlvbkVycm9yYC5cbiAqIE51bWJlciBzcGVjcyB1c2UgdGhlIHNhbWUgZmluaXRlLW51bWJlciBydWxlcyBhcyBgcmVzb2x2ZWAuXG4gKlxuICogQHRlbXBsYXRlIFRTY2hlbWEgLSBTY2hlbWEgb2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gc2NoZW1hIC0gTWFwIG9mIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVzIHRvIHNwZWNzIG9yIGBbc3BlYywgb3B0aW9uc11gIHR1cGxlc1xuICogICAoc2VlIHtAbGluayBTdHJpY3RFbnZPcHRpb25zfSBmb3IgcGVyLWtleSBgZGVmYXVsdGAgLyBgdHJpbWApLlxuICogQHJldHVybnMgUGFyc2VkIGVudmlyb25tZW50IG9iamVjdCB3aXRoIHR5cGVzIGluZmVycmVkIGZyb20gdGhlIHNjaGVtYS5cbiAqIEB0aHJvd3Mge1N0cmljdEVudlZhbGlkYXRpb25FcnJvcn0gV2hlbiBvbmUgb3IgbW9yZSB2YXJpYWJsZXMgYXJlIG1pc3NpbmcsIGVtcHR5IHdpdGhvdXQgYSBkZWZhdWx0LFxuICogICB3aGl0ZXNwYWNlLW9ubHkgd2l0aG91dCBhIGRlZmF1bHQgKHdoZW4gdHJpbW1pbmcpLCBvciBpbnZhbGlkLlxuICovXG5jb25zdCByZXNvbHZlQWxsID0gPFRTY2hlbWEgZXh0ZW5kcyBTdHJpY3RFbnZTY2hlbWE+KHNjaGVtYTogVFNjaGVtYSk6IFN0cmljdEVudlNjaGVtYVRvVHlwZTxUU2NoZW1hPiA9PiB7XG4gIGNvbnN0IGVudnM6IFBhcnRpYWw8U3RyaWN0RW52U2NoZW1hVG9UeXBlPFRTY2hlbWE+PiA9IHt9O1xuICBjb25zdCBlcnJvcnM6IFN0cmljdEVudlZhbGlkYXRpb25FbnRyeTxFeHRyYWN0PGtleW9mIFRTY2hlbWEsIHN0cmluZz4+W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzY2hlbWEpIGFzIEFycmF5PEV4dHJhY3Q8a2V5b2YgVFNjaGVtYSwgc3RyaW5nPj4pIHtcbiAgICBjb25zdCB7IHNwZWMsIG9wdGlvbnMgfSA9IHJlc29sdmVTY2hlbWFFbnRyeShzY2hlbWFba2V5XSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBwYXJzZUVudlZhbHVlKGtleSwgc3BlYywgcHJvY2Vzcy5lbnZba2V5XSwgb3B0aW9ucz8uZGVmYXVsdCwgb3B0aW9ucyk7XG4gICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgIGVycm9ycy5wdXNoKHJlc3VsdC5lcnJvcik7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZW52c1trZXldID0gcmVzdWx0LnZhbHVlIGFzIFN0cmljdEVudlNjaGVtYVRvVHlwZTxUU2NoZW1hPlt0eXBlb2Yga2V5XTtcbiAgfVxuXG4gIGlmIChlcnJvcnMubGVuZ3RoID4gMCkgdGhyb3cgbmV3IFN0cmljdEVudlZhbGlkYXRpb25FcnJvcihlcnJvcnMpO1xuICByZXR1cm4gZW52cyBhcyBTdHJpY3RFbnZTY2hlbWFUb1R5cGU8VFNjaGVtYT47XG59O1xuXG4vKipcbiAqIFR5cGUtc2FmZSBlbnZpcm9ubWVudCB2YXJpYWJsZSByZXNvbHZlciBmb3IgTm9kZS5qcyBgcHJvY2Vzcy5lbnZgLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgcG9ydCA9IFN0cmljdEVudlJlc29sdmVyLnJlc29sdmUoJ1BPUlQnLCBTdHJpY3RFbnZUeXBlLlBvc2l0aXZlSW50KTtcbiAqIGNvbnN0IGVudnMgPSBTdHJpY3RFbnZSZXNvbHZlci5yZXNvbHZlQWxsKHtcbiAqICAgUE9SVDogU3RyaWN0RW52VHlwZS5Qb3NpdGl2ZUludCxcbiAqICAgREVCVUc6IFtTdHJpY3RFbnZUeXBlLkJvb2xlYW4sIHsgZGVmYXVsdDogZmFsc2UgfV0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgU3RyaWN0RW52UmVzb2x2ZXIgPSB7XG4gIC8qKiBSZWFkcyBhbmQgcGFyc2VzIGEgc2luZ2xlIGVudmlyb25tZW50IHZhcmlhYmxlLiBTZWUge0BsaW5rIHJlc29sdmV9LiAqL1xuICByZXNvbHZlLFxuICAvKiogUmVhZHMgYW5kIHBhcnNlcyBtdWx0aXBsZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW4gb25lIHBhc3MuIFNlZSB7QGxpbmsgcmVzb2x2ZUFsbH0uICovXG4gIHJlc29sdmVBbGwsXG59IGFzIGNvbnN0O1xuIl19
package/package.json CHANGED
@@ -44,10 +44,10 @@
44
44
  "eslint-plugin-import": "^2.32.0",
45
45
  "jest": "^30.4.2",
46
46
  "jest-junit": "^17",
47
- "projen": "^0.101.20",
47
+ "projen": "^0.101.23",
48
48
  "ts-jest": "^29.4.12",
49
49
  "ts-node": "^10.9.2",
50
- "typescript": "5.9.x"
50
+ "typescript": "6.0.x"
51
51
  },
52
52
  "keywords": [
53
53
  "env",
@@ -59,12 +59,18 @@
59
59
  "engines": {
60
60
  "node": ">= 20.0.0"
61
61
  },
62
+ "devEngines": {
63
+ "packageManager": {
64
+ "name": "npm",
65
+ "onFail": "ignore"
66
+ }
67
+ },
62
68
  "main": "lib/index.js",
63
69
  "license": "Apache-2.0",
64
70
  "publishConfig": {
65
71
  "access": "public"
66
72
  },
67
- "version": "0.5.4",
73
+ "version": "0.6.0",
68
74
  "jest": {
69
75
  "coverageProvider": "v8",
70
76
  "testMatch": [