UNPKG

angular-odata

Version:

Client side OData typescript library for Angular

204 lines 26.8 kB
import { Types } from './types'; function forEach(array, iteratee) { let index = -1; const length = array.length; while (++index < length) { iteratee(array[index], index); } return array; } export const Objects = { set(obj, path, value) { // Check if path is string or array. Regex : ensure that we do not have '.' and brackets. const pathArray = (Types.isArray(path) ? path : path.match(/([^[.\]])+/g)); pathArray.reduce((acc, key, i) => { if (acc[key] === undefined) acc[key] = {}; if (i === pathArray.length - 1) acc[key] = value; return acc[key]; }, obj); }, get(obj, path, def) { // Check if path is string or array. Regex : ensure that we do not have '.' and brackets. const pathArray = (Types.isArray(path) ? path : path.match(/([^[.\]])+/g)); // Find value if exist return otherwise return undefined value; return (pathArray.reduce((prevObj, key) => prevObj && prevObj[key], obj) || def); }, unset(obj, path) { // Check if path is string or array. Regex : ensure that we do not have '.' and brackets. const pathArray = (Types.isArray(path) ? path : path.match(/([^[.\]])+/g)); pathArray.reduce((acc, key, i) => { if (i === pathArray.length - 1) delete acc[key]; return acc[key]; }, obj); }, has(obj, path) { // Check if path is string or array. Regex : ensure that we do not have '.' and brackets. const pathArray = (Types.isArray(path) ? path : path.match(/([^[.\]])+/g)); return !!pathArray.reduce((prevObj, key) => prevObj && prevObj[key], obj); }, merge(target, source) { const merge = (target, source) => { for (let attr in source) { let value = source[attr]; if (value !== null && Types.isPlainObject(value) && attr in target) { merge(target[attr], value); } else if (target[attr] !== value) { target[attr] = value; } } }; merge(target, source); return target; }, equal(object1, object2) { const keys1 = Object.keys(object1); const keys2 = Object.keys(object2); if (keys1.length !== keys2.length) { return false; } for (const key of keys1) { const val1 = object1[key]; const val2 = object2[key]; const areObjects = Types.isPlainObject(val1) && Types.isPlainObject(val2); if ((areObjects && !Objects.equal(val1, val2)) || (!areObjects && val1 !== val2)) { return false; } } return true; }, difference(object1, object2) { if (!object2 || !Types.isPlainObject(object2)) { return object1; } var diffs = {}; var key; var arraysMatch = function (arr1, arr2) { if (arr1.length !== arr2.length) return false; for (var i = 0; i < arr1.length; i++) { if (arr1[i] !== arr2[i]) return false; } return true; }; var compare = function (item1, item2, key) { if (item2 === undefined) { diffs[key] = null; return; } if (typeof item1 !== typeof item2) { diffs[key] = item2; return; } if (Types.isPlainObject(item1)) { var objDiff = Objects.difference(item1, item2); if (Object.keys(objDiff).length > 0) { diffs[key] = objDiff; } return; } if (Array.isArray(item1)) { if (!arraysMatch(item1, item2)) { diffs[key] = item2; } return; } if (item1 !== item2) { diffs[key] = item2; } }; for (key in object1) { if (object1.hasOwnProperty(key)) { compare(object1[key], object2[key], key); } } for (key in object2) { if (object2.hasOwnProperty(key)) { if (!object1[key] && object1[key] !== object2[key]) { diffs[key] = object2[key]; } } } return diffs; }, resolveKey(key, { single = true } = {}) { const type = Types.rawType(key); if (['number', 'string'].indexOf(type) !== -1) return key; if (type !== 'Map' && type !== 'Object') { return undefined; } const values = type === 'Map' ? Array.from(key.values()) : Object.values(key); if (values.length === 1 && single) { // Single primitive key value key = values[0]; return !Types.isEmpty(key) ? key : undefined; } else if (values.some((v) => v === undefined)) { // Compose key, needs all values return undefined; } else { const obj = type === 'Map' ? Object.fromEntries(key) : key; return !Types.isEmpty(obj) ? obj : undefined; } }, clone(target, map) { if (map === undefined) map = new WeakMap(); // clone primitive types if (typeof target != 'object' || target == null) { return target; } if ('clone' in target) { // target is a cloneable object return target.clone(); } const type = Types.rawType(target); let cloneTarget = null; if (map.get(target)) { return map.get(target); } map.set(target, cloneTarget); if (type != 'Set' && type != 'Map' && type != 'Array' && type != 'Object') { return Types.clone(target); } // clone Set if (type == 'Set') { cloneTarget = new Set(); target.forEach((value) => { cloneTarget.add(this.clone(value, map)); }); return cloneTarget; } // clone Map if (type == 'Map') { cloneTarget = new Map(); target.forEach((value, key) => { cloneTarget.set(key, this.clone(value, map)); }); return cloneTarget; } // clone Array if (type == 'Array') { cloneTarget = new Array(); forEach(target, (value, index) => { cloneTarget[index] = this.clone(value, map); }); } // clone normal Object if (type == 'Object') { cloneTarget = new Object(); forEach(Object.keys(target), (key, index) => { cloneTarget[key] = this.clone(target[key], map); }); } return cloneTarget; }, }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi91dGlscy9vYmplY3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFaEMsU0FBUyxPQUFPLENBQUMsS0FBWSxFQUFFLFFBQTZDO0lBQzFFLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2YsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUM1QixPQUFPLEVBQUUsS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDO1FBQ3hCLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRztJQUNyQixHQUFHLENBQUMsR0FBNEIsRUFBRSxJQUFZLEVBQUUsS0FBVTtRQUN4RCx5RkFBeUY7UUFDekYsTUFBTSxTQUFTLEdBQUcsQ0FDaEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUM5QyxDQUFDO1FBRVgsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDL0IsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUztnQkFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxLQUFLLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQ2pELE9B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QUMsQ0FBQztZQUMvQyxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFFRCxjQUFjO1FBQ2QsSUFBSSxJQUFJLElBQUksT0FBTyxFQUFFLENBQUM7WUFDcEIsV0FBVyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7WUFDMUIsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDL0IsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzlDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELHNCQUFzQjtRQUN0QixJQUFJLElBQUksSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNyQixXQUFXLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMzQixPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDMUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2xELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHlwZXMgfSBmcm9tICcuL3R5cGVzJztcblxuZnVuY3Rpb24gZm9yRWFjaChhcnJheTogYW55W10sIGl0ZXJhdGVlOiAodmFsdWU6IGFueSwgaW5kZXg6IG51bWJlcikgPT4gdm9pZCkge1xuICBsZXQgaW5kZXggPSAtMTtcbiAgY29uc3QgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgpO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxuZXhwb3J0IGNvbnN0IE9iamVjdHMgPSB7XG4gIHNldChvYmo6IHsgW2F0dHI6IHN0cmluZ106IGFueSB9LCBwYXRoOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICAvLyBDaGVjayBpZiBwYXRoIGlzIHN0cmluZyBvciBhcnJheS4gUmVnZXggOiBlbnN1cmUgdGhhdCB3ZSBkbyBub3QgaGF2ZSAnLicgYW5kIGJyYWNrZXRzLlxuICAgIGNvbnN0IHBhdGhBcnJheSA9IChcbiAgICAgIFR5cGVzLmlzQXJyYXkocGF0aCkgPyBwYXRoIDogcGF0aC5tYXRjaCgvKFteWy5cXF1dKSsvZylcbiAgICApIGFzIGFueVtdO1xuXG4gICAgcGF0aEFycmF5LnJlZHVjZSgoYWNjLCBrZXksIGkpID0+IHtcbiAgICAgIGlmIChhY2Nba2V5XSA9PT0gdW5kZWZpbmVkKSBhY2Nba2V5XSA9IHt9O1xuICAgICAgaWYgKGkgPT09IHBhdGhBcnJheS5sZW5ndGggLSAxKSBhY2Nba2V5XSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIGFjY1trZXldO1xuICAgIH0sIG9iaik7XG4gIH0sXG5cbiAgZ2V0KG9iajogeyBbYXR0cjogc3RyaW5nXTogYW55IH0sIHBhdGg6IHN0cmluZywgZGVmPzogYW55KTogYW55IHtcbiAgICAvLyBDaGVjayBpZiBwYXRoIGlzIHN0cmluZyBvciBhcnJheS4gUmVnZXggOiBlbnN1cmUgdGhhdCB3ZSBkbyBub3QgaGF2ZSAnLicgYW5kIGJyYWNrZXRzLlxuICAgIGNvbnN0IHBhdGhBcnJheSA9IChcbiAgICAgIFR5cGVzLmlzQXJyYXkocGF0aCkgPyBwYXRoIDogcGF0aC5tYXRjaCgvKFteWy5cXF1dKSsvZylcbiAgICApIGFzIGFueVtdO1xuICAgIC8vIEZpbmQgdmFsdWUgaWYgZXhpc3QgcmV0dXJuIG90aGVyd2lzZSByZXR1cm4gdW5kZWZpbmVkIHZhbHVlO1xuICAgIHJldHVybiAoXG4gICAgICBwYXRoQXJyYXkucmVkdWNlKChwcmV2T2JqLCBrZXkpID0+IHByZXZPYmogJiYgcHJldk9ialtrZXldLCBvYmopIHx8IGRlZlxuICAgICk7XG4gIH0sXG5cbiAgdW5zZXQob2JqOiB7IFthdHRyOiBzdHJpbmddOiBhbnkgfSwgcGF0aDogc3RyaW5nKSB7XG4gICAgLy8gQ2hlY2sgaWYgcGF0aCBpcyBzdHJpbmcgb3IgYXJyYXkuIFJlZ2V4IDogZW5zdXJlIHRoYXQgd2UgZG8gbm90IGhhdmUgJy4nIGFuZCBicmFja2V0cy5cbiAgICBjb25zdCBwYXRoQXJyYXkgPSAoXG4gICAgICBUeXBlcy5pc0FycmF5KHBhdGgpID8gcGF0aCA6IHBhdGgubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgKSBhcyBhbnlbXTtcblxuICAgIHBhdGhBcnJheS5yZWR1Y2UoKGFjYywga2V5LCBpKSA9PiB7XG4gICAgICBpZiAoaSA9PT0gcGF0aEFycmF5Lmxlbmd0aCAtIDEpIGRlbGV0ZSBhY2Nba2V5XTtcbiAgICAgIHJldHVybiBhY2Nba2V5XTtcbiAgICB9LCBvYmopO1xuICB9LFxuXG4gIGhhcyhvYmo6IHsgW2F0dHI6IHN0cmluZ106IGFueSB9LCBwYXRoOiBzdHJpbmcpIHtcbiAgICAvLyBDaGVjayBpZiBwYXRoIGlzIHN0cmluZyBvciBhcnJheS4gUmVnZXggOiBlbnN1cmUgdGhhdCB3ZSBkbyBub3QgaGF2ZSAnLicgYW5kIGJyYWNrZXRzLlxuICAgIGNvbnN0IHBhdGhBcnJheSA9IChcbiAgICAgIFR5cGVzLmlzQXJyYXkocGF0aCkgPyBwYXRoIDogcGF0aC5tYXRjaCgvKFteWy5cXF1dKSsvZylcbiAgICApIGFzIGFueVtdO1xuXG4gICAgcmV0dXJuICEhcGF0aEFycmF5LnJlZHVjZSgocHJldk9iaiwga2V5KSA9PiBwcmV2T2JqICYmIHByZXZPYmpba2V5XSwgb2JqKTtcbiAgfSxcblxuICBtZXJnZSh0YXJnZXQ6IHsgW2F0dHI6IHN0cmluZ106IGFueSB9LCBzb3VyY2U6IHsgW2F0dHI6IHN0cmluZ106IGFueSB9KSB7XG4gICAgY29uc3QgbWVyZ2UgPSAodGFyZ2V0OiBhbnksIHNvdXJjZTogeyBbYXR0cjogc3RyaW5nXTogYW55IH0pID0+IHtcbiAgICAgIGZvciAobGV0IGF0dHIgaW4gc291cmNlKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHNvdXJjZVthdHRyXTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIFR5cGVzLmlzUGxhaW5PYmplY3QodmFsdWUpICYmIGF0dHIgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgbWVyZ2UodGFyZ2V0W2F0dHJdLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0W2F0dHJdICE9PSB2YWx1ZSkge1xuICAgICAgICAgIHRhcmdldFthdHRyXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBtZXJnZSh0YXJnZXQsIHNvdXJjZSk7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfSxcblxuICBlcXVhbChvYmplY3QxOiB7IFthdHRyOiBzdHJpbmddOiBhbnkgfSwgb2JqZWN0MjogeyBbYXR0cjogc3RyaW5nXTogYW55IH0pIHtcbiAgICBjb25zdCBrZXlzMSA9IE9iamVjdC5rZXlzKG9iamVjdDEpO1xuICAgIGNvbnN0IGtleXMyID0gT2JqZWN0LmtleXMob2JqZWN0Mik7XG5cbiAgICBpZiAoa2V5czEubGVuZ3RoICE9PSBrZXlzMi5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzMSkge1xuICAgICAgY29uc3QgdmFsMSA9IG9iamVjdDFba2V5XTtcbiAgICAgIGNvbnN0IHZhbDIgPSBvYmplY3QyW2tleV07XG4gICAgICBjb25zdCBhcmVPYmplY3RzID0gVHlwZXMuaXNQbGFpbk9iamVjdCh2YWwxKSAmJiBUeXBlcy5pc1BsYWluT2JqZWN0KHZhbDIpO1xuICAgICAgaWYgKFxuICAgICAgICAoYXJlT2JqZWN0cyAmJiAhT2JqZWN0cy5lcXVhbCh2YWwxLCB2YWwyKSkgfHxcbiAgICAgICAgKCFhcmVPYmplY3RzICYmIHZhbDEgIT09IHZhbDIpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcblxuICBkaWZmZXJlbmNlKFxuICAgIG9iamVjdDE6IHsgW2F0dHI6IHN0cmluZ106IGFueSB9LFxuICAgIG9iamVjdDI6IHsgW2F0dHI6IHN0cmluZ106IGFueSB9LFxuICApIHtcbiAgICBpZiAoIW9iamVjdDIgfHwgIVR5cGVzLmlzUGxhaW5PYmplY3Qob2JqZWN0MikpIHtcbiAgICAgIHJldHVybiBvYmplY3QxO1xuICAgIH1cbiAgICB2YXIgZGlmZnM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgdmFyIGtleTtcbiAgICB2YXIgYXJyYXlzTWF0Y2ggPSBmdW5jdGlvbiAoYXJyMTogYW55W10sIGFycjI6IGFueVtdKSB7XG4gICAgICBpZiAoYXJyMS5sZW5ndGggIT09IGFycjIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyMS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoYXJyMVtpXSAhPT0gYXJyMltpXSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgdmFyIGNvbXBhcmUgPSBmdW5jdGlvbiAoaXRlbTE6IGFueSwgaXRlbTI6IGFueSB8IHVuZGVmaW5lZCwga2V5OiBzdHJpbmcpIHtcbiAgICAgIGlmIChpdGVtMiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRpZmZzW2tleV0gPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlbTEgIT09IHR5cGVvZiBpdGVtMikge1xuICAgICAgICBkaWZmc1trZXldID0gaXRlbTI7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKFR5cGVzLmlzUGxhaW5PYmplY3QoaXRlbTEpKSB7XG4gICAgICAgIHZhciBvYmpEaWZmID0gT2JqZWN0cy5kaWZmZXJlbmNlKGl0ZW0xLCBpdGVtMik7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhvYmpEaWZmKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZGlmZnNba2V5XSA9IG9iakRpZmY7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtMSkpIHtcbiAgICAgICAgaWYgKCFhcnJheXNNYXRjaChpdGVtMSwgaXRlbTIpKSB7XG4gICAgICAgICAgZGlmZnNba2V5XSA9IGl0ZW0yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGl0ZW0xICE9PSBpdGVtMikge1xuICAgICAgICBkaWZmc1trZXldID0gaXRlbTI7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAoa2V5IGluIG9iamVjdDEpIHtcbiAgICAgIGlmIChvYmplY3QxLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgY29tcGFyZShvYmplY3QxW2tleV0sIG9iamVjdDJba2V5XSwga2V5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGtleSBpbiBvYmplY3QyKSB7XG4gICAgICBpZiAob2JqZWN0Mi5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGlmICghb2JqZWN0MVtrZXldICYmIG9iamVjdDFba2V5XSAhPT0gb2JqZWN0MltrZXldKSB7XG4gICAgICAgICAgZGlmZnNba2V5XSA9IG9iamVjdDJba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGlmZnM7XG4gIH0sXG5cbiAgcmVzb2x2ZUtleShrZXk6IGFueSwgeyBzaW5nbGUgPSB0cnVlIH06IHsgc2luZ2xlPzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICBjb25zdCB0eXBlID0gVHlwZXMucmF3VHlwZShrZXkpO1xuICAgIGlmIChbJ251bWJlcicsICdzdHJpbmcnXS5pbmRleE9mKHR5cGUpICE9PSAtMSkgcmV0dXJuIGtleTtcbiAgICBpZiAodHlwZSAhPT0gJ01hcCcgJiYgdHlwZSAhPT0gJ09iamVjdCcpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlcyA9XG4gICAgICB0eXBlID09PSAnTWFwJyA/IEFycmF5LmZyb20oa2V5LnZhbHVlcygpKSA6IE9iamVjdC52YWx1ZXMoa2V5KTtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMSAmJiBzaW5nbGUpIHtcbiAgICAgIC8vIFNpbmdsZSBwcmltaXRpdmUga2V5IHZhbHVlXG4gICAgICBrZXkgPSB2YWx1ZXNbMF07XG4gICAgICByZXR1cm4gIVR5cGVzLmlzRW1wdHkoa2V5KSA/IGtleSA6IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHZhbHVlcy5zb21lKCh2KSA9PiB2ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAvLyBDb21wb3NlIGtleSwgbmVlZHMgYWxsIHZhbHVlc1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb2JqID0gdHlwZSA9PT0gJ01hcCcgPyBPYmplY3QuZnJvbUVudHJpZXMoa2V5KSA6IGtleTtcbiAgICAgIHJldHVybiAhVHlwZXMuaXNFbXB0eShvYmopID8gb2JqIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgfSxcblxuICBjbG9uZSh0YXJnZXQ6IGFueSwgbWFwPzogV2Vha01hcDxvYmplY3QsIGFueT4pIHtcbiAgICBpZiAobWFwID09PSB1bmRlZmluZWQpIG1hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgLy8gY2xvbmUgcHJpbWl0aXZlIHR5cGVzXG4gICAgaWYgKHR5cGVvZiB0YXJnZXQgIT0gJ29iamVjdCcgfHwgdGFyZ2V0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgaWYgKCdjbG9uZScgaW4gdGFyZ2V0KSB7XG4gICAgICAvLyB0YXJnZXQgaXMgYSBjbG9uZWFibGUgb2JqZWN0XG4gICAgICByZXR1cm4gdGFyZ2V0LmNsb25lKCk7XG4gICAgfVxuXG4gICAgY29uc3QgdHlwZSA9IFR5cGVzLnJhd1R5cGUodGFyZ2V0KTtcbiAgICBsZXQgY2xvbmVUYXJnZXQ6IGFueSA9IG51bGw7XG5cbiAgICBpZiAobWFwLmdldCh0YXJnZXQpKSB7XG4gICAgICByZXR1cm4gbWFwLmdldCh0YXJnZXQpO1xuICAgIH1cbiAgICBtYXAuc2V0KHRhcmdldCwgY2xvbmVUYXJnZXQpO1xuXG4gICAgaWYgKHR5cGUgIT0gJ1NldCcgJiYgdHlwZSAhPSAnTWFwJyAmJiB0eXBlICE9ICdBcnJheScgJiYgdHlwZSAhPSAnT2JqZWN0Jykge1xuICAgICAgcmV0dXJuIFR5cGVzLmNsb25lKHRhcmdldCk7XG4gICAgfVxuXG4gICAgLy8gY2xvbmUgU2V0XG4gICAgaWYgKHR5cGUgPT0gJ1NldCcpIHtcbiAgICAgIGNsb25lVGFyZ2V0ID0gbmV3IFNldCgpO1xuICAgICAgdGFyZ2V0LmZvckVhY2goKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgY2xvbmVUYXJnZXQuYWRkKHRoaXMuY2xvbmUodmFsdWUsIG1hcCkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gY2xvbmVUYXJnZXQ7XG4gICAgfVxuXG4gICAgLy8gY2xvbmUgTWFwXG4gICAgaWYgKHR5cGUgPT0gJ01hcCcpIHtcbiAgICAgIGNsb25lVGFyZ2V0ID0gbmV3IE1hcCgpO1xuICAgICAgdGFyZ2V0LmZvckVhY2goKHZhbHVlOiBhbnksIGtleTogYW55KSA9PiB7XG4gICAgICAgIGNsb25lVGFyZ2V0LnNldChrZXksIHRoaXMuY2xvbmUodmFsdWUsIG1hcCkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gY2xvbmVUYXJnZXQ7XG4gICAgfVxuXG4gICAgLy8gY2xvbmUgQXJyYXlcbiAgICBpZiAodHlwZSA9PSAnQXJyYXknKSB7XG4gICAgICBjbG9uZVRhcmdldCA9IG5ldyBBcnJheSgpO1xuICAgICAgZm9yRWFjaCh0YXJnZXQsICh2YWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgY2xvbmVUYXJnZXRbaW5kZXhdID0gdGhpcy5jbG9uZSh2YWx1ZSwgbWFwKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGNsb25lIG5vcm1hbCBPYmplY3RcbiAgICBpZiAodHlwZSA9PSAnT2JqZWN0Jykge1xuICAgICAgY2xvbmVUYXJnZXQgPSBuZXcgT2JqZWN0KCk7XG4gICAgICBmb3JFYWNoKE9iamVjdC5rZXlzKHRhcmdldCksIChrZXksIGluZGV4KSA9PiB7XG4gICAgICAgIGNsb25lVGFyZ2V0W2tleV0gPSB0aGlzLmNsb25lKHRhcmdldFtrZXldLCBtYXApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsb25lVGFyZ2V0O1xuICB9LFxufTtcbiJdfQ==