@alauda-fe/common
Version:
Alauda frontend team common codes.
222 lines • 26 kB
JavaScript
import dayjs from 'dayjs';
import { FIELD_NOT_AVAILABLE_PLACEHOLDER } from '../core/public-api';
export const CHART_LIMIT_MAX_UNIT_VALUE = 800;
export function dependOnIndicatorSeries(res, indicator) {
return indicator?.reduce((acc, pre) => {
const values = res?.find(item => item.id === pre.id)?.result[0]?.values || [];
return [
...acc,
{
name: pre.name || pre.id,
color: pre.color,
values: values.map(item => ({
x: item[0],
y: +item[1],
})),
},
];
}, []);
}
export function dependOnDataSeries(res, indicators) {
const indicator = indicators[0];
return res?.reduce((acc, pre) => {
if ([indicator.id, indicator.name].includes(pre.id)) {
// eslint-disable-next-line unicorn/better-regex
const keys = indicator?.legend?.match(/\{\{\.(.+?)\}\}/) || [
null,
indicator?.legend,
];
return [
...acc,
...pre.result.map(item => ({
name: getMetricName(keys?.[1] || indicator.metricSourceKey, item.metric),
values: item.values.map(d => ({
x: d[0],
y: +d[1],
})),
})),
];
}
return acc;
}, []);
}
export function getMetricName(metricKey, metric) {
if (!metricKey && !Object.keys(metric || {})?.length) {
return FIELD_NOT_AVAILABLE_PLACEHOLDER;
}
if (!metricKey && metric) {
return JSON.stringify(metric);
}
const metricKeys = metricKey?.split(',');
if (metricKeys?.length > 1) {
const value = metric?.[metricKeys.find(item => metric[item])];
return value || metricKey;
}
return metric[metricKey || '__query_id__'] || metricKey;
}
// 填充空数据
// eslint-disable-next-line sonarjs/cognitive-complexity
export function fillNullChartData({ start, end, step }, res = [], stepLine = false) {
if (!+start || !+end) {
return res;
}
const curStart = +start;
const curEnd = start + (end - start);
const preX = stepLine
? {
preX: dayjs(curStart)
.subtract((end - start) / 6, 's')
.valueOf(),
}
: {};
const result = [
...(curStart === res[0]?.x ? [] : [{ x: curStart, y: null, ...preX }]),
...res,
...(res.at(-1)?.x === curEnd ? [] : [{ x: curEnd, y: null }]),
];
// query 返回数据可能存在某个时间段无数据情况,会导致前端bug
// 通过 step 计算出 总数据。
// 在出现一开始数据缺失情况,先给数据添加开始时间数据,和结束时间数据。
// 在进行遍历,判读当前数据和下一跳数据事件差 是否是这个 step,
// 如果不是计算出两者相差 几条数据,然后进行填充
const data = result.reduce((acc, prev, index) => {
const diff = result[index + 1] && result[index + 1].x * 1000 - prev.x * 1000;
const stepM = step * 1000;
// 后端可能出现 +Ifn 导致成 NaN,设置为 null
const curValue = {
...prev,
y: isNaN(prev.y) ? null : prev.y,
};
if (diff && diff !== stepM) {
const total = Math.ceil(diff / stepM - 1);
const data = Array.from({ length: total || 0 })
.fill(0)
.reduce((old, _curr, i) => {
const x = i === 0 ? prev.x * 1000 + stepM : old[i - 1].x * 1000 + stepM;
return [
...old,
{
x: x / 1000,
y: null,
...(stepLine
? { preX: i === 0 ? result[index].x : old[i - 1].x }
: {}),
},
];
}, []);
return [...acc, curValue, ...data];
}
return [...acc, curValue];
}, []);
return data.sort((a, b) => a.x - b.x);
}
export function unitDealWith(data) {
return data.some(item => Math.max(...item.result.map(res => Math.max(...res.values.map(d => +d[1])))) >= CHART_LIMIT_MAX_UNIT_VALUE);
}
export function checkInterval(time, cacheTime) {
if (!time) {
return false;
}
const lastDiff = cacheTime.end - cacheTime.start;
const currDiff = time.end - time.start;
if (lastDiff === currDiff) {
const diffS = currDiff / (currDiff / time.step);
return time.end - cacheTime.end >= diffS;
}
return true;
}
export const ChartUnitType = {
CPU: 'cpu',
MEMORY: 'memory',
TIME: 'time',
MEASURE: 'measure',
Rate: 'rate',
};
export const CHART_UNIT_MAP = {
[ChartUnitType.CPU]: {
medium: {
value: 0,
unit: 'unit_m',
},
big: {
value: 1000,
unit: 'unit_core',
},
},
[ChartUnitType.MEMORY]: {
medium: {
value: 0,
unit: 'unit_Mi',
},
big: {
value: 1024,
unit: 'unit_Gi',
},
},
[ChartUnitType.TIME]: {
medium: {
value: 0,
unit: 'ms',
},
big: {
value: 1000,
unit: 's',
},
},
[ChartUnitType.MEASURE]: {
medium: {
value: 0,
unit: 'unit_KB',
},
big: {
value: 1024,
unit: 'unit_MB',
},
},
[ChartUnitType.Rate]: {
medium: {
value: 0,
unit: 'Bps',
},
big: {
value: 1000,
unit: 'Kbps',
},
},
};
export function generateMetricQueryParams({ id, value, }) {
return {
aggregator: '',
id,
labels: [
{ name: '__name__', value: 'custom' },
{ name: 'expr', value },
],
};
}
export function generateMetricQuery(expression) {
return expression.map(generateMetricQueryParams);
}
export function handleChartUnit(metrics, type) {
const data = CHART_UNIT_MAP[type];
const dealWith = unitDealWith(metrics);
if (dealWith) {
return {
unit: data.big.unit,
handleCb: (value) => +(value / data.big.value || 0).toFixed(2),
dealWith,
};
}
return {
...data.medium,
dealWith,
};
}
export function hasNoData(res) {
return (!res ||
res?.length === 0 ||
res?.every(item => {
return !item?.values?.length || item.values.every(d => d.y === null);
}));
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvbWV0cmljLWNoYXJ0L3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUUxQixPQUFPLEVBQUUsK0JBQStCLEVBQWEsTUFBTSxvQkFBb0IsQ0FBQztBQVdoRixNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxHQUFHLENBQUM7QUFFOUMsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxHQUFtQixFQUNuQixTQUFzQjtJQUV0QixPQUFPLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDcEMsTUFBTSxNQUFNLEdBQ1YsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLElBQUksRUFBRSxDQUFDO1FBQ2pFLE9BQU87WUFDTCxHQUFHLEdBQUc7WUFDTjtnQkFDRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRTtnQkFDeEIsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLO2dCQUNoQixNQUFNLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQzFCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO29CQUNWLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7aUJBQ1osQ0FBQyxDQUFDO2FBQ0o7U0FDRixDQUFDO0lBQ0osQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ1QsQ0FBQztBQUVELE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsR0FBbUIsRUFDbkIsVUFBdUI7SUFFdkIsTUFBTSxTQUFT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Q0FBQyxHQUFHO1FBQ0osR0FBRyxFQUFFLE1BQU0sS0FBSyxDQUFDO1FBQ2pCLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDaEIsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUN2RSxDQUFDLENBQUMsQ0FDSCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBkYXlqcyBmcm9tICdkYXlqcyc7XG5cbmltcG9ydCB7IEZJRUxEX05PVF9BVkFJTEFCTEVfUExBQ0VIT0xERVIsIFN0cmluZ01hcCB9IGZyb20gJy4uL2NvcmUvcHVibGljLWFwaSc7XG5pbXBvcnQgeyBDaGFydERhdGEsIENoYXJ0RGF0YUl0ZW0gfSBmcm9tICcuLi92aWV3LWNoYXJ0L3B1YmxpYy1hcGknO1xuXG5pbXBvcnQge1xuICBFeHByZXNzaW9uSXRlbSxcbiAgSW5kaWNhdG9yLFxuICBNZXRyaWNBcGlQYXJhbXMsXG4gIE1ldHJpY1F1ZXJ5SXRlbSxcbiAgTWV0cmljUmVzdWx0LFxufSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IENIQVJUX0xJTUlUX01BWF9VTklUX1ZBTFVFID0gODAwO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVwZW5kT25JbmRpY2F0b3JTZXJpZXMoXG4gIHJlczogTWV0cmljUmVzdWx0W10sXG4gIGluZGljYXRvcjogSW5kaWNhdG9yW10sXG4pOiBDaGFydERhdGFbXSB7XG4gIHJldHVybiBpbmRpY2F0b3I/LnJlZHVjZSgoYWNjLCBwcmUpID0+IHtcbiAgICBjb25zdCB2YWx1ZXMgPVxuICAgICAgcmVzPy5maW5kKGl0ZW0gPT4gaXRlbS5pZCA9PT0gcHJlLmlkKT8ucmVzdWx0WzBdPy52YWx1ZXMgfHwgW107XG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLmFjYyxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogcHJlLm5hbWUgfHwgcHJlLmlkLFxuICAgICAgICBjb2xvcjogcHJlLmNvbG9yLFxuICAgICAgICB2YWx1ZXM6IHZhbHVlcy5tYXAoaXRlbSA9PiAoe1xuICAgICAgICAgIHg6IGl0ZW1bMF0sXG4gICAgICAgICAgeTogK2l0ZW1bMV0sXG4gICAgICAgIH0pKSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfSwgW10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVwZW5kT25EYXRhU2VyaWVzKFxuICByZXM6IE1ldHJpY1Jlc3VsdFtdLFxuICBpbmRpY2F0b3JzOiBJbmRpY2F0b3JbXSxcbik6IENoYXJ0RGF0YVtdIHtcbiAgY29uc3QgaW5kaWNhdG9yID0gaW5kaWNhdG9yc1swXTtcbiAgcmV0dXJuIHJlcz8ucmVkdWNlKChhY2MsIHByZSkgPT4ge1xuICAgIGlmIChbaW5kaWNhdG9yLmlkLCBpbmRpY2F0b3IubmFtZV0uaW5jbHVkZXMocHJlLmlkKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vYmV0dGVyLXJlZ2V4XG4gICAgICBjb25zdCBrZXlzID0gaW5kaWNhdG9yPy5sZWdlbmQ/Lm1hdGNoKC9cXHtcXHtcXC4oLis/KVxcfVxcfS8pIHx8IFtcbiAgICAgICAgbnVsbCxcbiAgICAgICAgaW5kaWNhdG9yPy5sZWdlbmQsXG4gICAgICBdO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgLi4uYWNjLFxuICAgICAgICAuLi5wcmUucmVzdWx0Lm1hcChpdGVtID0+ICh7XG4gICAgICAgICAgbmFtZTogZ2V0TWV0cmljTmFtZShcbiAgICAgICAgICAgIGtleXM/LlsxXSB8fCBpbmRpY2F0b3IubWV0cmljU291cmNlS2V5LFxuICAgICAgICAgICAgaXRlbS5tZXRyaWMsXG4gICAgICAgICAgKSxcbiAgICAgICAgICB2YWx1ZXM6IGl0ZW0udmFsdWVzLm1hcChkID0+ICh7XG4gICAgICAgICAgICB4OiBkWzBdLFxuICAgICAgICAgICAgeTogK2RbMV0sXG4gICAgICAgICAgfSkpLFxuICAgICAgICB9KSksXG4gICAgICBdO1xuICAgIH1cbiAgICByZXR1cm4gYWNjO1xuICB9LCBbXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZXRyaWNOYW1lKG1ldHJpY0tleTogc3RyaW5nLCBtZXRyaWM6IFN0cmluZ01hcCkge1xuICBpZiAoIW1ldHJpY0tleSAmJiAhT2JqZWN0LmtleXMobWV0cmljIHx8IHt9KT8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIEZJRUxEX05PVF9BVkFJTEFCTEVfUExBQ0VIT0xERVI7XG4gIH1cbiAgaWYgKCFtZXRyaWNLZXkgJiYgbWV0cmljKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG1ldHJpYyk7XG4gIH1cbiAgY29uc3QgbWV0cmljS2V5cyA9IG1ldHJpY0tleT8uc3BsaXQoJywnKTtcbiAgaWYgKG1ldHJpY0tleXM/Lmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG1ldHJpYz8uW21ldHJpY0tleXMuZmluZChpdGVtID0+IG1ldHJpY1tpdGVtXSldO1xuICAgIHJldHVybiB2YWx1ZSB8fCBtZXRyaWNLZXk7XG4gIH1cbiAgcmV0dXJuIG1ldHJpY1ttZXRyaWNLZXkgfHwgJ19fcXVlcnlfaWRfXyddIHx8IG1ldHJpY0tleTtcbn1cblxuLy8g5aGr5YWF56m65pWw5o2uXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc29uYXJqcy9jb2duaXRpdmUtY29tcGxleGl0eVxuZXhwb3J0IGZ1bmN0aW9uIGZpbGxOdWxsQ2hhcnREYXRhKFxuICB7IHN0YXJ0LCBlbmQsIHN0ZXAgfTogTWV0cmljQXBpUGFyYW1zLFxuICByZXM6IEFycmF5PENoYXJ0RGF0YUl0ZW08eyB4OiBudW1iZXI7IHk6IG51bWJlciB9Pj4gPSBbXSxcbiAgc3RlcExpbmUgPSBmYWxzZSxcbikge1xuICBpZiAoIStzdGFydCB8fCAhK2VuZCkge1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBjb25zdCBjdXJTdGFydCA9ICtzdGFydDtcbiAgY29uc3QgY3VyRW5kID0gc3RhcnQgKyAoZW5kIC0gc3RhcnQpO1xuICBjb25zdCBwcmVYID0gc3RlcExpbmVcbiAgICA/IHtcbiAgICAgICAgcHJlWDogZGF5anMoY3VyU3RhcnQpXG4gICAgICAgICAgLnN1YnRyYWN0KChlbmQgLSBzdGFydCkgLyA2LCAncycpXG4gICAgICAgICAgLnZhbHVlT2YoKSxcbiAgICAgIH1cbiAgICA6IHt9O1xuICBjb25zdCByZXN1bHQgPSBbXG4gICAgLi4uKGN1clN0YXJ0ID09PSByZXNbMF0/LnggPyBbXSA6IFt7IHg6IGN1clN0YXJ0LCB5OiBudWxsLCAuLi5wcmVYIH1dKSxcbiAgICAuLi5yZXMsXG4gICAgLi4uKHJlcy5hdCgtMSk/LnggPT09IGN1ckVuZCA/IFtdIDogW3sgeDogY3VyRW5kLCB5OiBudWxsIH1dKSxcbiAgXTtcblxuICAvLyBxdWVyeSDov5Tlm57mlbDmja7lj6/og73lrZjlnKjmn5DkuKrml7bpl7TmrrXml6DmlbDmja7mg4XlhrXvvIzkvJrlr7zoh7TliY3nq69idWdcbiAgLy8g6YCa6L+HIHN0ZXAg6K6h566X5Ye6IOaAu+aVsOaNruOAglxuICAvLyDlnKjlh7rnjrDkuIDlvIDlp4vmlbDmja7nvLrlpLHmg4XlhrXvvIzlhYjnu5nmlbDmja7mt7vliqDlvIDlp4vml7bpl7TmlbDmja7vvIzlkoznu5PmnZ/ml7bpl7TmlbDmja7jgIJcbiAgLy8g5Zyo6L+b6KGM6YGN5Y6G77yM5Yik6K+75b2T5YmN5pWw5o2u5ZKM5LiL5LiA6Lez5pWw5o2u5LqL5Lu25beuIOaYr+WQpuaYr+i/meS4qiBzdGVwLFxuICAvLyDlpoLmnpzkuI3mmK/orqHnrpflh7rkuKTogIXnm7jlt64g5Yeg5p2h5pWw5o2u77yM54S25ZCO6L+b6KGM5aGr5YWFXG4gIGNvbnN0IGRhdGEgPSByZXN1bHQucmVkdWNlKChhY2MsIHByZXYsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgZGlmZiA9XG4gICAgICByZXN1bHRbaW5kZXggKyAxXSAmJiByZXN1bHRbaW5kZXggKyAxXS54ICogMTAwMCAtIHByZXYueCAqIDEwMDA7XG4gICAgY29uc3Qgc3RlcE0gPSBzdGVwICogMTAwMDtcbiAgICAvLyDlkI7nq6/lj6/og73lh7rnjrAgK0lmbiDlr7zoh7TmiJAgTmFO77yM6K6+572u5Li6IG51bGxcbiAgICBjb25zdCBjdXJWYWx1ZSA9IHtcbiAgICAgIC4uLnByZXYsXG4gICAgICB5OiBpc05hTihwcmV2LnkpID8gbnVsbCA6IHByZXYueSxcbiAgICB9O1xuICAgIGlmIChkaWZmICYmIGRpZmYgIT09IHN0ZXBNKSB7XG4gICAgICBjb25zdCB0b3RhbCA9IE1hdGguY2VpbChkaWZmIC8gc3RlcE0gLSAxKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBBcnJheS5mcm9tPG51bWJlcj4oeyBsZW5ndGg6IHRvdGFsIHx8IDAgfSlcbiAgICAgICAgLmZpbGwoMClcbiAgICAgICAgLnJlZHVjZSgob2xkLCBfY3VyciwgaSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHggPVxuICAgICAgICAgICAgaSA9PT0gMCA/IHByZXYueCAqIDEwMDAgKyBzdGVwTSA6IG9sZFtpIC0gMV0ueCAqIDEwMDAgKyBzdGVwTTtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgLi4ub2xkLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB4OiB4IC8gMTAwMCxcbiAgICAgICAgICAgICAgeTogbnVsbCxcbiAgICAgICAgICAgICAgLi4uKHN0ZXBMaW5lXG4gICAgICAgICAgICAgICAgPyB7IHByZVg6IGkgPT09IDAgPyByZXN1bHRbaW5kZXhdLnggOiBvbGRbaSAtIDFdLnggfVxuICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdO1xuICAgICAgICB9LCBbXSk7XG4gICAgICByZXR1cm4gWy4uLmFjYywgY3VyVmFsdWUsIC4uLmRhdGFdO1xuICAgIH1cbiAgICByZXR1cm4gWy4uLmFjYywgY3VyVmFsdWVdO1xuICB9LCBbXSk7XG4gIHJldHVybiBkYXRhLnNvcnQoKGEsIGIpID0+IGEueCAtIGIueCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bml0RGVhbFdpdGgoZGF0YTogTWV0cmljUmVzdWx0W10pIHtcbiAgcmV0dXJuIGRhdGEuc29tZShcbiAgICBpdGVtID0+XG4gICAgICBNYXRoLm1heChcbiAgICAgICAgLi4uaXRlbS5yZXN1bHQubWFwKHJlcyA9PiBNYXRoLm1heCguLi5yZXMudmFsdWVzLm1hcChkID0+ICtkWzFdKSkpLFxuICAgICAgKSA+PSBDSEFSVF9MSU1JVF9NQVhfVU5JVF9WQUxVRSxcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSW50ZXJ2YWwoXG4gIHRpbWU6IE1ldHJpY0FwaVBhcmFtcyxcbiAgY2FjaGVUaW1lOiBNZXRyaWNBcGlQYXJhbXMsXG4pIHtcbiAgaWYgKCF0aW1lKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGxhc3REaWZmID0gY2FjaGVUaW1lLmVuZCAtIGNhY2hlVGltZS5zdGFydDtcbiAgY29uc3QgY3VyckRpZmYgPSB0aW1lLmVuZCAtIHRpbWUuc3RhcnQ7XG4gIGlmIChsYXN0RGlmZiA9PT0gY3VyckRpZmYpIHtcbiAgICBjb25zdCBkaWZmUyA9IGN1cnJEaWZmIC8gKGN1cnJEaWZmIC8gdGltZS5zdGVwKTtcbiAgICByZXR1cm4gdGltZS5lbmQgLSBjYWNoZVRpbWUuZW5kID49IGRpZmZTO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgY29uc3QgQ2hhcnRVbml0VHlwZSA9IHtcbiAgQ1BVOiAnY3B1JyxcbiAgTUVNT1JZOiAnbWVtb3J5JyxcbiAgVElNRTogJ3RpbWUnLFxuICBNRUFTVVJFOiAnbWVhc3VyZScsXG4gIFJhdGU6ICdyYXRlJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBDaGFydFVuaXRUeXBlID0gKHR5cGVvZiBDaGFydFVuaXRUeXBlKVtrZXlvZiB0eXBlb2YgQ2hhcnRVbml0VHlwZV07XG5leHBvcnQgY29uc3QgQ0hBUlRfVU5JVF9NQVAgPSB7XG4gIFtDaGFydFVuaXRUeXBlLkNQVV06IHtcbiAgICBtZWRpdW06IHtcbiAgICAgIHZhbHVlOiAwLFxuICAgICAgdW5pdDogJ3VuaXRfbScsXG4gICAgfSxcbiAgICBiaWc6IHtcbiAgICAgIHZhbHVlOiAxMDAwLFxuICAgICAgdW5pdDogJ3VuaXRfY29yZScsXG4gICAgfSxcbiAgfSxcbiAgW0NoYXJ0VW5pdFR5cGUuTUVNT1JZXToge1xuICAgIG1lZGl1bToge1xuICAgICAgdmFsdWU6IDAsXG4gICAgICB1bml0OiAndW5pdF9NaScsXG4gICAgfSxcbiAgICBiaWc6IHtcbiAgICAgIHZhbHVlOiAxMDI0LFxuICAgICAgdW5pdDogJ3VuaXRfR2knLFxuICAgIH0sXG4gIH0sXG4gIFtDaGFydFVuaXRUeXBlLlRJTUVdOiB7XG4gICAgbWVkaXVtOiB7XG4gICAgICB2YWx1ZTogMCxcbiAgICAgIHVuaXQ6ICdtcycsXG4gICAgfSxcbiAgICBiaWc6IHtcbiAgICAgIHZhbHVlOiAxMDAwLFxuICAgICAgdW5pdDogJ3MnLFxuICAgIH0sXG4gIH0sXG4gIFtDaGFydFVuaXRUeXBlLk1FQVNVUkVdOiB7XG4gICAgbWVkaXVtOiB7XG4gICAgICB2YWx1ZTogMCxcbiAgICAgIHVuaXQ6ICd1bml0X0tCJyxcbiAgICB9LFxuICAgIGJpZzoge1xuICAgICAgdmFsdWU6IDEwMjQsXG4gICAgICB1bml0OiAndW5pdF9NQicsXG4gICAgfSxcbiAgfSxcbiAgW0NoYXJ0VW5pdFR5cGUuUmF0ZV06IHtcbiAgICBtZWRpdW06IHtcbiAgICAgIHZhbHVlOiAwLFxuICAgICAgdW5pdDogJ0JwcycsXG4gICAgfSxcbiAgICBiaWc6IHtcbiAgICAgIHZhbHVlOiAxMDAwLFxuICAgICAgdW5pdDogJ0ticHMnLFxuICAgIH0sXG4gIH0sXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNZXRyaWNRdWVyeVBhcmFtcyh7XG4gIGlkLFxuICB2YWx1ZSxcbn06IEV4cHJlc3Npb25JdGVtKTogTWV0cmljUXVlcnlJdGVtIHtcbiAgcmV0dXJuIHtcbiAgICBhZ2dyZWdhdG9yOiAnJyxcbiAgICBpZCxcbiAgICBsYWJlbHM6IFtcbiAgICAgIHsgbmFtZTogJ19fbmFtZV9fJywgdmFsdWU6ICdjdXN0b20nIH0sXG4gICAgICB7IG5hbWU6ICdleHByJywgdmFsdWUgfSxcbiAgICBdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNZXRyaWNRdWVyeShleHByZXNzaW9uOiBFeHByZXNzaW9uSXRlbVtdKSB7XG4gIHJldHVybiBleHByZXNzaW9uLm1hcChnZW5lcmF0ZU1ldHJpY1F1ZXJ5UGFyYW1zKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZUNoYXJ0VW5pdChtZXRyaWNzOiBNZXRyaWNSZXN1bHRbXSwgdHlwZTogQ2hhcnRVbml0VHlwZSkge1xuICBjb25zdCBkYXRhID0gQ0hBUlRfVU5JVF9NQVBbdHlwZV07XG4gIGNvbnN0IGRlYWxXaXRoID0gdW5pdERlYWxXaXRoKG1ldHJpY3MpO1xuICBpZiAoZGVhbFdpdGgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdW5pdDogZGF0YS5iaWcudW5pdCxcbiAgICAgIGhhbmRsZUNiOiAodmFsdWU6IG51bWJlcikgPT4gKyh2YWx1ZSAvIGRhdGEuYmlnLnZhbHVlIHx8IDApLnRvRml4ZWQoMiksXG4gICAgICBkZWFsV2l0aCxcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgLi4uZGF0YS5tZWRpdW0sXG4gICAgZGVhbFdpdGgsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNOb0RhdGEocmVzOiBDaGFydERhdGFbXSkge1xuICByZXR1cm4gKFxuICAgICFyZXMgfHxcbiAgICByZXM/Lmxlbmd0aCA9PT0gMCB8fFxuICAgIHJlcz8uZXZlcnkoaXRlbSA9PiB7XG4gICAgICByZXR1cm4gIWl0ZW0/LnZhbHVlcz8ubGVuZ3RoIHx8IGl0ZW0udmFsdWVzLmV2ZXJ5KGQgPT4gZC55ID09PSBudWxsKTtcbiAgICB9KVxuICApO1xufVxuIl19