@synerty/vortexjs
Version:
Custom observable data serialisation and routing based on Angular 2+
157 lines • 16.4 kB
JavaScript
/**
* Created by Jarrod Chesney / Synerty on 22/11/16.
*/
// ----------------------------------------------------------------------------
/**
* Keys from Object
*
* Extract an array of keys from a json object.
* This will not include keys starting with an underscore.
*
* @param obj: The object to get the keys from.
* @param includeUnderscore: Should keys with underscores be included?
* @return A list of keys from the object.
*/
export function dictKeysFromObject(obj, includeUnderscore = false) {
let keys = [];
for (let k in obj) {
if ((!k.startsWith("_") || includeUnderscore)
&& obj.hasOwnProperty(k) && typeof k !== "function") {
keys.push(k);
}
}
return keys;
}
// ----------------------------------------------------------------------------
export class AssertException {
message;
constructor(message) {
let self = this;
self.message = message;
}
toString() {
let self = this;
return "AssertException: " + self.message;
}
}
/**
* A simple assert statement
* @param exp : The boolean to assert
* @param message : The message to log when the assertion fails.
*/
export function assert(exp, message = null) {
if (exp)
return;
console.trace();
throw new AssertException(message);
}
// ----------------------------------------------------------------------------
/**
* Create url encoded arguments
*
* @param filter : The object containing the key:value pairs to convert into a url
*
*/
export function getFiltStr(filter) {
let filtStr = "";
for (let key in filter) {
if (!filter.hasOwnProperty(key))
continue;
filtStr += (filtStr.length ? "&" : "?") + key + "=" + filter[key];
}
return filtStr;
}
// ----------------------------------------------------------------------------
/**
* Date String
*
* @return A date and time formatted to a string for log messages.
*/
export function dateStr() {
let d = new Date();
return d.toTimeString()
.split(" ")[0] + "." + d.getUTCMilliseconds() + ": ";
}
// ----------------------------------------------------------------------------
/**
* Bind a function
* @param obj : The object to bind the function for.
* @param method : The method to bind onto to the object.
*
* @return A callable function that will call the method correctly bound to "this"
*/
export function bind(obj, method) {
return function () {
return method.apply(obj, arguments);
};
}
// ----------------------------------------------------------------------------
/**
* Bind a function
* @param err : The err object to convert to a string.
*
* @return A callable function that will call the method correctly bound to "this"
*/
export function errToStr(err) {
if (err.message != null)
return err.message;
try {
let jsonStr = JSON.stringify(err);
if (jsonStr != "{}")
return jsonStr;
}
catch (ignore) {
}
return err.toString();
}
/** Deep Clone
* @param data: Deep Clone an entire JSON data structure
* @param ignoreFieldNames: An array of field names not to copy.
*
* @return A clone of the data
*/
export function deepCopy(data, ignoreFieldNames = null) {
const dict = {};
if (ignoreFieldNames != null
&& Object.prototype.toString.call(ignoreFieldNames)
.slice(8, -1) == "Array") {
for (const fieldName of ignoreFieldNames)
dict[fieldName] = true;
}
return _deepCopy(data, dict);
}
function _deepCopy(data, ignoreFieldNames) {
// If the data is null or undefined then we return undefined
if (data === null || data === undefined)
return undefined;
// Get the data type and store it
const dataType = Object.prototype.toString.call(data)
.slice(8, -1);
// DATE
if (dataType == "Date") {
const clonedDate = new Date();
clonedDate.setTime(data.getTime());
return clonedDate;
}
// OBJECT
if (dataType == "Object") {
let copiedObject = {};
for (const key of Object.keys(data)) {
if (ignoreFieldNames != null && ignoreFieldNames[key] === true)
continue;
copiedObject[key] = _deepCopy(data[key], ignoreFieldNames);
}
return copiedObject;
}
// ARRAY
if (dataType == "Array") {
let copiedArray = [];
for (const item of data)
copiedArray.push(_deepCopy(item, ignoreFieldNames));
return copiedArray;
}
return data;
}
// ----------------------------------------------------------------------------
/* Add a imports for these requires */
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXRpbE1pc2MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdm9ydGV4L1V0aWxNaXNjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsK0VBQStFO0FBQy9FOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FDOUIsR0FBTyxFQUNQLGlCQUFpQixHQUFHLEtBQUs7SUFFekIsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBQ2IsS0FBSyxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUU7UUFDZixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLGlCQUFpQixDQUFDO2VBQ3RDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssVUFBVSxFQUFFO1lBQ3JELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7U0FDZjtLQUNKO0lBQ0QsT0FBTyxJQUFJLENBQUE7QUFDZixDQUFDO0FBRUQsK0VBQStFO0FBRS9FLE1BQU0sT0FBTyxlQUFlO0lBQ3hCLE9BQU8sQ0FBUTtJQUVmLFlBQVksT0FBZTtRQUN2QixJQUFJLElBQUksR0FBRyxJQUFJLENBQUE7UUFDZixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQTtJQUMxQixDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQTtRQUNmLE9BQU8sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQTtJQUM3QyxDQUFDO0NBQ0o7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FDbEIsR0FBWSxFQUNaLFVBQXlCLElBQUk7SUFFN0IsSUFBSSxHQUFHO1FBQ0gsT0FBTTtJQUVWLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUNmLE1BQU0sSUFBSSxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDdEMs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Q0FBQTtRQUNsQyxPQUFPLFVBQVUsQ0FBQTtLQUNwQjtJQUVELFNBQVM7SUFDVCxJQUFJLFFBQVEsSUFBSSxRQUFRLEVBQUU7UUFDdEIsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFBO1FBRXJCLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNqQyxJQUFJLGdCQUFnQixJQUFJLElBQUksSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJO2dCQUMxRCxTQUFRO1lBQ1osWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtTQUM3RDtRQUVELE9BQU8sWUFBWSxDQUFBO0tBQ3RCO0lBRUQsUUFBUTtJQUNSLElBQUksUUFBUSxJQUFJLE9BQU8sRUFBRTtRQUNyQixJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUE7UUFFcEIsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJO1lBQ25CLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUE7UUFFdkQsT0FBTyxXQUFXLENBQUE7S0FDckI7SUFFRCxPQUFPLElBQUksQ0FBQTtBQUNmLENBQUM7QUFFRCwrRUFBK0U7QUFFL0Usc0NBQXNDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDcmVhdGVkIGJ5IEphcnJvZCBDaGVzbmV5IC8gU3luZXJ0eSBvbiAyMi8xMS8xNi5cbiAqL1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLyoqXG4gKiBLZXlzIGZyb20gT2JqZWN0XG4gKlxuICogRXh0cmFjdCBhbiBhcnJheSBvZiBrZXlzIGZyb20gYSBqc29uIG9iamVjdC5cbiAqIFRoaXMgd2lsbCBub3QgaW5jbHVkZSBrZXlzIHN0YXJ0aW5nIHdpdGggYW4gdW5kZXJzY29yZS5cbiAqXG4gKiBAcGFyYW0gb2JqOiBUaGUgb2JqZWN0IHRvIGdldCB0aGUga2V5cyBmcm9tLlxuICogQHBhcmFtIGluY2x1ZGVVbmRlcnNjb3JlOiBTaG91bGQga2V5cyB3aXRoIHVuZGVyc2NvcmVzIGJlIGluY2x1ZGVkP1xuICogQHJldHVybiBBIGxpc3Qgb2Yga2V5cyBmcm9tIHRoZSBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWN0S2V5c0Zyb21PYmplY3QoXG4gICAgb2JqOiB7fSxcbiAgICBpbmNsdWRlVW5kZXJzY29yZSA9IGZhbHNlXG4pOiBzdHJpbmdbXSB7XG4gICAgbGV0IGtleXMgPSBbXVxuICAgIGZvciAobGV0IGsgaW4gb2JqKSB7XG4gICAgICAgIGlmICgoIWsuc3RhcnRzV2l0aChcIl9cIikgfHwgaW5jbHVkZVVuZGVyc2NvcmUpXG4gICAgICAgICAgICAmJiBvYmouaGFzT3duUHJvcGVydHkoaykgJiYgdHlwZW9mIGsgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAga2V5cy5wdXNoKGspXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGtleXNcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgY2xhc3MgQXNzZXJ0RXhjZXB0aW9uIHtcbiAgICBtZXNzYWdlOiBzdHJpbmdcbiAgICBcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzXG4gICAgICAgIHNlbGYubWVzc2FnZSA9IG1lc3NhZ2VcbiAgICB9XG4gICAgXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzXG4gICAgICAgIHJldHVybiBcIkFzc2VydEV4Y2VwdGlvbjogXCIgKyBzZWxmLm1lc3NhZ2VcbiAgICB9XG59XG5cbi8qKlxuICogQSBzaW1wbGUgYXNzZXJ0IHN0YXRlbWVudFxuICogQHBhcmFtIGV4cCA6IFRoZSBib29sZWFuIHRvIGFzc2VydFxuICogQHBhcmFtIG1lc3NhZ2UgOiBUaGUgbWVzc2FnZSB0byBsb2cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0KFxuICAgIGV4cDogYm9vbGVhbixcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuKTogbnVsbCB7XG4gICAgaWYgKGV4cClcbiAgICAgICAgcmV0dXJuXG4gICAgXG4gICAgY29uc29sZS50cmFjZSgpXG4gICAgdGhyb3cgbmV3IEFzc2VydEV4Y2VwdGlvbihtZXNzYWdlKVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ3JlYXRlIHVybCBlbmNvZGVkIGFyZ3VtZW50c1xuICpcbiAqIEBwYXJhbSBmaWx0ZXIgOiBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGtleTp2YWx1ZSBwYWlycyB0byBjb252ZXJ0IGludG8gYSB1cmxcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWx0U3RyKGZpbHRlcjoge30pOiBzdHJpbmcge1xuICAgIGxldCBmaWx0U3RyID0gXCJcIlxuICAgIFxuICAgIGZvciAobGV0IGtleSBpbiBmaWx0ZXIpIHtcbiAgICAgICAgaWYgKCFmaWx0ZXIuaGFzT3duUHJvcGVydHkoa2V5KSlcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIFxuICAgICAgICBmaWx0U3RyICs9IChmaWx0U3RyLmxlbmd0aCA/IFwiJlwiIDogXCI/XCIpICsga2V5ICsgXCI9XCIgKyBmaWx0ZXJba2V5XVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gZmlsdFN0clxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogRGF0ZSBTdHJpbmdcbiAqXG4gKiBAcmV0dXJuIEEgZGF0ZSBhbmQgdGltZSBmb3JtYXR0ZWQgdG8gYSBzdHJpbmcgZm9yIGxvZyBtZXNzYWdlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGVTdHIoKTogc3RyaW5nIHtcbiAgICBsZXQgZCA9IG5ldyBEYXRlKClcbiAgICByZXR1cm4gZC50b1RpbWVTdHJpbmcoKVxuICAgICAgICAuc3BsaXQoXCIgXCIpWzBdICsgXCIuXCIgKyBkLmdldFVUQ01pbGxpc2Vjb25kcygpICsgXCI6IFwiXG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBCaW5kIGEgZnVuY3Rpb25cbiAqIEBwYXJhbSBvYmogOiBUaGUgb2JqZWN0IHRvIGJpbmQgdGhlIGZ1bmN0aW9uIGZvci5cbiAqIEBwYXJhbSBtZXRob2QgOiBUaGUgbWV0aG9kIHRvIGJpbmQgb250byB0byB0aGUgb2JqZWN0LlxuICpcbiAqIEByZXR1cm4gQSBjYWxsYWJsZSBmdW5jdGlvbiB0aGF0IHdpbGwgY2FsbCB0aGUgbWV0aG9kIGNvcnJlY3RseSBib3VuZCB0byBcInRoaXNcIlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZChcbiAgICBvYmo6IGFueSxcbiAgICBtZXRob2Q6IGFueVxuKTogYW55IHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbWV0aG9kLmFwcGx5KG9iaiwgYXJndW1lbnRzKVxuICAgIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEJpbmQgYSBmdW5jdGlvblxuICogQHBhcmFtIGVyciA6IFRoZSBlcnIgb2JqZWN0IHRvIGNvbnZlcnQgdG8gYSBzdHJpbmcuXG4gKlxuICogQHJldHVybiBBIGNhbGxhYmxlIGZ1bmN0aW9uIHRoYXQgd2lsbCBjYWxsIHRoZSBtZXRob2QgY29ycmVjdGx5IGJvdW5kIHRvIFwidGhpc1wiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJUb1N0cihlcnI6IGFueSk6IHN0cmluZyB7XG4gICAgXG4gICAgaWYgKGVyci5tZXNzYWdlICE9IG51bGwpXG4gICAgICAgIHJldHVybiBlcnIubWVzc2FnZVxuICAgIFxuICAgIHRyeSB7XG4gICAgICAgIGxldCBqc29uU3RyID0gSlNPTi5zdHJpbmdpZnkoZXJyKVxuICAgICAgICBpZiAoanNvblN0ciAhPSBcInt9XCIpXG4gICAgICAgICAgICByZXR1cm4ganNvblN0clxuICAgICAgICBcbiAgICB9XG4gICAgY2F0Y2ggKGlnbm9yZSkge1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gZXJyLnRvU3RyaW5nKClcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5pbnRlcmZhY2UgaWdub3JlRGljdFR5cGUge1xuICAgIFtuYW1lOiBzdHJpbmddOiBhbnlcbn1cblxuLyoqIERlZXAgQ2xvbmVcbiAqIEBwYXJhbSBkYXRhOiBEZWVwIENsb25lIGFuIGVudGlyZSBKU09OIGRhdGEgc3RydWN0dXJlXG4gKiBAcGFyYW0gaWdub3JlRmllbGROYW1lczogQW4gYXJyYXkgb2YgZmllbGQgbmFtZXMgbm90IHRvIGNvcHkuXG4gKlxuICogQHJldHVybiBBIGNsb25lIG9mIHRoZSBkYXRhXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBDb3B5KFxuICAgIGRhdGEsXG4gICAgaWdub3JlRmllbGROYW1lczogc3RyaW5nW10gfCBudWxsID0gbnVsbFxuKSB7XG4gICAgY29uc3QgZGljdDogaWdub3JlRGljdFR5cGUgPSB7fVxuICAgIGlmIChpZ25vcmVGaWVsZE5hbWVzICE9IG51bGxcbiAgICAgICAgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlnbm9yZUZpZWxkTmFtZXMpXG4gICAgICAgICAgICAuc2xpY2UoOCwgLTEpID09IFwiQXJyYXlcIikge1xuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkTmFtZSBvZiBpZ25vcmVGaWVsZE5hbWVzKVxuICAgICAgICAgICAgZGljdFtmaWVsZE5hbWVdID0gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gX2RlZXBDb3B5KGRhdGEsIGRpY3QpXG4gICAgXG59XG5cbmZ1bmN0aW9uIF9kZWVwQ29weShcbiAgICBkYXRhLFxuICAgIGlnbm9yZUZpZWxkTmFtZXM6IGlnbm9yZURpY3RUeXBlXG4pIHtcbiAgICBcbiAgICAvLyBJZiB0aGUgZGF0YSBpcyBudWxsIG9yIHVuZGVmaW5lZCB0aGVuIHdlIHJldHVybiB1bmRlZmluZWRcbiAgICBpZiAoZGF0YSA9PT0gbnVsbCB8fCBkYXRhID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICBcbiAgICAvLyBHZXQgdGhlIGRhdGEgdHlwZSBhbmQgc3RvcmUgaXRcbiAgICBjb25zdCBkYXRhVHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkYXRhKVxuICAgICAgICAuc2xpY2UoOCwgLTEpXG4gICAgXG4gICAgLy8gREFURVxuICAgIGlmIChkYXRhVHlwZSA9PSBcIkRhdGVcIikge1xuICAgICAgICBjb25zdCBjbG9uZWREYXRlID0gbmV3IERhdGUoKVxuICAgICAgICBjbG9uZWREYXRlLnNldFRpbWUoZGF0YS5nZXRUaW1lKCkpXG4gICAgICAgIHJldHVybiBjbG9uZWREYXRlXG4gICAgfVxuICAgIFxuICAgIC8vIE9CSkVDVFxuICAgIGlmIChkYXRhVHlwZSA9PSBcIk9iamVjdFwiKSB7XG4gICAgICAgIGxldCBjb3BpZWRPYmplY3QgPSB7fVxuICAgICAgICBcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZGF0YSkpIHtcbiAgICAgICAgICAgIGlmIChpZ25vcmVGaWVsZE5hbWVzICE9IG51bGwgJiYgaWdub3JlRmllbGROYW1lc1trZXldID09PSB0cnVlKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICBjb3BpZWRPYmplY3Rba2V5XSA9IF9kZWVwQ29weShkYXRhW2tleV0sIGlnbm9yZUZpZWxkTmFtZXMpXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBjb3BpZWRPYmplY3RcbiAgICB9XG4gICAgXG4gICAgLy8gQVJSQVlcbiAgICBpZiAoZGF0YVR5cGUgPT0gXCJBcnJheVwiKSB7XG4gICAgICAgIGxldCBjb3BpZWRBcnJheSA9IFtdXG4gICAgICAgIFxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZGF0YSlcbiAgICAgICAgICAgIGNvcGllZEFycmF5LnB1c2goX2RlZXBDb3B5KGl0ZW0sIGlnbm9yZUZpZWxkTmFtZXMpKVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGNvcGllZEFycmF5XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBkYXRhXG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyogQWRkIGEgaW1wb3J0cyBmb3IgdGhlc2UgcmVxdWlyZXMgKi9cbiJdfQ==