@igo2/utils 1.15.3 → 1.15.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,248 +1,248 @@
1
- export class ObjectUtils {
2
- static resolve(obj, key) {
3
- const keysArray = key
4
- .replace(/\[/g, '.')
5
- .replace(/\]/g, '')
6
- .split('.');
7
- let current = obj;
8
- while (keysArray.length) {
9
- if (typeof current !== 'object') {
10
- return undefined;
11
- }
12
- current = current[keysArray.shift()];
13
- }
14
- return current;
15
- }
16
- static isObject(item) {
17
- return (item &&
18
- typeof item === 'object' &&
19
- !Array.isArray(item) &&
20
- item !== null &&
21
- !(item instanceof Date));
22
- }
23
- static mergeDeep(target, source, ignoreUndefined = false) {
24
- const output = Object.assign({}, target);
25
- if (ObjectUtils.isObject(target) && ObjectUtils.isObject(source)) {
26
- Object.keys(source)
27
- .filter(key => !ignoreUndefined || source[key] !== undefined)
28
- .forEach(key => {
29
- if (ObjectUtils.isObject(source[key])) {
30
- if (!(key in target)) {
31
- Object.assign(output, { [key]: source[key] });
32
- }
33
- else {
34
- output[key] = ObjectUtils.mergeDeep(target[key], source[key], ignoreUndefined);
35
- }
36
- }
37
- else {
38
- Object.assign(output, { [key]: source[key] });
39
- }
40
- });
41
- }
42
- return output;
43
- }
44
- static copyDeep(src) {
45
- const target = Array.isArray(src) ? [] : {};
46
- for (const prop in src) {
47
- if (src.hasOwnProperty(prop)) {
48
- const value = src[prop];
49
- if (value && typeof value === 'object') {
50
- target[prop] = this.copyDeep(value);
51
- }
52
- else {
53
- target[prop] = value;
54
- }
55
- }
56
- }
57
- return target;
58
- }
59
- static removeDuplicateCaseInsensitive(obj) {
60
- const summaryCapitalizeObject = {};
61
- const capitalizeObject = {};
62
- const upperCaseCount = [];
63
- for (const property in obj) {
64
- if (obj.hasOwnProperty(property)) {
65
- const upperCaseProperty = property.toUpperCase();
66
- if (!summaryCapitalizeObject.hasOwnProperty(upperCaseProperty)) {
67
- summaryCapitalizeObject[upperCaseProperty] = [
68
- { [property]: obj[property] }
69
- ];
70
- }
71
- else {
72
- summaryCapitalizeObject[upperCaseProperty].push({
73
- [property]: obj[property]
74
- });
75
- }
76
- // counting the number of uppercase lettersMna
77
- upperCaseCount.push({
78
- key: property,
79
- count: property.replace(/[^A-Z]/g, '').length
80
- });
81
- }
82
- }
83
- for (const capitalizedProperty in summaryCapitalizeObject) {
84
- if (summaryCapitalizeObject.hasOwnProperty(capitalizedProperty)) {
85
- if (summaryCapitalizeObject.hasOwnProperty(capitalizedProperty)) {
86
- const capitalizedPropertyObject = summaryCapitalizeObject[capitalizedProperty];
87
- if (capitalizedPropertyObject.length === 1) {
88
- // for single params (no duplicates)
89
- const singlePossibility = capitalizedPropertyObject[0];
90
- capitalizeObject[capitalizedProperty] =
91
- singlePossibility[Object.keys(singlePossibility)[0]];
92
- }
93
- else if (capitalizedPropertyObject.length > 1) {
94
- // defining the closest to lowercase property
95
- const paramClosestToLowercase = upperCaseCount
96
- .filter(f => f.key.toLowerCase() === capitalizedProperty.toLowerCase())
97
- .reduce((prev, current) => {
98
- return prev.y < current.y ? prev : current;
99
- });
100
- capitalizeObject[paramClosestToLowercase.key.toUpperCase()] =
101
- obj[paramClosestToLowercase.key];
102
- }
103
- }
104
- }
105
- }
106
- for (const property in obj) {
107
- if (obj.hasOwnProperty(property)) {
108
- delete obj[property];
109
- }
110
- }
111
- for (const property in capitalizeObject) {
112
- if (capitalizeObject.hasOwnProperty(property)) {
113
- obj[property] = capitalizeObject[property];
114
- }
115
- }
116
- }
117
- static removeUndefined(obj) {
118
- const output = {};
119
- if (ObjectUtils.isObject(obj)) {
120
- Object.keys(obj)
121
- .filter(key => obj[key] !== undefined)
122
- .forEach(key => {
123
- if (ObjectUtils.isObject(obj[key]) || Array.isArray(obj[key])) {
124
- output[key] = ObjectUtils.removeUndefined(obj[key]);
125
- }
126
- else {
127
- output[key] = obj[key];
128
- }
129
- });
130
- return output;
131
- }
132
- if (Array.isArray(obj)) {
133
- return obj.map(o => ObjectUtils.removeUndefined(o));
134
- }
135
- return obj;
136
- }
137
- static removeNull(obj) {
138
- const output = {};
139
- if (ObjectUtils.isObject(obj)) {
140
- Object.keys(obj)
141
- .filter(key => obj[key] !== null)
142
- .forEach(key => {
143
- if (ObjectUtils.isObject(obj[key]) || Array.isArray(obj[key])) {
144
- output[key] = ObjectUtils.removeNull(obj[key]);
145
- }
146
- else {
147
- output[key] = obj[key];
148
- }
149
- });
150
- return output;
151
- }
152
- if (Array.isArray(obj)) {
153
- return obj.map(o => ObjectUtils.removeNull(o));
154
- }
155
- return obj;
156
- }
157
- static naturalCompare(a, b, direction = 'asc', nullsFirst) {
158
- if (direction === 'desc') {
159
- b = [a, (a = b)][0];
160
- }
161
- // nullsFirst = undefined : end if direction = 'asc', first if direction = 'desc'
162
- // nullsFirst = true : always first
163
- // nullsFirst = false : always end
164
- if (a === null ||
165
- a === '' ||
166
- a === undefined ||
167
- b === null ||
168
- b === '' ||
169
- b === undefined) {
170
- const nullScore = a === b
171
- ? 0
172
- : a === undefined
173
- ? 3
174
- : b === undefined
175
- ? -3
176
- : a === null
177
- ? 2
178
- : b === null
179
- ? -2
180
- : a === ''
181
- ? 1
182
- : -1;
183
- if (direction === 'desc') {
184
- return nullsFirst !== false ? nullScore : nullScore * -1;
185
- }
186
- return nullsFirst === true ? nullScore * -1 : nullScore;
187
- }
188
- const ax = [];
189
- const bx = [];
190
- a = '' + a;
191
- b = '' + b;
192
- a.replace(/(\d+)|(\D+)/g, (_, $1, $2) => {
193
- ax.push([$1 || Infinity, $2 || '']);
194
- });
195
- b.replace(/(\d+)|(\D+)/g, (_, $1, $2) => {
196
- bx.push([$1 || Infinity, $2 || '']);
197
- });
198
- while (ax.length && bx.length) {
199
- const an = ax.shift();
200
- const bn = bx.shift();
201
- const nn = an[0] - bn[0] || an[1].localeCompare(bn[1]);
202
- if (nn) {
203
- return nn;
204
- }
205
- }
206
- return ax.length - bx.length;
207
- }
208
- /**
209
- * Return true if two object are equivalent.
210
- * Objects are considered equivalent if they have the same properties and
211
- * if all of their properties (first-level only) share the same value.
212
- * @param obj1 First object
213
- * @param obj2 Second object
214
- * @returns Whether two objects arer equivalent
215
- */
216
- static objectsAreEquivalent(obj1, obj2) {
217
- if (obj1 === obj2) {
218
- return true;
219
- }
220
- const obj1Props = Object.getOwnPropertyNames(obj1);
221
- const obj2Props = Object.getOwnPropertyNames(obj2);
222
- if (obj1Props.length !== obj2Props.length) {
223
- return false;
224
- }
225
- for (const prop of obj1Props) {
226
- if (obj1[prop] !== obj2[prop]) {
227
- return false;
228
- }
229
- }
230
- return true;
231
- }
232
- /**
233
- * Return a new object with an array of keys removed
234
- * @param obj Source object
235
- * @param keys Keys to remove
236
- * @returns A new object
237
- */
238
- static removeKeys(obj, keys) {
239
- const newObj = Object.keys(obj)
240
- .filter(key => keys.indexOf(key) < 0)
241
- .reduce((_obj, key) => {
242
- _obj[key] = obj[key];
243
- return _obj;
244
- }, {});
245
- return newObj;
246
- }
247
- }
248
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvdXRpbHMvc3JjL2xpYi9vYmplY3QtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLFdBQVc7SUFDdEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFXLEVBQUUsR0FBVztRQUNyQyxNQUFNLFNBQVMsR0FBRyxHQUFHO2FBQ2xCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO2FBQ25CLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO2FBQ2xCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQztRQUNsQixPQUFPLFNBQVMsQ0FBQyxNQUFNLEVBQUU7WUFDdkIsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUU7Z0JBQy9CLE9BQU8sU0FBUyxDQUFDO2FBQ2xCO1lBQ0QsT0FBTyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUN0QztRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxNQUFNLENBQUMsUUFBUSxDQUFDLElBQVk7UUFDMUIsT0FBTyxDQUNMLElBQUk7WUFDSixPQUFPLElBQUksS0FBSyxRQUFRO1lBQ3hCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDcEIsSUFBSSxLQUFLLElBQUk7WUFDYixDQUFDLENBQUMsSUFBSSxZQUFZLElBQUksQ0FBQyxDQUN4QixDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sQ0FBQyxTQUFTLENBQ2QsTUFBYyxFQUNkLE1BQWMsRUFDZCxlQUFlLEdBQUcsS0FBSztRQUV2QixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN6QyxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMs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ImV4cG9ydCBjbGFzcyBPYmplY3RVdGlscyB7XHJcbiAgc3RhdGljIHJlc29sdmUob2JqOiBvYmplY3QsIGtleTogc3RyaW5nKTogYW55IHtcclxuICAgIGNvbnN0IGtleXNBcnJheSA9IGtleVxyXG4gICAgICAucmVwbGFjZSgvXFxbL2csICcuJylcclxuICAgICAgLnJlcGxhY2UoL1xcXS9nLCAnJylcclxuICAgICAgLnNwbGl0KCcuJyk7XHJcbiAgICBsZXQgY3VycmVudCA9IG9iajtcclxuICAgIHdoaWxlIChrZXlzQXJyYXkubGVuZ3RoKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgY3VycmVudCAhPT0gJ29iamVjdCcpIHtcclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleXNBcnJheS5zaGlmdCgpXTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY3VycmVudDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBpc09iamVjdChpdGVtOiBvYmplY3QpIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIGl0ZW0gJiZcclxuICAgICAgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmXHJcbiAgICAgICFBcnJheS5pc0FycmF5KGl0ZW0pICYmXHJcbiAgICAgIGl0ZW0gIT09IG51bGwgJiZcclxuICAgICAgIShpdGVtIGluc3RhbmNlb2YgRGF0ZSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgbWVyZ2VEZWVwKFxyXG4gICAgdGFyZ2V0OiBvYmplY3QsXHJcbiAgICBzb3VyY2U6IG9iamVjdCxcclxuICAgIGlnbm9yZVVuZGVmaW5lZCA9IGZhbHNlXHJcbiAgKTogYW55IHtcclxuICAgIGNvbnN0IG91dHB1dCA9IE9iamVjdC5hc3NpZ24oe30sIHRhcmdldCk7XHJcbiAgICBpZiAoT2JqZWN0VXRpbHMuaXNPYmplY3QodGFyZ2V0KSAmJiBPYmplY3RVdGlscy5pc09iamVjdChzb3VyY2UpKSB7XHJcbiAgICAgIE9iamVjdC5rZXlzKHNvdXJjZSlcclxuICAgICAgICAuZmlsdGVyKGtleSA9PiAhaWdub3JlVW5kZWZpbmVkIHx8IHNvdXJjZVtrZXldICE9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgIGlmIChPYmplY3RVdGlscy5pc09iamVjdChzb3VyY2Vba2V5XSkpIHtcclxuICAgICAgICAgICAgaWYgKCEoa2V5IGluIHRhcmdldCkpIHtcclxuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKG91dHB1dCwgeyBba2V5XTogc291cmNlW2tleV0gfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgb3V0cHV0W2tleV0gPSBPYmplY3RVdGlscy5tZXJnZURlZXAoXHJcbiAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSxcclxuICAgICAgICAgICAgICAgIHNvdXJjZVtrZXldLFxyXG4gICAgICAgICAgICAgICAgaWdub3JlVW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihvdXRwdXQsIHsgW2tleV06IHNvdXJjZVtrZXldIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG91dHB1dDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBjb3B5RGVlcChzcmMpOiBhbnkge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gQXJyYXkuaXNBcnJheShzcmMpID8gW10gOiB7fTtcclxuICAgIGZvciAoY29uc3QgcHJvcCBpbiBzcmMpIHtcclxuICAgICAgaWYgKHNyYy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gc3JjW3Byb3BdO1xyXG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICB0YXJnZXRbcHJvcF0gPSB0aGlzLmNvcHlEZWVwKHZhbHVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGFyZ2V0W3Byb3BdID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGFyZ2V0O1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIHJlbW92ZUR1cGxpY2F0ZUNhc2VJbnNlbnNpdGl2ZShvYmo6IG9iamVjdCkge1xyXG4gICAgY29uc3Qgc3VtbWFyeUNhcGl0YWxpemVPYmplY3QgPSB7fTtcclxuICAgIGNvbnN0IGNhcGl0YWxpemVPYmplY3QgPSB7fTtcclxuICAgIGNvbnN0IHVwcGVyQ2FzZUNvdW50ID0gW107XHJcblxyXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBvYmopIHtcclxuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHtcclxuICAgICAgICBjb25zdCB1cHBlckNhc2VQcm9wZXJ0eSA9IHByb3BlcnR5LnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFzdW1tYXJ5Q2FwaXRhbGl6ZU9iamVjdC5oYXNPd25Qcm9wZXJ0eSh1cHBlckNhc2VQcm9wZXJ0eSkpIHtcclxuICAgICAgICAgIHN1bW1hcnlDYXBpdGFsaXplT2JqZWN0W3VwcGVyQ2FzZVByb3BlcnR5XSA9IFtcclxuICAgICAgICAgICAgeyBbcHJvcGVydHldOiBvYmpbcHJvcGVydHldIH1cclxuICAgICAgICAgIF07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHN1bW1hcnlDYXBpdGFsaXplT2JqZWN0W3VwcGVyQ2FzZVByb3BlcnR5XS5wdXNoKHtcclxuICAgICAgICAgICAgW3Byb3BlcnR5XTogb2JqW3Byb3BlcnR5XVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNvdW50aW5nIHRoZSBudW1iZXIgb2YgdXBwZXJjYXNlIGxldHRlcnNNbmFcclxuICAgICAgICB1cHBlckNhc2VDb3VudC5wdXNoKHtcclxuICAgICAgICAgIGtleTogcHJvcGVydHksXHJcbiAgICAgICAgICBjb3VudDogcHJvcGVydHkucmVwbGFjZSgvW15BLVpdL2csICcnKS5sZW5ndGhcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCBjYXBpdGFsaXplZFByb3BlcnR5IGluIHN1bW1hcnlDYXBpdGFsaXplT2JqZWN0KSB7XHJcbiAgICAgIGlmIChzdW1tYXJ5Q2FwaXRhbGl6ZU9iamVjdC5oYXNPd25Qcm9wZXJ0eShjYXBpdGFsaXplZFByb3BlcnR5KSkge1xyXG4gICAgICAgIGlmIChzdW1tYXJ5Q2FwaXRhbGl6ZU9iamVjdC5oYXNPd25Qcm9wZXJ0eShjYXBpdGFsaXplZFByb3BlcnR5KSkge1xyXG4gICAgICAgICAgY29uc3QgY2FwaXRhbGl6ZWRQcm9wZXJ0eU9iamVjdCA9XHJcbiAgICAgICAgICAgIHN1bW1hcnlDYXBpdGFsaXplT2JqZWN0W2NhcGl0YWxpemVkUHJvcGVydHldO1xyXG4gICAgICAgICAgaWYgKGNhcGl0YWxpemVkUHJvcGVydHlPYmplY3QubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgIC8vIGZvciBzaW5nbGUgcGFyYW1zIChubyBkdXBsaWNhdGVzKVxyXG4gICAgICAgICAgICBjb25zdCBzaW5nbGVQb3NzaWJpbGl0eSA9IGNhcGl0YWxpemVkUHJvcGVydHlPYmplY3RbMF07XHJcbiAgICAgICAgICAgIGNhcGl0YWxpemVPYmplY3RbY2FwaXRhbGl6ZWRQcm9wZXJ0eV0gPVxyXG4gICAgICAgICAgICAgIHNpbmdsZVBvc3NpYmlsaXR5W09iamVjdC5rZXlzKHNpbmdsZVBvc3NpYmlsaXR5KVswXV07XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGNhcGl0YWxpemVkUHJvcGVydHlPYmplY3QubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAvLyBkZWZpbmluZyB0aGUgY2xvc2VzdCB0byBsb3dlcmNhc2UgcHJvcGVydHlcclxuICAgICAgICAgICAgY29uc3QgcGFyYW1DbG9zZXN0VG9Mb3dlcmNhc2UgPSB1cHBlckNhc2VDb3VudFxyXG4gICAgICAgICAgICAgIC5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgICBmID0+IGYua2V5LnRvTG93ZXJDYXNlKCkgPT09IGNhcGl0YWxpemVkUHJvcGVydHkudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAucmVkdWNlKChwcmV2LCBjdXJyZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJldi55IDwgY3VycmVudC55ID8gcHJldiA6IGN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNhcGl0YWxpemVPYmplY3RbcGFyYW1DbG9zZXN0VG9Mb3dlcmNhc2Uua2V5LnRvVXBwZXJDYXNlKCldID1cclxuICAgICAgICAgICAgICBvYmpbcGFyYW1DbG9zZXN0VG9Mb3dlcmNhc2Uua2V5XTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gb2JqKSB7XHJcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkocHJvcGVydHkpKSB7XHJcbiAgICAgICAgZGVsZXRlIG9ialtwcm9wZXJ0eV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGNhcGl0YWxpemVPYmplY3QpIHtcclxuICAgICAgaWYgKGNhcGl0YWxpemVPYmplY3QuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKSB7XHJcbiAgICAgICAgb2JqW3Byb3BlcnR5XSA9IGNhcGl0YWxpemVPYmplY3RbcHJvcGVydHldO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgcmVtb3ZlVW5kZWZpbmVkKG9iajogb2JqZWN0KTogYW55IHtcclxuICAgIGNvbnN0IG91dHB1dCA9IHt9O1xyXG4gICAgaWYgKE9iamVjdFV0aWxzLmlzT2JqZWN0KG9iaikpIHtcclxuICAgICAgT2JqZWN0LmtleXMob2JqKVxyXG4gICAgICAgIC5maWx0ZXIoa2V5ID0+IG9ialtrZXldICE9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgIGlmIChPYmplY3RVdGlscy5pc09iamVjdChvYmpba2V5XSkgfHwgQXJyYXkuaXNBcnJheShvYmpba2V5XSkpIHtcclxuICAgICAgICAgICAgb3V0cHV0W2tleV0gPSBPYmplY3RVdGlscy5yZW1vdmVVbmRlZmluZWQob2JqW2tleV0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb3V0cHV0W2tleV0gPSBvYmpba2V5XTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xyXG4gICAgICByZXR1cm4gb2JqLm1hcChvID0+IE9iamVjdFV0aWxzLnJlbW92ZVVuZGVmaW5lZChvKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG9iajtcclxuICB9XHJcblxyXG4gIHN0YXRpYyByZW1vdmVOdWxsKG9iajogb2JqZWN0KTogYW55IHtcclxuICAgIGNvbnN0IG91dHB1dCA9IHt9O1xyXG4gICAgaWYgKE9iamVjdFV0aWxzLmlzT2JqZWN0KG9iaikpIHtcclxuICAgICAgT2JqZWN0LmtleXMob2JqKVxyXG4gICAgICAgIC5maWx0ZXIoa2V5ID0+IG9ialtrZXldICE9PSBudWxsKVxyXG4gICAgICAgIC5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICBpZiAoT2JqZWN0VXRpbHMuaXNPYmplY3Qob2JqW2tleV0pIHx8IEFycmF5LmlzQXJyYXkob2JqW2tleV0pKSB7XHJcbiAgICAgICAgICAgIG91dHB1dFtrZXldID0gT2JqZWN0VXRpbHMucmVtb3ZlTnVsbChvYmpba2V5XSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvdXRwdXRba2V5XSA9IG9ialtrZXldO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgcmV0dXJuIG91dHB1dDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XHJcbiAgICAgIHJldHVybiBvYmoubWFwKG8gPT4gT2JqZWN0VXRpbHMucmVtb3ZlTnVsbChvKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG9iajtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBuYXR1cmFsQ29tcGFyZShhLCBiLCBkaXJlY3Rpb24gPSAnYXNjJywgbnVsbHNGaXJzdD86IGJvb2xlYW4pIHtcclxuICAgIGlmIChkaXJlY3Rpb24gPT09ICdkZXNjJykge1xyXG4gICAgICBiID0gW2EsIChhID0gYildWzBdO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIG51bGxzRmlyc3QgPSB1bmRlZmluZWQgOiBlbmQgaWYgZGlyZWN0aW9uID0gJ2FzYycsIGZpcnN0IGlmIGRpcmVjdGlvbiA9ICdkZXNjJ1xyXG4gICAgLy8gbnVsbHNGaXJzdCA9IHRydWUgOiBhbHdheXMgZmlyc3RcclxuICAgIC8vIG51bGxzRmlyc3QgPSBmYWxzZSA6IGFsd2F5cyBlbmRcclxuICAgIGlmIChcclxuICAgICAgYSA9PT0gbnVsbCB8fFxyXG4gICAgICBhID09PSAnJyB8fFxyXG4gICAgICBhID09PSB1bmRlZmluZWQgfHxcclxuICAgICAgYiA9PT0gbnVsbCB8fFxyXG4gICAgICBiID09PSAnJyB8fFxyXG4gICAgICBiID09PSB1bmRlZmluZWRcclxuICAgICkge1xyXG4gICAgICBjb25zdCBudWxsU2NvcmUgPVxyXG4gICAgICAgIGEgPT09IGJcclxuICAgICAgICAgID8gMFxyXG4gICAgICAgICAgOiBhID09PSB1bmRlZmluZWRcclxuICAgICAgICAgID8gM1xyXG4gICAgICAgICAgOiBiID09PSB1bmRlZmluZWRcclxuICAgICAgICAgID8gLTNcclxuICAgICAgICAgIDogYSA9PT0gbnVsbFxyXG4gICAgICAgICAgPyAyXHJcbiAgICAgICAgICA6IGIgPT09IG51bGxcclxuICAgICAgICAgID8gLTJcclxuICAgICAgICAgIDogYSA9PT0gJydcclxuICAgICAgICAgID8gMVxyXG4gICAgICAgICAgOiAtMTtcclxuICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ2Rlc2MnKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGxzRmlyc3QgIT09IGZhbHNlID8gbnVsbFNjb3JlIDogbnVsbFNjb3JlICogLTE7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGxzRmlyc3QgPT09IHRydWUgPyBudWxsU2NvcmUgKiAtMSA6IG51bGxTY29yZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBheCA9IFtdO1xyXG4gICAgY29uc3QgYnggPSBbXTtcclxuICAgIGEgPSAnJyArIGE7XHJcbiAgICBiID0gJycgKyBiO1xyXG5cclxuICAgIGEucmVwbGFjZSgvKFxcZCspfChcXEQrKS9nLCAoXywgJDEsICQyKSA9PiB7XHJcbiAgICAgIGF4LnB1c2goWyQxIHx8IEluZmluaXR5LCAkMiB8fCAnJ10pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgYi5yZXBsYWNlKC8oXFxkKyl8KFxcRCspL2csIChfLCAkMSwgJDIpID0+IHtcclxuICAgICAgYngucHVzaChbJDEgfHwgSW5maW5pdHksICQyIHx8ICcnXSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB3aGlsZSAoYXgubGVuZ3RoICYmIGJ4Lmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBhbiA9IGF4LnNoaWZ0KCk7XHJcbiAgICAgIGNvbnN0IGJuID0gYnguc2hpZnQoKTtcclxuICAgICAgY29uc3Qgbm4gPSBhblswXSAtIGJuWzBdIHx8IGFuWzFdLmxvY2FsZUNvbXBhcmUoYm5bMV0pO1xyXG4gICAgICBpZiAobm4pIHtcclxuICAgICAgICByZXR1cm4gbm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYXgubGVuZ3RoIC0gYngubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRydWUgaWYgdHdvIG9iamVjdCBhcmUgZXF1aXZhbGVudC5cclxuICAgKiBPYmplY3RzIGFyZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQgaWYgdGhleSBoYXZlIHRoZSBzYW1lIHByb3BlcnRpZXMgYW5kXHJcbiAgICogaWYgYWxsIG9mIHRoZWlyIHByb3BlcnRpZXMgKGZpcnN0LWxldmVsIG9ubHkpIHNoYXJlIHRoZSBzYW1lIHZhbHVlLlxyXG4gICAqIEBwYXJhbSBvYmoxIEZpcnN0IG9iamVjdFxyXG4gICAqIEBwYXJhbSBvYmoyIFNlY29uZCBvYmplY3RcclxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHR3byBvYmplY3RzIGFyZXIgZXF1aXZhbGVudFxyXG4gICAqL1xyXG4gIHN0YXRpYyBvYmplY3RzQXJlRXF1aXZhbGVudChvYmoxOiBvYmplY3QsIG9iajI6IG9iamVjdCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKG9iajEgPT09IG9iajIpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgb2JqMVByb3BzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqMSk7XHJcbiAgICBjb25zdCBvYmoyUHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmoyKTtcclxuICAgIGlmIChvYmoxUHJvcHMubGVuZ3RoICE9PSBvYmoyUHJvcHMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGNvbnN0IHByb3Agb2Ygb2JqMVByb3BzKSB7XHJcbiAgICAgIGlmIChvYmoxW3Byb3BdICE9PSBvYmoyW3Byb3BdKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gYSBuZXcgb2JqZWN0IHdpdGggYW4gYXJyYXkgb2Yga2V5cyByZW1vdmVkXHJcbiAgICogQHBhcmFtIG9iaiBTb3VyY2Ugb2JqZWN0XHJcbiAgICogQHBhcmFtIGtleXMgS2V5cyB0byByZW1vdmVcclxuICAgKiBAcmV0dXJucyBBIG5ldyBvYmplY3RcclxuICAgKi9cclxuICBzdGF0aWMgcmVtb3ZlS2V5cyhvYmo6IG9iamVjdCwga2V5czogc3RyaW5nW10pOiBvYmplY3Qge1xyXG4gICAgY29uc3QgbmV3T2JqID0gT2JqZWN0LmtleXMob2JqKVxyXG4gICAgICAuZmlsdGVyKGtleSA9PiBrZXlzLmluZGV4T2Yoa2V5KSA8IDApXHJcbiAgICAgIC5yZWR1Y2UoKF9vYmosIGtleSkgPT4ge1xyXG4gICAgICAgIF9vYmpba2V5XSA9IG9ialtrZXldO1xyXG4gICAgICAgIHJldHVybiBfb2JqO1xyXG4gICAgICB9LCB7fSk7XHJcblxyXG4gICAgcmV0dXJuIG5ld09iajtcclxuICB9XHJcbn1cclxuIl19
1
+ export class ObjectUtils {
2
+ static resolve(obj, key) {
3
+ const keysArray = key
4
+ .replace(/\[/g, '.')
5
+ .replace(/\]/g, '')
6
+ .split('.');
7
+ let current = obj;
8
+ while (keysArray.length) {
9
+ if (typeof current !== 'object') {
10
+ return undefined;
11
+ }
12
+ current = current[keysArray.shift()];
13
+ }
14
+ return current;
15
+ }
16
+ static isObject(item) {
17
+ return (item &&
18
+ typeof item === 'object' &&
19
+ !Array.isArray(item) &&
20
+ item !== null &&
21
+ !(item instanceof Date));
22
+ }
23
+ static mergeDeep(target, source, ignoreUndefined = false) {
24
+ const output = Object.assign({}, target);
25
+ if (ObjectUtils.isObject(target) && ObjectUtils.isObject(source)) {
26
+ Object.keys(source)
27
+ .filter(key => !ignoreUndefined || source[key] !== undefined)
28
+ .forEach(key => {
29
+ if (ObjectUtils.isObject(source[key])) {
30
+ if (!(key in target)) {
31
+ Object.assign(output, { [key]: source[key] });
32
+ }
33
+ else {
34
+ output[key] = ObjectUtils.mergeDeep(target[key], source[key], ignoreUndefined);
35
+ }
36
+ }
37
+ else {
38
+ Object.assign(output, { [key]: source[key] });
39
+ }
40
+ });
41
+ }
42
+ return output;
43
+ }
44
+ static copyDeep(src) {
45
+ const target = Array.isArray(src) ? [] : {};
46
+ for (const prop in src) {
47
+ if (src.hasOwnProperty(prop)) {
48
+ const value = src[prop];
49
+ if (value && typeof value === 'object') {
50
+ target[prop] = this.copyDeep(value);
51
+ }
52
+ else {
53
+ target[prop] = value;
54
+ }
55
+ }
56
+ }
57
+ return target;
58
+ }
59
+ static removeDuplicateCaseInsensitive(obj) {
60
+ const summaryCapitalizeObject = {};
61
+ const capitalizeObject = {};
62
+ const upperCaseCount = [];
63
+ for (const property in obj) {
64
+ if (obj.hasOwnProperty(property)) {
65
+ const upperCaseProperty = property.toUpperCase();
66
+ if (!summaryCapitalizeObject.hasOwnProperty(upperCaseProperty)) {
67
+ summaryCapitalizeObject[upperCaseProperty] = [
68
+ { [property]: obj[property] }
69
+ ];
70
+ }
71
+ else {
72
+ summaryCapitalizeObject[upperCaseProperty].push({
73
+ [property]: obj[property]
74
+ });
75
+ }
76
+ // counting the number of uppercase lettersMna
77
+ upperCaseCount.push({
78
+ key: property,
79
+ count: property.replace(/[^A-Z]/g, '').length
80
+ });
81
+ }
82
+ }
83
+ for (const capitalizedProperty in summaryCapitalizeObject) {
84
+ if (summaryCapitalizeObject.hasOwnProperty(capitalizedProperty)) {
85
+ if (summaryCapitalizeObject.hasOwnProperty(capitalizedProperty)) {
86
+ const capitalizedPropertyObject = summaryCapitalizeObject[capitalizedProperty];
87
+ if (capitalizedPropertyObject.length === 1) {
88
+ // for single params (no duplicates)
89
+ const singlePossibility = capitalizedPropertyObject[0];
90
+ capitalizeObject[capitalizedProperty] =
91
+ singlePossibility[Object.keys(singlePossibility)[0]];
92
+ }
93
+ else if (capitalizedPropertyObject.length > 1) {
94
+ // defining the closest to lowercase property
95
+ const paramClosestToLowercase = upperCaseCount
96
+ .filter(f => f.key.toLowerCase() === capitalizedProperty.toLowerCase())
97
+ .reduce((prev, current) => {
98
+ return prev.y < current.y ? prev : current;
99
+ });
100
+ capitalizeObject[paramClosestToLowercase.key.toUpperCase()] =
101
+ obj[paramClosestToLowercase.key];
102
+ }
103
+ }
104
+ }
105
+ }
106
+ for (const property in obj) {
107
+ if (obj.hasOwnProperty(property)) {
108
+ delete obj[property];
109
+ }
110
+ }
111
+ for (const property in capitalizeObject) {
112
+ if (capitalizeObject.hasOwnProperty(property)) {
113
+ obj[property] = capitalizeObject[property];
114
+ }
115
+ }
116
+ }
117
+ static removeUndefined(obj) {
118
+ const output = {};
119
+ if (ObjectUtils.isObject(obj)) {
120
+ Object.keys(obj)
121
+ .filter(key => obj[key] !== undefined)
122
+ .forEach(key => {
123
+ if (ObjectUtils.isObject(obj[key]) || Array.isArray(obj[key])) {
124
+ output[key] = ObjectUtils.removeUndefined(obj[key]);
125
+ }
126
+ else {
127
+ output[key] = obj[key];
128
+ }
129
+ });
130
+ return output;
131
+ }
132
+ if (Array.isArray(obj)) {
133
+ return obj.map(o => ObjectUtils.removeUndefined(o));
134
+ }
135
+ return obj;
136
+ }
137
+ static removeNull(obj) {
138
+ const output = {};
139
+ if (ObjectUtils.isObject(obj)) {
140
+ Object.keys(obj)
141
+ .filter(key => obj[key] !== null)
142
+ .forEach(key => {
143
+ if (ObjectUtils.isObject(obj[key]) || Array.isArray(obj[key])) {
144
+ output[key] = ObjectUtils.removeNull(obj[key]);
145
+ }
146
+ else {
147
+ output[key] = obj[key];
148
+ }
149
+ });
150
+ return output;
151
+ }
152
+ if (Array.isArray(obj)) {
153
+ return obj.map(o => ObjectUtils.removeNull(o));
154
+ }
155
+ return obj;
156
+ }
157
+ static naturalCompare(a, b, direction = 'asc', nullsFirst) {
158
+ if (direction === 'desc') {
159
+ b = [a, (a = b)][0];
160
+ }
161
+ // nullsFirst = undefined : end if direction = 'asc', first if direction = 'desc'
162
+ // nullsFirst = true : always first
163
+ // nullsFirst = false : always end
164
+ if (a === null ||
165
+ a === '' ||
166
+ a === undefined ||
167
+ b === null ||
168
+ b === '' ||
169
+ b === undefined) {
170
+ const nullScore = a === b
171
+ ? 0
172
+ : a === undefined
173
+ ? 3
174
+ : b === undefined
175
+ ? -3
176
+ : a === null
177
+ ? 2
178
+ : b === null
179
+ ? -2
180
+ : a === ''
181
+ ? 1
182
+ : -1;
183
+ if (direction === 'desc') {
184
+ return nullsFirst !== false ? nullScore : nullScore * -1;
185
+ }
186
+ return nullsFirst === true ? nullScore * -1 : nullScore;
187
+ }
188
+ const ax = [];
189
+ const bx = [];
190
+ a = '' + a;
191
+ b = '' + b;
192
+ a.replace(/(\d+)|(\D+)/g, (_, $1, $2) => {
193
+ ax.push([$1 || Infinity, $2 || '']);
194
+ });
195
+ b.replace(/(\d+)|(\D+)/g, (_, $1, $2) => {
196
+ bx.push([$1 || Infinity, $2 || '']);
197
+ });
198
+ while (ax.length && bx.length) {
199
+ const an = ax.shift();
200
+ const bn = bx.shift();
201
+ const nn = an[0] - bn[0] || an[1].localeCompare(bn[1]);
202
+ if (nn) {
203
+ return nn;
204
+ }
205
+ }
206
+ return ax.length - bx.length;
207
+ }
208
+ /**
209
+ * Return true if two object are equivalent.
210
+ * Objects are considered equivalent if they have the same properties and
211
+ * if all of their properties (first-level only) share the same value.
212
+ * @param obj1 First object
213
+ * @param obj2 Second object
214
+ * @returns Whether two objects arer equivalent
215
+ */
216
+ static objectsAreEquivalent(obj1, obj2) {
217
+ if (obj1 === obj2) {
218
+ return true;
219
+ }
220
+ const obj1Props = Object.getOwnPropertyNames(obj1);
221
+ const obj2Props = Object.getOwnPropertyNames(obj2);
222
+ if (obj1Props.length !== obj2Props.length) {
223
+ return false;
224
+ }
225
+ for (const prop of obj1Props) {
226
+ if (obj1[prop] !== obj2[prop]) {
227
+ return false;
228
+ }
229
+ }
230
+ return true;
231
+ }
232
+ /**
233
+ * Return a new object with an array of keys removed
234
+ * @param obj Source object
235
+ * @param keys Keys to remove
236
+ * @returns A new object
237
+ */
238
+ static removeKeys(obj, keys) {
239
+ const newObj = Object.keys(obj)
240
+ .filter(key => keys.indexOf(key) < 0)
241
+ .reduce((_obj, key) => {
242
+ _obj[key] = obj[key];
243
+ return _obj;
244
+ }, {});
245
+ return newObj;
246
+ }
247
+ }
248
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvdXRpbHMvc3JjL2xpYi9vYmplY3QtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLFdBQVc7SUFDdEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFXLEVBQUUsR0FBVztRQUNyQyxNQUFNLFNBQVMsR0FBRyxHQUFHO2FBQ2xCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO2FBQ25CLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO2FBQ2xCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQztRQUNsQixPQUFPLFNBQVMsQ0FBQyxNQUFNLEVBQUU7WUFDdkIsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUU7Z0JBQy9CLE9BQU8sU0FBUyxDQUFDO2FBQ2xCO1lBQ0QsT0FBTyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUN0QztRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxNQUFNLENBQUMsUUFBUSxDQUFDLElBQVk7UUFDMUIsT0FBTyxDQUNMLElBQUk7WUFDSixPQUFPLElBQUksS0FBSyxRQUFRO1lBQ3hCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDcEIsSUFBSSxLQUFLLElBQUk7WUFDYixDQUFDLENBQUMsSUFBSSxZQUFZLElBQUksQ0FBQyxDQUN4QixDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sQ0FBQyxTQUFTLENBQ2QsTUFBYyxFQUNkLE1BQWMsRUFDZCxlQUFlLEdBQUcsS0FBSztRQUV2QixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN6QyxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMs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ImV4cG9ydCBjbGFzcyBPYmplY3RVdGlscyB7XG4gIHN0YXRpYyByZXNvbHZlKG9iajogb2JqZWN0LCBrZXk6IHN0cmluZyk6IGFueSB7XG4gICAgY29uc3Qga2V5c0FycmF5ID0ga2V5XG4gICAgICAucmVwbGFjZSgvXFxbL2csICcuJylcbiAgICAgIC5yZXBsYWNlKC9cXF0vZywgJycpXG4gICAgICAuc3BsaXQoJy4nKTtcbiAgICBsZXQgY3VycmVudCA9IG9iajtcbiAgICB3aGlsZSAoa2V5c0FycmF5Lmxlbmd0aCkge1xuICAgICAgaWYgKHR5cGVvZiBjdXJyZW50ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgY3VycmVudCA9IGN1cnJlbnRba2V5c0FycmF5LnNoaWZ0KCldO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG5cbiAgc3RhdGljIGlzT2JqZWN0KGl0ZW06IG9iamVjdCkge1xuICAgIHJldHVybiAoXG4gICAgICBpdGVtICYmXG4gICAgICB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KGl0ZW0pICYmXG4gICAgICBpdGVtICE9PSBudWxsICYmXG4gICAgICAhKGl0ZW0gaW5zdGFuY2VvZiBEYXRlKVxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgbWVyZ2VEZWVwKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIHNvdXJjZTogb2JqZWN0LFxuICAgIGlnbm9yZVVuZGVmaW5lZCA9IGZhbHNlXG4gICk6IGFueSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gT2JqZWN0LmFzc2lnbih7fSwgdGFyZ2V0KTtcbiAgICBpZiAoT2JqZWN0VXRpbHMuaXNPYmplY3QodGFyZ2V0KSAmJiBPYmplY3RVdGlscy5pc09iamVjdChzb3VyY2UpKSB7XG4gICAgICBPYmplY3Qua2V5cyhzb3VyY2UpXG4gICAgICAgIC5maWx0ZXIoa2V5ID0+ICFpZ25vcmVVbmRlZmluZWQgfHwgc291cmNlW2tleV0gIT09IHVuZGVmaW5lZClcbiAgICAgICAgLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICBpZiAoT2JqZWN0VXRpbHMuaXNPYmplY3Qoc291cmNlW2tleV0pKSB7XG4gICAgICAgICAgICBpZiAoIShrZXkgaW4gdGFyZ2V0KSkge1xuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKG91dHB1dCwgeyBba2V5XTogc291cmNlW2tleV0gfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvdXRwdXRba2V5XSA9IE9iamVjdFV0aWxzLm1lcmdlRGVlcChcbiAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSxcbiAgICAgICAgICAgICAgICBzb3VyY2Vba2V5XSxcbiAgICAgICAgICAgICAgICBpZ25vcmVVbmRlZmluZWRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihvdXRwdXQsIHsgW2tleV06IHNvdXJjZVtrZXldIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICBzdGF0aWMgY29weURlZXAoc3JjKTogYW55IHtcbiAgICBjb25zdCB0YXJnZXQgPSBBcnJheS5pc0FycmF5KHNyYykgPyBbXSA6IHt9O1xuICAgIGZvciAoY29uc3QgcHJvcCBpbiBzcmMpIHtcbiAgICAgIGlmIChzcmMuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBzcmNbcHJvcF07XG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdGFyZ2V0W3Byb3BdID0gdGhpcy5jb3B5RGVlcCh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0W3Byb3BdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuXG4gIHN0YXRpYyByZW1vdmVEdXBsaWNhdGVDYXNlSW5zZW5zaXRpdmUob2JqOiBvYmplY3QpIHtcbiAgICBjb25zdCBzdW1tYXJ5Q2FwaXRhbGl6ZU9iamVjdCA9IHt9O1xuICAgIGNvbnN0IGNhcGl0YWxpemVPYmplY3QgPSB7fTtcbiAgICBjb25zdCB1cHBlckNhc2VDb3VudCA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkocHJvcGVydHkpKSB7XG4gICAgICAgIGNvbnN0IHVwcGVyQ2FzZVByb3BlcnR5ID0gcHJvcGVydHkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgaWYgKCFzdW1tYXJ5Q2FwaXRhbGl6ZU9iamVjdC5oYXNPd25Qcm9wZXJ0eSh1cHBlckNhc2VQcm9wZXJ0eSkpIHtcbiAgICAgICAgICBzdW1tYXJ5Q2FwaXRhbGl6ZU9iamVjdFt1cHBlckNhc2VQcm9wZXJ0eV0gPSBbXG4gICAgICAgICAgICB7IFtwcm9wZXJ0eV06IG9ialtwcm9wZXJ0eV0gfVxuICAgICAgICAgIF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3VtbWFyeUNhcGl0YWxpemVPYmplY3RbdXBwZXJDYXNlUHJvcGVydHldLnB1c2goe1xuICAgICAgICAgICAgW3Byb3BlcnR5XTogb2JqW3Byb3BlcnR5XVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvdW50aW5nIHRoZSBudW1iZXIgb2YgdXBwZXJjYXNlIGxldHRlcnNNbmFcbiAgICAgICAgdXBwZXJDYXNlQ291bnQucHVzaCh7XG4gICAgICAgICAga2V5OiBwcm9wZXJ0eSxcbiAgICAgICAgICBjb3VudDogcHJvcGVydHkucmVwbGFjZSgvW15BLVpdL2csICcnKS5sZW5ndGhcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgY2FwaXRhbGl6ZWRQcm9wZXJ0eSBpbiBzdW1tYXJ5Q2FwaXRhbGl6ZU9iamVjdCkge1xuICAgICAgaWYgKHN1bW1hcnlDYXBpdGFsaXplT2JqZWN0Lmhhc093blByb3BlcnR5KGNhcGl0YWxpemVkUHJvcGVydHkpKSB7XG4gICAgICAgIGlmIChzdW1tYXJ5Q2FwaXRhbGl6ZU9iamVjdC5oYXNPd25Qcm9wZXJ0eShjYXBpdGFsaXplZFByb3BlcnR5KSkge1xuICAgICAgICAgIGNvbnN0IGNhcGl0YWxpemVkUHJvcGVydHlPYmplY3QgPVxuICAgICAgICAgICAgc3VtbWFyeUNhcGl0YWxpemVPYmplY3RbY2FwaXRhbGl6ZWRQcm9wZXJ0eV07XG4gICAgICAgICAgaWYgKGNhcGl0YWxpemVkUHJvcGVydHlPYmplY3QubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAvLyBmb3Igc2luZ2xlIHBhcmFtcyAobm8gZHVwbGljYXRlcylcbiAgICAgICAgICAgIGNvbnN0IHNpbmdsZVBvc3NpYmlsaXR5ID0gY2FwaXRhbGl6ZWRQcm9wZXJ0eU9iamVjdFswXTtcbiAgICAgICAgICAgIGNhcGl0YWxpemVPYmplY3RbY2FwaXRhbGl6ZWRQcm9wZXJ0eV0gPVxuICAgICAgICAgICAgICBzaW5nbGVQb3NzaWJpbGl0eVtPYmplY3Qua2V5cyhzaW5nbGVQb3NzaWJpbGl0eSlbMF1dO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY2FwaXRhbGl6ZWRQcm9wZXJ0eU9iamVjdC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAvLyBkZWZpbmluZyB0aGUgY2xvc2VzdCB0byBsb3dlcmNhc2UgcHJvcGVydHlcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtQ2xvc2VzdFRvTG93ZXJjYXNlID0gdXBwZXJDYXNlQ291bnRcbiAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICBmID0+IGYua2V5LnRvTG93ZXJDYXNlKCkgPT09IGNhcGl0YWxpemVkUHJvcGVydHkudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5yZWR1Y2UoKHByZXYsIGN1cnJlbnQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJldi55IDwgY3VycmVudC55ID8gcHJldiA6IGN1cnJlbnQ7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY2FwaXRhbGl6ZU9iamVjdFtwYXJhbUNsb3Nlc3RUb0xvd2VyY2FzZS5rZXkudG9VcHBlckNhc2UoKV0gPVxuICAgICAgICAgICAgICBvYmpbcGFyYW1DbG9zZXN0VG9Mb3dlcmNhc2Uua2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkocHJvcGVydHkpKSB7XG4gICAgICAgIGRlbGV0ZSBvYmpbcHJvcGVydHldO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gY2FwaXRhbGl6ZU9iamVjdCkge1xuICAgICAgaWYgKGNhcGl0YWxpemVPYmplY3QuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKSB7XG4gICAgICAgIG9ialtwcm9wZXJ0eV0gPSBjYXBpdGFsaXplT2JqZWN0W3Byb3BlcnR5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgcmVtb3ZlVW5kZWZpbmVkKG9iajogb2JqZWN0KTogYW55IHtcbiAgICBjb25zdCBvdXRwdXQgPSB7fTtcbiAgICBpZiAoT2JqZWN0VXRpbHMuaXNPYmplY3Qob2JqKSkge1xuICAgICAgT2JqZWN0LmtleXMob2JqKVxuICAgICAgICAuZmlsdGVyKGtleSA9PiBvYmpba2V5XSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgIGlmIChPYmplY3RVdGlscy5pc09iamVjdChvYmpba2V5XSkgfHwgQXJyYXkuaXNBcnJheShvYmpba2V5XSkpIHtcbiAgICAgICAgICAgIG91dHB1dFtrZXldID0gT2JqZWN0VXRpbHMucmVtb3ZlVW5kZWZpbmVkKG9ialtrZXldKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0cHV0W2tleV0gPSBvYmpba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgIHJldHVybiBvYmoubWFwKG8gPT4gT2JqZWN0VXRpbHMucmVtb3ZlVW5kZWZpbmVkKG8pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgc3RhdGljIHJlbW92ZU51bGwob2JqOiBvYmplY3QpOiBhbnkge1xuICAgIGNvbnN0IG91dHB1dCA9IHt9O1xuICAgIGlmIChPYmplY3RVdGlscy5pc09iamVjdChvYmopKSB7XG4gICAgICBPYmplY3Qua2V5cyhvYmopXG4gICAgICAgIC5maWx0ZXIoa2V5ID0+IG9ialtrZXldICE9PSBudWxsKVxuICAgICAgICAuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgIGlmIChPYmplY3RVdGlscy5pc09iamVjdChvYmpba2V5XSkgfHwgQXJyYXkuaXNBcnJheShvYmpba2V5XSkpIHtcbiAgICAgICAgICAgIG91dHB1dFtrZXldID0gT2JqZWN0VXRpbHMucmVtb3ZlTnVsbChvYmpba2V5XSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dHB1dFtrZXldID0gb2JqW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICByZXR1cm4gb2JqLm1hcChvID0+IE9iamVjdFV0aWxzLnJlbW92ZU51bGwobykpO1xuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBzdGF0aWMgbmF0dXJhbENvbXBhcmUoYSwgYiwgZGlyZWN0aW9uID0gJ2FzYycsIG51bGxzRmlyc3Q/OiBib29sZWFuKSB7XG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gJ2Rlc2MnKSB7XG4gICAgICBiID0gW2EsIChhID0gYildWzBdO1xuICAgIH1cblxuICAgIC8vIG51bGxzRmlyc3QgPSB1bmRlZmluZWQgOiBlbmQgaWYgZGlyZWN0aW9uID0gJ2FzYycsIGZpcnN0IGlmIGRpcmVjdGlvbiA9ICdkZXNjJ1xuICAgIC8vIG51bGxzRmlyc3QgPSB0cnVlIDogYWx3YXlzIGZpcnN0XG4gICAgLy8gbnVsbHNGaXJzdCA9IGZhbHNlIDogYWx3YXlzIGVuZFxuICAgIGlmIChcbiAgICAgIGEgPT09IG51bGwgfHxcbiAgICAgIGEgPT09ICcnIHx8XG4gICAgICBhID09PSB1bmRlZmluZWQgfHxcbiAgICAgIGIgPT09IG51bGwgfHxcbiAgICAgIGIgPT09ICcnIHx8XG4gICAgICBiID09PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIGNvbnN0IG51bGxTY29yZSA9XG4gICAgICAgIGEgPT09IGJcbiAgICAgICAgICA/IDBcbiAgICAgICAgICA6IGEgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gM1xuICAgICAgICAgIDogYiA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyAtM1xuICAgICAgICAgIDogYSA9PT0gbnVsbFxuICAgICAgICAgID8gMlxuICAgICAgICAgIDogYiA9PT0gbnVsbFxuICAgICAgICAgID8gLTJcbiAgICAgICAgICA6IGEgPT09ICcnXG4gICAgICAgICAgPyAxXG4gICAgICAgICAgOiAtMTtcbiAgICAgIGlmIChkaXJlY3Rpb24gPT09ICdkZXNjJykge1xuICAgICAgICByZXR1cm4gbnVsbHNGaXJzdCAhPT0gZmFsc2UgPyBudWxsU2NvcmUgOiBudWxsU2NvcmUgKiAtMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsc0ZpcnN0ID09PSB0cnVlID8gbnVsbFNjb3JlICogLTEgOiBudWxsU2NvcmU7XG4gICAgfVxuXG4gICAgY29uc3QgYXggPSBbXTtcbiAgICBjb25zdCBieCA9IFtdO1xuICAgIGEgPSAnJyArIGE7XG4gICAgYiA9ICcnICsgYjtcblxuICAgIGEucmVwbGFjZSgvKFxcZCspfChcXEQrKS9nLCAoXywgJDEsICQyKSA9PiB7XG4gICAgICBheC5wdXNoKFskMSB8fCBJbmZpbml0eSwgJDIgfHwgJyddKTtcbiAgICB9KTtcblxuICAgIGIucmVwbGFjZSgvKFxcZCspfChcXEQrKS9nLCAoXywgJDEsICQyKSA9PiB7XG4gICAgICBieC5wdXNoKFskMSB8fCBJbmZpbml0eSwgJDIgfHwgJyddKTtcbiAgICB9KTtcblxuICAgIHdoaWxlIChheC5sZW5ndGggJiYgYngubGVuZ3RoKSB7XG4gICAgICBjb25zdCBhbiA9IGF4LnNoaWZ0KCk7XG4gICAgICBjb25zdCBibiA9IGJ4LnNoaWZ0KCk7XG4gICAgICBjb25zdCBubiA9IGFuWzBdIC0gYm5bMF0gfHwgYW5bMV0ubG9jYWxlQ29tcGFyZShiblsxXSk7XG4gICAgICBpZiAobm4pIHtcbiAgICAgICAgcmV0dXJuIG5uO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBheC5sZW5ndGggLSBieC5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRydWUgaWYgdHdvIG9iamVjdCBhcmUgZXF1aXZhbGVudC5cbiAgICogT2JqZWN0cyBhcmUgY29uc2lkZXJlZCBlcXVpdmFsZW50IGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBwcm9wZXJ0aWVzIGFuZFxuICAgKiBpZiBhbGwgb2YgdGhlaXIgcHJvcGVydGllcyAoZmlyc3QtbGV2ZWwgb25seSkgc2hhcmUgdGhlIHNhbWUgdmFsdWUuXG4gICAqIEBwYXJhbSBvYmoxIEZpcnN0IG9iamVjdFxuICAgKiBAcGFyYW0gb2JqMiBTZWNvbmQgb2JqZWN0XG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdHdvIG9iamVjdHMgYXJlciBlcXVpdmFsZW50XG4gICAqL1xuICBzdGF0aWMgb2JqZWN0c0FyZUVxdWl2YWxlbnQob2JqMTogb2JqZWN0LCBvYmoyOiBvYmplY3QpOiBib29sZWFuIHtcbiAgICBpZiAob2JqMSA9PT0gb2JqMikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3Qgb2JqMVByb3BzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqMSk7XG4gICAgY29uc3Qgb2JqMlByb3BzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqMik7XG4gICAgaWYgKG9iajFQcm9wcy5sZW5ndGggIT09IG9iajJQcm9wcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb3Agb2Ygb2JqMVByb3BzKSB7XG4gICAgICBpZiAob2JqMVtwcm9wXSAhPT0gb2JqMltwcm9wXSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgbmV3IG9iamVjdCB3aXRoIGFuIGFycmF5IG9mIGtleXMgcmVtb3ZlZFxuICAgKiBAcGFyYW0gb2JqIFNvdXJjZSBvYmplY3RcbiAgICogQHBhcmFtIGtleXMgS2V5cyB0byByZW1vdmVcbiAgICogQHJldHVybnMgQSBuZXcgb2JqZWN0XG4gICAqL1xuICBzdGF0aWMgcmVtb3ZlS2V5cyhvYmo6IG9iamVjdCwga2V5czogc3RyaW5nW10pOiBvYmplY3Qge1xuICAgIGNvbnN0IG5ld09iaiA9IE9iamVjdC5rZXlzKG9iailcbiAgICAgIC5maWx0ZXIoa2V5ID0+IGtleXMuaW5kZXhPZihrZXkpIDwgMClcbiAgICAgIC5yZWR1Y2UoKF9vYmosIGtleSkgPT4ge1xuICAgICAgICBfb2JqW2tleV0gPSBvYmpba2V5XTtcbiAgICAgICAgcmV0dXJuIF9vYmo7XG4gICAgICB9LCB7fSk7XG5cbiAgICByZXR1cm4gbmV3T2JqO1xuICB9XG59XG4iXX0=
@@ -1,8 +1,8 @@
1
- /** Utility function to create a K:V from a list of strings */
2
- export function strEnum(o) {
3
- return o.reduce((res, key) => {
4
- res[key] = key;
5
- return res;
6
- }, Object.create(null));
7
- }
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZW51bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3V0aWxzL3NyYy9saWIvc3RyZW51bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw4REFBOEQ7QUFDOUQsTUFBTSxVQUFVLE9BQU8sQ0FBbUIsQ0FBVztJQUNuRCxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDM0IsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNmLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFV0aWxpdHkgZnVuY3Rpb24gdG8gY3JlYXRlIGEgSzpWIGZyb20gYSBsaXN0IG9mIHN0cmluZ3MgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHN0ckVudW08VCBleHRlbmRzIHN0cmluZz4obzogQXJyYXk8VD4pOiB7IFtLIGluIFRdOiBLIH0ge1xyXG4gIHJldHVybiBvLnJlZHVjZSgocmVzLCBrZXkpID0+IHtcclxuICAgIHJlc1trZXldID0ga2V5O1xyXG4gICAgcmV0dXJuIHJlcztcclxuICB9LCBPYmplY3QuY3JlYXRlKG51bGwpKTtcclxufVxyXG4iXX0=
1
+ /** Utility function to create a K:V from a list of strings */
2
+ export function strEnum(o) {
3
+ return o.reduce((res, key) => {
4
+ res[key] = key;
5
+ return res;
6
+ }, Object.create(null));
7
+ }
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZW51bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3V0aWxzL3NyYy9saWIvc3RyZW51bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw4REFBOEQ7QUFDOUQsTUFBTSxVQUFVLE9BQU8sQ0FBbUIsQ0FBVztJQUNuRCxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDM0IsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNmLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFV0aWxpdHkgZnVuY3Rpb24gdG8gY3JlYXRlIGEgSzpWIGZyb20gYSBsaXN0IG9mIHN0cmluZ3MgKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJFbnVtPFQgZXh0ZW5kcyBzdHJpbmc+KG86IEFycmF5PFQ+KTogeyBbSyBpbiBUXTogSyB9IHtcbiAgcmV0dXJuIG8ucmVkdWNlKChyZXMsIGtleSkgPT4ge1xuICAgIHJlc1trZXldID0ga2V5O1xuICAgIHJldHVybiByZXM7XG4gIH0sIE9iamVjdC5jcmVhdGUobnVsbCkpO1xufVxuIl19