You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

376 lines
60 KiB

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
// @ts-ignore
const package_json_1 = __importDefault(require("../../../../package.json"));
/** 属性检查器:读取/写回节点与组件属性。 */
exports.default = {
async loadInspector() {
if (!this.selectedId) {
this.inspector = null;
return;
}
this.inspectorLoading = true;
try {
const res = await Editor.Message.request(package_json_1.default.name, 'query-command', { cmd: 'get-inspector', timeout: 2500, payload: { id: this.selectedId } });
this.inspector = res && res.id ? res : { error: String((res && res.error) || '获取属性失败') };
}
catch (err) {
this.inspector = { error: `获取属性失败: ${String(err)}` };
}
finally {
this.inspectorLoading = false;
}
},
async sendSet(payload) {
// 关键修复:payload 里可能混入 Vue reactive Proxy(如 vec3 属性对象),
// Editor.Message.request 经结构化克隆传参,Proxy 无法克隆会抛
// "An object could not be cloned"。发送前深拷贝为纯对象。
let plain;
try {
plain = JSON.parse(JSON.stringify(payload));
}
catch (_a) {
plain = Object.assign({}, payload);
}
try {
const res = await Editor.Message.request(package_json_1.default.name, 'query-command', { cmd: 'set-property', timeout: 1500, payload: plain });
if (!res || typeof res !== 'object') {
this.logs.push('[写回] 无响应:命令未到达游戏(检查桥接脚本版本)');
return;
}
if (res.error) {
this.logs.push(`[写回] 游戏返回: ${res.error}`);
return;
}
const label = res.node ? `${res.node}` : (payload.field || payload.key || '');
this.logs.push(`[写回] 已设置 ${label} = ${JSON.stringify(payload.value)}`);
// 单向语义:保留本地乐观值,不被游戏回读覆盖。
// 仅做一次静默回读用于诊断——若游戏逻辑/动画后覆盖了设定值,只记日志提示,
// 不回写 UI,避免"双向绑定"把编辑框刷成游戏当前值。
const e = this.inspector;
const localVal = this.getLocalValue(payload);
try {
const back = await Editor.Message.request(package_json_1.default.name, 'query-command', { cmd: 'get-inspector', timeout: 1500, payload: { id: this.selectedId } });
const cur = back && back.props && !back.error ? this.pickValue(back, payload) : undefined;
if (cur !== undefined && localVal !== undefined) {
const a = JSON.stringify(cur);
const b = JSON.stringify(localVal);
if (a !== b) {
this.logs.push(`[写回] 注意:回读值 ${a} 与设定值 ${b} 不同,可能被游戏逻辑/动画/物理每帧覆盖`);
}
}
}
catch (_b) {
/* 静默回读失败不影响编辑 */
}
finally {
// 恢复本地乐观值到 UI(若上面的回读请求把本地对象引用改了)
if (e && !e.error) {
this.applyLocalValue(e, payload, localVal);
}
}
}
catch (err) {
this.logs.push(`[写回] ${String(err)}`);
}
},
onNodeBool(field, val) {
if (!this.inspector) {
return;
}
this.inspector.props[field].v = val;
this.sendSet({ id: this.selectedId, field, value: val });
},
onNodeNumber(field, raw) {
if (!this.inspector) {
return;
}
const v = this.toNum(raw);
this.inspector.props[field].v = v;
this.sendSet({ id: this.selectedId, field, value: v });
},
onNodeVec(field, axis, raw) {
if (!this.inspector || !this.inspector.props || !this.inspector.props[field]) {
return;
}
const cur = this.inspector.props[field].v;
cur[axis] = this.toNum(raw);
this.sendSet({ id: this.selectedId, field, value: cur });
},
onCompScalar(compIdx, key, raw, t) {
if (!this.inspector) {
return;
}
const prop = this.inspector.components[compIdx].props.find((p) => p.key === key);
let val = raw;
if (t === 'number') {
val = this.toNum(raw);
}
else if (t === 'bool') {
val = raw === true || raw === 'true';
}
if (prop) {
prop.v = val;
}
this.sendSet({ id: this.selectedId, comp: compIdx, key, value: val });
},
onCompVec(compIdx, key, axis, raw) {
if (!this.inspector) {
return;
}
const prop = this.inspector.components[compIdx].props.find((p) => p.key === key);
prop.v[axis] = this.toNum(raw);
this.sendSet({ id: this.selectedId, comp: compIdx, key, value: prop.v });
},
onCompColor(compIdx, key, raw) {
if (!this.inspector) {
return;
}
const prop = this.inspector.components[compIdx].props.find((p) => p.key === key);
const v = this.arrToColor(raw);
if (prop) {
prop.v = v;
this.sendSet({ id: this.selectedId, comp: compIdx, key, value: v });
}
},
onCompArrayColor(compIdx, key, index, raw) {
if (!this.inspector) {
return;
}
const prop = this.inspector.components[compIdx].props.find((p) => p.key === key);
const v = this.arrToColor(raw);
if (prop && prop.v[index] && prop.v[index].v) {
prop.v[index].v = v;
this.sendSet({ id: this.selectedId, comp: compIdx, key, index, value: v });
}
},
onCompEnabled(compIdx, val) {
if (!this.inspector) {
return;
}
this.inspector.components[compIdx].enabled = val;
this.sendSet({ id: this.selectedId, comp: compIdx, key: '__enabled', value: val });
},
onCompEnum(compIdx, key, raw) {
if (!this.inspector) {
return;
}
const val = Number(raw);
const prop = this.inspector.components[compIdx].props.find((p) => p.key === key);
if (prop) {
prop.v = val;
}
this.sendSet({ id: this.selectedId, comp: compIdx, key, value: val });
},
onCompArray(compIdx, key, index, raw, t) {
if (!this.inspector) {
return;
}
let val = raw;
if (t === 'number') {
val = this.toNum(raw);
}
else if (t === 'bool') {
val = raw === true || raw === 'true';
}
const prop = this.inspector.components[compIdx].props.find((p) => p.key === key);
if (prop && prop.v[index]) {
prop.v[index].v = val;
}
this.sendSet({ id: this.selectedId, comp: compIdx, key, index, value: val });
},
onCompArrayVec(compIdx, key, index, axis, raw) {
if (!this.inspector) {
return;
}
const prop = this.inspector.components[compIdx].props.find((p) => p.key === key);
if (prop && prop.v[index] && prop.v[index].v) {
prop.v[index].v[axis] = this.toNum(raw);
this.sendSet({ id: this.selectedId, comp: compIdx, key, index, value: prop.v[index].v });
}
},
onCompNull(compIdx, key) {
if (!this.inspector) {
return;
}
const prop = this.inspector.components[compIdx].props.find((p) => p.key === key);
if (prop) {
prop.v = null;
}
this.sendSet({ id: this.selectedId, comp: compIdx, key, value: null });
},
/** 数组项置空(资产引用数组,如 materials)。 */
onCompArrayNull(compIdx, key, index) {
if (!this.inspector) {
return;
}
const prop = this.inspector.components[compIdx].props.find((p) => p.key === key);
if (prop && prop.v && prop.v[index]) {
prop.v[index] = { t: 'raw', v: null, editable: false };
}
this.sendSet({ id: this.selectedId, comp: compIdx, key, index, value: null });
},
/** 材质参数写回:index 为数字时定位 sharedMaterials 数组项,undefined 用 customMaterial/material。 */
onCompMaterialProp(compIdx, key, index, propKey, value) {
var _a;
if (!this.inspector) {
return;
}
const comp = this.inspector.components[compIdx];
const prop = comp === null || comp === void 0 ? void 0 : comp.props.find((p) => p.key === key);
const holder = index === undefined ? prop : (_a = prop === null || prop === void 0 ? void 0 : prop.v) === null || _a === void 0 ? void 0 : _a[index];
if (holder && holder.v && Array.isArray(holder.v.props)) {
const mp = holder.v.props.find((x) => x.key === propKey);
if (mp) {
mp.v = value;
}
}
this.sendSet({ id: this.selectedId, comp: compIdx, key: '__material_prop', index, value: { propKey, value } });
},
/** Widget 专属:写回对齐模式/边距/目标(数值字段先转数字)。 */
onWidgetSet(compIdx, key, raw) {
if (!this.inspector) {
return;
}
const comp = this.inspector.components[compIdx];
if (!comp || !comp.widget) {
return;
}
let val = raw;
if (key === 'left' || key === 'right' || key === 'top' || key === 'bottom') {
val = this.toNum(raw);
}
else if (key === 'alignMode') {
val = Number(raw);
}
comp.widget[key] = val;
if (key === '__widget_target') {
comp.widget.targetName = val ? String(val) : '';
}
this.sendSet({ id: this.selectedId, comp: compIdx, key, value: val });
},
/** Widget 专属:切换对齐标志(center 同时切水平+垂直居中;角键同时切两个边)。 */
onWidgetToggle(compIdx, key) {
if (!this.inspector) {
return;
}
const comp = this.inspector.components[compIdx];
if (!comp || !comp.widget) {
return;
}
const cornerMap = {
__top_left: ['isAlignTop', 'isAlignLeft'],
__top_right: ['isAlignTop', 'isAlignRight'],
__bottom_left: ['isAlignBottom', 'isAlignLeft'],
__bottom_right: ['isAlignBottom', 'isAlignRight'],
};
if (key === 'center') {
comp.widget.isAlignHorizontalCenter = !comp.widget.isAlignHorizontalCenter;
comp.widget.isAlignVerticalCenter = !comp.widget.isAlignVerticalCenter;
this.sendSet({ id: this.selectedId, comp: compIdx, key: 'isAlignHorizontalCenter', value: comp.widget.isAlignHorizontalCenter });
this.sendSet({ id: this.selectedId, comp: compIdx, key: 'isAlignVerticalCenter', value: comp.widget.isAlignVerticalCenter });
return;
}
const corner = cornerMap[key];
if (corner) {
for (const k of corner) {
comp.widget[k] = !comp.widget[k];
}
for (const k of corner) {
this.sendSet({ id: this.selectedId, comp: compIdx, key: k, value: comp.widget[k] });
}
return;
}
comp.widget[key] = !comp.widget[key];
this.sendSet({ id: this.selectedId, comp: compIdx, key, value: comp.widget[key] });
},
/** 兼容 ui-color 的不同输出格式,统一为 {r,g,b,a}(0-255)。 */
arrToColor(raw) {
if (Array.isArray(raw)) {
return {
r: this.toNum(raw[0]),
g: this.toNum(raw[1]),
b: this.toNum(raw[2]),
a: raw[3] !== undefined ? this.toNum(raw[3]) : 255,
};
}
if (raw && typeof raw === 'object' && 'r' in raw) {
return {
r: this.toNum(raw.r),
g: this.toNum(raw.g),
b: this.toNum(raw.b),
a: raw.a !== undefined ? this.toNum(raw.a) : 255,
};
}
return this.parseColor(raw);
},
/** ref 引用是否为节点引用(cc.Node);组件引用返回 false,用于区分 ui-node / ui-component 显示。 */
isNodeRef(p) {
return !p || !p.componentType || p.componentType === 'cc.Node';
},
/** 从当前 inspector 中取正在编辑字段的本地乐观值(写回后不该被回读覆盖)。 */
getLocalValue(payload) {
var _a, _b, _c, _d, _e, _f, _g, _h;
try {
if (payload.comp !== undefined) {
const comp = (_b = (_a = this.inspector) === null || _a === void 0 ? void 0 : _a.components) === null || _b === void 0 ? void 0 : _b[payload.comp];
const p = (_c = comp === null || comp === void 0 ? void 0 : comp.props) === null || _c === void 0 ? void 0 : _c.find((x) => x.key === payload.key);
const v = p && (payload.index === undefined ? p.v : (_e = (_d = p.v) === null || _d === void 0 ? void 0 : _d[payload.index]) === null || _e === void 0 ? void 0 : _e.v);
return v === undefined ? undefined : JSON.parse(JSON.stringify(v));
}
if (payload.field !== undefined) {
const v = (_h = (_g = (_f = this.inspector) === null || _f === void 0 ? void 0 : _f.props) === null || _g === void 0 ? void 0 : _g[payload.field]) === null || _h === void 0 ? void 0 : _h.v;
return v === undefined ? undefined : JSON.parse(JSON.stringify(v));
}
}
catch ( /* ignore */_j) { /* ignore */ }
return undefined;
},
/** 从回读结果中取同一字段实际值(对比诊断用)。 */
pickValue(back, payload) {
var _a, _b, _c, _d, _e, _f;
try {
if (payload.comp !== undefined) {
const comp = (_a = back.components) === null || _a === void 0 ? void 0 : _a[payload.comp];
const p = (_b = comp === null || comp === void 0 ? void 0 : comp.props) === null || _b === void 0 ? void 0 : _b.find((x) => x.key === payload.key);
const v = p && (payload.index === undefined ? p.v : (_d = (_c = p.v) === null || _c === void 0 ? void 0 : _c[payload.index]) === null || _d === void 0 ? void 0 : _d.v);
return v === undefined ? undefined : JSON.parse(JSON.stringify(v));
}
if (payload.field !== undefined) {
const v = (_f = (_e = back.props) === null || _e === void 0 ? void 0 : _e[payload.field]) === null || _f === void 0 ? void 0 : _f.v;
return v === undefined ? undefined : JSON.parse(JSON.stringify(v));
}
}
catch ( /* ignore */_g) { /* ignore */ }
return undefined;
},
/** 把 UI 中正在编辑的字段恢复成本地乐观值(回读请求不改写编辑框)。 */
applyLocalValue(insp, payload, val) {
var _a, _b, _c, _d;
if (val === undefined) {
return;
}
try {
if (payload.comp !== undefined) {
const comp = (_a = insp.components) === null || _a === void 0 ? void 0 : _a[payload.comp];
const p = (_b = comp === null || comp === void 0 ? void 0 : comp.props) === null || _b === void 0 ? void 0 : _b.find((x) => x.key === payload.key);
if (p) {
if (payload.index === undefined) {
p.v = val;
}
else if ((_c = p.v) === null || _c === void 0 ? void 0 : _c[payload.index]) {
p.v[payload.index].v = val;
}
}
}
else if (payload.field !== undefined && ((_d = insp.props) === null || _d === void 0 ? void 0 : _d[payload.field])) {
insp.props[payload.field].v = val;
}
}
catch ( /* ignore */_e) { /* ignore */ }
},
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zcGVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc291cmNlL3BhbmVscy9kZWZhdWx0L21ldGhvZHMvaW5zcGVjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsYUFBYTtBQUNiLDRFQUFtRDtBQUVuRCwwQkFBMEI7QUFDMUIsa0JBQWU7SUFDWCxLQUFLLENBQUMsYUFBYTtRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDdEIsT0FBTztRQUNYLENBQUM7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLElBQUksQ0FBQztZQUNELE1BQU0sR0FBRyxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQ3BDLHNCQUFXLENBQUMsSUFBVyxFQUN2QixlQUFzQixFQUN0QixFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFTLENBQ25GLENBQUM7WUFDRixJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUM3RixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxLQUFLLEVBQUUsV0FBVyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3pELENBQUM7Z0JBQVMsQ0FBQztZQUNQLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFL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SSxDQUFDO1lBQ0QsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUM3QixNQUFNLElBQUksR0FBRyxNQUFBLElBQUksQ0FBQyxVQUFVLDBDQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDN0MsTUFBTSxDQUFDLEdBQUcsTUFBQSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsS0FBSywwQ0FBRSxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMvRCxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUNKLElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQzt3QkFDOUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7b0JBQ2QsQ0FBQzt5QkFBTSxJQUFJLE1BQUEsQ0FBQyxDQUFDLENBQUMsMENBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7d0JBQzlCLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7b0JBQy9CLENBQUM7Z0JBQ0wsQ0FBQztZQUNMLENBQUM7aUJBQU0sSUFBSSxPQUFPLENBQUMsS0FBSyxLQUFLLFNBQVMsS0FBSSxNQUFBLElBQUksQ0FBQyxLQUFLLDBDQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQSxFQUFFLENBQUM7Z0JBQ3BFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDdEMsQ0FBQztRQUNMLENBQUM7UUFBQyxRQUFRLFlBQVksSUFBZCxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDNUIsQ0FBQztDQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtaWdub3JlXG5pbXBvcnQgcGFja2FnZUpTT04gZnJvbSAnLi4vLi4vLi4vLi4vcGFja2FnZS5qc29uJztcblxuLyoqIOWxnuaAp+ajgOafpeWZqO+8muivu+WPli/lhpnlm57oioLngrnkuI7nu4Tku7blsZ7mgKfjgIIgKi9cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBhc3luYyBsb2FkSW5zcGVjdG9yKHRoaXM6IGFueSkge1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRJZCkge1xuICAgICAgICAgICAgdGhpcy5pbnNwZWN0b3IgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5zcGVjdG9yTG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KFxuICAgICAgICAgICAgICAgIHBhY2thZ2VKU09OLm5hbWUgYXMgYW55LFxuICAgICAgICAgICAgICAgICdxdWVyeS1jb21tYW5kJyBhcyBhbnksXG4gICAgICAgICAgICAgICAgeyBjbWQ6ICdnZXQtaW5zcGVjdG9yJywgdGltZW91dDogMjUwMCwgcGF5bG9hZDogeyBpZDogdGhpcy5zZWxlY3RlZElkIH0gfSBhcyBhbnksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5pbnNwZWN0b3IgPSByZXMgJiYgcmVzLmlkID8gcmVzIDogeyBlcnJvcjogU3RyaW5nKChyZXMgJiYgcmVzLmVycm9yKSB8fCAn6I635Y+W5bGe5oCn5aSx6LSlJykgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmluc3BlY3RvciA9IHsgZXJyb3I6IGDojrflj5blsZ7mgKflpLHotKU6ICR7U3RyaW5nKGVycil9YCB9O1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5pbnNwZWN0b3JMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGFzeW5jIHNlbmRTZXQodGhpczogYW55LCBwYXlsb2FkOiBhbnkpIHtcbiAgICAgICAgLy8g5YWz6ZSu5L+u5aSN77yacGF5bG9hZCDph4zlj6/og73mt7flhaUgVnVlIHJlYWN0aXZlIFByb3h577yI5aaCIHZlYzMg5bGe5oCn5a+56LGh77yJ77yMXG4gICAgICAgIC8vIEVkaXRvci5NZXNzYWdlLnJlcXVlc3Qg57uP57uT5p6E5YyW5YWL6ZqG5Lyg5Y+C77yMUHJveHkg5peg5rOV5YWL6ZqG5Lya5oqbXG4gICAgICAgIC8vIFwiQW4gb2JqZWN0IGNvdWxkIG5vdCBiZSBjbG9uZWRcIuOAguWPkemAgeWJjea3seaLt+i0neS4uue6r+WvueixoeOAglxuICAgICAgICBsZXQgcGxhaW46IGFueTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHBsYWluID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwYXlsb2FkKSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcGxhaW4gPSB7IC4uLnBheWxvYWQgfTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdChcbiAgICAgICAgICAgICAgICBwYWNrYWdlSlNPTi5uYW1lIGFzIGFueSxcbiAgICAgICAgICAgICAgICAncXVlcnktY29tbWFuZCcgYXMgYW55LFxuICAgICAgICAgICAgICAgIHsgY21kOiAnc2V0LXByb3BlcnR5JywgdGltZW91dDogMTUwMCwgcGF5bG9hZDogcGxhaW4gfSBhcyBhbnksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCFyZXMgfHwgdHlwZW9mIHJlcyAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ3MucHVzaCgnW+WGmeWbnl0g5peg5ZON5bqU77ya5ZG95Luk5pyq5Yiw6L6+5ri45oiP77yI5qOA5p+l5qGl5o6l6ISa5pys54mI5pys77yJJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlcy5lcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMubG9ncy5wdXNoKGBb5YaZ5ZueXSDmuLjmiI/ov5Tlm546ICR7cmVzLmVycm9yfWApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gcmVzLm5vZGUgPyBgJHtyZXMubm9kZX1gIDogKHBheWxvYWQuZmllbGQgfHwgcGF5bG9hZC5rZXkgfHwgJycpO1xuICAgICAgICAgICAgdGhpcy5sb2dzLnB1c2goYFvlhpnlm55dIOW3suiuvue9riAke2xhYmVsfSA9ICR7SlNPTi5zdHJpbmdpZnkocGF5bG9hZC52YWx1ZSl9YCk7XG4gICAgICAgICAgICAvLyDljZXlkJHor63kuYnvvJrkv53nlZnmnKzlnLDkuZDop4LlgLzvvIzkuI3ooqvmuLjmiI/lm57or7vopobnm5bjgIJcbiAgICAgICAgICAgIC8vIOS7heWBmuS4gOasoemdmem7mOWbnuivu+eUqOS6juiviuaWreKAlOKAlOiLpea4uOaIj+mAu+i+kS/liqjnlLvlkI7opobnm5bkuoborr7lrprlgLzvvIzlj6rorrDml6Xlv5fmj5DnpLrvvIxcbiAgICAgICAgICAgIC8vIOS4jeWbnuWGmSBVSe+8jOmBv+WFjVwi5Y+M5ZCR57uR5a6aXCLmiornvJbovpHmoYbliLfmiJDmuLjmiI/lvZPliY3lgLzjgIJcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLmluc3BlY3RvcjtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFsID0gdGhpcy5nZXRMb2NhbFZhbHVlKHBheWxvYWQpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBiYWNrID0gYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdChcbiAgICAgICAgICAgICAgICAgICAgcGFja2FnZUpTT04ubmFtZSBhcyBhbnksXG4gICAgICAgICAgICAgICAgICAgICdxdWVyeS1jb21tYW5kJyBhcyBhbnksXG4gICAgICAgICAgICAgICAgICAgIHsgY21kOiAnZ2V0LWluc3BlY3RvcicsIHRpbWVvdXQ6IDE1MDAsIHBheWxvYWQ6IHsgaWQ6IHRoaXMuc2VsZWN0ZWRJZCB9IH0gYXMgYW55LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VyID0gYmFjayAmJiBiYWNrLnByb3BzICYmICFiYWNrLmVycm9yID8gdGhpcy5waWNrVmFsdWUoYmFjaywgcGF5bG9hZCkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgaWYgKGN1ciAhPT0gdW5kZWZpbmVkICYmIGxvY2FsVmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYSA9IEpTT04uc3RyaW5naWZ5KGN1cik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGIgPSBKU09OLnN0cmluZ2lmeShsb2NhbFZhbCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhICE9PSBiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ3MucHVzaChgW+WGmeWbnl0g5rOo5oSP77ya5Zue6K+75YC8ICR7YX0g5LiO6K6+5a6a5YC8ICR7Yn0g5LiN5ZCM77yM5Y+v6IO96KKr5ri45oiP6YC76L6RL+WKqOeUuy/niannkIbmr4/luKfopobnm5ZgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIC8qIOmdmem7mOWbnuivu+Wksei0peS4jeW9seWTjee8lui+kSAqL1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAvLyDmgaLlpI3mnKzlnLDkuZDop4LlgLzliLAgVUnvvIjoi6XkuIrpnaLnmoTlm57or7vor7fmsYLmiormnKzlnLDlr7nosaHlvJXnlKjmlLnkuobvvIlcbiAgICAgICAgICAgICAgICBpZiAoZSAmJiAhZS5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5TG9jYWxWYWx1ZShlLCBwYXlsb2FkLCBsb2NhbFZhbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMubG9ncy5wdXNoKGBb5YaZ5ZueXSAke1N0cmluZyhlcnIpfWApO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBvbk5vZGVCb29sKHRoaXM6IGFueSwgZmllbGQ6IHN0cmluZywgdmFsOiBib29sZWFuKSB7XG4gICAgICAgIGlmICghdGhpcy5pbnNwZWN0b3IpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluc3BlY3Rvci5wcm9wc1tmaWVsZF0udiA9IHZhbDtcbiAgICAgICAgdGhpcy5zZW5kU2V0KHsgaWQ6IHRoaXMuc2VsZWN0ZWRJZCwgZmllbGQsIHZhbHVlOiB2YWwgfSk7XG4gICAgfSxcbiAgICBvbk5vZGVOdW1iZXIodGhpczogYW55LCBmaWVsZDogc3RyaW5nLCByYXc6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMuaW5zcGVjdG9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdiA9IHRoaXMudG9OdW0ocmF3KTtcbiAgICAgICAgdGhpcy5pbnNwZWN0b3IucHJvcHNbZmllbGRdLnYgPSB2O1xuICAgICAgICB0aGlzLnNlbmRTZXQoeyBpZDogdGhpcy5zZWxlY3RlZElkLCBmaWVsZCwgdmFsdWU6IHYgfSk7XG4gICAgfSxcbiAgICBvbk5vZGVWZWModGhpczogYW55LCBmaWVsZDogc3RyaW5nLCBheGlzOiBzdHJpbmcsIHJhdzogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy5pbnNwZWN0b3IgfHwgIXRoaXMuaW5zcGVjdG9yLnByb3BzIHx8ICF0aGlzLmluc3BlY3Rvci5wcm9wc1tmaWVsZF0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdXIgPSB0aGlzLmluc3BlY3Rvci5wcm9wc1tmaWVsZF0udjtcbiAgICAgICAgY3VyW2F4aXNdID0gdGhpcy50b051bShyYXcpO1xuICAgICAgICB0aGlzLnNlbmRTZXQoeyBpZDogdGhpcy5zZWxlY3RlZElkLCBmaWVsZCwgdmFsdWU6IGN1ciB9KTtcbiAgICB9LFxuICAgIG9uQ29tcFNjYWxhcih0aGlzOiBhbnksIGNvbXBJZHg6IG51bWJlciwga2V5OiBzdHJpbmcsIHJhdzogYW55LCB0OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLmluc3BlY3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb3AgPSB0aGlzLmluc3BlY3Rvci5jb21wb25lbnRzW2NvbXBJZHhdLnByb3BzLmZpbmQoKHA6IGFueSkgPT4gcC5rZXkgPT09IGtleSk7XG4gICAgICAgIGxldCB2YWwgPSByYXc7XG4gICAgICAgIGlmICh0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdmFsID0gdGhpcy50b051bShyYXcpO1xuICAgICAgICB9IGVsc2UgaWYgKHQgPT09ICdib29sJykge1xuICAgICAgICAgICAgdmFsID0gcmF3ID09PSB0cnVlIHx8IHJhdyA9PT0gJ3RydWUnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wKSB7XG4gICAgICAgICAgICBwcm9wLnYgPSB2YWw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZW5kU2V0KHsgaWQ6IHRoaXMuc2VsZWN0ZWRJZCwgY29tcDogY29tcElkeCwga2V5LCB2YWx1ZTogdmFsIH0pO1xuICAgIH0sXG4gICAgb25Db21wVmVjKHRoaXM6IGFueSwgY29tcElkeDogbnVtYmVyLCBrZXk6IHN0cmluZywgYXhpczogc3RyaW5nLCByYXc6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMuaW5zcGVjdG9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvcCA9IHRoaXMuaW5zcGVjdG9yLmNvbXBvbmVudHNbY29tcElkeF0ucHJvcHMuZmluZCgocDogYW55KSA9PiBwLmtleSA9PT0ga2V5KTtcbiAgICAgICAgcHJvcC52W2F4aXNdID0gdGhpcy50b051bShyYXcpO1xuICAgICAgICB0aGlzLnNlbmRTZXQoeyBpZDogdGhpcy5zZWxlY3RlZElkLCBjb21wOiBjb21wSWR4LCBrZXksIHZhbHVlOiBwcm9wLnYgfSk7XG4gICAgfSxcbiAgICBvbkNvbXBDb2xvcih0aGlzOiBhbnksIGNvbXBJZHg6IG51bWJlciwga2V5OiBzdHJpbmcsIHJhdzogYW55KSB7XG4gICAgICAgIGlmICghdGhpcy5pbnNwZWN0b3IpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9wID0gdGhpcy5pbnNwZWN0b3IuY29tcG9uZW50c1tjb21wSWR4XS5wcm9wcy5maW5kKChwOiBhbnkpID0+IHAua2V5ID09PSBrZXkpO1xuICAgICAgICBjb25zdCB2ID0gdGhpcy5hcnJUb0NvbG9yKHJhdyk7XG4gICAgICAgIGlmIChwcm9wKSB7XG4gICAgICAgICAgICBwcm9wLnYgPSB2O1xuICAgICAgICAgICAgdGhpcy5zZW5kU2V0KHsgaWQ6IHRoaXMuc2VsZWN0ZWRJZCwgY29tcDogY29tcElkeCwga2V5LCB2YWx1ZTogdiB9KTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgb25Db21wQXJyYXlDb2xvcih0aGlzOiBhbnksIGNvbXBJZHg6IG51bWJlciwga2V5OiBzdHJpbmcsIGluZGV4OiBudW1iZXIsIHJhdzogYW55KSB7XG4gICAgICAgIGlmICghdGhpcy5pbnNwZWN0b3IpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9wID0gdGhpcy5pbnNwZWN0b3IuY29tcG9uZW50c1tjb21wSWR4XS5wcm9wcy5maW5kKChwOiBhbnkpID0+IHAua2V5ID09PSBrZXkpO1xuICAgICAgICBjb25zdCB2ID0gdGhpcy5hcnJUb0NvbG9yKHJhdyk7XG4gICAgICAgIGlmIChwcm9wICYmIHByb3AudltpbmRleF0gJiYgcHJvcC52W2luZGV4XS52KSB7XG4gICAgICAgICAgICBwcm9wLnZbaW5kZXhdLnYgPSB2O1xuICAgICAgICAgICAgdGhpcy5zZW5kU2V0KHsgaWQ6IHRoaXMuc2VsZWN0ZWRJZCwgY29tcDogY29tcElkeCwga2V5LCBpbmRleCwgdmFsdWU6IHYgfSk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIG9uQ29tcEVuYWJsZWQodGhpczogYW55LCBjb21wSWR4OiBudW1iZXIsIHZhbDogYm9vbGVhbikge1xuICAgICAgICBpZiAoIXRoaXMuaW5zcGVjdG9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnNwZWN0b3IuY29tcG9uZW50c1tjb21wSWR4XS5lbmFibGVkID0gdmFsO1xuICAgICAgICB0aGlzLnNlbmRTZXQoeyBpZDogdGhpcy5zZWxlY3RlZElkLCBjb21wOiBjb21wSWR4LCBrZXk6ICdfX2VuYWJsZWQnLCB2YWx1ZTogdmFsIH0pO1xuICAgIH0sXG4gICAgb25Db21wRW51bSh0aGlzOiBhbnksIGNvbXBJZHg6IG51bWJlciwga2V5OiBzdHJpbmcsIHJhdzogYW55KSB7XG4gICAgICAgIGlmICghdGhpcy5pbnNwZWN0b3IpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWwgPSBOdW1iZXIocmF3KTtcbiAgICAgICAgY29uc3QgcHJvcCA9IHRoaXMuaW5zcGVjdG9yLmNvbXBvbmVudHNbY29tcElkeF0ucHJvcHMuZmluZCgocDogYW55KSA9PiBwLmtleSA9PT0ga2V5KTtcbiAgICAgICAgaWYgKHByb3ApIHtcbiAgICAgICAgICAgIHByb3AudiA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbmRTZXQoeyBpZDogdGhpcy5zZWxlY3RlZElkLCBjb21wOiBjb21wSWR4LCBrZXksIHZhbHVlOiB2YWwgfSk7XG4gICAgfSxcbiAgICBvbkNvbXBBcnJheSh0aGlzOiBhbnksIGNvbXBJZHg6IG51bWJlciwga2V5OiBzdHJpbmcsIGluZGV4OiBudW1iZXIsIHJhdzogYW55LCB0OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLmluc3BlY3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB2YWwgPSByYXc7XG4gICAgICAgIGlmICh0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdmFsID0gdGhpcy50b051bShyYXcpO1xuICAgICAgICB9IGVsc2UgaWYgKHQgPT09ICdib29sJykge1xuICAgICAgICAgICAgdmFsID0gcmF3ID09PSB0cnVlIHx8IHJhdyA9PT0gJ3RydWUnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb3AgPSB0aGlzLmluc3BlY3Rvci5jb21wb25lbnRzW2NvbXBJZHhdLnByb3BzLmZpbmQoKHA6IGFueSkgPT4gcC5rZXkgPT09IGtleSk7XG4gICAgICAgIGlmIChwcm9wICYmIHByb3AudltpbmRleF0pIHtcbiAgICAgICAgICAgIHByb3AudltpbmRleF0udiA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbmRTZXQoeyBpZDogdGhpcy5zZWxlY3RlZElkLCBjb21wOiBjb21wSWR4LCBrZXksIGluZGV4LCB2YWx1ZTogdmFsIH0pO1xuICAgIH0sXG4gICAgb25Db21wQXJyYXlWZWModGhpczogYW55LCBjb21wSWR4OiBudW1iZXIsIGtleTogc3RyaW5nLCBpbmRleDogbnVtYmVyLCBheGlzOiBzdHJpbmcsIHJhdzogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy5pbnNwZWN0b3IpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9wID0gdGhpcy5pbnNwZWN0b3IuY29tcG9uZW50c1tjb21wSWR4XS5wcm9wcy5maW5kKChwOiBhbnkpID0+IHAua2V5ID09PSBrZXkpO1xuICAgICAgICBpZiAocHJvcCAmJiBwcm9wLnZbaW5kZXhdICYmIHByb3AudltpbmRleF0udikge1xuICAgICAgICAgICAgcHJvcC52W2luZGV4XS52W2F4aXNdID0gdGhpcy50b051bShyYXcpO1xuICAgICAgICAgICAgdGhpcy5zZW5kU2V0KHsgaWQ6IHRoaXMuc2VsZWN0ZWRJZCwgY29tcDogY29tcElkeCwga2V5LCBpbmRleCwgdmFsdWU6IHByb3AudltpbmRleF0udiB9KTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgb25Db21wTnVsbCh0aGlzOiBhbnksIGNvbXBJZHg6IG51bWJlciwga2V5OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLmluc3BlY3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb3AgPSB0aGlzLmluc3BlY3Rvci5jb21wb25lbnRzW2NvbXBJZHhdLnByb3BzLmZpbmQoKHA6IGFueSkgPT4gcC5rZXkgPT09IGtleSk7XG4gICAgICAgIGlmIChwcm9wKSB7XG4gICAgICAgICAgICBwcm9wLnYgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VuZFNldCh7IGlkOiB0aGlzLnNlbGVjdGVkSWQsIGNvbXA6IGNvbXBJZHgsIGtleSwgdmFsdWU6IG51bGwgfSk7XG4gICAgfSxcbiAgICAvKiog5pWw57uE6aG5572u56m677yI6LWE5Lqn5byV55So5pWw57uE77yM5aaCIG1hdGVyaWFsc++8ieOAgiAqL1xuICAgIG9uQ29tcEFycmF5TnVsbCh0aGlzOiBhbnksIGNvbXBJZHg6IG51bWJlciwga2V5OiBzdHJpbmcsIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmluc3BlY3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb3AgPSB0aGlzLmluc3BlY3Rvci5jb21wb25lbnRzW2NvbXBJZHhdLnByb3BzLmZpbmQoKHA6IGFueSkgPT4gcC5rZXkgPT09IGtleSk7XG4gICAgICAgIGlmIChwcm9wICYmIHByb3AudiAmJiBwcm9wLnZbaW5kZXhdKSB7XG4gICAgICAgICAgICBwcm9wLnZbaW5kZXhdID0geyB0OiAncmF3JywgdjogbnVsbCwgZWRpdGFibGU6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZW5kU2V0KHsgaWQ6IHRoaXMuc2VsZWN0ZWRJZCwgY29tcDogY29tcElkeCwga2V5LCBpbmRleCwgdmFsdWU6IG51bGwgfSk7XG4gICAgfSxcbiAgICAvKiog5p2Q6LSo5Y+C5pWw5YaZ5Zue77yaaW5kZXgg5Li65pWw5a2X5pe25a6a5L2NIHNoYXJlZE1hdGVyaWFscyDmlbDnu4TpobnvvIx1bmRlZmluZWQg55SoIGN1c3RvbU1hdGVyaWFsL21hdGVyaWFs44CCICovXG4gICAgb25Db21wTWF0ZXJpYWxQcm9wKHRoaXM6IGFueSwgY29tcElkeDogbnVtYmVyLCBrZXk6IHN0cmluZywgaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCwgcHJvcEtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIGlmICghdGhpcy5pbnNwZWN0b3IpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wID0gdGhpcy5pbnNwZWN0b3IuY29tcG9uZW50c1tjb21wSWR4XTtcbiAgICAgICAgY29uc3QgcHJvcCA9IGNvbXA/LnByb3BzLmZpbmQoKHA6IGFueSkgPT4gcC5rZXkgPT09IGtleSk7XG4gICAgICAgIGNvbnN0IGhvbGRlciA9IGluZGV4ID09PSB1bmRlZmluZWQgPyBwcm9wIDogcHJvcD8udj8uW2luZGV4XTtcbiAgICAgICAgaWYgKGhvbGRlciAmJiBob2xkZXIudiAmJiBBcnJheS5pc0FycmF5KGhvbGRlci52LnByb3BzKSkge1xuICAgICAgICAgICAgY29uc3QgbXAgPSBob2xkZXIudi5wcm9wcy5maW5kKCh4OiBhbnkpID0+IHgua2V5ID09PSBwcm9wS2V5KTtcbiAgICAgICAgICAgIGlmIChtcCkge1xuICAgICAgICAgICAgICAgIG1wLnYgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbmRTZXQoeyBpZDogdGhpcy5zZWxlY3RlZElkLCBjb21wOiBjb21wSWR4LCBrZXk6ICdfX21hdGVyaWFsX3Byb3AnLCBpbmRleCwgdmFsdWU6IHsgcHJvcEtleSwgdmFsdWUgfSB9KTtcbiAgICB9LFxuICAgIC8qKiBXaWRnZXQg5LiT5bGe77ya5YaZ5Zue5a+56b2Q5qih5byPL+i+uei3nS/nm67moIfvvIjmlbDlgLzlrZfmrrXlhYjovazmlbDlrZfvvInjgIIgKi9cbiAgICBvbldpZGdldFNldCh0aGlzOiBhbnksIGNvbXBJZHg6IG51bWJlciwga2V5OiBzdHJpbmcsIHJhdzogYW55KSB7XG4gICAgICAgIGlmICghdGhpcy5pbnNwZWN0b3IpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wID0gdGhpcy5pbnNwZWN0b3IuY29tcG9uZW50c1tjb21wSWR4XTtcbiAgICAgICAgaWYgKCFjb21wIHx8ICFjb21wLndpZGdldCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB2YWw6IGFueSA9IHJhdztcbiAgICAgICAgaWYgKGtleSA9PT0gJ2xlZnQnIHx8IGtleSA9PT0gJ3JpZ2h0JyB8fCBrZXkgPT09ICd0b3AnIHx8IGtleSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICAgIHZhbCA9IHRoaXMudG9OdW0ocmF3KTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdhbGlnbk1vZGUnKSB7XG4gICAgICAgICAgICB2YWwgPSBOdW1iZXIocmF3KTtcbiAgICAgICAgfVxuICAgICAgICBjb21wLndpZGdldFtrZXldID0gdmFsO1xuICAgICAgICBpZiAoa2V5ID09PSAnX193aWRnZXRfdGFyZ2V0Jykge1xuICAgICAgICAgICAgY29tcC53aWRnZXQudGFyZ2V0TmFtZSA9IHZhbCA/IFN0cmluZyh2YWwpIDogJyc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZW5kU2V0KHsgaWQ6IHRoaXMuc2VsZWN0ZWRJZCwgY29tcDogY29tcElkeCwga2V5LCB2YWx1ZTogdmFsIH0pO1xuICAgIH0sXG4gICAgLyoqIFdpZGdldCDkuJPlsZ7vvJrliIfmjaLlr7npvZDmoIflv5fvvIhjZW50ZXIg5ZCM5pe25YiH5rC05bmzK+WeguebtOWxheS4re+8m+inkumUruWQjOaXtuWIh+S4pOS4qui+ue+8ieOAgiAqL1xuICAgIG9uV2lkZ2V0VG9nZ2xlKHRoaXM6IGFueSwgY29tcElkeDogbnVtYmVyLCBrZXk6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMuaW5zcGVjdG9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcCA9IHRoaXMuaW5zcGVjdG9yLmNvbXBvbmVudHNbY29tcElkeF07XG4gICAgICAgIGlmICghY29tcCB8fCAhY29tcC53aWRnZXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb3JuZXJNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHtcbiAgICAgICAgICAgIF9fdG9wX2xlZnQ6IFsnaXNBbGlnblRvcCcsICdpc0FsaWduTGVmdCddLFxuICAgICAgICAgICAgX190b3BfcmlnaHQ6IFsnaXNBbGlnblRvcCcsICdpc0FsaWduUmlnaHQnXSxcbiAgICAgICAgICAgIF9fYm90dG9tX2xlZnQ6IFsnaXNBbGlnbkJvdHRvbScsICdpc0FsaWduTGVmdCddLFxuICAgICAgICAgICAgX19ib3R0b21fcmlnaHQ6IFsnaXNBbGlnbkJvdHRvbScsICdpc0FsaWduUmlnaHQnXSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGtleSA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgIGNvbXAud2lkZ2V0LmlzQWxpZ25Ib3Jpem9udGFsQ2VudGVyID0gIWNvbXAud2lkZ2V0LmlzQWxpZ25Ib3Jpem9udGFsQ2VudGVyO1xuICAgICAgICAgICAgY29tcC53aWRnZXQuaXNBbGlnblZlcnRpY2FsQ2VudGVyID0gIWNvbXAud2lkZ2V0LmlzQWxpZ25WZXJ0aWNhbENlbnRlcjtcbiAgICAgICAgICAgIHRoaXMuc2VuZFNldCh7IGlkOiB0aGlzLnNlbGVjdGVkSWQsIGNvbXA6IGNvbXBJZHgsIGtleTogJ2lzQWxpZ25Ib3Jpem9udGFsQ2VudGVyJywgdmFsdWU6IGNvbXAud2lkZ2V0LmlzQWxpZ25Ib3Jpem9udGFsQ2VudGVyIH0pO1xuICAgICAgICAgICAgdGhpcy5zZW5kU2V0KHsgaWQ6IHRoaXMuc2VsZWN0ZWRJZCwgY29tcDogY29tcElkeCwga2V5OiAnaXNBbGlnblZlcnRpY2FsQ2VudGVyJywgdmFsdWU6IGNvbXAud2lkZ2V0LmlzQWxpZ25WZXJ0aWNhbENlbnRlciB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb3JuZXIgPSBjb3JuZXJNYXBba2V5XTtcbiAgICAgICAgaWYgKGNvcm5lcikge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrIG9mIGNvcm5lcikge1xuICAgICAgICAgICAgICAgIGNvbXAud2lkZ2V0W2tdID0gIWNvbXAud2lkZ2V0W2tdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBrIG9mIGNvcm5lcikge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VuZFNldCh7IGlkOiB0aGlzLnNlbGVjdGVkSWQsIGNvbXA6IGNvbXBJZHgsIGtleTogaywgdmFsdWU6IGNvbXAud2lkZ2V0W2tdIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbXAud2lkZ2V0W2tleV0gPSAhY29tcC53aWRnZXRba2V5XTtcbiAgICAgICAgdGhpcy5zZW5kU2V0KHsgaWQ6IHRoaXMuc2VsZWN0ZWRJZCwgY29tcDogY29tcElkeCwga2V5LCB2YWx1ZTogY29tcC53aWRnZXRba2V5XSB9KTtcbiAgICB9LFxuICAgIC8qKiDlhbzlrrkgdWktY29sb3Ig55qE5LiN5ZCM6L6T5Ye65qC85byP77yM57uf5LiA5Li6IHtyLGcsYixhfSgwLTI1NSnjgIIgKi9cbiAgICBhcnJUb0NvbG9yKHRoaXM6IGFueSwgcmF3OiBhbnkpOiB7IHI6IG51bWJlcjsgZzogbnVtYmVyOyBiOiBudW1iZXI7IGE6IG51bWJlciB9IHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmF3KSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICByOiB0aGlzLnRvTnVtKHJhd1swXSksXG4gICAgICAgICAgICAgICAgZzogdGhpcy50b051bShyYXdbMV0pLFxuICAgICAgICAgICAgICAgIGI6IHRoaXMudG9OdW0ocmF3WzJdKSxcbiAgICAgICAgICAgICAgICBhOiByYXdbM10gIT09IHVuZGVmaW5lZCA/IHRoaXMudG9OdW0ocmF3WzNdKSA6IDI1NSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJhdyAmJiB0eXBlb2YgcmF3ID09PSAnb2JqZWN0JyAmJiAncicgaW4gcmF3KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHI6IHRoaXMudG9OdW0ocmF3LnIpLFxuICAgICAgICAgICAgICAgIGc6IHRoaXMudG9OdW0ocmF3LmcpLFxuICAgICAgICAgICAgICAgIGI6IHRoaXMudG9OdW0ocmF3LmIpLFxuICAgICAgICAgICAgICAgIGE6IHJhdy5hICE9PSB1bmRlZmluZWQgPyB0aGlzLnRvTnVtKHJhdy5hKSA6IDI1NSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VDb2xvcihyYXcpO1xuICAgIH0sXG5cbiAgICAvKiogcmVmIOW8leeUqOaYr+WQpuS4uuiKgueCueW8leeUqO+8iGNjLk5vZGXvvInvvJvnu4Tku7blvJXnlKjov5Tlm54gZmFsc2XvvIznlKjkuo7ljLrliIYgdWktbm9kZSAvIHVpLWNvbXBvbmVudCDmmL7npLrjgIIgKi9cbiAgICBpc05vZGVSZWYodGhpczogYW55LCBwOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICFwIHx8ICFwLmNvbXBvbmVudFR5cGUgfHwgcC5jb21wb25lbnRUeXBlID09PSAnY2MuTm9kZSc7XG4gICAgfSxcblxuICAgIC8qKiDku47lvZPliY0gaW5zcGVjdG9yIOS4reWPluato+WcqOe8lui+keWtl+auteeahOacrOWcsOS5kOinguWAvO+8iOWGmeWbnuWQjuS4jeivpeiiq+Wbnuivu+imhueblu+8ieOAgiAqL1xuICAgIGdldExvY2FsVmFsdWUodGhpczogYW55LCBwYXlsb2FkOiBhbnkpOiBhbnkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHBheWxvYWQuY29tcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tcCA9IHRoaXMuaW5zcGVjdG9yPy5jb21wb25lbnRzPy5bcGF5bG9hZC5jb21wXTtcbiAgICAgICAgICAgICAgICBjb25zdCBwID0gY29tcD8ucHJvcHM/LmZpbmQoKHg6IGFueSkgPT4geC5rZXkgPT09IHBheWxvYWQua2V5KTtcbiAgICAgICAgICAgICAgICBjb25zdCB2ID0gcCAmJiAocGF5bG9hZC5pbmRleCA9PT0gdW5kZWZpbmVkID8gcC52IDogcC52Py5bcGF5bG9hZC5pbmRleF0/LnYpO1xuICAgICAgICAgICAgICAgIHJldHVybiB2ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHYpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXlsb2FkLmZpZWxkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2ID0gdGhpcy5pbnNwZWN0b3I/LnByb3BzPy5bcGF5bG9hZC5maWVsZF0/LnY7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHYgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHsgLyogaWdub3JlICovIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9LFxuICAgIC8qKiDku47lm57or7vnu5PmnpzkuK3lj5blkIzkuIDlrZfmrrXlrp7pmYXlgLzvvIjlr7nmr5Tor4rmlq3nlKjvvInjgIIgKi9cbiAgICBwaWNrVmFsdWUodGhpczogYW55LCBiYWNrOiBhbnksIHBheWxvYWQ6IGFueSk6IGFueSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAocGF5bG9hZC5jb21wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wID0gYmFjay5jb21wb25lbnRzPy5bcGF5bG9hZC5jb21wXTtcbiAgICAgICAgICAgICAgICBjb25zdCBwID0gY29tcD8ucHJvcHM/LmZpbmQoKHg6IGFueSkgPT4geC5rZXkgPT09IHBheWxvYWQua2V5KTtcbiAgICAgICAgICAgICAgICBjb25zdCB2ID0gcCAmJiAocGF5bG9hZC5pbmRleCA9PT0gdW5kZWZpbmVkID8gcC52IDogcC52Py5bcGF5bG9hZC5pbmRleF0/LnYpO1xuICAgICAgICAgICAgICAgIHJldHVybiB2ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHYpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXlsb2FkLmZpZWxkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2ID0gYmFjay5wcm9wcz8uW3BheWxvYWQuZmllbGRdPy52O1xuICAgICAgICAgICAgICAgIHJldHVybiB2ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHYpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7IC8qIGlnbm9yZSAqLyB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSxcbiAgICAvKiog5oqKIFVJIOS4reato+WcqOe8lui+keeahOWtl+auteaBouWkjeaIkOacrOWcsOS5kOinguWAvO+8iOWbnuivu+ivt+axguS4jeaUueWGmee8lui+keahhu+8ieOAgiAqL1xuICAgIGFwcGx5TG9jYWxWYWx1ZSh0aGlzOiBhbnksIGluc3A6IGFueSwgcGF5bG9hZDogYW55LCB2YWw6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHBheWxvYWQuY29tcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tcCA9IGluc3AuY29tcG9uZW50cz8uW3BheWxvYWQuY29tcF07XG4gICAgICAgICAgICAgICAgY29uc3QgcCA9IGNvbXA/LnByb3BzPy5maW5kKCh4OiBhbnkpID0+IHgua2V5ID09PSBwYXlsb2FkLmtleSk7XG4gICAgICAgICAgICAgICAgaWYgKHApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBheWxvYWQuaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcC52ID0gdmFsO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHAudj8uW3BheWxvYWQuaW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwLnZbcGF5bG9hZC5pbmRleF0udiA9IHZhbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGF5bG9hZC5maWVsZCAhPT0gdW5kZWZpbmVkICYmIGluc3AucHJvcHM/LltwYXlsb2FkLmZpZWxkXSkge1xuICAgICAgICAgICAgICAgIGluc3AucHJvcHNbcGF5bG9hZC5maWVsZF0udiA9IHZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7IC8qIGlnbm9yZSAqLyB9XG4gICAgfSxcbn07XG4iXX0=