slopmeter 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +74 -61
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -5099,8 +5099,10 @@ var svgBuilder = {
|
|
|
5099
5099
|
var esm_default = svgBuilder;
|
|
5100
5100
|
|
|
5101
5101
|
// src/lib/utils.ts
|
|
5102
|
-
import {
|
|
5102
|
+
import { createReadStream } from "fs";
|
|
5103
|
+
import { readdir } from "fs/promises";
|
|
5103
5104
|
import { join } from "path";
|
|
5105
|
+
import { createInterface } from "readline";
|
|
5104
5106
|
function formatLocalDate(date) {
|
|
5105
5107
|
const y = date.getFullYear();
|
|
5106
5108
|
const m = String(date.getMonth() + 1).padStart(2, "0");
|
|
@@ -5192,9 +5194,22 @@ async function listFilesRecursive(rootDir, extension) {
|
|
|
5192
5194
|
}
|
|
5193
5195
|
return files;
|
|
5194
5196
|
}
|
|
5195
|
-
async function
|
|
5196
|
-
const
|
|
5197
|
-
|
|
5197
|
+
async function forEachJsonLine(filePath, onLine) {
|
|
5198
|
+
const readline = createInterface({
|
|
5199
|
+
input: createReadStream(filePath, { encoding: "utf8" }),
|
|
5200
|
+
crlfDelay: Number.POSITIVE_INFINITY
|
|
5201
|
+
});
|
|
5202
|
+
try {
|
|
5203
|
+
for await (const line of readline) {
|
|
5204
|
+
const trimmed = line.trim();
|
|
5205
|
+
if (trimmed === "") {
|
|
5206
|
+
continue;
|
|
5207
|
+
}
|
|
5208
|
+
await onLine(JSON.parse(trimmed));
|
|
5209
|
+
}
|
|
5210
|
+
} finally {
|
|
5211
|
+
readline.close();
|
|
5212
|
+
}
|
|
5198
5213
|
}
|
|
5199
5214
|
function getRecentWindowStart(endDate, days = 30) {
|
|
5200
5215
|
const start = new Date(endDate);
|
|
@@ -5932,23 +5947,12 @@ function createClaudeTokenTotals(usage) {
|
|
|
5932
5947
|
total: input + output
|
|
5933
5948
|
};
|
|
5934
5949
|
}
|
|
5935
|
-
async function
|
|
5936
|
-
const entries = [];
|
|
5937
|
-
const lines = await readJsonLines(filePath);
|
|
5938
|
-
for (const line of lines) {
|
|
5939
|
-
const parsed = parseClaudeLogEntry(line);
|
|
5940
|
-
if (parsed) {
|
|
5941
|
-
entries.push(parsed);
|
|
5942
|
-
}
|
|
5943
|
-
}
|
|
5944
|
-
return entries;
|
|
5945
|
-
}
|
|
5946
|
-
async function parseClaudeFiles() {
|
|
5950
|
+
async function getClaudeFiles() {
|
|
5947
5951
|
const projectDirs = getClaudeProjectDirs();
|
|
5948
5952
|
const files = (await Promise.all(
|
|
5949
5953
|
projectDirs.map((projectDir) => listFilesRecursive(projectDir, ".jsonl"))
|
|
5950
5954
|
)).flat();
|
|
5951
|
-
return
|
|
5955
|
+
return files;
|
|
5952
5956
|
}
|
|
5953
5957
|
function createUniqueHash(messageId, requestId) {
|
|
5954
5958
|
if (!messageId || !requestId) {
|
|
@@ -5957,39 +5961,43 @@ function createUniqueHash(messageId, requestId) {
|
|
|
5957
5961
|
return `${messageId}:${requestId}`;
|
|
5958
5962
|
}
|
|
5959
5963
|
async function loadClaudeRows(startDate, endDate) {
|
|
5960
|
-
const
|
|
5964
|
+
const files = await getClaudeFiles();
|
|
5961
5965
|
const totals = /* @__PURE__ */ new Map();
|
|
5962
5966
|
const modelTotals = /* @__PURE__ */ new Map();
|
|
5963
5967
|
const recentModelTotals = /* @__PURE__ */ new Map();
|
|
5964
5968
|
const recentStart = getRecentWindowStart(endDate, 30);
|
|
5965
5969
|
const processedHashes = /* @__PURE__ */ new Set();
|
|
5966
|
-
for (const
|
|
5967
|
-
|
|
5970
|
+
for (const file of files) {
|
|
5971
|
+
await forEachJsonLine(file, async (line) => {
|
|
5972
|
+
const entry = parseClaudeLogEntry(line);
|
|
5973
|
+
if (!entry) {
|
|
5974
|
+
return;
|
|
5975
|
+
}
|
|
5968
5976
|
const uniqueHash = createUniqueHash(entry.messageId, entry.requestId);
|
|
5969
5977
|
if (uniqueHash && processedHashes.has(uniqueHash)) {
|
|
5970
|
-
|
|
5978
|
+
return;
|
|
5971
5979
|
}
|
|
5972
5980
|
if (uniqueHash) {
|
|
5973
5981
|
processedHashes.add(uniqueHash);
|
|
5974
5982
|
}
|
|
5975
5983
|
const timestamp = new Date(entry.timestamp);
|
|
5976
5984
|
if (timestamp < startDate || timestamp > endDate) {
|
|
5977
|
-
|
|
5985
|
+
return;
|
|
5978
5986
|
}
|
|
5979
5987
|
const tokenTotals = createClaudeTokenTotals(entry.usage);
|
|
5980
5988
|
if (tokenTotals.total <= 0) {
|
|
5981
|
-
|
|
5989
|
+
return;
|
|
5982
5990
|
}
|
|
5983
5991
|
const modelName = entry.model && entry.model !== "<synthetic>" ? normalizeModelName(entry.model) : void 0;
|
|
5984
5992
|
addDailyTokenTotals(totals, timestamp, tokenTotals, modelName);
|
|
5985
5993
|
if (!modelName) {
|
|
5986
|
-
|
|
5994
|
+
return;
|
|
5987
5995
|
}
|
|
5988
5996
|
addModelTokenTotals(modelTotals, modelName, tokenTotals);
|
|
5989
5997
|
if (timestamp >= recentStart) {
|
|
5990
5998
|
addModelTokenTotals(recentModelTotals, modelName, tokenTotals);
|
|
5991
5999
|
}
|
|
5992
|
-
}
|
|
6000
|
+
});
|
|
5993
6001
|
}
|
|
5994
6002
|
return createUsageSummary(
|
|
5995
6003
|
"claude",
|
|
@@ -6070,32 +6078,29 @@ function extractCodexModel(payload) {
|
|
|
6070
6078
|
}
|
|
6071
6079
|
return void 0;
|
|
6072
6080
|
}
|
|
6073
|
-
async function
|
|
6074
|
-
return readJsonLines(filePath);
|
|
6075
|
-
}
|
|
6076
|
-
async function parseCodexFiles() {
|
|
6081
|
+
async function getCodexFiles() {
|
|
6077
6082
|
const codexHome = process.env.CODEX_HOME?.trim() ? resolve2(process.env.CODEX_HOME) : join3(homedir2(), ".codex");
|
|
6078
6083
|
const sessionsDir = join3(codexHome, "sessions");
|
|
6079
6084
|
const files = await listFilesRecursive(sessionsDir, ".jsonl");
|
|
6080
|
-
return
|
|
6085
|
+
return files;
|
|
6081
6086
|
}
|
|
6082
6087
|
async function loadCodexRows(start, end) {
|
|
6083
|
-
const
|
|
6088
|
+
const files = await getCodexFiles();
|
|
6084
6089
|
const totals = /* @__PURE__ */ new Map();
|
|
6085
6090
|
const recentStart = getRecentWindowStart(end, 30);
|
|
6086
6091
|
const modelTotals = /* @__PURE__ */ new Map();
|
|
6087
6092
|
const recentModelTotals = /* @__PURE__ */ new Map();
|
|
6088
|
-
for (const
|
|
6093
|
+
for (const file of files) {
|
|
6089
6094
|
let previousTotals = null;
|
|
6090
6095
|
let currentModel;
|
|
6091
|
-
|
|
6096
|
+
await forEachJsonLine(file, async (entry) => {
|
|
6092
6097
|
const extractedModel = extractCodexModel(entry.payload);
|
|
6093
6098
|
if (entry.type === "turn_context") {
|
|
6094
6099
|
currentModel = extractedModel ?? currentModel;
|
|
6095
|
-
|
|
6100
|
+
return;
|
|
6096
6101
|
}
|
|
6097
6102
|
if (entry.type !== "event_msg" || entry.payload?.type !== "token_count") {
|
|
6098
|
-
|
|
6103
|
+
return;
|
|
6099
6104
|
}
|
|
6100
6105
|
const info = entry.payload.info;
|
|
6101
6106
|
const lastUsage = normalizeCodexUsage(info?.last_token_usage);
|
|
@@ -6108,7 +6113,7 @@ async function loadCodexRows(start, end) {
|
|
|
6108
6113
|
previousTotals = totalUsage;
|
|
6109
6114
|
}
|
|
6110
6115
|
if (!rawUsage) {
|
|
6111
|
-
|
|
6116
|
+
return;
|
|
6112
6117
|
}
|
|
6113
6118
|
const usage = {
|
|
6114
6119
|
input: rawUsage.input_tokens,
|
|
@@ -6117,11 +6122,11 @@ async function loadCodexRows(start, end) {
|
|
|
6117
6122
|
total: rawUsage.total_tokens
|
|
6118
6123
|
};
|
|
6119
6124
|
if (usage.total <= 0) {
|
|
6120
|
-
|
|
6125
|
+
return;
|
|
6121
6126
|
}
|
|
6122
6127
|
const date = new Date(entry.timestamp);
|
|
6123
6128
|
if (date < start || date > end) {
|
|
6124
|
-
|
|
6129
|
+
return;
|
|
6125
6130
|
}
|
|
6126
6131
|
const modelName = extractedModel ?? currentModel;
|
|
6127
6132
|
const normalizedModelName = modelName ? normalizeModelName(modelName) : void 0;
|
|
@@ -6132,7 +6137,7 @@ async function loadCodexRows(start, end) {
|
|
|
6132
6137
|
addModelTokenTotals(recentModelTotals, normalizedModelName, usage);
|
|
6133
6138
|
}
|
|
6134
6139
|
}
|
|
6135
|
-
}
|
|
6140
|
+
});
|
|
6136
6141
|
}
|
|
6137
6142
|
return createUsageSummary("codex", totals, modelTotals, recentModelTotals, end);
|
|
6138
6143
|
}
|
|
@@ -6146,7 +6151,7 @@ var providerStatusLabel = {
|
|
|
6146
6151
|
};
|
|
6147
6152
|
|
|
6148
6153
|
// src/lib/open-code.ts
|
|
6149
|
-
import { readFile
|
|
6154
|
+
import { readFile } from "fs/promises";
|
|
6150
6155
|
import { homedir as homedir3 } from "os";
|
|
6151
6156
|
import { join as join4, resolve as resolve3 } from "path";
|
|
6152
6157
|
function sumOpenCodeTokens(tokens) {
|
|
@@ -6162,23 +6167,23 @@ function sumOpenCodeTokens(tokens) {
|
|
|
6162
6167
|
};
|
|
6163
6168
|
}
|
|
6164
6169
|
async function parseOpenCodeFile(filePath) {
|
|
6165
|
-
const content = await
|
|
6170
|
+
const content = await readFile(filePath, "utf8");
|
|
6166
6171
|
return JSON.parse(content);
|
|
6167
6172
|
}
|
|
6168
|
-
async function
|
|
6173
|
+
async function getOpenCodeFiles() {
|
|
6169
6174
|
const baseDir = process.env.OPENCODE_DATA_DIR?.trim() ? resolve3(process.env.OPENCODE_DATA_DIR) : join4(homedir3(), ".local", "share", "opencode");
|
|
6170
6175
|
const messagesDir = join4(baseDir, "storage", "message");
|
|
6171
|
-
|
|
6172
|
-
return Promise.all(files.map((file) => parseOpenCodeFile(file)));
|
|
6176
|
+
return listFilesRecursive(messagesDir, ".json");
|
|
6173
6177
|
}
|
|
6174
6178
|
async function loadOpenCodeRows(start, end) {
|
|
6175
|
-
const
|
|
6179
|
+
const files = await getOpenCodeFiles();
|
|
6176
6180
|
const totals = /* @__PURE__ */ new Map();
|
|
6177
6181
|
const dedupe = /* @__PURE__ */ new Set();
|
|
6178
6182
|
const recentStart = getRecentWindowStart(end, 30);
|
|
6179
6183
|
const modelTotals = /* @__PURE__ */ new Map();
|
|
6180
6184
|
const recentModelTotals = /* @__PURE__ */ new Map();
|
|
6181
|
-
for (const
|
|
6185
|
+
for (const file of files) {
|
|
6186
|
+
const message = await parseOpenCodeFile(file);
|
|
6182
6187
|
if (dedupe.has(message.id)) {
|
|
6183
6188
|
continue;
|
|
6184
6189
|
}
|
|
@@ -6210,18 +6215,20 @@ async function loadOpenCodeRows(start, end) {
|
|
|
6210
6215
|
// src/providers.ts
|
|
6211
6216
|
async function aggregateUsage({
|
|
6212
6217
|
start,
|
|
6213
|
-
end
|
|
6218
|
+
end,
|
|
6219
|
+
providers
|
|
6214
6220
|
}) {
|
|
6215
|
-
const
|
|
6216
|
-
|
|
6217
|
-
|
|
6218
|
-
|
|
6219
|
-
|
|
6220
|
-
return {
|
|
6221
|
-
claude: hasUsage(claude) ? claude : null,
|
|
6222
|
-
codex: hasUsage(codex) ? codex : null,
|
|
6223
|
-
opencode: hasUsage(opencode) ? opencode : null
|
|
6221
|
+
const requestedProviders = providers?.length ? providers : providerIds;
|
|
6222
|
+
const rowsByProvider = {
|
|
6223
|
+
claude: null,
|
|
6224
|
+
codex: null,
|
|
6225
|
+
opencode: null
|
|
6224
6226
|
};
|
|
6227
|
+
for (const provider of requestedProviders) {
|
|
6228
|
+
const summary = provider === "claude" ? await loadClaudeRows(start, end) : provider === "codex" ? await loadCodexRows(start, end) : await loadOpenCodeRows(start, end);
|
|
6229
|
+
rowsByProvider[provider] = hasUsage(summary) ? summary : null;
|
|
6230
|
+
}
|
|
6231
|
+
return rowsByProvider;
|
|
6225
6232
|
}
|
|
6226
6233
|
|
|
6227
6234
|
// src/cli.ts
|
|
@@ -6312,8 +6319,8 @@ function getDateWindow() {
|
|
|
6312
6319
|
end.setHours(23, 59, 59, 999);
|
|
6313
6320
|
return { start, end };
|
|
6314
6321
|
}
|
|
6315
|
-
function printProviderAvailability(rowsByProvider) {
|
|
6316
|
-
for (const provider of
|
|
6322
|
+
function printProviderAvailability(rowsByProvider, providers) {
|
|
6323
|
+
for (const provider of providers) {
|
|
6317
6324
|
const found = rowsByProvider[provider] ? "found" : "not found";
|
|
6318
6325
|
process.stdout.write(`${providerStatusLabel[provider]} ${found}
|
|
6319
6326
|
`);
|
|
@@ -6382,12 +6389,18 @@ async function main() {
|
|
|
6382
6389
|
const { start, end } = getDateWindow();
|
|
6383
6390
|
const colorMode = values.dark ? "dark" : "light";
|
|
6384
6391
|
const format = inferFormat(values.format, values.output);
|
|
6385
|
-
const
|
|
6392
|
+
const requestedProviders = getRequestedProviders(values);
|
|
6393
|
+
const inspectedProviders = requestedProviders.length > 0 ? requestedProviders : providerIds;
|
|
6394
|
+
const rowsByProvider = await aggregateUsage({
|
|
6395
|
+
start,
|
|
6396
|
+
end,
|
|
6397
|
+
providers: inspectedProviders
|
|
6398
|
+
});
|
|
6386
6399
|
spinner.stop();
|
|
6387
|
-
printProviderAvailability(rowsByProvider);
|
|
6400
|
+
printProviderAvailability(rowsByProvider, inspectedProviders);
|
|
6388
6401
|
const exportProviders = selectProvidersToRender(
|
|
6389
6402
|
rowsByProvider,
|
|
6390
|
-
|
|
6403
|
+
requestedProviders
|
|
6391
6404
|
);
|
|
6392
6405
|
const outputPath = resolve4(
|
|
6393
6406
|
values.output ?? `./heatmap-last-year.${format}`
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/content/index.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/attributes/index.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/elements/element.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/elements/definitions.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/elements/index.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/index.ts","../src/lib/utils.ts","../src/graph.ts","../src/lib/claude-code.ts","../src/lib/codex.ts","../src/lib/interfaces.ts","../src/lib/open-code.ts","../src/providers.ts"],"sourcesContent":["import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, extname, resolve } from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport ora, { type Ora } from \"ora\";\nimport ow from \"ow\";\nimport sharp from \"sharp\";\nimport { heatmapThemes, renderUsageHeatmapsSvg, type ColorMode } from \"./graph\";\nimport type {\n JsonExportPayload,\n JsonUsageSummary,\n UsageSummary,\n} from \"./interfaces\";\nimport type { ProviderId } from \"./providers\";\nimport { formatLocalDate } from \"./lib/utils\";\nimport { aggregateUsage, providerIds, providerStatusLabel } from \"./providers\";\n\ntype OutputFormat = \"png\" | \"svg\" | \"json\";\ninterface CliArgValues {\n output?: string;\n format?: string;\n help: boolean;\n dark: boolean;\n claude: boolean;\n codex: boolean;\n opencode: boolean;\n}\n\nconst PNG_BASE_WIDTH = 1000;\nconst PNG_SCALE = 4;\nconst PNG_RENDER_WIDTH = PNG_BASE_WIDTH * PNG_SCALE;\nconst JSON_EXPORT_VERSION = \"2026-03-03\";\n\nconst HELP_TEXT = `slopmeter\n\nGenerate rolling 1-year usage heatmap image(s) (today is the latest day).\n\nUsage:\n slopmeter [--claude] [--codex] [--opencode] [--dark] [--format png|svg|json] [--output ./heatmap-last-year.png]\n\nOptions:\n --claude Render Claude Code graph\n --codex Render Codex graph\n --opencode Render Open Code graph\n --dark Render with the dark theme\n -f, --format Output format: png, svg, or json (default: png)\n -o, --output Output file path (default: ./heatmap-last-year.png)\n -h, --help Show this help\n`;\n\nfunction printHelp() {\n process.stdout.write(HELP_TEXT);\n}\n\nfunction validateArgs(values: unknown): asserts values is CliArgValues {\n ow(\n values,\n ow.object.exactShape({\n output: ow.optional.string.nonEmpty,\n format: ow.optional.string.nonEmpty,\n help: ow.boolean,\n dark: ow.boolean,\n claude: ow.boolean,\n codex: ow.boolean,\n opencode: ow.boolean,\n }),\n );\n}\n\nfunction inferFormat(\n formatArg: string | undefined,\n outputArg: string | undefined,\n) {\n if (formatArg) {\n ow(formatArg, ow.string.oneOf([\"png\", \"svg\", \"json\"] as const));\n\n return formatArg;\n }\n\n if (outputArg) {\n const outputExtension = extname(outputArg).toLowerCase();\n\n if (outputExtension === \".svg\") {\n return \"svg\" as const;\n }\n\n if (outputExtension === \".json\") {\n return \"json\" as const;\n }\n }\n\n return \"png\" as const;\n}\n\nasync function writeOutputImage(\n outputPath: string,\n format: Exclude<OutputFormat, \"json\">,\n svg: string,\n background: string,\n) {\n if (format === \"svg\") {\n writeFileSync(outputPath, svg, \"utf8\");\n\n return;\n }\n\n const pngBuffer = await sharp(Buffer.from(svg), { density: 192 })\n .resize({ width: PNG_RENDER_WIDTH })\n .flatten({ background })\n .png()\n .toBuffer();\n\n writeFileSync(outputPath, pngBuffer);\n}\n\nfunction writeOutputJson(outputPath: string, payload: JsonExportPayload) {\n writeFileSync(outputPath, `${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n}\n\nfunction toJsonUsageSummary(summary: UsageSummary): JsonUsageSummary {\n return {\n provider: summary.provider,\n insights: summary.insights,\n daily: summary.daily.map((row) => ({\n date: formatLocalDate(row.date),\n input: row.input,\n output: row.output,\n cache: row.cache,\n total: row.total,\n breakdown: row.breakdown,\n })),\n };\n}\n\nfunction getDateWindow() {\n const start = new Date();\n start.setHours(0, 0, 0, 0);\n start.setFullYear(start.getFullYear() - 1);\n\n const end = new Date();\n end.setHours(23, 59, 59, 999);\n\n return { start, end };\n}\n\nfunction printProviderAvailability(\n rowsByProvider: Record<ProviderId, UsageSummary | null>,\n) {\n for (const provider of providerIds) {\n const found = rowsByProvider[provider] ? \"found\" : \"not found\";\n\n process.stdout.write(`${providerStatusLabel[provider]} ${found}\\n`);\n }\n}\n\nfunction getRequestedProviders(values: CliArgValues) {\n return providerIds.filter((id) => values[id]);\n}\n\nfunction selectProvidersToRender(\n rowsByProvider: Record<ProviderId, UsageSummary | null>,\n requested: ProviderId[],\n) {\n const providersToRender =\n requested.length > 0\n ? requested.filter((provider) => rowsByProvider[provider])\n : providerIds.filter((provider) => rowsByProvider[provider]);\n\n if (requested.length > 0 && providersToRender.length < requested.length) {\n const missing = requested.filter((provider) => !rowsByProvider[provider]);\n\n throw new Error(\n `Requested provider data not found: ${missing.map((provider) => providerStatusLabel[provider]).join(\", \")}`,\n );\n }\n\n if (providersToRender.length === 0) {\n throw new Error(\n \"No usage data found for Claude code, Codex, or Open code.\",\n );\n }\n\n return providersToRender.map((provider) => rowsByProvider[provider]!);\n}\n\nfunction printRunSummary(\n outputPath: string,\n format: OutputFormat,\n colorMode: ColorMode,\n startDate: Date,\n endDate: Date,\n rendered: ProviderId[],\n) {\n process.stdout.write(\n `${JSON.stringify(\n {\n output: outputPath,\n format,\n colorMode,\n startDate: formatLocalDate(startDate),\n endDate: formatLocalDate(endDate),\n rendered,\n },\n null,\n 2,\n )}\\n`,\n );\n}\n\nasync function main() {\n let spinner: Ora | undefined;\n\n const parsed = parseArgs({\n options: {\n output: { type: \"string\", short: \"o\" },\n format: { type: \"string\", short: \"f\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n dark: { type: \"boolean\", default: false },\n claude: { type: \"boolean\", default: false },\n codex: { type: \"boolean\", default: false },\n opencode: { type: \"boolean\", default: false },\n },\n allowPositionals: false,\n });\n\n validateArgs(parsed.values);\n\n const { values } = parsed;\n\n if (values.help) {\n printHelp();\n\n return;\n }\n\n try {\n spinner = ora({\n text: \"Analyzing usage data...\",\n spinner: \"dots\",\n }).start();\n\n const { start, end } = getDateWindow();\n const colorMode: ColorMode = values.dark ? \"dark\" : \"light\";\n const format = inferFormat(values.format, values.output);\n const rowsByProvider = await aggregateUsage({ start, end });\n\n spinner.stop();\n printProviderAvailability(rowsByProvider);\n\n const exportProviders = selectProvidersToRender(\n rowsByProvider,\n getRequestedProviders(values),\n );\n\n const outputPath = resolve(\n values.output ?? `./heatmap-last-year.${format}`,\n );\n\n mkdirSync(dirname(outputPath), { recursive: true });\n\n if (format === \"json\") {\n spinner.start(\"Preparing JSON export...\");\n\n const payload: JsonExportPayload = {\n version: JSON_EXPORT_VERSION,\n start: formatLocalDate(start),\n end: formatLocalDate(end),\n providers: exportProviders.map((provider) =>\n toJsonUsageSummary(provider),\n ),\n };\n\n spinner.text = \"Writing output file...\";\n writeOutputJson(outputPath, payload);\n } else {\n spinner.start(\"Rendering heatmaps...\");\n\n const svg = renderUsageHeatmapsSvg({\n startDate: start,\n endDate: end,\n colorMode,\n sections: exportProviders.map(({ provider, daily, insights }) => ({\n daily,\n insights,\n title: heatmapThemes[provider].title,\n colors: heatmapThemes[provider].colors,\n })),\n });\n const background = colorMode === \"dark\" ? \"#171717\" : \"#ffffff\";\n\n spinner.text = \"Writing output file...\";\n await writeOutputImage(outputPath, format, svg, background);\n }\n\n spinner.succeed(\"Analysis complete\");\n\n printRunSummary(\n outputPath,\n format,\n colorMode,\n start,\n end,\n exportProviders.map(({ provider }) => provider),\n );\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (spinner) {\n spinner.fail(`Failed: ${message}`);\n } else {\n process.stderr.write(`${message}\\n`);\n }\n\n process.exitCode = 1;\n }\n}\n\nvoid main();\n",null,null,null,null,null,null,"import { readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { DailyUsage, Insights, ModelUsage, UsageSummary } from \"../interfaces\";\n\nexport function formatLocalDate(date: Date) {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, \"0\");\n const d = String(date.getDate()).padStart(2, \"0\");\n\n return `${y}-${m}-${d}`;\n}\n\nexport interface DailyTokenTotals {\n input: number;\n output: number;\n cache: { input: number; output: number };\n total: number;\n}\n\nexport interface ModelTokenTotals {\n input: number;\n output: number;\n cache: { input: number; output: number };\n total: number;\n}\n\ninterface TokenTotals {\n tokens: DailyTokenTotals;\n models: Map<string, ModelTokenTotals>;\n}\n\nexport type DailyTotalsByDate = Map<string, TokenTotals>;\n\nconst ONE_DAY_MS = 24 * 60 * 60 * 1000;\n\nfunction cloneTokenTotals(\n totals: DailyTokenTotals | ModelTokenTotals,\n): ModelTokenTotals {\n return {\n input: totals.input,\n output: totals.output,\n cache: { input: totals.cache.input, output: totals.cache.output },\n total: totals.total,\n };\n}\n\nfunction mergeTokenTotals(\n target: DailyTokenTotals | ModelTokenTotals,\n source: DailyTokenTotals | ModelTokenTotals,\n) {\n target.input += source.input;\n target.output += source.output;\n target.cache.input += source.cache.input;\n target.cache.output += source.cache.output;\n target.total += source.total;\n}\n\nexport function addModelTokenTotals(\n modelTotals: Map<string, ModelTokenTotals>,\n modelName: string,\n tokenTotals: DailyTokenTotals | ModelTokenTotals,\n) {\n const existing = modelTotals.get(modelName);\n\n if (!existing) {\n modelTotals.set(modelName, cloneTokenTotals(tokenTotals));\n\n return;\n }\n\n mergeTokenTotals(existing, tokenTotals);\n}\n\nexport function addDailyTokenTotals(\n totals: DailyTotalsByDate,\n date: Date,\n tokenTotals: DailyTokenTotals,\n modelName?: string,\n) {\n const key = formatLocalDate(date);\n const existing = totals.get(key);\n\n if (!existing) {\n const models = new Map<string, ModelTokenTotals>();\n\n if (modelName) {\n models.set(modelName, cloneTokenTotals(tokenTotals));\n }\n totals.set(key, { tokens: cloneTokenTotals(tokenTotals), models });\n\n return;\n }\n\n mergeTokenTotals(existing.tokens, tokenTotals);\n\n if (modelName) {\n addModelTokenTotals(existing.models, modelName, tokenTotals);\n }\n}\n\nexport function totalsToRows(totals: DailyTotalsByDate): DailyUsage[] {\n return [...totals.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([date, { tokens, models }]) => ({\n date: new Date(`${date}T00:00:00`),\n input: tokens.input,\n output: tokens.output,\n cache: { input: tokens.cache.input, output: tokens.cache.output },\n total: tokens.total,\n breakdown: [...models.entries()]\n .sort(([, a], [, b]) => b.total - a.total)\n .map(([name, t]) => ({\n name,\n tokens: {\n input: t.input,\n output: t.output,\n cache: { input: t.cache.input, output: t.cache.output },\n total: t.total,\n },\n })),\n }));\n}\n\nexport async function listFilesRecursive(rootDir: string, extension: string) {\n const files: string[] = [];\n const stack = [rootDir];\n\n while (stack.length > 0) {\n const currentDir = stack.pop()!;\n\n let entries;\n\n try {\n entries = await readdir(currentDir, {\n withFileTypes: true,\n encoding: \"utf8\",\n });\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n const fullPath = join(currentDir, entry.name);\n\n if (entry.isDirectory()) {\n stack.push(fullPath);\n continue;\n }\n\n if (entry.isFile() && fullPath.endsWith(extension)) {\n files.push(fullPath);\n }\n }\n }\n\n return files;\n}\n\nexport async function readJsonLines<T>(filePath: string): Promise<T[]> {\n const content = await readFile(filePath, \"utf8\");\n\n return content\n .split(/\\r?\\n/)\n .filter((line) => line.trim() !== \"\")\n .map((line) => JSON.parse(line.trim()) as T);\n}\n\nexport function getRecentWindowStart(endDate: Date, days = 30) {\n const start = new Date(endDate);\n\n start.setDate(start.getDate() - (days - 1));\n start.setHours(0, 0, 0, 0);\n\n return start;\n}\n\nexport function normalizeModelName(modelName: string) {\n return modelName.replace(/-\\d{8}$/, \"\");\n}\n\nexport function getTopModel(\n modelTotals: Map<string, ModelTokenTotals>,\n): ModelUsage | undefined {\n let bestModel: string | undefined;\n let bestTotals: ModelTokenTotals | undefined;\n\n for (const [modelName, totals] of modelTotals) {\n if (!bestTotals || totals.total > bestTotals.total) {\n bestModel = modelName;\n bestTotals = totals;\n }\n }\n\n if (!bestTotals || bestTotals.total <= 0) {\n return undefined;\n }\n\n return {\n name: bestModel!,\n tokens: {\n input: bestTotals.input,\n output: bestTotals.output,\n cache: { input: bestTotals.cache.input, output: bestTotals.cache.output },\n total: bestTotals.total,\n },\n };\n}\n\nfunction startOfDay(date: Date) {\n const day = new Date(date);\n\n day.setHours(0, 0, 0, 0);\n\n return day;\n}\n\nfunction isConsecutiveDay(prevDate: Date, currDate: Date): boolean {\n const prev = startOfDay(prevDate);\n const curr = startOfDay(currDate);\n const diff = curr.getTime() - prev.getTime();\n\n return diff === ONE_DAY_MS;\n}\n\nexport function computeLongestStreak(daily: DailyUsage[]): number {\n if (daily.length === 0) {\n return 0;\n }\n\n let longest = 1;\n let running = 1;\n\n for (let i = 1; i < daily.length; i += 1) {\n if (isConsecutiveDay(daily[i - 1].date, daily[i].date)) {\n running += 1;\n if (running > longest) {\n longest = running;\n }\n } else {\n running = 1;\n }\n }\n\n return longest;\n}\n\nexport function computeCurrentStreak(daily: DailyUsage[], end: Date): number {\n if (daily.length === 0) {\n return 0;\n }\n\n const endDay = startOfDay(end);\n const lastEntry = daily[daily.length - 1];\n const lastEntryDay = startOfDay(lastEntry.date);\n\n // If the last active day isn't the end date, check if it's consecutive\n if (\n lastEntryDay.getTime() !== endDay.getTime() &&\n !isConsecutiveDay(lastEntryDay, endDay)\n ) {\n return 0;\n }\n\n let current = 1;\n\n for (let i = daily.length - 2; i >= 0; i -= 1) {\n if (!isConsecutiveDay(daily[i].date, daily[i + 1].date)) {\n break;\n }\n current += 1;\n }\n\n return current;\n}\n\nexport function getProviderInsights(\n modelTotals: Map<string, ModelTokenTotals>,\n recentModelTotals: Map<string, ModelTokenTotals>,\n daily: DailyUsage[],\n end: Date,\n): Insights {\n const mostUsedModel = getTopModel(modelTotals);\n const recentMostUsedModel = getTopModel(recentModelTotals);\n\n return {\n mostUsedModel,\n recentMostUsedModel,\n streaks: {\n longest: computeLongestStreak(daily),\n current: computeCurrentStreak(daily, end),\n },\n };\n}\n\nexport function createUsageSummary(\n provider: UsageSummary[\"provider\"],\n totals: DailyTotalsByDate,\n modelTotals: Map<string, ModelTokenTotals>,\n recentModelTotals: Map<string, ModelTokenTotals>,\n end: Date,\n): UsageSummary {\n const daily = totalsToRows(totals);\n\n return {\n provider,\n daily,\n insights: getProviderInsights(modelTotals, recentModelTotals, daily, end),\n };\n}\n\nexport function hasUsage(summary: UsageSummary) {\n return summary.daily.some((row) => row.total > 0);\n}\n","import svgBuilder, { type SVGBuilderInstance } from \"svg-builder\";\nimport type { DailyUsage, Insights, ModelUsage } from \"./interfaces\";\nimport type { ProviderId } from \"./lib/interfaces\";\nimport { formatLocalDate } from \"./lib/utils\";\n\ninterface HeatmapTheme {\n title: string;\n colors: {\n light: string[];\n dark: string[];\n };\n}\n\nexport type ColorMode = \"light\" | \"dark\";\n\ninterface CalendarGrid {\n weeks: (string | null)[][];\n monthLabels: (string | null)[];\n}\n\ninterface SectionLayout {\n width: number;\n height: number;\n gridTop: number;\n leftLabelWidth: number;\n cellSize: number;\n gap: number;\n headerCaptionY: number;\n headerValueY: number;\n titleY: number;\n monthLabelY: number;\n legendY: number;\n footerCaptionY: number;\n footerValueY: number;\n}\n\ninterface DrawHeatmapSectionOptions {\n x: number;\n y: number;\n grid: CalendarGrid;\n layout: SectionLayout;\n daily: DailyUsage[];\n insights?: Insights;\n title: string;\n colors: HeatmapTheme[\"colors\"];\n colorMode: ColorMode;\n palette: SurfacePalette;\n}\n\ninterface RenderUsageHeatmapsSvgSection {\n daily: DailyUsage[];\n insights?: Insights;\n title: string;\n colors: HeatmapTheme[\"colors\"];\n}\n\ninterface ModelUsageRow {\n caption: string;\n data: ModelUsage;\n}\n\ninterface RenderUsageHeatmapsSvgOptions {\n startDate: Date;\n endDate: Date;\n sections: RenderUsageHeatmapsSvgSection[];\n colorMode: ColorMode;\n}\n\ninterface SurfacePalette {\n background: string;\n text: string;\n muted: string;\n}\n\nexport const heatmapThemes: Record<ProviderId, HeatmapTheme> = {\n claude: {\n title: \"Claude Code\",\n colors: {\n light: [\n \"#fff7ed\", // orange-50\n \"#fed7aa\", // orange-200\n \"#fdba74\", // orange-300\n \"#f97316\", // orange-500\n \"#c2410c\", // orange-700\n ],\n dark: [\n \"#292524\", // stone-800\n \"#9a3412\", // orange-800\n \"#c2410c\", // orange-700\n \"#f97316\", // orange-500\n \"#fdba74\", // orange-300\n ],\n },\n },\n codex: {\n title: \"Codex\",\n colors: {\n light: [\n \"#e0e7ff\", // indigo-100\n \"#a5b4fc\", // indigo-300\n \"#818cf8\", // indigo-400\n \"#4f46e5\", // indigo-600\n \"#312e81\", // indigo-900\n ],\n dark: [\n \"#1e1b4b\", // indigo-950\n \"#312e81\", // indigo-900\n \"#4338ca\", // indigo-700\n \"#818cf8\", // indigo-400\n \"#c7d2fe\", // indigo-200\n ],\n },\n },\n opencode: {\n title: \"Open Code\",\n colors: {\n light: [\n \"#f5f5f5\", // neutral-100\n \"#d4d4d4\", // neutral-300\n \"#a3a3a3\", // neutral-400\n \"#525252\", // neutral-600\n \"#171717\", // neutral-900\n ],\n dark: [\n \"#262626\", // neutral-800\n \"#525252\", // neutral-600\n \"#737373\", // neutral-500\n \"#a3a3a3\", // neutral-400\n \"#fafafa\", // neutral-50\n ],\n },\n },\n};\n\nconst daysOfWeekMonday = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\nconst numberFormatter = new Intl.NumberFormat(\"en-US\");\nconst fontFamily =\n \"ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, sans-serif\";\nconst providerTitleFontSize = 20;\nconst metricCaptionFontSize = 9;\nconst metricValueFontSize = 14;\nconst captionValueGap = 4;\n\nconst surfacePalettes: Record<ColorMode, SurfacePalette> = {\n light: {\n background: \"#ffffff\",\n text: \"#0f172a\",\n muted: \"#737373\",\n },\n dark: {\n background: \"#171717\",\n text: \"#fafafa\",\n muted: \"#a3a3a3\",\n },\n};\n\nfunction formatTokenTotal(value: number) {\n const units = [\n { size: 1_000_000_000_000, suffix: \"T\" },\n { size: 1_000_000_000, suffix: \"B\" },\n { size: 1_000_000, suffix: \"M\" },\n { size: 1_000, suffix: \"K\" },\n ];\n\n for (const unit of units) {\n if (value >= unit.size) {\n const scaled = value / unit.size;\n const precision = scaled >= 100 ? 0 : scaled >= 10 ? 1 : 2;\n const compact = scaled\n .toFixed(precision)\n .replace(/\\.0+$/, \"\")\n .replace(/(\\.\\d*[1-9])0+$/, \"$1\");\n\n return `${compact}${unit.suffix}`;\n }\n }\n\n return numberFormatter.format(value);\n}\n\nfunction truncateText(value: string, maxLength: number) {\n if (value.length <= maxLength) {\n return value;\n }\n\n return `${value.slice(0, Math.max(maxLength - 3, 1))}...`;\n}\n\nfunction escapeXml(value: string) {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\");\n}\n\nfunction caption(value: string) {\n return value.toUpperCase();\n}\n\nfunction getAllDays(start: Date, end: Date) {\n const days: string[] = [];\n const curr = new Date(start);\n\n while (curr <= end) {\n days.push(formatLocalDate(curr));\n curr.setDate(curr.getDate() + 1);\n }\n\n return days;\n}\n\nfunction getMondayBasedWeekday(dateIso: string) {\n const sundayBased = new Date(`${dateIso}T00:00:00`).getDay();\n\n return (sundayBased + 6) % 7;\n}\n\nfunction padToWeekStartMonday(days: string[]) {\n const firstDay = getMondayBasedWeekday(days[0]);\n const padding = new Array(firstDay).fill(null);\n\n return [...padding, ...days];\n}\n\nfunction chunkByWeek(days: (string | null)[]): (string | null)[][] {\n const weeks: (string | null)[][] = [];\n\n for (let i = 0; i < days.length; i += 7) {\n weeks.push(days.slice(i, i + 7));\n }\n\n return weeks;\n}\n\nfunction getMonthLabel(week: (string | null)[]) {\n const lastDay = [...week].reverse().find(Boolean);\n\n if (!lastDay) {\n return null;\n }\n\n return new Date(`${lastDay}T00:00:00`).toLocaleString(\"en-US\", {\n month: \"short\",\n });\n}\n\nfunction defaultColourMap(value: number, max: number, colorCount: number) {\n if (max <= 0 || value <= 0) {\n return 0;\n }\n\n const index = Math.ceil((value / max) * (colorCount - 1));\n\n return Math.min(Math.max(index, 0), colorCount - 1);\n}\n\nfunction getCalendarGrid(startDate: Date, endDate: Date) {\n const allDays = getAllDays(startDate, endDate);\n const paddedDays = padToWeekStartMonday(allDays);\n const weeks = chunkByWeek(paddedDays);\n\n const monthLabels = weeks.map((week, i) => {\n const label = getMonthLabel(week);\n const prevLabel = i > 0 ? getMonthLabel(weeks[i - 1]) : null;\n\n return label !== prevLabel ? label : null;\n });\n\n return { weeks, monthLabels };\n}\n\nfunction getSectionLayout(weekCount: number) {\n const cellSize = 11;\n const gap = 2;\n const leftLabelWidth = 34;\n const rightPadding = 20;\n const headerCaptionY = 0;\n const headerValueY =\n headerCaptionY + metricCaptionFontSize + captionValueGap;\n const topMetricHeight = headerValueY + metricValueFontSize;\n const topPadding = Math.max(providerTitleFontSize, topMetricHeight) + 20;\n const monthHeaderHeight = 20;\n const titleY = 0;\n const monthLabelY = topPadding + 4;\n const gridTop = topPadding + monthHeaderHeight;\n const gridHeight = 7 * cellSize + 6 * gap;\n const gridWidth = weekCount * cellSize + Math.max(weekCount - 1, 0) * gap;\n const legendY = gridTop + gridHeight + 28;\n const legendBottomY = legendY + cellSize;\n const footerTopPadding = 32;\n const footerCaptionY = legendBottomY + footerTopPadding;\n const footerValueY =\n footerCaptionY + metricCaptionFontSize + captionValueGap;\n const statsBottomPadding = 12;\n const width = leftLabelWidth + gridWidth + rightPadding;\n const height = footerValueY + metricValueFontSize + statsBottomPadding;\n\n return {\n width,\n height,\n gridTop,\n leftLabelWidth,\n cellSize,\n gap,\n headerCaptionY,\n headerValueY,\n titleY,\n monthLabelY,\n legendY,\n footerCaptionY,\n footerValueY,\n };\n}\n\nfunction drawHeatmapSection(\n svg: SVGBuilderInstance,\n {\n x,\n y,\n grid,\n layout,\n daily,\n insights,\n title,\n colors,\n colorMode,\n palette,\n }: DrawHeatmapSectionOptions,\n) {\n const colorsForMode = colors[colorMode];\n const valueByDate = new Map<string, number>();\n const rightEdge = x + layout.width - 8;\n const leftColumnX = x + 8;\n let maxValue = 0;\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalTokens = 0;\n\n for (const row of daily) {\n valueByDate.set(formatLocalDate(row.date), row.total);\n maxValue = Math.max(maxValue, row.total);\n totalInputTokens += row.input;\n totalOutputTokens += row.output;\n totalTokens += row.total;\n }\n\n const topMetricGap = 120;\n const headerLast30DaysX = rightEdge - topMetricGap * 3;\n const headerInputX = rightEdge - topMetricGap * 2;\n const headerOutputX = rightEdge - topMetricGap;\n const totalTokensLabel = formatTokenTotal(totalTokens);\n const totalInputLabel = formatTokenTotal(totalInputTokens);\n const totalOutputLabel = formatTokenTotal(totalOutputTokens);\n const longestStreak = insights?.streaks.longest ?? 0;\n const currentStreak = insights?.streaks.current ?? 0;\n\n svg = svg.text(\n {\n x: leftColumnX,\n y: y + layout.titleY,\n fill: palette.text,\n \"font-size\": providerTitleFontSize,\n \"font-weight\": 600,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n title,\n );\n\n svg = svg.text(\n {\n x: headerInputX,\n y: y + layout.headerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Input tokens\"),\n );\n\n svg = svg.text(\n {\n x: headerInputX,\n y: y + layout.headerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n totalInputLabel,\n );\n\n svg = svg.text(\n {\n x: headerOutputX,\n y: y + layout.headerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Output tokens\"),\n );\n\n svg = svg.text(\n {\n x: headerOutputX,\n y: y + layout.headerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n totalOutputLabel,\n );\n\n svg = svg.text(\n {\n x: rightEdge,\n y: y + layout.headerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Total tokens\"),\n );\n\n svg = svg.text(\n {\n x: rightEdge,\n y: y + layout.headerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n totalTokensLabel,\n );\n\n for (let i = 0; i < 7; i += 1) {\n const dayY =\n y +\n layout.gridTop +\n i * (layout.cellSize + layout.gap) +\n layout.cellSize / 2;\n\n const dayLabel = i === 0 || i === 6 ? daysOfWeekMonday[i] : \"\";\n\n svg = svg.text(\n {\n x: x + layout.leftLabelWidth - 6,\n y: dayY,\n fill: palette.muted,\n \"font-size\": 10,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"middle\",\n \"font-family\": fontFamily,\n },\n dayLabel,\n );\n }\n\n for (let weekIndex = 0; weekIndex < grid.weeks.length; weekIndex += 1) {\n const monthLabel = grid.monthLabels[weekIndex];\n\n if (monthLabel) {\n const monthX =\n x + layout.leftLabelWidth + weekIndex * (layout.cellSize + layout.gap);\n\n svg = svg.text(\n {\n x: monthX,\n y: y + layout.monthLabelY,\n fill: palette.muted,\n \"font-size\": 10,\n \"font-family\": fontFamily,\n },\n monthLabel,\n );\n }\n\n const week = grid.weeks[weekIndex];\n\n for (let dayIndex = 0; dayIndex < week.length; dayIndex += 1) {\n const day = week[dayIndex];\n\n if (!day) {\n continue;\n }\n\n const value = valueByDate.get(day) ?? 0;\n const colorIndex = defaultColourMap(\n value,\n maxValue,\n colorsForMode.length,\n );\n const fill = colorsForMode[colorIndex];\n\n const dayX =\n x + layout.leftLabelWidth + weekIndex * (layout.cellSize + layout.gap);\n const dayY =\n y + layout.gridTop + dayIndex * (layout.cellSize + layout.gap);\n\n svg = svg.rect({\n x: dayX,\n y: dayY,\n width: layout.cellSize,\n height: layout.cellSize,\n rx: 3,\n ry: 3,\n fill,\n });\n }\n }\n\n const legendStartX = x + layout.leftLabelWidth;\n const legendY = y + layout.legendY;\n\n svg = svg.text(\n {\n x: legendStartX,\n y: legendY + 10,\n fill: palette.muted,\n \"font-size\": 10,\n \"font-weight\": 600,\n \"font-family\": fontFamily,\n },\n caption(\"Less\"),\n );\n\n for (let i = 0; i < colorsForMode.length; i += 1) {\n const legendX = legendStartX + 28 + i * (layout.cellSize + 3);\n\n svg = svg.rect({\n x: legendX,\n y: legendY,\n width: layout.cellSize,\n height: layout.cellSize,\n rx: 3,\n ry: 3,\n fill: colorsForMode[i],\n });\n }\n\n svg = svg.text(\n {\n x: legendStartX + 28 + colorsForMode.length * (layout.cellSize + 3) + 6,\n y: legendY + 10,\n fill: palette.muted,\n \"font-size\": 10,\n \"font-weight\": 600,\n \"font-family\": fontFamily,\n },\n caption(\"More\"),\n );\n\n const rightColumnX = rightEdge;\n const leftSecondaryX = leftColumnX + 250;\n const rightPrimaryX = rightColumnX - 160;\n\n const leftRows: ModelUsageRow[] = [];\n\n if (insights?.mostUsedModel) {\n leftRows.push({ caption: \"Most used model\", data: insights.mostUsedModel });\n }\n\n if (insights?.recentMostUsedModel) {\n leftRows.push({\n caption: \"Recent use (last 30 days)\",\n data: insights.recentMostUsedModel,\n });\n }\n\n for (const [index, row] of leftRows.entries()) {\n const captionY = layout.footerCaptionY;\n const valueY = layout.footerValueY;\n const modelName = truncateText(row.data.name, 20);\n const modelX = index === 0 ? leftColumnX : leftSecondaryX;\n const tokenLabel = `(${formatTokenTotal(row.data.tokens.total)})`;\n\n svg = svg.text(\n {\n x: modelX,\n y: y + captionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(row.caption),\n );\n\n svg = svg.text(\n {\n x: modelX,\n y: y + valueY,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `<tspan fill=\"${palette.text}\" font-size=\"${metricValueFontSize}\" font-weight=\"600\">${escapeXml(modelName)}</tspan><tspan dx=\"6\" fill=\"${palette.muted}\" font-size=\"${metricValueFontSize}\" font-weight=\"400\">${tokenLabel}</tspan>`,\n );\n }\n\n svg = svg.text(\n {\n x: rightPrimaryX,\n y: y + layout.footerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Longest streak\"),\n );\n\n svg = svg.text(\n {\n x: rightPrimaryX,\n y: y + layout.footerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `${numberFormatter.format(longestStreak)} days`,\n );\n\n svg = svg.text(\n {\n x: rightColumnX,\n y: y + layout.footerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Current streak\"),\n );\n\n svg = svg.text(\n {\n x: rightColumnX,\n y: y + layout.footerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `${numberFormatter.format(currentStreak)} days`,\n );\n\n return svg;\n}\n\nexport function renderUsageHeatmapsSvg({\n startDate,\n endDate,\n sections,\n colorMode,\n}: RenderUsageHeatmapsSvgOptions) {\n const grid = getCalendarGrid(startDate, endDate);\n const layout = getSectionLayout(grid.weeks.length);\n const palette = surfacePalettes[colorMode];\n const horizontalPadding = 18;\n const topPadding = 30;\n const bottomPadding = 18;\n const sectionGap = 40;\n\n const width = horizontalPadding * 2 + layout.width;\n const height =\n topPadding +\n bottomPadding +\n sections.length * layout.height +\n Math.max(sections.length - 1, 0) * sectionGap;\n\n let svg = svgBuilder\n .create()\n .width(width)\n .height(height)\n .viewBox(`0 0 ${width} ${height}`)\n .rect({\n x: -2,\n y: -2,\n width: width + 4,\n height: height + 4,\n fill: palette.background,\n });\n\n sections.forEach((section, index) => {\n const sectionY = topPadding + index * (layout.height + sectionGap);\n\n svg = drawHeatmapSection(svg, {\n x: horizontalPadding,\n y: sectionY,\n grid,\n layout,\n daily: section.daily,\n insights: section.insights,\n title: section.title,\n colors: section.colors,\n colorMode,\n palette,\n });\n });\n\n return svg.render();\n}\n","import { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n getRecentWindowStart,\n listFilesRecursive,\n normalizeModelName,\n readJsonLines,\n} from \"./utils\";\n\nconst CLAUDE_CONFIG_DIR_ENV = \"CLAUDE_CONFIG_DIR\";\nconst CLAUDE_PROJECTS_DIR_NAME = \"projects\";\n\ninterface ClaudeUsagePayload {\n input_tokens?: number;\n output_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n}\n\ninterface ClaudeRawLogEntry {\n timestamp?: string;\n requestId?: string;\n message?: {\n usage?: ClaudeUsagePayload;\n model?: string;\n id?: string;\n };\n}\n\ninterface ClaudeLogEntry {\n timestamp: string;\n usage: ClaudeUsagePayload;\n model?: string;\n messageId?: string;\n requestId?: string;\n}\n\nfunction getClaudeConfigPaths() {\n const envPaths = (process.env[CLAUDE_CONFIG_DIR_ENV] ?? \"\").trim();\n\n if (envPaths !== \"\") {\n return envPaths\n .split(\",\")\n .map((path) => path.trim())\n .filter((path) => path !== \"\")\n .map((path) => resolve(path));\n }\n\n const xdgConfigHome =\n process.env.XDG_CONFIG_HOME?.trim() || join(homedir(), \".config\");\n\n return [join(xdgConfigHome, \"claude\"), join(homedir(), \".claude\")];\n}\n\nfunction getClaudeProjectDirs() {\n const unique = new Set<string>();\n const dirs: string[] = [];\n\n for (const basePath of getClaudeConfigPaths()) {\n const projectsDir = join(basePath, CLAUDE_PROJECTS_DIR_NAME);\n\n if (existsSync(projectsDir) && !unique.has(projectsDir)) {\n unique.add(projectsDir);\n dirs.push(projectsDir);\n }\n }\n\n return dirs;\n}\n\nfunction parseClaudeLogEntry(entry: ClaudeRawLogEntry): ClaudeLogEntry | null {\n if (!entry.timestamp || !entry.message?.usage) {\n return null;\n }\n\n return {\n timestamp: entry.timestamp,\n usage: entry.message.usage,\n model: entry.message.model,\n messageId: entry.message.id,\n requestId: entry.requestId,\n };\n}\n\nfunction createClaudeTokenTotals(usage: ClaudeUsagePayload): DailyTokenTotals {\n const cacheReadInput = usage.cache_read_input_tokens ?? 0;\n const cacheCreationInput = usage.cache_creation_input_tokens ?? 0;\n const input = (usage.input_tokens ?? 0) + cacheReadInput;\n const output = (usage.output_tokens ?? 0) + cacheCreationInput;\n\n return {\n input,\n output,\n cache: { input: cacheReadInput, output: cacheCreationInput },\n total: input + output,\n };\n}\n\nasync function parseClaudeFile(filePath: string) {\n const entries: ClaudeLogEntry[] = [];\n const lines = await readJsonLines<ClaudeRawLogEntry>(filePath);\n\n for (const line of lines) {\n const parsed = parseClaudeLogEntry(line);\n\n if (parsed) {\n entries.push(parsed);\n }\n }\n\n return entries;\n}\n\nasync function parseClaudeFiles() {\n const projectDirs = getClaudeProjectDirs();\n const files = (\n await Promise.all(\n projectDirs.map((projectDir) => listFilesRecursive(projectDir, \".jsonl\")),\n )\n ).flat();\n\n return Promise.all(files.map((file) => parseClaudeFile(file)));\n}\n\nfunction createUniqueHash(messageId?: string, requestId?: string) {\n if (!messageId || !requestId) {\n return null;\n }\n\n return `${messageId}:${requestId}`;\n}\n\nexport async function loadClaudeRows(\n startDate: Date,\n endDate: Date,\n): Promise<UsageSummary> {\n const sessions = await parseClaudeFiles();\n\n const totals: DailyTotalsByDate = new Map();\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n const recentStart = getRecentWindowStart(endDate, 30);\n const processedHashes = new Set<string>();\n\n for (const session of sessions) {\n for (const entry of session) {\n const uniqueHash = createUniqueHash(entry.messageId, entry.requestId);\n\n if (uniqueHash && processedHashes.has(uniqueHash)) {\n continue;\n }\n\n if (uniqueHash) {\n processedHashes.add(uniqueHash);\n }\n\n const timestamp = new Date(entry.timestamp);\n\n if (timestamp < startDate || timestamp > endDate) {\n continue;\n }\n\n const tokenTotals = createClaudeTokenTotals(entry.usage);\n\n if (tokenTotals.total <= 0) {\n continue;\n }\n\n const modelName =\n entry.model && entry.model !== \"<synthetic>\"\n ? normalizeModelName(entry.model)\n : undefined;\n\n addDailyTokenTotals(totals, timestamp, tokenTotals, modelName);\n\n if (!modelName) {\n continue;\n }\n\n addModelTokenTotals(modelTotals, modelName, tokenTotals);\n\n if (timestamp >= recentStart) {\n addModelTokenTotals(recentModelTotals, modelName, tokenTotals);\n }\n }\n }\n\n return createUsageSummary(\n \"claude\",\n totals,\n modelTotals,\n recentModelTotals,\n endDate,\n );\n}\n","import { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n getRecentWindowStart,\n listFilesRecursive,\n normalizeModelName,\n readJsonLines,\n} from \"./utils\";\n\ninterface CodexRawUsage {\n input_tokens?: number;\n cached_input_tokens?: number;\n cache_read_input_tokens?: number;\n output_tokens?: number;\n reasoning_output_tokens?: number;\n total_tokens?: number;\n}\n\ninterface CodexEventInfo {\n model?: string;\n model_name?: string;\n metadata?: { model?: string };\n last_token_usage?: CodexRawUsage;\n total_token_usage?: CodexRawUsage;\n}\n\ninterface CodexEventPayload {\n type?: string;\n info?: CodexEventInfo;\n model?: string;\n model_name?: string;\n metadata?: { model?: string };\n}\n\ninterface CodexEventEntry {\n type?: string;\n timestamp: string;\n payload?: CodexEventPayload;\n}\n\ninterface CodexNormalizedUsage {\n input_tokens: number;\n cached_input_tokens: number;\n output_tokens: number;\n reasoning_output_tokens: number;\n total_tokens: number;\n}\n\nfunction normalizeCodexUsage(value?: CodexRawUsage) {\n if (!value) {\n return null;\n }\n\n const input = value.input_tokens ?? 0;\n const cached =\n value.cached_input_tokens ?? value.cache_read_input_tokens ?? 0;\n const output = value.output_tokens ?? 0;\n const reasoning = value.reasoning_output_tokens ?? 0;\n const total = value.total_tokens ?? 0;\n\n return {\n input_tokens: input,\n cached_input_tokens: cached,\n output_tokens: output,\n reasoning_output_tokens: reasoning,\n total_tokens: total > 0 ? total : input + output,\n };\n}\n\nfunction subtractCodexUsage(\n current: CodexNormalizedUsage,\n previous: CodexNormalizedUsage | null,\n) {\n return {\n input_tokens: Math.max(\n current.input_tokens - (previous?.input_tokens ?? 0),\n 0,\n ),\n cached_input_tokens: Math.max(\n current.cached_input_tokens - (previous?.cached_input_tokens ?? 0),\n 0,\n ),\n output_tokens: Math.max(\n current.output_tokens - (previous?.output_tokens ?? 0),\n 0,\n ),\n reasoning_output_tokens: Math.max(\n current.reasoning_output_tokens -\n (previous?.reasoning_output_tokens ?? 0),\n 0,\n ),\n total_tokens: Math.max(\n current.total_tokens - (previous?.total_tokens ?? 0),\n 0,\n ),\n };\n}\n\nfunction asNonEmptyString(value?: string) {\n const trimmed = value?.trim();\n\n return trimmed === \"\" ? undefined : trimmed;\n}\n\nfunction extractCodexModel(payload?: CodexEventPayload) {\n const directModel =\n asNonEmptyString(payload?.model) ?? asNonEmptyString(payload?.model_name);\n\n if (directModel) {\n return directModel;\n }\n\n if (payload?.info) {\n const infoModel =\n asNonEmptyString(payload.info.model) ??\n asNonEmptyString(payload.info.model_name);\n\n if (infoModel) {\n return infoModel;\n }\n\n if (payload.info.metadata) {\n const model = asNonEmptyString(payload.info.metadata.model);\n\n if (model) {\n return model;\n }\n }\n }\n\n if (payload?.metadata) {\n return asNonEmptyString(payload.metadata.model);\n }\n\n return undefined;\n}\n\nasync function parseCodexFile(filePath: string) {\n return readJsonLines<CodexEventEntry>(filePath);\n}\n\nasync function parseCodexFiles() {\n const codexHome = process.env.CODEX_HOME?.trim()\n ? resolve(process.env.CODEX_HOME)\n : join(homedir(), \".codex\");\n\n const sessionsDir = join(codexHome, \"sessions\");\n\n const files = await listFilesRecursive(sessionsDir, \".jsonl\");\n\n return Promise.all(files.map((file) => parseCodexFile(file)));\n}\n\nexport async function loadCodexRows(\n start: Date,\n end: Date,\n): Promise<UsageSummary> {\n const sessions = await parseCodexFiles();\n\n const totals: DailyTotalsByDate = new Map();\n const recentStart = getRecentWindowStart(end, 30);\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n\n for (const session of sessions) {\n let previousTotals: CodexNormalizedUsage | null = null;\n let currentModel: string | undefined;\n\n for (const entry of session) {\n const extractedModel = extractCodexModel(entry.payload);\n\n if (entry.type === \"turn_context\") {\n currentModel = extractedModel ?? currentModel;\n continue;\n }\n\n if (entry.type !== \"event_msg\" || entry.payload?.type !== \"token_count\") {\n continue;\n }\n\n const info = entry.payload.info;\n const lastUsage = normalizeCodexUsage(info?.last_token_usage);\n const totalUsage = normalizeCodexUsage(info?.total_token_usage);\n let rawUsage = lastUsage;\n\n if (!rawUsage && totalUsage) {\n rawUsage = subtractCodexUsage(totalUsage, previousTotals);\n }\n\n if (totalUsage) {\n previousTotals = totalUsage;\n }\n\n if (!rawUsage) {\n continue;\n }\n\n const usage: DailyTokenTotals = {\n input: rawUsage.input_tokens,\n output: rawUsage.output_tokens,\n cache: { input: rawUsage.cached_input_tokens, output: 0 },\n total: rawUsage.total_tokens,\n };\n\n if (usage.total <= 0) {\n continue;\n }\n\n const date = new Date(entry.timestamp);\n\n if (date < start || date > end) {\n continue;\n }\n\n const modelName = extractedModel ?? currentModel;\n const normalizedModelName = modelName\n ? normalizeModelName(modelName)\n : undefined;\n\n addDailyTokenTotals(totals, date, usage, normalizedModelName);\n\n if (normalizedModelName) {\n addModelTokenTotals(modelTotals, normalizedModelName, usage);\n\n if (date >= recentStart) {\n addModelTokenTotals(recentModelTotals, normalizedModelName, usage);\n }\n }\n }\n }\n\n return createUsageSummary(\"codex\", totals, modelTotals, recentModelTotals, end);\n}\n","import type { UsageSummary } from \"../interfaces\";\n\nexport type ProviderId = UsageSummary[\"provider\"];\n\nexport const providerIds: ProviderId[] = [\"claude\", \"codex\", \"opencode\"];\n\nexport const providerStatusLabel: Record<ProviderId, string> = {\n claude: \"Claude code\",\n codex: \"Codex\",\n opencode: \"Open Code\",\n};\n","import { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n getRecentWindowStart,\n listFilesRecursive,\n normalizeModelName,\n} from \"./utils\";\n\ninterface OpenCodeTokenCache {\n read?: number;\n write?: number;\n}\n\ninterface OpenCodeTokens {\n input?: number;\n output?: number;\n cache?: OpenCodeTokenCache;\n}\n\ninterface OpenCodeMessage {\n id: string;\n providerID: string;\n modelID: string;\n time: { created: number };\n tokens?: OpenCodeTokens;\n}\n\nfunction sumOpenCodeTokens(tokens?: OpenCodeTokens): DailyTokenTotals {\n const cacheInput = tokens?.cache?.read ?? 0;\n const cacheOutput = tokens?.cache?.write ?? 0;\n const input = (tokens?.input ?? 0) + cacheInput;\n const output = (tokens?.output ?? 0) + cacheOutput;\n\n return {\n input,\n output,\n cache: { input: cacheInput, output: cacheOutput },\n total: input + output,\n };\n}\n\nasync function parseOpenCodeFile(filePath: string) {\n const content = await readFile(filePath, \"utf8\");\n\n return JSON.parse(content) as OpenCodeMessage;\n}\n\nasync function parseOpenCodeFiles() {\n const baseDir = process.env.OPENCODE_DATA_DIR?.trim()\n ? resolve(process.env.OPENCODE_DATA_DIR)\n : join(homedir(), \".local\", \"share\", \"opencode\");\n\n const messagesDir = join(baseDir, \"storage\", \"message\");\n\n const files = await listFilesRecursive(messagesDir, \".json\");\n\n return Promise.all(files.map((file) => parseOpenCodeFile(file)));\n}\n\nexport async function loadOpenCodeRows(\n start: Date,\n end: Date,\n): Promise<UsageSummary> {\n const messages = await parseOpenCodeFiles();\n const totals: DailyTotalsByDate = new Map();\n const dedupe = new Set<string>();\n const recentStart = getRecentWindowStart(end, 30);\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n\n for (const message of messages) {\n if (dedupe.has(message.id)) {\n continue;\n }\n\n dedupe.add(message.id);\n\n const tokenTotals = sumOpenCodeTokens(message.tokens);\n\n if (tokenTotals.total <= 0) {\n continue;\n }\n\n const date = new Date(message.time.created);\n\n if (date < start || date > end) {\n continue;\n }\n\n const modelName = normalizeModelName(message.modelID);\n\n addDailyTokenTotals(totals, date, tokenTotals, modelName);\n addModelTokenTotals(modelTotals, modelName, tokenTotals);\n\n if (date >= recentStart) {\n addModelTokenTotals(recentModelTotals, modelName, tokenTotals);\n }\n }\n\n return createUsageSummary(\n \"opencode\",\n totals,\n modelTotals,\n recentModelTotals,\n end,\n );\n}\n","import type { UsageSummary } from \"./interfaces\";\nimport { loadClaudeRows } from \"./lib/claude-code\";\nimport { loadCodexRows } from \"./lib/codex\";\nimport {\n providerIds,\n providerStatusLabel,\n type ProviderId,\n} from \"./lib/interfaces\";\nimport { loadOpenCodeRows } from \"./lib/open-code\";\nimport { hasUsage } from \"./lib/utils\";\n\nexport { providerIds, providerStatusLabel, type ProviderId };\n\ninterface AggregateUsageOptions {\n start: Date;\n end: Date;\n}\n\nexport async function aggregateUsage({\n start,\n end,\n}: AggregateUsageOptions): Promise<Record<ProviderId, UsageSummary | null>> {\n const [claude, codex, opencode] = await Promise.all([\n loadClaudeRows(start, end),\n loadCodexRows(start, end),\n loadOpenCodeRows(start, end),\n ]);\n\n return {\n claude: hasUsage(claude) ? claude : null,\n codex: hasUsage(codex) ? codex : null,\n opencode: hasUsage(opencode) ? opencode : null,\n };\n}\n"],"mappings":";;;AAAA,SAAS,WAAW,qBAAqB;AACzC,SAAS,SAAS,SAAS,WAAAA,gBAAe;AAC1C,SAAS,iBAAiB;AAC1B,OAAO,SAAuB;AAC9B,OAAO,QAAQ;AACf,OAAO,WAAW;;;ACLlB,IAAA,kBAAe;EACb,WAAW;IACT;IACA;IACA;IACA;IACA;IACA;IACA;;EAEF,aAAa;IACX;IACA;IACA;IACA;IACA;IACA;;EAEF,WAAW;IACT;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEF,aAAa;IACX;IACA;IACA;;EAEF,OAAO;IACL;IACA;IACA;;EAEF,YAAY;IACV;IACA;IACA;IACA;IACA;;EAEF,aAAa;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEF,kBAAkB;IAChB;IACA;IACA;IACA;;;;;AC/DJ,IAAA,qBAAe;EACb,gBAAgB;IACd;IACA;IACA;IACA;;EAEF,0BAA0B;IACxB;IACA;;EAEF,iBAAiB;IACf;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEF,gBAAgB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;;EAEF,mBAAmB;IACjB;IACA;;EAEF,MAAM;IACJ;IAAyB;IAAe;IAAqB;IAAa;IAAgB;IAAiB;IAAiB;IAAgB;IAAiB;IAAgB;IAAoB;IAAgB;IAAiB;IAAmB;IAAqB;IAAiB;IAAe;IAAgB;IAAiB;IAAe;IAAgB;IAAqB;IAAc;IAAmB;IAAc;IAAa;IAAc;IAAkB;IAAwB;IAAoB;IAAa;IAAoB;IAAiB;IAAgB;IAAiB;IAAiB;IAAiB;IAAwB;IAAiB;IAAiB;IAAgB;IAAiB;IAAgB;IAAa;IAAiB;IAAiB;IAAiB;IAAkB;;EAE3zB,uBAAuB;IACrB;IACA;IACA;;EAEF,MAAM;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEF,eAAe;IACb;IACA;IACA;IACA;IACA;IACA;;EAEF,iBAAiB;IACf;IACA;IACA;IACA;IACA;;EAEF,gBAAgB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEF,cAAc;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEF,kBAAkB;IAChB;IACA;IACA;IACA;IACA;IACA;IACA;;EAEF,OAAO;IACL;IACA;IACA;IACA;IACA;IACA;IACA;;;;;AC7IJ,IAAM,kBAAkB;AACxB,IAAM,oBAAoB;AAC1B,IAAM,0BAA0B,oBAAI,IAAI,CAAC,QAAQ,SAAS,SAAS,MAAM,CAAC;AAE1E,IAAM,kBAAN,MAAqB;;AAIrB,IAAM,iBACJ,OAAO,eAAe,cAClB,kBACC;AAEP,IAAM,UAAN,cAAsB,eAAc;EAUlC,YAAa,OAAsC,SAAwB;AACzE,UAAK;AACL,SAAK,mBAAmB;MACtB;MACA;;AAEF,SAAK,QAAQ;AACb,SAAK,UAAU;AACf,SAAK,mBAAmB;AACxB,SAAK,sBAAsB;AAC3B,SAAK,sBAAsB;EAC7B;EAEU,iBAAc;AACtB,SAAK,iBAAgB;AACrB,SAAK,cAAa;AAClB,SAAK,sBAAsB,wBAAwB,IAAI,KAAK,IAAI;AAChE,SAAK,gBAAe;AACpB,SAAK,aAAY;AACjB,SAAK,KAAK,KAAK,KAAK;EACtB;EAEQ,MAAO,MAAqB;AAClC,WAAO,SAAS;EAClB;EAEQ,cAAe,QAA0BC,WAAkC;AACjF,UAAM,WAAqB,CAAA;AAC3B,WAAO,QAAQ,CAAC,UAAS;AACvB,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,iBAAS,KAAK,GAAG,KAAK;AACtB;MACF;AACA,YAAM,SAASA,UAAS,KAAK;AAC7B,UAAI,UAAU,MAAM,QAAQ,MAAM,GAAG;AACnC,iBAAS,KAAK,GAAG,MAAM;AACvB;MACF;AACA,eAAS,KAAK,KAAK;IACrB,CAAC;AACD,WAAO;EACT;EAEA,gBAAa;AACX,QAAI,KAAK,MAAM,KAAK,gBAAgB,GAAG;AACrC;IACF;AACA,SAAK,mBAAmB,KAAK,cAAc,KAAK,kBAAkB,eAAe;EACnF;EAEA,mBAAgB;AACd,QAAI,KAAK,MAAM,KAAK,mBAAmB,GAAG;AACxC;IACF;AACA,UAAM,UAAU,IAAI,IAAY,KAAK,gBAAgB;AACrD,SAAK,cAAc,KAAK,qBAAqB,iBAAiB,EAAE,QAAQ,CAAC,cAAa;AACpF,cAAQ,IAAI,SAAS;IACvB,CAAC;AACD,SAAK,sBAAsB,MAAM,KAAK,OAAO;EAC/C;EAEA,eAAgB,SAAe;AAC7B,WAAO,QAAQ,MAAM,OAAO,EAAE,CAAC;EACjC;EAEA,kBAAe;AACb,QAAI,CAAC,KAAK,OAAO;AACf;IACF;AACA,QAAI,KAAK,MAAM,KAAK,mBAAmB,GAAG;AACxC;IACF;AACA,UAAM,gBAAgB,KAAK;AAE3B,UAAM,UAAU,oBAAI,IAAG;AAEvB,SAAK,iBAAiB,QAAQ,CAAC,UAAS;AACtC,WAAK,cAAc,CAAC,KAAK,GAAG,iBAAiB,EAAE,QAAQ,CAAC,cAAa;AACnE,gBAAQ,IAAI,SAAS;MACvB,CAAC;IACH,CAAC;AAED,SAAK,cAAc,eAAe,iBAAiB,EAAE,QAAQ,CAAC,cAAa;AACzE,cAAQ,IAAI,SAAS;IACvB,CAAC;AACD,YAAQ,IAAI,WAAW;AAEvB,WAAO,KAAK,KAAK,KAAK,EAAE,QAAQ,CAAC,cAAa;AAC5C,UAAI,CAAC,QAAQ,IAAI,SAAS,GAAG;AAC3B,cAAM,IAAI,MAAM,KAAK,OAAO,uBAAuB,YAAY,aAAa;MAC9E;IACF,CAAC;EACH;EAEA,eAAY;AACV,QAAI,CAAC,KAAK,SAAS;AACjB;IACF;AACA,QAAI,OAAO,KAAK,YAAY,YAAY,CAAC,KAAK,qBAAqB;AACjE,YAAM,IAAI,MAAM,kCAAkC,KAAK,IAAI,YAAY;IACzE;AACA,QAAI,KAAK,MAAM,KAAK,gBAAgB,GAAG;AACrC;IACF;AACA,QAAI,OAAO,KAAK,YAAY,UAAU;AACpC;IACF;AACA,UAAM,kBAAkB,KAAK,QAAQ;AACrC,QAAI,CAAC,MAAM,QAAQ,eAAe,GAAG;AACnC;IACF;AACA,oBAAgB,QAAQ,SAAU,SAAe;AAC/C,YAAM,OAAO,KAAK,eAAe,OAAO;AACxC,UAAI,KAAK,iBAAiB,QAAQ,IAAI,MAAM,IAAI;AAC9C,cAAM,IAAI,MAAM,KAAK,OAAO,qBAAqB,OAAO,YAAY;MACtE;IACF,EAAE,KAAK,IAAI,CAAC;EACd;EAEA,KAAM,OAAoC;AACxC,QAAI,UAAU,MAAM,KAAK,MACvB;AAEF,QAAK,OAAO;AACV,WAAK,QAAQ,OAAO;AAClB,cAAM,QAAQ,MAAM,IAAI;AACxB,YAAI,UAAU,QAAW;AACvB;QACF;AACA,mBAAW,MAAM,OAAO,OAAO,OAAO,KAAK,IAAI;MACjD;IACF;AACA,eAAW;AACX,SAAK,OAAO;EACd;;;;AC7KK,IAAM,gBAAgB;EAC3B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKK,IAAM,kBAAkB;EAC7B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKK,IAAM,4BAAoE;EAC/E,KAAK;IACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,iBAAiB;IACb;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,oBAAoB;IAChB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,iBAAiB;IACb;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,uBAAuB;IACnB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,eAAe;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,oBAAoB;IAChB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,qBAAqB;IACjB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,qBAAqB;IACjB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,eAAe;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,sBAAsB;IAClB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,eAAe;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,iBAAiB;IACb;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,KAAK;IACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;I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","names":["resolve","registry","join","join","homedir","join","resolve","resolve","join","homedir","readFile","homedir","join","resolve","readFile","resolve","join","homedir","resolve"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/content/index.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/attributes/index.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/elements/element.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/elements/definitions.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/elements/index.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/index.ts","../src/lib/utils.ts","../src/graph.ts","../src/lib/claude-code.ts","../src/lib/codex.ts","../src/lib/interfaces.ts","../src/lib/open-code.ts","../src/providers.ts"],"sourcesContent":["import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, extname, resolve } from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport ora, { type Ora } from \"ora\";\nimport ow from \"ow\";\nimport sharp from \"sharp\";\nimport { heatmapThemes, renderUsageHeatmapsSvg, type ColorMode } from \"./graph\";\nimport type {\n JsonExportPayload,\n JsonUsageSummary,\n UsageSummary,\n} from \"./interfaces\";\nimport type { ProviderId } from \"./providers\";\nimport { formatLocalDate } from \"./lib/utils\";\nimport { aggregateUsage, providerIds, providerStatusLabel } from \"./providers\";\n\ntype OutputFormat = \"png\" | \"svg\" | \"json\";\ninterface CliArgValues {\n output?: string;\n format?: string;\n help: boolean;\n dark: boolean;\n claude: boolean;\n codex: boolean;\n opencode: boolean;\n}\n\nconst PNG_BASE_WIDTH = 1000;\nconst PNG_SCALE = 4;\nconst PNG_RENDER_WIDTH = PNG_BASE_WIDTH * PNG_SCALE;\nconst JSON_EXPORT_VERSION = \"2026-03-03\";\n\nconst HELP_TEXT = `slopmeter\n\nGenerate rolling 1-year usage heatmap image(s) (today is the latest day).\n\nUsage:\n slopmeter [--claude] [--codex] [--opencode] [--dark] [--format png|svg|json] [--output ./heatmap-last-year.png]\n\nOptions:\n --claude Render Claude Code graph\n --codex Render Codex graph\n --opencode Render Open Code graph\n --dark Render with the dark theme\n -f, --format Output format: png, svg, or json (default: png)\n -o, --output Output file path (default: ./heatmap-last-year.png)\n -h, --help Show this help\n`;\n\nfunction printHelp() {\n process.stdout.write(HELP_TEXT);\n}\n\nfunction validateArgs(values: unknown): asserts values is CliArgValues {\n ow(\n values,\n ow.object.exactShape({\n output: ow.optional.string.nonEmpty,\n format: ow.optional.string.nonEmpty,\n help: ow.boolean,\n dark: ow.boolean,\n claude: ow.boolean,\n codex: ow.boolean,\n opencode: ow.boolean,\n }),\n );\n}\n\nfunction inferFormat(\n formatArg: string | undefined,\n outputArg: string | undefined,\n) {\n if (formatArg) {\n ow(formatArg, ow.string.oneOf([\"png\", \"svg\", \"json\"] as const));\n\n return formatArg;\n }\n\n if (outputArg) {\n const outputExtension = extname(outputArg).toLowerCase();\n\n if (outputExtension === \".svg\") {\n return \"svg\" as const;\n }\n\n if (outputExtension === \".json\") {\n return \"json\" as const;\n }\n }\n\n return \"png\" as const;\n}\n\nasync function writeOutputImage(\n outputPath: string,\n format: Exclude<OutputFormat, \"json\">,\n svg: string,\n background: string,\n) {\n if (format === \"svg\") {\n writeFileSync(outputPath, svg, \"utf8\");\n\n return;\n }\n\n const pngBuffer = await sharp(Buffer.from(svg), { density: 192 })\n .resize({ width: PNG_RENDER_WIDTH })\n .flatten({ background })\n .png()\n .toBuffer();\n\n writeFileSync(outputPath, pngBuffer);\n}\n\nfunction writeOutputJson(outputPath: string, payload: JsonExportPayload) {\n writeFileSync(outputPath, `${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n}\n\nfunction toJsonUsageSummary(summary: UsageSummary): JsonUsageSummary {\n return {\n provider: summary.provider,\n insights: summary.insights,\n daily: summary.daily.map((row) => ({\n date: formatLocalDate(row.date),\n input: row.input,\n output: row.output,\n cache: row.cache,\n total: row.total,\n breakdown: row.breakdown,\n })),\n };\n}\n\nfunction getDateWindow() {\n const start = new Date();\n\n start.setHours(0, 0, 0, 0);\n start.setFullYear(start.getFullYear() - 1);\n\n const end = new Date();\n\n end.setHours(23, 59, 59, 999);\n\n return { start, end };\n}\n\nfunction printProviderAvailability(\n rowsByProvider: Record<ProviderId, UsageSummary | null>,\n providers: ProviderId[],\n) {\n for (const provider of providers) {\n const found = rowsByProvider[provider] ? \"found\" : \"not found\";\n\n process.stdout.write(`${providerStatusLabel[provider]} ${found}\\n`);\n }\n}\n\nfunction getRequestedProviders(values: CliArgValues) {\n return providerIds.filter((id) => values[id]);\n}\n\nfunction selectProvidersToRender(\n rowsByProvider: Record<ProviderId, UsageSummary | null>,\n requested: ProviderId[],\n) {\n const providersToRender =\n requested.length > 0\n ? requested.filter((provider) => rowsByProvider[provider])\n : providerIds.filter((provider) => rowsByProvider[provider]);\n\n if (requested.length > 0 && providersToRender.length < requested.length) {\n const missing = requested.filter((provider) => !rowsByProvider[provider]);\n\n throw new Error(\n `Requested provider data not found: ${missing.map((provider) => providerStatusLabel[provider]).join(\", \")}`,\n );\n }\n\n if (providersToRender.length === 0) {\n throw new Error(\n \"No usage data found for Claude code, Codex, or Open code.\",\n );\n }\n\n return providersToRender.map((provider) => rowsByProvider[provider]!);\n}\n\nfunction printRunSummary(\n outputPath: string,\n format: OutputFormat,\n colorMode: ColorMode,\n startDate: Date,\n endDate: Date,\n rendered: ProviderId[],\n) {\n process.stdout.write(\n `${JSON.stringify(\n {\n output: outputPath,\n format,\n colorMode,\n startDate: formatLocalDate(startDate),\n endDate: formatLocalDate(endDate),\n rendered,\n },\n null,\n 2,\n )}\\n`,\n );\n}\n\nasync function main() {\n let spinner: Ora | undefined;\n\n const parsed = parseArgs({\n options: {\n output: { type: \"string\", short: \"o\" },\n format: { type: \"string\", short: \"f\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n dark: { type: \"boolean\", default: false },\n claude: { type: \"boolean\", default: false },\n codex: { type: \"boolean\", default: false },\n opencode: { type: \"boolean\", default: false },\n },\n allowPositionals: false,\n });\n\n validateArgs(parsed.values);\n\n const { values } = parsed;\n\n if (values.help) {\n printHelp();\n\n return;\n }\n\n try {\n spinner = ora({\n text: \"Analyzing usage data...\",\n spinner: \"dots\",\n }).start();\n\n const { start, end } = getDateWindow();\n const colorMode: ColorMode = values.dark ? \"dark\" : \"light\";\n const format = inferFormat(values.format, values.output);\n const requestedProviders = getRequestedProviders(values);\n const inspectedProviders =\n requestedProviders.length > 0 ? requestedProviders : providerIds;\n const rowsByProvider = await aggregateUsage({\n start,\n end,\n providers: inspectedProviders,\n });\n\n spinner.stop();\n printProviderAvailability(rowsByProvider, inspectedProviders);\n\n const exportProviders = selectProvidersToRender(\n rowsByProvider,\n requestedProviders,\n );\n\n const outputPath = resolve(\n values.output ?? `./heatmap-last-year.${format}`,\n );\n\n mkdirSync(dirname(outputPath), { recursive: true });\n\n if (format === \"json\") {\n spinner.start(\"Preparing JSON export...\");\n\n const payload: JsonExportPayload = {\n version: JSON_EXPORT_VERSION,\n start: formatLocalDate(start),\n end: formatLocalDate(end),\n providers: exportProviders.map((provider) =>\n toJsonUsageSummary(provider),\n ),\n };\n\n spinner.text = \"Writing output file...\";\n writeOutputJson(outputPath, payload);\n } else {\n spinner.start(\"Rendering heatmaps...\");\n\n const svg = renderUsageHeatmapsSvg({\n startDate: start,\n endDate: end,\n colorMode,\n sections: exportProviders.map(({ provider, daily, insights }) => ({\n daily,\n insights,\n title: heatmapThemes[provider].title,\n colors: heatmapThemes[provider].colors,\n })),\n });\n const background = colorMode === \"dark\" ? \"#171717\" : \"#ffffff\";\n\n spinner.text = \"Writing output file...\";\n await writeOutputImage(outputPath, format, svg, background);\n }\n\n spinner.succeed(\"Analysis complete\");\n\n printRunSummary(\n outputPath,\n format,\n colorMode,\n start,\n end,\n exportProviders.map(({ provider }) => provider),\n );\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (spinner) {\n spinner.fail(`Failed: ${message}`);\n } else {\n process.stderr.write(`${message}\\n`);\n }\n\n process.exitCode = 1;\n }\n}\n\nvoid main();\n",null,null,null,null,null,null,"import { createReadStream } from \"node:fs\";\nimport { readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { createInterface } from \"node:readline\";\nimport type { DailyUsage, Insights, ModelUsage, UsageSummary } from \"../interfaces\";\n\nexport function formatLocalDate(date: Date) {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, \"0\");\n const d = String(date.getDate()).padStart(2, \"0\");\n\n return `${y}-${m}-${d}`;\n}\n\nexport interface DailyTokenTotals {\n input: number;\n output: number;\n cache: { input: number; output: number };\n total: number;\n}\n\nexport interface ModelTokenTotals {\n input: number;\n output: number;\n cache: { input: number; output: number };\n total: number;\n}\n\ninterface TokenTotals {\n tokens: DailyTokenTotals;\n models: Map<string, ModelTokenTotals>;\n}\n\nexport type DailyTotalsByDate = Map<string, TokenTotals>;\n\nconst ONE_DAY_MS = 24 * 60 * 60 * 1000;\n\nfunction cloneTokenTotals(\n totals: DailyTokenTotals | ModelTokenTotals,\n): ModelTokenTotals {\n return {\n input: totals.input,\n output: totals.output,\n cache: { input: totals.cache.input, output: totals.cache.output },\n total: totals.total,\n };\n}\n\nfunction mergeTokenTotals(\n target: DailyTokenTotals | ModelTokenTotals,\n source: DailyTokenTotals | ModelTokenTotals,\n) {\n target.input += source.input;\n target.output += source.output;\n target.cache.input += source.cache.input;\n target.cache.output += source.cache.output;\n target.total += source.total;\n}\n\nexport function addModelTokenTotals(\n modelTotals: Map<string, ModelTokenTotals>,\n modelName: string,\n tokenTotals: DailyTokenTotals | ModelTokenTotals,\n) {\n const existing = modelTotals.get(modelName);\n\n if (!existing) {\n modelTotals.set(modelName, cloneTokenTotals(tokenTotals));\n\n return;\n }\n\n mergeTokenTotals(existing, tokenTotals);\n}\n\nexport function addDailyTokenTotals(\n totals: DailyTotalsByDate,\n date: Date,\n tokenTotals: DailyTokenTotals,\n modelName?: string,\n) {\n const key = formatLocalDate(date);\n const existing = totals.get(key);\n\n if (!existing) {\n const models = new Map<string, ModelTokenTotals>();\n\n if (modelName) {\n models.set(modelName, cloneTokenTotals(tokenTotals));\n }\n totals.set(key, { tokens: cloneTokenTotals(tokenTotals), models });\n\n return;\n }\n\n mergeTokenTotals(existing.tokens, tokenTotals);\n\n if (modelName) {\n addModelTokenTotals(existing.models, modelName, tokenTotals);\n }\n}\n\nexport function totalsToRows(totals: DailyTotalsByDate): DailyUsage[] {\n return [...totals.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([date, { tokens, models }]) => ({\n date: new Date(`${date}T00:00:00`),\n input: tokens.input,\n output: tokens.output,\n cache: { input: tokens.cache.input, output: tokens.cache.output },\n total: tokens.total,\n breakdown: [...models.entries()]\n .sort(([, a], [, b]) => b.total - a.total)\n .map(([name, t]) => ({\n name,\n tokens: {\n input: t.input,\n output: t.output,\n cache: { input: t.cache.input, output: t.cache.output },\n total: t.total,\n },\n })),\n }));\n}\n\nexport async function listFilesRecursive(rootDir: string, extension: string) {\n const files: string[] = [];\n const stack = [rootDir];\n\n while (stack.length > 0) {\n const currentDir = stack.pop()!;\n\n let entries;\n\n try {\n entries = await readdir(currentDir, {\n withFileTypes: true,\n encoding: \"utf8\",\n });\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n const fullPath = join(currentDir, entry.name);\n\n if (entry.isDirectory()) {\n stack.push(fullPath);\n continue;\n }\n\n if (entry.isFile() && fullPath.endsWith(extension)) {\n files.push(fullPath);\n }\n }\n }\n\n return files;\n}\n\nexport async function forEachJsonLine<T>(\n filePath: string,\n onLine: (value: T) => void | Promise<void>,\n) {\n const readline = createInterface({\n input: createReadStream(filePath, { encoding: \"utf8\" }),\n crlfDelay: Number.POSITIVE_INFINITY,\n });\n\n try {\n for await (const line of readline) {\n const trimmed = line.trim();\n\n if (trimmed === \"\") {\n continue;\n }\n\n await onLine(JSON.parse(trimmed) as T);\n }\n } finally {\n readline.close();\n }\n}\n\nexport function getRecentWindowStart(endDate: Date, days = 30) {\n const start = new Date(endDate);\n\n start.setDate(start.getDate() - (days - 1));\n start.setHours(0, 0, 0, 0);\n\n return start;\n}\n\nexport function normalizeModelName(modelName: string) {\n return modelName.replace(/-\\d{8}$/, \"\");\n}\n\nexport function getTopModel(\n modelTotals: Map<string, ModelTokenTotals>,\n): ModelUsage | undefined {\n let bestModel: string | undefined;\n let bestTotals: ModelTokenTotals | undefined;\n\n for (const [modelName, totals] of modelTotals) {\n if (!bestTotals || totals.total > bestTotals.total) {\n bestModel = modelName;\n bestTotals = totals;\n }\n }\n\n if (!bestTotals || bestTotals.total <= 0) {\n return undefined;\n }\n\n return {\n name: bestModel!,\n tokens: {\n input: bestTotals.input,\n output: bestTotals.output,\n cache: { input: bestTotals.cache.input, output: bestTotals.cache.output },\n total: bestTotals.total,\n },\n };\n}\n\nfunction startOfDay(date: Date) {\n const day = new Date(date);\n\n day.setHours(0, 0, 0, 0);\n\n return day;\n}\n\nfunction isConsecutiveDay(prevDate: Date, currDate: Date): boolean {\n const prev = startOfDay(prevDate);\n const curr = startOfDay(currDate);\n const diff = curr.getTime() - prev.getTime();\n\n return diff === ONE_DAY_MS;\n}\n\nexport function computeLongestStreak(daily: DailyUsage[]): number {\n if (daily.length === 0) {\n return 0;\n }\n\n let longest = 1;\n let running = 1;\n\n for (let i = 1; i < daily.length; i += 1) {\n if (isConsecutiveDay(daily[i - 1].date, daily[i].date)) {\n running += 1;\n if (running > longest) {\n longest = running;\n }\n } else {\n running = 1;\n }\n }\n\n return longest;\n}\n\nexport function computeCurrentStreak(daily: DailyUsage[], end: Date): number {\n if (daily.length === 0) {\n return 0;\n }\n\n const endDay = startOfDay(end);\n const lastEntry = daily[daily.length - 1];\n const lastEntryDay = startOfDay(lastEntry.date);\n\n // If the last active day isn't the end date, check if it's consecutive\n if (\n lastEntryDay.getTime() !== endDay.getTime() &&\n !isConsecutiveDay(lastEntryDay, endDay)\n ) {\n return 0;\n }\n\n let current = 1;\n\n for (let i = daily.length - 2; i >= 0; i -= 1) {\n if (!isConsecutiveDay(daily[i].date, daily[i + 1].date)) {\n break;\n }\n current += 1;\n }\n\n return current;\n}\n\nexport function getProviderInsights(\n modelTotals: Map<string, ModelTokenTotals>,\n recentModelTotals: Map<string, ModelTokenTotals>,\n daily: DailyUsage[],\n end: Date,\n): Insights {\n const mostUsedModel = getTopModel(modelTotals);\n const recentMostUsedModel = getTopModel(recentModelTotals);\n\n return {\n mostUsedModel,\n recentMostUsedModel,\n streaks: {\n longest: computeLongestStreak(daily),\n current: computeCurrentStreak(daily, end),\n },\n };\n}\n\nexport function createUsageSummary(\n provider: UsageSummary[\"provider\"],\n totals: DailyTotalsByDate,\n modelTotals: Map<string, ModelTokenTotals>,\n recentModelTotals: Map<string, ModelTokenTotals>,\n end: Date,\n): UsageSummary {\n const daily = totalsToRows(totals);\n\n return {\n provider,\n daily,\n insights: getProviderInsights(modelTotals, recentModelTotals, daily, end),\n };\n}\n\nexport function hasUsage(summary: UsageSummary) {\n return summary.daily.some((row) => row.total > 0);\n}\n","import svgBuilder, { type SVGBuilderInstance } from \"svg-builder\";\nimport type { DailyUsage, Insights, ModelUsage } from \"./interfaces\";\nimport type { ProviderId } from \"./lib/interfaces\";\nimport { formatLocalDate } from \"./lib/utils\";\n\ninterface HeatmapTheme {\n title: string;\n colors: {\n light: string[];\n dark: string[];\n };\n}\n\nexport type ColorMode = \"light\" | \"dark\";\n\ninterface CalendarGrid {\n weeks: (string | null)[][];\n monthLabels: (string | null)[];\n}\n\ninterface SectionLayout {\n width: number;\n height: number;\n gridTop: number;\n leftLabelWidth: number;\n cellSize: number;\n gap: number;\n headerCaptionY: number;\n headerValueY: number;\n titleY: number;\n monthLabelY: number;\n legendY: number;\n footerCaptionY: number;\n footerValueY: number;\n}\n\ninterface DrawHeatmapSectionOptions {\n x: number;\n y: number;\n grid: CalendarGrid;\n layout: SectionLayout;\n daily: DailyUsage[];\n insights?: Insights;\n title: string;\n colors: HeatmapTheme[\"colors\"];\n colorMode: ColorMode;\n palette: SurfacePalette;\n}\n\ninterface RenderUsageHeatmapsSvgSection {\n daily: DailyUsage[];\n insights?: Insights;\n title: string;\n colors: HeatmapTheme[\"colors\"];\n}\n\ninterface ModelUsageRow {\n caption: string;\n data: ModelUsage;\n}\n\ninterface RenderUsageHeatmapsSvgOptions {\n startDate: Date;\n endDate: Date;\n sections: RenderUsageHeatmapsSvgSection[];\n colorMode: ColorMode;\n}\n\ninterface SurfacePalette {\n background: string;\n text: string;\n muted: string;\n}\n\nexport const heatmapThemes: Record<ProviderId, HeatmapTheme> = {\n claude: {\n title: \"Claude Code\",\n colors: {\n light: [\n \"#fff7ed\", // orange-50\n \"#fed7aa\", // orange-200\n \"#fdba74\", // orange-300\n \"#f97316\", // orange-500\n \"#c2410c\", // orange-700\n ],\n dark: [\n \"#292524\", // stone-800\n \"#9a3412\", // orange-800\n \"#c2410c\", // orange-700\n \"#f97316\", // orange-500\n \"#fdba74\", // orange-300\n ],\n },\n },\n codex: {\n title: \"Codex\",\n colors: {\n light: [\n \"#e0e7ff\", // indigo-100\n \"#a5b4fc\", // indigo-300\n \"#818cf8\", // indigo-400\n \"#4f46e5\", // indigo-600\n \"#312e81\", // indigo-900\n ],\n dark: [\n \"#1e1b4b\", // indigo-950\n \"#312e81\", // indigo-900\n \"#4338ca\", // indigo-700\n \"#818cf8\", // indigo-400\n \"#c7d2fe\", // indigo-200\n ],\n },\n },\n opencode: {\n title: \"Open Code\",\n colors: {\n light: [\n \"#f5f5f5\", // neutral-100\n \"#d4d4d4\", // neutral-300\n \"#a3a3a3\", // neutral-400\n \"#525252\", // neutral-600\n \"#171717\", // neutral-900\n ],\n dark: [\n \"#262626\", // neutral-800\n \"#525252\", // neutral-600\n \"#737373\", // neutral-500\n \"#a3a3a3\", // neutral-400\n \"#fafafa\", // neutral-50\n ],\n },\n },\n};\n\nconst daysOfWeekMonday = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\nconst numberFormatter = new Intl.NumberFormat(\"en-US\");\nconst fontFamily =\n \"ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, sans-serif\";\nconst providerTitleFontSize = 20;\nconst metricCaptionFontSize = 9;\nconst metricValueFontSize = 14;\nconst captionValueGap = 4;\n\nconst surfacePalettes: Record<ColorMode, SurfacePalette> = {\n light: {\n background: \"#ffffff\",\n text: \"#0f172a\",\n muted: \"#737373\",\n },\n dark: {\n background: \"#171717\",\n text: \"#fafafa\",\n muted: \"#a3a3a3\",\n },\n};\n\nfunction formatTokenTotal(value: number) {\n const units = [\n { size: 1_000_000_000_000, suffix: \"T\" },\n { size: 1_000_000_000, suffix: \"B\" },\n { size: 1_000_000, suffix: \"M\" },\n { size: 1_000, suffix: \"K\" },\n ];\n\n for (const unit of units) {\n if (value >= unit.size) {\n const scaled = value / unit.size;\n const precision = scaled >= 100 ? 0 : scaled >= 10 ? 1 : 2;\n const compact = scaled\n .toFixed(precision)\n .replace(/\\.0+$/, \"\")\n .replace(/(\\.\\d*[1-9])0+$/, \"$1\");\n\n return `${compact}${unit.suffix}`;\n }\n }\n\n return numberFormatter.format(value);\n}\n\nfunction truncateText(value: string, maxLength: number) {\n if (value.length <= maxLength) {\n return value;\n }\n\n return `${value.slice(0, Math.max(maxLength - 3, 1))}...`;\n}\n\nfunction escapeXml(value: string) {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\");\n}\n\nfunction caption(value: string) {\n return value.toUpperCase();\n}\n\nfunction getAllDays(start: Date, end: Date) {\n const days: string[] = [];\n const curr = new Date(start);\n\n while (curr <= end) {\n days.push(formatLocalDate(curr));\n curr.setDate(curr.getDate() + 1);\n }\n\n return days;\n}\n\nfunction getMondayBasedWeekday(dateIso: string) {\n const sundayBased = new Date(`${dateIso}T00:00:00`).getDay();\n\n return (sundayBased + 6) % 7;\n}\n\nfunction padToWeekStartMonday(days: string[]) {\n const firstDay = getMondayBasedWeekday(days[0]);\n const padding = new Array(firstDay).fill(null);\n\n return [...padding, ...days];\n}\n\nfunction chunkByWeek(days: (string | null)[]): (string | null)[][] {\n const weeks: (string | null)[][] = [];\n\n for (let i = 0; i < days.length; i += 7) {\n weeks.push(days.slice(i, i + 7));\n }\n\n return weeks;\n}\n\nfunction getMonthLabel(week: (string | null)[]) {\n const lastDay = [...week].reverse().find(Boolean);\n\n if (!lastDay) {\n return null;\n }\n\n return new Date(`${lastDay}T00:00:00`).toLocaleString(\"en-US\", {\n month: \"short\",\n });\n}\n\nfunction defaultColourMap(value: number, max: number, colorCount: number) {\n if (max <= 0 || value <= 0) {\n return 0;\n }\n\n const index = Math.ceil((value / max) * (colorCount - 1));\n\n return Math.min(Math.max(index, 0), colorCount - 1);\n}\n\nfunction getCalendarGrid(startDate: Date, endDate: Date) {\n const allDays = getAllDays(startDate, endDate);\n const paddedDays = padToWeekStartMonday(allDays);\n const weeks = chunkByWeek(paddedDays);\n\n const monthLabels = weeks.map((week, i) => {\n const label = getMonthLabel(week);\n const prevLabel = i > 0 ? getMonthLabel(weeks[i - 1]) : null;\n\n return label !== prevLabel ? label : null;\n });\n\n return { weeks, monthLabels };\n}\n\nfunction getSectionLayout(weekCount: number) {\n const cellSize = 11;\n const gap = 2;\n const leftLabelWidth = 34;\n const rightPadding = 20;\n const headerCaptionY = 0;\n const headerValueY =\n headerCaptionY + metricCaptionFontSize + captionValueGap;\n const topMetricHeight = headerValueY + metricValueFontSize;\n const topPadding = Math.max(providerTitleFontSize, topMetricHeight) + 20;\n const monthHeaderHeight = 20;\n const titleY = 0;\n const monthLabelY = topPadding + 4;\n const gridTop = topPadding + monthHeaderHeight;\n const gridHeight = 7 * cellSize + 6 * gap;\n const gridWidth = weekCount * cellSize + Math.max(weekCount - 1, 0) * gap;\n const legendY = gridTop + gridHeight + 28;\n const legendBottomY = legendY + cellSize;\n const footerTopPadding = 32;\n const footerCaptionY = legendBottomY + footerTopPadding;\n const footerValueY =\n footerCaptionY + metricCaptionFontSize + captionValueGap;\n const statsBottomPadding = 12;\n const width = leftLabelWidth + gridWidth + rightPadding;\n const height = footerValueY + metricValueFontSize + statsBottomPadding;\n\n return {\n width,\n height,\n gridTop,\n leftLabelWidth,\n cellSize,\n gap,\n headerCaptionY,\n headerValueY,\n titleY,\n monthLabelY,\n legendY,\n footerCaptionY,\n footerValueY,\n };\n}\n\nfunction drawHeatmapSection(\n svg: SVGBuilderInstance,\n {\n x,\n y,\n grid,\n layout,\n daily,\n insights,\n title,\n colors,\n colorMode,\n palette,\n }: DrawHeatmapSectionOptions,\n) {\n const colorsForMode = colors[colorMode];\n const valueByDate = new Map<string, number>();\n const rightEdge = x + layout.width - 8;\n const leftColumnX = x + 8;\n let maxValue = 0;\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalTokens = 0;\n\n for (const row of daily) {\n valueByDate.set(formatLocalDate(row.date), row.total);\n maxValue = Math.max(maxValue, row.total);\n totalInputTokens += row.input;\n totalOutputTokens += row.output;\n totalTokens += row.total;\n }\n\n const topMetricGap = 120;\n const headerLast30DaysX = rightEdge - topMetricGap * 3;\n const headerInputX = rightEdge - topMetricGap * 2;\n const headerOutputX = rightEdge - topMetricGap;\n const totalTokensLabel = formatTokenTotal(totalTokens);\n const totalInputLabel = formatTokenTotal(totalInputTokens);\n const totalOutputLabel = formatTokenTotal(totalOutputTokens);\n const longestStreak = insights?.streaks.longest ?? 0;\n const currentStreak = insights?.streaks.current ?? 0;\n\n svg = svg.text(\n {\n x: leftColumnX,\n y: y + layout.titleY,\n fill: palette.text,\n \"font-size\": providerTitleFontSize,\n \"font-weight\": 600,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n title,\n );\n\n svg = svg.text(\n {\n x: headerInputX,\n y: y + layout.headerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Input tokens\"),\n );\n\n svg = svg.text(\n {\n x: headerInputX,\n y: y + layout.headerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n totalInputLabel,\n );\n\n svg = svg.text(\n {\n x: headerOutputX,\n y: y + layout.headerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Output tokens\"),\n );\n\n svg = svg.text(\n {\n x: headerOutputX,\n y: y + layout.headerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n totalOutputLabel,\n );\n\n svg = svg.text(\n {\n x: rightEdge,\n y: y + layout.headerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Total tokens\"),\n );\n\n svg = svg.text(\n {\n x: rightEdge,\n y: y + layout.headerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n totalTokensLabel,\n );\n\n for (let i = 0; i < 7; i += 1) {\n const dayY =\n y +\n layout.gridTop +\n i * (layout.cellSize + layout.gap) +\n layout.cellSize / 2;\n\n const dayLabel = i === 0 || i === 6 ? daysOfWeekMonday[i] : \"\";\n\n svg = svg.text(\n {\n x: x + layout.leftLabelWidth - 6,\n y: dayY,\n fill: palette.muted,\n \"font-size\": 10,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"middle\",\n \"font-family\": fontFamily,\n },\n dayLabel,\n );\n }\n\n for (let weekIndex = 0; weekIndex < grid.weeks.length; weekIndex += 1) {\n const monthLabel = grid.monthLabels[weekIndex];\n\n if (monthLabel) {\n const monthX =\n x + layout.leftLabelWidth + weekIndex * (layout.cellSize + layout.gap);\n\n svg = svg.text(\n {\n x: monthX,\n y: y + layout.monthLabelY,\n fill: palette.muted,\n \"font-size\": 10,\n \"font-family\": fontFamily,\n },\n monthLabel,\n );\n }\n\n const week = grid.weeks[weekIndex];\n\n for (let dayIndex = 0; dayIndex < week.length; dayIndex += 1) {\n const day = week[dayIndex];\n\n if (!day) {\n continue;\n }\n\n const value = valueByDate.get(day) ?? 0;\n const colorIndex = defaultColourMap(\n value,\n maxValue,\n colorsForMode.length,\n );\n const fill = colorsForMode[colorIndex];\n\n const dayX =\n x + layout.leftLabelWidth + weekIndex * (layout.cellSize + layout.gap);\n const dayY =\n y + layout.gridTop + dayIndex * (layout.cellSize + layout.gap);\n\n svg = svg.rect({\n x: dayX,\n y: dayY,\n width: layout.cellSize,\n height: layout.cellSize,\n rx: 3,\n ry: 3,\n fill,\n });\n }\n }\n\n const legendStartX = x + layout.leftLabelWidth;\n const legendY = y + layout.legendY;\n\n svg = svg.text(\n {\n x: legendStartX,\n y: legendY + 10,\n fill: palette.muted,\n \"font-size\": 10,\n \"font-weight\": 600,\n \"font-family\": fontFamily,\n },\n caption(\"Less\"),\n );\n\n for (let i = 0; i < colorsForMode.length; i += 1) {\n const legendX = legendStartX + 28 + i * (layout.cellSize + 3);\n\n svg = svg.rect({\n x: legendX,\n y: legendY,\n width: layout.cellSize,\n height: layout.cellSize,\n rx: 3,\n ry: 3,\n fill: colorsForMode[i],\n });\n }\n\n svg = svg.text(\n {\n x: legendStartX + 28 + colorsForMode.length * (layout.cellSize + 3) + 6,\n y: legendY + 10,\n fill: palette.muted,\n \"font-size\": 10,\n \"font-weight\": 600,\n \"font-family\": fontFamily,\n },\n caption(\"More\"),\n );\n\n const rightColumnX = rightEdge;\n const leftSecondaryX = leftColumnX + 250;\n const rightPrimaryX = rightColumnX - 160;\n\n const leftRows: ModelUsageRow[] = [];\n\n if (insights?.mostUsedModel) {\n leftRows.push({ caption: \"Most used model\", data: insights.mostUsedModel });\n }\n\n if (insights?.recentMostUsedModel) {\n leftRows.push({\n caption: \"Recent use (last 30 days)\",\n data: insights.recentMostUsedModel,\n });\n }\n\n for (const [index, row] of leftRows.entries()) {\n const captionY = layout.footerCaptionY;\n const valueY = layout.footerValueY;\n const modelName = truncateText(row.data.name, 20);\n const modelX = index === 0 ? leftColumnX : leftSecondaryX;\n const tokenLabel = `(${formatTokenTotal(row.data.tokens.total)})`;\n\n svg = svg.text(\n {\n x: modelX,\n y: y + captionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(row.caption),\n );\n\n svg = svg.text(\n {\n x: modelX,\n y: y + valueY,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `<tspan fill=\"${palette.text}\" font-size=\"${metricValueFontSize}\" font-weight=\"600\">${escapeXml(modelName)}</tspan><tspan dx=\"6\" fill=\"${palette.muted}\" font-size=\"${metricValueFontSize}\" font-weight=\"400\">${tokenLabel}</tspan>`,\n );\n }\n\n svg = svg.text(\n {\n x: rightPrimaryX,\n y: y + layout.footerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Longest streak\"),\n );\n\n svg = svg.text(\n {\n x: rightPrimaryX,\n y: y + layout.footerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `${numberFormatter.format(longestStreak)} days`,\n );\n\n svg = svg.text(\n {\n x: rightColumnX,\n y: y + layout.footerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Current streak\"),\n );\n\n svg = svg.text(\n {\n x: rightColumnX,\n y: y + layout.footerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `${numberFormatter.format(currentStreak)} days`,\n );\n\n return svg;\n}\n\nexport function renderUsageHeatmapsSvg({\n startDate,\n endDate,\n sections,\n colorMode,\n}: RenderUsageHeatmapsSvgOptions) {\n const grid = getCalendarGrid(startDate, endDate);\n const layout = getSectionLayout(grid.weeks.length);\n const palette = surfacePalettes[colorMode];\n const horizontalPadding = 18;\n const topPadding = 30;\n const bottomPadding = 18;\n const sectionGap = 40;\n\n const width = horizontalPadding * 2 + layout.width;\n const height =\n topPadding +\n bottomPadding +\n sections.length * layout.height +\n Math.max(sections.length - 1, 0) * sectionGap;\n\n let svg = svgBuilder\n .create()\n .width(width)\n .height(height)\n .viewBox(`0 0 ${width} ${height}`)\n .rect({\n x: -2,\n y: -2,\n width: width + 4,\n height: height + 4,\n fill: palette.background,\n });\n\n sections.forEach((section, index) => {\n const sectionY = topPadding + index * (layout.height + sectionGap);\n\n svg = drawHeatmapSection(svg, {\n x: horizontalPadding,\n y: sectionY,\n grid,\n layout,\n daily: section.daily,\n insights: section.insights,\n title: section.title,\n colors: section.colors,\n colorMode,\n palette,\n });\n });\n\n return svg.render();\n}\n","import { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n forEachJsonLine,\n getRecentWindowStart,\n listFilesRecursive,\n normalizeModelName,\n} from \"./utils\";\n\nconst CLAUDE_CONFIG_DIR_ENV = \"CLAUDE_CONFIG_DIR\";\nconst CLAUDE_PROJECTS_DIR_NAME = \"projects\";\n\ninterface ClaudeUsagePayload {\n input_tokens?: number;\n output_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n}\n\ninterface ClaudeRawLogEntry {\n timestamp?: string;\n requestId?: string;\n message?: {\n usage?: ClaudeUsagePayload;\n model?: string;\n id?: string;\n };\n}\n\ninterface ClaudeLogEntry {\n timestamp: string;\n usage: ClaudeUsagePayload;\n model?: string;\n messageId?: string;\n requestId?: string;\n}\n\nfunction getClaudeConfigPaths() {\n const envPaths = (process.env[CLAUDE_CONFIG_DIR_ENV] ?? \"\").trim();\n\n if (envPaths !== \"\") {\n return envPaths\n .split(\",\")\n .map((path) => path.trim())\n .filter((path) => path !== \"\")\n .map((path) => resolve(path));\n }\n\n const xdgConfigHome =\n process.env.XDG_CONFIG_HOME?.trim() || join(homedir(), \".config\");\n\n return [join(xdgConfigHome, \"claude\"), join(homedir(), \".claude\")];\n}\n\nfunction getClaudeProjectDirs() {\n const unique = new Set<string>();\n const dirs: string[] = [];\n\n for (const basePath of getClaudeConfigPaths()) {\n const projectsDir = join(basePath, CLAUDE_PROJECTS_DIR_NAME);\n\n if (existsSync(projectsDir) && !unique.has(projectsDir)) {\n unique.add(projectsDir);\n dirs.push(projectsDir);\n }\n }\n\n return dirs;\n}\n\nfunction parseClaudeLogEntry(entry: ClaudeRawLogEntry): ClaudeLogEntry | null {\n if (!entry.timestamp || !entry.message?.usage) {\n return null;\n }\n\n return {\n timestamp: entry.timestamp,\n usage: entry.message.usage,\n model: entry.message.model,\n messageId: entry.message.id,\n requestId: entry.requestId,\n };\n}\n\nfunction createClaudeTokenTotals(usage: ClaudeUsagePayload): DailyTokenTotals {\n const cacheReadInput = usage.cache_read_input_tokens ?? 0;\n const cacheCreationInput = usage.cache_creation_input_tokens ?? 0;\n const input = (usage.input_tokens ?? 0) + cacheReadInput;\n const output = (usage.output_tokens ?? 0) + cacheCreationInput;\n\n return {\n input,\n output,\n cache: { input: cacheReadInput, output: cacheCreationInput },\n total: input + output,\n };\n}\n\nasync function getClaudeFiles() {\n const projectDirs = getClaudeProjectDirs();\n const files = (\n await Promise.all(\n projectDirs.map((projectDir) => listFilesRecursive(projectDir, \".jsonl\")),\n )\n ).flat();\n\n return files;\n}\n\nfunction createUniqueHash(messageId?: string, requestId?: string) {\n if (!messageId || !requestId) {\n return null;\n }\n\n return `${messageId}:${requestId}`;\n}\n\nexport async function loadClaudeRows(\n startDate: Date,\n endDate: Date,\n): Promise<UsageSummary> {\n const files = await getClaudeFiles();\n const totals: DailyTotalsByDate = new Map();\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n const recentStart = getRecentWindowStart(endDate, 30);\n const processedHashes = new Set<string>();\n\n for (const file of files) {\n await forEachJsonLine<ClaudeRawLogEntry>(file, async (line) => {\n const entry = parseClaudeLogEntry(line);\n\n if (!entry) {\n return;\n }\n\n const uniqueHash = createUniqueHash(entry.messageId, entry.requestId);\n\n if (uniqueHash && processedHashes.has(uniqueHash)) {\n return;\n }\n\n if (uniqueHash) {\n processedHashes.add(uniqueHash);\n }\n\n const timestamp = new Date(entry.timestamp);\n\n if (timestamp < startDate || timestamp > endDate) {\n return;\n }\n\n const tokenTotals = createClaudeTokenTotals(entry.usage);\n\n if (tokenTotals.total <= 0) {\n return;\n }\n\n const modelName =\n entry.model && entry.model !== \"<synthetic>\"\n ? normalizeModelName(entry.model)\n : undefined;\n\n addDailyTokenTotals(totals, timestamp, tokenTotals, modelName);\n\n if (!modelName) {\n return;\n }\n\n addModelTokenTotals(modelTotals, modelName, tokenTotals);\n\n if (timestamp >= recentStart) {\n addModelTokenTotals(recentModelTotals, modelName, tokenTotals);\n }\n });\n }\n\n return createUsageSummary(\n \"claude\",\n totals,\n modelTotals,\n recentModelTotals,\n endDate,\n );\n}\n","import { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n forEachJsonLine,\n getRecentWindowStart,\n listFilesRecursive,\n normalizeModelName,\n} from \"./utils\";\n\ninterface CodexRawUsage {\n input_tokens?: number;\n cached_input_tokens?: number;\n cache_read_input_tokens?: number;\n output_tokens?: number;\n reasoning_output_tokens?: number;\n total_tokens?: number;\n}\n\ninterface CodexEventInfo {\n model?: string;\n model_name?: string;\n metadata?: { model?: string };\n last_token_usage?: CodexRawUsage;\n total_token_usage?: CodexRawUsage;\n}\n\ninterface CodexEventPayload {\n type?: string;\n info?: CodexEventInfo;\n model?: string;\n model_name?: string;\n metadata?: { model?: string };\n}\n\ninterface CodexEventEntry {\n type?: string;\n timestamp: string;\n payload?: CodexEventPayload;\n}\n\ninterface CodexNormalizedUsage {\n input_tokens: number;\n cached_input_tokens: number;\n output_tokens: number;\n reasoning_output_tokens: number;\n total_tokens: number;\n}\n\nfunction normalizeCodexUsage(value?: CodexRawUsage) {\n if (!value) {\n return null;\n }\n\n const input = value.input_tokens ?? 0;\n const cached =\n value.cached_input_tokens ?? value.cache_read_input_tokens ?? 0;\n const output = value.output_tokens ?? 0;\n const reasoning = value.reasoning_output_tokens ?? 0;\n const total = value.total_tokens ?? 0;\n\n return {\n input_tokens: input,\n cached_input_tokens: cached,\n output_tokens: output,\n reasoning_output_tokens: reasoning,\n total_tokens: total > 0 ? total : input + output,\n };\n}\n\nfunction subtractCodexUsage(\n current: CodexNormalizedUsage,\n previous: CodexNormalizedUsage | null,\n) {\n return {\n input_tokens: Math.max(\n current.input_tokens - (previous?.input_tokens ?? 0),\n 0,\n ),\n cached_input_tokens: Math.max(\n current.cached_input_tokens - (previous?.cached_input_tokens ?? 0),\n 0,\n ),\n output_tokens: Math.max(\n current.output_tokens - (previous?.output_tokens ?? 0),\n 0,\n ),\n reasoning_output_tokens: Math.max(\n current.reasoning_output_tokens -\n (previous?.reasoning_output_tokens ?? 0),\n 0,\n ),\n total_tokens: Math.max(\n current.total_tokens - (previous?.total_tokens ?? 0),\n 0,\n ),\n };\n}\n\nfunction asNonEmptyString(value?: string) {\n const trimmed = value?.trim();\n\n return trimmed === \"\" ? undefined : trimmed;\n}\n\nfunction extractCodexModel(payload?: CodexEventPayload) {\n const directModel =\n asNonEmptyString(payload?.model) ?? asNonEmptyString(payload?.model_name);\n\n if (directModel) {\n return directModel;\n }\n\n if (payload?.info) {\n const infoModel =\n asNonEmptyString(payload.info.model) ??\n asNonEmptyString(payload.info.model_name);\n\n if (infoModel) {\n return infoModel;\n }\n\n if (payload.info.metadata) {\n const model = asNonEmptyString(payload.info.metadata.model);\n\n if (model) {\n return model;\n }\n }\n }\n\n if (payload?.metadata) {\n return asNonEmptyString(payload.metadata.model);\n }\n\n return undefined;\n}\n\nasync function getCodexFiles() {\n const codexHome = process.env.CODEX_HOME?.trim()\n ? resolve(process.env.CODEX_HOME)\n : join(homedir(), \".codex\");\n\n const sessionsDir = join(codexHome, \"sessions\");\n\n const files = await listFilesRecursive(sessionsDir, \".jsonl\");\n\n return files;\n}\n\nexport async function loadCodexRows(\n start: Date,\n end: Date,\n): Promise<UsageSummary> {\n const files = await getCodexFiles();\n const totals: DailyTotalsByDate = new Map();\n const recentStart = getRecentWindowStart(end, 30);\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n\n for (const file of files) {\n let previousTotals: CodexNormalizedUsage | null = null;\n let currentModel: string | undefined;\n\n await forEachJsonLine<CodexEventEntry>(file, async (entry) => {\n const extractedModel = extractCodexModel(entry.payload);\n\n if (entry.type === \"turn_context\") {\n currentModel = extractedModel ?? currentModel;\n\n return;\n }\n\n if (entry.type !== \"event_msg\" || entry.payload?.type !== \"token_count\") {\n return;\n }\n\n const info = entry.payload.info;\n const lastUsage = normalizeCodexUsage(info?.last_token_usage);\n const totalUsage = normalizeCodexUsage(info?.total_token_usage);\n let rawUsage = lastUsage;\n\n if (!rawUsage && totalUsage) {\n rawUsage = subtractCodexUsage(totalUsage, previousTotals);\n }\n\n if (totalUsage) {\n previousTotals = totalUsage;\n }\n\n if (!rawUsage) {\n return;\n }\n\n const usage: DailyTokenTotals = {\n input: rawUsage.input_tokens,\n output: rawUsage.output_tokens,\n cache: { input: rawUsage.cached_input_tokens, output: 0 },\n total: rawUsage.total_tokens,\n };\n\n if (usage.total <= 0) {\n return;\n }\n\n const date = new Date(entry.timestamp);\n\n if (date < start || date > end) {\n return;\n }\n\n const modelName = extractedModel ?? currentModel;\n const normalizedModelName = modelName\n ? normalizeModelName(modelName)\n : undefined;\n\n addDailyTokenTotals(totals, date, usage, normalizedModelName);\n\n if (normalizedModelName) {\n addModelTokenTotals(modelTotals, normalizedModelName, usage);\n\n if (date >= recentStart) {\n addModelTokenTotals(recentModelTotals, normalizedModelName, usage);\n }\n }\n });\n }\n\n return createUsageSummary(\"codex\", totals, modelTotals, recentModelTotals, end);\n}\n","import type { UsageSummary } from \"../interfaces\";\n\nexport type ProviderId = UsageSummary[\"provider\"];\n\nexport const providerIds: ProviderId[] = [\"claude\", \"codex\", \"opencode\"];\n\nexport const providerStatusLabel: Record<ProviderId, string> = {\n claude: \"Claude code\",\n codex: \"Codex\",\n opencode: \"Open Code\",\n};\n","import { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n getRecentWindowStart,\n listFilesRecursive,\n normalizeModelName,\n} from \"./utils\";\n\ninterface OpenCodeTokenCache {\n read?: number;\n write?: number;\n}\n\ninterface OpenCodeTokens {\n input?: number;\n output?: number;\n cache?: OpenCodeTokenCache;\n}\n\ninterface OpenCodeMessage {\n id: string;\n providerID: string;\n modelID: string;\n time: { created: number };\n tokens?: OpenCodeTokens;\n}\n\nfunction sumOpenCodeTokens(tokens?: OpenCodeTokens): DailyTokenTotals {\n const cacheInput = tokens?.cache?.read ?? 0;\n const cacheOutput = tokens?.cache?.write ?? 0;\n const input = (tokens?.input ?? 0) + cacheInput;\n const output = (tokens?.output ?? 0) + cacheOutput;\n\n return {\n input,\n output,\n cache: { input: cacheInput, output: cacheOutput },\n total: input + output,\n };\n}\n\nasync function parseOpenCodeFile(filePath: string) {\n const content = await readFile(filePath, \"utf8\");\n\n return JSON.parse(content) as OpenCodeMessage;\n}\n\nasync function getOpenCodeFiles() {\n const baseDir = process.env.OPENCODE_DATA_DIR?.trim()\n ? resolve(process.env.OPENCODE_DATA_DIR)\n : join(homedir(), \".local\", \"share\", \"opencode\");\n\n const messagesDir = join(baseDir, \"storage\", \"message\");\n\n return listFilesRecursive(messagesDir, \".json\");\n}\n\nexport async function loadOpenCodeRows(\n start: Date,\n end: Date,\n): Promise<UsageSummary> {\n const files = await getOpenCodeFiles();\n const totals: DailyTotalsByDate = new Map();\n const dedupe = new Set<string>();\n const recentStart = getRecentWindowStart(end, 30);\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n\n for (const file of files) {\n const message = await parseOpenCodeFile(file);\n\n if (dedupe.has(message.id)) {\n continue;\n }\n\n dedupe.add(message.id);\n\n const tokenTotals = sumOpenCodeTokens(message.tokens);\n\n if (tokenTotals.total <= 0) {\n continue;\n }\n\n const date = new Date(message.time.created);\n\n if (date < start || date > end) {\n continue;\n }\n\n const modelName = normalizeModelName(message.modelID);\n\n addDailyTokenTotals(totals, date, tokenTotals, modelName);\n addModelTokenTotals(modelTotals, modelName, tokenTotals);\n\n if (date >= recentStart) {\n addModelTokenTotals(recentModelTotals, modelName, tokenTotals);\n }\n }\n\n return createUsageSummary(\n \"opencode\",\n totals,\n modelTotals,\n recentModelTotals,\n end,\n );\n}\n","import type { UsageSummary } from \"./interfaces\";\nimport { loadClaudeRows } from \"./lib/claude-code\";\nimport { loadCodexRows } from \"./lib/codex\";\nimport {\n providerIds,\n providerStatusLabel,\n type ProviderId,\n} from \"./lib/interfaces\";\nimport { loadOpenCodeRows } from \"./lib/open-code\";\nimport { hasUsage } from \"./lib/utils\";\n\nexport { providerIds, providerStatusLabel, type ProviderId };\n\ninterface AggregateUsageOptions {\n start: Date;\n end: Date;\n providers?: ProviderId[];\n}\n\nexport async function aggregateUsage({\n start,\n end,\n providers,\n}: AggregateUsageOptions): Promise<Record<ProviderId, UsageSummary | null>> {\n const requestedProviders = providers?.length ? providers : providerIds;\n const rowsByProvider: Record<ProviderId, UsageSummary | null> = {\n claude: null,\n codex: null,\n opencode: null,\n };\n\n for (const provider of requestedProviders) {\n const summary =\n provider === \"claude\"\n ? await loadClaudeRows(start, end)\n : provider === \"codex\"\n ? await loadCodexRows(start, end)\n : await loadOpenCodeRows(start, end);\n\n rowsByProvider[provider] = hasUsage(summary) ? summary : null;\n }\n\n return rowsByProvider;\n}\n"],"mappings":"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AC,MAAM,QAAQ,eAAe,GAAG;AACnC;IACF;AACA,oBAAgB,QAAQ,SAAU,SAAe;AAC/C,YAAM,OAAO,KAAK,eAAe,OAAO;AACxC,UAAI,KAAK,iBAAiB,QAAQ,IAAI,MAAM,IAAI;AAC9C,cAAM,IAAI,MAAM,KAAK,OAAO,qBAAqB,OAAO,YAAY;MACtE;IACF,EAAE,KAAK,IAAI,CAAC;EACd;EAEA,KAAM,OAAoC;AACxC,QAAI,UAAU,MAAM,KAAK,MACvB;AAEF,QAAK,OAAO;AACV,WAAK,QAAQ,OAAO;AAClB,cAAM,QAAQ,MAAM,IAAI;AACxB,YAAI,UAAU,QAAW;AACvB;QACF;AACA,mBAAW,MAAM,OAAO,OAAO,OAAO,KAAK,IAAI;MACjD;IACF;AACA,eAAW;AACX,SAAK,OAAO;EACd;;;;AC7KK,IAAM,gBAAgB;EAC3B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKK,IAAM,kBAAkB;EAC7B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKK,IAAM,4BAAoE;EAC/E,KAAK;IACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,iBAAiB;IACb;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,oBAAoB;IAChB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,iBAAiB;IACb;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,uBAAuB;IACnB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,eAAe;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,oBAAoB;IAChB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,qBAAqB;IACjB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,qBAAqB;IACjB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,eAAe;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,sBAAsB;IAClB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,eAAe;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,iBAAiB;IACb;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,KAAK;IACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;I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","names":["resolve","registry","join","join","homedir","join","resolve","resolve","join","homedir","homedir","join","resolve","resolve","join","homedir","resolve"]}
|