@circe/core
Version:
Circe Components for Angular :: Core Services and Tools
195 lines • 24 kB
JavaScript
import { Injectable } from '@angular/core';
import { startCase as _startCase, camelCase as _camelCase, kebabCase as _kebabCase } from 'lodash-es';
import { v4 } from 'uuid';
import { npaStringTransform } from '../_types/data.types';
export class ToolService {
constructor() {
this.months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
this.yiqHumanThreshold = 128;
}
static getValueFromMultiLevelObject(object, key, separator) {
const _separator = separator || '.';
if (object[key] !== undefined) {
return object[key];
}
try {
return key.split(_separator).reduce((obj, index) => {
return obj[index];
}, object);
}
catch (e) {
if (e instanceof TypeError) {
return undefined;
}
else {
throw e;
}
}
}
static setValueInMultiLevelObject(object, key, value, separator) {
const _separator = separator || '.';
return key.split(_separator).reduce((o, i) => {
if (o && typeof o[i] === 'object') {
return o[i];
}
if (o && i in o) {
o[i] = value;
return o;
}
}, object);
}
static waitFor(milliseconds) {
const _now = Date.now();
let _timeOut = false;
do {
_timeOut = (Date.now() - _now >= milliseconds);
} while (!_timeOut);
}
/**
* repeatedValuesInArray
* @description
* This method returns an array of uniques values if parameter "unique" is true; or returns
* an array of ONLY repeated values (unique values are discarded) if unique is false.
* Default value por parameter unique is true.
*/
static repeatedValuesInArray(values, unique) {
const _unique = (unique === undefined) ? true : unique;
return (_unique) ? Array.from(new Set(values)) : values.filter((e, i) => values.indexOf(e) !== i);
}
static checkLastChar(text, char) {
if (text && text[text.length - 1] !== char) {
return `${text}${char}`;
}
return text;
}
static hexToRgb(hex) {
const _output = hex
.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i, (m, r, g, b) => '#' + r + r + g + g + b + b)
.substring(1)
.match(/.{2}/g);
return _output.map((e) => parseInt(e, 16));
}
static rgbToHex(r, g, b) {
const _output = [r, g, b].map((e) => {
const _hex = e.toString(16);
return (_hex.length === 1) ? `0${_hex}` : _hex;
});
return _output.join('');
}
static rgbToCmyk(r, g, b) {
let _output = [r, g, b].map((e) => 1 - (e / 255));
const k = Math.min(_output[0], Math.min(_output[1], _output[2]));
_output = _output.map((e) => (e - k) / (1 - k));
_output.push(k);
_output = _output.map((e) => Math.round(e * 100)).map((e) => e || 0);
return _output;
}
/**
* getColorYIQ
* @description
* This method returns de YIQ model (color space) from a given color.
* Can receive single argument (hex color string) or three number arguments (rgb color).
*/
static getColorYIQ(...arg) {
let _color = arg;
if (arg.length === 1 && typeof arg[0] === 'string') {
_color = this.hexToRgb(arg[0]);
}
if (_color.length === 3 && typeof _color[0] === 'number' && typeof _color[1] === 'number' && typeof _color[2] === 'number') {
return ((_color[0] * 299) + (_color[1] * 587) + (_color[2] * 114)) / 1000;
}
return null;
}
/**
* generateUuid
* @description
* Generates a new uuid using uuid dependency.
*/
static generateUuid() {
return v4();
}
/**
* checkArray
* @description
* Returns true if parameter given "array" is an array, otherwise returns false;
* If optional parameter "filled" is given, then this method checks the array is not empty.
* Default value for "filled" is true.
*/
static checkArray(array, filled = true) {
const _checkStructure = (!!array && Array.isArray(array));
if (filled) {
return (_checkStructure && !!array.length);
}
return _checkStructure;
}
static isEmail(email) {
const expr = /^([\w-.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$/;
return expr.test(email);
}
/**
* @deprecated
*/
static getValueFromDotedKey(object, dotedKey, separator) {
const _separator = separator || '.';
if (object[dotedKey] !== undefined) {
return object[dotedKey];
}
try {
return dotedKey.split(_separator).reduce((obj, index) => {
return obj[index];
}, object);
}
catch (e) {
if (e instanceof TypeError) {
return undefined;
}
else {
throw e;
}
}
}
/**
* @deprecated
*/
static formatString(text) {
if (isNaN(Number(text))) {
return _startCase(text);
}
else {
return text;
}
}
identifier(index, item) {
let _output = (typeof item === 'string') ? item : index;
['code', 'id', 'param', 'key'].forEach((e) => {
if (item.hasOwnProperty(e)) {
_output = item[e];
return;
}
});
return _output;
}
stringTransform(text, transformType) {
const _transformType = transformType || npaStringTransform.start;
let _output = text;
if (isNaN(Number(text))) {
switch (_transformType) {
case npaStringTransform.start:
_output = _startCase(text);
break;
case npaStringTransform.camel:
_output = _camelCase(text);
break;
case npaStringTransform.kebab:
_output = _kebabCase(text);
break;
}
}
return _output;
}
}
ToolService.decorators = [
{ type: Injectable }
];
ToolService.ctorParameters = () => [];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvbGliL3Rvb2wvdG9vbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsSUFBSSxVQUFVLEVBQUUsU0FBUyxJQUFJLFVBQVUsRUFBRSxTQUFTLElBQUksVUFBVSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUIsT0FBTyxFQUFpQixrQkFBa0IsRUFBc0IsTUFBTSxzQkFBc0IsQ0FBQztBQUUvRSxNQUFNLE9BQU8sV0FBVztJQUlwQztRQUhPLFdBQU0sR0FBa0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBSWxILElBQUksQ0FBQyxpQkFBaUIsR0FBRyxHQUFHLENBQUM7SUFDL0IsQ0FBQztJQUVNLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQyxNQUFXLEVBQUUsR0FBVyxFQUFFLFNBQWtCO1FBQ3JGLE1BQU0sVUFBVSxHQUFHLFNBQVMsSUFBSSxHQUFHLENBQUM7UUFDcEMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQzdCLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3BCO1FBQ0QsSUFBSTtZQUNGLE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFRLEVBQUUsS0FBVSxFQUFFLEVBQUU7Z0JBQzNELE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxD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QUNqQixDQUFDOzs7WUF6TUYsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHN0YXJ0Q2FzZSBhcyBfc3RhcnRDYXNlLCBjYW1lbENhc2UgYXMgX2NhbWVsQ2FzZSwga2ViYWJDYXNlIGFzIF9rZWJhYkNhc2UgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IE5wYVNpbmdsZURhdGEsIG5wYVN0cmluZ1RyYW5zZm9ybSwgTnBhU3RyaW5nVHJhbnNmb3JtIH0gZnJvbSAnLi4vX3R5cGVzL2RhdGEudHlwZXMnO1xuXG5ASW5qZWN0YWJsZSgpIGV4cG9ydCBjbGFzcyBUb29sU2VydmljZSB7XG4gIHB1YmxpYyBtb250aHM6IEFycmF5PHN0cmluZz4gPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ107XG4gIHB1YmxpYyB5aXFIdW1hblRocmVzaG9sZDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMueWlxSHVtYW5UaHJlc2hvbGQgPSAxMjg7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldFZhbHVlRnJvbU11bHRpTGV2ZWxPYmplY3Qob2JqZWN0OiBhbnksIGtleTogc3RyaW5nLCBzZXBhcmF0b3I/OiBzdHJpbmcpOiBhbnkge1xuICAgIGNvbnN0IF9zZXBhcmF0b3IgPSBzZXBhcmF0b3IgfHwgJy4nO1xuICAgIGlmIChvYmplY3Rba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gb2JqZWN0W2tleV07XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4ga2V5LnNwbGl0KF9zZXBhcmF0b3IpLnJlZHVjZSgob2JqOiBhbnksIGluZGV4OiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIG9ialtpbmRleF07XG4gICAgICB9LCBvYmplY3QpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgVHlwZUVycm9yKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgc2V0VmFsdWVJbk11bHRpTGV2ZWxPYmplY3Qob2JqZWN0OiBhbnksIGtleTogc3RyaW5nLCB2YWx1ZTogYW55LCBzZXBhcmF0b3I/OiBzdHJpbmcpOiBhbnkge1xuICAgIGNvbnN0IF9zZXBhcmF0b3I6IHN0cmluZyA9IHNlcGFyYXRvciB8fCAnLic7XG4gICAgcmV0dXJuICBrZXkuc3BsaXQoX3NlcGFyYXRvcikucmVkdWNlKChvOiBhbnksIGk6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKG8gJiYgdHlwZW9mIG9baV0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBvW2ldO1xuICAgICAgfVxuICAgICAgaWYgKG8gJiYgaSBpbiBvKSB7XG4gICAgICAgIG9baV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIG87XG4gICAgICB9XG4gICAgfSwgb2JqZWN0KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgd2FpdEZvcihtaWxsaXNlY29uZHM6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IF9ub3c6IG51bWJlciA9IERhdGUubm93KCk7XG4gICAgbGV0IF90aW1lT3V0OiBib29sZWFuID0gZmFsc2U7XG4gICAgZG8ge1xuICAgICAgX3RpbWVPdXQgPSAoRGF0ZS5ub3coKSAtIF9ub3cgPj0gbWlsbGlzZWNvbmRzKTtcbiAgICB9IHdoaWxlICghX3RpbWVPdXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIHJlcGVhdGVkVmFsdWVzSW5BcnJheVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhbiBhcnJheSBvZiB1bmlxdWVzIHZhbHVlcyBpZiBwYXJhbWV0ZXIgXCJ1bmlxdWVcIiBpcyB0cnVlOyBvciByZXR1cm5zXG4gICAqIGFuIGFycmF5IG9mIE9OTFkgcmVwZWF0ZWQgdmFsdWVzICh1bmlxdWUgdmFsdWVzIGFyZSBkaXNjYXJkZWQpIGlmIHVuaXF1ZSBpcyBmYWxzZS5cbiAgICogRGVmYXVsdCB2YWx1ZSBwb3IgcGFyYW1ldGVyIHVuaXF1ZSBpcyB0cnVlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZXBlYXRlZFZhbHVlc0luQXJyYXkodmFsdWVzOiBBcnJheTxOcGFTaW5nbGVEYXRhPiwgdW5pcXVlPzogYm9vbGVhbik6IEFycmF5PE5wYVNpbmdsZURhdGE+IHtcbiAgICBjb25zdCBfdW5pcXVlOiBib29sZWFuID0gKHVuaXF1ZSA9PT0gdW5kZWZpbmVkKSA/IHRydWUgOiB1bmlxdWU7XG4gICAgcmV0dXJuIChfdW5pcXVlKSA/IEFycmF5LmZyb20obmV3IFNldCh2YWx1ZXMpKSA6IHZhbHVlcy5maWx0ZXIoKGU6IE5wYVNpbmdsZURhdGEsIGk6IG51bWJlcikgPT4gdmFsdWVzLmluZGV4T2YoZSkgIT09IGkpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBjaGVja0xhc3RDaGFyKHRleHQ6IHN0cmluZywgY2hhcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGV4dCAmJiB0ZXh0W3RleHQubGVuZ3RoIC0gMV0gIT09IGNoYXIpIHtcbiAgICAgIHJldHVybiBgJHt0ZXh0fSR7Y2hhcn1gO1xuICAgIH1cbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaGV4VG9SZ2IoaGV4OiBzdHJpbmcpOiBBcnJheTxudW1iZXI+IHtcbiAgICBjb25zdCBfb3V0cHV0OiBBcnJheTxzdHJpbmc+ID0gaGV4XG4gICAgICAucmVwbGFjZShcbiAgICAgICAgL14jPyhbYS1mXFxkXSkoW2EtZlxcZF0pKFthLWZcXGRdKSQvaSxcbiAgICAgICAgKG06IHN0cmluZywgcjogc3RyaW5nLCBnOiBzdHJpbmcsIGI6IHN0cmluZykgPT4gJyMnICsgciArIHIgKyBnICsgZyArIGIgKyBiXG4gICAgICApXG4gICAgICAuc3Vic3RyaW5nKDEpXG4gICAgICAubWF0Y2goLy57Mn0vZyk7XG4gICAgcmV0dXJuIF9vdXRwdXQubWFwKChlOiBzdHJpbmcpID0+IHBhcnNlSW50KGUsIDE2KSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHJnYlRvSGV4KHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IF9vdXRwdXQ6IEFycmF5PHN0cmluZz4gPSBbciwgZywgYl0ubWFwKChlOiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IF9oZXg6IHN0cmluZyA9IGUudG9TdHJpbmcoMTYpO1xuICAgICAgcmV0dXJuIChfaGV4Lmxlbmd0aCA9PT0gMSkgPyBgMCR7X2hleH1gIDogX2hleDtcbiAgICB9KTtcbiAgICByZXR1cm4gX291dHB1dC5qb2luKCcnKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgcmdiVG9DbXlrKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpOiBBcnJheTxudW1iZXI+IHtcbiAgICBsZXQgX291dHB1dDogQXJyYXk8bnVtYmVyPiA9IFtyLCBnLCBiXS5tYXAoKGU6IG51bWJlcikgPT4gMSAtIChlIC8gMjU1KSk7XG4gICAgY29uc3QgazogbnVtYmVyID0gTWF0aC5taW4oX291dHB1dFswXSwgTWF0aC5taW4oX291dHB1dFsxXSwgX291dHB1dFsyXSkpO1xuICAgIF9vdXRwdXQgPSBfb3V0cHV0Lm1hcCgoZTogbnVtYmVyKSA9PiAoZSAtIGspIC8gKDEgLSBrKSk7XG4gICAgX291dHB1dC5wdXNoKGspO1xuICAgIF9vdXRwdXQgPSBfb3V0cHV0Lm1hcCgoZTogbnVtYmVyKSA9PiBNYXRoLnJvdW5kKGUgKiAxMDApKS5tYXAoKGU6IG51bWJlcikgPT4gZSB8fCAwKTtcbiAgICByZXR1cm4gX291dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXRDb2xvcllJUVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyBtZXRob2QgcmV0dXJucyBkZSBZSVEgbW9kZWwgKGNvbG9yIHNwYWNlKSBmcm9tIGEgZ2l2ZW4gY29sb3IuXG4gICAqIENhbiByZWNlaXZlIHNpbmdsZSBhcmd1bWVudCAoaGV4IGNvbG9yIHN0cmluZykgb3IgdGhyZWUgbnVtYmVyIGFyZ3VtZW50cyAocmdiIGNvbG9yKS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0Q29sb3JZSVEoLi4uYXJnOiBBcnJheTxhbnk+KTogbnVtYmVyIHtcbiAgICBsZXQgX2NvbG9yOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0gYXJnO1xuICAgIGlmIChhcmcubGVuZ3RoID09PSAxICYmIHR5cGVvZiBhcmdbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICBfY29sb3IgPSB0aGlzLmhleFRvUmdiKGFyZ1swXSk7XG4gICAgfVxuICAgIGlmIChfY29sb3IubGVuZ3RoID09PSAzICYmIHR5cGVvZiBfY29sb3JbMF0gPT09ICdudW1iZXInICYmIHR5cGVvZiBfY29sb3JbMV0gPT09ICdudW1iZXInICYmIHR5cGVvZiBfY29sb3JbMl0gPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gKChfY29sb3JbMF0gKiAyOTkpICsgKF9jb2xvclsxXSAqIDU4NykgKyAoX2NvbG9yWzJdICogMTE0KSkgLyAxMDAwO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZW5lcmF0ZVV1aWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEdlbmVyYXRlcyBhIG5ldyB1dWlkIHVzaW5nIHV1aWQgZGVwZW5kZW5jeS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVVdWlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHY0KCk7XG4gIH1cblxuICAvKipcbiAgICogY2hlY2tBcnJheVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmV0dXJucyB0cnVlIGlmIHBhcmFtZXRlciBnaXZlbiBcImFycmF5XCIgaXMgYW4gYXJyYXksIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlO1xuICAgKiBJZiBvcHRpb25hbCBwYXJhbWV0ZXIgXCJmaWxsZWRcIiBpcyBnaXZlbiwgdGhlbiB0aGlzIG1ldGhvZCBjaGVja3MgdGhlIGFycmF5IGlzIG5vdCBlbXB0eS5cbiAgICogRGVmYXVsdCB2YWx1ZSBmb3IgXCJmaWxsZWRcIiBpcyB0cnVlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjaGVja0FycmF5KGFycmF5OiBhbnksIGZpbGxlZDogYm9vbGVhbiA9IHRydWUpOiBib29sZWFuIHtcbiAgICBjb25zdCBfY2hlY2tTdHJ1Y3R1cmU6IGJvb2xlYW4gPSAoISFhcnJheSAmJiBBcnJheS5pc0FycmF5KGFycmF5KSk7XG4gICAgaWYgKGZpbGxlZCkge1xuICAgICAgcmV0dXJuIChfY2hlY2tTdHJ1Y3R1cmUgJiYgISFhcnJheS5sZW5ndGgpO1xuICAgIH1cbiAgICByZXR1cm4gX2NoZWNrU3RydWN0dXJlO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0VtYWlsKGVtYWlsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBleHByOiBSZWdFeHAgPSAvXihbXFx3LS5dKylAKChcXFtbMC05XXsxLDN9XFwuWzAtOV17MSwzfVxcLlswLTldezEsM31cXC4pfCgoW1xcdy1dK1xcLikrKSkoW2EtekEtWl17Miw0fXxbMC05XXsxLDN9KShdPykkLztcbiAgICByZXR1cm4gZXhwci50ZXN0KGVtYWlsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRWYWx1ZUZyb21Eb3RlZEtleShvYmplY3Q6IGFueSwgZG90ZWRLZXk6IHN0cmluZywgc2VwYXJhdG9yPzogc3RyaW5nKTogYW55IHtcbiAgICBjb25zdCBfc2VwYXJhdG9yID0gc2VwYXJhdG9yIHx8ICcuJztcblxuICAgIGlmIChvYmplY3RbZG90ZWRLZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBvYmplY3RbZG90ZWRLZXldO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGRvdGVkS2V5LnNwbGl0KF9zZXBhcmF0b3IpLnJlZHVjZSgob2JqLCBpbmRleCkgPT4ge1xuICAgICAgICByZXR1cm4gb2JqW2luZGV4XTtcbiAgICAgIH0sIG9iamVjdCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBUeXBlRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZvcm1hdFN0cmluZyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChpc05hTihOdW1iZXIodGV4dCkpKSB7XG4gICAgICByZXR1cm4gX3N0YXJ0Q2FzZSh0ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGlkZW50aWZpZXI8VD4oaW5kZXg6IG51bWJlciwgaXRlbTogVCk6IFQge1xuICAgIGxldCBfb3V0cHV0OiBhbnkgPSAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSA/IGl0ZW0gOiBpbmRleDtcbiAgICBbJ2NvZGUnLCAnaWQnLCAncGFyYW0nLCAna2V5J10uZm9yRWFjaCgoZTogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoaXRlbS5oYXNPd25Qcm9wZXJ0eShlKSkge1xuICAgICAgICBfb3V0cHV0ID0gaXRlbVtlXTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBfb3V0cHV0O1xuICB9XG5cbiAgcHVibGljIHN0cmluZ1RyYW5zZm9ybSh0ZXh0OiBzdHJpbmcsIHRyYW5zZm9ybVR5cGU/OiBOcGFTdHJpbmdUcmFuc2Zvcm0pOiBzdHJpbmcge1xuICAgIGNvbnN0IF90cmFuc2Zvcm1UeXBlOiBOcGFTdHJpbmdUcmFuc2Zvcm0gPSB0cmFuc2Zvcm1UeXBlIHx8IG5wYVN0cmluZ1RyYW5zZm9ybS5zdGFydDtcbiAgICBsZXQgX291dHB1dDogc3RyaW5nID0gdGV4dDtcbiAgICBpZiAoaXNOYU4oTnVtYmVyKHRleHQpKSkge1xuICAgICAgc3dpdGNoIChfdHJhbnNmb3JtVHlwZSkge1xuICAgICAgICBjYXNlIG5wYVN0cmluZ1RyYW5zZm9ybS5zdGFydDpcbiAgICAgICAgICBfb3V0cHV0ID0gX3N0YXJ0Q2FzZSh0ZXh0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBucGFTdHJpbmdUcmFuc2Zvcm0uY2FtZWw6XG4gICAgICAgICAgX291dHB1dCA9IF9jYW1lbENhc2UodGV4dCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgbnBhU3RyaW5nVHJhbnNmb3JtLmtlYmFiOlxuICAgICAgICAgIF9vdXRwdXQgPSBfa2ViYWJDYXNlKHRleHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gX291dHB1dDtcbiAgfVxuXG5cbn1cbiJdfQ==