@cute-dw/core
Version:
This TypeScript library is the main part of a more powerfull package designed for the fast WEB software development. The cornerstone of the library is the **DataStore** class, which might be useful when you need a full control of the data, but do not need
181 lines • 52.2 kB
JavaScript
import { Time } from "../type/Time";
import { Types } from "../Types";
import { Dates } from "../Dates";
import { Numbers } from "../Numbers";
import { Objects } from "../Objects";
import { Strings } from "../Strings";
import { Ciphers } from "../Ciphers";
export class Functions {
static registerSystemFunction(name, func) {
name = name.trim();
Functions._sysFunc.set(name.toUpperCase(), func);
}
static registerUserFunction(name, func) {
name = name.trim();
Functions._userFunc.set(name.toUpperCase(), func);
}
static registerNamedUserFunction(func) {
if (func) {
Functions._userFunc.set(func.name.toUpperCase(), func);
}
}
static registerSystemFunctions(funcs) {
let len = funcs.length;
for (let i = 0; i < len; i++) {
Functions.registerSystemFunction(funcs[i].name, funcs[i].func);
}
}
static registerUserFunctions(funcs) {
let len = funcs.length;
for (let i = 0; i < len; i++) {
Functions.registerUserFunction(funcs[i].name, funcs[i].func);
}
}
static registerNamedUserFunctions(funcs) {
let len = funcs.length;
for (let i = 0; i < len; i++) {
Functions.registerNamedUserFunction(funcs[i]);
}
}
static unregisterUserFunction(name) {
name = name.trim();
return this._userFunc.delete(name.toUpperCase());
}
static getFunction(name) {
name = name.trim().toUpperCase();
if (Functions._sysFunc.has(name)) {
return Functions._sysFunc.get(name);
}
return Functions._userFunc.get(name);
}
}
Functions._sysFunc = new Map();
Functions._userFunc = new Map();
let isString = (v) => { return typeof (v) === "string"; };
let isDate = (v) => { return (v && (v instanceof Date)); };
// register custom system functions
Functions.registerSystemFunctions([
/* general functions */
{ name: 'between', func: (v, b1, b2) => { return v >= b1 && v <= b2; } },
{ name: 'fork', func: (v, opts, def = null) => { return (v != null && Objects.isObject(opts)) ? opts[v] : def; } },
{ name: 'ifnan', func: (v1, v2) => { return Numbers.ifNaN(v1, v2); } },
{ name: 'ifnull', func: (v1, v2) => { return Objects.ifNull(v1, v2); } },
{ name: 'iif', func: (cond, v1, v2) => { return cond ? v1 : v2; } },
{ name: 'inlist', func: (v, ...opts) => { return opts.includes(v); } },
{ name: 'isnull', func: (v) => { return (v === null); } },
{ name: 'isnumber', func: (v) => { return Objects.isNumber(v); } },
{ name: 'nullif', func: (v1, v2) => { return Objects.nullIf(v1, v2); } },
{ name: 'rgb', func: (r, g, b) => { return (r << 16) + (g << 8) + (b); } },
{ name: 'String', func: (v) => { return String(v); } },
/* string functions */
{ name: 'asc', func: (s) => { if (s == null)
return null; return s.charCodeAt(0); } },
{ name: 'char', func: (n) => { if (n == null)
return null; return String.fromCharCode(n); } },
{ name: 'charAt', func: (s, index) => { if (s == null)
return null; return ('' + s).charAt(index); } },
{ name: 'dec', func: (s) => { return Types.toDecimal(s); } },
{ name: 'decode', func: (s, f = "Base64") => { return Ciphers.decode(s, f); } },
{ name: 'encode', func: (s, f = "Base64") => { return Ciphers.encode(s, f); } },
{ name: 'endsWith', func: (s, searchFor, size) => { if (s == null)
return null; return ('' + s).endsWith(searchFor, size); } },
{ name: 'fill', func: (s, count) => { if (!isString(s))
return null; return Strings.left(s.repeat(count), count); } },
{ name: 'format', func: (t, ...x) => { return Strings.format(t, ...x); } },
{ name: 'hex', func: (n) => { return (Objects.isNumber(n)) ? n.toString(16) : ""; } },
{ name: 'integer', func: (s) => { return Types.toInteger(s); } },
{ name: 'isdate', func: (s) => { return !isNaN(Date.parse(s)); } },
{ name: 'isnumber', func: (s) => { return !isNaN(+s); } },
{ name: 'lasttoken', func: (s, d) => { if (!isString(s) || !isString(d))
return null; let [token, rest] = Strings.getLastToken(s, d); return token; } },
{ name: 'len', func: (s) => { if (!isString(s))
return null; return s?.length; } },
{ name: 'like', func: (s, searchFor) => { return Strings.like(s, searchFor); } },
{ name: 'left', func: (s, count) => { return Strings.left(s, count); } },
{ name: 'leftTrim', func: (s, chars) => { return Strings.trimLeft(s, chars); } },
{ name: 'long', func: (s) => { return Types.toType(s, "long"); } },
{ name: 'lower', func: (s) => { if (!isString(s))
return null; return s.toLowerCase(); } },
{ name: 'match', func: (s, regExp) => { if (!isString(s))
return null; return s.search(regExp) >= 0; } },
{ name: 'mid', func: (s, from, count) => { if (!isString(s))
return null; return s.substring(from, typeof (count) === "number" ? from + count : undefined); } },
{ name: 'number', func: (s) => { return Types.toNumber(s); } },
{ name: "padLeft", func: (s, size, padStr) => { if (!isString(s))
return null; return `${s}`.padStart(size, padStr); } },
{ name: "padRight", func: (s, size, padStr) => { if (!isString(s))
return null; return ('' + s).padEnd(size, padStr); } },
{ name: 'pos', func: (s, searchFor, index) => { if (!isString(s))
return null; return s.indexOf(searchFor, index); } },
{ name: 'posr', func: (s, searchFor, index) => { if (!isString(s))
return null; return s.lastIndexOf(searchFor, index); } },
{ name: 'real', func: (s) => { return Types.toNumber(s); } },
{ name: 'repeat', func: (s, count) => { if (!isString(s))
return null; return s.repeat(count); } },
{ name: 'replace', func: (s, searchFor, replaceWith, global) => { if (!isString(s))
return null; return global ? s.replace(searchFor, replaceWith) : s.replace(searchFor, replaceWith); } },
{ name: 'reverse', func: (s) => { return Strings.reverse(s); } },
{ name: 'right', func: (s, count) => { return Strings.right(s, count); } },
{ name: 'rightTrim', func: (s, chars) => { return Strings.trimRight(s, chars); } },
{ name: 'space', func: (n = 1) => { if (n < 0) {
return '';
} return ' '.repeat(n); } },
{ name: 'startsWith', func: (s, searchFor, size) => { if (!isString(s))
return null; return s.startsWith(searchFor, size); } },
{ name: 'substr', func: (s, from, to) => { if (!isString(s))
return null; return s.substring(from, to); } },
{ name: 'token', func: (s, d) => { if (!isString(s) || !isString(d))
return null; let [token, rest] = Strings.getToken(s, d); return token; } },
{ name: 'trim', func: (s, chars) => { if (!isString(s))
return null; return Strings.trimAll(s, chars); } },
{ name: 'trimEnd', func: (s, chars) => { return Strings.trimRight(s, chars); } },
{ name: 'trimStart', func: (s, chars) => { return Strings.trimLeft(s, chars); } },
{ name: 'upper', func: (s) => { if (!isString(s))
return null; return s.toUpperCase(); } },
{ name: 'wordcap', func: (s) => { if (!isString(s))
return null; return s.toLowerCase().split(' ').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(' '); } },
/* date/time functions */
{ name: 'date', func: (v) => { return (v) ? new Date(v) : new Date(); } },
{ name: 'datetime', func: (v) => { return (v) ? new Date(v) : new Date(); } },
{ name: 'day', func: (d) => { d = d ?? (new Date()); return isDate(d) ? d.getDate() : null; } },
{ name: 'dayname', func: (d) => { d = d ?? (new Date()); return isDate(d) ? d.toLocaleString('en-us', { weekday: 'long' }) : null; } },
{ name: 'daynumber', func: (d) => { d = d ?? (new Date()); return isDate(d) ? d.getDay() : null; } },
{ name: 'daysafter', func: (d1, d2) => { return Dates.daysAfter(d1, d2); } },
{ name: 'hour', func: (d) => { d = d ?? (new Date()); return isDate(d) ? d.getHours() : null; } },
{ name: 'hours', func: (d) => { d = d ?? (new Date()); return isDate(d) ? d.getHours() : null; } },
{ name: 'milliseconds', func: (d) => { d = d ?? (new Date()); return isDate(d) ? d.getMilliseconds() : null; } },
{ name: 'minutes', func: (d) => { d = d ?? (new Date()); return isDate(d) ? d.getMinutes() : null; } },
{ name: 'month', func: (d) => { d = d ?? (new Date()); return isDate(d) ? d.getMonth() : null; } },
{ name: 'now', func: () => { return Date.now(); } },
{ name: 'relativedate', func: (d, n) => { return Dates.relativeDate(d, n); } },
{ name: 'relativetime', func: (d, s) => { return Dates.relativeTime(d, s); } },
{ name: 'seconds', func: (d) => { d = d ?? (new Date()); return isDate(d) ? d.getSeconds() : null; } },
{ name: 'secondsafter', func: (d1, d2) => { return Dates.secondsAfter(d1, d2); } },
{ name: 'time', func: (v) => { return new Time(v); } },
{ name: 'today', func: () => { return new Date(); } },
{ name: 'tzoffset', func: () => { return (new Date()).getTimezoneOffset(); } },
{ name: 'weekday', func: (d) => { d = d ?? (new Date()); return isDate(d) ? d.getDay() : null; } },
{ name: 'ymd', func: (y, m, d) => { return new Date(y, m ?? 0, d ?? 1); } },
{ name: 'year', func: (d) => { d = d ?? (new Date()); return isDate(d) ? d.getFullYear() : null; } },
/* numeric functions */
{ name: 'abs', func: (x) => { let v = Math.abs(x); if (v < Number.EPSILON)
v = 0; return v; } },
{ name: 'atan', func: (n) => { return Math.atan(n); } },
{ name: 'ceil', func: (x) => { return Math.ceil(x); } },
{ name: 'cos', func: (n) => { return Math.cos(n); } },
{ name: 'exp', func: (n) => { return Math.exp(n); } },
{ name: 'floor', func: (x) => { return Math.floor(x); } },
{ name: 'greater', func: (...x) => { return Math.max(...x); } },
{ name: 'int', func: (x) => { return Math.round(x); } },
{ name: 'lesser', func: (...x) => { return Math.min(...x); } },
{ name: 'log', func: (x) => { return Math.log(x); } },
{ name: 'pi', func: (x) => { return Math.PI * ((x === undefined) ? 1 : x); } },
{ name: 'rand', func: (x) => { return Math.ceil(Math.random() * (x ?? 1)); } },
{ name: 'round', func: (x, d = 0) => { return Numbers.round(x, d); } },
{ name: 'sign', func: (n) => { return n > 0 ? 1 : (n < 0 ? -1 : 0); } },
{ name: 'sin', func: (n) => { return Math.sin(n); } },
{ name: 'sqrt', func: (x) => { return Math.sqrt(x); } },
{ name: 'tan', func: (n) => { return Math.tan(n); } },
{ name: 'truncate', func: (x, d = 0) => { return Numbers.truncate(x, d); } },
]);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3V0ZS1jb3JlL3NyYy9saWIvdXRpbC9ldmFsdWF0b3IvRnVuY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNqQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDckMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNyQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxPQUFPLEVBQWtCLE1BQU0sWUFBWSxDQUFDO0FBRXJELE1BQU0sT0FBTyxTQUFTO0lBSWxCLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxJQUFXLEVBQUUsSUFBYztRQUNyRCxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFBO1FBQ2xCLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsTUFBTSxDQUFDLG9CQUFvQixDQUFDLElBQVcsRUFBRSxJQUFjO1FBQ25ELElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkIsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxNQUFNLENBQUMseUJBQXlCLENBQUMsSUFBYztRQUMzQyxJQUFJLElBQUksRUFBRTtZQUNOLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElB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VyxJQUFJLEVBQU8sRUFBRSxHQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUUsSUFBSSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxDQUFDLEVBQUM7SUFDbkksRUFBQyxJQUFJLEVBQUMsT0FBTyxFQUFPLElBQUksRUFBRSxDQUFDLEVBQU0sRUFBRSxFQUFNLEVBQUUsRUFBRSxHQUFHLE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUEsQ0FBQSxDQUFDLEVBQUU7SUFDL0UsRUFBQyxJQUFJLEVBQUMsUUFBUSxFQUFNLElBQUksRUFBRSxDQUFDLEVBQU0sRUFBRSxFQUFNLEVBQUUsRUFBRSxHQUFHLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQSxDQUFDLEVBQUU7SUFDakYsRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFTLElBQUksRUFBRSxDQUFDLElBQVksRUFBRSxFQUFNLEVBQUUsRUFBTSxFQUFFLEVBQUUsR0FBRSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQSxDQUFDLEVBQUU7SUFDdEYsRUFBQyxJQUFJLEVBQUMsUUFBUSxFQUFNLElBQUksRUFBRSxDQUFDLENBQU0sRUFBRSxHQUFHLElBQVcsRUFBRSxFQUFFLEdBQUUsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxFQUFDO0lBQ2pGLEVBQUMsSUFBSSxFQUFDLFFBQVEsRUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFLLEVBQUMsRUFBRSxHQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUcsSUFBSSxDQUFDLENBQUEsQ0FBQSxDQUFDLEVBQUM7SUFDdkQsRUFBQyxJQUFJLEVBQUMsVUFBVSxFQUFJLElBQUksRUFBRSxDQUFDLENBQUssRUFBQyxFQUFFLEdBQUMsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxFQUFDO0lBQ2pFLEVBQUMsSUFBSSxFQUFDLFFBQVEsRUFBTSxJQUFJLEVBQUUsQ0FBQyxFQUFNLEVBQUUsRUFBTSxFQUFFLEVBQUUsR0FBRyxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUEsQ0FBQyxFQUFFO0lBQ2pGLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBUyxJQUFJLEVBQUUsQ0FBQyxDQUFRLEVBQUUsQ0FBUSxFQUFFLENBQVEsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxFQUFFO0lBQ25HLEVBQUMsSUFBSSxFQUFDLFFBQVEsRUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFLLEVBQUUsRUFBRSxHQUFFLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUEsQ0FBQyxFQUFFO0lBQ3pELHNCQUFzQjtJQUN0QixFQUFDLElBQUksRUFBQyxLQUFLLEVBQWEsSUFBSSxFQUFFLENBQUMsQ0FBUSxFQUFFLEVBQUUsR0FBRSxJQUFHLENBQUMsSUFBRSxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEVBQUU7SUFDaEcsRUFBQyxJQUFJLEVBQUMsTUFBTSxFQUFZLElBQUksRUFBRSxDQUFDLENBQVEsRUFBRSxFQUFFLEdBQUUsSUFBRyxDQUFDLElBQUUsSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsT0FBTyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxFQUFFO0lBQ3ZHLEVBQUMsSUFBSSxFQUFDLFFBQVEsRUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFRLEVBQUUsS0FBWSxFQUFFLEVBQUUsR0FBRSxJQUFHLENBQUMsSUFBRSxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBLENBQUMsRUFBRTtJQUNuSCxFQUFDLElBQUksRUFBQyxLQUFLLEVBQWEsSUFBSSxFQUFFLENBQUMsQ0FBUSxFQUFDLEVBQUUsR0FBQyxPQUFPLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEVBQUM7SUFDdkUsRUFBQyxJQUFJLEVBQUMsUUFBUSxFQUFVLElBQUksRUFBRSxDQUFDLENBQVEsRUFBRSxJQUFrQixRQUFRLEVBQUMsRUFBRSxHQUFDLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUEsQ0FBQSxDQUFDLEVBQUM7SUFDcEcsRUFBQyxJQUFJLEVBQUMsUUFBUSxFQUFVLElBQUksRUFBRSxDQUFDLENBQVEsRUFBRSxJQUFrQixRQUFRLEVBQUMsRUFBRSxHQUFDLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUEsQ0FBQSxDQUFDLEVBQUM7SUFDcEcsRUFBQyxJQUFJLEVBQUMsVUFBVSxFQUFRLElBQUksRUFBRSxDQUFDLENBQVEsRUFBRSxTQUFnQixFQUFFLElBQVksRUFBRSxFQUFFLEdBQUUsSUFBRyxDQUFDLElBQUUsSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUEsQ0FBQyxFQUFFO0lBQ2pKLEVBQUMsSUFBSSxFQUFDLE1BQU0sRUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFRLEVBQUUsS0FBWSxFQUFFLEVBQUUsR0FBRSxJQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQSxDQUFDLEVBQUM7SUFDdkksRUFBQyxJQUFJLEVBQUMsUUFBUSxFQUFVLElBQUksRUFBRSxDQUFDLENBQVEsRUFBRSxHQUFHLENBQU8sRUFBQyxFQUFFLEdBQUMsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFBLENBQUEsQ0FBQyxFQUFFO0lBQ3hGLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBYSxJQUFJLEVBQUUsQ0FBQyxDQUFRLEVBQUUsRUFBRSxHQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFBLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUEsQ0FBQyxDQUFBLEVBQUUsQ0FBQyxDQUFBLENBQUMsRUFBQztJQUM5RixFQUFDLElBQUksRUFBQyxTQUFTLEVBQVMsSUFBSSxFQUFFLENBQUMsQ0FBUSxFQUFDLEVBQUUsR0FBQyxPQUFPLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEVBQUM7SUFDdkUsRUFBQyxJQUFJLEVBQUMsUUFBUSxFQUFVLElBQUksRUFBRSxDQUFDLENBQVEsRUFBQyxFQUFFLEdBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEVBQUM7SUFDMUUsRUFBQyxJQUFJLEVBQUMsVUFBVSxFQUFRLElBQUksRUFBRSxDQUFDLENBQVEsRUFBQyxFQUFFLEdBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxFQUFDO0lBQy9ELEVBQUMsSUFBSSxFQUFDLFdBQVcsRUFBTyxJQUFJLEVBQUUsQ0FBQyxDQUFRLEVBQUUsQ0FBUSxFQUFDLEVBQUUsR0FBQyxJQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFDO0lBQ2hLLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBYSxJQUFJLEVBQUUsQ0FBQyxDQUFTLEVBQUMsRUFBRSxHQUFDLElBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLENBQUEsQ0FBQSxDQUFDLEVBQUM7SUFDNUYsRUFBQyxJQUFJLEVBQUMsTUFBTSxFQUFZLElBQUksRUFBRSxDQUFDLENBQVEsRUFBRSxTQUFnQixFQUFDLEVBQUUsR0FBQyxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFBLENBQUEsQ0FBQyxFQUFDO0lBQ2hHLEVBQUMsSUFBSSxFQUFDLE1BQU0sRUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFRLEVBQUUsS0FBWSxFQUFFLEVBQUUsR0FBRSxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUEsQ0FBQyxFQUFFO0lBQzVGLEVBQUMsSUFBSSxFQUFDLFVBQVUsRUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFRLEVBQUUsS0FBYyxFQUFFLEVBQUUsR0FBRyxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUEsQ0FBQyxFQUFFO0lBQ25HLEVBQUMsSUFBSSxFQUFDLE1BQU0sRUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFRLEVBQUMsRUFBRSxHQUFDLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFB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UyxDQUFDLEVBQUUsRUFBRSxHQUFFLElBQUksQ0FBQyxHQUFDLENBQUMsRUFBRTtZQUFDLE9BQU8sRUFBRSxDQUFDO1NBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEVBQUM7SUFDNUYsRUFBQyxJQUFJLEVBQUMsWUFBWSxFQUFNLElBQUksRUFBRSxDQUFDLENBQVEsRUFBRSxTQUFnQixFQUFFLElBQVksRUFBRSxFQUFFLEdBQUUsSUFBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxDQUFFLE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQSxDQUFDLEVBQUU7SUFDcEosRUFBQyxJQUFJLEVBQUMsUUFBUSxFQUFVLElBQUksRUFBRSxDQUFDLENBQVEsRUFBRSxJQUFXLEVBQUUsRUFBVSxFQUFFLEVBQUUsR0FBRSxJQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBLENBQUMsRUFBRTtJQUNwSSxFQUFDLElBQUksRUFBQyxPQUFPLEVBQVcsSUFBSSxFQUFFLENBQUMsQ0FBUSxFQUFFLENBQVEsRUFBQyxFQUFFLEdBQUMsSUFBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBQztJQUM1SixFQUFDLElBQUksRUFBQyxNQUFNLEVBQVksSUFBSSxFQUFFLENBQUMsQ0FBUSxFQUFFLEtBQWMsRUFBRSxFQUFFLEdBQUUsSUFBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxDQUFFLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQSxDQUFDLEVBQUU7SUFDaEksRUFBQyxJQUFJLEVBQUMsU0FBUyxFQUFTLElBQUksRUFBRSxDQUFDLENBQVEsRUFBRSxLQUFjLEVBQUUsRUFBRSxHQUFHLE9BQU8sT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQSxDQUFDLEVBQUU7SUFDcEcsRUFBQyxJQUFJLEVBQUMsV0FBVyxFQUFPLElBQUksRUFBRSxDQUFDLENBQVEsRUFBRSxLQUFjLEVBQUUsRUFBRSxHQUFHLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQSxDQUFDLEVBQUU7SUFDbkcsRUFBQyxJQUFJLEVBQUMsT0FBTyxFQUFXLElBQUksRUFBRSxDQUFDLENBQVEsRUFBRSxFQUFFLEdBQUUsSUFBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxDQUFFLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUEsQ0FBQyxFQUFFO0lBQ3RHLEVBQUMsSUFBSSxFQUFDLFNBQVMsRUFBUyxJQUFJLEVBQUUsQ0FBQyxDQUFRLEVBQUUsRUFBRSxHQUFFLElBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUMsQ0FBRSxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQSxFQUFFLENBQUEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBLENBQUEsQ0FBQyxFQUFDO0lBRS9LLHlCQUF5QjtJQUN6QixFQUFDLElBQUksRUFBQyxNQUFNLEVBQVksSUFBSSxFQUFFLENBQUMsQ0FBcUIsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFBLENBQUMsRUFBRTtJQUNuRyxFQUFDLElBQUksRUFBQyxVQUFVLEVBQVEsSUFBSSxFQUFFLENBQUMsQ0FBcUIsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFBLENBQUMsRUFBRTtJQUNuRyxFQUFDLElBQUksRUFBQyxLQUFLLEVBQWEsSUFBSSxFQUFFLENBQUMsQ0FBTyxFQUFFLEVBQUUsR0FBRSxDQUFDLEdBQUcsQ0FBQyxJQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFBLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQSxDQUFDLENBQUEsSUFBSSxDQUFBLENBQUEsQ0FBQyxFQUFFO0lBQ3JHLEVBQUMsSUFBSSxFQUFDLFNBQVMsRUFBUyxJQUFJLEVBQUUsQ0FBQyxDQUFPLEVBQUUsRUFBRSxHQUFFLENBQUMsR0FBRyxDQUFDLElBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsRUFBQyxPQUFPLEVBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQSxDQUFDLENBQUEsSUFBSSxDQUFBLENBQUEsQ0FBQyxFQUFFO0lBQ3JJLEVBQUMsSUFBSSxFQUFDLFdBQVcsRUFBTyxJQUFJLEVBQUUsQ0FBQyxDQUFPLEVBQUUsRUFBRSxHQUFFLENBQUMsR0FBRyxDQUFDLElBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUEsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFBLENBQUMsQ0FBQSxJQUFJLENBQUEsQ0FBQSxDQUFDLEVBQUU7SUFDcEcsRUFBQyxJQUFJLEVBQUMsV0FBVyxFQUFPLElBQUksRUFBRSxDQUFDLEVBQU8sRUFBRSxFQUFPLEVBQUUsRUFBRSxHQUFHLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQSxDQUFDLEVBQUU7SUFDeEYsRUFBQyxJQUFJLEVBQUMsTUFBTSxFQUFZLElBQUksRUFBRSxDQUFDLENBQU8sRUFBRSxFQUFFLEdBQUUsQ0FBQyxHQUFHLENBQUMsSUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUEsQ0FBQyxDQUFBLElBQUksQ0FBQSxDQUFBLENBQUMsRUFBRTtJQUN0RyxFQUFDLElBQUksRUFBQyxPQUFPLEVBQVcsSUFBSSxFQUFFLENBQUMsQ0FBTyxFQUFFLEVBQUUsR0FBRSxDQUFDLEdBQUcsQ0FBQyxJQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFBLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQSxDQUFDLENBQUEsSUFBSSxDQUFBLENBQUEsQ0FBQyxFQUFFO0lBQ3RHLEVBQUMsSUFBSSxFQUFDLGNBQWMsRUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFPLEVBQUUsRUFBRSxHQUFFLENBQUMsR0FBRyxDQUFDLElBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUEsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFBLENBQUMsQ0FBQSxJQUFJLENBQUEsQ0FBQSxDQUFDLEVBQUU7SUFDN0csRUFBQyxJQUFJLEVBQUMsU0FBUyxFQUFTLElBQUksRUFBRSxDQUFDLENBQU8sRUFBRSxFQUFFLEdBQUUsQ0FBQyxHQUFHLENBQUMsSUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUEsQ0FBQyxDQUFBLElBQUksQ0FBQSxDQUFBLENBQUMsRUFBRTtJQUN4RyxFQUFDLElBQUksRUFBQyxPQUFPLEVBQVcsSUFBSSxFQUFFLENBQUMsQ0FBTyxFQUFFLEVBQUUsR0FBRSxDQUFDLEdBQUcsQ0FBQyxJQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFBLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQSxDQUFDLENBQUEsSUFBSSxDQUFBLENBQUEsQ0FBQyxFQUFFO0lBQ3RHLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBYSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQSxDQUFDLEVBQUU7SUFDMUQsRUFBQyxJQUFJLEVBQUMsY0FBYyxFQUFJLElBQUksRUFBRSxDQUFDLENBQU0sRUFBRSxDQUFRLEVBQUUsRUFBRSxHQUFFLE9BQU8sS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUEsQ0FBQSxDQUFDLEVBQUU7SUFDdkYsRUFBQyxJQUFJLEVBQUMsY0FBYyxFQUFJLElBQUksRUFBRSxDQUFDLENBQU0sRUFBRSxDQUFRLEVBQUUsRUFBRSxHQUFFLE9BQU8sS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUEsQ0FBQSxDQUFDLEVBQUU7SUFDdkYsRUFBQyxJQUFJLEVBQUMsU0FBUyxFQUFTLElBQUksRUFBRSxDQUFDLENBQU8sRUFBRSxFQUFFLEdBQUUsQ0FBQyxHQUFHLENBQUMsSUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUEsQ0FBQyxDQUFBLElBQUksQ0FBQSxDQUFBLENBQUMsRUFBRTtJQUN4RyxFQUFDLElBQUksRUFBQyxjQUFjLEVBQUksSUFBSSxFQUFFLENBQUMsRUFBTyxFQUFFLEVBQU8sRUFBQyxFQUFFLEdBQUMsT0FBTyxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQSxDQUFBLENBQUMsRUFBQztJQUN0RixFQUFDLElBQUksRUFBQyxNQUFNLEVBQVksSUFBSSxFQUFFLENBQUMsQ0FBSyxFQUFFLEVBQUUsR0FBRSxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxFQUFFO0lBQ2hFLEVBQUMsSUFBSSxFQUFDLE9BQU8sRUFBVyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUUsT0FBTyxJQUFJLElBQUksRUFBRSxDQUFBLENBQUEsQ0FBQyxFQUFFO0lBQ3pELEVBQUMsSUFBSSxFQUFDLFVBQVUsRUFBUSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUUsT0FBTyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFBLENBQUEsQ0FBQyxFQUFFO0lBQy9FLEVBQUMsSUFBSSxFQUFDLFNBQVMsRUFBUyxJQUFJLEVBQUUsQ0FBQyxDQUFPLEVBQUUsRUFBRSxHQUFFLENBQUMsR0FBRyxDQUFDLElBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUEsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFBLENBQUMsQ0FBQSxJQUFJLENBQUEsQ0FBQSxDQUFDLEVBQUU7SUFDcEcsRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFhLElBQUksRUFBRSxDQUFDLENBQVEsRUFBQyxDQUFTLEVBQUMsQ0FBUyxFQUFFLEVBQUUsR0FBRyxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsRUFBQyxDQUFDLElBQUUsQ0FBQyxFQUFDLENBQUMsSUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsRUFBRTtJQUNsRyxFQUFDLElBQUksRUFBQyxNQUFNLEVBQVksSUFBSSxFQUFFLENBQUMsQ0FBTyxFQUFFLEVBQUUsR0FBRSxDQUFDLEdBQUcsQ0FBQyxJQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFBLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQSxDQUFDLENBQUEsSUFBSSxDQUFBLENBQUEsQ0FBQyxFQUFFO0lBQ3pHLHVCQUF1QjtJQUN2QixFQUFDLElBQUksRUFBQyxLQUFLLEVBQWEsSUFBSSxFQUFFLENBQUMsQ0FBUSxFQUFFLEVBQUUsR0FBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU87WUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQSxDQUFDLEVBQUU7SUFDN0csRUFBQyxJQUFJLEVBQUMsTUFBTSxFQUFZLElBQUksRUFBRSxDQUFDLENBQVEsRUFBQyxFQUFFLEdBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUEsQ0FBQyxFQUFDO0lBQ2hFLEVBQUMsSUFBSSxFQUFDLE1BQU0sRUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFRLEVBQUUsRUFBRSxHQUFHLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsRUFBRTtJQUNyRSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQWEsSUFBSSxFQUFFLENBQUMsQ0FBUSxFQUFDLEVBQUUsR0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQSxDQUFDLEVBQUM7SUFDL0QsRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFhLElBQUksRUFBRSxDQUFDLENBQVEsRUFBQyxFQUFFLEdBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUEsQ0FBQyxFQUFDO0lBQy9ELEVBQUMsSUFBSSxFQUFDLE9BQU8sRUFBVyxJQUFJLEVBQUUsQ0FBQyxDQUFRLEVBQUUsRUFBRSxHQUFHLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsRUFBRTtJQUN0RSxFQUFDLElBQUksRUFBQyxTQUFTLEVBQVMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFVLEVBQUUsRUFBRSxHQUFHLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxFQUFFO0lBQzVFLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBYSxJQUFJLEVBQUUsQ0FBQyxDQUFRLEVBQUUsRUFBRSxHQUFHLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsRUFBRTtJQUN0RSxFQUFDLElBQUksRUFBQyxRQUFRLEVBQVUsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFVLEVBQUUsRUFBRSxHQUFHLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxFQUFFO0lBQzVFLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBYSxJQUFJLEVBQUUsQ0FBQyxDQUFRLEVBQUUsRUFBRSxHQUFHLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsRUFBRTtJQUNwRSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQWMsSUFBSSxFQUFFLENBQUMsQ0FBUyxFQUFFLEVBQUUsR0FBRSxPQUFPLElBQUksQ0FBQyxFQUFFLEdBQUMsQ0FBQyxDQUFDLENBQUMsS0FBRyxTQUFTLENBQUMsQ0FBQSxDQUFDLENBQUEsQ0FBQyxDQUFBLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsRUFBRTtJQUN0RixFQUFDLElBQUksRUFBQyxNQUFNLEVBQVksSUFBSSxFQUFFLENBQUMsQ0FBUyxFQUFFLEVBQUUsR0FBRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQSxDQUFDLEVBQUM7SUFDeEYsRUFBQyxJQUFJLEVBQUMsT0FBTyxFQUFXLElBQUksRUFBRSxDQUFDLENBQVEsRUFBRSxJQUFTLENBQUMsRUFBRSxFQUFFLEdBQUcsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsRUFBRTtJQUN2RixFQUFDLElBQUksRUFBQyxNQUFNLEVBQVksSUFBSSxFQUFFLENBQUMsQ0FBUSxFQUFDLEVBQUUsR0FBQyxPQUFPLENBQUMsR0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFBLENBQUMsQ0FBQSxDQUFDLENBQUEsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUEsQ0FBQSxDQUFDLEVBQUM7SUFDcEUsRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFhLElBQUksRUFBRSxDQUFDLENBQVEsRUFBQyxFQUFFLEdBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUEsQ0FBQyxFQUFDO0lBQy9ELEVBQUMsSUFBSSxFQUFDLE1BQU0sRUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFRLEVBQUUsRUFBRSxHQUFFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsRUFBRTtJQUNwRSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQWEsSUFBSSxFQUFFLENBQUMsQ0FBUSxFQUFDLEVBQUUsR0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQSxDQUFDLEVBQUM7SUFDL0QsRUFBQyxJQUFJLEVBQUMsVUFBVSxFQUFRLElBQUksRUFBRSxDQUFDLENBQVEsRUFBRSxJQUFTLENBQUMsRUFBRSxFQUFFLEdBQUUsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQSxDQUFBLENBQUMsRUFBQztDQUMxRixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUaW1lIH0gZnJvbSBcIi4uL3R5cGUvVGltZVwiO1xyXG5pbXBvcnQgeyBUeXBlcyB9IGZyb20gXCIuLi9UeXBlc1wiO1xyXG5pbXBvcnQgeyBEYXRlcyB9IGZyb20gXCIuLi9EYXRlc1wiO1xyXG5pbXBvcnQgeyBOdW1iZXJzIH0gZnJvbSBcIi4uL051bWJlcnNcIjtcclxuaW1wb3J0IHsgT2JqZWN0cyB9IGZyb20gXCIuLi9PYmplY3RzXCI7XHJcbmltcG9ydCB7IFN0cmluZ3MgfSBmcm9tIFwiLi4vU3RyaW5nc1wiO1xyXG5pbXBvcnQgeyBDaXBoZXJzLCBFbmNvZGluZ0Zvcm1hdCB9IGZyb20gXCIuLi9DaXBoZXJzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25zIHtcclxuICAgIHByaXZhdGUgc3RhdGljIF9zeXNGdW5jID0gbmV3IE1hcDxzdHJpbmcsIEZ1bmN0aW9uPigpO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgX3VzZXJGdW5jID0gbmV3IE1hcDxzdHJpbmcsIEZ1bmN0aW9uPigpO1xyXG5cclxuICAgIHN0YXRpYyByZWdpc3RlclN5c3RlbUZ1bmN0aW9uKG5hbWU6c3RyaW5nLCBmdW5jOiBGdW5jdGlvbik6IHZvaWQge1xyXG4gICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxyXG4gICAgICAgIEZ1bmN0aW9ucy5fc3lzRnVuYy5zZXQobmFtZS50b1VwcGVyQ2FzZSgpLCBmdW5jKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgcmVnaXN0ZXJVc2VyRnVuY3Rpb24obmFtZTpzdHJpbmcsIGZ1bmM6IEZ1bmN0aW9uKTogdm9pZCB7XHJcbiAgICAgICAgbmFtZSA9IG5hbWUudHJpbSgpO1xyXG4gICAgICAgIEZ1bmN0aW9ucy5fdXNlckZ1bmMuc2V0KG5hbWUudG9VcHBlckNhc2UoKSwgZnVuYyk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHJlZ2lzdGVyTmFtZWRVc2VyRnVuY3Rpb24oZnVuYzogRnVuY3Rpb24pOiB2b2lkIHtcclxuICAgICAgICBpZiAoZnVuYykge1xyXG4gICAgICAgICAgICBGdW5jdGlvbnMuX3VzZXJGdW5jLnNldChmdW5jLm5hbWUudG9VcHBlckNhc2UoKSwgZnVuYyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyByZWdpc3RlclN5c3RlbUZ1bmN0aW9ucyhmdW5jczoge25hbWU6c3RyaW5nLCBmdW5jOiBGdW5jdGlvbn1bXSk6IHZvaWQge1xyXG4gICAgICAgIGxldCBsZW4gPSBmdW5jcy5sZW5ndGg7XHJcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgRnVuY3Rpb25zLnJlZ2lzdGVyU3lzdGVtRnVuY3Rpb24oZnVuY3NbaV0ubmFtZSwgZnVuY3NbaV0uZnVuYylcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHJlZ2lzdGVyVXNlckZ1bmN0aW9ucyhmdW5jczoge25hbWU6c3RyaW5nLCBmdW5jOiBGdW5jdGlvbn1bXSk6IHZvaWQge1xyXG4gICAgICAgIGxldCBsZW4gPSBmdW5jcy5sZW5ndGg7XHJcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgRnVuY3Rpb25zLnJlZ2lzdGVyVXNlckZ1bmN0aW9uKGZ1bmNzW2ldLm5hbWUsIGZ1bmNzW2ldLmZ1bmMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgcmVnaXN0ZXJOYW1lZFVzZXJGdW5jdGlvbnMoZnVuY3M6IEZ1bmN0aW9uW10pOiB2b2lkIHtcclxuICAgICAgICBsZXQgbGVuID0gZnVuY3MubGVuZ3RoO1xyXG4gICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIEZ1bmN0aW9ucy5yZWdpc3Rlck5hbWVkVXNlckZ1bmN0aW9uKGZ1bmNzW2ldKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHVucmVnaXN0ZXJVc2VyRnVuY3Rpb24obmFtZTpzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICBuYW1lID0gbmFtZS50cmltKClcclxuICAgICAgICByZXR1cm4gdGhpcy5fdXNlckZ1bmMuZGVsZXRlKG5hbWUudG9VcHBlckNhc2UoKSlcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0RnVuY3Rpb24obmFtZTogc3RyaW5nKTogRnVuY3Rpb258dW5kZWZpbmVkIHtcclxuICAgICAgICBuYW1lID0gbmFtZS50cmltKCkudG9VcHBlckNhc2UoKTtcclxuICAgICAgICBpZiAoRnVuY3Rpb25zLl9zeXNGdW5jLmhhcyhuYW1lKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gRnVuY3Rpb25zLl9zeXNGdW5jLmdldChuYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9ucy5fdXNlckZ1bmMuZ2V0KG5hbWUpO1xyXG4gICAgfVxyXG59XHJcblxyXG5sZXQgaXNTdHJpbmcgID0gKHY6YW55KTpib29sZWFuID0+IHtyZXR1cm4gdHlwZW9mKHYpPT09XCJzdHJpbmdcIn07XHJcbmxldCBpc0RhdGUgICAgPSAodjphbnkpOmJvb2xlYW4gPT4ge3JldHVybiAodiAmJiAodiBpbnN0YW5jZW9mIERhdGUpKX07XHJcblxyXG4vLyByZWdpc3RlciBjdXN0b20gc3lzdGVtIGZ1bmN0aW9uc1xyXG5GdW5jdGlvbnMucmVnaXN0ZXJTeXN0ZW1GdW5jdGlvbnMoW1xyXG4gICAgLyogZ2VuZXJhbCBmdW5jdGlvbnMgKi9cclxuICAgIHtuYW1lOidiZXR3ZWVuJywgICAgZnVuYzogKHY6YW55LCBiMTphbnksIGIyOmFueSk6IGJvb2xlYW4gPT4geyByZXR1cm4gdiA+PSBiMSAmJiB2IDw9IGIyOyB9IH0sXHJcbiAgICB7bmFtZTonZm9yaycsICAgICAgIGZ1bmM6ICh2OmFueSwgb3B0czphbnksIGRlZjogYW55ID0gbnVsbCk6IGFueSA9PiB7cmV0dXJuICh2IT1udWxsICYmIE9iamVjdHMuaXNPYmplY3Qob3B0cykpID8gb3B0c1t2XSA6IGRlZjt9fSxcclxuICAgIHtuYW1lOidpZm5hbicsICAgICAgZnVuYzogKHYxOmFueSwgdjI6YW55KSA9PiB7IHJldHVybiBOdW1iZXJzLmlmTmFOKHYxLCB2Mil9IH0sXHJcbiAgICB7bmFtZTonaWZudWxsJywgICAgIGZ1bmM6ICh2MTphbnksIHYyOmFueSkgPT4geyByZXR1cm4gT2JqZWN0cy5pZk51bGwodjEsIHYyKTt9IH0sXHJcbiAgICB7bmFtZTonaWlmJywgICAgICAgIGZ1bmM6IChjb25kOmJvb2xlYW4sIHYxOmFueSwgdjI6YW55KSA9PiB7cmV0dXJuIGNvbmQgPyB2MSA6IHYyO30gfSxcclxuICAgIHtuYW1lOidpbmxpc3QnLCAgICAgZnVuYzogKHY6IGFueSwgLi4ub3B0czogYW55W10pID0+IHtyZXR1cm4gb3B0cy5pbmNsdWRlcyh2KTt9fSxcclxuICAgIHtuYW1lOidpc251bGwnLCAgICAgZnVuYzogKHY6YW55KT0+e3JldHVybiAodj09PW51bGwpfX0sXHJcbiAgICB7bmFtZTonaXNudW1iZXInLCAgIGZ1bmM6ICh2OmFueSk9PntyZXR1cm4gT2JqZWN0cy5pc051bWJlcih2KTt9fSxcclxuICAgIHtuYW1lOidudWxsaWYnLCAgICAgZnVuYzogKHYxOmFueSwgdjI6YW55KSA9PiB7IHJldHVybiBPYmplY3RzLm51bGxJZih2MSwgdjIpO30gfSxcclxuICAgIHtuYW1lOidyZ2InLCAgICAgICAgZnVuYzogKHI6bnVtYmVyLCBnOm51bWJlciwgYjpudW1iZXIpID0+IHsgcmV0dXJuIChyIDw8IDE2KSArIChnIDw8IDgpICsgKGIpO30gfSxcclxuICAgIHtuYW1lOidTdHJpbmcnLCAgICAgZnVuYzogKHY6YW55KSA9PiB7cmV0dXJuIFN0cmluZyh2KX0gfSwgLy97IHJldHVybiAodikgPyBcIlwiK3YgIDogbnVsbDt9IH0sXHJcbiAgICAvKiBzdHJpbmcgZnVuY3Rpb25zICovXHJcbiAgICB7bmFtZTonYXNjJywgICAgICAgICAgICBmdW5jOiAoczpzdHJpbmcpID0+IHtpZihzPT1udWxsKSByZXR1cm4gbnVsbDsgcmV0dXJuIHMuY2hhckNvZGVBdCgwKTt9IH0sXHJcbiAgICB7bmFtZTonY2hhcicsICAgICAgICAgICBmdW5jOiAobjpudW1iZXIpID0+IHtpZihuPT1udWxsKSByZXR1cm4gbnVsbDsgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUobik7fSB9LFxyXG4gICAge25hbWU6J2NoYXJBdCcsICAgICAgICAgZnVuYzogKHM6c3RyaW5nLCBpbmRleDpudW1iZXIpID0+IHtpZihzPT1udWxsKSByZXR1cm4gbnVsbDsgcmV0dXJuICgnJytzKS5jaGFyQXQoaW5kZXgpO30gfSxcclxuICAgIHtuYW1lOidkZWMnLCAgICAgICAgICAgIGZ1bmM6IChzOnN0cmluZyk9PntyZXR1cm4gVHlwZXMudG9EZWNpbWFsKHMpO319LFxyXG4gICAge25hbWU6J2RlY29kZScsICAgICAgICAgZnVuYzogKHM6c3RyaW5nLCBmOiBFbmNvZGluZ0Zvcm1hdD1cIkJhc2U2NFwiKT0+e3JldHVybiBDaXBoZXJzLmRlY29kZShzLCBmKX19LFxyXG4gICAge25hbWU6J2VuY29kZScsICAgICAgICAgZnVuYzogKHM6c3RyaW5nLCBmOiBFbmNvZGluZ0Zvcm1hdD1cIkJhc2U2NFwiKT0+e3JldHVybiBDaXBoZXJzLmVuY29kZShzLCBmKX19LFxyXG4gICAge25hbWU6J2VuZHNXaXRoJywgICAgICAgZnVuYzogKHM6c3RyaW5nLCBzZWFyY2hGb3I6c3RyaW5nLCBzaXplPzpudW1iZXIpID0+IHtpZihzPT1udWxsKSByZXR1cm4gbnVsbDsgcmV0dXJuICgnJytzKS5lbmRzV2l0aChzZWFyY2hGb3IsIHNpemUpO30gfSxcclxuICAgIHtuYW1lOidmaWxsJywgICAgICAgICAgIGZ1bmM6IChzOnN0cmluZywgY291bnQ6bnVtYmVyKSA9PiB7aWYoIWlzU3RyaW5nKHMpKSByZXR1cm4gbnVsbDsgcmV0dXJuIFN0cmluZ3MubGVmdChzLnJlcGVhdChjb3VudCksIGNvdW50KTt9fSxcclxuICAgIHtuYW1lOidmb3JtYXQnLCAgICAgICAgIGZ1bmM6ICh0OnN0cmluZywgLi4ueDphbnlbXSk9PntyZXR1cm4gU3RyaW5ncy5mb3JtYXQodCwgLi4ueCl9IH0sXHJcbiAgICB7bmFtZTonaGV4JywgICAgICAgICAgICBmdW5jOiAobjpudW1iZXIpID0+IHtyZXR1cm4gKE9iamVjdHMuaXNOdW1iZXIobikpP24udG9TdHJpbmcoMTYpOlwiXCI7fX0sXHJcbiAgICB7bmFtZTonaW50ZWdlcicsICAgICAgICBmdW5jOiAoczpzdHJpbmcpPT57cmV0dXJuIFR5cGVzLnRvSW50ZWdlcihzKTt9fSxcclxuICAgIHtuYW1lOidpc2RhdGUnLCAgICAgICAgIGZ1bmM6IChzOnN0cmluZyk9PntyZXR1cm4gIWlzTmFOKERhdGUucGFyc2UocykpO319LFxyXG4gICAge25hbWU6J2lzbnVtYmVyJywgICAgICAgZnVuYzogKHM6c3RyaW5nKT0+e3JldHVybiAhaXNOYU4oK3MpO319LFxyXG4gICAge25hbWU6J2xhc3R0b2tlbicsICAgICAgZnVuYzogKHM6c3RyaW5nLCBkOnN0cmluZyk9PntpZighaXNTdHJpbmcocyl8fCFpc1N0cmluZyhkKSkgcmV0dXJuIG51bGw7IGxldCBbdG9rZW4sIHJlc3RdID0gU3RyaW5ncy5nZXRMYXN0VG9rZW4ocyxkKTsgcmV0dXJuIHRva2VuOyB9fSxcclxuICAgIHtuYW1lOidsZW4nLCAgICAgICAgICAgIGZ1bmM6IChzPzpzdHJpbmcpPT57aWYoIWlzU3RyaW5nKHMpKSByZXR1cm4gbnVsbDsgcmV0dXJuIHM/Lmxlbmd0aH19LFxyXG4gICAge25hbWU6J2xpa2UnLCAgICAgICAgICAgZnVuYzogKHM6c3RyaW5nLCBzZWFyY2hGb3I6c3RyaW5nKT0+e3JldHVybiBTdHJpbmdzLmxpa2Uocywgc2VhcmNoRm9yKX19LFxyXG4gICAge25hbWU6J2xlZnQnLCAgICAgICAgICAgZnVuYzogKHM6c3RyaW5nLCBjb3VudDpudW1iZXIpID0+IHtyZXR1cm4gU3RyaW5ncy5sZWZ0KHMsIGNvdW50KTt9IH0sXHJcbiAgICB7bmFtZTonbGVmdFRyaW0nLCAgICAgICBmdW5jOiAoczpzdHJpbmcsIGNoYXJzPzogc3RyaW5nKSA9PiB7IHJldHVybiBTdHJpbmdzLnRyaW1MZWZ0KHMsIGNoYXJzKTt9IH0sXHJcbiAgICB7bmFtZTonbG9uZycsICAgICAgICAgICBmdW5jOiAoczpzdHJpbmcpPT57cmV0dXJuIFR5cGVzLnRvVHlwZShzLCBcImxvbmdcIik7fX0sXHJcbiAgICB7bmFtZTonbG93ZXInLCAgICAgICAgICBmdW5jOiAoczpzdHJpbmcpID0+IHtpZighaXNTdHJpbmcocykpIHJldHVybiBudWxsOyAgcmV0dXJuIHMudG9Mb3dlckNhc2UoKTt9IH0sXHJcbiAgICB7bmFtZTonbWF0Y2gnLCAgICAgICAgICBmdW5jOiAoczpzdHJpbmcsIHJlZ0V4cDogUmVnRXhwKTogYm9vbGVhbnxudWxsID0+IHtpZighaXNTdHJpbmcocykpIHJldHVybiBudWxsOyAgcmV0dXJuIHMuc2VhcmNoKHJlZ0V4cCkgPj0gMDt9IH0sXHJcbiAgICB7bmFtZTonbWlkJywgICAgICAgICAgICBmdW5jOiAoczpzdHJpbmcsIGZyb206bnVtYmVyLCBjb3VudD86bnVtYmVyKSA9PiB7aWYoIWlzU3RyaW5nKHMpKSByZXR1cm4gbnVsbDsgcmV0dXJuIHMuc3Vic3RyaW5nKGZyb20sIHR5cGVvZihjb3VudCk9PT1cIm51bWJlclwiP2Zyb20rY291bnQ6dW5kZWZpbmVkKTt9IH0sXHJcbiAgICB7bmFtZTonbnVtYmVyJywgICAgICAgICBmdW5jOiAoczpzdHJpbmcpPT57cmV0dXJuIFR5cGVzLnRvTnVtYmVyKHMpO319LFxyXG4gICAge25hbWU6XCJwYWRMZWZ0XCIsICAgICAgICBmdW5jOiAoczpzdHJpbmcsIHNpemU6bnVtYmVyLCBwYWRTdHI/OnN0cmluZykgPT4ge2lmKCFpc1N0cmluZyhzKSkgcmV0dXJuIG51bGw7IHJldHVybiBgJHtzfWAucGFkU3RhcnQoc2l6ZSwgcGFkU3RyKTt9IH0sXHJcbiAgICB7bmFtZTpcInBhZFJpZ2h0XCIsICAgICAgIGZ1bmM6IChzOnN0cmluZywgc2l6ZTpudW1iZXIsIHBhZFN0cj86c3RyaW5nKSA9PiB7aWYoIWlzU3RyaW5nKHMpKSByZXR1cm4gbnVsbDsgcmV0dXJuICgnJytzKS5wYWRFbmQoc2l6ZSwgcGFkU3RyKTt9IH0sXHJcbiAgICB7bmFtZToncG9zJywgICAgICAgICAgICBmdW5jOiAoczpzdHJpbmcsIHNlYXJjaEZvcjpzdHJpbmcsIGluZGV4PzpudW1iZXIpID0+IHtpZighaXNTdHJpbmcocykpIHJldHVybiBudWxsOyByZXR1cm4gcy5pbmRleE9mKHNlYXJjaEZvciwgaW5kZXgpO30gfSxcclxuICAgIHtuYW1lOidwb3NyJywgICAgICAgICAgIGZ1bmM6IChzOnN0cmluZywgc2VhcmNoRm9yOnN0cmluZywgaW5kZXg/Om51bWJlcikgPT4ge2lmKCFpc1N0cmluZyhzKSkgcmV0dXJuIG51bGw7ICByZXR1cm4gcy5sYXN0SW5kZXhPZihzZWFyY2hGb3IsIGluZGV4KTt9IH0sXHJcbiAgICB7bmFtZToncmVhbCcsICAgICAgICAgICBmdW5jOiAoczpzdHJpbmcpID0+IHtyZXR1cm4gVHlwZXMudG9OdW1iZXIocyl9fSxcclxuICAgIHtuYW1lOidyZXBlYXQnLCAgICAgICAgIGZ1bmM6IChzOnN0cmluZywgY291bnQ6bnVtYmVyKSA9PiB7aWYoIWlzU3RyaW5nKHMpKSByZXR1cm4gbnVsbDsgIHJldHVybiBzLnJlcGVhdChjb3VudCk7fSB9LFxyXG4gICAge25hbWU6J3JlcGxhY2UnLCAgICAgICAgZnVuYzogKHM6c3RyaW5nLCBzZWFyY2hGb3I6c3RyaW5nLCByZXBsYWNlV2l0aDpzdHJpbmcsIGdsb2JhbD86Ym9vbGVhbikgPT4ge2lmKCFpc1N0cmluZyhzKSkgcmV0dXJuIG51bGw7IHJldHVybiBnbG9iYWwgPyBzLnJlcGxhY2Uoc2VhcmNoRm9yLCByZXBsYWNlV2l0aCk6IHMucmVwbGFjZShzZWFyY2hGb3IsIHJlcGxhY2VXaXRoKTt9IH0sXHJcbiAgICB7bmFtZToncmV2ZXJzZScsICAgICAgICBmdW5jOiAoczpzdHJpbmcpPT57cmV0dXJuIFN0cmluZ3MucmV2ZXJzZShzKTt9fSxcclxuICAgIHtuYW1lOidyaWdodCcsICAgICAgICAgIGZ1bmM6IChzOnN0cmluZywgY291bnQ6bnVtYmVyKSA9PiB7cmV0dXJuIFN0cmluZ3MucmlnaHQocywgY291bnQpO30gfSxcclxuICAgIHtuYW1lOidyaWdodFRyaW0nLCAgICAgIGZ1bmM6IChzOnN0cmluZywgY2hhcnM/OiBzdHJpbmcpID0+IHsgcmV0dXJuIFN0cmluZ3MudHJpbVJpZ2h0KHMsIGNoYXJzKTt9IH0sXHJcbiAgICB7bmFtZTonc3BhY2UnLCAgICAgICAgICBmdW5jOiAobjpudW1iZXI9MSkgPT4ge2lmIChuPDApIHtyZXR1cm4gJyc7fSByZXR1cm4gJyAnLnJlcGVhdChuKTt9fSxcclxuICAgIHtuYW1lOidzdGFydHNXaXRoJywgICAgIGZ1bmM6IChzOnN0cmluZywgc2VhcmNoRm9yOnN0cmluZywgc2l6ZT86bnVtYmVyKSA9PiB7aWYoIWlzU3RyaW5nKHMpKSByZXR1cm4gbnVsbDsgIHJldHVybiBzLnN0YXJ0c1dpdGgoc2VhcmNoRm9yLCBzaXplKTt9IH0sXHJcbiAgICB7bmFtZTonc3Vic3RyJywgICAgICAgICBmdW5jOiAoczpzdHJpbmcsIGZyb206bnVtYmVyLCB0bz86bnVtYmVyKSA9PiB7aWYoIWlzU3RyaW5nKHMpKSByZXR1cm4gbnVsbDsgcmV0dXJuIHMuc3Vic3RyaW5nKGZyb20sIHRvKTt9IH0sXHJcbiAgICB7bmFtZTondG9rZW4nLCAgICAgICAgICBmdW5jOiAoczpzdHJpbmcsIGQ6c3RyaW5nKT0+e2lmKCFpc1N0cmluZyhzKXx8IWlzU3RyaW5nKGQpKSByZXR1cm4gbnVsbDsgbGV0IFt0b2tlbiwgcmVzdF0gPSBTdHJpbmdzLmdldFRva2VuKHMsZCk7IHJldHVybiB0b2tlbjsgfX0sXHJcbiAgICB7bmFtZTondHJpbScsICAgICAgICAgICBmdW5jOiAoczpzdHJpbmcsIGNoYXJzPzogc3RyaW5nKSA9PiB7aWYoIWlzU3RyaW5nKHMpKSByZXR1cm4gbnVsbDsgIHJldHVybiBTdHJpbmdzLnRyaW1BbGwocywgY2hhcnMpO30gfSxcclxuICAgIHtuYW1lOid0cmltRW5kJywgICAgICAgIGZ1bmM6IChzOnN0cmluZywgY2hhcnM/OiBzdHJpbmcpID0+IHsgcmV0dXJuIFN0cmluZ3MudHJpbVJpZ2h0KHMsIGNoYXJzKTt9IH0sXHJcbiAgICB7bmFtZTondHJpbVN0YXJ0JywgICAgICBmdW5jOiAoczpzdHJpbmcsIGNoYXJzPzogc3RyaW5nKSA9PiB7IHJldHVybiBTdHJpbmdzLnRyaW1MZWZ0KHMsIGNoYXJzKTt9IH0sXHJcbiAgICB7bmFtZTondXBwZXInLCAgICAgICAgICBmdW5jOiAoczpzdHJpbmcpID0+IHtpZighaXNTdHJpbmcocykpIHJldHVybiBudWxsOyAgcmV0dXJuIHMudG9VcHBlckNhc2UoKTt9IH0sXHJcbiAgICB7bmFtZTond29yZGNhcCcsICAgICAgICBmdW5jOiAoczpzdHJpbmcpID0+IHtpZighaXNTdHJpbmcocykpIHJldHVybiBudWxsOyAgcmV0dXJuIHMudG9Mb3dlckNhc2UoKS5zcGxpdCgnICcpLm1hcCh3b3JkPT53b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3dvcmQuc2xpY2UoMSkpLmpvaW4oJyAnKX19LFxyXG5cclxuICAgIC8qIGRhdGUvdGltZSBmdW5jdGlvbnMgKi9cclxuICAgIHtuYW1lOidkYXRlJywgICAgICAgICAgIGZ1bmM6ICh2PzpzdHJpbmd8bnVtYmVyfERhdGUpID0+IHsgcmV0dXJuICh2KT8gbmV3IERhdGUodikgOiBuZXcgRGF0ZSgpO30gfSxcclxuICAgIHtuYW1lOidkYXRldGltZScsICAgICAgIGZ1bmM6ICh2PzpzdHJpbmd8bnVtYmVyfERhdGUpID0+IHsgcmV0dXJuICh2KT8gbmV3IERhdGUodikgOiBuZXcgRGF0ZSgpO30gfSxcclxuICAgIHtuYW1lOidkYXknLCAgICAgICAgICAgIGZ1bmM6IChkPzpEYXRlKSA9PiB7ZCA9IGQ/PyhuZXcgRGF0ZSgpKTsgcmV0dXJuIGlzRGF0ZShkKT9kLmdldERhdGUoKTpudWxsfSB9LFxyXG4gICAge25hbWU6J2RheW5hbWUnLCAgICAgICAgZnVuYzogKGQ/OkRhdGUpID0+IHtkID0gZD8/KG5ldyBEYXRlKCkpOyByZXR1cm4gaXNEYXRlKGQpP2QudG9Mb2NhbGVTdHJpbmcoJ2VuLXVzJywge3dlZWtkYXk6J2xvbmcnfSk6bnVsbH0gfSxcclxuICAgIHtuYW1lOidkYXludW1iZXInLCAgICAgIGZ1bmM6IChkPzpEYXRlKSA9PiB7ZCA9IGQ/PyhuZXcgRGF0ZSgpKTsgcmV0dXJuIGlzRGF0ZShkKT9kLmdldERheSgpOm51bGx9IH0sXHJcbiAgICB7bmFtZTonZGF5c2FmdGVyJywgICAgICBmdW5jOiAoZDE6RGF0ZSwgZDI6RGF0ZSkgPT4geyByZXR1cm4gRGF0ZXMuZGF5c0FmdGVyKGQxLCBkMik7fSB9LFxyXG4gICAge25hbWU6J2hvdXInLCAgICAgICAgICAgZnVuYzogKGQ/OkRhdGUpID0+IHtkID0gZD8/KG5ldyBEYXRlKCkpOyByZXR1cm4gaXNEYXRlKGQpP2QuZ2V0SG91cnMoKTpudWxsfSB9LCAgLyogQSdsYSBQb3dlckJ1aWxkZXIgKi9cclxuICAgIHtuYW1lOidob3VycycsICAgICAgICAgIGZ1bmM6IChkPzpEYXRlKSA9PiB7ZCA9IGQ/PyhuZXcgRGF0ZSgpKTsgcmV0dXJuIGlzRGF0ZShkKT9kLmdldEhvdXJzKCk6bnVsbH0gfSxcclxuICAgIHtuYW1lOidtaWxsaXNlY29uZHMnLCAgIGZ1bmM6IChkPzpEYXRlKSA9PiB7ZCA9IGQ/PyhuZXcgRGF0ZSgpKTsgcmV0dXJuIGlzRGF0ZShkKT9kLmdldE1pbGxpc2Vjb25kcygpOm51bGx9IH0sXHJcbiAgICB7bmFtZTonbWludXRlcycsICAgICAgICBmdW5jOiAoZD86RGF0ZSkgPT4ge2QgPSBkPz8obmV3IERhdGUoKSk7IHJldHVybiBpc0RhdGUoZCk/ZC5nZXRNaW51dGVzKCk6bnVsbH0gfSxcclxuICAgIHtuYW1lOidtb250aCcsICAgICAgICAgIGZ1bmM6IChkPzpEYXRlKSA9PiB7ZCA9IGQ/PyhuZXcgRGF0ZSgpKTsgcmV0dXJuIGlzRGF0ZShkKT9kLmdldE1vbnRoKCk6bnVsbH0gfSxcclxuICAgIHtuYW1lOidub3cnLCAgICAgICAgICAgIGZ1bmM6ICgpID0+IHtyZXR1cm4gRGF0ZS5ub3coKTt9IH0sXHJcbiAgICB7bmFtZToncmVsYXRpdmVkYXRlJywgICBmdW5jOiAoZDpEYXRlLCBuOm51bWJlcikgPT4ge3JldHVybiBEYXRlcy5yZWxhdGl2ZURhdGUoZCwgbil9IH0sXHJcbiAgICB7bmFtZToncmVsYXRpdmV0aW1lJywgICBmdW5jOiAoZDpEYXRlLCBzOm51bWJlcikgPT4ge3JldHVybiBEYXRlcy5yZWxhdGl2ZVRpbWUoZCwgcyl9IH0sXHJcbiAgICB7bmFtZTonc2Vjb25kcycsICAgICAgICBmdW5jOiAoZD86RGF0ZSkgPT4ge2QgPSBkPz8obmV3IERhdGUoKSk7IHJldHVybiBpc0RhdGUoZCk/ZC5nZXRTZWNvbmRzKCk6bnVsbH0gfSxcclxuICAgIHtuYW1lOidzZWNvbmRzYWZ0ZXInLCAgIGZ1bmM6IChkMTpEYXRlLCBkMjpEYXRlKT0+e3JldHVybiBEYXRlcy5zZWNvbmRzQWZ0ZXIoZDEsIGQyKX19LFxyXG4gICAge25hbWU6J3RpbWUnLCAgICAgICAgICAgZnVuYzogKHY6YW55KSA9PiB7cmV0dXJuIG5ldyBUaW1lKHYpO30gfSxcclxuICAgIHtuYW1lOid0b2RheScsICAgICAgICAgIGZ1bmM6ICgpID0+IHtyZXR1cm4gbmV3IERhdGUoKX0gfSxcclxuICAgIHtuYW1lOid0em9mZnNldCcsICAgICAgIGZ1bmM6ICgpID0+IHtyZXR1cm4gKG5ldyBEYXRlKCkpLmdldFRpbWV6b25lT2Zmc2V0KCl9IH0sXHJcbiAgICB7bmFtZTond2Vla2RheScsICAgICAgICBmdW5jOiAoZD86RGF0ZSkgPT4ge2QgPSBkPz8obmV3IERhdGUoKSk7IHJldHVybiBpc0RhdGUoZCk/ZC5nZXREYXkoKTpudWxsfSB9LFxyXG4gICAge25hbWU6J3ltZCcsICAgICAgICAgICAgZnVuYzogKHk6bnVtYmVyLG0/Om51bWJlcixkPzpudW1iZXIpID0+IHsgcmV0dXJuIG5ldyBEYXRlKHksbT8/MCxkPz8xKTt9IH0sXHJcbiAgICB7bmFtZToneWVhcicsIC