safe-env-getter 0.1.10 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -10,7 +10,7 @@ Type-safe environment variable getter for Node.js. Reads and parses `process.env
10
10
 
11
11
  - **Typed specs**: `string`, `number`, `boolean`, and `enum` with TypeScript inference
12
12
  - **Optional defaults**: Fallback values when the variable is unset or empty
13
- - **Strict validation**: Throws with clear messages for missing or invalid values
13
+ - **Strict validation**: Throws `SafeEnvGetterValidationError` with structured errors
14
14
  - **Boolean parsing**: Accepts `1`, `true`, `yes`, `on` (case-insensitive) as `true`
15
15
  - **Enum constraint**: Restricts values to a fixed set of choices
16
16
 
@@ -31,7 +31,7 @@ yarn add safe-env-getter
31
31
  ## Usage
32
32
 
33
33
  ```ts
34
- import { SafeEnvGetter, SafeEnvType } from 'safe-env-getter';
34
+ import { SafeEnvGetter, SafeEnvGetterValidationError, SafeEnvType } from 'safe-env-getter';
35
35
 
36
36
  // String (spec omitted → defaults to SafeEnvType.String; throws if missing)
37
37
  const nodeEnv = SafeEnvGetter.getEnv('NODE_ENV');
@@ -46,14 +46,36 @@ const port = SafeEnvGetter.getEnv('PORT', SafeEnvType.Number, { default: 3000 })
46
46
  const debug = SafeEnvGetter.getEnv('DEBUG', SafeEnvType.Boolean, { default: false });
47
47
 
48
48
  // Enum (required)
49
- const mode = SafeEnvGetter.getEnv('MODE', SafeEnvType.Enum(['read', 'write']));
49
+ const mode = SafeEnvGetter.getEnv('MODE', SafeEnvType.Enum(['read', 'write'] as const));
50
50
  // Enum with default
51
- const modeWithDefault = SafeEnvGetter.getEnv('MODE', SafeEnvType.Enum(['read', 'write']), { default: 'read' });
51
+ const modeWithDefault = SafeEnvGetter.getEnv('MODE', SafeEnvType.Enum(['read', 'write'] as const), { default: 'read' });
52
+
53
+ // Read multiple envs at once (collects all missing/invalid errors and throws once)
54
+ const envs = SafeEnvGetter.getEnvs({
55
+ PORT: [SafeEnvType.Number, { default: 3000 }],
56
+ DEBUG: [SafeEnvType.Boolean, { default: false }],
57
+ MODE: SafeEnvType.Enum(['read', 'write'] as const),
58
+ });
59
+
60
+ // Access structured validation errors
61
+ try {
62
+ SafeEnvGetter.getEnvs({
63
+ PORT: SafeEnvType.Number,
64
+ MODE: SafeEnvType.Enum(['read', 'write'] as const),
65
+ });
66
+ } catch (e) {
67
+ if (e instanceof SafeEnvGetterValidationError) {
68
+ // e.errors: [{ key, message, raw?, kind }, ...]
69
+ // e.keys: ['PORT', 'MODE', ...]
70
+ console.error(e.errors);
71
+ }
72
+ throw e;
73
+ }
52
74
  ```
53
75
 
54
76
  ## Options
55
77
 
56
- `SafeEnvGetter.getEnv(key, spec?, options?)` takes:
78
+ ### `SafeEnvGetter.getEnv(key, spec?, options?)`
57
79
 
58
80
  | Argument | Required | Description |
59
81
  |----------|----------|-------------|
@@ -61,6 +83,13 @@ const modeWithDefault = SafeEnvGetter.getEnv('MODE', SafeEnvType.Enum(['read', '
61
83
  | **spec** | No | Type spec; defaults to `SafeEnvType.String` when omitted. Use `SafeEnvType.String`, `SafeEnvType.Number`, `SafeEnvType.Boolean`, or `SafeEnvType.Enum(choices)`. |
62
84
  | **options** | No | Optional object. Use `{ default: value }` to provide a fallback when the variable is missing or empty. |
63
85
 
86
+ ### `SafeEnvGetter.getEnvs(schema)`
87
+
88
+ `schema` is an object where each key is an env var name and each value is either:
89
+
90
+ - A spec (e.g. `SafeEnvType.Number`)
91
+ - A tuple of `[spec, { default }]` (e.g. `[SafeEnvType.Number, { default: 3000 }]`)
92
+
64
93
  **Spec types:**
65
94
 
66
95
  | Spec | Shape | Description |
@@ -72,10 +101,15 @@ const modeWithDefault = SafeEnvGetter.getEnv('MODE', SafeEnvType.Enum(['read', '
72
101
 
73
102
  **Errors:**
74
103
 
75
- - If the variable is missing or empty and `options.default` is not set: `Missing required environment variable: <key>`.
104
+ - Missing/empty without a default: `Missing required environment variable: <key>`.
76
105
  - For `number`, invalid values: `Env <key>: expected number, got "<raw>"`.
77
106
  - For `enum`, invalid values: `Env <key>: must be one of [choice1, choice2, ...]`.
78
107
 
108
+ Both `getEnv()` and `getEnvs()` throw `SafeEnvGetterValidationError`, which exposes structured data:
109
+
110
+ - `errors`: `[{ key, message, raw?, kind }, ...]`
111
+ - `keys`: `['KEY1', 'KEY2', ...]`
112
+
79
113
  ## Requirements
80
114
 
81
115
  - **Node.js** >= 20.0.0
package/lib/index.d.ts CHANGED
@@ -38,6 +38,62 @@ export type SafeEnvTypeEnum<T extends string = string> = {
38
38
  };
39
39
  /** Union of all environment variable spec types. */
40
40
  export type SafeEnvSpec = SafeEnvTypeString | SafeEnvTypeNumber | SafeEnvTypeBoolean | SafeEnvTypeEnum;
41
+ /**
42
+ * Discriminated union error kinds emitted during env parsing/validation.
43
+ */
44
+ export type SafeEnvErrorKind = 'missing' | 'invalid_number' | 'invalid_enum';
45
+ /**
46
+ * A structured validation error entry for a single env var.
47
+ *
48
+ * @template K - Environment variable key type.
49
+ */
50
+ export type SafeEnvError<K extends string = string> = {
51
+ key: K;
52
+ message: string;
53
+ raw?: string;
54
+ kind: SafeEnvErrorKind;
55
+ };
56
+ /**
57
+ * Base error class for this package.
58
+ *
59
+ * @example
60
+ * ```ts
61
+ * try {
62
+ * SafeEnvGetter.getEnv('PORT', SafeEnvType.Number);
63
+ * } catch (e) {
64
+ * if (e instanceof SafeEnvGetterError) {
65
+ * // Handle all safe-env-getter errors
66
+ * }
67
+ * }
68
+ * ```
69
+ */
70
+ export declare abstract class SafeEnvGetterError extends Error {
71
+ protected constructor(message: string);
72
+ }
73
+ /**
74
+ * Validation error that carries one or more environment variable issues.
75
+ *
76
+ * It is thrown by `SafeEnvGetter.getEnv()` (single-entry `errors`) and
77
+ * `SafeEnvGetter.getEnvs()` (multi-entry `errors`).
78
+ */
79
+ export declare class SafeEnvGetterValidationError<K extends string = string> extends SafeEnvGetterError {
80
+ /**
81
+ * Formats validation errors into a human-readable error message.
82
+ */
83
+ static format<K extends string>(errors: readonly SafeEnvError<K>[]): string;
84
+ /**
85
+ * Structured list of validation errors.
86
+ */
87
+ readonly errors: readonly SafeEnvError<K>[];
88
+ /**
89
+ * Convenience list of keys included in `errors`.
90
+ */
91
+ readonly keys: readonly K[];
92
+ /**
93
+ * Creates a new validation error from one or more `SafeEnvError` entries.
94
+ */
95
+ constructor(errors: readonly SafeEnvError<K>[]);
96
+ }
41
97
  /**
42
98
  * Predefined spec constants for use as the second argument to `getEnv`.
43
99
  * Use the third argument `options: { default: value }` to provide a fallback when the variable is missing.
@@ -67,6 +123,31 @@ export declare const SafeEnvType: {
67
123
  * @template S - A `SafeEnvSpec` variant.
68
124
  */
69
125
  export type SafeEnvSpecToType<S> = S extends SafeEnvTypeString ? string : S extends SafeEnvTypeNumber ? number : S extends SafeEnvTypeBoolean ? boolean : S extends SafeEnvTypeEnum<infer T> ? T : never;
126
+ /**
127
+ * Options for reading an env var with an optional default.
128
+ */
129
+ export type SafeGetEnvOptions<S extends SafeEnvSpec> = {
130
+ default?: SafeEnvSpecToType<S>;
131
+ };
132
+ /**
133
+ * Schema entry for a single env var.
134
+ *
135
+ * Either provide a spec directly, or a tuple of `[spec, options]` to attach a default.
136
+ */
137
+ export type SafeEnvSchemaEntry<S extends SafeEnvSpec = SafeEnvSpec> = S | readonly [S, SafeGetEnvOptions<S>];
138
+ /**
139
+ * Schema object used by `getEnvs()`.
140
+ *
141
+ * Keys are env var names, values are specs (optionally with defaults).
142
+ */
143
+ export type SafeEnvSchema = Record<string, SafeEnvSchemaEntry>;
144
+ type SafeEnvSchemaEntryToSpec<E> = E extends readonly [infer S, unknown] ? S : E;
145
+ /**
146
+ * Maps a schema object to the resulting parsed env object type.
147
+ */
148
+ export type SafeEnvSchemaToType<TSchema extends SafeEnvSchema> = {
149
+ [K in keyof TSchema]: SafeEnvSpecToType<SafeEnvSchemaEntryToSpec<TSchema[K]> & SafeEnvSpec>;
150
+ };
70
151
  /**
71
152
  * Reads and parses an environment variable according to the given spec.
72
153
  * If the variable is missing or empty and no default is provided in `options`, throws an error.
@@ -75,9 +156,7 @@ export type SafeEnvSpecToType<S> = S extends SafeEnvTypeString ? string : S exte
75
156
  * @param spec - Type spec; defaults to `SafeEnvType.String` when omitted.
76
157
  * @param options - Optional. Use `{ default: value }` to provide a fallback when the variable is missing.
77
158
  * @returns Parsed value with type inferred from `spec`.
78
- * @throws {Error} When the variable is missing and `options.default` is not set.
79
- * @throws {Error} When `spec.type` is `"number"` and the value is not a valid number.
80
- * @throws {Error} When `spec.type` is `"enum"` and the value is not in `spec.choices`.
159
+ * @throws {SafeEnvGetterValidationError} When the variable is missing/invalid and `options.default` is not set (or not applicable).
81
160
  */
82
161
  declare function getEnv<K extends string, S extends SafeEnvSpec = SafeEnvTypeString>(key: K, spec?: S, options?: {
83
162
  default?: SafeEnvSpecToType<S>;
@@ -88,5 +167,6 @@ declare function getEnv<K extends string, S extends SafeEnvSpec = SafeEnvTypeStr
88
167
  */
89
168
  export declare const SafeEnvGetter: {
90
169
  readonly getEnv: typeof getEnv;
170
+ readonly getEnvs: <TSchema extends SafeEnvSchema>(schema: TSchema) => SafeEnvSchemaToType<TSchema>;
91
171
  };
92
172
  export {};
package/lib/index.js CHANGED
@@ -1,6 +1,53 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SafeEnvGetter = exports.SafeEnvType = void 0;
3
+ exports.SafeEnvGetter = exports.SafeEnvType = exports.SafeEnvGetterValidationError = exports.SafeEnvGetterError = void 0;
4
+ /**
5
+ * Base error class for this package.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * try {
10
+ * SafeEnvGetter.getEnv('PORT', SafeEnvType.Number);
11
+ * } catch (e) {
12
+ * if (e instanceof SafeEnvGetterError) {
13
+ * // Handle all safe-env-getter errors
14
+ * }
15
+ * }
16
+ * ```
17
+ */
18
+ class SafeEnvGetterError extends Error {
19
+ constructor(message) {
20
+ super(message);
21
+ this.name = 'SafeEnvGetterError';
22
+ }
23
+ }
24
+ exports.SafeEnvGetterError = SafeEnvGetterError;
25
+ /**
26
+ * Validation error that carries one or more environment variable issues.
27
+ *
28
+ * It is thrown by `SafeEnvGetter.getEnv()` (single-entry `errors`) and
29
+ * `SafeEnvGetter.getEnvs()` (multi-entry `errors`).
30
+ */
31
+ class SafeEnvGetterValidationError extends SafeEnvGetterError {
32
+ /**
33
+ * Formats validation errors into a human-readable error message.
34
+ */
35
+ static format(errors) {
36
+ const lines = errors.map((e) => `- ${e.key}: ${e.message}${e.raw == null ? '' : ` (raw="${e.raw}")`}`);
37
+ return `Invalid environment variables (${errors.length}):\n${lines.join('\n')}`;
38
+ }
39
+ /**
40
+ * Creates a new validation error from one or more `SafeEnvError` entries.
41
+ */
42
+ constructor(errors) {
43
+ const msg = SafeEnvGetterValidationError.format(errors);
44
+ super(msg);
45
+ this.name = 'SafeEnvGetterValidationError';
46
+ this.errors = errors;
47
+ this.keys = errors.map((e) => e.key);
48
+ }
49
+ }
50
+ exports.SafeEnvGetterValidationError = SafeEnvGetterValidationError;
4
51
  /**
5
52
  * Predefined spec constants for use as the second argument to `getEnv`.
6
53
  * Use the third argument `options: { default: value }` to provide a fallback when the variable is missing.
@@ -27,41 +74,109 @@ exports.SafeEnvType = {
27
74
  * @param spec - Type spec; defaults to `SafeEnvType.String` when omitted.
28
75
  * @param options - Optional. Use `{ default: value }` to provide a fallback when the variable is missing.
29
76
  * @returns Parsed value with type inferred from `spec`.
30
- * @throws {Error} When the variable is missing and `options.default` is not set.
31
- * @throws {Error} When `spec.type` is `"number"` and the value is not a valid number.
32
- * @throws {Error} When `spec.type` is `"enum"` and the value is not in `spec.choices`.
77
+ * @throws {SafeEnvGetterValidationError} When the variable is missing/invalid and `options.default` is not set (or not applicable).
33
78
  */
