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.
- package/.devcontainer/devcontainer.json +4 -3
- package/lib/index.d.ts +59 -24
- package/lib/index.js +80 -16
- package/package.json +9 -3
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dev-strict-env-resolver",
|
|
3
|
-
"image": "mcr.microsoft.com/devcontainers/base:
|
|
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:
|
|
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
|
-
*
|
|
4
|
-
* whitespace
|
|
5
|
-
*
|
|
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
|
-
|
|
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
|
-
*
|
|
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
|
-
|
|
19
|
-
};
|
|
31
|
+
} & StrictEnvNumberConstraints;
|
|
20
32
|
/**
|
|
21
33
|
* Spec for a boolean environment variable.
|
|
22
|
-
* Parses `1`, `true`, `yes`, `on` (case-insensitive, after
|
|
23
|
-
*
|
|
24
|
-
*
|
|
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
|
|
33
|
-
* Trims leading/trailing whitespace by default (see
|
|
34
|
-
*
|
|
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
|
|
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
|
-
*
|
|
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
|
-
|
|
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
|
|
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
|
|
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.
|
|
233
|
+
* const port = StrictEnvResolver.resolve('PORT', StrictEnvType.PositiveInt);
|
|
199
234
|
* const envs = StrictEnvResolver.resolveAll({
|
|
200
|
-
* PORT: StrictEnvType.
|
|
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 -
|
|
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
|
|
23
|
+
* Parses a normalized string as a boolean environment variable value.
|
|
24
24
|
*
|
|
25
|
-
* @param normalizedRaw -
|
|
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
|
-
*
|
|
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
|
-
|
|
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
|
-
*
|
|
152
|
-
*
|
|
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
|
-
*
|
|
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,
|
|
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
|
|
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,
|
|
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.
|
|
325
|
+
* const port = StrictEnvResolver.resolve('PORT', StrictEnvType.PositiveInt);
|
|
262
326
|
* const envs = StrictEnvResolver.resolveAll({
|
|
263
|
-
* PORT: StrictEnvType.
|
|
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.
|
|
47
|
+
"projen": "^0.101.23",
|
|
48
48
|
"ts-jest": "^29.4.12",
|
|
49
49
|
"ts-node": "^10.9.2",
|
|
50
|
-
"typescript": "
|
|
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.
|
|
73
|
+
"version": "0.6.0",
|
|
68
74
|
"jest": {
|
|
69
75
|
"coverageProvider": "v8",
|
|
70
76
|
"testMatch": [
|