381 lines
48 KiB
JavaScript
381 lines
48 KiB
JavaScript
(() => {
|
|
const AGENT_META = {
|
|
rose: { emoji: "\u{1F339}", name: "Rose", tier: 1 },
|
|
lotus: { emoji: "\u{1FAB7}", name: "Lotus", tier: 2 },
|
|
"forget-me-not": { emoji: "\u{1F33C}", name: "Forget-me-not", tier: 2 },
|
|
sunflower: { emoji: "\u{1F33B}", name: "Sunflower", tier: 2 },
|
|
iris: { emoji: "\u269C\uFE0F", name: "Iris", tier: 2 },
|
|
ivy: { emoji: "\u{1F33F}", name: "Ivy", tier: 2 },
|
|
dandelion: { emoji: "\u{1F6E1}", name: "Dandelion", tier: 2 },
|
|
root: { emoji: "\u{1F333}", name: "Root", tier: 2 }
|
|
};
|
|
let _nodeCounter = 0;
|
|
function _nextNodeId(agentId) {
|
|
return `${agentId}-${++_nodeCounter}`;
|
|
}
|
|
function initActivityTree() {
|
|
const tree = {
|
|
version: 1,
|
|
rootId: "rose",
|
|
nodes: {
|
|
rose: {
|
|
id: "rose",
|
|
parentId: null,
|
|
agentId: "rose",
|
|
agentEmoji: "\u{1F339}",
|
|
agentName: "Rose",
|
|
tier: 1,
|
|
status: "running",
|
|
task: "Orchestrating",
|
|
toolCalls: [],
|
|
startedAt: Date.now(),
|
|
endedAt: null,
|
|
duration: null,
|
|
children: [],
|
|
collapsed: false,
|
|
metadata: {}
|
|
}
|
|
},
|
|
stats: _emptyStats()
|
|
};
|
|
S.activityTree = tree;
|
|
S.mcFilter = {};
|
|
S.mcSort = "runtime";
|
|
return tree;
|
|
}
|
|
function _emptyStats() {
|
|
return {
|
|
totalAgents: 0,
|
|
runningAgents: 0,
|
|
pendingAgents: 0,
|
|
doneAgents: 0,
|
|
errorAgents: 0,
|
|
totalTools: 0,
|
|
doneTools: 0,
|
|
runningTools: 0,
|
|
avgResponseTime: 0,
|
|
totalElapsed: 0
|
|
};
|
|
}
|
|
function atAddNode(opts) {
|
|
const tree = S.activityTree;
|
|
if (!tree) return null;
|
|
const parentId = opts.parentId || tree.rootId;
|
|
const parent = tree.nodes[parentId];
|
|
if (!parent) return null;
|
|
const meta = AGENT_META[opts.agentId];
|
|
const tier = opts.tier || (meta ? meta.tier : 3);
|
|
const id = _nextNodeId(opts.agentId);
|
|
const node = {
|
|
id,
|
|
parentId,
|
|
agentId: opts.agentId,
|
|
agentEmoji: meta?.emoji || "\u2699\uFE0F",
|
|
agentName: meta?.name || opts.agentId,
|
|
tier,
|
|
status: opts.status || "pending",
|
|
task: opts.task,
|
|
toolCalls: [],
|
|
startedAt: opts.status === "running" ? Date.now() : null,
|
|
endedAt: null,
|
|
duration: null,
|
|
children: [],
|
|
collapsed: false,
|
|
metadata: {}
|
|
};
|
|
tree.nodes[id] = node;
|
|
parent.children.push(id);
|
|
_recalcStats(tree);
|
|
return node;
|
|
}
|
|
function atUpdateNode(nodeId, updates) {
|
|
const tree = S.activityTree;
|
|
if (!tree) return;
|
|
const node = tree.nodes[nodeId];
|
|
if (!node) return;
|
|
Object.assign(node, updates);
|
|
_recalcStats(tree);
|
|
}
|
|
function atGetNode(nodeId) {
|
|
return S.activityTree?.nodes[nodeId] || null;
|
|
}
|
|
function atAddToolCall(nodeId, tc) {
|
|
const tree = S.activityTree;
|
|
if (!tree) return null;
|
|
const node = tree.nodes[nodeId];
|
|
if (!node) return null;
|
|
if (node.status === "pending") {
|
|
node.status = "running";
|
|
node.startedAt = node.startedAt || Date.now();
|
|
}
|
|
const toolCall = {
|
|
id: `tc-${++_nodeCounter}`,
|
|
name: tc.name,
|
|
status: tc.status || "running",
|
|
args: tc.args || {},
|
|
startedAt: Date.now(),
|
|
endedAt: null
|
|
};
|
|
node.toolCalls.push(toolCall);
|
|
_recalcStats(tree);
|
|
return toolCall;
|
|
}
|
|
function atUpdateToolCall(nodeId, toolId, updates) {
|
|
const tree = S.activityTree;
|
|
if (!tree) return;
|
|
const node = tree.nodes[nodeId];
|
|
if (!node) return;
|
|
const tc = node.toolCalls.find((t) => t.id === toolId);
|
|
if (!tc) return;
|
|
Object.assign(tc, updates);
|
|
if (updates.status === "done" || updates.status === "error") {
|
|
tc.endedAt = tc.endedAt || Date.now();
|
|
tc.duration = tc.startedAt ? (tc.endedAt - tc.startedAt) / 1e3 : null;
|
|
}
|
|
_recalcStats(tree);
|
|
}
|
|
function atFinalizeNode(nodeId, status) {
|
|
const tree = S.activityTree;
|
|
if (!tree) return;
|
|
const node = tree.nodes[nodeId];
|
|
if (!node) return;
|
|
node.status = status;
|
|
node.endedAt = Date.now();
|
|
node.duration = node.startedAt ? (node.endedAt - node.startedAt) / 1e3 : null;
|
|
for (const tc of node.toolCalls) {
|
|
if (tc.status === "running" || tc.status === "pending") {
|
|
tc.status = status === "error" ? "error" : "done";
|
|
tc.endedAt = node.endedAt;
|
|
tc.duration = tc.startedAt ? (tc.endedAt - tc.startedAt) / 1e3 : null;
|
|
}
|
|
}
|
|
for (const childId of node.children) {
|
|
const child = tree.nodes[childId];
|
|
if (child && (child.status === "running" || child.status === "thinking" || child.status === "pending")) {
|
|
atFinalizeNode(childId, status);
|
|
}
|
|
}
|
|
_recalcStats(tree);
|
|
}
|
|
function _recalcStats(tree) {
|
|
const nodes = Object.values(tree.nodes).filter((n) => n.id !== tree.rootId);
|
|
const tools = nodes.flatMap((n) => n.toolCalls);
|
|
const doneDurations = nodes.filter((n) => n.duration !== null).map((n) => n.duration);
|
|
const runningNodes = nodes.filter((n) => n.status === "running" || n.status === "thinking");
|
|
const maxElapsed = runningNodes.reduce((max, n) => {
|
|
const elapsed = n.startedAt ? (Date.now() - n.startedAt) / 1e3 : 0;
|
|
return Math.max(max, elapsed);
|
|
}, 0);
|
|
tree.stats = {
|
|
totalAgents: nodes.length,
|
|
runningAgents: runningNodes.length,
|
|
pendingAgents: nodes.filter((n) => n.status === "pending").length,
|
|
doneAgents: nodes.filter((n) => n.status === "done").length,
|
|
errorAgents: nodes.filter((n) => n.status === "error").length,
|
|
totalTools: tools.length,
|
|
doneTools: tools.filter((t) => t.status === "done").length,
|
|
runningTools: tools.filter((t) => t.status === "running").length,
|
|
avgResponseTime: doneDurations.length ? doneDurations.reduce((a, b) => a + b, 0) / doneDurations.length : 0,
|
|
totalElapsed: maxElapsed
|
|
};
|
|
}
|
|
function atGetStats() {
|
|
return S.activityTree?.stats || _emptyStats();
|
|
}
|
|
function atReset() {
|
|
_nodeCounter = 0;
|
|
initActivityTree();
|
|
}
|
|
function formatElapsed(ms) {
|
|
if (ms < 1e3) return `${Math.round(ms)}ms`;
|
|
const s = Math.floor(ms / 1e3);
|
|
if (s < 60) return `${s}s`;
|
|
const m = Math.floor(s / 60);
|
|
const rs = s % 60;
|
|
if (m < 60) return `${m}m ${rs}s`;
|
|
const h = Math.floor(m / 60);
|
|
const rm = m % 60;
|
|
return `${h}h ${rm}m`;
|
|
}
|
|
function formatDuration(seconds) {
|
|
if (seconds === null) return "\u2014";
|
|
if (seconds < 0.01) return "<0.01s";
|
|
if (seconds < 1) return `${seconds.toFixed(2)}s`;
|
|
if (seconds < 60) return `${seconds.toFixed(1)}s`;
|
|
const m = Math.floor(seconds / 60);
|
|
const rs = Math.round(seconds % 60);
|
|
return `${m}m ${rs}s`;
|
|
}
|
|
function createMockActivityTree() {
|
|
initActivityTree();
|
|
const tree = S.activityTree;
|
|
const now = Date.now();
|
|
const lotus = atAddNode({ agentId: "lotus", task: "Analysiere Gesundheitsdaten", status: "running" });
|
|
lotus.startedAt = now - 12e3;
|
|
atAddToolCall(lotus.id, { name: "search_files", args: { pattern: "health*", path: "/data" } });
|
|
atUpdateToolCall(lotus.id, lotus.toolCalls[0].id, { status: "done", result: "12 matches", duration: 0.3 });
|
|
lotus.toolCalls[0].startedAt = now - 11e3;
|
|
lotus.toolCalls[0].endedAt = now - 10997;
|
|
atAddToolCall(lotus.id, { name: "read_file", args: { path: "/data/health-log.md" } });
|
|
const sunflower = atAddNode({ agentId: "sunflower", task: "Portfolio-Analyse Q1 2026", status: "running" });
|
|
sunflower.startedAt = now - 8e3;
|
|
atAddToolCall(sunflower.id, { name: "browser_navigate", args: { url: "https://finance.example.com" } });
|
|
atUpdateToolCall(sunflower.id, sunflower.toolCalls[0].id, { status: "done", result: "Page loaded", duration: 2.1 });
|
|
sunflower.toolCalls[0].startedAt = now - 7500;
|
|
sunflower.toolCalls[0].endedAt = now - 5400;
|
|
atAddToolCall(sunflower.id, { name: "terminal", args: { command: "python3 analyse.py" } });
|
|
const dandelion = atAddNode({ agentId: "dandelion", task: "Triaging unread messages", status: "pending" });
|
|
const researcher = atAddNode({ parentId: lotus.id, agentId: "researcher", task: "Looking up nutrition data", status: "running", tier: 3 });
|
|
researcher.agentEmoji = "\u{1F50D}";
|
|
researcher.agentName = "Researcher";
|
|
researcher.startedAt = now - 3e3;
|
|
atAddToolCall(researcher.id, { name: "web_search", args: { query: "nutrition database API" } });
|
|
_recalcStats(tree);
|
|
return tree;
|
|
}
|
|
window.initActivityTree = initActivityTree;
|
|
window.createMockActivityTree = createMockActivityTree;
|
|
window.formatElapsed = formatElapsed;
|
|
window.formatDuration = formatDuration;
|
|
window.atAddNode = atAddNode;
|
|
window.atUpdateNode = atUpdateNode;
|
|
window.atGetNode = atGetNode;
|
|
window.atAddToolCall = atAddToolCall;
|
|
window.atUpdateToolCall = atUpdateToolCall;
|
|
window.atFinalizeNode = atFinalizeNode;
|
|
window.atGetStats = atGetStats;
|
|
window.atReset = atReset;
|
|
window._atTrackTool = _atTrackTool;
|
|
window._atTrackToolComplete = _atTrackToolComplete;
|
|
window._atTrackDone = _atTrackDone;
|
|
window._atTrackSubagent = _atTrackSubagent;
|
|
window._at = {
|
|
init: initActivityTree,
|
|
addNode: atAddNode,
|
|
updateNode: atUpdateNode,
|
|
getNode: atGetNode,
|
|
addToolCall: atAddToolCall,
|
|
updateToolCall: atUpdateToolCall,
|
|
finalize: atFinalizeNode,
|
|
stats: atGetStats,
|
|
reset: atReset,
|
|
mock: createMockActivityTree,
|
|
formatElapsed,
|
|
formatDuration,
|
|
AGENT_META,
|
|
trackSubagent: _atTrackSubagent,
|
|
};
|
|
let _activeAgentNodeId = null;
|
|
let _lastToolId = null;
|
|
function _atTrackTool(d) {
|
|
if (!S.activityTree) initActivityTree();
|
|
const tree = S.activityTree;
|
|
if (d.name === "delegate_task") {
|
|
const agentId = d.args?.agentId || d.args?.agent || d.args?.name || "unknown";
|
|
const task = d.args?.goal || d.args?.prompt || d.args?.task || d.preview || "Delegated task";
|
|
const node = atAddNode({ agentId, task, status: "running" });
|
|
if (node) {
|
|
_activeAgentNodeId = node.id;
|
|
}
|
|
return;
|
|
}
|
|
let targetNodeId = _activeAgentNodeId || tree.rootId;
|
|
const inflight = window.INFLIGHT?.[S.session?.session_id];
|
|
if (inflight?.thisTurnAgent) {
|
|
const agentKey = inflight.thisTurnAgent;
|
|
const existingNode = Object.values(tree.nodes).find(
|
|
(n) => n.agentId === agentKey && (n.status === "running" || n.status === "thinking")
|
|
);
|
|
if (existingNode) {
|
|
targetNodeId = existingNode.id;
|
|
_activeAgentNodeId = existingNode.id;
|
|
} else if (AGENT_META[agentKey]) {
|
|
const task = inflight.thisTurnModel ? `${inflight.thisTurnModel}` : "Working...";
|
|
const node = atAddNode({ agentId: agentKey, task, status: "running" });
|
|
if (node) {
|
|
_activeAgentNodeId = node.id;
|
|
targetNodeId = node.id;
|
|
}
|
|
}
|
|
}
|
|
const tc = atAddToolCall(targetNodeId, {
|
|
name: d.name,
|
|
args: d.args || {},
|
|
status: "running"
|
|
});
|
|
if (tc) {
|
|
_lastToolId = tc.id;
|
|
}
|
|
}
|
|
function _atTrackToolComplete(d) {
|
|
if (!S.activityTree) return;
|
|
const tree = S.activityTree;
|
|
const activeNodes = Object.values(tree.nodes).filter(
|
|
(n) => n.status === "running" || n.status === "thinking"
|
|
);
|
|
for (const node of activeNodes) {
|
|
for (const tc of node.toolCalls) {
|
|
if (tc.status === "running" && tc.name === d.name) {
|
|
atUpdateToolCall(node.id, tc.id, {
|
|
status: d.is_error ? "error" : "done",
|
|
result: d.preview || d.result,
|
|
duration: d.duration
|
|
});
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function _atTrackSubagent(d) {
|
|
if (!S.activityTree) initActivityTree();
|
|
const tree = S.activityTree;
|
|
|
|
if (d.event_type === 'subagent.start') {
|
|
// Derive agentId from subagent_id if available, otherwise from goal hint.
|
|
// subagent_id format: "lotus-1" → agentId = "lotus"
|
|
let agentId = 'unknown';
|
|
if (d.subagent_id) {
|
|
// Strip numeric suffix e.g. "lotus-1" → "lotus"
|
|
agentId = d.subagent_id.replace(/-\d+$/, '');
|
|
}
|
|
const task = d.goal || d.preview || `Subagent ${d.task_index ?? ''}`.trim();
|
|
const node = atAddNode({ agentId, task, status: 'running' });
|
|
if (node) {
|
|
_activeAgentNodeId = node.id;
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (d.event_type === 'subagent.complete' || d.event_type === 'subagent.done') {
|
|
// Find the running node for this subagent and finalize it.
|
|
// Use subagent_id to locate the right node.
|
|
let targetNodeId = null;
|
|
if (d.subagent_id) {
|
|
const agentId = d.subagent_id.replace(/-\d+$/, '');
|
|
const found = Object.values(tree.nodes).find(
|
|
(n) => n.agentId === agentId && n.status === 'running'
|
|
);
|
|
if (found) targetNodeId = found.id;
|
|
}
|
|
// Fall back to _activeAgentNodeId if no subagent_id match
|
|
if (!targetNodeId) targetNodeId = _activeAgentNodeId;
|
|
if (targetNodeId && tree.nodes[targetNodeId]) {
|
|
const status = d.status === 'timeout' || d.status === 'error' ? 'error' : 'done';
|
|
atFinalizeNode(targetNodeId, status);
|
|
}
|
|
}
|
|
}
|
|
function _atTrackDone() {
|
|
if (!S.activityTree) return;
|
|
if (_activeAgentNodeId) {
|
|
atFinalizeNode(_activeAgentNodeId, "done");
|
|
_activeAgentNodeId = null;
|
|
}
|
|
const root = S.activityTree.nodes[S.activityTree.rootId];
|
|
if (root) {
|
|
root.status = "running";
|
|
}
|
|
}
|
|
})();
|
|
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiYWN0aXZpdHktdHJlZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEFnZW50IEFjdGl2aXR5IFRyZWUgKE1pc3Npb24gQ29udHJvbCkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4vLyBGdWxsLWRlcHRoIHBhcmFsbGVsIGFnZW50IGFjdGl2aXR5IHRyYWNraW5nIGZvciB0aGUgMy1UaWVyIHN5c3RlbS5cbi8vIFByb3ZpZGVzOiBpbml0QWN0aXZpdHlUcmVlLCBhZGROb2RlLCBhZGRUb29sQ2FsbCwgdXBkYXRlVG9vbENhbGwsXG4vLyAgICAgICAgICAgZmluYWxpemVOb2RlLCBnZXRTdGF0cywgY3JlYXRlTW9ja0FjdGl2aXR5VHJlZSwgZm9ybWF0RWxhcHNlZFxuXG4vLyBBZ2VudCBtZXRhZGF0YSBcdTIwMTQgbWFwcyBhZ2VudCBJRHMgdG8gZGlzcGxheSBpbmZvXG5jb25zdCBBR0VOVF9NRVRBOiBSZWNvcmQ8c3RyaW5nLCB7IGVtb2ppOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgdGllcjogMXwyfDMgfT4gPSB7XG4gIHJvc2U6ICAgICAgICAgICB7IGVtb2ppOiAnXHVEODNDXHVERjM5JywgbmFtZTogJ1Jvc2UnLCAgICAgICAgICAgdGllcjogMSB9LFxuICBsb3R1czogICAgICAgICAgeyBlbW9qaTogJ1x1RDgzRVx1REVCNycsIG5hbWU6ICdMb3R1cycsICAgICAgICAgIHRpZXI6IDIgfSxcbiAgJ2ZvcmdldC1tZS1ub3QnOnsgZW1vamk6ICdcdUQ4M0NcdURGM0MnLCBuYW1lOiAnRm9yZ2V0LW1lLW5vdCcsICB0aWVyOiAyIH0sXG4gIHN1bmZsb3dlcjogICAgICB7IGVtb2ppOiAnXHVEODNDXHVERjNCJywgbmFtZTogJ1N1bmZsb3dlcicsICAgICAgdGllcjogMiB9LFxuICBpcmlzOiAgICAgICAgICAgeyBlbW9qaTogJ1x1MjY5Q1x1RkUwRicsIG5hbWU6ICdJcmlzJywgICAgICAgICAgIHRpZXI6IDIgfSxcbiAgaXZ5OiAgICAgICAgICAgIHsgZW1vamk6ICdcdUQ4M0NcdURGM0YnLCBuYW1lOiAnSXZ5JywgICAgICAgICAgICB0aWVyOiAyIH0sXG4gIGRhbmRlbGlvbjogICAgICB7IGVtb2ppOiAnXHVEODNEXHVERUUxJywgbmFtZTogJ0RhbmRlbGlvbicsICAgICAgdGllcjogMiB9LFxuICByb290OiAgICAgICAgICAgeyBlbW9qaTogJ1x1RDgzQ1x1REYzMycsIG5hbWU6ICdSb290JywgICAgICAgICAgIHRpZXI6IDIgfSxcbn07XG5cbi8vIFRpZXItMyBzdWItYWdlbnQgZGV0ZWN0aW9uIFx1MjAxNCB0b29sIG5hbWVzIHRoYXQgaW5kaWNhdGUgc3ViLWFnZW50IHdvcmtcbmNvbnN0IFRJRVIzX1RPT0xfTkFNRVMgPSBuZXcgU2V0KFtcbiAgJ3NlYXJjaF9maWxlcycsICdyZWFkX2ZpbGUnLCAnd3JpdGVfZmlsZScsICd0ZXJtaW5hbCcsICdicm93c2VyX25hdmlnYXRlJyxcbiAgJ2Jyb3dzZXJfc25hcHNob3QnLCAnYnJvd3Nlcl9jbGljaycsICdicm93c2VyX3R5cGUnLCAnYnJvd3Nlcl9wcmVzcycsXG4gICd3ZWJfc2VhcmNoJywgJ2RlbGVnYXRlX3Rhc2snLCAnZXhlY3V0ZV9jb2RlJywgJ3BhdGNoJyxcbl0pO1xuXG5sZXQgX25vZGVDb3VudGVyID0gMDtcbmZ1bmN0aW9uIF9uZXh0Tm9kZUlkKGFnZW50SWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHthZ2VudElkfS0keysrX25vZGVDb3VudGVyfWA7XG59XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBDb3JlIEZ1bmN0aW9ucyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gaW5pdEFjdGl2aXR5VHJlZSgpOiBBY3Rpdml0eVRyZWUge1xuICBjb25zdCB0cmVlOiBBY3Rpdml0eVRyZWUgPSB7XG4gICAgdmVyc2lvbjogMSxcbiAgICByb290SWQ6ICdyb3NlJyxcbiAgICBub2Rlczoge1xuICAgICAgcm9zZToge1xuICAgICAgICBpZDogJ3Jvc2UnLFxuICAgICAgICBwYXJlbnRJZDogbnVsbCxcbiAgICAgICAgYWdlbnRJZDogJ3Jvc2UnLFxuICAgICAgICBhZ2VudEVtb2ppOiAnXHVEODNDXHVERjM5JyxcbiAgICAgICAgYWdlbnROYW1lOiAnUm9zZScsXG4gICAgICAgIHRpZXI6IDEsXG4gICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICB0YXNrOiAnT3JjaGVzdHJhdGluZycsXG4gICAgICAgIHRvb2xDYWxsczogW10sXG4gICAgICAgIHN0YXJ0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgZW5kZWRBdDogbnVsbCxcbiAgICAgICAgZHVyYXRpb246IG51bGwsXG4gICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgY29sbGFwc2VkOiBmYWxzZSxcbiAgICAgICAgbWV0YWRhdGE6IHt9LFxuICAgICAgfVxuICAgIH0sXG4gICAgc3RhdHM6IF9lbXB0eVN0YXRzKCksXG4gIH07XG4gIFMuYWN0aXZpdHlUcmVlID0gdHJlZTtcbiAgUy5tY0ZpbHRlciA9IHt9O1xuICBTLm1jU29ydCA9ICdydW50aW1lJztcbiAgcmV0dXJuIHRyZWU7XG59XG5cbmZ1bmN0aW9uIF9lbXB0eVN0YXRzKCk6IE1DU3RhdHMge1xuICByZXR1cm4ge1xuICAgIHRvdGFsQWdlbnRzOiAwLFxuICAgIHJ1bm5pbmdBZ2VudHM6IDAsXG4gICAgcGVuZGluZ0FnZW50czogMCxcbiAgICBkb25lQWdlbnRzOiAwLFxuICAgIGVycm9yQWdlbnRzOiAwLFxuICAgIHRvdGFsVG9vbHM6IDAsXG4gICAgZG9uZVRvb2xzOiAwLFxuICAgIHJ1bm5pbmdUb29sczogMCxcbiAgICBhdmdSZXNwb25zZVRpbWU6IDAsXG4gICAgdG90YWxFbGFwc2VkOiAwLFxuICB9O1xufVxuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgTm9kZSBPcGVyYXRpb25zIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBhdEFkZE5vZGUob3B0czoge1xuICBwYXJlbnRJZD86IHN0cmluZztcbiAgYWdlbnRJZDogc3RyaW5nO1xuICB0YXNrOiBzdHJpbmc7XG4gIHN0YXR1cz86IEFjdGl2aXR5Tm9kZVsnc3RhdHVzJ107XG4gIHRpZXI/OiAxfDJ8Mztcbn0pOiBBY3Rpdml0eU5vZGUgfCBudWxsIHtcbiAgY29uc3QgdHJlZSA9IFMuYWN0aXZpdHlUcmVlO1xuICBpZiAoIXRyZWUpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IHBhcmVudElkID0gb3B0cy5wYXJlbnRJZCB8fCB0cmVlLnJvb3RJZDtcbiAgY29uc3QgcGFyZW50ID0gdHJlZS5ub2Rlc1twYXJlbnRJZF07XG4gIGlmICghcGFyZW50KSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBtZXRhID0gQUdFTlRfTUVUQVtvcHRzLmFnZW50SWRdO1xuICBjb25zdCB0aWVyID0gb3B0cy50aWVyIHx8IChtZXRhID8gbWV0YS50aWVyIDogMyk7XG4gIGNvbnN0IGlkID0gX25leHROb2RlSWQob3B0cy5hZ2VudElkKTtcblxuICBjb25zdCBub2RlOiBBY3Rpdml0eU5vZGUgPSB7XG4gICAgaWQsXG4gICAgcGFyZW50SWQsXG4gICAgYWdlbnRJZDogb3B0cy5hZ2VudElkLFxuICAgIGFnZW50RW1vamk6IG1ldGE/LmVtb2ppIHx8ICdcdTI2OTlcdUZFMEYnLFxuICAgIGFnZW50TmFtZTogbWV0YT8ubmFtZSB8fCBvcHRzLmFnZW50SWQsXG4gICAgdGllcixcbiAgICBzdGF0dXM6IG9wdHMuc3RhdHVzIHx8ICdwZW5kaW5nJyxcbiAgICB0YXNrOiBvcHRzLnRhc2ssXG4gICAgdG9vbENhbGxzOiBbXSxcbiAgICBzdGFydGVkQXQ6IG9wdHMuc3RhdHVzID09PSAncnVubmluZycgPyBEYXRlLm5vdygpIDogbnVsbCxcbiAgICBlbmRlZEF0OiBudWxsLFxuICAgIGR1cmF0aW9uOiBudWxsLFxuICAgIGNoaWxkcmVuOiBbXSxcbiAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgIG1ldGFkYXRhOiB7fSxcbiAgfTtcblxuICB0cmVlLm5vZGVzW2lkXSA9IG5vZGU7XG4gIHBhcmVudC5jaGlsZHJlbi5wdXNoKGlkKTtcbiAgX3JlY2FsY1N0YXRzKHRyZWUpO1xuICByZXR1cm4gbm9kZTtcbn1cblxuZnVuY3Rpb24gYXRVcGRhdGVOb2RlKG5vZGVJZDogc3RyaW5nLCB1cGRhdGVzOiBQYXJ0aWFsPEFjdGl2aXR5Tm9kZT4pOiB2b2lkIHtcbiAgY29uc3QgdHJlZSA9IFMuYWN0aXZpdHlUcmVlO1xuICBpZiAoIXRyZWUpIHJldHVybjtcbiAgY29uc3Qgbm9kZSA9IHRyZWUubm9kZXNbbm9kZUlkXTtcbiAgaWYgKCFub2RlKSByZXR1cm47XG4gIE9iamVjdC5hc3NpZ24obm9kZSwgdXBkYXRlcyk7XG4gIF9yZWNhbGNTdGF0cyh0cmVlKTtcbn1cblxuZnVuY3Rpb24gYXRHZXROb2RlKG5vZGVJZDogc3RyaW5nKTogQWN0aXZpdHlOb2RlIHwgbnVsbCB7XG4gIHJldHVybiBTLmFjdGl2aXR5VHJlZT8ubm9kZXNbbm9kZUlkXSB8fCBudWxsO1xufVxuXG5mdW5jdGlvbiBhdEdldENoaWxkcmVuKG5vZGVJZDogc3RyaW5nKTogQWN0aXZpdHlOb2RlW10ge1xuICBjb25zdCB0cmVlID0gUy5hY3Rpdml0eVRyZWU7XG4gIGlmICghdHJlZSkgcmV0dXJuIFtdO1xuICBjb25zdCBub2RlID0gdHJlZS5ub2Rlc1tub2RlSWRdO1xuICBpZiAoIW5vZGUpIHJldHVybiBbXTtcbiAgcmV0dXJuIG5vZGUuY2hpbGRyZW4ubWFwKGlkID0+IHRyZWUubm9kZXNbaWRdKS5maWx0ZXIoQm9vbGVhbik7XG59XG5cbmZ1bmN0aW9uIGF0R2V0UnVubmluZ05vZGVzKCk6IEFjdGl2aXR5Tm9kZVtdIHtcbiAgY29uc3QgdHJlZSA9IFMuYWN0aXZpdHlUcmVlO1xuICBpZiAoIXRyZWUpIHJldHVybiBbXTtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXModHJlZS5ub2RlcykuZmlsdGVyKFxuICAgIG4gPT4gbi5zdGF0dXMgPT09ICdydW5uaW5nJyB8fCBuLnN0YXR1cyA9PT0gJ3RoaW5raW5nJ1xuICApO1xufVxuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgVG9vbCBDYWxsIE9wZXJhdGlvbnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIGF0QWRkVG9vbENhbGwobm9kZUlkOiBzdHJpbmcsIHRjOiB7XG4gIG5hbWU6IHN0cmluZztcbiAgYXJncz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIHN0YXR1cz86IEFjdGl2aXR5VG9vbENhbGxbJ3N0YXR1cyddO1xufSk6IEFjdGl2aXR5VG9vbENhbGwgfCBudWxsIHtcbiAgY29uc3QgdHJlZSA9IFMuYWN0aXZpdHlUcmVlO1xuICBpZiAoIXRyZWUpIHJldHVybiBudWxsO1xuICBjb25zdCBub2RlID0gdHJlZS5ub2Rlc1tub2RlSWRdO1xuICBpZiAoIW5vZGUpIHJldHVybiBudWxsO1xuXG4gIC8vIElmIG5vZGUgd2FzIHBlbmRpbmcsIGl0J3Mgbm93IHJ1bm5pbmdcbiAgaWYgKG5vZGUuc3RhdHVzID09PSAncGVuZGluZycpIHtcbiAgICBub2RlLnN0YXR1cyA9ICdydW5uaW5nJztcbiAgICBub2RlLnN0YXJ0ZWRBdCA9IG5vZGUuc3RhcnRlZEF0IHx8IERhdGUubm93KCk7XG4gIH1cblxuICBjb25zdCB0b29sQ2FsbDogQWN0aXZpdHlUb29sQ2FsbCA9IHtcbiAgICBpZDogYHRjLSR7Kytfbm9kZUNvdW50ZXJ9YCxcbiAgICBuYW1lOiB0Yy5uYW1lLFxuICAgIHN0YXR1czogdGMuc3RhdHVzIHx8ICdydW5uaW5nJyxcbiAgICBhcmdzOiB0Yy5hcmdzIHx8IHt9LFxuICAgIHN0YXJ0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICBlbmRlZEF0OiBudWxsLFxuICB9O1xuXG4gIG5vZGUudG9vbENhbGxzLnB1c2godG9vbENhbGwpO1xuICBfcmVjYWxjU3RhdHModHJlZSk7XG4gIHJldHVybiB0b29sQ2FsbDtcbn1cblxuZnVuY3Rpb24gYXRVcGRhdGVUb29sQ2FsbChub2RlSWQ6IHN0cmluZywgdG9vbElkOiBzdHJpbmcsIHVwZGF0ZXM6IFBhcnRpYWw8QWN0aXZpdHlUb29sQ2FsbD4pOiB2b2lkIHtcbiAgY29uc3QgdHJlZSA9IFMuYWN0aXZpdHlUcmVlO1xuICBpZiAoIXRyZWUpIHJldHVybjtcbiAgY29uc3Qgbm9kZSA9IHRyZWUubm9kZXNbbm9kZUlkXTtcbiAgaWYgKCFub2RlKSByZXR1cm47XG5cbiAgY29uc3QgdGMgPSBub2RlLnRvb2xDYWxscy5maW5kKHQgPT4gdC5pZCA9PT0gdG9vbElkKTtcbiAgaWYgKCF0YykgcmV0dXJuO1xuXG4gIE9iamVjdC5hc3NpZ24odGMsIHVwZGF0ZXMpO1xuICBpZiAodXBkYXRlcy5zdGF0dXMgPT09ICdkb25lJyB8fCB1cGRhdGVzLnN0YXR1cyA9PT0gJ2Vycm9yJykge1xuICAgIHRjLmVuZGVkQXQgPSB0Yy5lbmRlZEF0IHx8IERhdGUubm93KCk7XG4gICAgdGMuZHVyYXRpb24gPSB0Yy5zdGFydGVkQXQgPyAodGMuZW5kZWRBdCAtIHRjLnN0YXJ0ZWRBdCkgLyAxMDAwIDogbnVsbDtcbiAgfVxuICBfcmVjYWxjU3RhdHModHJlZSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBGaW5hbGl6YXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIGF0RmluYWxpemVOb2RlKG5vZGVJZDogc3RyaW5nLCBzdGF0dXM6IEFjdGl2aXR5Tm9kZVsnc3RhdHVzJ10pOiB2b2lkIHtcbiAgY29uc3QgdHJlZSA9IFMuYWN0aXZpdHlUcmVlO1xuICBpZiAoIXRyZWUpIHJldHVybjtcbiAgY29uc3Qgbm9kZSA9IHRyZWUubm9kZXNbbm9kZUlkXTtcbiAgaWYgKCFub2RlKSByZXR1cm47XG5cbiAgbm9kZS5zdGF0dXMgPSBzdGF0dXM7XG4gIG5vZGUuZW5kZWRBdCA9IERhdGUubm93KCk7XG4gIG5vZGUuZHVyYXRpb24gPSBub2RlLnN0YXJ0ZWRBdCA/IChub2RlLmVuZGVkQXQgLSBub2RlLnN0YXJ0ZWRBdCkgLyAxMDAwIDogbnVsbDtcblxuICAvLyBGaW5hbGl6ZSBhbnkgc3RpbGwtcnVubmluZyB0b29sIGNhbGxzXG4gIGZvciAoY29uc3QgdGMgb2Ygbm9kZS50b29sQ2FsbHMpIHtcbiAgICBpZiAodGMuc3RhdHVzID09PSAncnVubmluZycgfHwgdGMuc3RhdHVzID09PSAncGVuZGluZycpIHtcbiAgICAgIHRjLnN0YXR1cyA9IHN0YXR1cyA9PT0gJ2Vycm9yJyA/ICdlcnJvcicgOiAnZG9uZSc7XG4gICAgICB0Yy5lbmRlZEF0ID0gbm9kZS5lbmRlZEF0O1xuICAgICAgdGMuZHVyYXRpb24gPSB0Yy5zdGFydGVkQXQgPyAodGMuZW5kZWRBdCAtIHRjLnN0YXJ0ZWRBdCkgLyAxMDAwIDogbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyBSZWN1cnNpdmVseSBmaW5hbGl6ZSBjaGlsZHJlbiB0aGF0IGFyZSBzdGlsbCBhY3RpdmVcbiAgZm9yIChjb25zdCBjaGlsZElkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICBjb25zdCBjaGlsZCA9IHRyZWUubm9kZXNbY2hpbGRJZF07XG4gICAgaWYgKGNoaWxkICYmIChjaGlsZC5zdGF0dXMgPT09ICdydW5uaW5nJyB8fCBjaGlsZC5zdGF0dXMgPT09ICd0aGlua2luZycgfHwgY2hpbGQuc3RhdHVzID09PSAncGVuZGluZycpKSB7XG4gICAgICBhdEZpbmFsaXplTm9kZShjaGlsZElkLCBzdGF0dXMpO1xuICAgIH1cbiAgfVxuXG4gIF9yZWNhbGNTdGF0cyh0cmVlKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFN0YXRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBfcmVjYWxjU3RhdHModHJlZTogQWN0aXZpdHlUcmVlKTogdm9pZCB7XG4gIGNvbnN0IG5vZGVzID0gT2JqZWN0LnZhbHVlcyh0cmVlLm5vZGVzKS5maWx0ZXIobiA9PiBuLmlkICE9PSB0cmVlLnJvb3RJZCk7XG4gIGNvbnN0IHRvb2xzID0gbm9kZXMuZmxhdE1hcChuID0+IG4udG9vbENhbGxzKTtcblxuICBjb25zdCBkb25lRHVyYXRpb25zID0gbm9kZXNcbiAgICAuZmlsdGVyKG4gPT4gbi5kdXJhdGlvbiAhPT0gbnVsbClcbiAgICAubWFwKG4gPT4gbi5kdXJhdGlvbiEpO1xuXG4gIGNvbnN0IHJ1bm5pbmdOb2RlcyA9IG5vZGVzLmZpbHRlcihuID0+IG4uc3RhdHVzID09PSAncnVubmluZycgfHwgbi5zdGF0dXMgPT09ICd0aGlua2luZycpO1xuICBjb25zdCBtYXhFbGFwc2VkID0gcnVubmluZ05vZGVzLnJlZHVjZSgobWF4LCBuKSA9PiB7XG4gICAgY29uc3QgZWxhcHNlZCA9IG4uc3RhcnRlZEF0ID8gKERhdGUubm93KCkgLSBuLnN0YXJ0ZWRBdCkgLyAxMDAwIDogMDtcbiAgICByZXR1cm4gTWF0aC5tYXgobWF4LCBlbGFwc2VkKTtcbiAgfSwgMCk7XG5cbiAgdHJlZS5zdGF0cyA9IHtcbiAgICB0b3RhbEFnZW50czogbm9kZXMubGVuZ3RoLFxuICAgIHJ1bm5pbmdBZ2VudHM6IHJ1bm5pbmdOb2Rlcy5sZW5ndGgsXG4gICAgcGVuZGluZ0FnZW50czogbm9kZXMuZmlsdGVyKG4gPT4gbi5zdGF0dXMgPT09ICdwZW5kaW5nJykubGVuZ3RoLFxuICAgIGRvbmVBZ2VudHM6IG5vZGVzLmZpbHRlcihuID0+IG4uc3RhdHVzID09PSAnZG9uZScpLmxlbmd0aCxcbiAgICBlcnJvckFnZW50czogbm9kZXMuZmlsdGVyKG4gPT4gbi5zdGF0dXMgPT09ICdlcnJvcicpLmxlbmd0aCxcbiAgICB0b3RhbFRvb2xzOiB0b29scy5sZW5ndGgsXG4gICAgZG9uZVRvb2xzOiB0b29scy5maWx0ZXIodCA9PiB0LnN0YXR1cyA9PT0gJ2RvbmUnKS5sZW5ndGgsXG4gICAgcnVubmluZ1Rvb2xzOiB0b29scy5maWx0ZXIodCA9PiB0LnN0YXR1cyA9PT0gJ3J1bm5pbmcnKS5sZW5ndGgsXG4gICAgYXZnUmVzcG9uc2VUaW1lOiBkb25lRHVyYXRpb25zLmxlbmd0aFxuICAgICAgPyBkb25lRHVyYXRpb25zLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApIC8gZG9uZUR1cmF0aW9ucy5sZW5ndGhcbiAgICAgIDogMCxcbiAgICB0b3RhbEVsYXBzZWQ6IG1heEVsYXBzZWQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0R2V0U3RhdHMoKTogTUNTdGF0cyB7XG4gIHJldHVybiBTLmFjdGl2aXR5VHJlZT8uc3RhdHMgfHwgX2VtcHR5U3RhdHMoKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFJlc2V0IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBhdFJlc2V0KCk6IHZvaWQge1xuICBfbm9kZUNvdW50ZXIgPSAwO1xuICBpbml0QWN0aXZpdHlUcmVlKCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBGb3JtYXR0aW5nIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBmb3JtYXRFbGFwc2VkKG1zOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAobXMgPCAxMDAwKSByZXR1cm4gYCR7TWF0aC5yb3VuZChtcyl9bXNgO1xuICBjb25zdCBzID0gTWF0aC5mbG9vcihtcyAvIDEwMDApO1xuICBpZiAocyA8IDYwKSByZXR1cm4gYCR7c31zYDtcbiAgY29uc3QgbSA9IE1hdGguZmxvb3IocyAvIDYwKTtcbiAgY29uc3QgcnMgPSBzICUgNjA7XG4gIGlmIChtIDwgNjApIHJldHVybiBgJHttfW0gJHtyc31zYDtcbiAgY29uc3QgaCA9IE1hdGguZmxvb3IobSAvIDYwKTtcbiAgY29uc3Qgcm0gPSBtICUgNjA7XG4gIHJldHVybiBgJHtofWggJHtybX1tYDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RHVyYXRpb24oc2Vjb25kczogbnVtYmVyIHwgbnVsbCk6IHN0cmluZyB7XG4gIGlmIChzZWNvbmRzID09PSBudWxsKSByZXR1cm4gJ1x1MjAxNCc7XG4gIGlmIChzZWNvbmRzIDwgMC4wMSkgcmV0dXJuICc8MC4wMXMnO1xuICBpZiAoc2Vjb25kcyA8IDEpIHJldHVybiBgJHtzZWNvbmRzLnRvRml4ZWQoMil9c2A7XG4gIGlmIChzZWNvbmRzIDwgNjApIHJldHVybiBgJHtzZWNvbmRzLnRvRml4ZWQoMSl9c2A7XG4gIGNvbnN0IG0gPSBNYXRoLmZsb29yKHNlY29uZHMgLyA2MCk7XG4gIGNvbnN0IHJzID0gTWF0aC5yb3VuZChzZWNvbmRzICUgNjApO1xuICByZXR1cm4gYCR7bX1tICR7cnN9c2A7XG59XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBNb2NrIERhdGEgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIGNyZWF0ZU1vY2tBY3Rpdml0eVRyZWUoKTogQWN0aXZpdHlUcmVlIHtcbiAgaW5pdEFjdGl2aXR5VHJlZSgpO1xuICBjb25zdCB0cmVlID0gUy5hY3Rpdml0eVRyZWUhO1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXG4gIC8vIExvdHVzIFx1MjAxNCBydW5uaW5nIHdpdGggMiB0b29sIGNhbGxzXG4gIGNvbnN0IGxvdHVzID0gYXRBZGROb2RlKHsgYWdlbnRJZDogJ2xvdHVzJywgdGFzazogJ0FuYWx5c2llcmUgR2VzdW5kaGVpdHNkYXRlbicsIHN0YXR1czogJ3J1bm5pbmcnIH0pITtcbiAgbG90dXMuc3RhcnRlZEF0ID0gbm93IC0gMTIwMDA7XG4gIGF0QWRkVG9vbENhbGwobG90dXMuaWQsIHsgbmFtZTogJ3NlYXJjaF9maWxlcycsIGFyZ3M6IHsgcGF0dGVybjogJ2hlYWx0aConLCBwYXRoOiAnL2RhdGEnIH0gfSk7XG4gIGF0VXBkYXRlVG9vbENhbGwobG90dXMuaWQsIGxvdHVzLnRvb2xDYWxsc1swXS5pZCwgeyBzdGF0dXM6ICdkb25lJywgcmVzdWx0OiAnMTIgbWF0Y2hlcycsIGR1cmF0aW9uOiAwLjMgfSk7XG4gIGxvdHVzLnRvb2xDYWxsc1swXS5zdGFydGVkQXQgPSBub3cgLSAxMTAwMDtcbiAgbG90dXMudG9vbENhbGxzWzBdLmVuZGVkQXQgPSBub3cgLSAxMDk5NztcblxuICBhdEFkZFRvb2xDYWxsKGxvdHVzLmlkLCB7IG5hbWU6ICdyZWFkX2ZpbGUnLCBhcmdzOiB7IHBhdGg6ICcvZGF0YS9oZWFsdGgtbG9nLm1kJyB9IH0pO1xuXG4gIC8vIFN1bmZsb3dlciBcdTIwMTQgcnVubmluZyB3aXRoIDEgZG9uZSwgMSBydW5uaW5nIHRvb2xcbiAgY29uc3Qgc3VuZmxvd2VyID0gYXRBZGROb2RlKHsgYWdlbnRJZDogJ3N1bmZsb3dlcicsIHRhc2s6ICdQb3J0Zm9saW8tQW5hbHlzZSBRMSAyMDI2Jywgc3RhdHVzOiAncnVubmluZycgfSkhO1xuICBzdW5mbG93ZXIuc3RhcnRlZEF0ID0gbm93IC0gODAwMDtcbiAgYXRBZGRUb29sQ2FsbChzdW5mbG93ZXIuaWQsIHsgbmFtZTogJ2Jyb3dzZXJfbmF2aWdhdGUnLCBhcmdzOiB7IHVybDogJ2h0dHBzOi8vZmluYW5jZS5leGFtcGxlLmNvbScgfSB9KTtcbiAgYXRVcGRhdGVUb29sQ2FsbChzdW5mbG93ZXIuaWQsIHN1bmZsb3dlci50b29sQ2FsbHNbMF0uaWQsIHsgc3RhdHVzOiAnZG9uZScsIHJlc3VsdDogJ1BhZ2UgbG9hZGVkJywgZHVyYXRpb246IDIuMSB9KTtcbiAgc3VuZmxvd2VyLnRvb2xDYWxsc1swXS5zdGFydGVkQXQgPSBub3cgLSA3NTAwO1xuICBzdW5mbG93ZXIudG9vbENhbGxzWzBdLmVuZGVkQXQgPSBub3cgLSA1NDAwO1xuXG4gIGF0QWRkVG9vbENhbGwoc3VuZmxvd2VyLmlkLCB7IG5hbWU6ICd0ZXJtaW5hbCcsIGFyZ3M6IHsgY29tbWFuZDogJ3B5dGhvbjMgYW5hbHlzZS5weScgfSB9KTtcblxuICAvLyBEYW5kZWxpb24gXHUyMDE0IHBlbmRpbmdcbiAgY29uc3QgZGFuZGVsaW9uID0gYXRBZGROb2RlKHsgYWdlbnRJZDogJ2RhbmRlbGlvbicsIHRhc2s6ICdUcmlhZ2luZyB1bnJlYWQgbWVzc2FnZXMnLCBzdGF0dXM6ICdwZW5kaW5nJyB9KSE7XG5cbiAgLy8gQWRkIGEgdGllci0zIHN1Yi1hZ2VudCB1bmRlciBMb3R1c1xuICBjb25zdCByZXNlYXJjaGVyID0gYXRBZGROb2RlKHsgcGFyZW50SWQ6IGxvdHVzLmlkLCBhZ2VudElkOiAncmVzZWFyY2hlcicsIHRhc2s6ICdMb29raW5nIHVwIG51dHJpdGlvbiBkYXRhJywgc3RhdHVzOiAncnVubmluZycsIHRpZXI6IDMgfSkhO1xuICByZXNlYXJjaGVyLmFnZW50RW1vamkgPSAnXHVEODNEXHVERDBEJztcbiAgcmVzZWFyY2hlci5hZ2VudE5hbWUgPSAnUmVzZWFyY2hlcic7XG4gIHJlc2VhcmNoZXIuc3RhcnRlZEF0ID0gbm93IC0gMzAwMDtcblxuICBhdEFkZFRvb2xDYWxsKHJlc2VhcmNoZXIuaWQsIHsgbmFtZTogJ3dlYl9zZWFyY2gnLCBhcmdzOiB7IHF1ZXJ5OiAnbnV0cml0aW9uIGRhdGFiYXNlIEFQSScgfSB9KTtcblxuICBfcmVjYWxjU3RhdHModHJlZSk7XG4gIHJldHVybiB0cmVlO1xufVxuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgTWFrZSBjb3JlIGZ1bmN0aW9ucyBnbG9iYWwgKElJRkUtc2FmZSkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG53aW5kb3cuaW5pdEFjdGl2aXR5VHJlZSA9IGluaXRBY3Rpdml0eVRyZWU7XG53aW5kb3cuY3JlYXRlTW9ja0FjdGl2aXR5VHJlZSA9IGNyZWF0ZU1vY2tBY3Rpdml0eVRyZWU7XG53aW5kb3cuZm9ybWF0RWxhcHNlZCA9IGZvcm1hdEVsYXBzZWQ7XG53aW5kb3cuZm9ybWF0RHVyYXRpb24gPSBmb3JtYXREdXJhdGlvbjtcbndpbmRvdy5hdEFkZE5vZGUgPSBhdEFkZE5vZGU7XG53aW5kb3cuYXRVcGRhdGVOb2RlID0gYXRVcGRhdGVOb2RlO1xud2luZG93LmF0R2V0Tm9kZSA9IGF0R2V0Tm9kZTtcbndpbmRvdy5hdEFkZFRvb2xDYWxsID0gYXRBZGRUb29sQ2FsbDtcbndpbmRvdy5hdFVwZGF0ZVRvb2xDYWxsID0gYXRVcGRhdGVUb29sQ2FsbDtcbndpbmRvdy5hdEZpbmFsaXplTm9kZSA9IGF0RmluYWxpemVOb2RlO1xud2luZG93LmF0R2V0U3RhdHMgPSBhdEdldFN0YXRzO1xud2luZG93LmF0UmVzZXQgPSBhdFJlc2V0O1xud2luZG93Ll9hdFRyYWNrVG9vbCA9IF9hdFRyYWNrVG9vbDtcbndpbmRvdy5fYXRUcmFja1Rvb2xDb21wbGV0ZSA9IF9hdFRyYWNrVG9vbENvbXBsZXRlO1xud2luZG93Ll9hdFRyYWNrRG9uZSA9IF9hdFRyYWNrRG9uZTtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEV4cG9ydCBmb3IgY29uc29sZSB0ZXN0aW5nIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuKHdpbmRvdyBhcyBhbnkpLl9hdCA9IHtcbiAgaW5pdDogaW5pdEFjdGl2aXR5VHJlZSxcbiAgYWRkTm9kZTogYXRBZGROb2RlLFxuICB1cGRhdGVOb2RlOiBhdFVwZGF0ZU5vZGUsXG4gIGdldE5vZGU6IGF0R2V0Tm9kZSxcbiAgYWRkVG9vbENhbGw6IGF0QWRkVG9vbENhbGwsXG4gIHVwZGF0ZVRvb2xDYWxsOiBhdFVwZGF0ZVRvb2xDYWxsLFxuICBmaW5hbGl6ZTogYXRGaW5hbGl6ZU5vZGUsXG4gIHN0YXRzOiBhdEdldFN0YXRzLFxuICByZXNldDogYXRSZXNldCxcbiAgbW9jazogY3JlYXRlTW9ja0FjdGl2aXR5VHJlZSxcbiAgZm9ybWF0RWxhcHNlZCxcbiAgZm9ybWF0RHVyYXRpb24sXG4gIEFHRU5UX01FVEEsXG59O1xuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgU1NFIEV2ZW50IEJyaWRnZSAoY2FsbGVkIGZyb20gbWVzc2FnZXMudHMpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLy8gVHJhY2tzIHdoaWNoIGFnZW50IGlzIGN1cnJlbnRseSBhY3RpdmUgYmFzZWQgb24gdG9vbCBjYWxscy5cbi8vIFdoZW4gZGVsZWdhdGVfdGFzayBpcyBkZXRlY3RlZCwgY3JlYXRlcyBhIG5ldyBhZ2VudCBub2RlLlxuLy8gT3RoZXJ3aXNlLCBhdHRhY2hlcyB0b29sIGNhbGxzIHRvIHRoZSBjdXJyZW50IGFjdGl2ZSBhZ2VudCBub2RlLlxuXG5sZXQgX2FjdGl2ZUFnZW50Tm9kZUlkOiBzdHJpbmcgfCBudWxsID0gbnVsbDsgIC8vIEN1cnJlbnQgYWdlbnQgbm9kZSByZWNlaXZpbmcgdG9vbCBjYWxsc1xubGV0IF9sYXN0VG9vbElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDsgICAgICAgICAgLy8gTGFzdCB0b29sIGNhbGwgSUQgKGZvciBjb21wbGV0ZSBtYXRjaGluZylcblxuZnVuY3Rpb24gX2F0VHJhY2tUb29sKGQ6IGFueSk6IHZvaWQge1xuICBpZiAoIVMuYWN0aXZpdHlUcmVlKSBpbml0QWN0aXZpdHlUcmVlKCk7XG4gIGNvbnN0IHRyZWUgPSBTLmFjdGl2aXR5VHJlZSE7XG5cbiAgLy8gRGV0ZWN0IGRlbGVnYXRpb24gXHUyMDE0IHdoZW4gdG9vbCBuYW1lIGlzICdkZWxlZ2F0ZV90YXNrJ1xuICBpZiAoZC5uYW1lID09PSAnZGVsZWdhdGVfdGFzaycpIHtcbiAgICBjb25zdCBhZ2VudElkID0gZC5hcmdzPy5hZ2VudElkIHx8IGQuYXJncz8uYWdlbnQgfHwgZC5hcmdzPy5uYW1lIHx8ICd1bmtub3duJztcbiAgICBjb25zdCB0YXNrID0gZC5hcmdzPy5nb2FsIHx8IGQuYXJncz8ucHJvbXB0IHx8IGQuYXJncz8udGFzayB8fCBkLnByZXZpZXcgfHwgJ0RlbGVnYXRlZCB0YXNrJztcbiAgICBjb25zdCBub2RlID0gYXRBZGROb2RlKHsgYWdlbnRJZCwgdGFzaywgc3RhdHVzOiAncnVubmluZycgfSk7XG4gICAgaWYgKG5vZGUpIHtcbiAgICAgIF9hY3RpdmVBZ2VudE5vZGVJZCA9IG5vZGUuaWQ7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIERldGVybWluZSB3aGljaCBub2RlIHRvIGF0dGFjaCB0aGUgdG9vbCBjYWxsIHRvXG4gIGxldCB0YXJnZXROb2RlSWQgPSBfYWN0aXZlQWdlbnROb2RlSWQgfHwgdHJlZS5yb290SWQ7XG5cbiAgLy8gQ2hlY2sgaWYgdGhpcyB0b29sIGlzIGZyb20gYSBzcGVjaWZpYyBhZ2VudCAoZnJvbSBpbmZsaWdodCBtZXRhZGF0YSlcbiAgY29uc3QgaW5mbGlnaHQgPSAod2luZG93IGFzIGFueSkuSU5GTElHSFQ/LltTLnNlc3Npb24/LnNlc3Npb25faWRdO1xuICBpZiAoaW5mbGlnaHQ/LnRoaXNUdXJuQWdlbnQpIHtcbiAgICBjb25zdCBhZ2VudEtleSA9IGluZmxpZ2h0LnRoaXNUdXJuQWdlbnQ7XG4gICAgLy8gRmluZCBvciBjcmVhdGUgbm9kZSBmb3IgdGhpcyBhZ2VudFxuICAgIGNvbnN0IGV4aXN0aW5nTm9kZSA9IE9iamVjdC52YWx1ZXModHJlZS5ub2RlcykuZmluZChcbiAgICAgIChuOiBBY3Rpdml0eU5vZGUpID0+IG4uYWdlbnRJZCA9PT0gYWdlbnRLZXkgJiYgKG4uc3RhdHVzID09PSAncnVubmluZycgfHwgbi5zdGF0dXMgPT09ICd0aGlua2luZycpXG4gICAgKTtcbiAgICBpZiAoZXhpc3RpbmdOb2RlKSB7XG4gICAgICB0YXJnZXROb2RlSWQgPSBleGlzdGluZ05vZGUuaWQ7XG4gICAgICBfYWN0aXZlQWdlbnROb2RlSWQgPSBleGlzdGluZ05vZGUuaWQ7XG4gICAgfSBlbHNlIGlmIChBR0VOVF9NRVRBW2FnZW50S2V5XSkge1xuICAgICAgLy8gTmV3IGFnZW50IGFwcGVhcmVkIFx1MjAxNCBjcmVhdGUgbm9kZVxuICAgICAgY29uc3QgdGFzayA9IGluZmxpZ2h0LnRoaXNUdXJuTW9kZWwgPyBgJHtpbmZsaWdodC50aGlzVHVybk1vZGVsfWAgOiAnV29ya2luZy4uLic7XG4gICAgICBjb25zdCBub2RlID0gYXRBZGROb2RlKHsgYWdlbnRJZDogYWdlbnRLZXksIHRhc2ssIHN0YXR1czogJ3J1bm5pbmcnIH0pO1xuICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgX2FjdGl2ZUFnZW50Tm9kZUlkID0gbm9kZS5pZDtcbiAgICAgICAgdGFyZ2V0Tm9kZUlkID0gbm9kZS5pZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCB0YyA9IGF0QWRkVG9vbENhbGwodGFyZ2V0Tm9kZUlkLCB7XG4gICAgbmFtZTogZC5uYW1lLFxuICAgIGFyZ3M6IGQuYXJncyB8fCB7fSxcbiAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgfSk7XG4gIGlmICh0Yykge1xuICAgIF9sYXN0VG9vbElkID0gdGMuaWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2F0VHJhY2tUb29sQ29tcGxldGUoZDogYW55KTogdm9pZCB7XG4gIGlmICghUy5hY3Rpdml0eVRyZWUpIHJldHVybjtcbiAgY29uc3QgdHJlZSA9IFMuYWN0aXZpdHlUcmVlITtcblxuICAvLyBUcnkgdG8gZmluZCB0aGUgbWF0Y2hpbmcgcnVubmluZyB0b29sIGNhbGwgYWNyb3NzIGFsbCBhY3RpdmUgbm9kZXNcbiAgY29uc3QgYWN0aXZlTm9kZXMgPSBPYmplY3QudmFsdWVzKHRyZWUubm9kZXMpLmZpbHRlcihcbiAgICAobjogQWN0aXZpdHlOb2RlKSA9PiBuLnN0YXR1cyA9PT0gJ3J1bm5pbmcnIHx8IG4uc3RhdHVzID09PSAndGhpbmtpbmcnXG4gICk7XG5cbiAgZm9yIChjb25zdCBub2RlIG9mIGFjdGl2ZU5vZGVzKSB7XG4gICAgZm9yIChjb25zdCB0YyBvZiBub2RlLnRvb2xDYWxscykge1xuICAgICAgaWYgKHRjLnN0YXR1cyA9PT0gJ3J1bm5pbmcnICYmIHRjLm5hbWUgPT09IGQubmFtZSkge1xuICAgICAgICBhdFVwZGF0ZVRvb2xDYWxsKG5vZGUuaWQsIHRjLmlkLCB7XG4gICAgICAgICAgc3RhdHVzOiBkLmlzX2Vycm9yID8gJ2Vycm9yJyA6ICdkb25lJyxcbiAgICAgICAgICByZXN1bHQ6IGQucHJldmlldyB8fCBkLnJlc3VsdCxcbiAgICAgICAgICBkdXJhdGlvbjogZC5kdXJhdGlvbixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gX2F0VHJhY2tEb25lKCk6IHZvaWQge1xuICBpZiAoIVMuYWN0aXZpdHlUcmVlKSByZXR1cm47XG5cbiAgLy8gRmluYWxpemUgdGhlIGFjdGl2ZSBhZ2VudCBub2RlXG4gIGlmIChfYWN0aXZlQWdlbnROb2RlSWQpIHtcbiAgICBhdEZpbmFsaXplTm9kZShfYWN0aXZlQWdlbnROb2RlSWQsICdkb25lJyk7XG4gICAgX2FjdGl2ZUFnZW50Tm9kZUlkID0gbnVsbDtcbiAgfVxuXG4gIC8vIFJlc2V0IHJvb3Qgc3RhdHVzXG4gIGNvbnN0IHJvb3QgPSBTLmFjdGl2aXR5VHJlZS5ub2Rlc1tTLmFjdGl2aXR5VHJlZS5yb290SWRdO1xuICBpZiAocm9vdCkge1xuICAgIHJvb3Quc3RhdHVzID0gJ3J1bm5pbmcnO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9hdFRyYWNrTmV3U2Vzc2lvbigpOiB2b2lkIHtcbiAgX2FjdGl2ZUFnZW50Tm9kZUlkID0gbnVsbDtcbiAgX2xhc3RUb29sSWQgPSBudWxsO1xuICBpZiAoUy5hY3Rpdml0eVRyZWUpIHtcbiAgICBhdFJlc2V0KCk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFNQSxRQUFNLGFBQTJFO0FBQUEsSUFDL0UsTUFBZ0IsRUFBRSxPQUFPLGFBQU0sTUFBTSxRQUFrQixNQUFNLEVBQUU7QUFBQSxJQUMvRCxPQUFnQixFQUFFLE9BQU8sYUFBTSxNQUFNLFNBQWtCLE1BQU0sRUFBRTtBQUFBLElBQy9ELGlCQUFnQixFQUFFLE9BQU8sYUFBTSxNQUFNLGlCQUFrQixNQUFNLEVBQUU7QUFBQSxJQUMvRCxXQUFnQixFQUFFLE9BQU8sYUFBTSxNQUFNLGFBQWtCLE1BQU0sRUFBRTtBQUFBLElBQy9ELE1BQWdCLEVBQUUsT0FBTyxnQkFBTSxNQUFNLFFBQWtCLE1BQU0sRUFBRTtBQUFBLElBQy9ELEtBQWdCLEVBQUUsT0FBTyxhQUFNLE1BQU0sT0FBa0IsTUFBTSxFQUFFO0FBQUEsSUFDL0Qs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
|