34
79
  function getEnv(key, spec = exports.SafeEnvType.String, options) {
35
80
  const raw = process.env[key];
36
81
  const defaultValue = options?.default;
37
82
  const hasDefault = defaultValue !== undefined;
38
83
  if (raw == null || raw === '') {
39
- if (!hasDefault)
40
- throw new Error(`Missing required environment variable: ${key}`);
84
+ if (!hasDefault) {
85
+ throw new SafeEnvGetterValidationError([
86
+ { key, message: `Missing required environment variable: ${key}`, raw, kind: 'missing' },
87
+ ]);
88
+ }
41
89
  return defaultValue;
42
90
  }
43
91
  switch (spec.type) {
44
92
  case 'number': {
45
93
  const n = Number(raw);
46
- if (Number.isNaN(n))
47
- throw new Error(`Env ${key}: expected number, got "${raw}"`);
94
+ if (Number.isNaN(n)) {
95
+ throw new SafeEnvGetterValidationError([
96
+ { key, message: `Env ${key}: expected number, got "${raw}"`, raw, kind: 'invalid_number' },
97
+ ]);
98
+ }
48
99
  return n;
49
100
  }
50
101
  case 'boolean':
51
102
  return (/^(1|true|yes|on)$/i.test(raw) ? true : false);
52
103
  case 'enum':
53
- if (!spec.choices.includes(raw))
54
- throw new Error(`Env ${key}: must be one of [${spec.choices.join(', ')}]`);
104
+ if (!spec.choices.includes(raw)) {
105
+ throw new SafeEnvGetterValidationError([
106
+ { key, message: `Env ${key}: must be one of [${spec.choices.join(', ')}]`, raw, kind: 'invalid_enum' },
107
+ ]);
108
+ }
55
109
  return raw;
56
110
  default:
57
111
  return raw;
58
112
  }
59
113
  }
