Files
jsc-anima/node_modules/.vitest-cache/525834972c06d5ab6bb7d533090f3ffef02c20b5
T

303 lines
36 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const __vite_ssr_import_0__ = await __vite_ssr_import__("claude-code/testing", {"importedNames":["expect","mock","test"]});
const char = (over = {}, tone = "溫柔") => ({
name: "小葵",
nameEn: "Aoi",
slug: "aoi",
persona: {
selfRef: "我",
address: "你",
tone,
catchphrase: "加油",
values: "誠實",
taboos: "背叛"
},
axes: {
gentle: 7,
tsundere: 2,
lively: 5,
formal: 4,
talkative: 5,
humor: 3,
proactive: 6,
expressive: 5
},
anime: {
moe: "認真",
speech: "柔和",
emotions: "會臉紅",
kaomoji: "(^_^)",
themeColor: "#88c"
},
state: {
mood: "緊張",
dialogueStyle: "客氣",
monologue: "想變強",
relationships: [{
with: "阿零",
kind: "friend",
note: "同伴"
}],
age: 16,
place: "學院"
},
...over
});
const reply = (c) => JSON.stringify({
work: {
name: "測試物語",
nameEn: "Test Story",
slug: "ts",
timeline: [{
time: "春",
place: "學院"
}],
terms: [{
term: "魔核",
definition: "力量來源"
}]
},
characters: [c]
});
let cloneMissing = false;
let registered = [];
const probed = new Set();
let sessionCwd = "/repo";
const setup = (on, answers, files = new Map()) => {
const s = {
files,
cmds: [],
prompts: []
};
const o = on;
__vite_ssr_import_0__.mock.store(on);
o("command.register", ((_$, e) => {
registered.push(e.name);
return { value: { name: e.name } };
}));
o("session.start", () => ({ cwd: "/repo" }));
o("session.cwd", (() => ({ value: sessionCwd })));
__vite_ssr_import_0__.mock.env(on, { HOME: "/home/u" });
o("fs.exists", ((_$, e) => (e.path.endsWith("/characters/index.json") && probed.add(e.path), { value: s.files.has(e.path) || e.path === "/home/u/.cache/jsc-anima/repo/.git" && !cloneMissing })));
o("fs.read", ((_$, e) => ({ value: s.files.get(e.path) ?? "" })));
o("fs.write", ((_$, e) => {
s.files.set(e.path, e.text);
return { value: undefined };
}));
o("model.complete", ((_$, e) => {
s.prompts.push(e.prompt);
return { value: {
isAnswered: true,
text: answers.shift() ?? "",
usage: {}
} };
}));
o("process.run", ((_$, e) => {
s.cmds.push(e.argv);
const j = e.argv.join(" ");
const out = j.includes("--abbrev-ref") ? "issue-4" : j.includes("symbolic-ref") ? "origin/main" : j.includes("get-url") ? "https://gitea.jsc.idv.tw/jiantw83/jsc-anima.git" : j.startsWith("tea logins") ? "admin https://gitea.jsc.idv.tw u" : j.startsWith("tea pulls") ? "PR#1" : "";
return { value: {
exitCode: 0,
stdout: out,
stderr: ""
} };
}));
return s;
};
const run = ($, args) => $.command.run({
command: "anima-extract",
args
}).then((r) => r.text);
(0,__vite_ssr_import_0__.test)("萃取:先確認代號、再看變更摘要、最後寫檔並建立 PR", async ($, on) => {
const s = setup(on, [reply(char())], new Map([["/repo/ch1.txt", "第一段\n\n第二段"]]));
await $.session.start({
source: "startup",
cwd: "/repo"
});
const t1 = await run($, "ch1.txt");
(0,__vite_ssr_import_0__.expect)(t1).toContain("ts");
(0,__vite_ssr_import_0__.expect)(t1).toContain("aoi");
(0,__vite_ssr_import_0__.expect)(t1).toContain("尚未建立");
(0,__vite_ssr_import_0__.expect)(s.files.has("/home/u/.cache/jsc-anima/repo/characters/ts/aoi.json")).toBe(false);
const t2 = await run($, "confirm work=testy aoi=ao");
(0,__vite_ssr_import_0__.expect)(t2).toContain("變更摘要");
(0,__vite_ssr_import_0__.expect)(s.files.has("/home/u/.cache/jsc-anima/repo/characters/testy/ao.json")).toBe(false);
const t3 = await run($, "confirm");
(0,__vite_ssr_import_0__.expect)(t3).toContain("已建立 PR");
const pack = JSON.parse(s.files.get("/home/u/.cache/jsc-anima/repo/characters/testy/ao.json"));
(0,__vite_ssr_import_0__.expect)(pack.timeline[0].chapter).toBe("ch1");
(0,__vite_ssr_import_0__.expect)(pack.timeline[0].age).toBe(16);
(0,__vite_ssr_import_0__.expect)(JSON.parse(s.files.get("/home/u/.cache/jsc-anima/repo/characters/testy/work.json")).terms[0].term).toBe("魔核");
const pr = s.cmds.find((c) => c[0] === "tea" && c[1] === "pulls");
(0,__vite_ssr_import_0__.expect)(pr).toContain("main");
(0,__vite_ssr_import_0__.expect)(pr).toContain("feat/extract-testy-ch1");
(0,__vite_ssr_import_0__.expect)(s.cmds.some((c) => c[0] === "git" && c[1] === "commit" && c[3].startsWith("feat: "))).toBe(true);
});
(0,__vite_ssr_import_0__.test)("同章節重跑覆蓋、新章節追加、基礎設定不同標記待確認", async ($, on) => {
const files = new Map([["/repo/ch1.txt", "a"], ["/repo/ch2.txt", "b"]]);
const s = setup(on, [
reply(char()),
reply(char()),
reply(char({ state: {
mood: "開心",
dialogueStyle: "",
monologue: "",
relationships: [],
age: 17,
place: ""
} }, "傲嬌"))
], files);
await $.session.start({
source: "startup",
cwd: "/repo"
});
const write = async (f) => {
await run($, f);
await run($, "confirm");
return run($, "confirm");
};
await write("ch1.txt");
await write("ch1.txt");
(0,__vite_ssr_import_0__.expect)(JSON.parse(s.files.get("/home/u/.cache/jsc-anima/repo/characters/ts/aoi.json")).timeline.length).toBe(1);
await run($, "ch2.txt");
const summary = await run($, "confirm");
(0,__vite_ssr_import_0__.expect)(summary).toContain("追加");
(0,__vite_ssr_import_0__.expect)(summary).toContain("待確認");
await run($, "confirm");
const pack = JSON.parse(s.files.get("/home/u/.cache/jsc-anima/repo/characters/ts/aoi.json"));
(0,__vite_ssr_import_0__.expect)(pack.timeline.map((t) => t.chapter)).toEqual(["ch1", "ch2"]);
(0,__vite_ssr_import_0__.expect)(pack.persona.tone).toBe("溫柔");
(0,__vite_ssr_import_0__.expect)(pack.conflicts[0]).toMatchObject({
field: "persona.tone",
proposed: "傲嬌",
status: "待確認"
});
});
(0,__vite_ssr_import_0__.test)("schema 驗證失敗不寫檔、不建 PR;cancel 清除待確認", async ($, on) => {
const bad = char({ axes: {
gentle: 99,
tsundere: 2,
lively: 5,
formal: 4,
talkative: 5,
humor: 3,
proactive: 6,
expressive: 5
} });
const s = setup(on, [reply(bad)], new Map([["/repo/ch1.txt", "a"]]));
await $.session.start({
source: "startup",
cwd: "/repo"
});
await run($, "ch1.txt");
(0,__vite_ssr_import_0__.expect)(await run($, "confirm")).toContain("schema 驗證失敗");
(0,__vite_ssr_import_0__.expect)(s.cmds.some((c) => c[0] === "tea")).toBe(false);
(0,__vite_ssr_import_0__.expect)([...s.files.keys()].some((k) => k.includes("characters"))).toBe(false);
(0,__vite_ssr_import_0__.expect)(await run($, "cancel")).toContain("已取消");
});
(0,__vite_ssr_import_0__.test)("貼上章節內容:paste <章節名稱> 加下一行起的內容,並寫入語言欄位與 index.json", async ($, on) => {
const s = setup(on, [reply(char({ language: "繁體中文,少量原作口癖" }))]);
await $.session.start({
source: "startup",
cwd: "/repo"
});
(0,__vite_ssr_import_0__.expect)(await run($, "paste")).toContain("貼上章節的用法");
const t1 = await run($, "paste 第一章\n這是貼上的章節內容。");
(0,__vite_ssr_import_0__.expect)(t1).toContain("aoi");
(0,__vite_ssr_import_0__.expect)(s.prompts[0]).toContain("這是貼上的章節內容。");
await run($, "confirm");
await run($, "confirm");
const pack = JSON.parse(s.files.get("/home/u/.cache/jsc-anima/repo/characters/ts/aoi.json"));
(0,__vite_ssr_import_0__.expect)(pack.timeline[0].chapter).toBe("第一章");
(0,__vite_ssr_import_0__.expect)(pack.language).toBe("繁體中文,少量原作口癖");
(0,__vite_ssr_import_0__.expect)(JSON.parse(s.files.get("/home/u/.cache/jsc-anima/repo/characters/index.json")).packs[0]).toEqual({
work: "ts",
workName: "測試物語",
slug: "aoi"
});
});
(0,__vite_ssr_import_0__.test)("欄位含長段引號內容視為抄錄原作台詞,不寫檔", async ($, on) => {
const quoted = char({ persona: {
selfRef: "我",
address: "你",
tone: "「這是一段很長很長的原作台詞內容,不應該出現在角色包裡面」",
catchphrase: "加油",
values: "誠實",
taboos: "背叛"
} });
const s = setup(on, [reply(quoted)], new Map([["/repo/ch1.txt", "a"]]));
await $.session.start({
source: "startup",
cwd: "/repo"
});
await run($, "ch1.txt");
(0,__vite_ssr_import_0__.expect)(await run($, "confirm")).toContain("疑似抄錄原作台詞");
(0,__vite_ssr_import_0__.expect)([...s.files.keys()].some((k) => k.includes("characters"))).toBe(false);
});
(0,__vite_ssr_import_0__.test)("在非 jsc-anima 目錄執行:git 與 PR 都走 jsc-anima 的快取 clone,不碰 session 目錄", async ($, on) => {
sessionCwd = "/other/proj";
try {
const s = setup(on, [reply(char())], new Map([["/other/proj/ch1.txt", "第一段"]]));
await $.session.start({
source: "startup",
cwd: "/other/proj"
});
await run($, "/other/proj/ch1.txt");
await run($, "confirm");
(0,__vite_ssr_import_0__.expect)(await run($, "confirm")).toContain("已建立 PR");
(0,__vite_ssr_import_0__.expect)(s.cmds.some((c) => c.includes("fetch"))).toBe(true);
const pr = s.cmds.find((c) => c[0] === "tea" && c[1] === "pulls");
(0,__vite_ssr_import_0__.expect)(pr).toContain("jiantw83/jsc-anima");
(0,__vite_ssr_import_0__.expect)(s.files.has("/other/proj/characters/index.json")).toBe(false);
(0,__vite_ssr_import_0__.expect)(JSON.parse(s.files.get("/home/u/.cache/jsc-anima/repo/characters/index.json")).packs[0].slug).toBe("aoi");
} finally {
sessionCwd = "/repo";
}
});
(0,__vite_ssr_import_0__.test)("快取 clone 不存在時先 clone jsc-anima", async ($, on) => {
cloneMissing = true;
try {
const s = setup(on, [reply(char())], new Map([["/repo/ch1.txt", "a"]]));
await $.session.start({
source: "startup",
cwd: "/repo"
});
await run($, "ch1.txt");
const clone = s.cmds.find((c) => c.includes("clone"));
(0,__vite_ssr_import_0__.expect)(clone).toContain("https://gitea.jsc.idv.tw/jiantw83/jsc-anima.git");
} finally {
cloneMissing = false;
}
});
(0,__vite_ssr_import_0__.test)("paste:CRLF 換行也能分出章節名稱與內容", async ($, on) => {
const s = setup(on, [reply(char())]);
await $.session.start({
source: "startup",
cwd: "/repo"
});
await run($, "paste 第二章\r\n第一行\r\n第二行");
(0,__vite_ssr_import_0__.expect)(s.prompts[0]).toContain("第一行");
});
(0,__vite_ssr_import_0__.test)("合併並更新外掛後:啟動時從外掛目錄的 index.json 註冊 {作品代號}-{角色代號} 並可啟動", async ($, on) => {
const s = setup(on, [reply(char())], new Map([["/repo/ch1.txt", "a"]]));
registered = [];
await $.session.start({
source: "startup",
cwd: "/repo"
});
await run($, "ch1.txt");
await run($, "confirm");
await run($, "confirm");
// 模擬 PR 合併、外掛更新:clone 內的 characters/ 內容出現在外掛目錄。
const root = ([...probed].find((q) => !q.startsWith("/home/u/")) ?? "").replace("/characters/index.json", "");
for (const [k, v] of [...s.files]) if (k.startsWith("/home/u/.cache/jsc-anima/repo/characters/")) s.files.set(k.replace("/home/u/.cache/jsc-anima/repo", root), v);
await $.session.start({
source: "startup",
cwd: "/anywhere"
});
(0,__vite_ssr_import_0__.expect)(registered).toContain("ts-aoi");
});
//# sourceMappingSource=vite-generated
//# sourceMappingURL=data:application/json;base64,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RUFBRSxRQUFRLE1BQU07RUFBRSxRQUFRO0VBQVcsS0FBSztDQUFRLENBQVU7Q0FDbEUsTUFBTSxJQUFJLEdBQVkseUJBQXlCO0NBQy9DLGlDQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxVQUFVLEtBQUs7QUFDdEMsQ0FBQztBQUVELCtCQUFLLHVEQUF1RCxPQUFPLEdBQUcsT0FBTztDQUMzRSxNQUFNLElBQUksTUFBTSxJQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDL0UsYUFBYSxDQUFDO0NBQ2QsTUFBTSxFQUFFLFFBQVEsTUFBTTtFQUFFLFFBQVE7RUFBVyxLQUFLO0NBQVEsQ0FBVTtDQUNsRSxNQUFNLElBQUksR0FBWSxTQUFTO0NBQy9CLE1BQU0sSUFBSSxHQUFZLFNBQVM7Q0FDL0IsTUFBTSxJQUFJLEdBQVksU0FBUzs7Q0FFL0IsTUFBTSxRQUFRLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxNQUFLLE1BQUssQ0FBQyxFQUFFLFdBQVcsVUFBVSxDQUFDLEtBQUssR0FBRSxDQUFFLFFBQVEsMEJBQTBCLEVBQUU7Q0FDMUcsS0FBSyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssR0FBRyxJQUFJLEVBQUUsV0FBVywyQ0FBMkMsR0FBRyxFQUFFLE1BQU0sSUFBSSxFQUFFLFFBQVEsaUNBQWlDLElBQUksR0FBRyxDQUFDO0NBQ2pLLE1BQU0sRUFBRSxRQUFRLE1BQU07RUFBRSxRQUFRO0VBQVcsS0FBSztDQUFZLENBQVU7Q0FDdEUsaUNBQU8sVUFBVSxDQUFDLENBQUMsVUFBVSxRQUFRO0FBQ3ZDLENBQUMiLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbImV4dHJhY3QudGVzdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleHBlY3QsIG1vY2ssIHRlc3QgfSBmcm9tICdjbGF1ZGUtY29kZS90ZXN0aW5nJ1xuXG5pbXBvcnQgdHlwZSB7IEV4dHJhY3RlZCB9IGZyb20gJy4vZXh0cmFjdCdcblxuY29uc3QgY2hhciA9IChvdmVyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9LCB0b25lID0gJ+a6q+aflCcpOiBFeHRyYWN0ZWRbJ2NoYXJhY3RlcnMnXVtudW1iZXJdID0+XG4gICh7XG4gICAgbmFtZTogJ+Wwj+iRtScsIG5hbWVFbjogJ0FvaScsIHNsdWc6ICdhb2knLFxuICAgIHBlcnNvbmE6IHsgc2VsZlJlZjogJ+aIkScsIGFkZHJlc3M6ICfkvaAnLCB0b25lLCBjYXRjaHBocmFzZTogJ+WKoOayuScsIHZhbHVlczogJ+iqoOWvpicsIHRhYm9vczogJ+iDjOWPmycgfSxcbiAgICBheGVzOiB7IGdlbnRsZTogNywgdHN1bmRlcmU6IDIsIGxpdmVseTogNSwgZm9ybWFsOiA0LCB0YWxrYXRpdmU6IDUsIGh1bW9yOiAzLCBwcm9hY3RpdmU6IDYsIGV4cHJlc3NpdmU6IDUgfSxcbiAgICBhbmltZTogeyBtb2U6ICfoqo3nnJ8nLCBzcGVlY2g6ICfmn5TlkownLCBlbW90aW9uczogJ+acg+iHiee0hScsIGthb21vamk6ICcoXl9eKScsIHRoZW1lQ29sb3I6ICcjODhjJyB9LFxuICAgIHN0YXRlOiB7IG1vb2Q6ICfnt4rlvLUnLCBkaWFsb2d1ZVN0eWxlOiAn5a6i5rCjJywgbW9ub2xvZ3VlOiAn5oOz6K6K5by3JywgcmVsYXRpb25zaGlwczogW3sgd2l0aDogJ+mYv+mbticsIGtpbmQ6ICdmcmllbmQnLCBub3RlOiAn5ZCM5Ly0JyB9XSwgYWdlOiAxNiwgcGxhY2U6ICflrbjpmaInIH0sXG4gICAgLi4ub3ZlcixcbiAgfSkgYXMgbmV2ZXJcblxuY29uc3QgcmVwbHkgPSAoYzogRXh0cmFjdGVkWydjaGFyYWN0ZXJzJ11bbnVtYmVyXSkgPT5cbiAgSlNPTi5zdHJpbmdpZnkoeyB3b3JrOiB7IG5hbWU6ICfmuKzoqabnianoqp4nLCBuYW1lRW46ICdUZXN0IFN0b3J5Jywgc2x1ZzogJ3RzJywgdGltZWxpbmU6IFt7IHRpbWU6ICfmmKUnLCBwbGFjZTogJ+WtuOmZoicgfV0sIHRlcm1zOiBbeyB0ZXJtOiAn6a2U5qC4JywgZGVmaW5pdGlvbjogJ+WKm+mHj+S+hua6kCcgfV0gfSwgY2hhcmFjdGVyczogW2NdIH0pXG5cbnR5cGUgU2V0dXAgPSB7IGZpbGVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+OyBjbWRzOiBzdHJpbmdbXVtdOyBwcm9tcHRzOiBzdHJpbmdbXSB9XG5cbmxldCBjbG9uZU1pc3NpbmcgPSBmYWxzZVxubGV0IHJlZ2lzdGVyZWQ6IHN0cmluZ1tdID0gW11cbmNvbnN0IHByb2JlZCA9IG5ldyBTZXQ8c3RyaW5nPigpXG5sZXQgc2Vzc2lvbkN3ZCA9ICcvcmVwbydcbmNvbnN0IHNldHVwID0gKG9uOiBuZXZlciwgYW5zd2Vyczogc3RyaW5nW10sIGZpbGVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKSk6IFNldHVwID0+IHtcbiAgY29uc3QgczogU2V0dXAgPSB7IGZpbGVzLCBjbWRzOiBbXSwgcHJvbXB0czogW10gfVxuICBjb25zdCBvID0gb24gYXMgdW5rbm93biBhcyAobjogc3RyaW5nLCBoOiAoLi4uYTogbmV2ZXJbXSkgPT4gdW5rbm93bikgPT4gdm9pZFxuICBtb2NrLnN0b3JlKG9uKVxuICBvKCdjb21tYW5kLnJlZ2lzdGVyJywgKChfJDogdW5rbm93biwgZTogeyBuYW1lOiBzdHJpbmcgfSkgPT4geyByZWdpc3RlcmVkLnB1c2goZS5uYW1lKTsgcmV0dXJuIHsgdmFsdWU6IHsgbmFtZTogZS5uYW1lIH0gfSB9KSBhcyBuZXZlcilcbiAgbygnc2Vzc2lvbi5zdGFydCcsICgpID0+ICh7IGN3ZDogJy9yZXBvJyB9KSlcbiAgbygnc2Vzc2lvbi5jd2QnLCAoKCkgPT4gKHsgdmFsdWU6IHNlc3Npb25Dd2QgfSkpIGFzIG5ldmVyKVxuICBtb2NrLmVudihvbiwgeyBIT01FOiAnL2hvbWUvdScgfSlcbiAgbygnZnMuZXhpc3RzJywgKChfJDogdW5rbm93biwgZTogeyBwYXRoOiBzdHJpbmcgfSkgPT4gKGUucGF0aC5lbmRzV2l0aCgnL2NoYXJhY3RlcnMvaW5kZXguanNvbicpICYmIHByb2JlZC5hZGQoZS5wYXRoKSwgeyB2YWx1ZTogcy5maWxlcy5oYXMoZS5wYXRoKSB8fCAoZS5wYXRoID09PSAnL2hvbWUvdS8uY2FjaGUvanNjLWFuaW1hL3JlcG8vLmdpdCcgJiYgIWNsb25lTWlzc2luZykgfSkpIGFzIG5ldmVyKVxuICBvKCdmcy5yZWFkJywgKChfJDogdW5rbm93biwgZTogeyBwYXRoOiBzdHJpbmcgfSkgPT4gKHsgdmFsdWU6IHMuZmlsZXMuZ2V0KGUucGF0aCkgPz8gJycgfSkpIGFzIG5ldmVyKVxuICBvKCdmcy53cml0ZScsICgoXyQ6IHVua25vd24sIGU6IHsgcGF0aDogc3RyaW5nOyB0ZXh0OiBzdHJpbmcgfSkgPT4geyBzLmZpbGVzLnNldChlLnBhdGgsIGUudGV4dCk7IHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQgfSB9KSBhcyBuZXZlcilcbiAgbygnbW9kZWwuY29tcGxldGUnLCAoKF8kOiB1bmtub3duLCBlOiB7IHByb21wdDogc3RyaW5nIH0pID0+IHtcbiAgICBzLnByb21wdHMucHVzaChlLnByb21wdClcbiAgICByZXR1cm4geyB2YWx1ZTogeyBpc0Fuc3dlcmVkOiB0cnVlLCB0ZXh0OiBhbnN3ZXJzLnNoaWZ0KCkgPz8gJycsIHVzYWdlOiB7fSB9IH1cbiAgfSkgYXMgbmV2ZXIpXG4gIG8oJ3Byb2Nlc3MucnVuJywgKChfJDogdW5rbm93biwgZTogeyBhcmd2OiBzdHJpbmdbXTsgfSkgPT4ge1xuICAgIHMuY21kcy5wdXNoKGUuYXJndilcbiAgICBjb25zdCBqID0gZS5hcmd2LmpvaW4oJyAnKVxuICAgIGNvbnN0IG91dCA9IGouaW5jbHVkZXMoJy0tYWJicmV2LXJlZicpID8gJ2lzc3VlLTQnIDogai5pbmNsdWRlcygnc3ltYm9saWMtcmVmJykgPyAnb3JpZ2luL21haW4nIDogai5pbmNsdWRlcygnZ2V0LXVybCcpID8gJ2h0dHBzOi8vZ2l0ZWEuanNjLmlkdi50dy9qaWFudHc4My9qc2MtYW5pbWEuZ2l0JyA6IGouc3RhcnRzV2l0aCgndGVhIGxvZ2lucycpID8gJ2FkbWluIGh0dHBzOi8vZ2l0ZWEuanNjLmlkdi50dyB1JyA6IGouc3RhcnRzV2l0aCgndGVhIHB1bGxzJykgPyAnUFIjMScgOiAnJ1xuICAgIHJldHVybiB7IHZhbHVlOiB7IGV4aXRDb2RlOiAwLCBzdGRvdXQ6IG91dCwgc3RkZXJyOiAnJyB9IH1cbiAgfSkgYXMgbmV2ZXIpXG4gIHJldHVybiBzXG59XG5cbmNvbnN0IHJ1biA9ICgkOiBuZXZlciwgYXJnczogc3RyaW5nKSA9PiAoJCBhcyBhbnkpLmNvbW1hbmQucnVuKHsgY29tbWFuZDogJ2FuaW1hLWV4dHJhY3QnLCBhcmdzIH0pLnRoZW4oKHI6IHsgdGV4dDogc3RyaW5nIH0pID0+IHIudGV4dClcblxudGVzdCgn6JCD5Y+W77ya5YWI56K66KqN5Luj6Jmf44CB5YaN55yL6K6K5pu05pGY6KaB44CB5pyA5b6M5a+r5qqU5Lim5bu656uLIFBSJywgYXN5bmMgKCQsIG9uKSA9PiB7XG4gIGNvbnN0IHMgPSBzZXR1cChvbiBhcyBuZXZlciwgW3JlcGx5KGNoYXIoKSldLCBuZXcgTWFwKFtbJy9yZXBvL2NoMS50eHQnLCAn56ys5LiA5q61XFxuXFxu56ys5LqM5q61J11dKSlcbiAgYXdhaXQgJC5zZXNzaW9uLnN0YXJ0KHsgc291cmNlOiAnc3RhcnR1cCcsIGN3ZDogJy9yZXBvJyB9IGFzIG5ldmVyKVxuICBjb25zdCB0MSA9IGF3YWl0IHJ1bigkIGFzIG5ldmVyLCAnY2gxLnR4dCcpXG4gIGV4cGVjdCh0MSkudG9Db250YWluKCd0cycpXG4gIGV4cGVjdCh0MSkudG9Db250YWluKCdhb2knKVxuICBleHBlY3QodDEpLnRvQ29udGFpbign5bCa5pyq5bu656uLJylcbiAgZXhwZWN0KHMuZmlsZXMuaGFzKCcvaG9tZS91Ly5jYWNoZS9qc2MtYW5pbWEvcmVwby9jaGFyYWN0ZXJzL3RzL2FvaS5qc29uJykpLnRvQmUoZmFsc2UpXG5cbiAgY29uc3QgdDIgPSBhd2FpdCBydW4oJCBhcyBuZXZlciwgJ2NvbmZpcm0gd29yaz10ZXN0eSBhb2k9YW8nKVxuICBleHBlY3QodDIpLnRvQ29udGFpbign6K6K5pu05pGY6KaBJylcbiAgZXhwZWN0KHMuZmlsZXMuaGFzKCcvaG9tZS91Ly5jYWNoZS9qc2MtYW5pbWEvcmVwby9jaGFyYWN0ZXJzL3Rlc3R5L2FvLmpzb24nKSkudG9CZShmYWxzZSlcblxuICBjb25zdCB0MyA9IGF3YWl0IHJ1bigkIGFzIG5ldmVyLCAnY29uZmlybScpXG4gIGV4cGVjdCh0MykudG9Db250YWluKCflt7Llu7rnq4sgUFInKVxuICBjb25zdCBwYWNrID0gSlNPTi5wYXJzZShzLmZpbGVzLmdldCgnL2hvbWUvdS8uY2FjaGUvanNjLWFuaW1hL3JlcG8vY2hhcmFjdGVycy90ZXN0eS9hby5qc29uJykhKVxuICBleHBlY3QocGFjay50aW1lbGluZVswXS5jaGFwdGVyKS50b0JlKCdjaDEnKVxuICBleHBlY3QocGFjay50aW1lbGluZVswXS5hZ2UpLnRvQmUoMTYpXG4gIGV4cGVjdChKU09OLnBhcnNlKHMuZmlsZXMuZ2V0KCcvaG9tZS91Ly5jYWNoZS9qc2MtYW5pbWEvcmVwby9jaGFyYWN0ZXJzL3Rlc3R5L3dvcmsuanNvbicpISkudGVybXNbMF0udGVybSkudG9CZSgn6a2U5qC4JylcbiAgY29uc3QgcHIgPSBzLmNtZHMuZmluZChjID0+IGNbMF0gPT09ICd0ZWEnICYmIGNbMV0gPT09ICdwdWxscycpIVxuICBleHBlY3QocHIpLnRvQ29udGFpbignbWFpbicpXG4gIGV4cGVjdChwcikudG9Db250YWluKCdmZWF0L2V4dHJhY3QtdGVzdHktY2gxJylcbiAgZXhwZWN0KHMuY21kcy5zb21lKGMgPT4gY1swXSA9PT0gJ2dpdCcgJiYgY1sxXSA9PT0gJ2NvbW1pdCcgJiYgY1szXSEuc3RhcnRzV2l0aCgnZmVhdDogJykpKS50b0JlKHRydWUpXG59KVxuXG50ZXN0KCflkIznq6Dnr4Dph43ot5Hopobok4vjgIHmlrDnq6Dnr4Dov73liqDjgIHln7rnpI7oqK3lrprkuI3lkIzmqJnoqJjlvoXnorroqo0nLCBhc3luYyAoJCwgb24pID0+IHtcbiAgY29uc3QgZmlsZXMgPSBuZXcgTWFwKFtbJy9yZXBvL2NoMS50eHQnLCAnYSddLCBbJy9yZXBvL2NoMi50eHQnLCAnYiddXSlcbiAgY29uc3QgcyA9IHNldHVwKG9uIGFzIG5ldmVyLCBbcmVwbHkoY2hhcigpKSwgcmVwbHkoY2hhcigpKSwgcmVwbHkoY2hhcih7IHN0YXRlOiB7IG1vb2Q6ICfplovlv4MnLCBkaWFsb2d1ZVN0eWxlOiAnJywgbW9ub2xvZ3VlOiAnJywgcmVsYXRpb25zaGlwczogW10sIGFnZTogMTcsIHBsYWNlOiAnJyB9IH0sICflgrLlrIwnKSldLCBmaWxlcylcbiAgYXdhaXQgJC5zZXNzaW9uLnN0YXJ0KHsgc291cmNlOiAnc3RhcnR1cCcsIGN3ZDogJy9yZXBvJyB9IGFzIG5ldmVyKVxuICBjb25zdCB3cml0ZSA9IGFzeW5jIChmOiBzdHJpbmcpID0+IHtcbiAgICBhd2FpdCBydW4oJCBhcyBuZXZlciwgZilcbiAgICBhd2FpdCBydW4oJCBhcyBuZXZlciwgJ2NvbmZpcm0nKVxuICAgIHJldHVybiBydW4oJCBhcyBuZXZlciwgJ2NvbmZpcm0nKVxuICB9XG4gIGF3YWl0IHdyaXRlKCdjaDEudHh0JylcbiAgYXdhaXQgd3JpdGUoJ2NoMS50eHQnKVxuICBleHBlY3QoSlNPTi5wYXJzZShzLmZpbGVzLmdldCgnL2hvbWUvdS8uY2FjaGUvanNjLWFuaW1hL3JlcG8vY2hhcmFjdGVycy90cy9hb2kuanNvbicpISkudGltZWxpbmUubGVuZ3RoKS50b0JlKDEpXG5cbiAgYXdhaXQgcnVuKCQgYXMgbmV2ZXIsICdjaDIudHh0JylcbiAgY29uc3Qgc3VtbWFyeSA9IGF3YWl0IHJ1bigkIGFzIG5ldmVyLCAnY29uZmlybScpXG4gIGV4cGVjdChzdW1tYXJ5KS50b0NvbnRhaW4oJ+i/veWKoCcpXG4gIGV4cGVjdChzdW1tYXJ5KS50b0NvbnRhaW4oJ+W+heeiuuiqjScpXG4gIGF3YWl0IHJ1bigkIGFzIG5ldmVyLCAnY29uZmlybScpXG4gIGNvbnN0IHBhY2sgPSBKU09OLnBhcnNlKHMuZmlsZXMuZ2V0KCcvaG9tZS91Ly5jYWNoZS9qc2MtYW5pbWEvcmVwby9jaGFyYWN0ZXJzL3RzL2FvaS5qc29uJykhKVxuICBleHBlY3QocGFjay50aW1lbGluZS5tYXAoKHQ6IHsgY2hhcHRlcjogc3RyaW5nIH0pID0+IHQuY2hhcHRlcikpLnRvRXF1YWwoWydjaDEnLCAnY2gyJ10pXG4gIGV4cGVjdChwYWNrLnBlcnNvbmEudG9uZSkudG9CZSgn5rqr5p+UJylcbiAgZXhwZWN0KHBhY2suY29uZmxpY3RzWzBdKS50b01hdGNoT2JqZWN0KHsgZmllbGQ6ICdwZXJzb25hLnRvbmUnLCBwcm9wb3NlZDogJ+WCsuWsjCcsIHN0YXR1czogJ+W+heeiuuiqjScgfSlcbn0pXG5cbnRlc3QoJ3NjaGVtYSDpqZforYnlpLHmlZfkuI3lr6vmqpTjgIHkuI3lu7ogUFLvvJtjYW5jZWwg5riF6Zmk5b6F56K66KqNJywgYXN5bmMgKCQsIG9uKSA9PiB7XG4gIGNvbnN0IGJhZCA9IGNoYXIoeyBheGVzOiB7IGdlbnRsZTogOTksIHRzdW5kZXJlOiAyLCBsaXZlbHk6IDUsIGZvcm1hbDogNCwgdGFsa2F0aXZlOiA1LCBodW1vcjogMywgcHJvYWN0aXZlOiA2LCBleHByZXNzaXZlOiA1IH0gfSlcbiAgY29uc3QgcyA9IHNldHVwKG9uIGFzIG5ldmVyLCBbcmVwbHkoYmFkKV0sIG5ldyBNYXAoW1snL3JlcG8vY2gxLnR4dCcsICdhJ11dKSlcbiAgYXdhaXQgJC5zZXNzaW9uLnN0YXJ0KHsgc291cmNlOiAnc3RhcnR1cCcsIGN3ZDogJy9yZXBvJyB9IGFzIG5ldmVyKVxuICBhd2FpdCBydW4oJCBhcyBuZXZlciwgJ2NoMS50eHQnKVxuICBleHBlY3QoYXdhaXQgcnVuKCQgYXMgbmV2ZXIsICdjb25maXJtJykpLnRvQ29udGFpbignc2NoZW1hIOmpl+itieWkseaVlycpXG4gIGV4cGVjdChzLmNtZHMuc29tZShjID0+IGNbMF0gPT09ICd0ZWEnKSkudG9CZShmYWxzZSlcbiAgZXhwZWN0KFsuLi5zLmZpbGVzLmtleXMoKV0uc29tZShrID0+IGsuaW5jbHVkZXMoJ2NoYXJhY3RlcnMnKSkpLnRvQmUoZmFsc2UpXG4gIGV4cGVjdChhd2FpdCBydW4oJCBhcyBuZXZlciwgJ2NhbmNlbCcpKS50b0NvbnRhaW4oJ+W3suWPlua2iCcpXG59KVxuXG50ZXN0KCfosrzkuIrnq6Dnr4DlhaflrrnvvJpwYXN0ZSA856ug56+A5ZCN56ixPiDliqDkuIvkuIDooYzotbfnmoTlhaflrrnvvIzkuKblr6vlhaXoqp7oqIDmrITkvY3oiIcgaW5kZXguanNvbicsIGFzeW5jICgkLCBvbikgPT4ge1xuICBjb25zdCBzID0gc2V0dXAob24gYXMgbmV2ZXIsIFtyZXBseShjaGFyKHsgbGFuZ3VhZ2U6ICfnuYHpq5TkuK3mlofvvIzlsJHph4/ljp/kvZzlj6PnmZYnIH0pKV0pXG4gIGF3YWl0ICQuc2Vzc2lvbi5zdGFydCh7IHNvdXJjZTogJ3N0YXJ0dXAnLCBjd2Q6ICcvcmVwbycgfSBhcyBuZXZlcilcbiAgZXhwZWN0KGF3YWl0IHJ1bigkIGFzIG5ldmVyLCAncGFzdGUnKSkudG9Db250YWluKCfosrzkuIrnq6Dnr4DnmoTnlKjms5UnKVxuICBjb25zdCB0MSA9IGF3YWl0IHJ1bigkIGFzIG5ldmVyLCAncGFzdGUg56ys5LiA56ugXFxu6YCZ5piv6LK85LiK55qE56ug56+A5YWn5a6544CCJylcbiAgZXhwZWN0KHQxKS50b0NvbnRhaW4oJ2FvaScpXG4gIGV4cGVjdChzLnByb21wdHNbMF0pLnRvQ29udGFpbign6YCZ5piv6LK85LiK55qE56ug56+A5YWn5a6544CCJylcbiAgYXdhaXQgcnVuKCQgYXMgbmV2ZXIsICdjb25maXJtJylcbiAgYXdhaXQgcnVuKCQgYXMgbmV2ZXIsICdjb25maXJtJylcbiAgY29uc3QgcGFjayA9IEpTT04ucGFyc2Uocy5maWxlcy5nZXQoJy9ob21lL3UvLmNhY2hlL2pzYy1hbmltYS9yZXBvL2NoYXJhY3RlcnMvdHMvYW9pLmpzb24nKSEpXG4gIGV4cGVjdChwYWNrLnRpbWVsaW5lWzBdLmNoYXB0ZXIpLnRvQmUoJ+esrOS4gOeroCcpXG4gIGV4cGVjdChwYWNrLmxhbmd1YWdlKS50b0JlKCfnuYHpq5TkuK3mlofvvIzlsJHph4/ljp/kvZzlj6PnmZYnKVxuICBleHBlY3QoSlNPTi5wYXJzZShzLmZpbGVzLmdldCgnL2hvbWUvdS8uY2FjaGUvanNjLWFuaW1hL3JlcG8vY2hhcmFjdGVycy9pbmRleC5qc29uJykhKS5wYWNrc1swXSkudG9FcXVhbCh7IHdvcms6ICd0cycsIHdvcmtOYW1lOiAn5ris6Kmm54mp6KqeJywgc2x1ZzogJ2FvaScgfSlcbn0pXG5cbnRlc3QoJ+ashOS9jeWQq+mVt+auteW8leiZn+WFp+WuueimlueCuuaKhOmMhOWOn+S9nOWPsOipnu+8jOS4jeWvq+aqlCcsIGFzeW5jICgkLCBvbikgPT4ge1xuICBjb25zdCBxdW90ZWQgPSBjaGFyKHsgcGVyc29uYTogeyBzZWxmUmVmOiAn5oiRJywgYWRkcmVzczogJ+S9oCcsIHRvbmU6ICfjgIzpgJnmmK/kuIDmrrXlvojplbflvojplbfnmoTljp/kvZzlj7DoqZ7lhaflrrnvvIzkuI3mh4noqbLlh7rnj77lnKjop5LoibLljIXoo6HpnaLjgI0nLCBjYXRjaHBocmFzZTogJ+WKoOayuScsIHZhbHVlczogJ+iqoOWvpicsIHRhYm9vczogJ+iDjOWPmycgfSB9KVxuICBjb25zdCBzID0gc2V0dXAob24gYXMgbmV2ZXIsIFtyZXBseShxdW90ZWQpXSwgbmV3IE1hcChbWycvcmVwby9jaDEudHh0JywgJ2EnXV0pKVxuICBhd2FpdCAkLnNlc3Npb24uc3RhcnQoeyBzb3VyY2U6ICdzdGFydHVwJywgY3dkOiAnL3JlcG8nIH0gYXMgbmV2ZXIpXG4gIGF3YWl0IHJ1bigkIGFzIG5ldmVyLCAnY2gxLnR4dCcpXG4gIGV4cGVjdChhd2FpdCBydW4oJCBhcyBuZXZlciwgJ2NvbmZpcm0nKSkudG9Db250YWluKCfnlpHkvLzmioTpjITljp/kvZzlj7DoqZ4nKVxuICBleHBlY3QoWy4uLnMuZmlsZXMua2V5cygpXS5zb21lKGsgPT4gay5pbmNsdWRlcygnY2hhcmFjdGVycycpKSkudG9CZShmYWxzZSlcbn0pXG5cbnRlc3QoJ+WcqOmdniBqc2MtYW5pbWEg55uu6YyE5Z+36KGM77yaZ2l0IOiIhyBQUiDpg73otbAganNjLWFuaW1hIOeahOW/q+WPliBjbG9uZe+8jOS4jeeisCBzZXNzaW9uIOebrumMhCcsIGFzeW5jICgkLCBvbikgPT4ge1xuICBzZXNzaW9uQ3dkID0gJy9vdGhlci9wcm9qJ1xuICB0cnkge1xuICAgIGNvbnN0IHMgPSBzZXR1cChvbiBhcyBuZXZlciwgW3JlcGx5KGNoYXIoKSldLCBuZXcgTWFwKFtbJy9vdGhlci9wcm9qL2NoMS50eHQnLCAn56ys5LiA5q61J11dKSlcbiAgICBhd2FpdCAkLnNlc3Npb24uc3RhcnQoeyBzb3VyY2U6ICdzdGFydHVwJywgY3dkOiAnL290aGVyL3Byb2onIH0gYXMgbmV2ZXIpXG4gICAgYXdhaXQgcnVuKCQgYXMgbmV2ZXIsICcvb3RoZXIvcHJvai9jaDEudHh0JylcbiAgICBhd2FpdCBydW4oJCBhcyBuZXZlciwgJ2NvbmZpcm0nKVxuICAgIGV4cGVjdChhd2FpdCBydW4oJCBhcyBuZXZlciwgJ2NvbmZpcm0nKSkudG9Db250YWluKCflt7Llu7rnq4sgUFInKVxuICAgIGV4cGVjdChzLmNtZHMuc29tZShjID0+IGMuaW5jbHVkZXMoJ2ZldGNoJykpKS50b0JlKHRydWUpXG4gICAgY29uc3QgcHIgPSBzLmNtZHMuZmluZChjID0+IGNbMF0gPT09ICd0ZWEnICYmIGNbMV0gPT09ICdwdWxscycpIVxuICAgIGV4cGVjdChwcikudG9Db250YWluKCdqaWFudHc4My9qc2MtYW5pbWEnKVxuICAgIGV4cGVjdChzLmZpbGVzLmhhcygnL290aGVyL3Byb2ovY2hhcmFjdGVycy9pbmRleC5qc29uJykpLnRvQmUoZmFsc2UpXG4gICAgZXhwZWN0KEpTT04ucGFyc2Uocy5maWxlcy5nZXQoJy9ob21lL3UvLmNhY2hlL2pzYy1hbmltYS9yZXBvL2NoYXJhY3RlcnMvaW5kZXguanNvbicpISkucGFja3NbMF0uc2x1ZykudG9CZSgnYW9pJylcbiAgfSBmaW5hbGx5IHtcbiAgICBzZXNzaW9uQ3dkID0gJy9yZXBvJ1xuICB9XG59KVxuXG50ZXN0KCflv6vlj5YgY2xvbmUg5LiN5a2Y5Zyo5pmC5YWIIGNsb25lIGpzYy1hbmltYScsIGFzeW5jICgkLCBvbikgPT4ge1xuICBjbG9uZU1pc3NpbmcgPSB0cnVlXG4gIHRyeSB7XG4gICAgY29uc3QgcyA9IHNldHVwKG9uIGFzIG5ldmVyLCBbcmVwbHkoY2hhcigpKV0sIG5ldyBNYXAoW1snL3JlcG8vY2gxLnR4dCcsICdhJ11dKSlcbiAgICBhd2FpdCAkLnNlc3Npb24uc3RhcnQoeyBzb3VyY2U6ICdzdGFydHVwJywgY3dkOiAnL3JlcG8nIH0gYXMgbmV2ZXIpXG4gICAgYXdhaXQgcnVuKCQgYXMgbmV2ZXIsICdjaDEudHh0JylcbiAgICBjb25zdCBjbG9uZSA9IHMuY21kcy5maW5kKGMgPT4gYy5pbmNsdWRlcygnY2xvbmUnKSkhXG4gICAgZXhwZWN0KGNsb25lKS50b0NvbnRhaW4oJ2h0dHBzOi8vZ2l0ZWEuanNjLmlkdi50dy9qaWFudHc4My9qc2MtYW5pbWEuZ2l0JylcbiAgfSBmaW5hbGx5IHtcbiAgICBjbG9uZU1pc3NpbmcgPSBmYWxzZVxuICB9XG59KVxuXG50ZXN0KCdwYXN0Ze+8mkNSTEYg5o+b6KGM5Lmf6IO95YiG5Ye656ug56+A5ZCN56ix6IiH5YWn5a65JywgYXN5bmMgKCQsIG9uKSA9PiB7XG4gIGNvbnN0IHMgPSBzZXR1cChvbiBhcyBuZXZlciwgW3JlcGx5KGNoYXIoKSldKVxuICBhd2FpdCAkLnNlc3Npb24uc3RhcnQoeyBzb3VyY2U6ICdzdGFydHVwJywgY3dkOiAnL3JlcG8nIH0gYXMgbmV2ZXIpXG4gIGF3YWl0IHJ1bigkIGFzIG5ldmVyLCAncGFzdGUg56ys5LqM56ugXFxyXFxu56ys5LiA6KGMXFxyXFxu56ys5LqM6KGMJylcbiAgZXhwZWN0KHMucHJvbXB0c1swXSkudG9Db250YWluKCfnrKzkuIDooYwnKVxufSlcblxudGVzdCgn5ZCI5L215Lim5pu05paw5aSW5o6b5b6M77ya5ZWf5YuV5pmC5b6e5aSW5o6b55uu6YyE55qEIGluZGV4Lmpzb24g6Ki75YaKIHvkvZzlk4Hku6PomZ99LXvop5LoibLku6PomZ99IOS4puWPr+WVn+WLlScsIGFzeW5jICgkLCBvbikgPT4ge1xuICBjb25zdCBzID0gc2V0dXAob24gYXMgbmV2ZXIsIFtyZXBseShjaGFyKCkpXSwgbmV3IE1hcChbWycvcmVwby9jaDEudHh0JywgJ2EnXV0pKVxuICByZWdpc3RlcmVkID0gW11cbiAgYXdhaXQgJC5zZXNzaW9uLnN0YXJ0KHsgc291cmNlOiAnc3RhcnR1cCcsIGN3ZDogJy9yZXBvJyB9IGFzIG5ldmVyKVxuICBhd2FpdCBydW4oJCBhcyBuZXZlciwgJ2NoMS50eHQnKVxuICBhd2FpdCBydW4oJCBhcyBuZXZlciwgJ2NvbmZpcm0nKVxuICBhd2FpdCBydW4oJCBhcyBuZXZlciwgJ2NvbmZpcm0nKVxuICAvLyDmqKHmk6wgUFIg5ZCI5L2144CB5aSW5o6b5pu05paw77yaY2xvbmUg5YWn55qEIGNoYXJhY3RlcnMvIOWFp+WuueWHuuePvuWcqOWkluaOm+ebrumMhOOAglxuICBjb25zdCByb290ID0gKFsuLi5wcm9iZWRdLmZpbmQocSA9PiAhcS5zdGFydHNXaXRoKCcvaG9tZS91LycpKSA/PyAnJykucmVwbGFjZSgnL2NoYXJhY3RlcnMvaW5kZXguanNvbicsICcnKVxuICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBbLi4ucy5maWxlc10pIGlmIChrLnN0YXJ0c1dpdGgoJy9ob21lL3UvLmNhY2hlL2pzYy1hbmltYS9yZXBvL2NoYXJhY3RlcnMvJykpIHMuZmlsZXMuc2V0KGsucmVwbGFjZSgnL2hvbWUvdS8uY2FjaGUvanNjLWFuaW1hL3JlcG8nLCByb290KSwgdilcbiAgYXdhaXQgJC5zZXNzaW9uLnN0YXJ0KHsgc291cmNlOiAnc3RhcnR1cCcsIGN3ZDogJy9hbnl3aGVyZScgfSBhcyBuZXZlcilcbiAgZXhwZWN0KHJlZ2lzdGVyZWQpLnRvQ29udGFpbigndHMtYW9pJylcbn0pXG4iXSwiZmlsZSI6Ii9ob29rcy9leHRyYWN0LnRlc3QudHMifQ==
//# vitestCache=W3siZmlsZSI6IjEiLCJpZCI6IjEiLCJ1cmwiOiIyIiwiaW1wb3J0cyI6IjMiLCJtYXBwaW5ncyI6ZmFsc2UsImRlcHMiOiI0IiwiZHluYW1pY0RlcHMiOiI1Iiwic3RhdGljTW9ja3MiOm51bGx9LCIvcm9vdC9qc2MtYW5pbWEvaG9va3MvZXh0cmFjdC50ZXN0LnRzIiwiL2hvb2tzL2V4dHJhY3QudGVzdC50cyIseyJ1cmxzIjoiNiIsImlkcyI6IjcifSxbIjgiXSxbXSxbIjgiXSx7fSwiY2xhdWRlLWNvZGUvdGVzdGluZyJd