@w11k/ngx-present
Version:
Angular based Presentation Tool
294 lines • 19.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/core/utils.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { __read, __spread, __values } from "tslib";
import { Observable } from 'rxjs';
/**
* @template T
* @param {?} list
* @return {?}
*/
export function maxDepth(list) {
if (list.length === 0) {
return 0;
}
/**
* @param {?} value
* @param {?} currentDepth
* @return {?}
*/
function recursive(value, currentDepth) {
return value.reduce((/**
* @param {?} depth
* @param {?} val
* @return {?}
*/
function (depth, val) {
if (Array.isArray(val)) {
/** @type {?} */
var newDepth = recursive(val, currentDepth + 1);
return max(newDepth, depth);
}
return depth;
}), currentDepth + 1);
}
return recursive(list, 0);
}
/**
* @param {?} a
* @param {?} b
* @param {...?} c
* @return {?}
*/
export function min(a, b) {
var c = [];
for (var _i = 2; _i < arguments.length; _i++) {
c[_i - 2] = arguments[_i];
}
/** @type {?} */
var values = __spread([a, b], c);
return values.reduce((/**
* @param {?} x
* @param {?} y
* @return {?}
*/
function (x, y) { return x > y ? y : x; }));
}
/**
* @param {?} a
* @param {?} b
* @param {...?} c
* @return {?}
*/
export function max(a, b) {
var c = [];
for (var _i = 2; _i < arguments.length; _i++) {
c[_i - 2] = arguments[_i];
}
/** @type {?} */
var values = __spread([a, b], c);
return values.reduce((/**
* @param {?} x
* @param {?} y
* @return {?}
*/
function (x, y) { return x > y ? x : y; }));
}
/**
* @template T
* @param {?} value
* @param {?=} result
* @return {?}
*/
export function flattenDeep(value, result) {
var e_1, _a;
if (result === void 0) { result = []; }
try {
for (var value_1 = __values(value), value_1_1 = value_1.next(); !value_1_1.done; value_1_1 = value_1.next()) {
var element = value_1_1.value;
if (Array.isArray(element)) {
flattenDeep(element, result);
}
else {
result.push(element);
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (value_1_1 && !value_1_1.done && (_a = value_1.return)) _a.call(value_1);
}
finally { if (e_1) throw e_1.error; }
}
return result;
}
/**
* @template T, U
* @param {?} level0
* @param {?} mapper
* @return {?}
*/
export function mapDeep(level0, mapper) {
return level0.map((/**
* @param {?} level1
* @return {?}
*/
function (level1) {
if (Array.isArray(level1)) {
return mapDeep(level1, mapper);
}
else {
return mapper(level1);
}
}));
}
/**
* @template T
* @param {?} list
* @param {?} predicate
* @return {?}
*/
export function filterDeep(list, predicate) {
/** @type {?} */
var filtered = [];
list.forEach((/**
* @param {?} entry
* @return {?}
*/
function (entry) {
if (Array.isArray(entry)) {
/** @type {?} */
var nestedFiltered = filterDeep(entry, predicate);
if (nestedFiltered.length > 0) {
filtered.push(nestedFiltered);
}
}
else if (predicate(entry)) {
filtered.push(entry);
}
}));
return filtered;
}
/**
* @template S1, S2
* @param {?} s1
* @param {...?} sources
* @return {?}
*/
export function mergeDeep(s1) {
var e_2, _a, e_3, _b;
var sources = [];
for (var _i = 1; _i < arguments.length; _i++) {
sources[_i - 1] = arguments[_i];
}
/** @type {?} */
var target = {};
/** @type {?} */
var s1AndSources = __spread([s1], sources);
try {
for (var s1AndSources_1 = __values(s1AndSources), s1AndSources_1_1 = s1AndSources_1.next(); !s1AndSources_1_1.done; s1AndSources_1_1 = s1AndSources_1.next()) {
var source = s1AndSources_1_1.value;
if (source === undefined) {
continue;
}
/** @type {?} */
var keys = Object.keys(source);
try {
for (var keys_1 = (e_3 = void 0, __values(keys)), keys_1_1 = keys_1.next(); !keys_1_1.done; keys_1_1 = keys_1.next()) {
var key = keys_1_1.value;
/** @type {?} */
var sourceVal = source[key];
/** @type {?} */
var targetVal = target[key];
/** @type {?} */
var targetIsObj = typeof targetVal === 'object' && Array.isArray(targetVal) === false;
/** @type {?} */
var sourceIsObj = typeof sourceVal === 'object' && Array.isArray(sourceVal) === false;
if (targetIsObj && sourceIsObj) {
/** @type {?} */
var merged = mergeDeep(targetVal, sourceVal);
target[key] = merged;
}
else if (source.hasOwnProperty(key)) {
target[key] = sourceVal;
}
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (keys_1_1 && !keys_1_1.done && (_b = keys_1.return)) _b.call(keys_1);
}
finally { if (e_3) throw e_3.error; }
}
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (s1AndSources_1_1 && !s1AndSources_1_1.done && (_a = s1AndSources_1.return)) _a.call(s1AndSources_1);
}
finally { if (e_2) throw e_2.error; }
}
return target;
}
/**
* @template T
* @param {?} list
* @return {?}
*/
export function flattenDelayedWithAnimationFrame(list) {
/** @type {?} */
var flatList = flattenDeep(list);
/** @type {?} */
var observable = new Observable((/**
* @param {?} subscriber
* @return {?}
*/
function (subscriber) {
/** @type {?} */
var k = 5;
/** @type {?} */
var i = k;
/** @type {?} */
var next = (/**
* @return {?}
*/
function () {
subscriber.next(flatList.slice(0, i));
i = i + k;
if (i > flatList.length) {
cancelAnimationFrame(frame);
subscriber.complete();
}
else {
frame = requestAnimationFrame(next);
}
});
/** @type {?} */
var frame = requestAnimationFrame(next);
}));
return observable;
}
/**
* @template T
* @param {?} list
* @param {?} depth
* @return {?}
*/
export function limitDepth(list, depth) {
if (depth === undefined || depth < 0) {
return list;
}
return recursive(list, depth);
/**
* @param {?} value
* @param {?} depth_
* @return {?}
*/
function recursive(value, depth_) {
if (depth_ === 0) {
return [];
}
return value
.map((/**
* @param {?} x
* @return {?}
*/
function (x) {
if (Array.isArray(x)) {
return recursive(x, depth_ - 1);
}
return x;
}))
.filter((/**
* @param {?} x
* @return {?}
*/
function (x) { return (Array.isArray(x) && x.length === 0) === false; }));
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AdzExay9uZ3gtcHJlc2VudC8iLCJzb3VyY2VzIjpbImxpYi9jb3JlL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7OztBQUVsQyxNQUFNLFVBQVUsUUFBUSxDQUFJLElBQXNDO0lBQ2hFLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDckIsT0FBTyxDQUFDLENBQUM7S0FDVjs7Ozs7O0lBRUQsU0FBUyxTQUFTLENBQUMsS0FBdUMsRUFBRSxZQUFvQjtRQUM5RSxPQUFPLEtBQUssQ0FBQyxNQUFNOzs7OztRQUFDLFVBQUMsS0FBSyxFQUFFLEdBQUc7WUFDN0IsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFOztvQkFDaEIsUUFBUSxHQUFHLFNBQVMsQ0FBQyxHQUFHLEVBQUUsWUFBWSxHQUFHLENBQUMsQ0FBQztnQkFDakQsT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQzdCO1lBRUQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLEdBQUUsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUIsQ0FBQzs7Ozs7OztBQUVELE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBUyxFQUFFLENBQVM7SUFBRSxXQUFjO1NBQWQsVUFBYyxFQUFkLHFCQUFjLEVBQWQsSUFBYztRQUFkLDBCQUFjOzs7UUFDaEQsTUFBTSxhQUFJLENBQUMsRUFBRSxDQUFDLEdBQUssQ0FBQyxDQUFDO0lBQzNCLE9BQU8sTUFBTSxDQUFDLE1BQU07Ozs7O0lBQUMsVUFBQyxDQUFDLEVBQUUsQ0FBQyxJQUFLLE9BQUEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQWIsQ0FBYSxFQUFDLENBQUM7QUFDaEQsQ0FBQzs7Ozs7OztBQUVELE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBUyxFQUFFLENBQVM7SUFBRSxXQUFjO1NBQWQsVUFBYyxFQUFkLHFCQUFjLEVBQWQsSUFBYztRQUFkLDBCQUFjOzs7UUFDaEQsTUFBTSxhQUFJLENBQUMsRUFBRSxDQUFDLEdBQUssQ0FBQyxDQUFDO0lBQzNCLE9BQU8sTUFBTSxDQUFDLE1BQU07Ozs7O0lBQUMsVUFBQyxDQUFDLEVBQUUsQ0FBQyxJQUFLLE9BQUEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQWIsQ0FBYSxFQUFDLENBQUM7QUFDaEQsQ0FBQzs7Ozs7OztBQUVELE1BQU0sVUFBVSxXQUFXLENBQUksS0FBdUMsRUFBRSxNQUFnQjs7SUFBaEIsdUJBQUEsRUFBQSxXQUFnQjs7UUFDdEYsS0FBc0IsSUFBQSxVQUFBLFNBQUEsS0FBSyxDQUFBLDRCQUFBLCtDQUFFO1lBQXhCLElBQU0sT0FBTyxrQkFBQTtZQUNoQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQzFCLFdBQVcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7YUFDOUI7aUJBQU07Z0JBQ0wsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUN0QjtTQUNGOzs7Ozs7Ozs7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDOzs7Ozs7O0FBRUQsTUFBTSxVQUFVLE9BQU8sQ0FBTyxNQUF3QyxFQUFFLE1BQW1CO0lBQ3pGLE9BQU8sTUFBTSxDQUFDLEdBQUc7Ozs7SUFBQyxVQUFBLE1BQU07UUFDdEIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3pCLE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztTQUNoQzthQUFNO1lBQ0wsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDdkI7SUFDSCxDQUFDLEVBQUMsQ0FBQztBQUNMLENBQUM7Ozs7Ozs7QUFFRCxNQUFNLFVBQVUsVUFBVSxDQUFJLElBQXNDLEVBQUUsU0FBNEI7O1FBQzFGLFFBQVEsR0FBcUMsRUFBRTtJQUVyRCxJQUFJLENBQUMsT0FBTzs7OztJQUFDLFVBQUEsS0FBSztRQUNoQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7O2dCQUNsQixjQUFjLEdBQUcsVUFBVSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUM7WUFFbkQsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDN0IsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUMvQjtTQUNGO2FBQU0sSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDM0IsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN0QjtJQUNILENBQUMsRUFBQyxDQUFDO0lBRUgsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQzs7Ozs7OztBQUVELE1BQU0sVUFBVSxTQUFTLENBQXVFLEVBQU07O0lBQUUsaUJBQWdCO1NBQWhCLFVBQWdCLEVBQWhCLHFCQUFnQixFQUFoQixJQUFnQjtRQUFoQixnQ0FBZ0I7OztRQUNoSCxNQUFNLEdBQVEsRUFBRTs7UUFFaEIsWUFBWSxhQUFJLEVBQUUsR0FBSyxPQUFPLENBQUM7O1FBRXJDLEtBQXFCLElBQUEsaUJBQUEsU0FBQSxZQUFZLENBQUEsMENBQUEsb0VBQUU7WUFBOUIsSUFBTSxNQUFNLHlCQUFBO1lBQ2YsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO2dCQUN4QixTQUFTO2FBQ1Y7O2dCQUVLLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7Z0JBQ2hDLEtBQWtCLElBQUEsd0JBQUEsU0FBQSxJQUFJLENBQUEsQ0FBQSwwQkFBQSw0Q0FBRTtvQkFBbkIsSUFBTSxHQUFHLGlCQUFBOzt3QkFDTixTQUFTLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQzs7d0JBQ3ZCLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDOzt3QkFFdkIsV0FBVyxHQUFHLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEtBQUs7O3dCQUNqRixXQUFXLEdBQUcsT0FBTyxTQUFTLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssS0FBSztvQkFFdkYsSUFBSSxXQUFXLElBQUksV0FBVyxFQUFFOzs0QkFDeEIsTUFBTSxHQUFHLFNBQVMsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDO3dCQUM5QyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO3FCQUN0Qjt5QkFBTSxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQ3JDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUM7cUJBQ3pCO2lCQUNGOzs7Ozs7Ozs7U0FDRjs7Ozs7Ozs7O0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQzs7Ozs7O0FBRUQsTUFBTSxVQUFVLGdDQUFnQyxDQUFJLElBQXNDOztRQUNsRixRQUFRLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQzs7UUFFNUIsVUFBVSxHQUFHLElBQUksVUFBVTs7OztJQUFNLFVBQUMsVUFBVTs7WUFDMUMsQ0FBQyxHQUFHLENBQUM7O1lBQ1AsQ0FBQyxHQUFHLENBQUM7O1lBRUgsSUFBSTs7O1FBQUc7WUFDWCxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFVixJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFO2dCQUN2QixvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDNUIsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO2FBQ3ZCO2lCQUFNO2dCQUNMLEtBQUssR0FBRyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNyQztRQUNILENBQUMsQ0FBQTs7WUFFRyxLQUFLLEdBQUcscUJBQXFCLENBQUMsSUFBSSxDQUFDO0lBQ3pDLENBQUMsRUFBQztJQUVGLE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7Ozs7Ozs7QUFFRCxNQUFNLFVBQVUsVUFBVSxDQUFJLElBQXNDLEVBQUUsS0FBeUI7SUFDN0YsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7UUFDcEMsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUVELE9BQU8sU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQzs7Ozs7O0lBRTlCLFNBQVMsU0FBUyxDQUFDLEtBQXVDLEVBQUUsTUFBYztRQUN4RSxJQUFJLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDaEIsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUVELE9BQU8sS0FBSzthQUNULEdBQUc7Ozs7UUFBQyxVQUFBLENBQUM7WUFDSixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3BCLE9BQU8sU0FBUyxDQUFDLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDakM7WUFFRCxPQUFPLENBQUMsQ0FBQztRQUNYLENBQUMsRUFBQzthQUNELE1BQU07Ozs7UUFBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxLQUFLLEtBQUssRUFBOUMsQ0FBOEMsRUFBQyxDQUFDO0lBQ2pFLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgZnVuY3Rpb24gbWF4RGVwdGg8VD4obGlzdDogTGlzdE9mUmVjdXJzaXZlQXJyYXlzT3JWYWx1ZXM8VD4pOiBudW1iZXIge1xuICBpZiAobGlzdC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY3Vyc2l2ZSh2YWx1ZTogTGlzdE9mUmVjdXJzaXZlQXJyYXlzT3JWYWx1ZXM8VD4sIGN1cnJlbnREZXB0aDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdmFsdWUucmVkdWNlKChkZXB0aCwgdmFsKSA9PiB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIGNvbnN0IG5ld0RlcHRoID0gcmVjdXJzaXZlKHZhbCwgY3VycmVudERlcHRoICsgMSk7XG4gICAgICAgIHJldHVybiBtYXgobmV3RGVwdGgsIGRlcHRoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlcHRoO1xuICAgIH0sIGN1cnJlbnREZXB0aCArIDEpO1xuICB9XG5cbiAgcmV0dXJuIHJlY3Vyc2l2ZShsaXN0LCAwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1pbihhOiBudW1iZXIsIGI6IG51bWJlciwgLi4uYzogbnVtYmVyW10pOiBudW1iZXIge1xuICBjb25zdCB2YWx1ZXMgPSBbYSwgYiwgLi4uY107XG4gIHJldHVybiB2YWx1ZXMucmVkdWNlKCh4LCB5KSA9PiB4ID4geSA/IHkgOiB4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1heChhOiBudW1iZXIsIGI6IG51bWJlciwgLi4uYzogbnVtYmVyW10pOiBudW1iZXIge1xuICBjb25zdCB2YWx1ZXMgPSBbYSwgYiwgLi4uY107XG4gIHJldHVybiB2YWx1ZXMucmVkdWNlKCh4LCB5KSA9PiB4ID4geSA/IHggOiB5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW5EZWVwPFQ+KHZhbHVlOiBMaXN0T2ZSZWN1cnNpdmVBcnJheXNPclZhbHVlczxUPiwgcmVzdWx0OiBUW10gPSBbXSk6IFRbXSB7XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiB2YWx1ZSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGVsZW1lbnQpKSB7XG4gICAgICBmbGF0dGVuRGVlcChlbGVtZW50LCByZXN1bHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucHVzaChlbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFwRGVlcDxULCBVPihsZXZlbDA6IExpc3RPZlJlY3Vyc2l2ZUFycmF5c09yVmFsdWVzPFQ+LCBtYXBwZXI6ICh4OiBUKSA9PiBVKTogTGlzdE9mUmVjdXJzaXZlQXJyYXlzT3JWYWx1ZXM8VT4ge1xuICByZXR1cm4gbGV2ZWwwLm1hcChsZXZlbDEgPT4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGxldmVsMSkpIHtcbiAgICAgIHJldHVybiBtYXBEZWVwKGxldmVsMSwgbWFwcGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1hcHBlcihsZXZlbDEpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJEZWVwPFQ+KGxpc3Q6IExpc3RPZlJlY3Vyc2l2ZUFycmF5c09yVmFsdWVzPFQ+LCBwcmVkaWNhdGU6ICh4OiBUKSA9PiBib29sZWFuKTogTGlzdE9mUmVjdXJzaXZlQXJyYXlzT3JWYWx1ZXM8VD4ge1xuICBjb25zdCBmaWx0ZXJlZDogTGlzdE9mUmVjdXJzaXZlQXJyYXlzT3JWYWx1ZXM8VD4gPSBbXTtcblxuICBsaXN0LmZvckVhY2goZW50cnkgPT4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGVudHJ5KSkge1xuICAgICAgY29uc3QgbmVzdGVkRmlsdGVyZWQgPSBmaWx0ZXJEZWVwKGVudHJ5LCBwcmVkaWNhdGUpO1xuXG4gICAgICBpZiAobmVzdGVkRmlsdGVyZWQubGVuZ3RoID4gMCkge1xuICAgICAgICBmaWx0ZXJlZC5wdXNoKG5lc3RlZEZpbHRlcmVkKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByZWRpY2F0ZShlbnRyeSkpIHtcbiAgICAgIGZpbHRlcmVkLnB1c2goZW50cnkpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGZpbHRlcmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VEZWVwPFMxIGV4dGVuZHMgeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgUzIgZXh0ZW5kcyB7IFtrZXk6IHN0cmluZ106IGFueSB9PihzMTogUzEsIC4uLnNvdXJjZXM6IFMyW10pOiBTMSAmIFMyIHtcbiAgY29uc3QgdGFyZ2V0OiBhbnkgPSB7fTtcblxuICBjb25zdCBzMUFuZFNvdXJjZXMgPSBbczEsIC4uLnNvdXJjZXNdO1xuXG4gIGZvciAoY29uc3Qgc291cmNlIG9mIHMxQW5kU291cmNlcykge1xuICAgIGlmIChzb3VyY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgY29uc3Qgc291cmNlVmFsID0gc291cmNlW2tleV07XG4gICAgICBjb25zdCB0YXJnZXRWYWwgPSB0YXJnZXRba2V5XTtcblxuICAgICAgY29uc3QgdGFyZ2V0SXNPYmogPSB0eXBlb2YgdGFyZ2V0VmFsID09PSAnb2JqZWN0JyAmJiBBcnJheS5pc0FycmF5KHRhcmdldFZhbCkgPT09IGZhbHNlO1xuICAgICAgY29uc3Qgc291cmNlSXNPYmogPSB0eXBlb2Ygc291cmNlVmFsID09PSAnb2JqZWN0JyAmJiBBcnJheS5pc0FycmF5KHNvdXJjZVZhbCkgPT09IGZhbHNlO1xuXG4gICAgICBpZiAodGFyZ2V0SXNPYmogJiYgc291cmNlSXNPYmopIHtcbiAgICAgICAgY29uc3QgbWVyZ2VkID0gbWVyZ2VEZWVwKHRhcmdldFZhbCwgc291cmNlVmFsKTtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBtZXJnZWQ7XG4gICAgICB9IGVsc2UgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gc291cmNlVmFsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuRGVsYXllZFdpdGhBbmltYXRpb25GcmFtZTxUPihsaXN0OiBMaXN0T2ZSZWN1cnNpdmVBcnJheXNPclZhbHVlczxUPik6IE9ic2VydmFibGU8VFtdPiB7XG4gIGNvbnN0IGZsYXRMaXN0ID0gZmxhdHRlbkRlZXAobGlzdCk7XG5cbiAgY29uc3Qgb2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlPFRbXT4oKHN1YnNjcmliZXIpID0+IHtcbiAgICBjb25zdCBrID0gNTtcbiAgICBsZXQgaSA9IGs7XG5cbiAgICBjb25zdCBuZXh0ID0gKCkgPT4ge1xuICAgICAgc3Vic2NyaWJlci5uZXh0KGZsYXRMaXN0LnNsaWNlKDAsIGkpKTtcbiAgICAgIGkgPSBpICsgaztcblxuICAgICAgaWYgKGkgPiBmbGF0TGlzdC5sZW5ndGgpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoZnJhbWUpO1xuICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShuZXh0KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbGV0IGZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKG5leHQpO1xuICB9KTtcblxuICByZXR1cm4gb2JzZXJ2YWJsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpbWl0RGVwdGg8VD4obGlzdDogTGlzdE9mUmVjdXJzaXZlQXJyYXlzT3JWYWx1ZXM8VD4sIGRlcHRoOiBudW1iZXIgfCB1bmRlZmluZWQpOiBMaXN0T2ZSZWN1cnNpdmVBcnJheXNPclZhbHVlczxUPiB7XG4gIGlmIChkZXB0aCA9PT0gdW5kZWZpbmVkIHx8wqBkZXB0aCA8IDApIHtcbiAgICByZXR1cm4gbGlzdDtcbiAgfVxuXG4gIHJldHVybiByZWN1cnNpdmUobGlzdCwgZGVwdGgpO1xuXG4gIGZ1bmN0aW9uIHJlY3Vyc2l2ZSh2YWx1ZTogTGlzdE9mUmVjdXJzaXZlQXJyYXlzT3JWYWx1ZXM8VD4sIGRlcHRoXzogbnVtYmVyKTogTGlzdE9mUmVjdXJzaXZlQXJyYXlzT3JWYWx1ZXM8VD4ge1xuICAgIGlmIChkZXB0aF8gPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVcbiAgICAgIC5tYXAoeCA9PiB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHgpKSB7XG4gICAgICAgICAgcmV0dXJuIHJlY3Vyc2l2ZSh4LCBkZXB0aF8gLSAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB4O1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoeCA9PiAoQXJyYXkuaXNBcnJheSh4KSAmJiB4Lmxlbmd0aCA9PT0gMCkgPT09IGZhbHNlKTtcbiAgfVxufVxuIl19