114
+ /**
115
+ * Reads and parses multiple environment variables according to the given schema.
116
+ *
117
+ * This function always evaluates every key in `schema`. If any missing/invalid values
118
+ * are found, it throws once with a `SafeEnvGetterValidationError` that contains all issues.
119
+ *
120
+ * @param schema - Map of env var names to specs, optionally with per-key defaults via `[spec, { default }]`.
121
+ * @returns An object of parsed envs with types inferred from the schema.
122
+ * @throws {SafeEnvGetterValidationError} When one or more required env vars are missing or invalid.
123
+ */
124
+ const getEnvs = (schema) => {
125
+ const envs = {};
126
+ const errors = [];
127
+ for (const key of Object.keys(schema)) {
128
+ const entry = schema[key];
129
+ const spec = (Array.isArray(entry) ? entry[0] : entry);
130
+ const options = (Array.isArray(entry) ? entry[1] : undefined);
131
+ const raw = process.env[key];
132
+ const defaultValue = options?.default;
133
+ const hasDefault = defaultValue !== undefined;
134
+ if (raw == null || raw === '') {
135
+ if (!hasDefault) {
136
+ errors.push({ key, message: `Missing required environment variable: ${key}`, raw, kind: 'missing' });
137
+ continue;
138
+ }
139
+ envs[key] = defaultValue;
140
+ continue;
141
+ }
142
+ if (spec.type === 'number') {
143
+ const n = Number(raw);
144
+ if (Number.isNaN(n)) {
145
+ errors.push({ key, message: `Env ${key}: expected number, got "${raw}"`, raw, kind: 'invalid_number' });
146
+ continue;
147
+ }
148
+ envs[key] = n;
149
+ continue;
150
+ }
151
+ if (spec.type === 'boolean') {
152
+ envs[key] = (/^(1|true|yes|on)$/i.test(raw) ? true : false);
153
+ continue;
154
+ }
155
+ if (spec.type === 'enum') {
156
+ if (!spec.choices.includes(raw)) {
157
+ errors.push({
158
+ key,
159
+ message: `Env ${key}: must be one of [${spec.choices.join(', ')}]`,
160
+ raw,
161
+ kind: 'invalid_enum',
162
+ });
163
+ continue;
164
+ }
165
+ envs[key] = raw;
166
+ continue;
167
+ }
168
+ envs[key] = raw;
169
+ }
170
+ if (errors.length > 0)
171
+ throw new SafeEnvGetterValidationError(errors);
172
+ return envs;
173
+ };
60
174
  /**
61
175
  * Safe environment variable getter.
62
176
  * Use `SafeEnvGetter.getEnv(key, spec?, options?)` to read and parse environment variables with type safety.
63
177
  */
64
178
  exports.SafeEnvGetter = {
65
179
  getEnv,
180
+ getEnvs,
66
181
  };
