safe-env-getter 0.1.9 → 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 +40 -6
- package/lib/index.d.ts +83 -3
- package/lib/index.js +126 -11
- package/package.json +21 -21
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
|
|
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?)`
|
|
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
|
-
-
|
|
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 {
|
|
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 {
|
|
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
|
|
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
|
|
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
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBcURBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFzQixrQkFBbUIsU0FBUSxLQUFLO0lBQ3BELFlBQXNCLE9BQWU7UUFDbkMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxvQkFBb0IsQ0FBQztJQUNuQyxDQUFDO0NBQ0Y7QUFMRCxnREFLQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBYSw0QkFBd0QsU0FBUSxrQkFBa0I7SUFDN0Y7O09BRUc7SUFDSSxNQUFNLENBQUMsTUFBTSxDQUFtQixNQUFrQztRQUN2RSxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdkcsT0FBTyxrQ0FBa0MsTUFBTSxDQUFDLE1BQU0sT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDbEYsQ0FBQztJQVdEOztPQUVHO0lBQ0gsWUFBbUIsTUFBa0M7UUFDbkQsTUFBTSxHQUFHLEdBQUcsNEJBQTRCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hELEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNYLElBQUksQ0FBQyxJQUFJLEdBQUcsOEJBQThCLENBQUM7UUFDM0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxF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O0FBQzlDLENBQUMsQ0FBQztBQUVGOzs7R0FHRztBQUNVLFFBQUEsYUFBYSxHQUFHO0lBQzNCLE1BQU07SUFDTixPQUFPO0NBQ0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3BlYyBmb3IgYSBzdHJpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBwYXNzZWQgdmlhIHRoZSB0aGlyZCBhcmd1bWVudCBvZiBgZ2V0RW52YCwgbm90IGluIHRoZSBzcGVjLlxuICovXG5leHBvcnQgdHlwZSBTYWZlRW52VHlwZVN0cmluZyA9IHsgdHlwZTogJ3N0cmluZyc7IGRlZmF1bHQ/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": "
|
|
9
|
-
"bump": "
|
|
10
|
-
"clobber": "
|
|
11
|
-
"compile": "
|
|
12
|
-
"default": "
|
|
13
|
-
"eject": "
|
|
14
|
-
"eslint": "
|
|
15
|
-
"package": "
|
|
16
|
-
"post-compile": "
|
|
17
|
-
"post-upgrade": "
|
|
18
|
-
"pre-compile": "
|
|
19
|
-
"release": "
|
|
20
|
-
"test": "
|
|
21
|
-
"test:watch": "
|
|
22
|
-
"unbump": "
|
|
23
|
-
"upgrade": "
|
|
24
|
-
"watch": "
|
|
25
|
-
"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,8 +42,8 @@
|
|
|
42
42
|
"eslint-plugin-import": "^2.32.0",
|
|
43
43
|
"jest": "^30.3.0",
|
|
44
44
|
"jest-junit": "^16",
|
|
45
|
-
"projen": "^0.99.
|
|
46
|
-
"ts-jest": "^29.4.
|
|
45
|
+
"projen": "^0.99.42",
|
|
46
|
+
"ts-jest": "^29.4.9",
|
|
47
47
|
"ts-node": "^10.9.2",
|
|
48
48
|
"typescript": "5.9.x"
|
|
49
49
|
},
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"publishConfig": {
|
|
56
56
|
"access": "public"
|
|
57
57
|
},
|
|
58
|
-
"version": "0.
|
|
58
|
+
"version": "0.2.0",
|
|
59
59
|
"jest": {
|
|
60
60
|
"coverageProvider": "v8",
|
|
61
61
|
"testMatch": [
|