ngx-sfc-common 0.0.35 → 0.0.36
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/esm2020/lib/components/load-more-button/load-more-button.component.mjs +2 -2
- package/esm2020/lib/components/pagination/pagination.component.mjs +2 -2
- package/esm2020/lib/constants/common.constants.mjs +3 -1
- package/esm2020/lib/enums/color.enum.mjs +43 -0
- package/esm2020/lib/enums/index.mjs +2 -1
- package/esm2020/lib/models/index.mjs +1 -1
- package/esm2020/lib/models/position.model.mjs +2 -0
- package/esm2020/lib/types/index.mjs +1 -1
- package/esm2020/lib/types/primitive.type.mjs +2 -0
- package/esm2020/lib/types/segment.type.mjs +2 -0
- package/esm2020/lib/utils/collections.utils.mjs +16 -1
- package/esm2020/lib/utils/common.utils.mjs +171 -31
- package/esm2020/lib/utils/index.mjs +3 -3
- package/fesm2015/ngx-sfc-common.mjs +236 -36
- package/fesm2015/ngx-sfc-common.mjs.map +1 -1
- package/fesm2020/ngx-sfc-common.mjs +236 -36
- package/fesm2020/ngx-sfc-common.mjs.map +1 -1
- package/lib/constants/common.constants.d.ts +2 -0
- package/lib/enums/color.enum.d.ts +30 -0
- package/lib/enums/index.d.ts +1 -0
- package/lib/models/index.d.ts +1 -0
- package/lib/models/position.model.d.ts +4 -0
- package/lib/types/index.d.ts +1 -0
- package/lib/types/primitive.type.d.ts +1 -0
- package/lib/types/segment.type.d.ts +1 -0
- package/lib/utils/collections.utils.d.ts +7 -0
- package/lib/utils/common.utils.d.ts +25 -9
- package/lib/utils/index.d.ts +2 -2
- package/package.json +1 -1
- package/styles/_colors.scss +1 -1
- package/styles/_mixins.scss +36 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Observable } from 'rxjs';
|
|
2
|
-
import {
|
|
2
|
+
import { toggleItem } from './collections.utils';
|
|
3
3
|
import { isEqualDateTimes } from './date-time.utils';
|
|
4
4
|
/**
|
|
5
5
|
* Return true if value defined
|
|
@@ -227,44 +227,194 @@ export function stopAndPreventPropagation(event) {
|
|
|
227
227
|
/**
|
|
228
228
|
* Update property in object by key
|
|
229
229
|
* @param obj Object to change
|
|
230
|
-
* @param
|
|
230
|
+
* @param key Property to change
|
|
231
231
|
* @param newPropertyValue New property value
|
|
232
|
-
* @param
|
|
232
|
+
* @param options Options for array types
|
|
233
233
|
* @returns Updated object
|
|
234
234
|
*/
|
|
235
|
-
export function updatePropertyByKey(obj,
|
|
235
|
+
export function updatePropertyByKey(obj, key, newPropertyValue, options = {}) {
|
|
236
|
+
const { arrayMode = "toggle", arrayToggleValue = newPropertyValue } = options;
|
|
237
|
+
// Arrays: map recursively over items
|
|
236
238
|
if (Array.isArray(obj)) {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
239
|
+
let changed = false;
|
|
240
|
+
const mapped = obj.map(item => {
|
|
241
|
+
const updated = updatePropertyByKey(item, key, newPropertyValue, options);
|
|
242
|
+
if (updated !== item)
|
|
243
|
+
changed = true;
|
|
244
|
+
return updated;
|
|
241
245
|
});
|
|
246
|
+
return changed ? mapped : obj;
|
|
242
247
|
}
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
248
|
+
// Plain objects: iterate over keys immutably
|
|
249
|
+
if (isObject(obj)) {
|
|
250
|
+
const source = obj;
|
|
251
|
+
let changed = false;
|
|
252
|
+
const result = {};
|
|
253
|
+
for (const propertyKey of Object.keys(source)) {
|
|
254
|
+
const value = source[propertyKey];
|
|
255
|
+
if (propertyKey === key) {
|
|
256
|
+
// Matched key: apply update
|
|
257
|
+
if (Array.isArray(value)) {
|
|
258
|
+
if (arrayMode === "toggle") {
|
|
259
|
+
const updatedArray = toggleItem(value, arrayToggleValue);
|
|
260
|
+
result[propertyKey] = updatedArray;
|
|
261
|
+
if (updatedArray !== value)
|
|
262
|
+
changed = true;
|
|
250
263
|
}
|
|
251
264
|
else {
|
|
252
|
-
|
|
265
|
+
// replace mode
|
|
266
|
+
if (!Array.isArray(newPropertyValue)) {
|
|
267
|
+
throw new Error("arrayMode 'replace' requires newPropertyValue to be an array.");
|
|
268
|
+
}
|
|
269
|
+
const replaced = [...newPropertyValue];
|
|
270
|
+
result[propertyKey] = replaced;
|
|
271
|
+
changed = true;
|
|
253
272
|
}
|
|
254
|
-
updatedObj[key] = obj[key];
|
|
255
273
|
}
|
|
256
274
|
else {
|
|
257
|
-
|
|
275
|
+
// Non-array leaf -> set to newPropertyValue
|
|
276
|
+
result[propertyKey] = newPropertyValue;
|
|
277
|
+
if (result[propertyKey] !== value)
|
|
278
|
+
changed = true;
|
|
258
279
|
}
|
|
259
280
|
}
|
|
260
281
|
else {
|
|
261
|
-
|
|
282
|
+
// Recurse into nested values
|
|
283
|
+
const updatedVal = updatePropertyByKey(value, key, newPropertyValue, options);
|
|
284
|
+
result[propertyKey] = updatedVal;
|
|
285
|
+
if (updatedVal !== value)
|
|
286
|
+
changed = true;
|
|
262
287
|
}
|
|
263
288
|
}
|
|
264
|
-
return
|
|
289
|
+
return changed ? result : obj;
|
|
265
290
|
}
|
|
291
|
+
// Primitives or non-plain objects (Date, Map, etc.): return as-is
|
|
266
292
|
return obj;
|
|
267
293
|
}
|
|
294
|
+
/**
|
|
295
|
+
* Update property in object by path
|
|
296
|
+
* @param obj Object to change
|
|
297
|
+
* @param path Property to change
|
|
298
|
+
* @param newPropertyValue New property value
|
|
299
|
+
* @param previousPropertyValue New property value
|
|
300
|
+
* @param options Options for array types
|
|
301
|
+
* @returns Updated object
|
|
302
|
+
*/
|
|
303
|
+
export function updatePropertyByPath(obj, path, newPropertyValue, previousPropertyValue, options = {}) {
|
|
304
|
+
const { arrayMode = "toggle" } = options;
|
|
305
|
+
const segments = Array.isArray(path) ? path : _pathToSegments(path);
|
|
306
|
+
/**
|
|
307
|
+
* Parses a path string like:
|
|
308
|
+
* - "a.b.c"
|
|
309
|
+
* - "a.b[0].c"
|
|
310
|
+
* - "items[*].tags"
|
|
311
|
+
* into segments: ["a","b",0,"c"] or ["items","*", "tags"]
|
|
312
|
+
*
|
|
313
|
+
* Supported:
|
|
314
|
+
* - Dot notation
|
|
315
|
+
* - Bracket numbers: [0]
|
|
316
|
+
* - Wildcard: [*] or .* (as a segment "*")
|
|
317
|
+
*
|
|
318
|
+
* Not supported:
|
|
319
|
+
* - Quoted property names in brackets (e.g., ["foo bar"])
|
|
320
|
+
* - Escaped dots in keys
|
|
321
|
+
* @param path Property path
|
|
322
|
+
* @returns Path segments
|
|
323
|
+
*/
|
|
324
|
+
function _pathToSegments(path) {
|
|
325
|
+
// Normalize brackets to dot form (e.g., a[0].b -> a.0.b, a[*].b -> a.*.b)
|
|
326
|
+
const normalized = path
|
|
327
|
+
.replace(/\[(\d+)\]/g, ".$1")
|
|
328
|
+
.replace(/\[\*\]/g, ".*");
|
|
329
|
+
const rawSegments = normalized.split(".").filter(s => s.length > 0);
|
|
330
|
+
return rawSegments.map(seg => {
|
|
331
|
+
if (seg === "*")
|
|
332
|
+
return "*";
|
|
333
|
+
const n = Number(seg);
|
|
334
|
+
if (!Number.isNaN(n) && seg.trim() !== "" && String(n) === seg) {
|
|
335
|
+
return n;
|
|
336
|
+
}
|
|
337
|
+
return seg;
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
function _apply(current, remaining) {
|
|
341
|
+
// Base: reached target path
|
|
342
|
+
if (remaining.length === 0) {
|
|
343
|
+
if (Array.isArray(current)) {
|
|
344
|
+
if (arrayMode === "toggle") {
|
|
345
|
+
return toggleItem(current, previousPropertyValue);
|
|
346
|
+
}
|
|
347
|
+
// replace mode
|
|
348
|
+
if (!Array.isArray(newPropertyValue)) {
|
|
349
|
+
throw new Error("arrayMode 'replace' requires newPropertyValue to be an array.");
|
|
350
|
+
}
|
|
351
|
+
return [...newPropertyValue];
|
|
352
|
+
}
|
|
353
|
+
// Non-array leaf -> set to newPropertyValue
|
|
354
|
+
return newPropertyValue;
|
|
355
|
+
}
|
|
356
|
+
const [seg, ...rest] = remaining;
|
|
357
|
+
// Wildcard handling
|
|
358
|
+
if (seg === "*") {
|
|
359
|
+
if (Array.isArray(current)) {
|
|
360
|
+
// Map each element
|
|
361
|
+
return current.map(item => _apply(item, rest));
|
|
362
|
+
}
|
|
363
|
+
if (isObject(current)) {
|
|
364
|
+
const objCurr = current;
|
|
365
|
+
const result = {};
|
|
366
|
+
for (const key of Object.keys(objCurr)) {
|
|
367
|
+
result[key] = _apply(objCurr[key], rest);
|
|
368
|
+
}
|
|
369
|
+
return result;
|
|
370
|
+
}
|
|
371
|
+
// If not object/array, nothing to expand -> return as-is
|
|
372
|
+
return current;
|
|
373
|
+
}
|
|
374
|
+
// Numeric index -> navigate arrays
|
|
375
|
+
if (typeof seg === "number") {
|
|
376
|
+
if (!Array.isArray(current)) {
|
|
377
|
+
// Path expects array here, but current isn't an array => no-op
|
|
378
|
+
return current;
|
|
379
|
+
}
|
|
380
|
+
const arr = current;
|
|
381
|
+
if (seg < 0 || seg >= arr.length) {
|
|
382
|
+
// Out of bounds -> no-op (alternatively, you could extend the array)
|
|
383
|
+
return current;
|
|
384
|
+
}
|
|
385
|
+
const updatedItem = _apply(arr[seg], rest);
|
|
386
|
+
if (updatedItem === arr[seg]) {
|
|
387
|
+
return current; // no structural change
|
|
388
|
+
}
|
|
389
|
+
const newArr = arr.slice();
|
|
390
|
+
newArr[seg] = updatedItem;
|
|
391
|
+
return newArr;
|
|
392
|
+
}
|
|
393
|
+
// String key -> navigate objects
|
|
394
|
+
if (isObject(current)) {
|
|
395
|
+
const objCurr = current;
|
|
396
|
+
const nextVal = objCurr[seg];
|
|
397
|
+
const updatedVal = _apply(nextVal, rest);
|
|
398
|
+
if (updatedVal === nextVal) {
|
|
399
|
+
return current; // no structural change
|
|
400
|
+
}
|
|
401
|
+
return { ...objCurr, [seg]: updatedVal };
|
|
402
|
+
}
|
|
403
|
+
// If we cannot traverse further (e.g., null, primitive, or array when expecting object) -> no-op
|
|
404
|
+
return current;
|
|
405
|
+
}
|
|
406
|
+
return _apply(obj, segments);
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Get changed property key
|
|
410
|
+
* @param previous Previous value
|
|
411
|
+
* @param current Currency value
|
|
412
|
+
* @returns Key of property that was changed
|
|
413
|
+
*/
|
|
414
|
+
export function findChangedPropertyKey(previous, current) {
|
|
415
|
+
const path = findChangedPropertyPath(previous, current), parts = path?.split('.');
|
|
416
|
+
return parts && parts.length ? parts[parts.length - 1] : undefined;
|
|
417
|
+
}
|
|
268
418
|
/**
|
|
269
419
|
* Get changed property path
|
|
270
420
|
* @param previous Previous value
|
|
@@ -289,16 +439,6 @@ export function findChangedPropertyPath(previous, current, parentKey = '') {
|
|
|
289
439
|
}
|
|
290
440
|
return null;
|
|
291
441
|
}
|
|
292
|
-
/**
|
|
293
|
-
* Get changed property key
|
|
294
|
-
* @param previous Previous value
|
|
295
|
-
* @param current Currency value
|
|
296
|
-
* @returns Key of property that was changed
|
|
297
|
-
*/
|
|
298
|
-
export function findChangedPropertyKey(previous, current) {
|
|
299
|
-
const path = findChangedPropertyPath(previous, current), parts = path?.split('.');
|
|
300
|
-
return parts && parts.length ? parts[parts.length - 1] : undefined;
|
|
301
|
-
}
|
|
302
442
|
/**
|
|
303
443
|
* Clone object without any reference
|
|
304
444
|
* @param value Object to clone
|
|
@@ -307,4 +447,4 @@ export function findChangedPropertyKey(previous, current) {
|
|
|
307
447
|
export function deepClone(value) {
|
|
308
448
|
return JSON.parse(JSON.stringify(value));
|
|
309
449
|
}
|
|
310
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNmYy1jb21tb24vc3JjL2xpYi91dGlscy9jb21tb24udXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVsQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVyRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBSSxLQUEyQjtJQUN0RCxPQUFVLEtBQUssS0FBSyxTQUFTLElBQU8sS0FBSyxLQUFLLElBQUksQ0FBQztBQUNyRCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQUMsS0FBVTtJQUNqQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7V0FDaEQsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztXQUNyQixDQUFDLENBQUMsS0FBSyxZQUFZLElBQUksSUFBSSxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsSUFBUztJQUNuQyxPQUFPLElBQUksWUFBWSxVQUFVLENBQUM7QUFDcEMsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxHQUFRLEVBQUUsUUFBZ0IsRUFBRSxRQUFhLElBQUk7SUFDL0UsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQ3hELElBQUksTUFBTSxHQUFRLEVBQUUsQ0FB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bSAncnhqcyc7XHJcbmltcG9ydCB7IGVtcHR5IH0gZnJvbSAnLi4vdHlwZXMnO1xyXG5pbXBvcnQgeyBhZGRJdGVtLCBoYXNJdGVtLCByZW1vdmVJdGVtIH0gZnJvbSAnLi9jb2xsZWN0aW9ucy51dGlscyc7XHJcbmltcG9ydCB7IGlzRXF1YWxEYXRlVGltZXMgfSBmcm9tICcuL2RhdGUtdGltZS51dGlscyc7XHJcblxyXG4vKipcclxuICogUmV0dXJuIHRydWUgaWYgdmFsdWUgZGVmaW5lZFxyXG4gKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gY2hlY2tcclxuICogQHJldHVybnMgVHJ1ZSBpZiB2YWx1ZSBpcyBub3QgbnVsbCBhbmQgZGVmaW5lZFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzRGVmaW5lZDxUPih2YWx1ZTogVCB8IHVuZGVmaW5lZCB8IG51bGwpOiBib29sZWFuIHtcclxuICByZXR1cm4gPFQ+dmFsdWUgIT09IHVuZGVmaW5lZCAmJiA8VD52YWx1ZSAhPT0gbnVsbDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybiB0cnVlIGlmIHZhbHVlIGlzIG9iamVjdFxyXG4gKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gY2hlY2tcclxuICogQHJldHVybnMgVHJ1ZSBpZiB2YWx1ZSBpcyBvYmplY3RcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdCh2YWx1ZTogYW55KTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIChpc0RlZmluZWQodmFsdWUpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCdcclxuICAgICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxyXG4gICAgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIERhdGUgfHwgdmFsdWUgaW5zdGFuY2VvZiBGaWxlKSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gdHJ1ZSBpZiBkYXRhIGlzIG9ic2VydmFibGVcclxuICogQHBhcmFtIGRhdGEgT2JqZWN0IHRvIGNoZWNrXHJcbiAqIEByZXR1cm5zIFRydWUgaWYgZGF0YSBpcyBvYnNlcnZhYmxlXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaXNBc3luY0RhdGEoZGF0YTogYW55KSB7XHJcbiAgcmV0dXJuIGRhdGEgaW5zdGFuY2VvZiBPYnNlcnZhYmxlO1xyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJuIGV4dGVuZGVkIG9iamVjdCB3aXRoIG5ldyBwcm9wZXJ0eVxyXG4gKiBAcGFyYW0gb2JqIE9iamVjdCB0byBleHRlbmQgYnkgcHJvcGVydHlcclxuICogQHBhcmFtIHByb3BlcnR5IE5ldyBwcm9wZXJ0eSBuYW1lIFxyXG4gKiBAcGFyYW0gdmFsdWUgVmFsdWUgZm9yIG5ldyBwcm9wZXJ0eVxyXG4gKiBAcmV0dXJucyBFeHRlbmRlZCBvYmplY3Qgd2l0aCBuZXcgcHJvcGVydHlcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRQcm9wZXJ0eVRvT2JqZWN0KG9iajogYW55LCBwcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZTogYW55ID0gbnVsbCk6IGFueSB7XHJcbiAgaWYgKGlzRGVmaW5lZChwcm9wZXJ0eSkgJiYgIW9iai5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHtcclxuICAgIGxldCBuZXdPYmo6IGFueSA9IHt9O1xyXG4gICAgbmV3T2JqW3Byb3BlcnR5XSA9IHZhbHVlO1xyXG4gICAgb2JqID0geyAuLi5vYmosIC4uLm5ld09iaiB9O1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG9iajtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlbW92ZSBwcm9wZXJ0eSBmcm9tIG9iamVjdFxyXG4gKiBAcGFyYW0gb2JqIE9iamVjdCBmb3IgcmVtb3ZpbmcgcHJvcGVydHlcclxuICogQHBhcmFtIHByb3BlcnR5IFByb3BlcnR5IG5hbWUgdG8gcmVtb3ZlXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlUHJvcGVydHlGcm9tT2JqZWN0KG9iajogYW55LCBwcm9wZXJ0eTogc3RyaW5nKTogdm9pZCB7XHJcbiAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHtcclxuICAgIGRlbGV0ZSBvYmpbcHJvcGVydHldO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIERlZXAgbWVyZ2Ugb2JqZWN0IHdpdGggb3RoZXJzXHJcbiAqIEBwYXJhbSB0YXJnZXQgIE9iamVjdCB0byBtZXJnZVxyXG4gKiBAcGFyYW0gc291cmNlcyBPYmplY3RzIHRvIGJlIG1lcmdlZCB3aXRoIHRhcmdldFxyXG4gKiBAcmV0dXJucyBNZXJnZWQgb2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VEZWVwKHRhcmdldDogYW55LCAuLi5zb3VyY2VzOiBhbnlbXSk6IGFueSB7XHJcbiAgaWYgKCFzb3VyY2VzLmxlbmd0aClcclxuICAgIHJldHVybiB0YXJnZXQ7XHJcblxyXG4gIGNvbnN0IHNvdXJjZSA9IHNvdXJjZXMuc2hpZnQoKTtcclxuXHJcbiAgaWYgKGlzT2JqZWN0KHRhcmdldCkgJiYgaXNPYmplY3Qoc291cmNlKSkge1xyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gc291cmNlKSB7XHJcbiAgICAgIGlmIChpc09iamVjdChzb3VyY2Vba2V5XSkpIHtcclxuICAgICAgICBpZiAoIXRhcmdldFtrZXldKSBPYmplY3QuYXNzaWduKHRhcmdldCwgeyBba2V5XToge30gfSk7XHJcbiAgICAgICAgbWVyZ2VEZWVwKHRhcmdldFtrZXldLCBzb3VyY2Vba2V5XSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHsgW2tleV06IHNvdXJjZVtrZXldIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gbWVyZ2VEZWVwKHRhcmdldCwgLi4uc291cmNlcyk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgdHlwZSdzIHByb3BlcnR5IG5hbWUgc2FmZXR5XHJcbiAqIEBwYXJhbSBuYW1lIEtleU9mIHByb3BlcnR5XHJcbiAqIEByZXR1cm5zIFR5cGUncyBwcm9wZXJ0eSBuYW1lXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbmFtZW9mID0gPFQ+KG5hbWU6IGtleW9mIFQpID0+IG5hbWU7XHJcblxyXG4vKipcclxuICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBpbnB1dCBpcyBhIE51bWJlciBvciBzb21ldGhpbmcgdGhhdCBjYW4gYmUgY29lcmNlZCB0byBhIE51bWJlclxyXG4gICAqIEBwYXJhbSBudW1iZXIgVGhlIGlucHV0IHRvIGJlIHRlc3RlZFxyXG4gICAqIEByZXR1cm5zIC0gQW4gaW5kaWNhdGlvbiBpZiB0aGUgaW5wdXQgaXMgYSBOdW1iZXIgb3IgY2FuIGJlIGNvZXJjZWQgdG8gYSBOdW1iZXJcclxuICAgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtZXJpYyhudW1iZXI6IGFueSk6IGJvb2xlYW4ge1xyXG4gIHJldHVybiAhaXNOYU4ocGFyc2VGbG9hdChudW1iZXIpKTtcclxufVxyXG5cclxuLyoqXHJcbiAqICBEZXRlcm1pbmVzIGlmIHRoZSBpbnB1dCBpcyBhIHN0cmluZ1xyXG4gKiBAcGFyYW0gdmFsdWUgVGhlIGlucHV0IHRvIGJlIHRlc3RlZFxyXG4gKiBAcmV0dXJucyBBbiBpbmRpY2F0aW9uIGlmIHRoZSBpbnB1dCBpcyBhIHN0cmluZ1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcclxuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybiB0cnVlIGlmIGN1cnJlbnQgYnJvd3NlciBpcyBDaHJvbWVcclxuICogQHJldHVybnMgSWYgY3VycmVudCBicm93c2VyIGlzIENocm9tZVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2hyb21lQnJvd3NlcigpOiBib29sZWFuIHtcclxuICByZXR1cm4gL0Nocm9tZS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiAvR29vZ2xlIEluYy8udGVzdChuYXZpZ2F0b3IudmVuZG9yKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybiB0cnVlIGlmIHZhbHVlIGlzIHZhbGlkIGVtYWlsIGFkZHJlc3NcclxuICogQHJldHVybnMgVHJ1ZSBpZiBpdCdzIHZhbGlkIGVtYWlsIGFkZHJlc3NcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0VtYWlsKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICByZXR1cm4gaXNEZWZpbmVkKHZhbHVlLm1hdGNoKFxyXG4gICAgL14oKFtePD4oKVtcXF1cXFxcLiw7Olxcc0BcXFwiXSsoXFwuW148PigpW1xcXVxcXFwuLDs6XFxzQFxcXCJdKykqKXwoXFxcIi4rXFxcIikpQCgoXFxbWzAtOV17MSwzfVxcLlswLTldezEsM31cXC5bMC05XXsxLDN9XFwuWzAtOV17MSwzfVxcXSl8KChbYS16QS1aXFwtMC05XStcXC4pK1thLXpBLVpdezIsfSkpJC9cclxuICApKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybiB0cnVlIGlmIHN0cmluZyBpcyBcInRydWVcIlxyXG4gKiBAcmV0dXJucyBwYXJzZWQgc3RyaW5nIGFzIGJvb2xlYW5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUJvb2xlYW4odmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gIHJldHVybiAvXnRydWUkL2kudGVzdCh2YWx1ZSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gdHJ1ZSBpZiB2YWx1ZXMgZXF1YWxcclxuICogQHBhcmFtIG9iajEgRmlyc3QgdmFsdWUgdG8gY29tcGFyZVxyXG4gKiBAcGFyYW0gb2JqMiBTZWNvbmQgdmFsdWUgdG8gY29tcGFyZVxyXG4gKiBAcmV0dXJucyBUcnVlIGlmIGVxdWFsXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaXNFcXVhbChvYmoxOiBhbnksIG9iajI6IGFueSkge1xyXG4gIC8qKlxyXG4gICAqIE1vcmUgYWNjdXJhdGVseSBjaGVjayB0aGUgdHlwZSBvZiBhIEphdmFTY3JpcHQgb2JqZWN0XHJcbiAgICogQHBhcmFtICB7T2JqZWN0fSBvYmogVGhlIG9iamVjdFxyXG4gICAqIEByZXR1cm4ge1N0cmluZ30gICAgIFRoZSBvYmplY3QgdHlwZVxyXG4gICAqL1xyXG4gIGZ1bmN0aW9uIGdldFR5cGUob2JqOiBhbnkpIHtcclxuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKS5zbGljZSg4LCAtMSkudG9Mb3dlckNhc2UoKTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGFyZUFycmF5c0VxdWFsKCkge1xyXG5cclxuICAgIC8vIENoZWNrIGxlbmd0aFxyXG4gICAgaWYgKG9iajEubGVuZ3RoICE9PSBvYmoyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8vIENoZWNrIGVhY2ggaXRlbSBpbiB0aGUgYXJyYXlcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqMS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoIWlzRXF1YWwob2JqMVtpXSwgb2JqMltpXSkpIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiBubyBlcnJvcnMsIHJldHVybiB0cnVlXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBhcmVPYmplY3RzRXF1YWwoKSB7XHJcblxyXG4gICAgaWYgKE9iamVjdC5rZXlzKG9iajEpLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMob2JqMikubGVuZ3RoKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLy8gQ2hlY2sgZWFjaCBpdGVtIGluIHRoZSBvYmplY3RcclxuICAgIGZvciAobGV0IGtleSBpbiBvYmoxKSB7XHJcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqMSwga2V5KSkge1xyXG4gICAgICAgIGlmICghaXNFcXVhbChvYmoxW2tleV0sIG9iajJba2V5XSkpIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiBubyBlcnJvcnMsIHJldHVybiB0cnVlXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGFyZUZpbGVzRXF1YWwoKSB7XHJcbiAgICByZXR1cm4gb2JqMS5sYXN0TW9kaWZpZWQgPT09IG9iajIubGFzdE1vZGlmaWVkXHJcbiAgICAgICYmIG9iajEuc2l6ZSA9PT0gb2JqMi5zaXplXHJcbiAgICAgICYmIG9iajEudHlwZSA9PT0gb2JqMi50eXBlO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gYXJlRnVuY3Rpb25zRXF1YWwoKSB7XHJcbiAgICByZXR1cm4gb2JqMS50b1N0cmluZygpID09PSBvYmoyLnRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBhcmVQcmltYXRpdmVzRXF1YWwoKSB7XHJcbiAgICByZXR1cm4gb2JqMSA9PT0gb2JqMjtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGFyZURhdGVzRXF1YWwoKSB7XHJcbiAgICByZXR1cm4gaXNFcXVhbERhdGVUaW1lcyhvYmoxLCBvYmoyKTtcclxuICB9XHJcblxyXG4gIC8vIEdldCB0aGUgb2JqZWN0IHR5cGVcclxuICBsZXQgdHlwZSA9IGdldFR5cGUob2JqMSk7XHJcblxyXG4gIC8vIElmIHRoZSB0d28gaXRlbXMgYXJlIG5vdCB0aGUgc2FtZSB0eXBlLCByZXR1cm4gZmFsc2VcclxuICBpZiAodHlwZSAhPT0gZ2V0VHlwZShvYmoyKSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAvLyBDb21wYXJlIGJhc2VkIG9uIHR5cGVcclxuICBpZiAodHlwZSA9PT0gJ2FycmF5JykgcmV0dXJuIGFyZUFycmF5c0VxdWFsKCk7XHJcblxyXG4gIGlmICh0eXBlID09PSAnZGF0ZScpIHJldHVybiBhcmVEYXRlc0VxdWFsKCk7XHJcblxyXG4gIGlmICh0eXBlID09PSAnZmlsZScpIHJldHVybiBhcmVGaWxlc0VxdWFsKCk7XHJcblxyXG4gIGlmICh0eXBlID09PSAnb2JqZWN0JykgcmV0dXJuIGFyZU9iamVjdHNFcXVhbCgpO1xyXG5cclxuICBpZiAodHlwZSA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGFyZUZ1bmN0aW9uc0VxdWFsKCk7XHJcblxyXG4gIHJldHVybiBhcmVQcmltYXRpdmVzRXF1YWwoKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlIHVuaXF1ZSBpZGVudGlmaWNhdG9yXHJcbiAqIEByZXR1cm5zIFJhbmRvbSBHVUlEXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVHdWlkKCk6IHN0cmluZyB7XHJcbiAgbGV0IFM0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuICgoKDEgKyBNYXRoLnJhbmRvbSgpKSAqIDB4MTAwMDApIHwgMCkudG9TdHJpbmcoMTYpLnN1YnN0cmluZygxKTtcclxuICB9O1xyXG4gIHJldHVybiAoUzQoKSArIFM0KCkgKyBcIi1cIiArIFM0KCkgKyBcIi1cIiArIFM0KCkgKyBcIi1cIiArIFM0KCkgKyBcIi1cIiArIFM0KCkgKyBTNCgpICsgUzQoKSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVjayBpZiB2YWx1ZSBpcyBKc29uIHBhcnNhYmxlIHN0cmluZ1xyXG4gKiBAcGFyYW0gdmFsdWUgc3RyaW5nIHZhbHVlXHJcbiAqIEByZXR1cm5zIFRydWUgaWYgc3RyaW5nIGNhbiBiZSBKU09OIHBhcnNlZFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzSnNvblN0cmluZyh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKHZhbHVlKTtcclxuICAgIHJldHVybiAodHlwZW9mIGpzb24gPT09ICdvYmplY3QnKTtcclxuICB9IGNhdGNoIChlKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogU3RvcCBwcm9wYWdhdGlvbiBhbmQgcHJldmVudCBkZWZhdWx0XHJcbiAqIEBwYXJhbSBldmVudCBFdmVudCBvYmplY3RcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBzdG9wQW5kUHJldmVudFByb3BhZ2F0aW9uKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBVcGRhdGUgcHJvcGVydHkgaW4gb2JqZWN0IGJ5IGtleVxyXG4gKiBAcGFyYW0gb2JqIE9iamVjdCB0byBjaGFuZ2VcclxuICogQHBhcmFtIHByb3BlcnR5S2V5IFByb3BlcnR5IHRvIGNoYW5nZVxyXG4gKiBAcGFyYW0gbmV3UHJvcGVydHlWYWx1ZSBOZXcgcHJvcGVydHkgdmFsdWVcclxuICogQHBhcmFtIG9sZFByb3BlcnR5VmFsdWUgT2xkIHByb3BlcnR5IHZhbHVlXHJcbiAqIEByZXR1cm5zIFVwZGF0ZWQgb2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlUHJvcGVydHlCeUtleShcclxuICBvYmo6IGFueSxcclxuICBwcm9wZXJ0eUtleTogc3RyaW5nLFxyXG4gIG5ld1Byb3BlcnR5VmFsdWU6IGFueSxcclxuICBvbGRQcm9wZXJ0eVZhbHVlOiBhbnlcclxuKTogYW55IHtcclxuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XHJcbiAgICByZXR1cm4gb2JqLm1hcChpdGVtID0+IHtcclxuICAgICAgcmV0dXJuIGlzT2JqZWN0KGl0ZW0pICYmIGl0ZW0gIT09IG51bGxcclxuICAgICAgICA/IHVwZGF0ZVByb3BlcnR5QnlLZXkoaXRlbSwgcHJvcGVydHlLZXksIG5ld1Byb3BlcnR5VmFsdWUsIG9sZFByb3BlcnR5VmFsdWUpXHJcbiAgICAgICAgOiBpdGVtO1xyXG4gICAgfSk7XHJcbiAgfSBlbHNlIGlmIChpc09iamVjdChvYmopICYmIG9iaiAhPT0gbnVsbCkge1xyXG4gICAgY29uc3QgdXBkYXRlZE9iajogYW55ID0ge307XHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcclxuICAgICAgaWYgKGtleSA9PT0gcHJvcGVydHlLZXkpIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmpba2V5XSkpIHtcclxuICAgICAgICAgIGlmIChoYXNJdGVtKG9ialtrZXldLCBvbGRQcm9wZXJ0eVZhbHVlKSkge1xyXG4gICAgICAgICAgICByZW1vdmVJdGVtKG9ialtrZXldLCBvbGRQcm9wZXJ0eVZhbHVlKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGFkZEl0ZW0ob2JqW2tleV0sIG9sZFByb3BlcnR5VmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHVwZGF0ZWRPYmpba2V5XSA9IG9ialtrZXldO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB1cGRhdGVkT2JqW2tleV0gPSBuZXdQcm9wZXJ0eVZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB1cGRhdGVkT2JqW2tleV0gPSB1cGRhdGVQcm9wZXJ0eUJ5S2V5KG9ialtrZXldLCBwcm9wZXJ0eUtleSwgbmV3UHJvcGVydHlWYWx1ZSwgb2xkUHJvcGVydHlWYWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdXBkYXRlZE9iajtcclxuICB9XHJcblxyXG4gIHJldHVybiBvYmo7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgY2hhbmdlZCBwcm9wZXJ0eSBwYXRoXHJcbiAqIEBwYXJhbSBwcmV2aW91cyBQcmV2aW91cyB2YWx1ZSBcclxuICogQHBhcmFtIGN1cnJlbnQgQ3VycmVuY3kgdmFsdWVcclxuICogQHBhcmFtIHBhcmVudEtleSBQYXJlbnQgb2JqZWN0IGtleSBuYW1lXHJcbiAqIEByZXR1cm5zIFBhdGggb2YgcHJvcGVydHkgdGhhdCB3YXMgY2hhbmdlZFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRDaGFuZ2VkUHJvcGVydHlQYXRoKHByZXZpb3VzOiBhbnksIGN1cnJlbnQ6IGFueSwgcGFyZW50S2V5ID0gJycpOiBzdHJpbmcgfCBlbXB0eSB7XHJcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY3VycmVudCkpIHtcclxuICAgIGNvbnN0IGZ1bGxLZXk6IHN0cmluZyA9IHBhcmVudEtleSA/IGAke3BhcmVudEtleX0uJHtrZXl9YCA6IGtleTtcclxuXHJcbiAgICBpZiAoaXNPYmplY3QoY3VycmVudFtrZXldKSAmJiBjdXJyZW50W2tleV0gIT09IG51bGwgJiYgcHJldmlvdXNba2V5XSkge1xyXG4gICAgICBjb25zdCBuZXN0ZWRDaGFuZ2UgPSBmaW5kQ2hhbmdlZFByb3BlcnR5UGF0aChwcmV2aW91c1trZXldLCBjdXJyZW50W2tleV0sIGZ1bGxLZXkpO1xyXG5cclxuICAgICAgaWYgKG5lc3RlZENoYW5nZSkge1xyXG4gICAgICAgIHJldHVybiBuZXN0ZWRDaGFuZ2U7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChwcmV2aW91c1trZXldICE9PSBjdXJyZW50W2tleV0pIHtcclxuICAgICAgICByZXR1cm4gZnVsbEtleTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG51bGw7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgY2hhbmdlZCBwcm9wZXJ0eSBrZXlcclxuICogQHBhcmFtIHByZXZpb3VzIFByZXZpb3VzIHZhbHVlXHJcbiAqIEBwYXJhbSBjdXJyZW50IEN1cnJlbmN5IHZhbHVlXHJcbiAqIEByZXR1cm5zIEtleSBvZiBwcm9wZXJ0eSB0aGF0IHdhcyBjaGFuZ2VkXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZmluZENoYW5nZWRQcm9wZXJ0eUtleShwcmV2aW91czogYW55LCBjdXJyZW50OiBhbnkpOiBzdHJpbmcgfCBlbXB0eSB7XHJcbiAgY29uc3QgcGF0aDogc3RyaW5nIHwgZW1wdHkgPSBmaW5kQ2hhbmdlZFByb3BlcnR5UGF0aChwcmV2aW91cywgY3VycmVudCksXHJcbiAgICBwYXJ0cyA9IHBhdGg/LnNwbGl0KCcuJyk7XHJcblxyXG4gIHJldHVybiBwYXJ0cyAmJiBwYXJ0cy5sZW5ndGggPyBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcclxufVxyXG5cclxuLyoqXHJcbiAqIENsb25lIG9iamVjdCB3aXRob3V0IGFueSByZWZlcmVuY2VcclxuICogQHBhcmFtIHZhbHVlICBPYmplY3QgdG8gY2xvbmVcclxuICogQHJldHVybnMgQ2xvbmVkIG9iamVjdFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBDbG9uZSh2YWx1ZTogYW55KTogYW55IHtcclxuICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xyXG59Il19
|
|
450
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNmYy1jb21tb24vc3JjL2xpYi91dGlscy9jb21tb24udXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUdsQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFckQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUksS0FBMkI7SUFDdEQsT0FBVSxLQUFLLEtBQUssU0FBUyxJQUFPLEtBQUssS0FBSyxJQUFJLENBQUM7QUFDckQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUFDLEtBQVU7SUFDakMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1dBQ2hELENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7V0FDckIsQ0FBQyxDQUFDLEtBQUssWUFBWSxJQUFJLElBQUksS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLElBQVM7SUFDbkMsT0FBTyxJQUFJLFlBQVksVUFBVSxDQUFDO0FBQ3BDLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsR0FBUSxFQUFFLFFBQWdCLEVBQUUsUUFBYSxJQUFJO0lBQy9FLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUN4RCxJQUFJLE1BQU0sR0FBUSxFQUFFLENBQUM7UUFDckIsTUFBTSxDQUFDLFFB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QUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNyRSxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLFFBQWEsRUFBRSxPQUFZLEVBQUUsWUFBb0IsRUFBRTtJQUN6RixLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDdEMsTUFBTSxPQUFPLEdBQVcsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBRWhFLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3BFLE1BQU0sWUFBWSxHQUFHLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFFbkYsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLE9BQU8sWUFBWSxDQUFDO2FBQ3JCO1NBQ0Y7YUFBTTtZQUNMLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDbEMsT0FBTyxPQUFPLENBQUM7YUFDaEI7U0FDRjtLQUNGO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsS0FBVTtJQUNsQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGVtcHR5IH0gZnJvbSAnLi4vdHlwZXMnO1xyXG5pbXBvcnQgeyBzZWdtZW50IH0gZnJvbSAnLi4vdHlwZXMvc2VnbWVudC50eXBlJztcclxuaW1wb3J0IHsgdG9nZ2xlSXRlbSB9IGZyb20gJy4vY29sbGVjdGlvbnMudXRpbHMnO1xyXG5pbXBvcnQgeyBpc0VxdWFsRGF0ZVRpbWVzIH0gZnJvbSAnLi9kYXRlLXRpbWUudXRpbHMnO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybiB0cnVlIGlmIHZhbHVlIGRlZmluZWRcclxuICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIGNoZWNrXHJcbiAqIEByZXR1cm5zIFRydWUgaWYgdmFsdWUgaXMgbm90IG51bGwgYW5kIGRlZmluZWRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0RlZmluZWQ8VD4odmFsdWU6IFQgfCB1bmRlZmluZWQgfCBudWxsKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIDxUPnZhbHVlICE9PSB1bmRlZmluZWQgJiYgPFQ+dmFsdWUgIT09IG51bGw7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gdHJ1ZSBpZiB2YWx1ZSBpcyBvYmplY3RcclxuICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIGNoZWNrXHJcbiAqIEByZXR1cm5zIFRydWUgaWYgdmFsdWUgaXMgb2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xyXG4gIHJldHVybiAoaXNEZWZpbmVkKHZhbHVlKSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnXHJcbiAgICAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSlcclxuICAgICYmICEodmFsdWUgaW5zdGFuY2VvZiBEYXRlIHx8IHZhbHVlIGluc3RhbmNlb2YgRmlsZSkpO1xyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJuIHRydWUgaWYgZGF0YSBpcyBvYnNlcnZhYmxlXHJcbiAqIEBwYXJhbSBkYXRhIE9iamVjdCB0byBjaGVja1xyXG4gKiBAcmV0dXJucyBUcnVlIGlmIGRhdGEgaXMgb2JzZXJ2YWJsZVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzQXN5bmNEYXRhKGRhdGE6IGFueSkge1xyXG4gIHJldHVybiBkYXRhIGluc3RhbmNlb2YgT2JzZXJ2YWJsZTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybiBleHRlbmRlZCBvYmplY3Qgd2l0aCBuZXcgcHJvcGVydHlcclxuICogQHBhcmFtIG9iaiBPYmplY3QgdG8gZXh0ZW5kIGJ5IHByb3BlcnR5XHJcbiAqIEBwYXJhbSBwcm9wZXJ0eSBOZXcgcHJvcGVydHkgbmFtZSBcclxuICogQHBhcmFtIHZhbHVlIFZhbHVlIGZvciBuZXcgcHJvcGVydHlcclxuICogQHJldHVybnMgRXh0ZW5kZWQgb2JqZWN0IHdpdGggbmV3IHByb3BlcnR5XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYWRkUHJvcGVydHlUb09iamVjdChvYmo6IGFueSwgcHJvcGVydHk6IHN0cmluZywgdmFsdWU6IGFueSA9IG51bGwpOiBhbnkge1xyXG4gIGlmIChpc0RlZmluZWQocHJvcGVydHkpICYmICFvYmouaGFzT3duUHJvcGVydHkocHJvcGVydHkpKSB7XHJcbiAgICBsZXQgbmV3T2JqOiBhbnkgPSB7fTtcclxuICAgIG5ld09ialtwcm9wZXJ0eV0gPSB2YWx1ZTtcclxuICAgIG9iaiA9IHsgLi4ub2JqLCAuLi5uZXdPYmogfTtcclxuICB9XHJcblxyXG4gIHJldHVybiBvYmo7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZW1vdmUgcHJvcGVydHkgZnJvbSBvYmplY3RcclxuICogQHBhcmFtIG9iaiBPYmplY3QgZm9yIHJlbW92aW5nIHByb3BlcnR5XHJcbiAqIEBwYXJhbSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lIHRvIHJlbW92ZVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVByb3BlcnR5RnJvbU9iamVjdChvYmo6IGFueSwgcHJvcGVydHk6IHN0cmluZyk6IHZvaWQge1xyXG4gIGlmIChvYmouaGFzT3duUHJvcGVydHkocHJvcGVydHkpKSB7XHJcbiAgICBkZWxldGUgb2JqW3Byb3BlcnR5XTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZWVwIG1lcmdlIG9iamVjdCB3aXRoIG90aGVyc1xyXG4gKiBAcGFyYW0gdGFyZ2V0ICBPYmplY3QgdG8gbWVyZ2VcclxuICogQHBhcmFtIHNvdXJjZXMgT2JqZWN0cyB0byBiZSBtZXJnZWQgd2l0aCB0YXJnZXRcclxuICogQHJldHVybnMgTWVyZ2VkIG9iamVjdFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRGVlcCh0YXJnZXQ6IGFueSwgLi4uc291cmNlczogYW55W10pOiBhbnkge1xyXG4gIGlmICghc291cmNlcy5sZW5ndGgpXHJcbiAgICByZXR1cm4gdGFyZ2V0O1xyXG5cclxuICBjb25zdCBzb3VyY2UgPSBzb3VyY2VzLnNoaWZ0KCk7XHJcblxyXG4gIGlmIChpc09iamVjdCh0YXJnZXQpICYmIGlzT2JqZWN0KHNvdXJjZSkpIHtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIHNvdXJjZSkge1xyXG4gICAgICBpZiAoaXNPYmplY3Qoc291cmNlW2tleV0pKSB7XHJcbiAgICAgICAgaWYgKCF0YXJnZXRba2V5XSkgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHsgW2tleV06IHt9IH0pO1xyXG4gICAgICAgIG1lcmdlRGVlcCh0YXJnZXRba2V5XSwgc291cmNlW2tleV0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7IFtrZXldOiBzb3VyY2Vba2V5XSB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG1lcmdlRGVlcCh0YXJnZXQsIC4uLnNvdXJjZXMpO1xyXG59XHJcblxyXG4vKipcclxuICogR2V0IHR5cGUncyBwcm9wZXJ0eSBuYW1lIHNhZmV0eVxyXG4gKiBAcGFyYW0gbmFtZSBLZXlPZiBwcm9wZXJ0eVxyXG4gKiBAcmV0dXJucyBUeXBlJ3MgcHJvcGVydHkgbmFtZVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG5hbWVvZiA9IDxUPihuYW1lOiBrZXlvZiBUKSA9PiBuYW1lO1xyXG5cclxuLyoqXHJcbiAgICogRGV0ZXJtaW5lcyBpZiB0aGUgaW5wdXQgaXMgYSBOdW1iZXIgb3Igc29tZXRoaW5nIHRoYXQgY2FuIGJlIGNvZXJjZWQgdG8gYSBOdW1iZXJcclxuICAgKiBAcGFyYW0gbnVtYmVyIFRoZSBpbnB1dCB0byBiZSB0ZXN0ZWRcclxuICAgKiBAcmV0dXJucyAtIEFuIGluZGljYXRpb24gaWYgdGhlIGlucHV0IGlzIGEgTnVtYmVyIG9yIGNhbiBiZSBjb2VyY2VkIHRvIGEgTnVtYmVyXHJcbiAgICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc051bWVyaWMobnVtYmVyOiBhbnkpOiBib29sZWFuIHtcclxuICByZXR1cm4gIWlzTmFOKHBhcnNlRmxvYXQobnVtYmVyKSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiAgRGV0ZXJtaW5lcyBpZiB0aGUgaW5wdXQgaXMgYSBzdHJpbmdcclxuICogQHBhcmFtIHZhbHVlIFRoZSBpbnB1dCB0byBiZSB0ZXN0ZWRcclxuICogQHJldHVybnMgQW4gaW5kaWNhdGlvbiBpZiB0aGUgaW5wdXQgaXMgYSBzdHJpbmdcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmluZyh2YWx1ZTogYW55KTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gdHJ1ZSBpZiBjdXJyZW50IGJyb3dzZXIgaXMgQ2hyb21lXHJcbiAqIEByZXR1cm5zIElmIGN1cnJlbnQgYnJvd3NlciBpcyBDaHJvbWVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0Nocm9tZUJyb3dzZXIoKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIC9DaHJvbWUvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgL0dvb2dsZSBJbmMvLnRlc3QobmF2aWdhdG9yLnZlbmRvcik7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gdHJ1ZSBpZiB2YWx1ZSBpcyB2YWxpZCBlbWFpbCBhZGRyZXNzXHJcbiAqIEByZXR1cm5zIFRydWUgaWYgaXQncyB2YWxpZCBlbWFpbCBhZGRyZXNzXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaXNFbWFpbCh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIGlzRGVmaW5lZCh2YWx1ZS5tYXRjaChcclxuICAgIC9eKChbXjw+KClbXFxdXFxcXC4sOzpcXHNAXFxcIl0rKFxcLltePD4oKVtcXF1cXFxcLiw7Olxcc0BcXFwiXSspKil8KFxcXCIuK1xcXCIpKUAoKFxcW1swLTldezEsM31cXC5bMC05XXsxLDN9XFwuWzAtOV17MSwzfVxcLlswLTldezEsM31cXF0pfCgoW2EtekEtWlxcLTAtOV0rXFwuKStbYS16QS1aXXsyLH0pKSQvXHJcbiAgKSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gdHJ1ZSBpZiBzdHJpbmcgaXMgXCJ0cnVlXCJcclxuICogQHJldHVybnMgcGFyc2VkIHN0cmluZyBhcyBib29sZWFuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VCb29sZWFuKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICByZXR1cm4gL150cnVlJC9pLnRlc3QodmFsdWUpO1xyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJuIHRydWUgaWYgdmFsdWVzIGVxdWFsXHJcbiAqIEBwYXJhbSBvYmoxIEZpcnN0IHZhbHVlIHRvIGNvbXBhcmVcclxuICogQHBhcmFtIG9iajIgU2Vjb25kIHZhbHVlIHRvIGNvbXBhcmVcclxuICogQHJldHVybnMgVHJ1ZSBpZiBlcXVhbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzRXF1YWwob2JqMTogYW55LCBvYmoyOiBhbnkpIHtcclxuICAvKipcclxuICAgKiBNb3JlIGFjY3VyYXRlbHkgY2hlY2sgdGhlIHR5cGUgb2YgYSBKYXZhU2NyaXB0IG9iamVjdFxyXG4gICAqIEBwYXJhbSAge09iamVjdH0gb2JqIFRoZSBvYmplY3RcclxuICAgKiBAcmV0dXJuIHtTdHJpbmd9ICAgICBUaGUgb2JqZWN0IHR5cGVcclxuICAgKi9cclxuICBmdW5jdGlvbiBnZXRUeXBlKG9iajogYW55KSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikuc2xpY2UoOCwgLTEpLnRvTG93ZXJDYXNlKCk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBhcmVBcnJheXNFcXVhbCgpIHtcclxuXHJcbiAgICAvLyBDaGVjayBsZW5ndGhcclxuICAgIGlmIChvYmoxLmxlbmd0aCAhPT0gb2JqMi5sZW5ndGgpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAvLyBDaGVjayBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iajEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKCFpc0VxdWFsKG9iajFbaV0sIG9iajJbaV0pKSByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgbm8gZXJyb3JzLCByZXR1cm4gdHJ1ZVxyXG4gICAgcmV0dXJuIHRydWU7XHJcblxyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gYXJlT2JqZWN0c0VxdWFsKCkge1xyXG5cclxuICAgIGlmIChPYmplY3Qua2V5cyhvYmoxKS5sZW5ndGggIT09IE9iamVjdC5rZXlzKG9iajIpLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8vIENoZWNrIGVhY2ggaXRlbSBpbiB0aGUgb2JqZWN0XHJcbiAgICBmb3IgKGxldCBrZXkgaW4gb2JqMSkge1xyXG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iajEsIGtleSkpIHtcclxuICAgICAgICBpZiAoIWlzRXF1YWwob2JqMVtrZXldLCBvYmoyW2tleV0pKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgbm8gZXJyb3JzLCByZXR1cm4gdHJ1ZVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBhcmVGaWxlc0VxdWFsKCkge1xyXG4gICAgcmV0dXJuIG9iajEubGFzdE1vZGlmaWVkID09PSBvYmoyLmxhc3RNb2RpZmllZFxyXG4gICAgICAmJiBvYmoxLnNpemUgPT09IG9iajIuc2l6ZVxyXG4gICAgICAmJiBvYmoxLnR5cGUgPT09IG9iajIudHlwZTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGFyZUZ1bmN0aW9uc0VxdWFsKCkge1xyXG4gICAgcmV0dXJuIG9iajEudG9TdHJpbmcoKSA9PT0gb2JqMi50b1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gYXJlUHJpbWF0aXZlc0VxdWFsKCkge1xyXG4gICAgcmV0dXJuIG9iajEgPT09IG9iajI7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBhcmVEYXRlc0VxdWFsKCkge1xyXG4gICAgcmV0dXJuIGlzRXF1YWxEYXRlVGltZXMob2JqMSwgb2JqMik7XHJcbiAgfVxyXG5cclxuICAvLyBHZXQgdGhlIG9iamVjdCB0eXBlXHJcbiAgbGV0IHR5cGUgPSBnZXRUeXBlKG9iajEpO1xyXG5cclxuICAvLyBJZiB0aGUgdHdvIGl0ZW1zIGFyZSBub3QgdGhlIHNhbWUgdHlwZSwgcmV0dXJuIGZhbHNlXHJcbiAgaWYgKHR5cGUgIT09IGdldFR5cGUob2JqMikpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgLy8gQ29tcGFyZSBiYXNlZCBvbiB0eXBlXHJcbiAgaWYgKHR5cGUgPT09ICdhcnJheScpIHJldHVybiBhcmVBcnJheXNFcXVhbCgpO1xyXG5cclxuICBpZiAodHlwZSA9PT0gJ2RhdGUnKSByZXR1cm4gYXJlRGF0ZXNFcXVhbCgpO1xyXG5cclxuICBpZiAodHlwZSA9PT0gJ2ZpbGUnKSByZXR1cm4gYXJlRmlsZXNFcXVhbCgpO1xyXG5cclxuICBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHJldHVybiBhcmVPYmplY3RzRXF1YWwoKTtcclxuXHJcbiAgaWYgKHR5cGUgPT09ICdmdW5jdGlvbicpIHJldHVybiBhcmVGdW5jdGlvbnNFcXVhbCgpO1xyXG5cclxuICByZXR1cm4gYXJlUHJpbWF0aXZlc0VxdWFsKCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZW5lcmF0ZSB1bmlxdWUgaWRlbnRpZmljYXRvclxyXG4gKiBAcmV0dXJucyBSYW5kb20gR1VJRFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlR3VpZCgpOiBzdHJpbmcge1xyXG4gIGxldCBTNCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiAoKCgxICsgTWF0aC5yYW5kb20oKSkgKiAweDEwMDAwKSB8IDApLnRvU3RyaW5nKDE2KS5zdWJzdHJpbmcoMSk7XHJcbiAgfTtcclxuICByZXR1cm4gKFM0KCkgKyBTNCgpICsgXCItXCIgKyBTNCgpICsgXCItXCIgKyBTNCgpICsgXCItXCIgKyBTNCgpICsgXCItXCIgKyBTNCgpICsgUzQoKSArIFM0KCkpO1xyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2sgaWYgdmFsdWUgaXMgSnNvbiBwYXJzYWJsZSBzdHJpbmdcclxuICogQHBhcmFtIHZhbHVlIHN0cmluZyB2YWx1ZVxyXG4gKiBAcmV0dXJucyBUcnVlIGlmIHN0cmluZyBjYW4gYmUgSlNPTiBwYXJzZWRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0pzb25TdHJpbmcodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZSh2YWx1ZSk7XHJcbiAgICByZXR1cm4gKHR5cGVvZiBqc29uID09PSAnb2JqZWN0Jyk7XHJcbiAgfSBjYXRjaCAoZSkge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFN0b3AgcHJvcGFnYXRpb24gYW5kIHByZXZlbnQgZGVmYXVsdFxyXG4gKiBAcGFyYW0gZXZlbnQgRXZlbnQgb2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc3RvcEFuZFByZXZlbnRQcm9wYWdhdGlvbihldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG59XHJcblxyXG4vKipcclxuICogVXBkYXRlIHByb3BlcnR5IGluIG9iamVjdCBieSBrZXlcclxuICogQHBhcmFtIG9iaiBPYmplY3QgdG8gY2hhbmdlXHJcbiAqIEBwYXJhbSBrZXkgUHJvcGVydHkgdG8gY2hhbmdlXHJcbiAqIEBwYXJhbSBuZXdQcm9wZXJ0eVZhbHVlIE5ldyBwcm9wZXJ0eSB2YWx1ZVxyXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciBhcnJheSB0eXBlc1xyXG4gKiBAcmV0dXJucyBVcGRhdGVkIG9iamVjdFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVByb3BlcnR5QnlLZXk8VD4oXHJcbiAgb2JqOiBhbnksXHJcbiAga2V5OiBzdHJpbmcsXHJcbiAgbmV3UHJvcGVydHlWYWx1ZTogVCxcclxuICBvcHRpb25zOiB7IGFycmF5TW9kZT86IFwidG9nZ2xlXCIgfCBcInJlcGxhY2VcIjsgYXJyYXlUb2dnbGVWYWx1ZT86IFQ7IH0gPSB7fVxyXG4pOiBhbnkge1xyXG4gIGNvbnN0IHtcclxuICAgIGFycmF5TW9kZSA9IFwidG9nZ2xlXCIsXHJcbiAgICBhcnJheVRvZ2dsZVZhbHVlID0gKG5ld1Byb3BlcnR5VmFsdWUgYXMgVClcclxuICB9ID0gb3B0aW9ucztcclxuXHJcbiAgLy8gQXJyYXlzOiBtYXAgcmVjdXJzaXZlbHkgb3ZlciBpdGVtc1xyXG4gIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcclxuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XHJcbiAgICBjb25zdCBtYXBwZWQgPSBvYmoubWFwKGl0ZW0gPT4ge1xyXG4gICAgICBjb25zdCB1cGRhdGVkID0gdXBkYXRlUHJvcGVydHlCeUtleShpdGVtLCBrZXksIG5ld1Byb3BlcnR5VmFsdWUsIG9wdGlvbnMpO1xyXG4gICAgICBpZiAodXBkYXRlZCAhPT0gaXRlbSkgY2hhbmdlZCA9IHRydWU7XHJcbiAgICAgIHJldHVybiB1cGRhdGVkO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gY2hhbmdlZCA/IG1hcHBlZCA6IG9iajtcclxuICB9XHJcblxyXG4gIC8vIFBsYWluIG9iamVjdHM6IGl0ZXJhdGUgb3ZlciBrZXlzIGltbXV0YWJseVxyXG4gIGlmIChpc09iamVjdChvYmopKSB7XHJcbiAgICBjb25zdCBzb3VyY2UgPSBvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XHJcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xyXG5cclxuICAgIGZvciAoY29uc3QgcHJvcGVydHlLZXkgb2YgT2JqZWN0LmtleXMoc291cmNlKSkge1xyXG4gICAgICBjb25zdCB2YWx1ZSA9IHNvdXJjZVtwcm9wZXJ0eUtleV07XHJcblxyXG4gICAgICBpZiAocHJvcGVydHlLZXkgPT09IGtleSkge1xyXG4gICAgICAgIC8vIE1hdGNoZWQga2V5OiBhcHBseSB1cGRhdGVcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgICAgIGlmIChhcnJheU1vZGUgPT09IFwidG9nZ2xlXCIpIHtcclxuICAgICAgICAgICAgY29uc3QgdXBkYXRlZEFycmF5ID0gdG9nZ2xlSXRlbSh2YWx1ZSBhcyBUW10sIGFycmF5VG9nZ2xlVmFsdWUpO1xyXG4gICAgICAgICAgICByZXN1bHRbcHJvcGVydHlLZXldID0gdXBkYXRlZEFycmF5O1xyXG4gICAgICAgICAgICBpZiAodXBkYXRlZEFycmF5ICE9PSB2YWx1ZSkgY2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyByZXBsYWNlIG1vZGVcclxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG5ld1Byb3BlcnR5VmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYXJyYXlNb2RlICdyZXBsYWNlJyByZXF1aXJlcyBuZXdQcm9wZXJ0eVZhbHVlIHRvIGJlIGFuIGFycmF5LlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCByZXBsYWNlZCA9IFsuLi4obmV3UHJvcGVydHlWYWx1ZSBhcyB1bmtub3duIGFzIHVua25vd25bXSldO1xyXG4gICAgICAgICAgICByZXN1bHRbcHJvcGVydHlLZXldID0gcmVwbGFjZWQ7XHJcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBOb24tYXJyYXkgbGVhZiAtPiBzZXQgdG8gbmV3UHJvcGVydHlWYWx1ZVxyXG4gICAgICAgICAgcmVzdWx0W3Byb3BlcnR5S2V5XSA9IG5ld1Byb3BlcnR5VmFsdWUgYXMgdW5rbm93bjtcclxuICAgICAgICAgIGlmIChyZXN1bHRbcHJvcGVydHlLZXldICE9PSB2YWx1ZSkgY2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIFJlY3Vyc2UgaW50byBuZXN0ZWQgdmFsdWVzXHJcbiAgICAgICAgY29uc3QgdXBkYXRlZFZhbCA9IHVwZGF0ZVByb3BlcnR5QnlLZXkodmFsdWUsIGtleSwgbmV3UHJvcGVydHlWYWx1ZSwgb3B0aW9ucyk7XHJcbiAgICAgICAgcmVzdWx0W3Byb3BlcnR5S2V5XSA9IHVwZGF0ZWRWYWw7XHJcbiAgICAgICAgaWYgKHVwZGF0ZWRWYWwgIT09IHZhbHVlKSBjaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjaGFuZ2VkID8gcmVzdWx0IDogb2JqO1xyXG4gIH1cclxuXHJcbiAgLy8gUHJpbWl0aXZlcyBvciBub24tcGxhaW4gb2JqZWN0cyAoRGF0ZSwgTWFwLCBldGMuKTogcmV0dXJuIGFzLWlzXHJcbiAgcmV0dXJuIG9iajtcclxufVxyXG5cclxuLyoqXHJcbiAqIFVwZGF0ZSBwcm9wZXJ0eSBpbiBvYmplY3QgYnkgcGF0aFxyXG4gKiBAcGFyYW0gb2JqIE9iamVjdCB0byBjaGFuZ2VcclxuICogQHBhcmFtIHBhdGggUHJvcGVydHkgdG8gY2hhbmdlXHJcbiAqIEBwYXJhbSBuZXdQcm9wZXJ0eVZhbHVlIE5ldyBwcm9wZXJ0eSB2YWx1ZVxyXG4gKiBAcGFyYW0gcHJldmlvdXNQcm9wZXJ0eVZhbHVlIE5ldyBwcm9wZXJ0eSB2YWx1ZVxyXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciBhcnJheSB0eXBlc1xyXG4gKiBAcmV0dXJucyBVcGRhdGVkIG9iamVjdFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVByb3BlcnR5QnlQYXRoPFQ+KFxyXG4gIG9iajogYW55LFxyXG4gIHBhdGg6IHN0cmluZyB8IHNlZ21lbnRbXSxcclxuICBuZXdQcm9wZXJ0eVZhbHVlOiBULFxyXG4gIHByZXZpb3VzUHJvcGVydHlWYWx1ZTogVCxcclxuICBvcHRpb25zOiB7IGFycmF5TW9kZT86IFwidG9nZ2xlXCIgfCBcInJlcGxhY2VcIjsgfSA9IHt9XHJcbik6IGFueSB7XHJcbiAgY29uc3QgeyAgICBhcnJheU1vZGUgPSBcInRvZ2dsZVwiICB9ID0gb3B0aW9ucztcclxuXHJcbiAgY29uc3Qgc2VnbWVudHMgPSBBcnJheS5pc0FycmF5KHBhdGgpID8gcGF0aCA6IF9wYXRoVG9TZWdtZW50cyhwYXRoKTtcclxuXHJcbiAgLyoqXHJcbiAgKiBQYXJzZXMgYSBwYXRoIHN0cmluZyBsaWtlOlxyXG4gICogIC0gXCJhLmIuY1wiXHJcbiAgKiAgLSBcImEuYlswXS5jXCJcclxuICAqICAtIFwiaXRlbXNbKl0udGFnc1wiXHJcbiAgKiBpbnRvIHNlZ21lbnRzOiBbXCJhXCIsXCJiXCIsMCxcImNcIl0gb3IgW1wiaXRlbXNcIixcIipcIiwgXCJ0YWdzXCJdXHJcbiAgKlxyXG4gICogU3VwcG9ydGVkOlxyXG4gICogIC0gRG90IG5vdGF0aW9uXHJcbiAgKiAgLSBCcmFja2V0IG51bWJlcnM6IFswXVxyXG4gICogIC0gV2lsZGNhcmQ6IFsqXSBvciAuKiAoYXMgYSBzZWdtZW50IFwiKlwiKVxyXG4gICpcclxuICAqIE5vdCBzdXBwb3J0ZWQ6XHJcbiAgKiAgLSBRdW90ZWQgcHJvcGVydHkgbmFtZXMgaW4gYnJhY2tldHMgKGUuZy4sIFtcImZvbyBiYXJcIl0pXHJcbiAgKiAgLSBFc2NhcGVkIGRvdHMgaW4ga2V5c1xyXG4gICogQHBhcmFtIHBhdGggUHJvcGVydHkgcGF0aFxyXG4gICogQHJldHVybnMgUGF0aCBzZWdtZW50c1xyXG4gICovXHJcbiBmdW5jdGlvbiBfcGF0aFRvU2VnbWVudHMocGF0aDogc3RyaW5nKTogc2VnbWVudFtdIHtcclxuICAgLy8gTm9ybWFsaXplIGJyYWNrZXRzIHRvIGRvdCBmb3JtIChlLmcuLCBhWzBdLmIgLT4gYS4wLmIsIGFbKl0uYiAtPiBhLiouYilcclxuICAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdGhcclxuICAgICAucmVwbGFjZSgvXFxbKFxcZCspXFxdL2csIFwiLiQxXCIpXHJcbiAgICAgLnJlcGxhY2UoL1xcW1xcKlxcXS9nLCBcIi4qXCIpO1xyXG4gXHJcbiAgIGNvbnN0IHJhd1NlZ21lbnRzID0gbm9ybWFsaXplZC5zcGxpdChcIi5cIikuZmlsdGVyKHMgPT4gcy5sZW5ndGggPiAwKTtcclxuICAgcmV0dXJuIHJhd1NlZ21lbnRzLm1hcDxzZWdtZW50PihzZWcgPT4ge1xyXG4gICAgIGlmIChzZWcgPT09IFwiKlwiKSByZXR1cm4gXCIqXCI7XHJcbiAgICAgY29uc3QgbiA9IE51bWJlcihzZWcpO1xyXG4gICAgIGlmICghTnVtYmVyLmlzTmFOKG4pICYmIHNlZy50cmltKCkgIT09IFwiXCIgJiYgU3RyaW5nKG4pID09PSBzZWcpIHtcclxuICAgICAgIHJldHVybiBuO1xyXG4gICAgIH1cclxuICAgICByZXR1cm4gc2VnO1xyXG4gICB9KTtcclxuIH1cclxuXHJcbiAgZnVuY3Rpb24gX2FwcGx5KGN1cnJlbnQ6IHVua25vd24sIHJlbWFpbmluZzogc2VnbWVudFtdKTogdW5rbm93biB7XHJcbiAgICAvLyBCYXNlOiByZWFjaGVkIHRhcmdldCBwYXRoXHJcbiAgICBpZiAocmVtYWluaW5nLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50KSkge1xyXG4gICAgICAgIGlmIChhcnJheU1vZGUgPT09IFwidG9nZ2xlXCIpIHtcclxuICAgICAgICAgIHJldHVybiB0b2dnbGVJdGVtKGN1cnJlbnQgYXMgVFtdLCBwcmV2aW91c1Byb3BlcnR5VmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyByZXBsYWNlIG1vZGVcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkobmV3UHJvcGVydHlWYWx1ZSkpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImFycmF5TW9kZSAncmVwbGFjZScgcmVxdWlyZXMgbmV3UHJvcGVydHlWYWx1ZSB0byBiZSBhbiBhcnJheS5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBbLi4uKG5ld1Byb3BlcnR5VmFsdWUgYXMgdW5rbm93biBhcyB1bmtub3duW10pXTtcclxuICAgICAgfVxyXG4gICAgICAvLyBOb24tYXJyYXkgbGVhZiAtPiBzZXQgdG8gbmV3UHJvcGVydHlWYWx1ZVxyXG4gICAgICByZXR1cm4gbmV3UHJvcGVydHlWYWx1ZSBhcyB1bmtub3duO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IFtzZWcsIC4uLnJlc3RdID0gcmVtYWluaW5nO1xyXG5cclxuICAgIC8vIFdpbGRjYXJkIGhhbmRsaW5nXHJcbiAgICBpZiAoc2VnID09PSBcIipcIikge1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50KSkge1xyXG4gICAgICAgIC8vIE1hcCBlYWNoIGVsZW1lbnRcclxuICAgICAgICByZXR1cm4gKGN1cnJlbnQgYXMgdW5rbm93bltdKS5tYXAoaXRlbSA9PiBfYXBwbHkoaXRlbSwgcmVzdCkpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChpc09iamVjdChjdXJyZW50KSkge1xyXG4gICAgICAgIGNvbnN0IG9iakN1cnIgPSBjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvYmpDdXJyKSkge1xyXG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBfYXBwbHkob2JqQ3VycltrZXldLCByZXN0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfVxyXG4gICAgICAvLyBJZiBub3Qgb2JqZWN0L2FycmF5LCBub3RoaW5nIHRvIGV4cGFuZCAtPiByZXR1cm4gYXMtaXNcclxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTnVtZXJpYyBpbmRleCAtPiBuYXZpZ2F0ZSBhcnJheXNcclxuICAgIGlmICh0eXBlb2Ygc2VnID09PSBcIm51bWJlclwiKSB7XHJcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShjdXJyZW50KSkge1xyXG4gICAgICAgIC8vIFBhdGggZXhwZWN0cyBhcnJheSBoZXJlLCBidXQgY3VycmVudCBpc24ndCBhbiBhcnJheSA9PiBuby1vcFxyXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGFyciA9IGN1cnJlbnQgYXMgdW5rbm93bltdO1xyXG4gICAgICBpZiAoc2VnIDwgMCB8fCBzZWcgPj0gYXJyLmxlbmd0aCkge1xyXG4gICAgICAgIC8vIE91dCBvZiBib3VuZHMgLT4gbm8tb3AgKGFsdGVybmF0aXZlbHksIHlvdSBjb3VsZCBleHRlbmQgdGhlIGFycmF5KVxyXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHVwZGF0ZWRJdGVtID0gX2FwcGx5KGFycltzZWddLCByZXN0KTtcclxuICAgICAgaWYgKHVwZGF0ZWRJdGVtID09PSBhcnJbc2VnXSkge1xyXG4gICAgICAgIHJldHVybiBjdXJyZW50OyAvLyBubyBzdHJ1Y3R1cmFsIGNoYW5nZVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IG5ld0FyciA9IGFyci5zbGljZSgpO1xyXG4gICAgICBuZXdBcnJbc2VnXSA9IHVwZGF0ZWRJdGVtO1xyXG4gICAgICByZXR1cm4gbmV3QXJyO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFN0cmluZyBrZXkgLT4gbmF2aWdhdGUgb2JqZWN0c1xyXG4gICAgaWYgKGlzT2JqZWN0KGN1cnJlbnQpKSB7XHJcbiAgICAgIGNvbnN0IG9iakN1cnIgPSBjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG4gICAgICBjb25zdCBuZXh0VmFsID0gb2JqQ3VycltzZWddO1xyXG4gICAgICBjb25zdCB1cGRhdGVkVmFsID0gX2FwcGx5KG5leHRWYWwsIHJlc3QpO1xyXG5cclxuICAgICAgaWYgKHVwZGF0ZWRWYWwgPT09IG5leHRWYWwpIHtcclxuICAgICAgICByZXR1cm4gY3VycmVudDsgLy8gbm8gc3RydWN0dXJhbCBjaGFuZ2VcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4geyAuLi5vYmpDdXJyLCBbc2VnXTogdXBkYXRlZFZhbCB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHdlIGNhbm5vdCB0cmF2ZXJzZSBmdXJ0aGVyIChlLmcuLCBudWxsLCBwcmltaXRpdmUsIG9yIGFycmF5IHdoZW4gZXhwZWN0aW5nIG9iamVjdCkgLT4gbm8tb3BcclxuICAgIHJldHVybiBjdXJyZW50O1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIF9hcHBseShvYmosIHNlZ21lbnRzKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldCBjaGFuZ2VkIHByb3BlcnR5IGtleVxyXG4gKiBAcGFyYW0gcHJldmlvdXMgUHJldmlvdXMgdmFsdWVcclxuICogQHBhcmFtIGN1cnJlbnQgQ3VycmVuY3kgdmFsdWVcclxuICogQHJldHVybnMgS2V5IG9mIHByb3BlcnR5IHRoYXQgd2FzIGNoYW5nZWRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ2hhbmdlZFByb3BlcnR5S2V5KHByZXZpb3VzOiBhbnksIGN1cnJlbnQ6IGFueSk6IHN0cmluZyB8IGVtcHR5IHtcclxuICBjb25zdCBwYXRoOiBzdHJpbmcgfCBlbXB0eSA9IGZpbmRDaGFuZ2VkUHJvcGVydHlQYXRoKHByZXZpb3VzLCBjdXJyZW50KSxcclxuICAgIHBhcnRzID0gcGF0aD8uc3BsaXQoJy4nKTtcclxuXHJcbiAgcmV0dXJuIHBhcnRzICYmIHBhcnRzLmxlbmd0aCA/IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xyXG59XHJcblxyXG4vKipcclxuICogR2V0IGNoYW5nZWQgcHJvcGVydHkgcGF0aFxyXG4gKiBAcGFyYW0gcHJldmlvdXMgUHJldmlvdXMgdmFsdWUgXHJcbiAqIEBwYXJhbSBjdXJyZW50IEN1cnJlbmN5IHZhbHVlXHJcbiAqIEBwYXJhbSBwYXJlbnRLZXkgUGFyZW50IG9iamVjdCBrZXkgbmFtZVxyXG4gKiBAcmV0dXJucyBQYXRoIG9mIHByb3BlcnR5IHRoYXQgd2FzIGNoYW5nZWRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ2hhbmdlZFByb3BlcnR5UGF0aChwcmV2aW91czogYW55LCBjdXJyZW50OiBhbnksIHBhcmVudEtleTogc3RyaW5nID0gJycpOiBzdHJpbmcgfCBlbXB0eSB7XHJcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY3VycmVudCkpIHtcclxuICAgIGNvbnN0IGZ1bGxLZXk6IHN0cmluZyA9IHBhcmVudEtleSA/IGAke3BhcmVudEtleX0uJHtrZXl9YCA6IGtleTtcclxuXHJcbiAgICBpZiAoaXNPYmplY3QoY3VycmVudFtrZXldKSAmJiBjdXJyZW50W2tleV0gIT09IG51bGwgJiYgcHJldmlvdXNba2V5XSkge1xyXG4gICAgICBjb25zdCBuZXN0ZWRDaGFuZ2UgPSBmaW5kQ2hhbmdlZFByb3BlcnR5UGF0aChwcmV2aW91c1trZXldLCBjdXJyZW50W2tleV0sIGZ1bGxLZXkpO1xyXG5cclxuICAgICAgaWYgKG5lc3RlZENoYW5nZSkge1xyXG4gICAgICAgIHJldHVybiBuZXN0ZWRDaGFuZ2U7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChwcmV2aW91c1trZXldICE9PSBjdXJyZW50W2tleV0pIHtcclxuICAgICAgICByZXR1cm4gZnVsbEtleTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG51bGw7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDbG9uZSBvYmplY3Qgd2l0aG91dCBhbnkgcmVmZXJlbmNlXHJcbiAqIEBwYXJhbSB2YWx1ZSAgT2JqZWN0IHRvIGNsb25lXHJcbiAqIEByZXR1cm5zIENsb25lZCBvYmplY3RcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWVwQ2xvbmUodmFsdWU6IGFueSk6IGFueSB7XHJcbiAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcclxufSJdfQ==
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export { isDefined, isObject, isAsyncData, addPropertyToObject, removePropertyFromObject, mergeDeep, nameof, isNumeric, isString, isChromeBrowser, isEmail, parseBoolean, isEqual, generateGuid, isJsonString, stopAndPreventPropagation, updatePropertyByKey,
|
|
1
|
+
export { isDefined, isObject, isAsyncData, addPropertyToObject, removePropertyFromObject, mergeDeep, nameof, isNumeric, isString, isChromeBrowser, isEmail, parseBoolean, isEqual, generateGuid, isJsonString, stopAndPreventPropagation, updatePropertyByKey, updatePropertyByPath, findChangedPropertyKey, findChangedPropertyPath, deepClone } from './common.utils';
|
|
2
2
|
export { isNullOrEmptyString, contains, trim } from './string.utils';
|
|
3
3
|
export { setMinutes, setHours, setDay, setYear, setSeconds, setMilliseconds, setDefaultSecondsAndMiliseconds, getNextDate, getPreviousDate, getNextMonth, getPreviousMonth, getNextYear, getPreviousYear, getFirstDayOfMonth, getLastDayOfMonth, getFirstDayOfYear, getLastDayOfYear, getFirstDayOfMonthByYearAndMonth, getLastDayOfMonthByYearAndMonth, getWeeksNumberInMonth, isEqualDates, isEqualDateTimes, isDateGreat, isDateGreatOrEqual, isDateTimeGreat, isDateTimeGreatOrEqual, isDateTimeLessOrEqual, isTimeGreatOrEqual, isTimeLessOrEqual, convertUTCDateToLocalDate, convertTimestampToDate, convertDateToTimestamp, getAge } from './date-time.utils';
|
|
4
4
|
export { parseFileSize, getFileExtension, readAsDataURL, isImage, convertToBase64String, convertFromBase64String } from './file.utils';
|
|
5
5
|
export { getCssLikeValue, getValueFromCssLikeValue, getCalcValue, getRotateValue, addClasses, removeClasses, rgbToHex, hexToRgb, replaceRgbOpacity } from './ui.utils';
|
|
6
|
-
export { any, hasItem, hasItemBy, hasObjectItem, hasAnyItem, firstOrDefault, firstItem, lastItem, all, where, skip, sort, sortBy, sortByPath, distinct, sum, max, remove, addItem, removeItem, removeItemBy, updateItemBy, getCollectionOrEmpty, count, isArraysEquals } from './collections.utils';
|
|
6
|
+
export { any, hasItem, hasItemBy, hasObjectItem, hasAnyItem, firstOrDefault, firstItem, lastItem, all, where, skip, sort, sortBy, sortByPath, distinct, sum, max, remove, addItem, removeItem, removeItemBy, updateItemBy, toggleItem, getCollectionOrEmpty, count, isArraysEquals } from './collections.utils';
|
|
7
7
|
export { buildHttpParams } from './http.utils';
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2ZjLWNvbW1vbi9zcmMvbGliL3V0aWxzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQ1QsUUFBUSxFQUNSLFdBQVcsRUFDWCxtQkFBbUIsRUFDbkIsd0JBQXdCLEVBQ3hCLFNBQVMsRUFDVCxNQUFNLEVBQ04sU0FBUyxFQUNULFFBQVEsRUFDUixlQUFlLEVBQ2YsT0FBTyxFQUNQLFlBQVksRUFDWixPQUFPLEVBQ1AsWUFBWSxFQUNaLFlBQVksRUFDWix5QkFBeUIsRUFDekIsbUJBQW1CLEVBQ25CLG9CQUFvQixFQUNwQixzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDWixNQUFNLGdCQUFnQixDQUFBO0FBRXZCLE9BQU8sRUFDSCxtQkFBbUIsRUFDbkIsUUFBUSxFQUNSLElBQUksRUFDUCxNQUFNLGdCQUFnQixDQUFBO0FBRXZCLE9BQU8sRUFDSCxVQUFVLEVBQ1YsUUFBUSxFQUNSLE1BQU0sRUFDTixPQUFPLEVBQ1AsVUFBVSxFQUNWLGVBQWUsRUFDZiwrQkFBK0IsRUFDL0IsV0FBVyxFQUNYLGVBQWUsRUFDZixZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLFdBQVcsRUFDWCxlQUFlLEVBQ2Ysa0JBQWtCLEVBQ2xCLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsZ0JBQWdCLEVBQ2hCLGdDQUFnQyxFQUNoQywrQkFBK0IsRUFDL0IscUJBQXFCLEVBQ3JCLFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixlQUFlLEVBQ2Ysc0JBQXNCLEVBQ3RCLHFCQUFxQixFQUNyQixrQkFBa0IsRUFDbEIsaUJBQWlCLEVBQ2pCLHlCQUF5QixFQUN6QixzQkFBc0IsRUFDdEIsc0JBQXNCLEVBQ3RCLE1BQU0sRUFDVCxNQUFNLG1CQUFtQixDQUFBO0FBRTFCLE9BQU8sRUFDSCxhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYixPQUFPLEVBQ1AscUJBQXFCLEVBQ3JCLHVCQUF1QixFQUMxQixNQUFNLGNBQWMsQ0FBQTtBQUVyQixPQUFPLEVBQ0gsZUFBZSxFQUNmLHdCQUF3QixFQUN4QixZQUFZLEVBQ1osY0FBYyxFQUNkLFVBQVUsRUFDVixhQUFhLEVBQ2IsUUFBUSxFQUNSLFFBQVEsRUFDUixpQkFBaUIsRUFDcEIsTUFBTSxZQUFZLENBQUE7QUFFbkIsT0FBTyxFQUNILEdBQUcsRUFDSCxPQUFPLEVBQ1AsU0FBUyxFQUNULGFBQWEsRUFDYixVQUFVLEVBQ1YsY0FBYyxFQUNkLFNBQVMsRUFDVCxRQUFRLEVBQ1IsR0FBRyxFQUNILEtBQUssRUFDTCxJQUFJLEVBQ0osSUFBSSxFQUNKLE1BQU0sRUFDTixVQUFVLEVBQ1YsUUFBUSxFQUNSLEdBQUcsRUFDSCxHQUFHLEVBQ0gsTUFBTSxFQUNOLE9BQU8sRUFDUCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFlBQVksRUFDWixVQUFVLEVBQ1Ysb0JBQW9CLEVBQ3BCLEtBQUssRUFDTCxjQUFjLEVBQ2pCLE1BQU0scUJBQXFCLENBQUM7QUFFN0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7XHJcbiAgICBpc0RlZmluZWQsXHJcbiAgICBpc09iamVjdCxcclxuICAgIGlzQXN5bmNEYXRhLFxyXG4gICAgYWRkUHJvcGVydHlUb09iamVjdCxcclxuICAgIHJlbW92ZVByb3BlcnR5RnJvbU9iamVjdCxcclxuICAgIG1lcmdlRGVlcCxcclxuICAgIG5hbWVvZixcclxuICAgIGlzTnVtZXJpYyxcclxuICAgIGlzU3RyaW5nLFxyXG4gICAgaXNDaHJvbWVCcm93c2VyLFxyXG4gICAgaXNFbWFpbCxcclxuICAgIHBhcnNlQm9vbGVhbixcclxuICAgIGlzRXF1YWwsXHJcbiAgICBnZW5lcmF0ZUd1aWQsXHJcbiAgICBpc0pzb25TdHJpbmcsXHJcbiAgICBzdG9wQW5kUHJldmVudFByb3BhZ2F0aW9uLFxyXG4gICAgdXBkYXRlUHJvcGVydHlCeUtleSxcclxuICAgIHVwZGF0ZVByb3BlcnR5QnlQYXRoLFxyXG4gICAgZmluZENoYW5nZWRQcm9wZXJ0eUtleSxcclxuICAgIGZpbmRDaGFuZ2VkUHJvcGVydHlQYXRoLCAgXHJcbiAgICBkZWVwQ2xvbmVcclxufSBmcm9tICcuL2NvbW1vbi51dGlscydcclxuXHJcbmV4cG9ydCB7XHJcbiAgICBpc051bGxPckVtcHR5U3RyaW5nLFxyXG4gICAgY29udGFpbnMsXHJcbiAgICB0cmltXHJcbn0gZnJvbSAnLi9zdHJpbmcudXRpbHMnXHJcblxyXG5leHBvcnQge1xyXG4gICAgc2V0TWludXRlcyxcclxuICAgIHNldEhvdXJzLFxyXG4gICAgc2V0RGF5LFxyXG4gICAgc2V0WWVhcixcclxuICAgIHNldFNlY29uZHMsXHJcbiAgICBzZXRNaWxsaXNlY29uZHMsXHJcbiAgICBzZXREZWZhdWx0U2Vjb25kc0FuZE1pbGlzZWNvbmRzLFxyXG4gICAgZ2V0TmV4dERhdGUsXHJcbiAgICBnZXRQcmV2aW91c0RhdGUsXHJcbiAgICBnZXROZXh0TW9udGgsXHJcbiAgICBnZXRQcmV2aW91c01vbnRoLFxyXG4gICAgZ2V0TmV4dFllYXIsXHJcbiAgICBnZXRQcmV2aW91c1llYXIsXHJcbiAgICBnZXRGaXJzdERheU9mTW9udGgsXHJcbiAgICBnZXRMYXN0RGF5T2ZNb250aCxcclxuICAgIGdldEZpcnN0RGF5T2ZZZWFyLFxyXG4gICAgZ2V0TGFzdERheU9mWWVhcixcclxuICAgIGdldEZpcnN0RGF5T2ZNb250aEJ5WWVhckFuZE1vbnRoLFxyXG4gICAgZ2V0TGFzdERheU9mTW9udGhCeVllYXJBbmRNb250aCxcclxuICAgIGdldFdlZWtzTnVtYmVySW5Nb250aCxcclxuICAgIGlzRXF1YWxEYXRlcyxcclxuICAgIGlzRXF1YWxEYXRlVGltZXMsXHJcbiAgICBpc0RhdGVHcmVhdCxcclxuICAgIGlzRGF0ZUdyZWF0T3JFcXVhbCxcclxuICAgIGlzRGF0ZVRpbWVHcmVhdCxcclxuICAgIGlzRGF0ZVRpbWVHcmVhdE9yRXF1YWwsXHJcbiAgICBpc0RhdGVUaW1lTGVzc09yRXF1YWwsXHJcbiAgICBpc1RpbWVHcmVhdE9yRXF1YWwsXHJcbiAgICBpc1RpbWVMZXNzT3JFcXVhbCxcclxuICAgIGNvbnZlcnRVVENEYXRlVG9Mb2NhbERhdGUsXHJcbiAgICBjb252ZXJ0VGltZXN0YW1wVG9EYXRlLFxyXG4gICAgY29udmVydERhdGVUb1RpbWVzdGFtcCxcclxuICAgIGdldEFnZVxyXG59IGZyb20gJy4vZGF0ZS10aW1lLnV0aWxzJ1xyXG5cclxuZXhwb3J0IHtcclxuICAgIHBhcnNlRmlsZVNpemUsXHJcbiAgICBnZXRGaWxlRXh0ZW5zaW9uLFxyXG4gICAgcmVhZEFzRGF0YVVSTCxcclxuICAgIGlzSW1hZ2UsXHJcbiAgICBjb252ZXJ0VG9CYXNlNjRTdHJpbmcsXHJcbiAgICBjb252ZXJ0RnJvbUJhc2U2NFN0cmluZ1xyXG59IGZyb20gJy4vZmlsZS51dGlscydcclxuXHJcbmV4cG9ydCB7XHJcbiAgICBnZXRDc3NMaWtlVmFsdWUsXHJcbiAgICBnZXRWYWx1ZUZyb21Dc3NMaWtlVmFsdWUsXHJcbiAgICBnZXRDYWxjVmFsdWUsXHJcbiAgICBnZXRSb3RhdGVWYWx1ZSxcclxuICAgIGFkZENsYXNzZXMsXHJcbiAgICByZW1vdmVDbGFzc2VzLFxyXG4gICAgcmdiVG9IZXgsXHJcbiAgICBoZXhUb1JnYixcclxuICAgIHJlcGxhY2VSZ2JPcGFjaXR5XHJcbn0gZnJvbSAnLi91aS51dGlscydcclxuXHJcbmV4cG9ydCB7XHJcbiAgICBhbnksXHJcbiAgICBoYXNJdGVtLFxyXG4gICAgaGFzSXRlbUJ5LFxyXG4gICAgaGFzT2JqZWN0SXRlbSxcclxuICAgIGhhc0FueUl0ZW0sXHJcbiAgICBmaXJzdE9yRGVmYXVsdCxcclxuICAgIGZpcnN0SXRlbSxcclxuICAgIGxhc3RJdGVtLFxyXG4gICAgYWxsLFxyXG4gICAgd2hlcmUsXHJcbiAgICBza2lwLFxyXG4gICAgc29ydCxcclxuICAgIHNvcnRCeSxcclxuICAgIHNvcnRCeVBhdGgsXHJcbiAgICBkaXN0aW5jdCxcclxuICAgIHN1bSxcclxuICAgIG1heCxcclxuICAgIHJlbW92ZSxcclxuICAgIGFkZEl0ZW0sXHJcbiAgICByZW1vdmVJdGVtLFxyXG4gICAgcmVtb3ZlSXRlbUJ5LFxyXG4gICAgdXBkYXRlSXRlbUJ5LFxyXG4gICAgdG9nZ2xlSXRlbSxcclxuICAgIGdldENvbGxlY3Rpb25PckVtcHR5LFxyXG4gICAgY291bnQsXHJcbiAgICBpc0FycmF5c0VxdWFsc1xyXG59IGZyb20gJy4vY29sbGVjdGlvbnMudXRpbHMnO1xyXG5cclxuZXhwb3J0IHsgYnVpbGRIdHRwUGFyYW1zIH0gZnJvbSAnLi9odHRwLnV0aWxzJzsiXX0=
|