ts-case-convert 2.3.2 → 3.0.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 +84 -6
- package/lib/caseConvert.d.ts +11 -11
- package/lib/caseConvert.js +71 -34
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -18,11 +18,13 @@
|
|
|
18
18
|
</a>
|
|
19
19
|
</p>
|
|
20
20
|
|
|
21
|
-
ts-case-convert is a zero dependency implementation for converting object keys between camelCase, snake_case, PascalCase, and SCREAMING_SNAKE_CASE while preserving TypeScript type information, code completion, and type validation. See tests for detailed conversion tests.
|
|
21
|
+
ts-case-convert is a zero dependency implementation for converting object keys between camelCase, snake_case, PascalCase, and SCREAMING_SNAKE_CASE, accepting upper and lower kebab-case input, while preserving TypeScript type information, code completion, and type validation. See tests for detailed conversion tests.
|
|
22
22
|
|
|
23
23
|
## Usage
|
|
24
24
|
|
|
25
25
|
```typescript
|
|
26
|
+
import { objectToCamel, objectToSnake, objectToScreamingSnake } from 'ts-case-convert';
|
|
27
|
+
|
|
26
28
|
const camel = objectToCamel({
|
|
27
29
|
hello_world: 'helloWorld',
|
|
28
30
|
a_number: 5,
|
|
@@ -38,7 +40,7 @@ const camel = objectToCamel({
|
|
|
38
40
|
|
|
39
41
|
type CheckCamel = typeof camel.anArrayOfObjects[0]['aB']; // -> 'string'
|
|
40
42
|
const ab: CheckCamel = camel.anArrayOfObjects[0]['aB']; // -> valid
|
|
41
|
-
console.log(camel.anArrayOfObjects.aB); // -> 'ab'
|
|
43
|
+
console.log(camel.anArrayOfObjects[0].aB); // -> 'ab'
|
|
42
44
|
|
|
43
45
|
const snake = objectToSnake({
|
|
44
46
|
helloWorld: 'helloWorld',
|
|
@@ -54,8 +56,8 @@ const snake = objectToSnake({
|
|
|
54
56
|
});
|
|
55
57
|
|
|
56
58
|
type CheckSnake = typeof snake.an_array_of_objects[0]['a_b']; // -> 'string'
|
|
57
|
-
const
|
|
58
|
-
console.log(snake.an_array_of_objects.a_b); // -> 'ab'
|
|
59
|
+
const snakeAB: CheckSnake = snake.an_array_of_objects[0]['a_b']; // -> valid
|
|
60
|
+
console.log(snake.an_array_of_objects[0].a_b); // -> 'ab'
|
|
59
61
|
|
|
60
62
|
const screamingSnake = objectToScreamingSnake({
|
|
61
63
|
helloWorld: 'helloWorld',
|
|
@@ -69,16 +71,92 @@ type CheckScreamingSnake = typeof screamingSnake.NESTED_OBJECT.API_VERSION; // -
|
|
|
69
71
|
console.log(screamingSnake.S3_ID); // -> 'id'
|
|
70
72
|
```
|
|
71
73
|
|
|
74
|
+
## Supported input cases
|
|
75
|
+
|
|
76
|
+
The string functions `toCamel`, `toPascal`, `toSnake`, and `toScreamingSnake` convert a single name. The corresponding `objectTo…` functions convert keys recursively through objects and arrays, preserving values such as `Date` and `Uint8Array`. Both entry points export all four modes and their matching TypeScript types.
|
|
77
|
+
|
|
78
|
+
The converters recognize the input style before applying the output rules:
|
|
79
|
+
|
|
80
|
+
| Input style | Example | Camel | Pascal | Snake | Screaming snake |
|
|
81
|
+
| --- | --- | --- | --- | --- | --- |
|
|
82
|
+
| camelCase | `apiVersion` | `apiVersion` | `ApiVersion` | `api_version` | `API_VERSION` |
|
|
83
|
+
| PascalCase | `ApiVersion` | `apiVersion` | `ApiVersion` | `api_version` | `API_VERSION` |
|
|
84
|
+
| snake_case | `api_version` | `apiVersion` | `ApiVersion` | `api_version` | `API_VERSION` |
|
|
85
|
+
| SCREAMING_SNAKE_CASE | `API_VERSION` | `apiVersion` | `ApiVersion` | `api_version` | `API_VERSION` |
|
|
86
|
+
| Lower kebab | `content-type` | `contentType` | `ContentType` | `content_type` | `CONTENT_TYPE` |
|
|
87
|
+
| Title kebab | `Content-Type` | `contentType` | `ContentType` | `content_type` | `CONTENT_TYPE` |
|
|
88
|
+
| Upper kebab | `CONTENT-TYPE` | `contentType` | `ContentType` | `content_type` | `CONTENT_TYPE` |
|
|
89
|
+
|
|
90
|
+
For input without underscores or hyphens, camel and Pascal conversion change only the first character. Internal capitals remain unchanged: `AbcDEF` becomes `abcDEF` in camel case, and `abcDEF` becomes `AbcDEF` in Pascal case. This also preserves `HTTPServer` as `hTTPServer` in camel case and `ABC` as `aBC`.
|
|
91
|
+
|
|
92
|
+
For camel/Pascal input, snake conversion inserts an underscore before each capital after the first. It does not group capital runs into acronyms: `abcDEF` becomes `abc_d_e_f`, and `HTTPServer` becomes `h_t_t_p_server`. Screaming snake uses the same boundaries and uppercases the result.
|
|
93
|
+
|
|
94
|
+
For separated input, underscores and hyphens separate words, and consecutive capitals stay together. `API_VERSION` becomes `apiVersion`, `ApiVersion`, `api_version`, or `API_VERSION`. Capitalization boundaries use ASCII letters; other characters remain within the words.
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
import { objectToCamel, toPascal, toSnake, type ToCamel } from 'ts-case-convert';
|
|
98
|
+
|
|
99
|
+
const output = objectToCamel({ API_VERSION: 2, 'Content-Type': 'text/plain' });
|
|
100
|
+
console.log(output.apiVersion); // 2; inferred as number
|
|
101
|
+
console.log(output.contentType); // 'text/plain'; inferred as string
|
|
102
|
+
|
|
103
|
+
type Name = ToCamel<'API_VERSION'>; // 'apiVersion'
|
|
104
|
+
console.log(toPascal('API_VERSION')); // 'ApiVersion'
|
|
105
|
+
console.log(toSnake('HTTPServer')); // 'h_t_t_p_server'
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Signed decimal string keys such as `'-1'` and `'-12.5'` stay unchanged. Numeric object keys such as `42` become string keys such as `'42'` in both the returned value and its type. Repeated, leading, and trailing separators are not valid case styles. They are accepted without validation, and empty words are ignored: `a__b` becomes `aB`, `AB`, `a_b`, or `A_B`; `trailing_` becomes `trailing`, `Trailing`, `trailing`, or `TRAILING`. Empty strings and strings containing only separators become empty strings. The runtime result and inferred type follow the same rules.
|
|
109
|
+
|
|
110
|
+
## Awkward inputs
|
|
111
|
+
|
|
112
|
+
The converters follow spelling rules rather than guessing what an acronym means. Existing camel/Pascal capitals are preserved when changing between those two styles, and each capital starts a word when converting to snake case. These inputs can therefore give surprising results:
|
|
113
|
+
|
|
114
|
+
| Input | Camel | Pascal | Snake | Screaming snake |
|
|
115
|
+
| --- | --- | --- | --- | --- |
|
|
116
|
+
| `AbcDEF` | `abcDEF` | `AbcDEF` | `abc_d_e_f` | `ABC_D_E_F` |
|
|
117
|
+
| `HTTPServer` | `hTTPServer` | `HTTPServer` | `h_t_t_p_server` | `H_T_T_P_SERVER` |
|
|
118
|
+
| `ABC` | `aBC` | `ABC` | `a_b_c` | `A_B_C` |
|
|
119
|
+
| `API_VERSION` | `apiVersion` | `ApiVersion` | `api_version` | `API_VERSION` |
|
|
120
|
+
| `a__b` | `aB` | `AB` | `a_b` | `A_B` |
|
|
121
|
+
| `trailing_` | `trailing` | `Trailing` | `trailing` | `TRAILING` |
|
|
122
|
+
| `a1` | `a1` | `A1` | `a_1` | `A_1` |
|
|
123
|
+
| `A1` | `a1` | `A1` | `a1` | `A1` |
|
|
124
|
+
|
|
125
|
+
The last two rows use default number splitting, which depends on the input letter case. The `no-split-numbers` entry point produces `a1` and `A1` for both rows in snake and screaming snake output. Repeated or trailing separators are invalid case styles, but their types and runtime values still agree. Use one consistent input style when predictable word boundaries matter.
|
|
126
|
+
|
|
127
|
+
## Migrating to 3.0.0
|
|
128
|
+
|
|
129
|
+
Version 3 changes both returned keys and literal types. Update property access, serialized payloads, and integrations that rely on version 2 spellings:
|
|
130
|
+
|
|
131
|
+
| Conversion | Input | Version 2 runtime | Version 3 runtime and type |
|
|
132
|
+
| --- | --- | --- | --- |
|
|
133
|
+
| Camel | `API_VERSION` | `aPI_VERSION` | `apiVersion` |
|
|
134
|
+
| Pascal | `API_VERSION` | `API_VERSION` | `ApiVersion` |
|
|
135
|
+
| Snake | `API_VERSION` | `a_p_i__v_e_r_s_i_o_n` | `api_version` |
|
|
136
|
+
| Camel | `Content-Type` | `content-Type` | `contentType` |
|
|
137
|
+
| Snake | `content-type` | `content-type` | `content_type` |
|
|
138
|
+
| Camel | `a__b` | `a_B` | `aB` |
|
|
139
|
+
| Camel | `trailing_` | `trailing_` | `trailing` |
|
|
140
|
+
|
|
141
|
+
Separated uppercase words are normalized (`API_VERSION` becomes `apiVersion`, `ApiVersion`, `api_version`, or `API_VERSION`). Existing camel/Pascal names retain their previous conversion rules, including an underscore before each capital for snake output; standalone `ABC` becomes `aBC` in camel case and stays `ABC` in Pascal case. Every word boundary is converted; the old ten-replacement limit is removed. These changes apply to string functions, recursive object conversion, and `ts-case-convert/no-split-numbers`.
|
|
142
|
+
|
|
143
|
+
Distinct input keys can normalize to the same output key. For example, `a_b`, `a__b`, and `a-b` all become `aB` in camel case. Object conversion keeps the value of the last key visited by `Object.entries`; choose inputs without such collisions when every value must be retained.
|
|
144
|
+
|
|
72
145
|
## No Number Splitting
|
|
73
146
|
|
|
74
|
-
The default snake
|
|
147
|
+
The default snake and screaming snake conversions split a lowercase letter from a following digit run, unless that run is followed by a capital and then a lowercase letter:
|
|
75
148
|
|
|
76
149
|
```typescript
|
|
77
150
|
import { toSnake } from 'ts-case-convert';
|
|
78
151
|
|
|
79
152
|
console.log(toSnake('myItem1')); // -> 'my_item_1'
|
|
153
|
+
console.log(toSnake('s3Id')); // -> 's3_id'
|
|
154
|
+
console.log(toSnake('http23Status')); // -> 'http23_status'
|
|
155
|
+
console.log(toSnake('A1')); // -> 'a1' (the input letter is uppercase)
|
|
80
156
|
```
|
|
81
157
|
|
|
158
|
+
Camel and Pascal conversion never split digit runs. Explicit word separators still apply in every mode.
|
|
159
|
+
|
|
82
160
|
Use the `no-split-numbers` import path when numbers should stay attached to the preceding word. It exports the same runtime function and type names as the default entry point.
|
|
83
161
|
|
|
84
162
|
```typescript
|
|
@@ -116,7 +194,7 @@ pnpm run test
|
|
|
116
194
|
|
|
117
195
|
## Documentation
|
|
118
196
|
|
|
119
|
-
See [tests](./test/caseConvert.test.ts), [bug regression tests](./test/caseConvert.bugs.test.ts),
|
|
197
|
+
See [tests](./test/caseConvert.test.ts), [bug regression tests](./test/caseConvert.bugs.test.ts), [no-split-numbers tests](./test/no-split-numbers.test.ts), [input case tests](./test/case-forms.test.ts), [kebab input tests](./test/kebab-case.test.ts), and [recursive conversion tests](./test/recursive-cases.test.ts).
|
|
120
198
|
|
|
121
199
|
## 📝 License
|
|
122
200
|
|
package/lib/caseConvert.d.ts
CHANGED
|
@@ -10,15 +10,15 @@ export declare function objectToScreamingSnake<T extends object>(obj: T): Object
|
|
|
10
10
|
export declare function objectToScreamingSnakeNoSplitNumbers<T extends object>(obj: T): ObjectToScreamingSnake<T, false>;
|
|
11
11
|
export declare function toPascal<T extends string>(term: T): ToPascal<T>;
|
|
12
12
|
export declare function objectToPascal<T extends object>(obj: T): ObjectToPascal<T>;
|
|
13
|
-
export type ToCamel<S extends string | number | symbol> =
|
|
13
|
+
export type ToCamel<S extends string | number | symbol> = ConvertKey<S, 'camel', false>;
|
|
14
14
|
export type ObjectToCamel<T extends object | undefined | null> = T extends undefined ? undefined : T extends null ? null : T extends Array<infer ArrayType> ? Array<ConvertArrayItem<ArrayType, 'camel'>> : T extends Uint8Array ? Uint8Array : T extends Date ? Date : {
|
|
15
15
|
[K in keyof T as ToCamel<K>]: ConvertObjectValue<T[K], 'camel'>;
|
|
16
16
|
};
|
|
17
|
-
export type ToPascal<S extends string | number | symbol> =
|
|
17
|
+
export type ToPascal<S extends string | number | symbol> = ConvertKey<S, 'pascal', false>;
|
|
18
18
|
export type ObjectToPascal<T extends object | undefined | null> = T extends undefined ? undefined : T extends null ? null : T extends Array<infer ArrayType> ? Array<ConvertArrayItem<ArrayType, 'pascal'>> : T extends Uint8Array ? Uint8Array : T extends Date ? Date : {
|
|
19
19
|
[K in keyof T as ToPascal<K>]: ConvertObjectValue<T[K], 'pascal'>;
|
|
20
20
|
};
|
|
21
|
-
export type ToSnake<S extends string | number | symbol, SplitNumbers extends boolean = true> =
|
|
21
|
+
export type ToSnake<S extends string | number | symbol, SplitNumbers extends boolean = true> = ConvertKey<S, 'snake', SplitNumbers>;
|
|
22
22
|
export type ObjectToSnake<T extends object | undefined | null, SplitNumbers extends boolean = true> = T extends undefined ? undefined : T extends null ? null : T extends Array<infer ArrayType> ? Array<ConvertArrayItem<ArrayType, 'snake', SplitNumbers>> : T extends Uint8Array ? Uint8Array : T extends Date ? Date : {
|
|
23
23
|
[K in keyof T as ToSnake<K, SplitNumbers>]: ConvertObjectValue<T[K], 'snake', SplitNumbers>;
|
|
24
24
|
};
|
|
@@ -27,15 +27,15 @@ export type ObjectToScreamingSnake<T extends object | undefined | null, SplitNum
|
|
|
27
27
|
[K in keyof T as ToScreamingSnake<K, SplitNumbers>]: ConvertObjectValue<T[K], 'screamingSnake', SplitNumbers>;
|
|
28
28
|
};
|
|
29
29
|
type CaseMode = 'camel' | 'pascal' | 'snake' | 'screamingSnake';
|
|
30
|
-
type
|
|
31
|
-
type
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
type ConvertKey<S extends string | number | symbol, Mode extends CaseMode, SplitNumbers extends boolean> = S extends number ? ConvertKey<`${S}`, Mode, SplitNumbers> : S extends string ? string extends S ? string : IsNumericKey<S> extends true ? S : S extends `${string}${'_' | '-'}${string}` ? ConvertKeyScan<S, Mode, SplitNumbers> : Mode extends 'camel' ? Uncapitalize<S> : Mode extends 'pascal' ? Capitalize<S> : ConvertKeyScan<S, Mode, SplitNumbers, true> : never;
|
|
31
|
+
type IsNumericKey<S extends string> = S extends `-${infer Unsigned}` ? IsDecimal<Unsigned> : IsDecimal<S>;
|
|
32
|
+
type IsDecimal<S extends string> = S extends `${infer Whole}.${infer Fraction}` ? IsDigits<Whole> extends true ? IsDigits<Fraction> : false : IsDigits<S>;
|
|
33
|
+
type IsDigits<S extends string> = S extends '' ? false : TakeNumberRun<S> extends [string, ''] ? true : false;
|
|
34
|
+
type AppendWord<Acc extends string, Word extends string, Mode extends CaseMode> = Word extends '' ? Acc : Mode extends 'snake' ? Acc extends '' ? Lowercase<Word> : `${Acc}_${Lowercase<Word>}` : Mode extends 'pascal' ? `${Acc}${Capitalize<Lowercase<Word>>}` : Acc extends '' ? Lowercase<Word> : `${Acc}${Capitalize<Lowercase<Word>>}`;
|
|
35
|
+
type ConvertKeyScan<S extends string, Mode extends CaseMode, SplitNumbers extends boolean, SeparateCapitals extends boolean = false, Acc extends string = '', Word extends string = '', Previous extends string = ''> = string extends S ? string : S extends `${infer Head}${infer Tail}` ? string extends Head ? string : Head extends '_' | '-' ? ConvertKeyScan<Tail, Mode, SplitNumbers, SeparateCapitals, AppendWord<Acc, Word, Mode>> : Head extends Numbers ? TakeNumberRun<S> extends [infer Digits extends string, infer After extends string] ? SplitNumber<Previous, After, SplitNumbers> extends true ? ConvertKeyScan<After, Mode, SplitNumbers, SeparateCapitals, AppendWord<Acc, Word, Mode>, Digits, '0'> : ConvertKeyScan<After, Mode, SplitNumbers, SeparateCapitals, Acc, `${Word}${Digits}`, '0'> : never : Head extends CapitalLetters ? StartsWord<Previous, Tail, SeparateCapitals> extends true ? ConvertKeyScan<Tail, Mode, SplitNumbers, SeparateCapitals, AppendWord<Acc, Word, Mode>, Head, Head> : ConvertKeyScan<Tail, Mode, SplitNumbers, SeparateCapitals, Acc, `${Word}${Head}`, Head> : Head extends LowercaseLetters ? ConvertKeyScan<Tail, Mode, SplitNumbers, SeparateCapitals, Acc, `${Word}${Head}`, Head> : Extract<CapitalLetters | LowercaseLetters | Numbers | '_' | '-', Head> extends never ? ConvertKeyScan<Tail, Mode, SplitNumbers, SeparateCapitals, Acc, `${Word}${Head}`, Head> : string : S extends '' ? AppendWord<Acc, Word, Mode> : string;
|
|
36
|
+
type StartsWord<Previous extends string, Tail extends string, SeparateCapitals extends boolean> = SeparateCapitals extends true ? true : Previous extends LowercaseLetters | Numbers ? true : Previous extends CapitalLetters ? Tail extends `${LowercaseLetters}${string}` ? true : false : false;
|
|
35
37
|
type TakeNumberRun<S extends string, Acc extends string = ''> = S extends `${infer Head}${infer Tail}` ? Head extends Numbers ? TakeNumberRun<Tail, `${Acc}${Head}`> : [Acc, S] : [Acc, ''];
|
|
36
|
-
type
|
|
37
|
-
type WordSeparator<Acc extends string> = Acc extends '' ? '' : Acc extends `${string}_` ? '' : '_';
|
|
38
|
-
type CharacterKind = 'start' | 'lower' | 'upper' | 'number' | 'other';
|
|
38
|
+
type SplitNumber<Previous extends string, AfterNumber extends string, SplitNumbers extends boolean> = SplitNumbers extends false ? false : Previous extends LowercaseLetters ? AfterNumber extends `${CapitalLetters}${LowercaseLetters}${string}` ? false : true : false;
|
|
39
39
|
type Convert<T extends object | undefined | null, Mode extends CaseMode, SplitNumbers extends boolean> = Mode extends 'camel' ? ObjectToCamel<T> : Mode extends 'pascal' ? ObjectToPascal<T> : Mode extends 'snake' ? ObjectToSnake<T, SplitNumbers> : ObjectToScreamingSnake<T, SplitNumbers>;
|
|
40
40
|
type ConvertArrayItem<T, Mode extends CaseMode, SplitNumbers extends boolean = true> = T extends object ? Convert<T, Mode, SplitNumbers> : T;
|
|
41
41
|
type ConvertObjectValue<T, Mode extends CaseMode, SplitNumbers extends boolean = true> = T extends Array<infer ArrayType> ? Array<ConvertArrayItem<ArrayType, Mode, SplitNumbers>> : T extends object | undefined | null ? Convert<T, Mode, SplitNumbers> : T;
|
package/lib/caseConvert.js
CHANGED
|
@@ -33,49 +33,89 @@ function convertObject(obj, keyConverter) {
|
|
|
33
33
|
}
|
|
34
34
|
return out;
|
|
35
35
|
}
|
|
36
|
-
|
|
36
|
+
// Keep these word boundaries in sync with ConvertKeyScan below.
|
|
37
|
+
function convertKey(term, mode, splitNumbers = false) {
|
|
38
|
+
var _a, _b, _c, _d;
|
|
37
39
|
if (isNumericKey(term)) {
|
|
38
40
|
return term;
|
|
39
41
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
function objectToCamel(obj) {
|
|
47
|
-
return convertObject(obj, toCamel);
|
|
48
|
-
}
|
|
49
|
-
function toSnakeWithSplitNumbers(term, splitNumbers) {
|
|
50
|
-
var _a;
|
|
51
|
-
if (isNumericKey(term)) {
|
|
52
|
-
return term;
|
|
42
|
+
const hasSeparators = /[_-]/.test(term);
|
|
43
|
+
// Existing camel/Pascal names retain every letter after the first.
|
|
44
|
+
if ((mode === 'camel' || mode === 'pascal') && !hasSeparators) {
|
|
45
|
+
const first = term.charAt(0);
|
|
46
|
+
return (mode === 'camel' ? first.toLowerCase() : first.toUpperCase()) + term.slice(1);
|
|
53
47
|
}
|
|
54
|
-
let result =
|
|
55
|
-
let
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
48
|
+
let result = '';
|
|
49
|
+
let wordStart = 0;
|
|
50
|
+
const appendWord = (end) => {
|
|
51
|
+
if (end === wordStart) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const word = term.slice(wordStart, end).toLowerCase();
|
|
55
|
+
if (mode === 'snake') {
|
|
56
|
+
result += `${result ? '_' : ''}${word}`;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
result += mode === 'pascal' || result !== ''
|
|
60
|
+
? word[0].toUpperCase() + word.slice(1)
|
|
61
|
+
: word;
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
for (let index = 0; index < term.length; index += 1) {
|
|
65
|
+
const current = term[index];
|
|
66
|
+
const previous = (_a = term[index - 1]) !== null && _a !== void 0 ? _a : '';
|
|
67
|
+
if (current === '_' || current === '-') {
|
|
68
|
+
appendWord(index);
|
|
69
|
+
wordStart = index + 1;
|
|
70
|
+
}
|
|
71
|
+
else if (splitNumbers && isDigit(current)) {
|
|
72
|
+
let afterNumber = index + 1;
|
|
73
|
+
while (afterNumber < term.length && isDigit(term[afterNumber])) {
|
|
74
|
+
afterNumber += 1;
|
|
75
|
+
}
|
|
76
|
+
if (isLowercase(previous) &&
|
|
77
|
+
!(isUppercase((_b = term[afterNumber]) !== null && _b !== void 0 ? _b : '') && isLowercase((_c = term[afterNumber + 1]) !== null && _c !== void 0 ? _c : ''))) {
|
|
78
|
+
appendWord(index);
|
|
79
|
+
wordStart = index;
|
|
80
|
+
}
|
|
81
|
+
index = afterNumber - 1;
|
|
82
|
+
}
|
|
83
|
+
else if (index > wordStart && isUppercase(current) &&
|
|
84
|
+
(!hasSeparators || isLowercase(previous) || isDigit(previous) ||
|
|
85
|
+
(isUppercase(previous) && isLowercase((_d = term[index + 1]) !== null && _d !== void 0 ? _d : '')))) {
|
|
86
|
+
appendWord(index);
|
|
87
|
+
wordStart = index;
|
|
62
88
|
}
|
|
63
89
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
90
|
+
appendWord(term.length);
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
function isLowercase(character) {
|
|
94
|
+
return character >= 'a' && character <= 'z';
|
|
95
|
+
}
|
|
96
|
+
function isUppercase(character) {
|
|
97
|
+
return character >= 'A' && character <= 'Z';
|
|
98
|
+
}
|
|
99
|
+
function isDigit(character) {
|
|
100
|
+
return character >= '0' && character <= '9';
|
|
101
|
+
}
|
|
102
|
+
function toCamel(term) {
|
|
103
|
+
return convertKey(term, 'camel');
|
|
104
|
+
}
|
|
105
|
+
function objectToCamel(obj) {
|
|
106
|
+
return convertObject(obj, toCamel);
|
|
67
107
|
}
|
|
68
108
|
function toSnake(term) {
|
|
69
|
-
return
|
|
109
|
+
return convertKey(term, 'snake', true);
|
|
70
110
|
}
|
|
71
111
|
function toSnakeNoSplitNumbers(term) {
|
|
72
|
-
return
|
|
112
|
+
return convertKey(term, 'snake', false);
|
|
73
113
|
}
|
|
74
114
|
function objectToSnake(obj) {
|
|
75
|
-
return convertObject(obj,
|
|
115
|
+
return convertObject(obj, toSnake);
|
|
76
116
|
}
|
|
77
117
|
function objectToSnakeNoSplitNumbers(obj) {
|
|
78
|
-
return convertObject(obj,
|
|
118
|
+
return convertObject(obj, toSnakeNoSplitNumbers);
|
|
79
119
|
}
|
|
80
120
|
function toScreamingSnake(term) {
|
|
81
121
|
return toSnake(term).toUpperCase();
|
|
@@ -90,10 +130,7 @@ function objectToScreamingSnakeNoSplitNumbers(obj) {
|
|
|
90
130
|
return convertObject(obj, toScreamingSnakeNoSplitNumbers);
|
|
91
131
|
}
|
|
92
132
|
function toPascal(term) {
|
|
93
|
-
|
|
94
|
-
return term;
|
|
95
|
-
}
|
|
96
|
-
return toCamel(term).replace(/^([a-z])/, (m) => m[0].toUpperCase());
|
|
133
|
+
return convertKey(term, 'pascal');
|
|
97
134
|
}
|
|
98
135
|
function objectToPascal(obj) {
|
|
99
136
|
return convertObject(obj, toPascal);
|
|
@@ -101,4 +138,4 @@ function objectToPascal(obj) {
|
|
|
101
138
|
function isNumericKey(term) {
|
|
102
139
|
return /^-?\d+(?:\.\d+)?$/.test(term);
|
|
103
140
|
}
|
|
104
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzZUNvbnZlcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2FzZUNvbnZlcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFnREEsMEJBWUM7QUFFRCxzQ0FFQztBQWtDRCwwQkFFQztBQUVELHNEQUlDO0FBRUQsc0NBRUM7QUFFRCxrRUFJQztBQUVELDRDQUlDO0FBRUQsd0VBSUM7QUFFRCx3REFJQztBQUVELG9GQUlDO0FBRUQsNEJBUUM7QUFFRCx3Q0FFQztBQTFKRCxTQUFTLGFBQWEsQ0FDcEIsR0FBVyxFQUNYLFlBQXFDO0lBRXJDLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxPQUFPLEdBQUcsS0FBSyxXQUFXLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDMUUsT0FBTyxHQUF5QixDQUFDO0lBQ25DLENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFZLENBQUM7SUFDdEQsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUV6QyxhQUFhO1FBRWIsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLENBQUMsQ0FBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQTJCLElBQWUsRUFBRSxFQUFFLENBQ25ELE9BQU8sSUFBSSxLQUFLLFFBQVE7Z0JBQ3hCLENBQUMsQ0FBQyxJQUFJLFlBQVksVUFBVSxDQUFDO2dCQUM3QixDQUFDLENBQUMsSUFBSSxZQUFZLElBQUksQ0FBQztnQkFDckIsQ0FBQyxDQUFDLGFBQWEsQ0FTWCxJQUFJLEVBQUUsWUFBWSxDQUFDO2dCQUN2QixDQUFDLENB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Y3Rpb24gY29udmVydE9iamVjdDxUSW5wdXQgZXh0ZW5kcyBvYmplY3QsIFRSZXN1bHQ+KFxuICBvYmo6IFRJbnB1dCxcbiAga2V5Q29udmVydGVyOiAoYXJnOiBzdHJpbmcpID0+IHN0cmluZyxcbik6IFRSZXN1bHQge1xuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG9iaiBhcyB1bmtub3duIGFzIFRSZXN1bHQ7XG4gIH1cblxuICBjb25zdCBvdXQgPSAoQXJyYXkuaXNBcnJheShvYmopID8gW10gOiB7fSkgYXMgVFJlc3VsdDtcbiAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuXG4gICAgb3V0W2tleUNvbnZlcnRlcihrKV0gPSBBcnJheS5pc0FycmF5KHYpXG4gICAgICA/ICh2Lm1hcCg8QXJyYXlJdGVtIGV4dGVuZHMgb2JqZWN0PihpdGVtOiBBcnJheUl0ZW0pID0+XG4gICAgICAgICAgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgIShpdGVtIGluc3RhbmNlb2YgVWludDhBcnJheSkgJiZcbiAgICAgICAgICAhKGl0ZW0gaW5zdGFuY2VvZiBEYXRlKVxuICAgICAgICAgICAgPyBjb252ZXJ0T2JqZWN0PFxuICAgICAgICAgICAgICAgIEFycmF5SXRlbSxcbiAgICAgICAgICAgICAgICBUUmVzdWx0IGV4dGVuZHMgT2JqZWN0VG9DYW1lbDxUSW5wdXQ+XG4gICAgICAgICAgICAgICAgICA/IE9iamVjdFRvQ2FtZWw8QXJyYXlJdGVtPlxuICAgICAgICAgICAgICAgICAgOiBUUmVzdWx0IGV4dGVuZHMgT2JqZWN0VG9QYXNjYWw8VElucHV0PlxuICAgICAgICAgICAgICAgICAgPyBPYmplY3RUb1Bhc2NhbDxBcnJheUl0ZW0+XG4gICAgICAgICAgICAgICAgICA6IFRSZXN1bHQgZXh0ZW5kcyBPYmplY3RUb1NjcmVhbWluZ1NuYWtlPFRJbnB1dD5cbiAgICAgICAgICAgICAgICAgID8gT2JqZWN0VG9TY3JlYW1pbmdTbmFrZTxBcnJheUl0ZW0+XG4gICAgICAgICAgICAgICAgICA6IE9iamVjdFRvU25ha2U8QXJyYXlJdGVtPlxuICAgICAgICAgICAgICA+KGl0ZW0sIGtleUNvbnZlcnRlcilcbiAgICAgICAgICAgIDogaXRlbSxcbiAgICAgICAgKSBhcyB1bmtub3duW10pXG4gICAgICA6IHYgaW5zdGFuY2VvZiBVaW50OEFycmF5IHx8IHYgaW5zdGFuY2VvZiBEYXRlXG4gICAgICA/IHZcbiAgICAgIDogdHlwZW9mIHYgPT09ICdvYmplY3QnXG4gICAgICA/IGNvbnZlcnRPYmplY3Q8XG4gICAgICAgICAgdHlwZW9mIHYsXG4gICAgICAgICAgVFJlc3VsdCBleHRlbmRzIE9iamVjdFRvQ2FtZWw8VElucHV0PlxuICAgICAgICAgICAgPyBPYmplY3RUb0NhbWVsPHR5cGVvZiB2PlxuICAgICAgICAgICAgOiBUUmVzdWx0IGV4dGVuZHMgT2JqZWN0VG9QYXNjYWw8VElucHV0PlxuICAgICAgICAgICAgPyBPYmplY3RUb1Bhc2NhbDx0eXBlb2Ygdj5cbiAgICAgICAgICAgIDogVFJlc3VsdCBleHRlbmRzIE9iamVjdFRvU2NyZWFtaW5nU25ha2U8VElucHV0PlxuICAgICAgICAgICAgPyBPYmplY3RUb1NjcmVhbWluZ1NuYWtlPHR5cGVvZiB2PlxuICAgICAgICAgICAgOiBPYmplY3RUb1NuYWtlPHR5cGVvZiB2PlxuICAgICAgICA+KHYsIGtleUNvbnZlcnRlcilcbiAgICAgIDogKHYgYXMgdW5rbm93bik7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvQ2FtZWw8VCBleHRlbmRzIHN0cmluZz4odGVybTogVCk6IFRvQ2FtZWw8VD4ge1xuICBpZiAoaXNOdW1lcmljS2V5KHRlcm0pKSB7XG4gICAgcmV0dXJuIHRlcm0gYXMgVG9DYW1lbDxUPjtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgdGVybS5sZW5ndGggPT09IDFcbiAgICAgID8gdGVybS50b0xvd2VyQ2FzZSgpXG4gICAgICA6IHRlcm1cbiAgICAgICAgICAucmVwbGFjZSgvXihbQS1aXSkvLCAobSkgPT4gbVswXS50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgIC5yZXBsYWNlKC9bXy1dKFthLXowLTldKS9nLCAobSkgPT4gbVsxXS50b1VwcGVyQ2FzZSgpKVxuICApIGFzIFRvQ2FtZWw8VD47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RUb0NhbWVsPFQgZXh0ZW5kcyBvYmplY3Q+KG9iajogVCk6IE9iamVjdFRvQ2FtZWw8VD4ge1xuICByZXR1cm4gY29udmVydE9iamVjdChvYmosIHRvQ2FtZWwpO1xufVxuXG5mdW5jdGlvbiB0b1NuYWtlV2l0aFNwbGl0TnVtYmVycyh0ZXJtOiBzdHJpbmcsIHNwbGl0TnVtYmVyczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmIChpc051bWVyaWNLZXkodGVybSkpIHtcbiAgICByZXR1cm4gdGVybTtcbiAgfVxuXG4gIGxldCByZXN1bHQ6IHN0cmluZyA9IHRlcm07XG4gIGxldCBjaXJjdWl0QnJlYWtlciA9IDA7XG5cbiAgaWYgKHNwbGl0TnVtYmVycykge1xuICAgIHdoaWxlIChcbiAgICAgICgvKFthLXpdKShbMC05XSspKD8hWzAtOV0qW0EtWl1bYS16XSkvLmV4ZWMocmVzdWx0KT8ubGVuZ3RoIHx8IDApID5cbiAgICAgICAgMiAmJlxuICAgICAgY2lyY3VpdEJyZWFrZXIgPCAxMFxuICAgICkge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoXG4gICAgICAgIC8oW2Etel0pKFswLTldKykoPyFbMC05XSpbQS1aXVthLXpdKS8sXG4gICAgICAgIChfYWxsLCBoZWFkOiBzdHJpbmcsIG51bWJlcnM6IHN0cmluZykgPT5cbiAgICAgICAgICBgJHtoZWFkLnRvTG93ZXJDYXNlKCl9XyR7bnVtYmVycy50b0xvd2VyQ2FzZSgpfWAsXG4gICAgICApO1xuXG4gICAgICBjaXJjdWl0QnJlYWtlciArPSAxO1xuICAgIH1cbiAgfVxuXG4gIC8vIE1hdGNoIG9ubHkgdGhlIGNoYXJhY3RlciBiZWZvcmUgYSBjYXBpdGFsIHRvIGF2b2lkIHJlc2Nhbm5pbmcgbG9uZyBwcmVmaXhlcy5cbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoLyguKSg/PVtBLVpdKS9nLCAoaGVhZDogc3RyaW5nKSA9PlxuICAgIGNpcmN1aXRCcmVha2VyKysgPCAxMCA/IGAke2hlYWR9X2AgOiBoZWFkLFxuICApO1xuXG4gIHJldHVybiByZXN1bHQudG9Mb3dlckNhc2UoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvU25ha2U8VCBleHRlbmRzIHN0cmluZz4odGVybTogVCk6IFRvU25ha2U8VD4ge1xuICByZXR1cm4gdG9TbmFrZVdpdGhTcGxpdE51bWJlcnModGVybSwgdHJ1ZSkgYXMgVG9TbmFrZTxUPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvU25ha2VOb1NwbGl0TnVtYmVyczxUIGV4dGVuZHMgc3RyaW5nPihcbiAgdGVybTogVCxcbik6IFRvU25ha2U8VCwgZmFsc2U+IHtcbiAgcmV0dXJuIHRvU25ha2VXaXRoU3BsaXROdW1iZXJzKHRlcm0sIGZhbHNlKSBhcyBUb1NuYWtlPFQsIGZhbHNlPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdFRvU25ha2U8VCBleHRlbmRzIG9iamVjdD4ob2JqOiBUKTogT2JqZWN0VG9TbmFrZTxUPiB7XG4gIHJldHVybiBjb252ZXJ0T2JqZWN0KG9iaiwgKGtleSkgPT4gdG9TbmFrZVdpdGhTcGxpdE51bWJlcnMoa2V5LCB0cnVlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RUb1NuYWtlTm9TcGxpdE51bWJlcnM8VCBleHRlbmRzIG9iamVjdD4oXG4gIG9iajogVCxcbik6IE9iamVjdFRvU25ha2U8VCwgZmFsc2U+IHtcbiAgcmV0dXJuIGNvbnZlcnRPYmplY3Qob2JqLCAoa2V5KSA9PiB0b1NuYWtlV2l0aFNwbGl0TnVtYmVycyhrZXksIGZhbHNlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1NjcmVhbWluZ1NuYWtlPFQgZXh0ZW5kcyBzdHJpbmc+KFxuICB0ZXJtOiBULFxuKTogVG9TY3JlYW1pbmdTbmFrZTxUPiB7XG4gIHJldHVybiB0b1NuYWtlKHRlcm0pLnRvVXBwZXJDYXNlKCkgYXMgVG9TY3JlYW1pbmdTbmFrZTxUPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvU2NyZWFtaW5nU25ha2VOb1NwbGl0TnVtYmVyczxUIGV4dGVuZHMgc3RyaW5nPihcbiAgdGVybTogVCxcbik6IFRvU2NyZWFtaW5nU25ha2U8VCwgZmFsc2U+IHtcbiAgcmV0dXJuIHRvU25ha2VOb1NwbGl0TnVtYmVycyh0ZXJtKS50b1VwcGVyQ2FzZSgpIGFzIFRvU2NyZWFtaW5nU25ha2U8VCwgZmFsc2U+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0VG9TY3JlYW1pbmdTbmFrZTxUIGV4dGVuZHMgb2JqZWN0PihcbiAgb2JqOiBULFxuKTogT2JqZWN0VG9TY3JlYW1pbmdTbmFrZTxUPiB7XG4gIHJldHVybiBjb252ZXJ0T2JqZWN0KG9iaiwgdG9TY3JlYW1pbmdTbmFrZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RUb1NjcmVhbWluZ1NuYWtlTm9TcGxpdE51bWJlcnM8VCBleHRlbmRzIG9iamVjdD4oXG4gIG9iajogVCxcbik6IE9iamVjdFRvU2NyZWFtaW5nU25ha2U8VCwgZmFsc2U+IHtcbiAgcmV0dXJuIGNvbnZlcnRPYmplY3Qob2JqLCB0b1NjcmVhbWluZ1NuYWtlTm9TcGxpdE51bWJlcnMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9QYXNjYWw8VCBleHRlbmRzIHN0cmluZz4odGVybTogVCk6IFRvUGFzY2FsPFQ+IHtcbiAgaWYgKGlzTnVtZXJpY0tleSh0ZXJtKSkge1xuICAgIHJldHVybiB0ZXJtIGFzIFRvUGFzY2FsPFQ+O1xuICB9XG5cbiAgcmV0dXJuIHRvQ2FtZWwodGVybSkucmVwbGFjZSgvXihbYS16XSkvLCAobSkgPT5cbiAgICBtWzBdLnRvVXBwZXJDYXNlKCksXG4gICkgYXMgVG9QYXNjYWw8VD47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RUb1Bhc2NhbDxUIGV4dGVuZHMgb2JqZWN0PihvYmo6IFQpOiBPYmplY3RUb1Bhc2NhbDxUPiB7XG4gIHJldHVybiBjb252ZXJ0T2JqZWN0KG9iaiwgdG9QYXNjYWwpO1xufVxuXG5leHBvcnQgdHlwZSBUb0NhbWVsPFMgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2w+ID0gUyBleHRlbmRzIHN0cmluZ1xuICA/IFMgZXh0ZW5kcyBOdW1lcmljS2V5XG4gICAgPyBTXG4gICAgOiBTIGV4dGVuZHMgYCR7aW5mZXIgSGVhZH1fJHtpbmZlciBUYWlsfWBcbiAgICA/IGAke1RvQ2FtZWw8VW5jYXBpdGFsaXplPEhlYWQ+Pn0ke0NhcGl0YWxpemU8VG9DYW1lbDxUYWlsPj59YFxuICAgIDogUyBleHRlbmRzIGAke2luZmVyIEhlYWR9LSR7aW5mZXIgVGFpbH1gXG4gICAgPyBgJHtUb0NhbWVsPFVuY2FwaXRhbGl6ZTxIZWFkPj59JHtDYXBpdGFsaXplPFRvQ2FtZWw8VGFpbD4+fWBcbiAgICA6IFVuY2FwaXRhbGl6ZTxTPlxuICA6IG5ldmVyO1xuXG5leHBvcnQgdHlwZSBPYmplY3RUb0NhbWVsPFQgZXh0ZW5kcyBvYmplY3QgfCB1bmRlZmluZWQgfCBudWxsPiA9XG4gIFQgZXh0ZW5kcyB1bmRlZmluZWRcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogVCBleHRlbmRzIG51bGxcbiAgICA/IG51bGxcbiAgICA6IFQgZXh0ZW5kcyBBcnJheTxpbmZlciBBcnJheVR5cGU+XG4gICAgPyBBcnJheTxDb252ZXJ0QXJyYXlJdGVtPEFycmF5VHlwZSwgJ2NhbWVsJz4+XG4gICAgOiBUIGV4dGVuZHMgVWludDhBcnJheVxuICAgID8gVWludDhBcnJheVxuICAgIDogVCBleHRlbmRzIERhdGVcbiAgICA/IERhdGVcbiAgICA6IHtcbiAgICAgICAgW0sgaW4ga2V5b2YgVCBhcyBUb0NhbWVsPEs+XTogQ29udmVydE9iamVjdFZhbHVlPFRbS10sICdjYW1lbCc+O1xuICAgICAgfTtcblxuZXhwb3J0IHR5cGUgVG9QYXNjYWw8UyBleHRlbmRzIHN0cmluZyB8IG51bWJlciB8IHN5bWJvbD4gPSBTIGV4dGVuZHMgc3RyaW5nXG4gID8gUyBleHRlbmRzIE51bWVyaWNLZXlcbiAgICA/IFNcbiAgICA6IFMgZXh0ZW5kcyBgJHtpbmZlciBIZWFkfV8ke2luZmVyIFRhaWx9YFxuICAgID8gYCR7Q2FwaXRhbGl6ZTxUb0NhbWVsPEhlYWQ+Pn0ke0NhcGl0YWxpemU8VG9DYW1lbDxUYWlsPj59YFxuICAgIDogUyBleHRlbmRzIGAke2luZmVyIEhlYWR9LSR7aW5mZXIgVGFpbH1gXG4gICAgPyBgJHtDYXBpdGFsaXplPFRvQ2FtZWw8SGVhZD4+fSR7Q2FwaXRhbGl6ZTxUb0NhbWVsPFRhaWw+Pn1gXG4gICAgOiBDYXBpdGFsaXplPFM+XG4gIDogbmV2ZXI7XG5cbmV4cG9ydCB0eXBlIE9iamVjdFRvUGFzY2FsPFQgZXh0ZW5kcyBvYmplY3QgfCB1bmRlZmluZWQgfCBudWxsPiA9XG4gIFQgZXh0ZW5kcyB1bmRlZmluZWRcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogVCBleHRlbmRzIG51bGxcbiAgICA/IG51bGxcbiAgICA6IFQgZXh0ZW5kcyBBcnJheTxpbmZlciBBcnJheVR5cGU+XG4gICAgPyBBcnJheTxDb252ZXJ0QXJyYXlJdGVtPEFycmF5VHlwZSwgJ3Bhc2NhbCc+PlxuICAgIDogVCBleHRlbmRzIFVpbnQ4QXJyYXlcbiAgICA/IFVpbnQ4QXJyYXlcbiAgICA6IFQgZXh0ZW5kcyBEYXRlXG4gICAgPyBEYXRlXG4gICAgOiB7XG4gICAgICAgIFtLIGluIGtleW9mIFQgYXMgVG9QYXNjYWw8Sz5dOiBDb252ZXJ0T2JqZWN0VmFsdWU8VFtLXSwgJ3Bhc2NhbCc+O1xuICAgICAgfTtcblxuZXhwb3J0IHR5cGUgVG9TbmFrZTxcbiAgUyBleHRlbmRzIHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCxcbiAgU3BsaXROdW1iZXJzIGV4dGVuZHMgYm9vbGVhbiA9IHRydWUsXG4+ID0gUyBleHRlbmRzIHN0cmluZ1xuICA/IHN0cmluZyBleHRlbmRzIFNcbiAgICA/IHN0cmluZ1xuICAgIDogUyBleHRlbmRzIE51bWVyaWNLZXlcbiAgICA/IFNcbiAgICA6IFNuYWtlU2NhbjxTLCAnJywgJ3N0YXJ0JywgU3BsaXROdW1iZXJzPlxuICA6IG5ldmVyO1xuXG5leHBvcnQgdHlwZSBPYmplY3RUb1NuYWtlPFxuICBUIGV4dGVuZHMgb2JqZWN0IHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgU3BsaXROdW1iZXJzIGV4dGVuZHMgYm9vbGVhbiA9IHRydWUsXG4+ID1cbiAgVCBleHRlbmRzIHVuZGVmaW5lZFxuICAgID8gdW5kZWZpbmVkXG4gICAgOiBUIGV4dGVuZHMgbnVsbFxuICAgID8gbnVsbFxuICAgIDogVCBleHRlbmRzIEFycmF5PGluZmVyIEFycmF5VHlwZT5cbiAgICA/IEFycmF5PENvbnZlcnRBcnJheUl0ZW08QXJyYXlUeXBlLCAnc25ha2UnLCBTcGxpdE51bWJlcnM+PlxuICAgIDogVCBleHRlbmRzIFVpbnQ4QXJyYXlcbiAgICA/IFVpbnQ4QXJyYXlcbiAgICA6IFQgZXh0ZW5kcyBEYXRlXG4gICAgPyBEYXRlXG4gICAgOiB7XG4gICAgICAgIFtLIGluIGtleW9mIFQgYXMgVG9TbmFrZTxLLCBTcGxpdE51bWJlcnM+XTogQ29udmVydE9iamVjdFZhbHVlPFxuICAgICAgICAgIFRbS10sXG4gICAgICAgICAgJ3NuYWtlJyxcbiAgICAgICAgICBTcGxpdE51bWJlcnNcbiAgICAgICAgPjtcbiAgICAgIH07XG5cbmV4cG9ydCB0eXBlIFRvU2NyZWFtaW5nU25ha2U8XG4gIFMgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsXG4gIFNwbGl0TnVtYmVycyBleHRlbmRzIGJvb2xlYW4gPSB0cnVlLFxuPiA9IFVwcGVyY2FzZTxUb1NuYWtlPFMsIFNwbGl0TnVtYmVycz4+O1xuXG5leHBvcnQgdHlwZSBPYmplY3RUb1NjcmVhbWluZ1NuYWtlPFxuICBUIGV4dGVuZHMgb2JqZWN0IHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgU3BsaXROdW1iZXJzIGV4dGVuZHMgYm9vbGVhbiA9IHRydWUsXG4+ID1cbiAgVCBleHRlbmRzIHVuZGVmaW5lZFxuICAgID8gdW5kZWZpbmVkXG4gICAgOiBUIGV4dGVuZHMgbnVsbFxuICAgID8gbnVsbFxuICAgIDogVCBleHRlbmRzIEFycmF5PGluZmVyIEFycmF5VHlwZT5cbiAgICA/IEFycmF5PENvbnZlcnRBcnJheUl0ZW08QXJyYXlUeXBlLCAnc2NyZWFtaW5nU25ha2UnLCBTcGxpdE51bWJlcnM+PlxuICAgIDogVCBleHRlbmRzIFVpbnQ4QXJyYXlcbiAgICA/IFVpbnQ4QXJyYXlcbiAgICA6IFQgZXh0ZW5kcyBEYXRlXG4gICAgPyBEYXRlXG4gICAgOiB7XG4gICAgICAgIFtLIGluIGtleW9mIFQgYXMgVG9TY3JlYW1pbmdTbmFrZTxLLCBTcGxpdE51bWJlcnM+XTogQ29udmVydE9iamVjdFZhbHVlPFxuICAgICAgICAgIFRbS10sXG4gICAgICAgICAgJ3NjcmVhbWluZ1NuYWtlJyxcbiAgICAgICAgICBTcGxpdE51bWJlcnNcbiAgICAgICAgPjtcbiAgICAgIH07XG5cbnR5cGUgQ2FzZU1vZGUgPSAnY2FtZWwnIHwgJ3Bhc2NhbCcgfCAnc25ha2UnIHwgJ3NjcmVhbWluZ1NuYWtlJztcblxudHlwZSBOdW1lcmljS2V5ID0gYCR7bnVtYmVyfWA7XG5cbnR5cGUgU25ha2VTY2FuPFxuICBTIGV4dGVuZHMgc3RyaW5nLFxuICBBY2MgZXh0ZW5kcyBzdHJpbmcsXG4gIFByZXZpb3VzIGV4dGVuZHMgQ2hhcmFjdGVyS2luZCxcbiAgU3BsaXROdW1iZXJzIGV4dGVuZHMgYm9vbGVhbixcbj4gPSBTIGV4dGVuZHMgYCR7aW5mZXIgSGVhZH0ke2luZmVyIFRhaWx9YFxuICA/IEhlYWQgZXh0ZW5kcyBOdW1iZXJzXG4gICAgPyBUYWtlTnVtYmVyUnVuPFM+IGV4dGVuZHMgW1xuICAgICAgICBpbmZlciBOdW1iZXJSdW4gZXh0ZW5kcyBzdHJpbmcsXG4gICAgICAgIGluZmVyIEFmdGVyTnVtYmVyIGV4dGVuZHMgc3RyaW5nLFxuICAgICAgXVxuICAgICAgPyBTbmFrZVNjYW48XG4gICAgICAgICAgQWZ0ZXJOdW1iZXIsXG4gICAgICAgICAgYCR7QWNjfSR7TnVtYmVyU2VwYXJhdG9yPFxuICAgICAgICAgICAgUHJldmlvdXMsXG4gICAgICAgICAgICBBZnRlck51bWJlcixcbiAgICAgICAgICAgIFNwbGl0TnVtYmVyc1xuICAgICAgICAgID59JHtOdW1iZXJSdW59YCxcbiAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICBTcGxpdE51bWJlcnNcbiAgICAgICAgPlxuICAgICAgOiBuZXZlclxuICAgIDogSGVhZCBleHRlbmRzIENhcGl0YWxMZXR0ZXJzXG4gICAgPyBTbmFrZVNjYW48XG4gICAgICAgIFRhaWwsXG4gICAgICAgIGAke0FjY30ke1dvcmRTZXBhcmF0b3I8QWNjPn0ke0xvd2VyY2FzZTxIZWFkPn1gLFxuICAgICAgICAndXBwZXInLFxuICAgICAgICBTcGxpdE51bWJlcnNcbiAgICAgID5cbiAgICA6IEhlYWQgZXh0ZW5kcyBMb3dlcmNhc2VMZXR0ZXJzXG4gICAgPyBTbmFrZVNjYW48VGFpbCwgYCR7QWNjfSR7SGVhZH1gLCAnbG93ZXInLCBTcGxpdE51bWJlcnM+XG4gICAgOiBTbmFrZVNjYW48VGFpbCwgYCR7QWNjfSR7SGVhZH1gLCAnb3RoZXInLCBTcGxpdE51bWJlcnM+XG4gIDogQWNjO1xuXG50eXBlIFRha2VOdW1iZXJSdW48XG4gIFMgZXh0ZW5kcyBzdHJpbmcsXG4gIEFjYyBleHRlbmRzIHN0cmluZyA9ICcnLFxuPiA9IFMgZXh0ZW5kcyBgJHtpbmZlciBIZWFkfSR7aW5mZXIgVGFpbH1gXG4gID8gSGVhZCBleHRlbmRzIE51bWJlcnNcbiAgICA/IFRha2VOdW1iZXJSdW48VGFpbCwgYCR7QWNjfSR7SGVhZH1gPlxuICAgIDogW0FjYywgU11cbiAgOiBbQWNjLCAnJ107XG5cbnR5cGUgTnVtYmVyU2VwYXJhdG9yPFxuICBQcmV2aW91cyBleHRlbmRzIENoYXJhY3RlcktpbmQsXG4gIEFmdGVyTnVtYmVyIGV4dGVuZHMgc3RyaW5nLFxuICBTcGxpdE51bWJlcnMgZXh0ZW5kcyBib29sZWFuLFxuPiA9IFNwbGl0TnVtYmVycyBleHRlbmRzIGZhbHNlXG4gID8gJydcbiAgOiBQcmV2aW91cyBleHRlbmRzICdsb3dlcidcbiAgPyBBZnRlck51bWJlciBleHRlbmRzIGAke0NhcGl0YWxMZXR0ZXJzfSR7TG93ZXJjYXNlTGV0dGVyc30ke3N0cmluZ31gXG4gICAgPyAnJ1xuICAgIDogJ18nXG4gIDogJyc7XG5cbnR5cGUgV29yZFNlcGFyYXRvcjxBY2MgZXh0ZW5kcyBzdHJpbmc+ID0gQWNjIGV4dGVuZHMgJydcbiAgPyAnJ1xuICA6IEFjYyBleHRlbmRzIGAke3N0cmluZ31fYFxuICA/ICcnXG4gIDogJ18nO1xuXG50eXBlIENoYXJhY3RlcktpbmQgPSAnc3RhcnQnIHwgJ2xvd2VyJyB8ICd1cHBlcicgfCAnbnVtYmVyJyB8ICdvdGhlcic7XG5cbnR5cGUgQ29udmVydDxcbiAgVCBleHRlbmRzIG9iamVjdCB8IHVuZGVmaW5lZCB8IG51bGwsXG4gIE1vZGUgZXh0ZW5kcyBDYXNlTW9kZSxcbiAgU3BsaXROdW1iZXJzIGV4dGVuZHMgYm9vbGVhbixcbj4gPVxuICBNb2RlIGV4dGVuZHMgJ2NhbWVsJ1xuICAgID8gT2JqZWN0VG9DYW1lbDxUPlxuICAgIDogTW9kZSBleHRlbmRzICdwYXNjYWwnXG4gICAgPyBPYmplY3RUb1Bhc2NhbDxUPlxuICAgIDogTW9kZSBleHRlbmRzICdzbmFrZSdcbiAgICA/IE9iamVjdFRvU25ha2U8VCwgU3BsaXROdW1iZXJzPlxuICAgIDogT2JqZWN0VG9TY3JlYW1pbmdTbmFrZTxULCBTcGxpdE51bWJlcnM+O1xuXG50eXBlIENvbnZlcnRBcnJheUl0ZW08XG4gIFQsXG4gIE1vZGUgZXh0ZW5kcyBDYXNlTW9kZSxcbiAgU3BsaXROdW1iZXJzIGV4dGVuZHMgYm9vbGVhbiA9IHRydWUsXG4+ID0gVCBleHRlbmRzIG9iamVjdFxuICA/IENvbnZlcnQ8VCwgTW9kZSwgU3BsaXROdW1iZXJzPlxuICA6IFQ7XG5cbnR5cGUgQ29udmVydE9iamVjdFZhbHVlPFxuICBULFxuICBNb2RlIGV4dGVuZHMgQ2FzZU1vZGUsXG4gIFNwbGl0TnVtYmVycyBleHRlbmRzIGJvb2xlYW4gPSB0cnVlLFxuPiA9IFQgZXh0ZW5kcyBBcnJheTxpbmZlciBBcnJheVR5cGU+XG4gID8gQXJyYXk8Q29udmVydEFycmF5SXRlbTxBcnJheVR5cGUsIE1vZGUsIFNwbGl0TnVtYmVycz4+XG4gIDogVCBleHRlbmRzIG9iamVjdCB8IHVuZGVmaW5lZCB8IG51bGxcbiAgPyBDb252ZXJ0PFQsIE1vZGUsIFNwbGl0TnVtYmVycz5cbiAgOiBUO1xuXG5mdW5jdGlvbiBpc051bWVyaWNLZXkodGVybTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXi0/XFxkKyg/OlxcLlxcZCspPyQvLnRlc3QodGVybSk7XG59XG5cbnR5cGUgQ2FwaXRhbExldHRlcnMgPVxuICB8ICdBJ1xuICB8ICdCJ1xuICB8ICdDJ1xuICB8ICdEJ1xuICB8ICdFJ1xuICB8ICdGJ1xuICB8ICdHJ1xuICB8ICdIJ1xuICB8ICdJJ1xuICB8ICdKJ1xuICB8ICdLJ1xuICB8ICdMJ1xuICB8ICdNJ1xuICB8ICdOJ1xuICB8ICdPJ1xuICB8ICdQJ1xuICB8ICdRJ1xuICB8ICdSJ1xuICB8ICdTJ1xuICB8ICdUJ1xuICB8ICdVJ1xuICB8ICdWJ1xuICB8ICdXJ1xuICB8ICdYJ1xuICB8ICdZJ1xuICB8ICdaJztcblxudHlwZSBMb3dlcmNhc2VMZXR0ZXJzID1cbiAgfCAnYSdcbiAgfCAnYidcbiAgfCAnYydcbiAgfCAnZCdcbiAgfCAnZSdcbiAgfCAnZidcbiAgfCAnZydcbiAgfCAnaCdcbiAgfCAnaSdcbiAgfCAnaidcbiAgfCAnaydcbiAgfCAnbCdcbiAgfCAnbSdcbiAgfCAnbidcbiAgfCAnbydcbiAgfCAncCdcbiAgfCAncSdcbiAgfCAncidcbiAgfCAncydcbiAgfCAndCdcbiAgfCAndSdcbiAgfCAndidcbiAgfCAndydcbiAgfCAneCdcbiAgfCAneSdcbiAgfCAneic7XG5cbnR5cGUgTnVtYmVycyA9ICcwJyB8ICcxJyB8ICcyJyB8ICczJyB8ICc0JyB8ICc1JyB8ICc2JyB8ICc3JyB8ICc4JyB8ICc5JztcbiJdfQ==
|
|
141
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzZUNvbnZlcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2FzZUNvbnZlcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFxSEEsMEJBRUM7QUFFRCxzQ0FFQztBQUVELDBCQUVDO0FBRUQsc0RBSUM7QUFFRCxzQ0FFQztBQUVELGtFQUlDO0FBRUQsNENBSUM7QUFFRCx3RUFJQztBQUVELHdEQUlDO0FBRUQsb0ZBSUM7QUFFRCw0QkFFQztBQUVELHdDQUVDO0FBL0tELFNBQVMsYUFBYSxDQUNwQixHQUFXLEVBQ1gsWUFBcUM7SUFFckMsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLE9BQU8sR0FBRyxLQUFLLFdBQVcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMxRSxPQUFPLEdBQXlCLENBQUM7SUFDbkMsQ0FBQztJQUVELE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQVksQ0FBQztJQUN0RCxLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBRXpDLGFBQWE7UUFFYixHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDckMsQ0FBQyxDQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBMkIsSUFBZSxFQUFFLEVBQUUsQ0FDbkQsT0FBTyxJQUFJLEtBQUssUUFBUTtnQkFDeEIsQ0FBQyxDQUFDLElBQUksWUFBWSxVQUFVLENBQUM7Z0JBQzdCLENBQUMsQ0FBQyxJQUFJLFlBQVksSUFBSSxDQUFDO2dCQUNyQixDQUFDLENBQUMsYUFBYSxDQVNYLElBQUksRUFBRSxZQUFZLENBQUM7Z0JBQ3ZCLENBQUMsQ0FBQyxJQUFJLENBQ0s7WUFDakIsQ0FBQyxDQUFDLENBQUMsWUFBWSxVQUFVLElBQUksQ0FBQyxZQUFZLElBQUk7Z0JBQzlDLENBQUMsQ0FBQyxDQUFDO2dCQUNILENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRO29CQUN2QixDQUFDLENBQUMsYUFBYSxDQVNYLENBQUMsRUFBRSxZQUFZLENBQUM7b0JBQ3BCLENBQUMsQ0FBRSxDQUFhLENBQUM7SUFDckIsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELGdFQUFnRTtBQUNoRSxTQUFTLFVBQVUsQ0FBQyxJQUFZLEVBQUUsSUFBYyxFQUFFLFlBQVksR0FBRyxLQUFLOztJQUNwRSxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEMsbUVBQW1FO0lBQ25FLElBQUksQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLElBQUksS0FBSyxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzlELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsT0FBTyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBRUQsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNsQixNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQVcsRUFBUSxFQUFFO1FBQ3ZDLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3RCLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdEQsSUFBSSxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDckIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUMxQyxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxJQUFJLEtBQUssUUFBUSxJQUFJLE1BQU0sS0FBSyxFQUFFO2dCQUMxQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ1gsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNwRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsTUFBTSxRQUFRLEdBQUcsTUFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxtQ0FBSSxFQUFFLENBQUM7UUFDdkMsSUFBSSxPQUFPLEtBQUssR0FBRyxJQUFJLE9BQU8sS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUN2QyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEIsU0FBUyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDeEIsQ0FBQzthQUFNLElBQUksWUFBWSxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzVDLElBQUksV0FBVyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7WUFDNUIsT0FBTyxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDL0QsV0FBVyxJQUFJLENBQUMsQ0FBQztZQUNuQixDQUFDO1lBQ0QsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDO2dCQUNyQixDQUFDLENBQUMsV0FBVyxDQUFDLE1BQUEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQ0FBSSxFQUFFLENBQUMsSUFBSSxXQUFXLENBQUMsTUFBQSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxtQ0FBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hGLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbEIsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUNwQixDQUFDO1lBQ0QsS0FBSyxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDMUIsQ0FBQzthQUFNLElBQUksS0FBSyxHQUFHLFNBQVMsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDO1lBQ2hELENBQUMsQ0FBQyxhQUFhLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUM7Z0JBQzNELENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxNQUFBLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLG1DQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JFLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNsQixTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0lBQ0QsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsU0FBaUI7SUFDcEMsT0FBTyxTQUFTLElBQUksR0FBRyxJQUFJLFNBQVMsSUFBSSxHQUFHLENBQUM7QUFDOUMsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLFNBQWlCO0lBQ3BDLE9BQU8sU0FBUyxJQUFJLEdBQUcsSUFBSSxTQUFTLElBQUksR0FBRyxDQUFDO0FBQzlDLENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FBQyxTQUFpQjtJQUNoQyxPQUFPLFNBQVMsSUFBSSxHQUFHLElBQUksU0FBUyxJQUFJLEdBQUcsQ0FBQztBQUM5QyxDQUFDO0FBRUQsU0FBZ0IsT0FBTyxDQUFtQixJQUFPO0lBQy9DLE9BQU8sVUFBVSxDQUFDLElBQUksRUFBRSxPQUFPLENBQWUsQ0FBQztBQUNqRCxDQUFDO0FBRUQsU0FBZ0IsYUFBYSxDQUFtQixHQUFNO0lBQ3BELE9BQU8sYUFBYSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNyQyxDQUFDO0FBRUQsU0FBZ0IsT0FBTyxDQUFtQixJQUFPO0lBQy9DLE9BQU8sVUFBVSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFlLENBQUM7QUFDdkQsQ0FBQztBQUVELFNBQWdCLHFCQUFxQixDQUNuQyxJQUFPO0lBRVAsT0FBTyxVQUFVLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQXNCLENBQUM7QUFDL0QsQ0FBQztBQUVELFNBQWdCLGFBQWEsQ0FBbUIsR0FBTTtJQUNwRCxPQUFPLGFBQWEsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUVELFNBQWdCLDJCQUEyQixDQUN6QyxHQUFNO0lBRU4sT0FBTyxhQUFhLENBQUMsR0FBRyxFQUFFLHFCQUFxQixDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUVELFNBQWdCLGdCQUFnQixDQUM5QixJQUFPO0lBRVAsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUF5QixDQUFDO0FBQzVELENBQUM7QUFFRCxTQUFnQiw4QkFBOEIsQ0FDNUMsSUFBTztJQUVQLE9BQU8scUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFnQyxDQUFDO0FBQ2pGLENBQUM7QUFFRCxTQUFnQixzQkFBc0IsQ0FDcEMsR0FBTTtJQUVOLE9BQU8sYUFBYSxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0FBQzlDLENBQUM7QUFFRCxTQUFnQixvQ0FBb0MsQ0FDbEQsR0FBTTtJQUVOLE9BQU8sYUFBYSxDQUFDLEdBQUcsRUFBRSw4QkFBOEIsQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFFRCxTQUFnQixRQUFRLENBQW1CLElBQU87SUFDaEQsT0FBTyxVQUFVLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBZ0IsQ0FBQztBQUNuRCxDQUFDO0FBRUQsU0FBZ0IsY0FBYyxDQUFtQixHQUFNO0lBQ3JELE9BQU8sYUFBYSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUN0QyxDQUFDO0FBNk9ELFNBQVMsWUFBWSxDQUFDLElBQVk7SUFDaEMsT0FBTyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIGNvbnZlcnRPYmplY3Q8VElucHV0IGV4dGVuZHMgb2JqZWN0LCBUUmVzdWx0PihcbiAgb2JqOiBUSW5wdXQsXG4gIGtleUNvbnZlcnRlcjogKGFyZzogc3RyaW5nKSA9PiBzdHJpbmcsXG4pOiBUUmVzdWx0IHtcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBvYmogYXMgdW5rbm93biBhcyBUUmVzdWx0O1xuICB9XG5cbiAgY29uc3Qgb3V0ID0gKEFycmF5LmlzQXJyYXkob2JqKSA/IFtdIDoge30pIGFzIFRSZXN1bHQ7XG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcblxuICAgIC8vIEB0cy1pZ25vcmVcblxuICAgIG91dFtrZXlDb252ZXJ0ZXIoayldID0gQXJyYXkuaXNBcnJheSh2KVxuICAgICAgPyAodi5tYXAoPEFycmF5SXRlbSBleHRlbmRzIG9iamVjdD4oaXRlbTogQXJyYXlJdGVtKSA9PlxuICAgICAgICAgIHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICEoaXRlbSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpICYmXG4gICAgICAgICAgIShpdGVtIGluc3RhbmNlb2YgRGF0ZSlcbiAgICAgICAgICAgID8gY29udmVydE9iamVjdDxcbiAgICAgICAgICAgICAgICBBcnJheUl0ZW0sXG4gICAgICAgICAgICAgICAgVFJlc3VsdCBleHRlbmRzIE9iamVjdFRvQ2FtZWw8VElucHV0PlxuICAgICAgICAgICAgICAgICAgPyBPYmplY3RUb0NhbWVsPEFycmF5SXRlbT5cbiAgICAgICAgICAgICAgICAgIDogVFJlc3VsdCBleHRlbmRzIE9iamVjdFRvUGFzY2FsPFRJbnB1dD5cbiAgICAgICAgICAgICAgICAgID8gT2JqZWN0VG9QYXNjYWw8QXJyYXlJdGVtPlxuICAgICAgICAgICAgICAgICAgOiBUUmVzdWx0IGV4dGVuZHMgT2JqZWN0VG9TY3JlYW1pbmdTbmFrZTxUSW5wdXQ+XG4gICAgICAgICAgICAgICAgICA/IE9iamVjdFRvU2NyZWFtaW5nU25ha2U8QXJyYXlJdGVtPlxuICAgICAgICAgICAgICAgICAgOiBPYmplY3RUb1NuYWtlPEFycmF5SXRlbT5cbiAgICAgICAgICAgICAgPihpdGVtLCBrZXlDb252ZXJ0ZXIpXG4gICAgICAgICAgICA6IGl0ZW0sXG4gICAgICAgICkgYXMgdW5rbm93bltdKVxuICAgICAgOiB2IGluc3RhbmNlb2YgVWludDhBcnJheSB8fCB2IGluc3RhbmNlb2YgRGF0ZVxuICAgICAgPyB2XG4gICAgICA6IHR5cGVvZiB2ID09PSAnb2JqZWN0J1xuICAgICAgPyBjb252ZXJ0T2JqZWN0PFxuICAgICAgICAgIHR5cGVvZiB2LFxuICAgICAgICAgIFRSZXN1bHQgZXh0ZW5kcyBPYmplY3RUb0NhbWVsPFRJbnB1dD5cbiAgICAgICAgICAgID8gT2JqZWN0VG9DYW1lbDx0eXBlb2Ygdj5cbiAgICAgICAgICAgIDogVFJlc3VsdCBleHRlbmRzIE9iamVjdFRvUGFzY2FsPFRJbnB1dD5cbiAgICAgICAgICAgID8gT2JqZWN0VG9QYXNjYWw8dHlwZW9mIHY+XG4gICAgICAgICAgICA6IFRSZXN1bHQgZXh0ZW5kcyBPYmplY3RUb1NjcmVhbWluZ1NuYWtlPFRJbnB1dD5cbiAgICAgICAgICAgID8gT2JqZWN0VG9TY3JlYW1pbmdTbmFrZTx0eXBlb2Ygdj5cbiAgICAgICAgICAgIDogT2JqZWN0VG9TbmFrZTx0eXBlb2Ygdj5cbiAgICAgICAgPih2LCBrZXlDb252ZXJ0ZXIpXG4gICAgICA6ICh2IGFzIHVua25vd24pO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8vIEtlZXAgdGhlc2Ugd29yZCBib3VuZGFyaWVzIGluIHN5bmMgd2l0aCBDb252ZXJ0S2V5U2NhbiBiZWxvdy5cbmZ1bmN0aW9uIGNvbnZlcnRLZXkodGVybTogc3RyaW5nLCBtb2RlOiBDYXNlTW9kZSwgc3BsaXROdW1iZXJzID0gZmFsc2UpOiBzdHJpbmcge1xuICBpZiAoaXNOdW1lcmljS2V5KHRlcm0pKSB7XG4gICAgcmV0dXJuIHRlcm07XG4gIH1cblxuICBjb25zdCBoYXNTZXBhcmF0b3JzID0gL1tfLV0vLnRlc3QodGVybSk7XG4gIC8vIEV4aXN0aW5nIGNhbWVsL1Bhc2NhbCBuYW1lcyByZXRhaW4gZXZlcnkgbGV0dGVyIGFmdGVyIHRoZSBmaXJzdC5cbiAgaWYgKChtb2RlID09PSAnY2FtZWwnIHx8IG1vZGUgPT09ICdwYXNjYWwnKSAmJiAhaGFzU2VwYXJhdG9ycykge1xuICAgIGNvbnN0IGZpcnN0ID0gdGVybS5jaGFyQXQoMCk7XG4gICAgcmV0dXJuIChtb2RlID09PSAnY2FtZWwnID8gZmlyc3QudG9Mb3dlckNhc2UoKSA6IGZpcnN0LnRvVXBwZXJDYXNlKCkpICsgdGVybS5zbGljZSgxKTtcbiAgfVxuXG4gIGxldCByZXN1bHQgPSAnJztcbiAgbGV0IHdvcmRTdGFydCA9IDA7XG4gIGNvbnN0IGFwcGVuZFdvcmQgPSAoZW5kOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICBpZiAoZW5kID09PSB3b3JkU3RhcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgd29yZCA9IHRlcm0uc2xpY2Uod29yZFN0YXJ0LCBlbmQpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKG1vZGUgPT09ICdzbmFrZScpIHtcbiAgICAgIHJlc3VsdCArPSBgJHtyZXN1bHQgPyAnXycgOiAnJ30ke3dvcmR9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ICs9IG1vZGUgPT09ICdwYXNjYWwnIHx8IHJlc3VsdCAhPT0gJydcbiAgICAgICAgPyB3b3JkWzBdLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpXG4gICAgICAgIDogd29yZDtcbiAgICB9XG4gIH07XG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRlcm0ubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3QgY3VycmVudCA9IHRlcm1baW5kZXhdO1xuICAgIGNvbnN0IHByZXZpb3VzID0gdGVybVtpbmRleCAtIDFdID8/ICcnO1xuICAgIGlmIChjdXJyZW50ID09PSAnXycgfHwgY3VycmVudCA9PT0gJy0nKSB7XG4gICAgICBhcHBlbmRXb3JkKGluZGV4KTtcbiAgICAgIHdvcmRTdGFydCA9IGluZGV4ICsgMTtcbiAgICB9IGVsc2UgaWYgKHNwbGl0TnVtYmVycyAmJiBpc0RpZ2l0KGN1cnJlbnQpKSB7XG4gICAgICBsZXQgYWZ0ZXJOdW1iZXIgPSBpbmRleCArIDE7XG4gICAgICB3aGlsZSAoYWZ0ZXJOdW1iZXIgPCB0ZXJtLmxlbmd0aCAmJiBpc0RpZ2l0KHRlcm1bYWZ0ZXJOdW1iZXJdKSkge1xuICAgICAgICBhZnRlck51bWJlciArPSAxO1xuICAgICAgfVxuICAgICAgaWYgKGlzTG93ZXJjYXNlKHByZXZpb3VzKSAmJlxuICAgICAgICAgICEoaXNVcHBlcmNhc2UodGVybVthZnRlck51bWJlcl0gPz8gJycpICYmIGlzTG93ZXJjYXNlKHRlcm1bYWZ0ZXJOdW1iZXIgKyAxXSA/PyAnJykpKSB7XG4gICAgICAgIGFwcGVuZFdvcmQoaW5kZXgpO1xuICAgICAgICB3b3JkU3RhcnQgPSBpbmRleDtcbiAgICAgIH1cbiAgICAgIGluZGV4ID0gYWZ0ZXJOdW1iZXIgLSAxO1xuICAgIH0gZWxzZSBpZiAoaW5kZXggPiB3b3JkU3RhcnQgJiYgaXNVcHBlcmNhc2UoY3VycmVudCkgJiZcbiAgICAgICAgKCFoYXNTZXBhcmF0b3JzIHx8IGlzTG93ZXJjYXNlKHByZXZpb3VzKSB8fCBpc0RpZ2l0KHByZXZpb3VzKSB8fFxuICAgICAgICAgIChpc1VwcGVyY2FzZShwcmV2aW91cykgJiYgaXNMb3dlcmNhc2UodGVybVtpbmRleCArIDFdID8/ICcnKSkpKSB7XG4gICAgICBhcHBlbmRXb3JkKGluZGV4KTtcbiAgICAgIHdvcmRTdGFydCA9IGluZGV4O1xuICAgIH1cbiAgfVxuICBhcHBlbmRXb3JkKHRlcm0ubGVuZ3RoKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gaXNMb3dlcmNhc2UoY2hhcmFjdGVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNoYXJhY3RlciA+PSAnYScgJiYgY2hhcmFjdGVyIDw9ICd6Jztcbn1cblxuZnVuY3Rpb24gaXNVcHBlcmNhc2UoY2hhcmFjdGVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNoYXJhY3RlciA+PSAnQScgJiYgY2hhcmFjdGVyIDw9ICdaJztcbn1cblxuZnVuY3Rpb24gaXNEaWdpdChjaGFyYWN0ZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2hhcmFjdGVyID49ICcwJyAmJiBjaGFyYWN0ZXIgPD0gJzknO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9DYW1lbDxUIGV4dGVuZHMgc3RyaW5nPih0ZXJtOiBUKTogVG9DYW1lbDxUPiB7XG4gIHJldHVybiBjb252ZXJ0S2V5KHRlcm0sICdjYW1lbCcpIGFzIFRvQ2FtZWw8VD47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RUb0NhbWVsPFQgZXh0ZW5kcyBvYmplY3Q+KG9iajogVCk6IE9iamVjdFRvQ2FtZWw8VD4ge1xuICByZXR1cm4gY29udmVydE9iamVjdChvYmosIHRvQ2FtZWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9TbmFrZTxUIGV4dGVuZHMgc3RyaW5nPih0ZXJtOiBUKTogVG9TbmFrZTxUPiB7XG4gIHJldHVybiBjb252ZXJ0S2V5KHRlcm0sICdzbmFrZScsIHRydWUpIGFzIFRvU25ha2U8VD47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1NuYWtlTm9TcGxpdE51bWJlcnM8VCBleHRlbmRzIHN0cmluZz4oXG4gIHRlcm06IFQsXG4pOiBUb1NuYWtlPFQsIGZhbHNlPiB7XG4gIHJldHVybiBjb252ZXJ0S2V5KHRlcm0sICdzbmFrZScsIGZhbHNlKSBhcyBUb1NuYWtlPFQsIGZhbHNlPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdFRvU25ha2U8VCBleHRlbmRzIG9iamVjdD4ob2JqOiBUKTogT2JqZWN0VG9TbmFrZTxUPiB7XG4gIHJldHVybiBjb252ZXJ0T2JqZWN0KG9iaiwgdG9TbmFrZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RUb1NuYWtlTm9TcGxpdE51bWJlcnM8VCBleHRlbmRzIG9iamVjdD4oXG4gIG9iajogVCxcbik6IE9iamVjdFRvU25ha2U8VCwgZmFsc2U+IHtcbiAgcmV0dXJuIGNvbnZlcnRPYmplY3Qob2JqLCB0b1NuYWtlTm9TcGxpdE51bWJlcnMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9TY3JlYW1pbmdTbmFrZTxUIGV4dGVuZHMgc3RyaW5nPihcbiAgdGVybTogVCxcbik6IFRvU2NyZWFtaW5nU25ha2U8VD4ge1xuICByZXR1cm4gdG9TbmFrZSh0ZXJtKS50b1VwcGVyQ2FzZSgpIGFzIFRvU2NyZWFtaW5nU25ha2U8VD47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1NjcmVhbWluZ1NuYWtlTm9TcGxpdE51bWJlcnM8VCBleHRlbmRzIHN0cmluZz4oXG4gIHRlcm06IFQsXG4pOiBUb1NjcmVhbWluZ1NuYWtlPFQsIGZhbHNlPiB7XG4gIHJldHVybiB0b1NuYWtlTm9TcGxpdE51bWJlcnModGVybSkudG9VcHBlckNhc2UoKSBhcyBUb1NjcmVhbWluZ1NuYWtlPFQsIGZhbHNlPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdFRvU2NyZWFtaW5nU25ha2U8VCBleHRlbmRzIG9iamVjdD4oXG4gIG9iajogVCxcbik6IE9iamVjdFRvU2NyZWFtaW5nU25ha2U8VD4ge1xuICByZXR1cm4gY29udmVydE9iamVjdChvYmosIHRvU2NyZWFtaW5nU25ha2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0VG9TY3JlYW1pbmdTbmFrZU5vU3BsaXROdW1iZXJzPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICBvYmo6IFQsXG4pOiBPYmplY3RUb1NjcmVhbWluZ1NuYWtlPFQsIGZhbHNlPiB7XG4gIHJldHVybiBjb252ZXJ0T2JqZWN0KG9iaiwgdG9TY3JlYW1pbmdTbmFrZU5vU3BsaXROdW1iZXJzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvUGFzY2FsPFQgZXh0ZW5kcyBzdHJpbmc+KHRlcm06IFQpOiBUb1Bhc2NhbDxUPiB7XG4gIHJldHVybiBjb252ZXJ0S2V5KHRlcm0sICdwYXNjYWwnKSBhcyBUb1Bhc2NhbDxUPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdFRvUGFzY2FsPFQgZXh0ZW5kcyBvYmplY3Q+KG9iajogVCk6IE9iamVjdFRvUGFzY2FsPFQ+IHtcbiAgcmV0dXJuIGNvbnZlcnRPYmplY3Qob2JqLCB0b1Bhc2NhbCk7XG59XG5cbmV4cG9ydCB0eXBlIFRvQ2FtZWw8UyBleHRlbmRzIHN0cmluZyB8IG51bWJlciB8IHN5bWJvbD4gPVxuICBDb252ZXJ0S2V5PFMsICdjYW1lbCcsIGZhbHNlPjtcblxuZXhwb3J0IHR5cGUgT2JqZWN0VG9DYW1lbDxUIGV4dGVuZHMgb2JqZWN0IHwgdW5kZWZpbmVkIHwgbnVsbD4gPVxuICBUIGV4dGVuZHMgdW5kZWZpbmVkXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IFQgZXh0ZW5kcyBudWxsXG4gICAgPyBudWxsXG4gICAgOiBUIGV4dGVuZHMgQXJyYXk8aW5mZXIgQXJyYXlUeXBlPlxuICAgID8gQXJyYXk8Q29udmVydEFycmF5SXRlbTxBcnJheVR5cGUsICdjYW1lbCc+PlxuICAgIDogVCBleHRlbmRzIFVpbnQ4QXJyYXlcbiAgICA/IFVpbnQ4QXJyYXlcbiAgICA6IFQgZXh0ZW5kcyBEYXRlXG4gICAgPyBEYXRlXG4gICAgOiB7XG4gICAgICAgIFtLIGluIGtleW9mIFQgYXMgVG9DYW1lbDxLPl06IENvbnZlcnRPYmplY3RWYWx1ZTxUW0tdLCAnY2FtZWwnPjtcbiAgICAgIH07XG5cbmV4cG9ydCB0eXBlIFRvUGFzY2FsPFMgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2w+ID1cbiAgQ29udmVydEtleTxTLCAncGFzY2FsJywgZmFsc2U+O1xuXG5leHBvcnQgdHlwZSBPYmplY3RUb1Bhc2NhbDxUIGV4dGVuZHMgb2JqZWN0IHwgdW5kZWZpbmVkIHwgbnVsbD4gPVxuICBUIGV4dGVuZHMgdW5kZWZpbmVkXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IFQgZXh0ZW5kcyBudWxsXG4gICAgPyBudWxsXG4gICAgOiBUIGV4dGVuZHMgQXJyYXk8aW5mZXIgQXJyYXlUeXBlPlxuICAgID8gQXJyYXk8Q29udmVydEFycmF5SXRlbTxBcnJheVR5cGUsICdwYXNjYWwnPj5cbiAgICA6IFQgZXh0ZW5kcyBVaW50OEFycmF5XG4gICAgPyBVaW50OEFycmF5XG4gICAgOiBUIGV4dGVuZHMgRGF0ZVxuICAgID8gRGF0ZVxuICAgIDoge1xuICAgICAgICBbSyBpbiBrZXlvZiBUIGFzIFRvUGFzY2FsPEs+XTogQ29udmVydE9iamVjdFZhbHVlPFRbS10sICdwYXNjYWwnPjtcbiAgICAgIH07XG5cbmV4cG9ydCB0eXBlIFRvU25ha2U8XG4gIFMgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsXG4gIFNwbGl0TnVtYmVycyBleHRlbmRzIGJvb2xlYW4gPSB0cnVlLFxuPiA9IENvbnZlcnRLZXk8UywgJ3NuYWtlJywgU3BsaXROdW1iZXJzPjtcblxuZXhwb3J0IHR5cGUgT2JqZWN0VG9TbmFrZTxcbiAgVCBleHRlbmRzIG9iamVjdCB8IHVuZGVmaW5lZCB8IG51bGwsXG4gIFNwbGl0TnVtYmVycyBleHRlbmRzIGJvb2xlYW4gPSB0cnVlLFxuPiA9XG4gIFQgZXh0ZW5kcyB1bmRlZmluZWRcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogVCBleHRlbmRzIG51bGxcbiAgICA/IG51bGxcbiAgICA6IFQgZXh0ZW5kcyBBcnJheTxpbmZlciBBcnJheVR5cGU+XG4gICAgPyBBcnJheTxDb252ZXJ0QXJyYXlJdGVtPEFycmF5VHlwZSwgJ3NuYWtlJywgU3BsaXROdW1iZXJzPj5cbiAgICA6IFQgZXh0ZW5kcyBVaW50OEFycmF5XG4gICAgPyBVaW50OEFycmF5XG4gICAgOiBUIGV4dGVuZHMgRGF0ZVxuICAgID8gRGF0ZVxuICAgIDoge1xuICAgICAgICBbSyBpbiBrZXlvZiBUIGFzIFRvU25ha2U8SywgU3BsaXROdW1iZXJzPl06IENvbnZlcnRPYmplY3RWYWx1ZTxcbiAgICAgICAgICBUW0tdLFxuICAgICAgICAgICdzbmFrZScsXG4gICAgICAgICAgU3BsaXROdW1iZXJzXG4gICAgICAgID47XG4gICAgICB9O1xuXG5leHBvcnQgdHlwZSBUb1NjcmVhbWluZ1NuYWtlPFxuICBTIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sLFxuICBTcGxpdE51bWJlcnMgZXh0ZW5kcyBib29sZWFuID0gdHJ1ZSxcbj4gPSBVcHBlcmNhc2U8VG9TbmFrZTxTLCBTcGxpdE51bWJlcnM+PjtcblxuZXhwb3J0IHR5cGUgT2JqZWN0VG9TY3JlYW1pbmdTbmFrZTxcbiAgVCBleHRlbmRzIG9iamVjdCB8IHVuZGVmaW5lZCB8IG51bGwsXG4gIFNwbGl0TnVtYmVycyBleHRlbmRzIGJvb2xlYW4gPSB0cnVlLFxuPiA9XG4gIFQgZXh0ZW5kcyB1bmRlZmluZWRcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogVCBleHRlbmRzIG51bGxcbiAgICA/IG51bGxcbiAgICA6IFQgZXh0ZW5kcyBBcnJheTxpbmZlciBBcnJheVR5cGU+XG4gICAgPyBBcnJheTxDb252ZXJ0QXJyYXlJdGVtPEFycmF5VHlwZSwgJ3NjcmVhbWluZ1NuYWtlJywgU3BsaXROdW1iZXJzPj5cbiAgICA6IFQgZXh0ZW5kcyBVaW50OEFycmF5XG4gICAgPyBVaW50OEFycmF5XG4gICAgOiBUIGV4dGVuZHMgRGF0ZVxuICAgID8gRGF0ZVxuICAgIDoge1xuICAgICAgICBbSyBpbiBrZXlvZiBUIGFzIFRvU2NyZWFtaW5nU25ha2U8SywgU3BsaXROdW1iZXJzPl06IENvbnZlcnRPYmplY3RWYWx1ZTxcbiAgICAgICAgICBUW0tdLFxuICAgICAgICAgICdzY3JlYW1pbmdTbmFrZScsXG4gICAgICAgICAgU3BsaXROdW1iZXJzXG4gICAgICAgID47XG4gICAgICB9O1xuXG50eXBlIENhc2VNb2RlID0gJ2NhbWVsJyB8ICdwYXNjYWwnIHwgJ3NuYWtlJyB8ICdzY3JlYW1pbmdTbmFrZSc7XG5cbnR5cGUgQ29udmVydEtleTxcbiAgUyBleHRlbmRzIHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCxcbiAgTW9kZSBleHRlbmRzIENhc2VNb2RlLFxuICBTcGxpdE51bWJlcnMgZXh0ZW5kcyBib29sZWFuLFxuPiA9IFMgZXh0ZW5kcyBudW1iZXJcbiAgPyBDb252ZXJ0S2V5PGAke1N9YCwgTW9kZSwgU3BsaXROdW1iZXJzPlxuICA6IFMgZXh0ZW5kcyBzdHJpbmdcbiAgPyBzdHJpbmcgZXh0ZW5kcyBTXG4gICAgPyBzdHJpbmdcbiAgICA6IElzTnVtZXJpY0tleTxTPiBleHRlbmRzIHRydWVcbiAgICA/IFNcbiAgICA6IFMgZXh0ZW5kcyBgJHtzdHJpbmd9JHsnXycgfCAnLSd9JHtzdHJpbmd9YFxuICAgID8gQ29udmVydEtleVNjYW48UywgTW9kZSwgU3BsaXROdW1iZXJzPlxuICAgIDogTW9kZSBleHRlbmRzICdjYW1lbCdcbiAgICA/IFVuY2FwaXRhbGl6ZTxTPlxuICAgIDogTW9kZSBleHRlbmRzICdwYXNjYWwnXG4gICAgPyBDYXBpdGFsaXplPFM+XG4gICAgOiBDb252ZXJ0S2V5U2NhbjxTLCBNb2RlLCBTcGxpdE51bWJlcnMsIHRydWU+XG4gIDogbmV2ZXI7XG5cbi8vIFNpZ25lZCBkZWNpbWFsIHN0cmluZ3MgdXNlIHRoZSBzYW1lIGdyYW1tYXIgYXMgaXNOdW1lcmljS2V5IGF0IHJ1bnRpbWUuXG50eXBlIElzTnVtZXJpY0tleTxTIGV4dGVuZHMgc3RyaW5nPiA9IFMgZXh0ZW5kcyBgLSR7aW5mZXIgVW5zaWduZWR9YFxuICA/IElzRGVjaW1hbDxVbnNpZ25lZD5cbiAgOiBJc0RlY2ltYWw8Uz47XG5cbnR5cGUgSXNEZWNpbWFsPFMgZXh0ZW5kcyBzdHJpbmc+ID0gUyBleHRlbmRzIGAke2luZmVyIFdob2xlfS4ke2luZmVyIEZyYWN0aW9ufWBcbiAgPyBJc0RpZ2l0czxXaG9sZT4gZXh0ZW5kcyB0cnVlXG4gICAgPyBJc0RpZ2l0czxGcmFjdGlvbj5cbiAgICA6IGZhbHNlXG4gIDogSXNEaWdpdHM8Uz47XG5cbnR5cGUgSXNEaWdpdHM8UyBleHRlbmRzIHN0cmluZz4gPSBTIGV4dGVuZHMgJydcbiAgPyBmYWxzZVxuICA6IFRha2VOdW1iZXJSdW48Uz4gZXh0ZW5kcyBbc3RyaW5nLCAnJ10gPyB0cnVlIDogZmFsc2U7XG5cbnR5cGUgQXBwZW5kV29yZDxcbiAgQWNjIGV4dGVuZHMgc3RyaW5nLFxuICBXb3JkIGV4dGVuZHMgc3RyaW5nLFxuICBNb2RlIGV4dGVuZHMgQ2FzZU1vZGUsXG4+ID0gV29yZCBleHRlbmRzICcnXG4gID8gQWNjXG4gIDogTW9kZSBleHRlbmRzICdzbmFrZSdcbiAgPyBBY2MgZXh0ZW5kcyAnJyA/IExvd2VyY2FzZTxXb3JkPiA6IGAke0FjY31fJHtMb3dlcmNhc2U8V29yZD59YFxuICA6IE1vZGUgZXh0ZW5kcyAncGFzY2FsJ1xuICA/IGAke0FjY30ke0NhcGl0YWxpemU8TG93ZXJjYXNlPFdvcmQ+Pn1gXG4gIDogQWNjIGV4dGVuZHMgJycgPyBMb3dlcmNhc2U8V29yZD4gOiBgJHtBY2N9JHtDYXBpdGFsaXplPExvd2VyY2FzZTxXb3JkPj59YDtcblxudHlwZSBDb252ZXJ0S2V5U2NhbjxcbiAgUyBleHRlbmRzIHN0cmluZyxcbiAgTW9kZSBleHRlbmRzIENhc2VNb2RlLFxuICBTcGxpdE51bWJlcnMgZXh0ZW5kcyBib29sZWFuLFxuICBTZXBhcmF0ZUNhcGl0YWxzIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuICBBY2MgZXh0ZW5kcyBzdHJpbmcgPSAnJyxcbiAgV29yZCBleHRlbmRzIHN0cmluZyA9ICcnLFxuICBQcmV2aW91cyBleHRlbmRzIHN0cmluZyA9ICcnLFxuPiA9IHN0cmluZyBleHRlbmRzIFNcbiAgPyBzdHJpbmdcbiAgOiBTIGV4dGVuZHMgYCR7aW5mZXIgSGVhZH0ke2luZmVyIFRhaWx9YFxuICA/IHN0cmluZyBleHRlbmRzIEhlYWRcbiAgICA/IHN0cmluZ1xuICAgIDogSGVhZCBleHRlbmRzICdfJyB8ICctJ1xuICAgID8gQ29udmVydEtleVNjYW48VGFpbCwgTW9kZSwgU3BsaXROdW1iZXJzLCBTZXBhcmF0ZUNhcGl0YWxzLCBBcHBlbmRXb3JkPEFjYywgV29yZCwgTW9kZT4+XG4gICAgOiBIZWFkIGV4dGVuZHMgTnVtYmVyc1xuICAgID8gVGFrZU51bWJlclJ1bjxTPiBleHRlbmRzIFtpbmZlciBEaWdpdHMgZXh0ZW5kcyBzdHJpbmcsIGluZmVyIEFmdGVyIGV4dGVuZHMgc3RyaW5nXVxuICAgICAgPyBTcGxpdE51bWJlcjxQcmV2aW91cywgQWZ0ZXIsIFNwbGl0TnVtYmVycz4gZXh0ZW5kcyB0cnVlXG4gICAgICAgID8gQ29udmVydEtleVNjYW48QWZ0ZXIsIE1vZGUsIFNwbGl0TnVtYmVycywgU2VwYXJhdGVDYXBpdGFscywgQXBwZW5kV29yZDxBY2MsIFdvcmQsIE1vZGU+LCBEaWdpdHMsICcwJz5cbiAgICAgICAgOiBDb252ZXJ0S2V5U2NhbjxBZnRlciwgTW9kZSwgU3BsaXROdW1iZXJzLCBTZXBhcmF0ZUNhcGl0YWxzLCBBY2MsIGAke1dvcmR9JHtEaWdpdHN9YCwgJzAnPlxuICAgICAgOiBuZXZlclxuICAgIDogSGVhZCBleHRlbmRzIENhcGl0YWxMZXR0ZXJzXG4gICAgPyBTdGFydHNXb3JkPFByZXZpb3VzLCBUYWlsLCBTZXBhcmF0ZUNhcGl0YWxzPiBleHRlbmRzIHRydWVcbiAgICAgID8gQ29udmVydEtleVNjYW48VGFpbCwgTW9kZSwgU3BsaXROdW1iZXJzLCBTZXBhcmF0ZUNhcGl0YWxzLCBBcHBlbmRXb3JkPEFjYywgV29yZCwgTW9kZT4sIEhlYWQsIEhlYWQ+XG4gICAgICA6IENvbnZlcnRLZXlTY2FuPFRhaWwsIE1vZGUsIFNwbGl0TnVtYmVycywgU2VwYXJhdGVDYXBpdGFscywgQWNjLCBgJHtXb3JkfSR7SGVhZH1gLCBIZWFkPlxuICAgIDogSGVhZCBleHRlbmRzIExvd2VyY2FzZUxldHRlcnNcbiAgICA/IENvbnZlcnRLZXlTY2FuPFRhaWwsIE1vZGUsIFNwbGl0TnVtYmVycywgU2VwYXJhdGVDYXBpdGFscywgQWNjLCBgJHtXb3JkfSR7SGVhZH1gLCBIZWFkPlxuICAgIDogRXh0cmFjdDxDYXBpdGFsTGV0dGVycyB8IExvd2VyY2FzZUxldHRlcnMgfCBOdW1iZXJzIHwgJ18nIHwgJy0nLCBIZWFkPiBleHRlbmRzIG5ldmVyXG4gICAgPyBDb252ZXJ0S2V5U2NhbjxUYWlsLCBNb2RlLCBTcGxpdE51bWJlcnMsIFNlcGFyYXRlQ2FwaXRhbHMsIEFjYywgYCR7V29yZH0ke0hlYWR9YCwgSGVhZD5cbiAgICA6IHN0cmluZ1xuICA6IFMgZXh0ZW5kcyAnJyA/IEFwcGVuZFdvcmQ8QWNjLCBXb3JkLCBNb2RlPiA6IHN0cmluZztcblxudHlwZSBTdGFydHNXb3JkPFxuICBQcmV2aW91cyBleHRlbmRzIHN0cmluZyxcbiAgVGFpbCBleHRlbmRzIHN0cmluZyxcbiAgU2VwYXJhdGVDYXBpdGFscyBleHRlbmRzIGJvb2xlYW4sXG4+ID0gU2VwYXJhdGVDYXBpdGFscyBleHRlbmRzIHRydWVcbiAgPyB0cnVlXG4gIDogUHJldmlvdXMgZXh0ZW5kcyBMb3dlcmNhc2VMZXR0ZXJzIHwgTnVtYmVyc1xuICAgID8gdHJ1ZVxuICAgIDogUHJldmlvdXMgZXh0ZW5kcyBDYXBpdGFsTGV0dGVyc1xuICAgID8gVGFpbCBleHRlbmRzIGAke0xvd2VyY2FzZUxldHRlcnN9JHtzdHJpbmd9YCA/IHRydWUgOiBmYWxzZVxuICAgIDogZmFsc2U7XG5cbnR5cGUgVGFrZU51bWJlclJ1bjxcbiAgUyBleHRlbmRzIHN0cmluZyxcbiAgQWNjIGV4dGVuZHMgc3RyaW5nID0gJycsXG4+ID0gUyBleHRlbmRzIGAke2luZmVyIEhlYWR9JHtpbmZlciBUYWlsfWBcbiAgPyBIZWFkIGV4dGVuZHMgTnVtYmVyc1xuICAgID8gVGFrZU51bWJlclJ1bjxUYWlsLCBgJHtBY2N9JHtIZWFkfWA+XG4gICAgOiBbQWNjLCBTXVxuICA6IFtBY2MsICcnXTtcblxudHlwZSBTcGxpdE51bWJlcjxcbiAgUHJldmlvdXMgZXh0ZW5kcyBzdHJpbmcsXG4gIEFmdGVyTnVtYmVyIGV4dGVuZHMgc3RyaW5nLFxuICBTcGxpdE51bWJlcnMgZXh0ZW5kcyBib29sZWFuLFxuPiA9IFNwbGl0TnVtYmVycyBleHRlbmRzIGZhbHNlXG4gID8gZmFsc2VcbiAgOiBQcmV2aW91cyBleHRlbmRzIExvd2VyY2FzZUxldHRlcnNcbiAgPyBBZnRlck51bWJlciBleHRlbmRzIGAke0NhcGl0YWxMZXR0ZXJzfSR7TG93ZXJjYXNlTGV0dGVyc30ke3N0cmluZ31gXG4gICAgPyBmYWxzZVxuICAgIDogdHJ1ZVxuICA6IGZhbHNlO1xuXG50eXBlIENvbnZlcnQ8XG4gIFQgZXh0ZW5kcyBvYmplY3QgfCB1bmRlZmluZWQgfCBudWxsLFxuICBNb2RlIGV4dGVuZHMgQ2FzZU1vZGUsXG4gIFNwbGl0TnVtYmVycyBleHRlbmRzIGJvb2xlYW4sXG4+ID1cbiAgTW9kZSBleHRlbmRzICdjYW1lbCdcbiAgICA/IE9iamVjdFRvQ2FtZWw8VD5cbiAgICA6IE1vZGUgZXh0ZW5kcyAncGFzY2FsJ1xuICAgID8gT2JqZWN0VG9QYXNjYWw8VD5cbiAgICA6IE1vZGUgZXh0ZW5kcyAnc25ha2UnXG4gICAgPyBPYmplY3RUb1NuYWtlPFQsIFNwbGl0TnVtYmVycz5cbiAgICA6IE9iamVjdFRvU2NyZWFtaW5nU25ha2U8VCwgU3BsaXROdW1iZXJzPjtcblxudHlwZSBDb252ZXJ0QXJyYXlJdGVtPFxuICBULFxuICBNb2RlIGV4dGVuZHMgQ2FzZU1vZGUsXG4gIFNwbGl0TnVtYmVycyBleHRlbmRzIGJvb2xlYW4gPSB0cnVlLFxuPiA9IFQgZXh0ZW5kcyBvYmplY3RcbiAgPyBDb252ZXJ0PFQsIE1vZGUsIFNwbGl0TnVtYmVycz5cbiAgOiBUO1xuXG50eXBlIENvbnZlcnRPYmplY3RWYWx1ZTxcbiAgVCxcbiAgTW9kZSBleHRlbmRzIENhc2VNb2RlLFxuICBTcGxpdE51bWJlcnMgZXh0ZW5kcyBib29sZWFuID0gdHJ1ZSxcbj4gPSBUIGV4dGVuZHMgQXJyYXk8aW5mZXIgQXJyYXlUeXBlPlxuICA/IEFycmF5PENvbnZlcnRBcnJheUl0ZW08QXJyYXlUeXBlLCBNb2RlLCBTcGxpdE51bWJlcnM+PlxuICA6IFQgZXh0ZW5kcyBvYmplY3QgfCB1bmRlZmluZWQgfCBudWxsXG4gID8gQ29udmVydDxULCBNb2RlLCBTcGxpdE51bWJlcnM+XG4gIDogVDtcblxuZnVuY3Rpb24gaXNOdW1lcmljS2V5KHRlcm06IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL14tP1xcZCsoPzpcXC5cXGQrKT8kLy50ZXN0KHRlcm0pO1xufVxuXG50eXBlIENhcGl0YWxMZXR0ZXJzID1cbiAgfCAnQSdcbiAgfCAnQidcbiAgfCAnQydcbiAgfCAnRCdcbiAgfCAnRSdcbiAgfCAnRidcbiAgfCAnRydcbiAgfCAnSCdcbiAgfCAnSSdcbiAgfCAnSidcbiAgfCAnSydcbiAgfCAnTCdcbiAgfCAnTSdcbiAgfCAnTidcbiAgfCAnTydcbiAgfCAnUCdcbiAgfCAnUSdcbiAgfCAnUidcbiAgfCAnUydcbiAgfCAnVCdcbiAgfCAnVSdcbiAgfCAnVidcbiAgfCAnVydcbiAgfCAnWCdcbiAgfCAnWSdcbiAgfCAnWic7XG5cbnR5cGUgTG93ZXJjYXNlTGV0dGVycyA9XG4gIHwgJ2EnXG4gIHwgJ2InXG4gIHwgJ2MnXG4gIHwgJ2QnXG4gIHwgJ2UnXG4gIHwgJ2YnXG4gIHwgJ2cnXG4gIHwgJ2gnXG4gIHwgJ2knXG4gIHwgJ2onXG4gIHwgJ2snXG4gIHwgJ2wnXG4gIHwgJ20nXG4gIHwgJ24nXG4gIHwgJ28nXG4gIHwgJ3AnXG4gIHwgJ3EnXG4gIHwgJ3InXG4gIHwgJ3MnXG4gIHwgJ3QnXG4gIHwgJ3UnXG4gIHwgJ3YnXG4gIHwgJ3cnXG4gIHwgJ3gnXG4gIHwgJ3knXG4gIHwgJ3onO1xuXG50eXBlIE51bWJlcnMgPSAnMCcgfCAnMScgfCAnMicgfCAnMycgfCAnNCcgfCAnNScgfCAnNicgfCAnNycgfCAnOCcgfCAnOSc7XG4iXX0=
|