67
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBb0NBOzs7R0FHRztBQUNVLFFBQUEsV0FBVyxHQUFHO0lBQ3pCLCtCQUErQjtJQUMvQixNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUF1QztJQUMvRCxnQ0FBZ0M7SUFDaEMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBdUM7SUFDL0QsdURBQXVEO0lBQ3ZELE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQXdDO0lBQ2xFOzs7O09BSUc7SUFDSCxJQUFJLEVBQUUsQ0FBbUIsT0FBcUIsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQXVCO0NBQzVGLENBQUM7QUFhWDs7Ozs7Ozs7Ozs7R0FXRztBQUNILFNBQVMsTUFBTSxDQUNiLEdBQU0sRUFDTixPQUFVLG1CQUFXLENBQUMsTUFBVyxFQUNqQyxPQUE0QztJQUU1QyxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLE1BQU0sWUFBWSxHQUFHLE9BQU8sRUFBRSxPQUFPLENBQUM7SUFDdEMsTUFBTSxVQUFVLEdBQUcsWUFBWSxLQUFLLFNBQVMsQ0FBQztJQUU5QyxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxVQUFVO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNsRixPQUFPLFlBQW9DLENBQUM7SUFDOUMsQ0FBQztJQUVELFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xCLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNkLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN0QixJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxHQUFHLDJCQUEyQixHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQ2xGLE9BQU8sQ0FBeUIsQ0FBQztRQUNuQyxDQUFDO1FBQ0QsS0FBSyxTQUFTO1lBQ1osT0FBTyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQXlCLENBQUM7UUFDakYsS0FBSyxNQUFNO1lBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztnQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sR0FBRyxxQkFBcUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVHLE9BQU8sR0FBMkIsQ0FBQztRQUNyQztZQUNFLE9BQU8sR0FBMkIsQ0FBQztJQUN2QyxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNVLFFBQUEsYUFBYSxHQUFHO0lBQzNCLE1BQU07Q0FDRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTcGVjIGZvciBhIHN0cmluZyBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHBhc3NlZCB2aWEgdGhlIHRoaXJkIGFyZ3VtZW50IG9mIGBnZXRFbnZgLCBub3QgaW4gdGhlIHNwZWMuXG4gKi9cbmV4cG9ydCB0eXBlIFNhZmVFbnZUeXBlU3RyaW5nID0geyB0eXBlOiAnc3RyaW5nJzsgZGVmYXVsdD86IHN0cmluZyB9O1xuXG4vKipcbiAqIFNwZWMgZm9yIGEgbnVtZXJpYyBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqIFZhbHVlcyBhcmUgcGFyc2VkIHdpdGggYE51bWJlcigpYDsgaW52YWxpZCB2YWx1ZXMgdGhyb3cuXG4gKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBwYXNzZWQgdmlhIHRoZSB0aGlyZCBhcmd1bWVudCBvZiBgZ2V0RW52YCwgbm90IGluIHRoZSBzcGVjLlxuICovXG5leHBvcnQgdHlwZSBTYWZlRW52VHlwZU51bWJlciA9IHsgdHlwZTogJ251bWJlcic7IGRlZmF1bHQ/OiBudW1iZXIgfTtcblxuLyoqXG4gKiBTcGVjIGZvciBhIGJvb2xlYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKiBQYXJzZXMgYDFgLCBgdHJ1ZWAsIGB5ZXNgLCBgb25gIChjYXNlLWluc2Vuc2l0aXZlKSBhcyBgdHJ1ZWA7IGFueXRoaW5nIGVsc2UgYXMgYGZhbHNlYC5cbiAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHBhc3NlZCB2aWEgdGhlIHRoaXJkIGFyZ3VtZW50IG9mIGBnZXRFbnZgLCBub3QgaW4gdGhlIHNwZWMuXG4gKi9cbmV4cG9ydCB0eXBlIFNhZmVFbnZUeXBlQm9vbGVhbiA9IHsgdHlwZTogJ2Jvb2xlYW4nOyBkZWZhdWx0PzogYm9vbGVhbiB9O1xuXG4vKipcbiAqIFNwZWMgZm9yIGFuIGVudW0gZW52aXJvbm1lbnQgdmFyaWFibGUgd2l0aCBhIGZpeGVkIHNldCBvZiBjaG9pY2VzLlxuICogVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIGBjaG9pY2VzYDsgb3RoZXJ3aXNlIGFuIGVycm9yIGlzIHRocm93bi5cbiAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHBhc3NlZCB2aWEgdGhlIHRoaXJkIGFyZ3VtZW50IG9mIGBnZXRFbnZgLCBub3QgaW4gdGhlIHNwZWMuXG4gKlxuICogQHRlbXBsYXRlIFQgLSBMaXRlcmFsIHN0cmluZyB1bmlvbiBvZiBhbGxvd2VkIHZhbHVlcy5cbiAqL1xuZXhwb3J0IHR5cGUgU2FmZUVudlR5cGVFbnVtPFQgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+ID0geyB0eXBlOiAnZW51bSc7IGNob2ljZXM6IHJlYWRvbmx5IFRbXTsgZGVmYXVsdD86IFQgfTtcblxuLyoqIFVuaW9uIG9mIGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZSBzcGVjIHR5cGVzLiAqL1xuZXhwb3J0IHR5cGUgU2FmZUVudlNwZWMgPVxuICB8IFNhZmVFbnZUeXBlU3RyaW5nXG4gIHwgU2FmZUVudlR5cGVOdW1iZXJcbiAgfCBTYWZlRW52VHlwZUJvb2xlYW5cbiAgfCBTYWZlRW52VHlwZUVudW07XG5cbi8qKlxuICogUHJlZGVmaW5lZCBzcGVjIGNvbnN0YW50cyBmb3IgdXNlIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGdldEVudmAuXG4gKiBVc2UgdGhlIHRoaXJkIGFyZ3VtZW50IGBvcHRpb25zOiB7IGRlZmF1bHQ6IHZhbHVlIH1gIHRvIHByb3ZpZGUgYSBmYWxsYmFjayB3aGVuIHRoZSB2YXJpYWJsZSBpcyBtaXNzaW5nLlxuICovXG5leHBvcnQgY29uc3QgU2FmZUVudlR5cGUgPSB7XG4gIC8qKiBTcGVjIGZvciBhIHN0cmluZyB2YWx1ZS4gKi9cbiAgU3RyaW5nOiB7IHR5cGU6ICdzdHJpbmcnIH0gYXMgY29uc3Qgc2F0aXNmaWVzIFNhZmVFbnZUeXBlU3RyaW5nLFxuICAvKiogU3BlYyBmb3IgYSBudW1lcmljIHZhbHVlLiAqL1xuICBOdW1iZXI6IHsgdHlwZTogJ251bWJlcicgfSBhcyBjb25zdCBzYXRpc2ZpZXMgU2FmZUVudlR5cGVOdW1iZXIsXG4gIC8qKiBTcGVjIGZvciBhIGJvb2xlYW4gdmFsdWUgKDEvdHJ1ZS95ZXMvb24g4oaSIHRydWUpLiAqL1xuICBCb29sZWFuOiB7IHR5cGU6ICdib29sZWFuJyB9IGFzIGNvbnN0IHNhdGlzZmllcyBTYWZlRW52VHlwZUJvb2xlYW4sXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3BlYyB0aGF0IHJlc3RyaWN0cyB0aGUgdmFsdWUgdG8gb25lIG9mIHRoZSBnaXZlbiBjaG9pY2VzLlxuICAgKiBAcGFyYW0gY2hvaWNlcyAtIEFsbG93ZWQgc3RyaW5nIGxpdGVyYWxzLlxuICAgKiBAcmV0dXJucyBFbnVtIHNwZWMgZm9yIHVzZSB3aXRoIGBnZXRFbnZgLlxuICAgKi9cbiAgRW51bTogPFQgZXh0ZW5kcyBzdHJpbmc+KGNob2ljZXM6IHJlYWRvbmx5IFRbXSkgPT4gKHsgdHlwZTogJ2VudW0nLCBjaG9pY2VzIH0pIGFzIFNhZmVFbnZUeXBlRW51bTxUPixcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogSW5mZXJzIHRoZSByZXR1cm4gdHlwZSBmcm9tIHRoZSBnaXZlbiBzcGVjLlxuICogQHRlbXBsYXRlIFMgLSBBIGBTYWZlRW52U3BlY2AgdmFyaWFudC5cbiAqL1xuZXhwb3J0IHR5cGUgU2FmZUVudlNwZWNUb1R5cGU8Uz4gPVxuICBTIGV4dGVuZHMgU2FmZUVudlR5cGVTdHJpbmcgPyBzdHJpbmdcbiAgICA6IFMgZXh0ZW5kcyBTYWZlRW52VHlwZU51bWJlciA/IG51bWJlclxuICAgICAgOiBTIGV4dGVuZHMgU2FmZUVudlR5cGVCb29sZWFuID8gYm9vbGVhblxuICAgICAgICA6IFMgZXh0ZW5kcyBTYWZlRW52VHlwZUVudW08aW5mZXIgVD4gPyBUXG4gICAgICAgICAgOiBuZXZlcjtcblxuLyoqXG4gKiBSZWFkcyBhbmQgcGFyc2VzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gc3BlYy5cbiAqIElmIHRoZSB2YXJpYWJsZSBpcyBtaXNzaW5nIG9yIGVtcHR5IGFuZCBubyBkZWZhdWx0IGlzIHByb3ZpZGVkIGluIGBvcHRpb25zYCwgdGhyb3dzIGFuIGVycm9yLlxuICpcbiAqIEBwYXJhbSBrZXkgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lIChlLmcuIGBcIlBPUlRcImAsIGBcIk5PREVfRU5WXCJgKS5cbiAqIEBwYXJhbSBzcGVjIC0gVHlwZSBzcGVjOyBkZWZhdWx0cyB0byBgU2FmZUVudlR5cGUuU3RyaW5nYCB3aGVuIG9taXR0ZWQuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsLiBVc2UgYHsgZGVmYXVsdDogdmFsdWUgfWAgdG8gcHJvdmlkZSBhIGZhbGxiYWNrIHdoZW4gdGhlIHZhcmlhYmxlIGlzIG1pc3NpbmcuXG4gKiBAcmV0dXJucyBQYXJzZWQgdmFsdWUgd2l0aCB0eXBlIGluZmVycmVkIGZyb20gYHNwZWNgLlxuICogQHRocm93cyB7RXJyb3J9IFdoZW4gdGhlIHZhcmlhYmxlIGlzIG1pc3NpbmcgYW5kIGBvcHRpb25zLmRlZmF1bHRgIGlzIG5vdCBzZXQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBgc3BlYy50eXBlYCBpcyBgXCJudW1iZXJcImAgYW5kIHRoZSB2YWx1ZSBpcyBub3QgYSB2YWxpZCBudW1iZXIuXG4gKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBgc3BlYy50eXBlYCBpcyBgXCJlbnVtXCJgIGFuZCB0aGUgdmFsdWUgaXMgbm90IGluIGBzcGVjLmNob2ljZXNgLlxuICovXG5mdW5jdGlvbiBnZXRFbnY8SyBleHRlbmRzIHN0cmluZywgUyBleHRlbmRzIFNhZmVFbnZTcGVjID0gU2FmZUVudlR5cGVTdHJpbmc+KFxuICBrZXk6IEssXG4gIHNwZWM6IFMgPSBTYWZlRW52VHlwZS5TdHJpbmcgYXMgUyxcbiAgb3B0aW9ucz86IHsgZGVmYXVsdD86IFNhZmVFbnZTcGVjVG9UeXBlPFM+IH0sXG4pOiBTYWZlRW52U3BlY1RvVHlwZTxTPiB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52W2tleV07XG4gIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IG9wdGlvbnM/LmRlZmF1bHQ7XG4gIGNvbnN0IGhhc0RlZmF1bHQgPSBkZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZDtcblxuICBpZiAocmF3ID09IG51bGwgfHwgcmF3ID09PSAnJykge1xuICAgIGlmICghaGFzRGVmYXVsdCkgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHJlcXVpcmVkIGVudmlyb25tZW50IHZhcmlhYmxlOiAke2tleX1gKTtcbiAgICByZXR1cm4gZGVmYXVsdFZhbHVlIGFzIFNhZmVFbnZTcGVjVG9UeXBlPFM+O1xuICB9XG5cbiAgc3dpdGNoIChzcGVjLnR5cGUpIHtcbiAgICBjYXNlICdudW1iZXInOiB7XG4gICAgICBjb25zdCBuID0gTnVtYmVyKHJhdyk7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKG4pKSB0aHJvdyBuZXcgRXJyb3IoYEVudiAke2tleX06IGV4cGVjdGVkIG51bWJlciwgZ290IFwiJHtyYXd9XCJgKTtcbiAgICAgIHJldHVybiBuIGFzIFNhZmVFbnZTcGVjVG9UeXBlPFM+O1xuICAgIH1cbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHJldHVybiAoL14oMXx0cnVlfHllc3xvbikkL2kudGVzdChyYXcpID8gdHJ1ZSA6IGZhbHNlKSBhcyBTYWZlRW52U3BlY1RvVHlwZTxTPjtcbiAgICBjYXNlICdlbnVtJzpcbiAgICAgIGlmICghc3BlYy5jaG9pY2VzLmluY2x1ZGVzKHJhdykpIHRocm93IG5ldyBFcnJvcihgRW52ICR7a2V5fTogbXVzdCBiZSBvbmUgb2YgWyR7c3BlYy5jaG9pY2VzLmpvaW4oJywgJyl9XWApO1xuICAgICAgcmV0dXJuIHJhdyBhcyBTYWZlRW52U3BlY1RvVHlwZTxTPjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHJhdyBhcyBTYWZlRW52U3BlY1RvVHlwZTxTPjtcbiAgfVxufVxuXG4vKipcbiAqIFNhZmUgZW52aXJvbm1lbnQgdmFyaWFibGUgZ2V0dGVyLlxuICogVXNlIGBTYWZlRW52R2V0dGVyLmdldEVudihrZXksIHNwZWM/LCBvcHRpb25zPylgIHRvIHJlYWQgYW5kIHBhcnNlIGVudmlyb25tZW50IHZhcmlhYmxlcyB3aXRoIHR5cGUgc2FmZXR5LlxuICovXG5leHBvcnQgY29uc3QgU2FmZUVudkdldHRlciA9IHtcbiAgZ2V0RW52LFxufSBhcyBjb25zdDsiXX0=
182
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBcURBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFzQixrQkFBbUIsU0FBUSxLQUFLO0lBQ3BELFlBQXNCLE9BQWU7UUFDbkMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxvQkFBb0IsQ0FBQztJQUNuQyxDQUFDO0NBQ0Y7QUFMRCxnREFLQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBYSw0QkFBd0QsU0FBUSxrQkFBa0I7SUFDN0Y7O09BRUc7SUFDSSxNQUFNLENBQUMsTUFBTSxDQUFtQixNQUFrQztRQUN2RSxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdkcsT0FBTyxrQ0FBa0MsTUFBTSxDQUFDLE1BQU0sT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDbEYsQ0FBQztJQVdEOztPQUVHO0lBQ0gsWUFBbUIsTUFBa0M7UUFDbkQsTUFBTSxHQUFHLEdBQUcsNEJBQTRCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hELEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNYLElBQUksQ0FBQyxJQUFJLEdBQUcsOEJBQThCLENBQUM7UUFDM0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkMsQ0FBQztDQUNGO0FBNUJELG9FQTRCQztBQUVEOzs7R0FHRztBQUNVLFFBQUEsV0FBVyxHQUFHO0lBQ3pCLCtCQUErQjtJQUMvQixNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUF1QztJQUMvRCxnQ0FBZ0M7SUFDaEMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBdUM7SUFDL0QsdURBQXVEO0lBQ3ZELE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQXdDO0lBQ2xFOzs7O09BSUc7SUFDSCxJQUFJLEVBQUUsQ0FBbUIsT0FBcUIsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQXVCO0NBQzVGLENBQUM7QUF5Q1g7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyxNQUFNLENBQ2IsR0FBTSxFQUNOLE9BQVUsbUJBQVcsQ0FBQyxNQUFXLEVBQ2pDLE9BQTRDO0lBRTVDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsTUFBTSxZQUFZLEdBQUcsT0FBTyxFQUFFLE9BQU8sQ0FBQztJQUN0QyxNQUFNLFVBQVUsR0FBRyxZQUFZLEtBQUssU0FBUyxDQUFDO0lBRTlDLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sSUFBSSw0QkFBNEIsQ0FBQztnQkFDckMsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLDBDQUEwQyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTthQUN4RixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxZQUFvQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDZCxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdEIsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BCLE1BQU0sSUFBSSw0QkFBNEIsQ0FBQztvQkFDckMsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE9BQU8sR0FBRywyQkFBMkIsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtpQkFDM0YsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUNELE9BQU8sQ0FBeUIsQ0FBQztRQUNuQyxDQUFDO1FBQ0QsS0FBSyxTQUFTO1lBQ1osT0FBTyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQXlCLENBQUM7UUFDakYsS0FBSyxNQUFNO1lBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hDLE1BQU0sSUFBSSw0QkFBNEIsQ0FBQztvQkFDckMsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE9BQU8sR0FBRyxxQkFBcUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRTtpQkFDdkcsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUNELE9BQU8sR0FBMkIsQ0FBQztRQUNyQztZQUNFLE9BQU8sR0FBMkIsQ0FBQztJQUN2QyxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sT0FBTyxHQUFHLENBQWdDLE1BQWUsRUFBZ0MsRUFBRTtJQUMvRixNQUFNLElBQUksR0FBMEMsRUFBRSxDQUFDO0lBQ3ZELE1BQU0sTUFBTSxHQUFtRCxFQUFFLENBQUM7SUFFbEUsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBMEMsRUFBRSxDQUFDO1FBQy9FLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQixNQUFNLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFnQixDQUFDO1FBQ3RFLE1BQU0sT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQStDLENBQUM7UUFFNUcsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QixNQUFNLFlBQVksR0FBRyxPQUFPLEVBQUUsT0FBTyxDQUFDO1FBQ3RDLE1BQU0sVUFBVSxHQUFHLFlBQVksS0FBSyxTQUFTLENBQUM7UUFFOUMsSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLDBDQUEwQyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7Z0JBQ3JHLFNBQVM7WUFDWCxDQUFDO1lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFlBQXdELENBQUM7WUFDckUsU0FBUztRQUNYLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDM0IsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RCLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNwQixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxPQUFPLEdBQUcsMkJBQTJCLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO2dCQUN4RyxTQUFTO1lBQ1gsQ0FBQztZQUNELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUE2QyxDQUFDO1lBQzFELFNBQVM7UUFDWCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQTZDLENBQUM7WUFDeEcsU0FBUztRQUNYLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hDLE1BQU0sQ0FBQyxJQUFJLENBQUM7b0JBQ1YsR0FBRztvQkFDSCxPQUFPLEVBQUUsT0FBTyxHQUFHLHFCQUFxQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRztvQkFDbEUsR0FBRztvQkFDSCxJQUFJLEVBQUUsY0FBYztpQkFDckIsQ0FBQyxDQUFDO2dCQUNILFNBQVM7WUFDWCxDQUFDO1lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQStDLENBQUM7WUFDNUQsU0FBUztRQUNYLENBQUM7UUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBK0MsQ0FBQztJQUM5RCxDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxNQUFNLElBQUksNEJBQTRCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEUsT0FBTyxJQUFvQyxDQUFDO0FBQzlDLENBQUMsQ0FBQztBQUVGOzs7R0FHRztBQUNVLFFBQUEsYUFBYSxHQUFHO0lBQzNCLE1BQU07SUFDTixPQUFPO0NBQ0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3BlYyBmb3IgYSBzdHJpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBwYXNzZWQgdmlhIHRoZSB0aGlyZCBhcmd1bWVudCBvZiBgZ2V0RW52YCwgbm90IGluIHRoZSBzcGVjLlxuICovXG5leHBvcnQgdHlwZSBTYWZlRW52VHlwZVN0cmluZyA9IHsgdHlwZTogJ3N0cmluZyc7IGRlZmF1bHQ/OiBzdHJpbmcgfTtcblxuLyoqXG4gKiBTcGVjIGZvciBhIG51bWVyaWMgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKiBWYWx1ZXMgYXJlIHBhcnNlZCB3aXRoIGBOdW1iZXIoKWA7IGludmFsaWQgdmFsdWVzIHRocm93LlxuICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgcGFzc2VkIHZpYSB0aGUgdGhpcmQgYXJndW1lbnQgb2YgYGdldEVudmAsIG5vdCBpbiB0aGUgc3BlYy5cbiAqL1xuZXhwb3J0IHR5cGUgU2FmZUVudlR5cGVOdW1iZXIgPSB7IHR5cGU6ICdudW1iZXInOyBkZWZhdWx0PzogbnVtYmVyIH07XG5cbi8qKlxuICogU3BlYyBmb3IgYSBib29sZWFuIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICogUGFyc2VzIGAxYCwgYHRydWVgLCBgeWVzYCwgYG9uYCAoY2FzZS1pbnNlbnNpdGl2ZSkgYXMgYHRydWVgOyBhbnl0aGluZyBlbHNlIGFzIGBmYWxzZWAuXG4gKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBwYXNzZWQgdmlhIHRoZSB0aGlyZCBhcmd1bWVudCBvZiBgZ2V0RW52YCwgbm90IGluIHRoZSBzcGVjLlxuICovXG5leHBvcnQgdHlwZSBTYWZlRW52VHlwZUJvb2xlYW4gPSB7IHR5cGU6ICdib29sZWFuJzsgZGVmYXVsdD86IGJvb2xlYW4gfTtcblxuLyoqXG4gKiBTcGVjIGZvciBhbiBlbnVtIGVudmlyb25tZW50IHZhcmlhYmxlIHdpdGggYSBmaXhlZCBzZXQgb2YgY2hvaWNlcy5cbiAqIFRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiBgY2hvaWNlc2A7IG90aGVyd2lzZSBhbiBlcnJvciBpcyB0aHJvd24uXG4gKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBwYXNzZWQgdmlhIHRoZSB0aGlyZCBhcmd1bWVudCBvZiBgZ2V0RW52YCwgbm90IGluIHRoZSBzcGVjLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIC0gTGl0ZXJhbCBzdHJpbmcgdW5pb24gb2YgYWxsb3dlZCB2YWx1ZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFNhZmVFbnZUeXBlRW51bTxUIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiA9IHsgdHlwZTogJ2VudW0nOyBjaG9pY2VzOiByZWFkb25seSBUW107IGRlZmF1bHQ/OiBUIH07XG5cbi8qKiBVbmlvbiBvZiBhbGwgZW52aXJvbm1lbnQgdmFyaWFibGUgc3BlYyB0eXBlcy4gKi9cbmV4cG9ydCB0eXBlIFNhZmVFbnZTcGVjID1cbiAgfCBTYWZlRW52VHlwZVN0cmluZ1xuICB8IFNhZmVFbnZUeXBlTnVtYmVyXG4gIHwgU2FmZUVudlR5cGVCb29sZWFuXG4gIHwgU2FmZUVudlR5cGVFbnVtO1xuXG4vKipcbiAqIERpc2NyaW1pbmF0ZWQgdW5pb24gZXJyb3Iga2luZHMgZW1pdHRlZCBkdXJpbmcgZW52IHBhcnNpbmcvdmFsaWRhdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgU2FmZUVudkVycm9yS2luZCA9ICdtaXNzaW5nJyB8ICdpbnZhbGlkX251bWJlcicgfCAnaW52YWxpZF9lbnVtJztcblxuLyoqXG4gKiBBIHN0cnVjdHVyZWQgdmFsaWRhdGlvbiBlcnJvciBlbnRyeSBmb3IgYSBzaW5nbGUgZW52IHZhci5cbiAqXG4gKiBAdGVtcGxhdGUgSyAtIEVudmlyb25tZW50IHZhcmlhYmxlIGtleSB0eXBlLlxuICovXG5leHBvcnQgdHlwZSBTYWZlRW52RXJyb3I8SyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPSB7XG4gIGtleTogSztcbiAgbWVzc2FnZTogc3RyaW5nO1xuICByYXc/OiBzdHJpbmc7XG4gIGtpbmQ6IFNhZmVFbnZFcnJvcktpbmQ7XG59O1xuXG4vKipcbiAqIEJhc2UgZXJyb3IgY2xhc3MgZm9yIHRoaXMgcGFja2FnZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIHRyeSB7XG4gKiAgIFNhZmVFbnZHZXR0ZXIuZ2V0RW52KCdQT1JUJywgU2FmZUVudlR5cGUuTnVtYmVyKTtcbiAqIH0gY2F0Y2ggKGUpIHtcbiAqICAgaWYgKGUgaW5zdGFuY2VvZiBTYWZlRW52R2V0dGVyRXJyb3IpIHtcbiAqICAgICAvLyBIYW5kbGUgYWxsIHNhZmUtZW52LWdldHRlciBlcnJvcnNcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTYWZlRW52R2V0dGVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnU2FmZUVudkdldHRlckVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRpb24gZXJyb3IgdGhhdCBjYXJyaWVzIG9uZSBvciBtb3JlIGVudmlyb25tZW50IHZhcmlhYmxlIGlzc3Vlcy5cbiAqXG4gKiBJdCBpcyB0aHJvd24gYnkgYFNhZmVFbnZHZXR0ZXIuZ2V0RW52KClgIChzaW5nbGUtZW50cnkgYGVycm9yc2ApIGFuZFxuICogYFNhZmVFbnZHZXR0ZXIuZ2V0RW52cygpYCAobXVsdGktZW50cnkgYGVycm9yc2ApLlxuICovXG5leHBvcnQgY2xhc3MgU2FmZUVudkdldHRlclZhbGlkYXRpb25FcnJvcjxLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiBleHRlbmRzIFNhZmVFbnZHZXR0ZXJFcnJvciB7XG4gIC8qKlxuICAgKiBGb3JtYXRzIHZhbGlkYXRpb24gZXJyb3JzIGludG8gYSBodW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmb3JtYXQ8SyBleHRlbmRzIHN0cmluZz4oZXJyb3JzOiByZWFkb25seSBTYWZlRW52RXJyb3I8Sz5bXSk6IHN0cmluZyB7XG4gICAgY29uc3QgbGluZXMgPSBlcnJvcnMubWFwKChlKSA9PiBgLSAke2Uua2V5fTogJHtlLm1lc3NhZ2V9JHtlLnJhdyA9PSBudWxsID8gJycgOiBgIChyYXc9XCIke2UucmF3fVwiKWB9YCk7XG4gICAgcmV0dXJuIGBJbnZhbGlkIGVudmlyb25tZW50IHZhcmlhYmxlcyAoJHtlcnJvcnMubGVuZ3RofSk6XFxuJHtsaW5lcy5qb2luKCdcXG4nKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cnVjdHVyZWQgbGlzdCBvZiB2YWxpZGF0aW9uIGVycm9ycy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlcnJvcnM6IHJlYWRvbmx5IFNhZmVFbnZFcnJvcjxLPltdO1xuICAvKipcbiAgICogQ29udmVuaWVuY2UgbGlzdCBvZiBrZXlzIGluY2x1ZGVkIGluIGBlcnJvcnNgLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGtleXM6IHJlYWRvbmx5IEtbXTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyB2YWxpZGF0aW9uIGVycm9yIGZyb20gb25lIG9yIG1vcmUgYFNhZmVFbnZFcnJvcmAgZW50cmllcy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihlcnJvcnM6IHJlYWRvbmx5IFNhZmVFbnZFcnJvcjxLPltdKSB7XG4gICAgY29uc3QgbXNnID0gU2FmZUVudkdldHRlclZhbGlkYXRpb25FcnJvci5mb3JtYXQoZXJyb3JzKTtcbiAgICBzdXBlcihtc2cpO1xuICAgIHRoaXMubmFtZSA9ICdTYWZlRW52R2V0dGVyVmFsaWRhdGlvbkVycm9yJztcbiAgICB0aGlzLmVycm9ycyA9IGVycm9ycztcbiAgICB0aGlzLmtleXMgPSBlcnJvcnMubWFwKChlKSA9PiBlLmtleSk7XG4gIH1cbn1cblxuLyoqXG4gKiBQcmVkZWZpbmVkIHNwZWMgY29uc3RhbnRzIGZvciB1c2UgYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZ2V0RW52YC5cbiAqIFVzZSB0aGUgdGhpcmQgYXJndW1lbnQgYG9wdGlvbnM6IHsgZGVmYXVsdDogdmFsdWUgfWAgdG8gcHJvdmlkZSBhIGZhbGxiYWNrIHdoZW4gdGhlIHZhcmlhYmxlIGlzIG1pc3NpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBTYWZlRW52VHlwZSA9IHtcbiAgLyoqIFNwZWMgZm9yIGEgc3RyaW5nIHZhbHVlLiAqL1xuICBTdHJpbmc6IHsgdHlwZTogJ3N0cmluZycgfSBhcyBjb25zdCBzYXRpc2ZpZXMgU2FmZUVudlR5cGVTdHJpbmcsXG4gIC8qKiBTcGVjIGZvciBhIG51bWVyaWMgdmFsdWUuICovXG4gIE51bWJlcjogeyB0eXBlOiAnbnVtYmVyJyB9IGFzIGNvbnN0IHNhdGlzZmllcyBTYWZlRW52VHlwZU51bWJlcixcbiAgLyoqIFNwZWMgZm9yIGEgYm9vbGVhbiB2YWx1ZSAoMS90cnVlL3llcy9vbiDihpIgdHJ1ZSkuICovXG4gIEJvb2xlYW46IHsgdHlwZTogJ2Jvb2xlYW4nIH0gYXMgY29uc3Qgc2F0aXNmaWVzIFNhZmVFbnZUeXBlQm9vbGVhbixcbiAgLyoqXG4gICAqIFJldHVybnMgYSBzcGVjIHRoYXQgcmVzdHJpY3RzIHRoZSB2YWx1ZSB0byBvbmUgb2YgdGhlIGdpdmVuIGNob2ljZXMuXG4gICAqIEBwYXJhbSBjaG9pY2VzIC0gQWxsb3dlZCBzdHJpbmcgbGl0ZXJhbHMuXG4gICAqIEByZXR1cm5zIEVudW0gc3BlYyBmb3IgdXNlIHdpdGggYGdldEVudmAuXG4gICAqL1xuICBFbnVtOiA8VCBleHRlbmRzIHN0cmluZz4oY2hvaWNlczogcmVhZG9ubHkgVFtdKSA9PiAoeyB0eXBlOiAnZW51bScsIGNob2ljZXMgfSkgYXMgU2FmZUVudlR5cGVFbnVtPFQ+LFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBJbmZlcnMgdGhlIHJldHVybiB0eXBlIGZyb20gdGhlIGdpdmVuIHNwZWMuXG4gKiBAdGVtcGxhdGUgUyAtIEEgYFNhZmVFbnZTcGVjYCB2YXJpYW50LlxuICovXG5leHBvcnQgdHlwZSBTYWZlRW52U3BlY1RvVHlwZTxTPiA9XG4gIFMgZXh0ZW5kcyBTYWZlRW52VHlwZVN0cmluZyA/IHN0cmluZ1xuICAgIDogUyBleHRlbmRzIFNhZmVFbnZUeXBlTnVtYmVyID8gbnVtYmVyXG4gICAgICA6IFMgZXh0ZW5kcyBTYWZlRW52VHlwZUJvb2xlYW4gPyBib29sZWFuXG4gICAgICAgIDogUyBleHRlbmRzIFNhZmVFbnZUeXBlRW51bTxpbmZlciBUPiA/IFRcbiAgICAgICAgICA6IG5ldmVyO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHJlYWRpbmcgYW4gZW52IHZhciB3aXRoIGFuIG9wdGlvbmFsIGRlZmF1bHQuXG4gKi9cbmV4cG9ydCB0eXBlIFNhZmVHZXRFbnZPcHRpb25zPFMgZXh0ZW5kcyBTYWZlRW52U3BlYz4gPSB7IGRlZmF1bHQ/OiBTYWZlRW52U3BlY1RvVHlwZTxTPiB9O1xuXG4vKipcbiAqIFNjaGVtYSBlbnRyeSBmb3IgYSBzaW5nbGUgZW52IHZhci5cbiAqXG4gKiBFaXRoZXIgcHJvdmlkZSBhIHNwZWMgZGlyZWN0bHksIG9yIGEgdHVwbGUgb2YgYFtzcGVjLCBvcHRpb25zXWAgdG8gYXR0YWNoIGEgZGVmYXVsdC5cbiAqL1xuZXhwb3J0IHR5cGUgU2FmZUVudlNjaGVtYUVudHJ5PFMgZXh0ZW5kcyBTYWZlRW52U3BlYyA9IFNhZmVFbnZTcGVjPiA9IFMgfCByZWFkb25seSBbUywgU2FmZUdldEVudk9wdGlvbnM8Uz5dO1xuXG4vKipcbiAqIFNjaGVtYSBvYmplY3QgdXNlZCBieSBgZ2V0RW52cygpYC5cbiAqXG4gKiBLZXlzIGFyZSBlbnYgdmFyIG5hbWVzLCB2YWx1ZXMgYXJlIHNwZWNzIChvcHRpb25hbGx5IHdpdGggZGVmYXVsdHMpLlxuICovXG5leHBvcnQgdHlwZSBTYWZlRW52U2NoZW1hID0gUmVjb3JkPHN0cmluZywgU2FmZUVudlNjaGVtYUVudHJ5PjtcblxudHlwZSBTYWZlRW52U2NoZW1hRW50cnlUb1NwZWM8RT4gPSBFIGV4dGVuZHMgcmVhZG9ubHkgW2luZmVyIFMsIHVua25vd25dID8gUyA6IEU7XG5cbi8qKlxuICogTWFwcyBhIHNjaGVtYSBvYmplY3QgdG8gdGhlIHJlc3VsdGluZyBwYXJzZWQgZW52IG9iamVjdCB0eXBlLlxuICovXG5leHBvcnQgdHlwZSBTYWZlRW52U2NoZW1hVG9UeXBlPFRTY2hlbWEgZXh0ZW5kcyBTYWZlRW52U2NoZW1hPiA9IHtcbiAgW0sgaW4ga2V5b2YgVFNjaGVtYV06IFNhZmVFbnZTcGVjVG9UeXBlPFNhZmVFbnZTY2hlbWFFbnRyeVRvU3BlYzxUU2NoZW1hW0tdPiAmIFNhZmVFbnZTcGVjPjtcbn07XG5cbi8qKlxuICogUmVhZHMgYW5kIHBhcnNlcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHNwZWMuXG4gKiBJZiB0aGUgdmFyaWFibGUgaXMgbWlzc2luZyBvciBlbXB0eSBhbmQgbm8gZGVmYXVsdCBpcyBwcm92aWRlZCBpbiBgb3B0aW9uc2AsIHRocm93cyBhbiBlcnJvci5cbiAqXG4gKiBAcGFyYW0ga2V5IC0gRW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZSAoZS5nLiBgXCJQT1JUXCJgLCBgXCJOT0RFX0VOVlwiYCkuXG4gKiBAcGFyYW0gc3BlYyAtIFR5cGUgc3BlYzsgZGVmYXVsdHMgdG8gYFNhZmVFbnZUeXBlLlN0cmluZ2Agd2hlbiBvbWl0dGVkLlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbC4gVXNlIGB7IGRlZmF1bHQ6IHZhbHVlIH1gIHRvIHByb3ZpZGUgYSBmYWxsYmFjayB3aGVuIHRoZSB2YXJpYWJsZSBpcyBtaXNzaW5nLlxuICogQHJldHVybnMgUGFyc2VkIHZhbHVlIHdpdGggdHlwZSBpbmZlcnJlZCBmcm9tIGBzcGVjYC5cbiAqIEB0aHJvd3Mge1NhZmVFbnZHZXR0ZXJWYWxpZGF0aW9uRXJyb3J9IFdoZW4gdGhlIHZhcmlhYmxlIGlzIG1pc3NpbmcvaW52YWxpZCBhbmQgYG9wdGlvbnMuZGVmYXVsdGAgaXMgbm90IHNldCAob3Igbm90IGFwcGxpY2FibGUpLlxuICovXG5mdW5jdGlvbiBnZXRFbnY8SyBleHRlbmRzIHN0cmluZywgUyBleHRlbmRzIFNhZmVFbnZTcGVjID0gU2FmZUVudlR5cGVTdHJpbmc+KFxuICBrZXk6IEssXG4gIHNwZWM6IFMgPSBTYWZlRW52VHlwZS5TdHJpbmcgYXMgUyxcbiAgb3B0aW9ucz86IHsgZGVmYXVsdD86IFNhZmVFbnZTcGVjVG9UeXBlPFM+IH0sXG4pOiBTYWZlRW52U3BlY1RvVHlwZTxTPiB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52W2tleV07XG4gIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IG9wdGlvbnM/LmRlZmF1bHQ7XG4gIGNvbnN0IGhhc0RlZmF1bHQgPSBkZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZDtcblxuICBpZiAocmF3ID09IG51bGwgfHwgcmF3ID09PSAnJykge1xuICAgIGlmICghaGFzRGVmYXVsdCkge1xuICAgICAgdGhyb3cgbmV3IFNhZmVFbnZHZXR0ZXJWYWxpZGF0aW9uRXJyb3IoW1xuICAgICAgICB7IGtleSwgbWVzc2FnZTogYE1pc3NpbmcgcmVxdWlyZWQgZW52aXJvbm1lbnQgdmFyaWFibGU6ICR7a2V5fWAsIHJhdywga2luZDogJ21pc3NpbmcnIH0sXG4gICAgICBdKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZSBhcyBTYWZlRW52U3BlY1RvVHlwZTxTPjtcbiAgfVxuXG4gIHN3aXRjaCAoc3BlYy50eXBlKSB7XG4gICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgY29uc3QgbiA9IE51bWJlcihyYXcpO1xuICAgICAgaWYgKE51bWJlci5pc05hTihuKSkge1xuICAgICAgICB0aHJvdyBuZXcgU2FmZUVudkdldHRlclZhbGlkYXRpb25FcnJvcihbXG4gICAgICAgICAgeyBrZXksIG1lc3NhZ2U6IGBFbnYgJHtrZXl9OiBleHBlY3RlZCBudW1iZXIsIGdvdCBcIiR7cmF3fVwiYCwgcmF3LCBraW5kOiAnaW52YWxpZF9udW1iZXInIH0sXG4gICAgICAgIF0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG4gYXMgU2FmZUVudlNwZWNUb1R5cGU8Uz47XG4gICAgfVxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgcmV0dXJuICgvXigxfHRydWV8eWVzfG9uKSQvaS50ZXN0KHJhdykgPyB0cnVlIDogZmFsc2UpIGFzIFNhZmVFbnZTcGVjVG9UeXBlPFM+O1xuICAgIGNhc2UgJ2VudW0nOlxuICAgICAgaWYgKCFzcGVjLmNob2ljZXMuaW5jbHVkZXMocmF3KSkge1xuICAgICAgICB0aHJvdyBuZXcgU2FmZUVudkdldHRlclZhbGlkYXRpb25FcnJvcihbXG4gICAgICAgICAgeyBrZXksIG1lc3NhZ2U6IGBFbnYgJHtrZXl9OiBtdXN0IGJlIG9uZSBvZiBbJHtzcGVjLmNob2ljZXMuam9pbignLCAnKX1dYCwgcmF3LCBraW5kOiAnaW52YWxpZF9lbnVtJyB9LFxuICAgICAgICBdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByYXcgYXMgU2FmZUVudlNwZWNUb1R5cGU8Uz47XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiByYXcgYXMgU2FmZUVudlNwZWNUb1R5cGU8Uz47XG4gIH1cbn1cblxuLyoqXG4gKiBSZWFkcyBhbmQgcGFyc2VzIG11bHRpcGxlIGVudmlyb25tZW50IHZhcmlhYmxlcyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHNjaGVtYS5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBldmFsdWF0ZXMgZXZlcnkga2V5IGluIGBzY2hlbWFgLiBJZiBhbnkgbWlzc2luZy9pbnZhbGlkIHZhbHVlc1xuICogYXJlIGZvdW5kLCBpdCB0aHJvd3Mgb25jZSB3aXRoIGEgYFNhZmVFbnZHZXR0ZXJWYWxpZGF0aW9uRXJyb3JgIHRoYXQgY29udGFpbnMgYWxsIGlzc3Vlcy5cbiAqXG4gKiBAcGFyYW0gc2NoZW1hIC0gTWFwIG9mIGVudiB2YXIgbmFtZXMgdG8gc3BlY3MsIG9wdGlvbmFsbHkgd2l0aCBwZXIta2V5IGRlZmF1bHRzIHZpYSBgW3NwZWMsIHsgZGVmYXVsdCB9XWAuXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgb2YgcGFyc2VkIGVudnMgd2l0aCB0eXBlcyBpbmZlcnJlZCBmcm9tIHRoZSBzY2hlbWEuXG4gKiBAdGhyb3dzIHtTYWZlRW52R2V0dGVyVmFsaWRhdGlvbkVycm9yfSBXaGVuIG9uZSBvciBtb3JlIHJlcXVpcmVkIGVudiB2YXJzIGFyZSBtaXNzaW5nIG9yIGludmFsaWQuXG4gKi9cbmNvbnN0IGdldEVudnMgPSA8VFNjaGVtYSBleHRlbmRzIFNhZmVFbnZTY2hlbWE+KHNjaGVtYTogVFNjaGVtYSk6IFNhZmVFbnZTY2hlbWFUb1R5cGU8VFNjaGVtYT4gPT4ge1xuICBjb25zdCBlbnZzOiBQYXJ0aWFsPFNhZmVFbnZTY2hlbWFUb1R5cGU8VFNjaGVtYT4+ID0ge307XG4gIGNvbnN0IGVycm9yczogU2FmZUVudkVycm9yPEV4dHJhY3Q8a2V5b2YgVFNjaGVtYSwgc3RyaW5nPj5bXSA9IFtdO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHNjaGVtYSkgYXMgQXJyYXk8RXh0cmFjdDxrZXlvZiBUU2NoZW1hLCBzdHJpbmc+Pikge1xuICAgIGNvbnN0IGVudHJ5ID0gc2NoZW1hW2tleV07XG4gICAgY29uc3Qgc3BlYyA9IChBcnJheS5pc0FycmF5KGVudHJ5KSA/IGVudHJ5WzBdIDogZW50cnkpIGFzIFNhZmVFbnZTcGVjO1xuICAgIGNvbnN0IG9wdGlvbnMgPSAoQXJyYXkuaXNBcnJheShlbnRyeSkgPyBlbnRyeVsxXSA6IHVuZGVmaW5lZCkgYXMgU2FmZUdldEVudk9wdGlvbnM8U2FmZUVudlNwZWM+IHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgcmF3ID0gcHJvY2Vzcy5lbnZba2V5XTtcbiAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBvcHRpb25zPy5kZWZhdWx0O1xuICAgIGNvbnN0IGhhc0RlZmF1bHQgPSBkZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZDtcblxuICAgIGlmIChyYXcgPT0gbnVsbCB8fCByYXcgPT09ICcnKSB7XG4gICAgICBpZiAoIWhhc0RlZmF1bHQpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goeyBrZXksIG1lc3NhZ2U6IGBNaXNzaW5nIHJlcXVpcmVkIGVudmlyb25tZW50IHZhcmlhYmxlOiAke2tleX1gLCByYXcsIGtpbmQ6ICdtaXNzaW5nJyB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBlbnZzW2tleV0gPSBkZWZhdWx0VmFsdWUgYXMgU2FmZUVudlNjaGVtYVRvVHlwZTxUU2NoZW1hPlt0eXBlb2Yga2V5XTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChzcGVjLnR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICBjb25zdCBuID0gTnVtYmVyKHJhdyk7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKG4pKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKHsga2V5LCBtZXNzYWdlOiBgRW52ICR7a2V5fTogZXhwZWN0ZWQgbnVtYmVyLCBnb3QgXCIke3Jhd31cImAsIHJhdywga2luZDogJ2ludmFsaWRfbnVtYmVyJyB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBlbnZzW2tleV0gPSBuIGFzIFNhZmVFbnZTY2hlbWFUb1R5cGU8VFNjaGVtYT5bdHlwZW9mIGtleV07XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoc3BlYy50eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIGVudnNba2V5XSA9ICgvXigxfHRydWV8eWVzfG9uKSQvaS50ZXN0KHJhdykgPyB0cnVlIDogZmFsc2UpIGFzIFNhZmVFbnZTY2hlbWFUb1R5cGU8VFNjaGVtYT5bdHlwZW9mIGtleV07XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoc3BlYy50eXBlID09PSAnZW51bScpIHtcbiAgICAgIGlmICghc3BlYy5jaG9pY2VzLmluY2x1ZGVzKHJhdykpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICBtZXNzYWdlOiBgRW52ICR7a2V5fTogbXVzdCBiZSBvbmUgb2YgWyR7c3BlYy5jaG9pY2VzLmpvaW4oJywgJyl9XWAsXG4gICAgICAgICAgcmF3LFxuICAgICAgICAgIGtpbmQ6ICdpbnZhbGlkX2VudW0nLFxuICAgICAgICB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBlbnZzW2tleV0gPSByYXcgYXMgU2FmZUVudlNjaGVtYVRvVHlwZTxUU2NoZW1hPlt0eXBlb2Yga2V5XTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGVudnNba2V5XSA9IHJhdyBhcyBTYWZlRW52U2NoZW1hVG9UeXBlPFRTY2hlbWE+W3R5cGVvZiBrZXldO1xuICB9XG5cbiAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB0aHJvdyBuZXcgU2FmZUVudkdldHRlclZhbGlkYXRpb25FcnJvcihlcnJvcnMpO1xuICByZXR1cm4gZW52cyBhcyBTYWZlRW52U2NoZW1hVG9UeXBlPFRTY2hlbWE+O1xufTtcblxuLyoqXG4gKiBTYWZlIGVudmlyb25tZW50IHZhcmlhYmxlIGdldHRlci5cbiAqIFVzZSBgU2FmZUVudkdldHRlci5nZXRFbnYoa2V5LCBzcGVjPywgb3B0aW9ucz8pYCB0byByZWFkIGFuZCBwYXJzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2l0aCB0eXBlIHNhZmV0eS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNhZmVFbnZHZXR0ZXIgPSB7XG4gIGdldEVudixcbiAgZ2V0RW52cyxcbn0gYXMgY29uc3Q7Il19
package/package.json CHANGED
@@ -5,24 +5,24 @@
5
5
  "url": "https://github.com/gammarers-labs/safe-env-getter.git"
6
6
  },
7
7
  "scripts": {
8
- "build": "npx projen build",
9
- "bump": "npx projen bump",
10
- "clobber": "npx projen clobber",
11
- "compile": "npx projen compile",
12
- "default": "npx projen default",
13
- "eject": "npx projen eject",
14
- "eslint": "npx projen eslint",
15
- "package": "npx projen package",
16
- "post-compile": "npx projen post-compile",
17
- "post-upgrade": "npx projen post-upgrade",
18
- "pre-compile": "npx projen pre-compile",
19
- "release": "npx projen release",
20
- "test": "npx projen test",
21
- "test:watch": "npx projen test:watch",
22
- "unbump": "npx projen unbump",
23
- "upgrade": "npx projen upgrade",
24
- "watch": "npx projen watch",
25
- "projen": "npx projen"
8
+ "build": "projen build",
9
+ "bump": "projen bump",
10
+ "clobber": "projen clobber",
11
+ "compile": "projen compile",
12
+ "default": "projen default",
13
+ "eject": "projen eject",
14
+ "eslint": "projen eslint",
15
+ "package": "projen package",
16
+ "post-compile": "projen post-compile",
17
+ "post-upgrade": "projen post-upgrade",
18
+ "pre-compile": "projen pre-compile",
19
+ "release": "projen release",
20
+ "test": "projen test",
21
+ "test:watch": "projen test:watch",
22
+ "unbump": "projen unbump",
23
+ "upgrade": "projen upgrade",
24
+ "watch": "projen watch",
25
+ "projen": "projen"
26
26
  },
27
27
  "author": {
28
28
  "name": "yicr",
@@ -42,7 +42,7 @@
42
42
  "eslint-plugin-import": "^2.32.0",
43
43
  "jest": "^30.3.0",
44
44
  "jest-junit": "^16",
45
- "projen": "^0.99.34",
45
+ "projen": "^0.99.42",
46
46
  "ts-jest": "^29.4.9",
47
47
  "ts-node": "^10.9.2",
48
48
  "typescript": "5.9.x"
@@ -55,7 +55,7 @@
55
55
  "publishConfig": {
56
56
  "access": "public"
57
57
  },
58
- "version": "0.1.10",
58
+ "version": "0.2.0",
59
59
  "jest": {
60
60
  "coverageProvider": "v8",
61
61
  "testMatch": [