slopmeter 0.1.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/LICENSE +21 -0
- package/README.md +98 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +6446 -0
- package/dist/cli.js.map +1 -0
- package/package.json +61 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +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;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;;AAIC,IAAM,6BAA8E;EACzF,UAAU;IACN;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;;EAEJ,WAAW;IACP;;EAEJ,YAAY;IACR;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;;EAEJ,OAAO;IACH;IACA;IACA;;;;;ACz4IN,IAAM,oBAAuC,CAAC,cAAc;AAC5D,IAAM,iBAAiB,oBAAI,IAAG;AAE9B,IAAM,qBAAqB,CAAC,SAAwC;AAClE,QAAM,SAAS,eAAe,IAAI,IAAI;AACtC,MAAI,QAAQ;AACV,WAAO;EACT;AACA,QAAM,UAAU,0BAA0B,IAAI;AAE9C,MAAI,CAAC,WAAW,QAAQ,WAAW,GAAG;AACpC,mBAAe,IAAI,MAAM,iBAAiB;AAC1C,WAAO;EACT;AACA,QAAM,SAAmB,CAAC,cAAc;AACxC,UAAQ,QAAQ,CAAC,UAAS;AACxB,UAAM,YAAY,gBAAgB,KAAK;AACvC,QAAI,WAAW;AACb,aAAO,KAAK,SAAS;IACvB;EACF,CAAC;AAED,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,UAAU,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC;AAC1C,mBAAe,IAAI,MAAM,OAAO;AAChC,WAAO;EACT;AACA,iBAAe,IAAI,MAAM,iBAAiB;AAC1C,SAAO;AACT;AAEA,IAAM,2BAA2B,CAAC,SAAyC;AACzE,SAAO,MAAM,yBAAyB,QAAO;IAC3C,YAAY,OAA2B,SAAwB;AAC7D,YAAM,OAAO,OAAO;AACpB,WAAK,OAAO;AACZ,YAAM,kBAAkB,mBAAmB,IAAI;AAC/C,YAAM,kBAAkB,2BAA2B,IAAI,KAAK,CAAA;AAC5D,YAAM,qBAAqB,gBACxB,IAAI,CAAC,UAAU,gBAAgB,KAAK,CAAC,EACrC,OAAO,CAAC,SAAiC,QAAQ,IAAI,CAAC;AAEzD,WAAK,sBAAsB,MAAM,KAAK,oBAAI,IAAI;QAC5C,GAAG;QACH,GAAG;OACJ,CAAC;AACF,WAAK,mBAAmB;AACxB,WAAK,eAAc;IACrB;;AAEJ;AAEA,IAAM,WAAW,cAAc,OAAwB,CAAC,aAAa,SAAQ;AAC3E,cAAY,IAAI,IAAI,yBAAyB,IAAI;AACjD,SAAO;AACT,GAAG,CAAA,CAAqB;AAexB,IAAA,mBAAe;;;AC/Cf,IAAM,aAAa,CAAC,UAA8B,MAAc,UAAkC;AAChG,QAAM,SAAS,IAAI,OAAO,OAAO,2BAA2B;AAC5D,SAAO,SAAS,KAAK,QAAQ,QAAQ,OAAO,OAAO,QAAQ,GAAG;AAChE;AAQA,IAAM,oBAAoB,CAAC,QAAqB,eAA4C;AAC1F,MAAI,CAAC,OAAO;AACV,WAAO;EACT;AACA,QAAM,cAAe,MAA6C;AAClE,SAAO,eAAe,OAAO,YAAY,SAAS,aAAa,cAAc;AAC/E;AAIA,IAAM,gBAAgB,CAAC,QAAqB,eAAkC;AAC5E,MAAI,OAAO,gBAAgB,aAAa;AACtC,WAAO,IAAI,YAAW;EACxB;AACA,MAAI,CAAC,OAAO;AACV,WAAO;EACT;AACA,QAAM,gBAAiB,MAAmD;AAC1E,MAAI,eAAe;AACjB,WAAO,IAAI,cAAa;EAC1B;AACA,SAAO;AACT;AAEA,IAAM,iBAAiB,CAAC,UAA6B;AACnD,QAAM,SAAS,MAAM;AACrB,QAAM,SAAS,IAAI,WAAW,MAAM;AACpC,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK,GAAG;AAClC,WAAO,CAAC,IAAI,MAAM,WAAW,CAAC,IAAI;EACpC;AACA,SAAO;AACT;AAEA,IAAM,aAAa,kBAAiB;AACpC,IAAM,cAAc,aAAa,OAAO,cAAa;AAErD,SAAS,aAAU;AACjB,OAAK,OAAO;AACZ,OAAK,WAAW,CAAA;AAEhB,OAAK,WAAW,CAAC,SAAwB;AACvC,WAAO,OAAO,OAAO;EACvB;AAEA,OAAK,QAAQ,CAAC,UAA8C;AAC1D,SAAK,OAAO,WAAW,MAAM,SAAS,KAAK;AAC3C,WAAO;EACT;AAEA,OAAK,SAAS,CAAC,UAA8C;AAC3D,SAAK,OAAO,WAAW,MAAM,UAAU,KAAK;AAC5C,WAAO;EACT;AAEA,OAAK,UAAU,CAAC,UAAqC;AACnD,SAAK,OAAO,KAAK,KAAK,QAAQ,SAAS,iBAAiB,KAAK,IAAI;AACjE,WAAO;EACT;AAEA,OAAK,aAAa,CAAC,YAAwB;AACzC,QAAI,CAAC,QAAQ,SAAS;AACpB,cAAQ,QAAQ,KAAK,SAAS,QAAQ,IAAI;AAC1C,WAAK,SAAS,KAAK,QAAQ,IAAI;IACjC,WAAW,OAAO,QAAQ,YAAY,UAAU;AAC9C,UAAI,QAAQ,qBAAqB;AAC/B,gBAAQ,QAAQ,QAAQ,UAAU,KAAK,SAAS,QAAQ,IAAI;AAC5D,aAAK,SAAS,KAAK,QAAQ,IAAI;MACjC,OAAO;AACL,gBAAQ,QAAQ,KAAK,SAAS,QAAQ,IAAI;AAC1C,aAAK,SAAS,KAAK,QAAQ,IAAI;MACjC;IACF,WAAW,OAAO,QAAQ,YAAY,UAAU;AAC9C,YAAM,cAAc,QAAQ;AAC5B,YAAM,cAAc,MAAM,QAAQ,YAAY,QAAQ,IAClD,YAAY,SAAS,KAAK,EAAE,IAC5B;AACJ,cAAQ,QAAQ,cAAc,KAAK,SAAS,QAAQ,IAAI;AACxD,WAAK,SAAS,KAAK,QAAQ,IAAI;IACjC;EACF;AACF;AAEA,IAAM,iBAAiB;AAEvB,eAAe,UAAU,cAAc,SAAS,cAAW;AACzD,SAAO,IAAI,eAAc;AAC3B;AAEA,eAAe,UAAU,QAAQ,SAAS,QAAK;AAC7C,OAAK,WAAW,CAAA;AAChB,SAAO;AACT;AAEA,eAAe,UAAU,SAAS,SAAS,SAAM;AAC/C,SAAO,KAAK,OAAO,KAAK,SAAS,KAAK,EAAE,IAAI,KAAK,SAAS,KAAK;AACjE;AAEA,eAAe,UAAU,SAAS,SAAS,SAAM;AAC/C,QAAM,SAAS,KAAK,OAAM;AAC1B,MAAI,YAAY;AACd,WAAO,WAAW,KAAK,MAAM;EAC/B;AACA,MAAI,aAAa;AACf,WAAO,YAAY,OAAO,MAAM;EAClC;AACA,SAAO,eAAe,MAAM;AAC9B;AAEA,cAAc,QAAQ,CAAC,SAAqB;AAC1C,QAAM,cAAkC,iBAAgB,IAAI;AAC5D,iBAAe,UAAU,IAAI,IAAI,SAAS,cAExC,OACA,SAAwB;AAExB,SAAK,WAAW,IAAI,YAAY,OAAO,OAAO,CAAC;AAC/C,WAAO;EACT;AACF,CAAC;AAED,IAAM,kBAAkB,IAAI,eAAc;AAC1C,IAAM,cAAc,gBAAgB;AACpC,IAAI,iBAA4C;AAEhD,IAAM,SAAS,MAAyB;AACtC,mBAAiB,IAAI,eAAc;AACnC,SAAO;AACT;AAEA,IAAM,gBAAgB,MAAyB;AAC7C,MAAI,gBAAgB;AAClB,WAAO;EACT;AACA,mBAAiB,IAAI,eAAc;AACnC,SAAO;AACT;AAEA,IAAM,eAAe,CAAC,YAA+B;AACnD,UAAQ,MAAK;AACb,UAAQ,OAAO;AACjB;AAEA,IAAM,aAAa;EACjB;EACA,aAAa,MAAyB;AACpC,UAAM,UAAU,cAAa;AAC7B,iBAAa,OAAO;AACpB,WAAO;EACT;;AAGF,IAAA,cAAe;;;ACxMf,SAAS,UAAU,eAAe;AAClC,SAAS,YAAY;AAGd,SAAS,gBAAgB,MAAY;AAC1C,QAAM,IAAI,KAAK,YAAY;AAC3B,QAAM,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACrD,QAAM,IAAI,OAAO,KAAK,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAEhD,SAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;AACvB;AAuBA,IAAM,aAAa,KAAK,KAAK,KAAK;AAElC,SAAS,iBACP,QACkB;AAClB,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO;AAAA,IACf,OAAO,EAAE,OAAO,OAAO,MAAM,OAAO,QAAQ,OAAO,MAAM,OAAO;AAAA,IAChE,OAAO,OAAO;AAAA,EAChB;AACF;AAEA,SAAS,iBACP,QACA,QACA;AACA,SAAO,SAAS,OAAO;AACvB,SAAO,UAAU,OAAO;AACxB,SAAO,MAAM,SAAS,OAAO,MAAM;AACnC,SAAO,MAAM,UAAU,OAAO,MAAM;AACpC,SAAO,SAAS,OAAO;AACzB;AAEO,SAAS,oBACd,aACA,WACA,aACA;AACA,QAAM,WAAW,YAAY,IAAI,SAAS;AAE1C,MAAI,CAAC,UAAU;AACb,gBAAY,IAAI,WAAW,iBAAiB,WAAW,CAAC;AAExD;AAAA,EACF;AAEA,mBAAiB,UAAU,WAAW;AACxC;AAEO,SAAS,oBACd,QACA,MACA,aACA,WACA;AACA,QAAM,MAAM,gBAAgB,IAAI;AAChC,QAAM,WAAW,OAAO,IAAI,GAAG;AAE/B,MAAI,CAAC,UAAU;AACb,UAAM,SAAS,oBAAI,IAA8B;AAEjD,QAAI,WAAW;AACb,aAAO,IAAI,WAAW,iBAAiB,WAAW,CAAC;AAAA,IACrD;AACA,WAAO,IAAI,KAAK,EAAE,QAAQ,iBAAiB,WAAW,GAAG,OAAO,CAAC;AAEjE;AAAA,EACF;AAEA,mBAAiB,SAAS,QAAQ,WAAW;AAE7C,MAAI,WAAW;AACb,wBAAoB,SAAS,QAAQ,WAAW,WAAW;AAAA,EAC7D;AACF;AAEO,SAAS,aAAa,QAAyC;AACpE,SAAO,CAAC,GAAG,OAAO,QAAQ,CAAC,EACxB,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,EACrC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,OAAO,CAAC,OAAO;AAAA,IACpC,MAAM,oBAAI,KAAK,GAAG,IAAI,WAAW;AAAA,IACjC,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO;AAAA,IACf,OAAO,EAAE,OAAO,OAAO,MAAM,OAAO,QAAQ,OAAO,MAAM,OAAO;AAAA,IAChE,OAAO,OAAO;AAAA,IACd,WAAW,CAAC,GAAG,OAAO,QAAQ,CAAC,EAC5B,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EACxC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO;AAAA,MACnB;AAAA,MACA,QAAQ;AAAA,QACN,OAAO,EAAE;AAAA,QACT,QAAQ,EAAE;AAAA,QACV,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,QAAQ,EAAE,MAAM,OAAO;AAAA,QACtD,OAAO,EAAE;AAAA,MACX;AAAA,IACF,EAAE;AAAA,EACN,EAAE;AACN;AAEA,eAAsB,mBAAmB,SAAiB,WAAmB;AAC3E,QAAM,QAAkB,CAAC;AACzB,QAAM,QAAQ,CAAC,OAAO;AAEtB,SAAO,MAAM,SAAS,GAAG;AACvB,UAAM,aAAa,MAAM,IAAI;AAE7B,QAAI;AAEJ,QAAI;AACF,gBAAU,MAAM,QAAQ,YAAY;AAAA,QAClC,eAAe;AAAA,QACf,UAAU;AAAA,MACZ,CAAC;AAAA,IACH,QAAQ;AACN;AAAA,IACF;AAEA,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAW,KAAK,YAAY,MAAM,IAAI;AAE5C,UAAI,MAAM,YAAY,GAAG;AACvB,cAAM,KAAK,QAAQ;AACnB;AAAA,MACF;AAEA,UAAI,MAAM,OAAO,KAAK,SAAS,SAAS,SAAS,GAAG;AAClD,cAAM,KAAK,QAAQ;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,cAAiB,UAAgC;AACrE,QAAM,UAAU,MAAM,SAAS,UAAU,MAAM;AAE/C,SAAO,QACJ,MAAM,OAAO,EACb,OAAO,CAAC,SAAS,KAAK,KAAK,MAAM,EAAE,EACnC,IAAI,CAAC,SAAS,KAAK,MAAM,KAAK,KAAK,CAAC,CAAM;AAC/C;AAEO,SAAS,qBAAqB,SAAe,OAAO,IAAI;AAC7D,QAAM,QAAQ,IAAI,KAAK,OAAO;AAE9B,QAAM,QAAQ,MAAM,QAAQ,KAAK,OAAO,EAAE;AAC1C,QAAM,SAAS,GAAG,GAAG,GAAG,CAAC;AAEzB,SAAO;AACT;AAEO,SAAS,mBAAmB,WAAmB;AACpD,SAAO,UAAU,QAAQ,WAAW,EAAE;AACxC;AAEO,SAAS,YACd,aACwB;AACxB,MAAI;AACJ,MAAI;AAEJ,aAAW,CAAC,WAAW,MAAM,KAAK,aAAa;AAC7C,QAAI,CAAC,cAAc,OAAO,QAAQ,WAAW,OAAO;AAClD,kBAAY;AACZ,mBAAa;AAAA,IACf;AAAA,EACF;AAEA,MAAI,CAAC,cAAc,WAAW,SAAS,GAAG;AACxC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,OAAO,WAAW;AAAA,MAClB,QAAQ,WAAW;AAAA,MACnB,OAAO,EAAE,OAAO,WAAW,MAAM,OAAO,QAAQ,WAAW,MAAM,OAAO;AAAA,MACxE,OAAO,WAAW;AAAA,IACpB;AAAA,EACF;AACF;AAEA,SAAS,WAAW,MAAY;AAC9B,QAAM,MAAM,IAAI,KAAK,IAAI;AAEzB,MAAI,SAAS,GAAG,GAAG,GAAG,CAAC;AAEvB,SAAO;AACT;AAEA,SAAS,iBAAiB,UAAgB,UAAyB;AACjE,QAAM,OAAO,WAAW,QAAQ;AAChC,QAAM,OAAO,WAAW,QAAQ;AAChC,QAAM,OAAO,KAAK,QAAQ,IAAI,KAAK,QAAQ;AAE3C,SAAO,SAAS;AAClB;AAEO,SAAS,qBAAqB,OAA6B;AAChE,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,MAAI,UAAU;AACd,MAAI,UAAU;AAEd,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;AACxC,QAAI,iBAAiB,MAAM,IAAI,CAAC,EAAE,MAAM,MAAM,CAAC,EAAE,IAAI,GAAG;AACtD,iBAAW;AACX,UAAI,UAAU,SAAS;AACrB,kBAAU;AAAA,MACZ;AAAA,IACF,OAAO;AACL,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,qBAAqB,OAAqB,KAAmB;AAC3E,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,WAAW,GAAG;AAC7B,QAAM,YAAY,MAAM,MAAM,SAAS,CAAC;AACxC,QAAM,eAAe,WAAW,UAAU,IAAI;AAG9C,MACE,aAAa,QAAQ,MAAM,OAAO,QAAQ,KAC1C,CAAC,iBAAiB,cAAc,MAAM,GACtC;AACA,WAAO;AAAA,EACT;AAEA,MAAI,UAAU;AAEd,WAAS,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG;AAC7C,QAAI,CAAC,iBAAiB,MAAM,CAAC,EAAE,MAAM,MAAM,IAAI,CAAC,EAAE,IAAI,GAAG;AACvD;AAAA,IACF;AACA,eAAW;AAAA,EACb;AAEA,SAAO;AACT;AAEO,SAAS,oBACd,aACA,mBACA,OACA,KACU;AACV,QAAM,gBAAgB,YAAY,WAAW;AAC7C,QAAM,sBAAsB,YAAY,iBAAiB;AAEzD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS;AAAA,MACP,SAAS,qBAAqB,KAAK;AAAA,MACnC,SAAS,qBAAqB,OAAO,GAAG;AAAA,IAC1C;AAAA,EACF;AACF;AAEO,SAAS,mBACd,UACA,QACA,aACA,mBACA,KACc;AACd,QAAM,QAAQ,aAAa,MAAM;AAEjC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU,oBAAoB,aAAa,mBAAmB,OAAO,GAAG;AAAA,EAC1E;AACF;AAEO,SAAS,SAAS,SAAuB;AAC9C,SAAO,QAAQ,MAAM,KAAK,CAAC,QAAQ,IAAI,QAAQ,CAAC;AAClD;;;AC9OO,IAAM,gBAAkD;AAAA,EAC7D,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,MACN,OAAO;AAAA,QACL;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,MACF;AAAA,MACA,MAAM;AAAA,QACJ;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,MACN,OAAO;AAAA,QACL;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,MACF;AAAA,MACA,MAAM;AAAA,QACJ;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,MACN,OAAO;AAAA,QACL;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,MACF;AAAA,MACA,MAAM;AAAA,QACJ;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,mBAAmB,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AACzE,IAAM,kBAAkB,IAAI,KAAK,aAAa,OAAO;AACrD,IAAM,aACJ;AACF,IAAM,wBAAwB;AAC9B,IAAM,wBAAwB;AAC9B,IAAM,sBAAsB;AAC5B,IAAM,kBAAkB;AAExB,IAAM,kBAAqD;AAAA,EACzD,OAAO;AAAA,IACL,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,MAAM;AAAA,IACJ,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AACF;AAEA,SAAS,iBAAiB,OAAe;AACvC,QAAM,QAAQ;AAAA,IACZ,EAAE,MAAM,MAAmB,QAAQ,IAAI;AAAA,IACvC,EAAE,MAAM,KAAe,QAAQ,IAAI;AAAA,IACnC,EAAE,MAAM,KAAW,QAAQ,IAAI;AAAA,IAC/B,EAAE,MAAM,KAAO,QAAQ,IAAI;AAAA,EAC7B;AAEA,aAAW,QAAQ,OAAO;AACxB,QAAI,SAAS,KAAK,MAAM;AACtB,YAAM,SAAS,QAAQ,KAAK;AAC5B,YAAM,YAAY,UAAU,MAAM,IAAI,UAAU,KAAK,IAAI;AACzD,YAAM,UAAU,OACb,QAAQ,SAAS,EACjB,QAAQ,SAAS,EAAE,EACnB,QAAQ,mBAAmB,IAAI;AAElC,aAAO,GAAG,OAAO,GAAG,KAAK,MAAM;AAAA,IACjC;AAAA,EACF;AAEA,SAAO,gBAAgB,OAAO,KAAK;AACrC;AAEA,SAAS,aAAa,OAAe,WAAmB;AACtD,MAAI,MAAM,UAAU,WAAW;AAC7B,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,MAAM,MAAM,GAAG,KAAK,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC;AACtD;AAEA,SAAS,UAAU,OAAe;AAChC,SAAO,MACJ,WAAW,KAAK,OAAO,EACvB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,MAAM;AAC3B;AAEA,SAAS,QAAQ,OAAe;AAC9B,SAAO,MAAM,YAAY;AAC3B;AAEA,SAAS,WAAW,OAAa,KAAW;AAC1C,QAAM,OAAiB,CAAC;AACxB,QAAM,OAAO,IAAI,KAAK,KAAK;AAE3B,SAAO,QAAQ,KAAK;AAClB,SAAK,KAAK,gBAAgB,IAAI,CAAC;AAC/B,SAAK,QAAQ,KAAK,QAAQ,IAAI,CAAC;AAAA,EACjC;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,SAAiB;AAC9C,QAAM,eAAc,oBAAI,KAAK,GAAG,OAAO,WAAW,GAAE,OAAO;AAE3D,UAAQ,cAAc,KAAK;AAC7B;AAEA,SAAS,qBAAqB,MAAgB;AAC5C,QAAM,WAAW,sBAAsB,KAAK,CAAC,CAAC;AAC9C,QAAM,UAAU,IAAI,MAAM,QAAQ,EAAE,KAAK,IAAI;AAE7C,SAAO,CAAC,GAAG,SAAS,GAAG,IAAI;AAC7B;AAEA,SAAS,YAAY,MAA8C;AACjE,QAAM,QAA6B,CAAC;AAEpC,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,UAAM,KAAK,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC;AAAA,EACjC;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,MAAyB;AAC9C,QAAM,UAAU,CAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,KAAK,OAAO;AAEhD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,UAAO,oBAAI,KAAK,GAAG,OAAO,WAAW,GAAE,eAAe,SAAS;AAAA,IAC7D,OAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,iBAAiB,OAAe,KAAa,YAAoB;AACxE,MAAI,OAAO,KAAK,SAAS,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,KAAK,KAAM,QAAQ,OAAQ,aAAa,EAAE;AAExD,SAAO,KAAK,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG,aAAa,CAAC;AACpD;AAEA,SAAS,gBAAgB,WAAiB,SAAe;AACvD,QAAM,UAAU,WAAW,WAAW,OAAO;AAC7C,QAAM,aAAa,qBAAqB,OAAO;AAC/C,QAAM,QAAQ,YAAY,UAAU;AAEpC,QAAM,cAAc,MAAM,IAAI,CAAC,MAAM,MAAM;AACzC,UAAM,QAAQ,cAAc,IAAI;AAChC,UAAM,YAAY,IAAI,IAAI,cAAc,MAAM,IAAI,CAAC,CAAC,IAAI;AAExD,WAAO,UAAU,YAAY,QAAQ;AAAA,EACvC,CAAC;AAED,SAAO,EAAE,OAAO,YAAY;AAC9B;AAEA,SAAS,iBAAiB,WAAmB;AAC3C,QAAM,WAAW;AACjB,QAAM,MAAM;AACZ,QAAM,iBAAiB;AACvB,QAAM,eAAe;AACrB,QAAM,iBAAiB;AACvB,QAAM,eACJ,iBAAiB,wBAAwB;AAC3C,QAAM,kBAAkB,eAAe;AACvC,QAAM,aAAa,KAAK,IAAI,uBAAuB,eAAe,IAAI;AACtE,QAAM,oBAAoB;AAC1B,QAAM,SAAS;AACf,QAAM,cAAc,aAAa;AACjC,QAAM,UAAU,aAAa;AAC7B,QAAM,aAAa,IAAI,WAAW,IAAI;AACtC,QAAM,YAAY,YAAY,WAAW,KAAK,IAAI,YAAY,GAAG,CAAC,IAAI;AACtE,QAAM,UAAU,UAAU,aAAa;AACvC,QAAM,gBAAgB,UAAU;AAChC,QAAM,mBAAmB;AACzB,QAAM,iBAAiB,gBAAgB;AACvC,QAAM,eACJ,iBAAiB,wBAAwB;AAC3C,QAAM,qBAAqB;AAC3B,QAAM,QAAQ,iBAAiB,YAAY;AAC3C,QAAM,SAAS,eAAe,sBAAsB;AAEpD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,mBACP,KACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GACA;AACA,QAAM,gBAAgB,OAAO,SAAS;AACtC,QAAM,cAAc,oBAAI,IAAoB;AAC5C,QAAM,YAAY,IAAI,OAAO,QAAQ;AACrC,QAAM,cAAc,IAAI;AACxB,MAAI,WAAW;AACf,MAAI,mBAAmB;AACvB,MAAI,oBAAoB;AACxB,MAAI,cAAc;AAElB,aAAW,OAAO,OAAO;AACvB,gBAAY,IAAI,gBAAgB,IAAI,IAAI,GAAG,IAAI,KAAK;AACpD,eAAW,KAAK,IAAI,UAAU,IAAI,KAAK;AACvC,wBAAoB,IAAI;AACxB,yBAAqB,IAAI;AACzB,mBAAe,IAAI;AAAA,EACrB;AAEA,QAAM,eAAe;AACrB,QAAM,oBAAoB,YAAY,eAAe;AACrD,QAAM,eAAe,YAAY,eAAe;AAChD,QAAM,gBAAgB,YAAY;AAClC,QAAM,mBAAmB,iBAAiB,WAAW;AACrD,QAAM,kBAAkB,iBAAiB,gBAAgB;AACzD,QAAM,mBAAmB,iBAAiB,iBAAiB;AAC3D,QAAM,gBAAgB,UAAU,QAAQ,WAAW;AACnD,QAAM,gBAAgB,UAAU,QAAQ,WAAW;AAEnD,QAAM,IAAI;AAAA,IACR;AAAA,MACE,GAAG;AAAA,MACH,GAAG,IAAI,OAAO;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,aAAa;AAAA,MACb,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,EACF;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,MACE,GAAG;AAAA,MACH,GAAG,IAAI,OAAO;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,aAAa;AAAA,MACb,eAAe;AAAA,MACf,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,eAAe;AAAA,IACjB;AAAA,IACA,QAAQ,cAAc;AAAA,EACxB;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,MACE,GAAG;AAAA,MACH,GAAG,IAAI,OAAO;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,aAAa;AAAA,MACb,eAAe;AAAA,MACf,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,EACF;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,MACE,GAAG;AAAA,MACH,GAAG,IAAI,OAAO;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,aAAa;AAAA,MACb,eAAe;AAAA,MACf,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,eAAe;AAAA,IACjB;AAAA,IACA,QAAQ,eAAe;AAAA,EACzB;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,MACE,GAAG;AAAA,MACH,GAAG,IAAI,OAAO;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,aAAa;AAAA,MACb,eAAe;AAAA,MACf,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,EACF;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,MACE,GAAG;AAAA,MACH,GAAG,IAAI,OAAO;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,aAAa;AAAA,MACb,eAAe;AAAA,MACf,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,eAAe;AAAA,IACjB;AAAA,IACA,QAAQ,cAAc;AAAA,EACxB;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,MACE,GAAG;AAAA,MACH,GAAG,IAAI,OAAO;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,aAAa;AAAA,MACb,eAAe;AAAA,MACf,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,EACF;AAEA,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG;AAC7B,UAAM,OACJ,IACA,OAAO,UACP,KAAK,OAAO,WAAW,OAAO,OAC9B,OAAO,WAAW;AAEpB,UAAM,WAAW,MAAM,KAAK,MAAM,IAAI,iBAAiB,CAAC,IAAI;AAE5D,UAAM,IAAI;AAAA,MACR;AAAA,QACE,GAAG,IAAI,OAAO,iBAAiB;AAAA,QAC/B,GAAG;AAAA,QACH,MAAM,QAAQ;AAAA,QACd,aAAa;AAAA,QACb,eAAe;AAAA,QACf,qBAAqB;AAAA,QACrB,eAAe;AAAA,MACjB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,YAAY,GAAG,YAAY,KAAK,MAAM,QAAQ,aAAa,GAAG;AACrE,UAAM,aAAa,KAAK,YAAY,SAAS;AAE7C,QAAI,YAAY;AACd,YAAM,SACJ,IAAI,OAAO,iBAAiB,aAAa,OAAO,WAAW,OAAO;AAEpE,YAAM,IAAI;AAAA,QACR;AAAA,UACE,GAAG;AAAA,UACH,GAAG,IAAI,OAAO;AAAA,UACd,MAAM,QAAQ;AAAA,UACd,aAAa;AAAA,UACb,eAAe;AAAA,QACjB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,OAAO,KAAK,MAAM,SAAS;AAEjC,aAAS,WAAW,GAAG,WAAW,KAAK,QAAQ,YAAY,GAAG;AAC5D,YAAM,MAAM,KAAK,QAAQ;AAEzB,UAAI,CAAC,KAAK;AACR;AAAA,MACF;AAEA,YAAM,QAAQ,YAAY,IAAI,GAAG,KAAK;AACtC,YAAM,aAAa;AAAA,QACjB;AAAA,QACA;AAAA,QACA,cAAc;AAAA,MAChB;AACA,YAAM,OAAO,cAAc,UAAU;AAErC,YAAM,OACJ,IAAI,OAAO,iBAAiB,aAAa,OAAO,WAAW,OAAO;AACpE,YAAM,OACJ,IAAI,OAAO,UAAU,YAAY,OAAO,WAAW,OAAO;AAE5D,YAAM,IAAI,KAAK;AAAA,QACb,GAAG;AAAA,QACH,GAAG;AAAA,QACH,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,eAAe,IAAI,OAAO;AAChC,QAAM,UAAU,IAAI,OAAO;AAE3B,QAAM,IAAI;AAAA,IACR;AAAA,MACE,GAAG;AAAA,MACH,GAAG,UAAU;AAAA,MACb,MAAM,QAAQ;AAAA,MACd,aAAa;AAAA,MACb,eAAe;AAAA,MACf,eAAe;AAAA,IACjB;AAAA,IACA,QAAQ,MAAM;AAAA,EAChB;AAEA,WAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK,GAAG;AAChD,UAAM,UAAU,eAAe,KAAK,KAAK,OAAO,WAAW;AAE3D,UAAM,IAAI,KAAK;AAAA,MACb,GAAG;AAAA,MACH,GAAG;AAAA,MACH,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,MACf,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,MAAM,cAAc,CAAC;AAAA,IACvB,CAAC;AAAA,EACH;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,MACE,GAAG,eAAe,KAAK,cAAc,UAAU,OAAO,WAAW,KAAK;AAAA,MACtE,GAAG,UAAU;AAAA,MACb,MAAM,QAAQ;AAAA,MACd,aAAa;AAAA,MACb,eAAe;AAAA,MACf,eAAe;AAAA,IACjB;AAAA,IACA,QAAQ,MAAM;AAAA,EAChB;AAEA,QAAM,eAAe;AACrB,QAAM,iBAAiB,cAAc;AACrC,QAAM,gBAAgB,eAAe;AAErC,QAAM,WAA4B,CAAC;AAEnC,MAAI,UAAU,eAAe;AAC3B,aAAS,KAAK,EAAE,SAAS,mBAAmB,MAAM,SAAS,cAAc,CAAC;AAAA,EAC5E;AAEA,MAAI,UAAU,qBAAqB;AACjC,aAAS,KAAK;AAAA,MACZ,SAAS;AAAA,MACT,MAAM,SAAS;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,aAAW,CAAC,OAAO,GAAG,KAAK,SAAS,QAAQ,GAAG;AAC7C,UAAM,WAAW,OAAO;AACxB,UAAM,SAAS,OAAO;AACtB,UAAM,YAAY,aAAa,IAAI,KAAK,MAAM,EAAE;AAChD,UAAM,SAAS,UAAU,IAAI,cAAc;AAC3C,UAAM,aAAa,IAAI,iBAAiB,IAAI,KAAK,OAAO,KAAK,CAAC;AAE9D,UAAM,IAAI;AAAA,MACR;AAAA,QACE,GAAG;AAAA,QACH,GAAG,IAAI;AAAA,QACP,MAAM,QAAQ;AAAA,QACd,aAAa;AAAA,QACb,eAAe;AAAA,QACf,qBAAqB;AAAA,QACrB,eAAe;AAAA,MACjB;AAAA,MACA,QAAQ,IAAI,OAAO;AAAA,IACrB;AAEA,UAAM,IAAI;AAAA,MACR;AAAA,QACE,GAAG;AAAA,QACH,GAAG,IAAI;AAAA,QACP,qBAAqB;AAAA,QACrB,eAAe;AAAA,MACjB;AAAA,MACA,gBAAgB,QAAQ,IAAI,gBAAgB,mBAAmB,uBAAuB,UAAU,SAAS,CAAC,+BAA+B,QAAQ,KAAK,gBAAgB,mBAAmB,uBAAuB,UAAU;AAAA,IAC5N;AAAA,EACF;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,MACE,GAAG;AAAA,MACH,GAAG,IAAI,OAAO;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,aAAa;AAAA,MACb,eAAe;AAAA,MACf,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,eAAe;AAAA,IACjB;AAAA,IACA,QAAQ,gBAAgB;AAAA,EAC1B;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,MACE,GAAG;AAAA,MACH,GAAG,IAAI,OAAO;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,aAAa;AAAA,MACb,eAAe;AAAA,MACf,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,eAAe;AAAA,IACjB;AAAA,IACA,GAAG,gBAAgB,OAAO,aAAa,CAAC;AAAA,EAC1C;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,MACE,GAAG;AAAA,MACH,GAAG,IAAI,OAAO;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,aAAa;AAAA,MACb,eAAe;AAAA,MACf,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,eAAe;AAAA,IACjB;AAAA,IACA,QAAQ,gBAAgB;AAAA,EAC1B;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,MACE,GAAG;AAAA,MACH,GAAG,IAAI,OAAO;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,aAAa;AAAA,MACb,eAAe;AAAA,MACf,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,eAAe;AAAA,IACjB;AAAA,IACA,GAAG,gBAAgB,OAAO,aAAa,CAAC;AAAA,EAC1C;AAEA,SAAO;AACT;AAEO,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAkC;AAChC,QAAM,OAAO,gBAAgB,WAAW,OAAO;AAC/C,QAAM,SAAS,iBAAiB,KAAK,MAAM,MAAM;AACjD,QAAM,UAAU,gBAAgB,SAAS;AACzC,QAAM,oBAAoB;AAC1B,QAAM,aAAa;AACnB,QAAM,gBAAgB;AACtB,QAAM,aAAa;AAEnB,QAAM,QAAQ,oBAAoB,IAAI,OAAO;AAC7C,QAAM,SACJ,aACA,gBACA,SAAS,SAAS,OAAO,SACzB,KAAK,IAAI,SAAS,SAAS,GAAG,CAAC,IAAI;AAErC,MAAI,MAAM,YACP,OAAO,EACP,MAAM,KAAK,EACX,OAAO,MAAM,EACb,QAAQ,OAAO,KAAK,IAAI,MAAM,EAAE,EAChC,KAAK;AAAA,IACJ,GAAG;AAAA,IACH,GAAG;AAAA,IACH,OAAO,QAAQ;AAAA,IACf,QAAQ,SAAS;AAAA,IACjB,MAAM,QAAQ;AAAA,EAChB,CAAC;AAEH,WAAS,QAAQ,CAAC,SAAS,UAAU;AACnC,UAAM,WAAW,aAAa,SAAS,OAAO,SAAS;AAEvD,UAAM,mBAAmB,KAAK;AAAA,MAC5B,GAAG;AAAA,MACH,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA,OAAO,QAAQ;AAAA,MACf,UAAU,QAAQ;AAAA,MAClB,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,MAChB;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,SAAO,IAAI,OAAO;AACpB;;;ACztBA,SAAS,kBAAkB;AAC3B,SAAS,eAAe;AACxB,SAAS,QAAAC,OAAM,eAAe;AAe9B,IAAM,wBAAwB;AAC9B,IAAM,2BAA2B;AA2BjC,SAAS,uBAAuB;AAC9B,QAAM,YAAY,QAAQ,IAAI,qBAAqB,KAAK,IAAI,KAAK;AAEjE,MAAI,aAAa,IAAI;AACnB,WAAO,SACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,SAAS,EAAE,EAC5B,IAAI,CAAC,SAAS,QAAQ,IAAI,CAAC;AAAA,EAChC;AAEA,QAAM,gBACJ,QAAQ,IAAI,iBAAiB,KAAK,KAAKC,MAAK,QAAQ,GAAG,SAAS;AAElE,SAAO,CAACA,MAAK,eAAe,QAAQ,GAAGA,MAAK,QAAQ,GAAG,SAAS,CAAC;AACnE;AAEA,SAAS,uBAAuB;AAC9B,QAAM,SAAS,oBAAI,IAAY;AAC/B,QAAM,OAAiB,CAAC;AAExB,aAAW,YAAY,qBAAqB,GAAG;AAC7C,UAAM,cAAcA,MAAK,UAAU,wBAAwB;AAE3D,QAAI,WAAW,WAAW,KAAK,CAAC,OAAO,IAAI,WAAW,GAAG;AACvD,aAAO,IAAI,WAAW;AACtB,WAAK,KAAK,WAAW;AAAA,IACvB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,OAAiD;AAC5E,MAAI,CAAC,MAAM,aAAa,CAAC,MAAM,SAAS,OAAO;AAC7C,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,WAAW,MAAM;AAAA,IACjB,OAAO,MAAM,QAAQ;AAAA,IACrB,OAAO,MAAM,QAAQ;AAAA,IACrB,WAAW,MAAM,QAAQ;AAAA,IACzB,WAAW,MAAM;AAAA,EACnB;AACF;AAEA,SAAS,wBAAwB,OAA6C;AAC5E,QAAM,iBAAiB,MAAM,2BAA2B;AACxD,QAAM,qBAAqB,MAAM,+BAA+B;AAChE,QAAM,SAAS,MAAM,gBAAgB,KAAK;AAC1C,QAAM,UAAU,MAAM,iBAAiB,KAAK;AAE5C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,EAAE,OAAO,gBAAgB,QAAQ,mBAAmB;AAAA,IAC3D,OAAO,QAAQ;AAAA,EACjB;AACF;AAEA,eAAe,gBAAgB,UAAkB;AAC/C,QAAM,UAA4B,CAAC;AACnC,QAAM,QAAQ,MAAM,cAAiC,QAAQ;AAE7D,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAS,oBAAoB,IAAI;AAEvC,QAAI,QAAQ;AACV,cAAQ,KAAK,MAAM;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,mBAAmB;AAChC,QAAM,cAAc,qBAAqB;AACzC,QAAM,SACJ,MAAM,QAAQ;AAAA,IACZ,YAAY,IAAI,CAAC,eAAe,mBAAmB,YAAY,QAAQ,CAAC;AAAA,EAC1E,GACA,KAAK;AAEP,SAAO,QAAQ,IAAI,MAAM,IAAI,CAAC,SAAS,gBAAgB,IAAI,CAAC,CAAC;AAC/D;AAEA,SAAS,iBAAiB,WAAoB,WAAoB;AAChE,MAAI,CAAC,aAAa,CAAC,WAAW;AAC5B,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,SAAS,IAAI,SAAS;AAClC;AAEA,eAAsB,eACpB,WACA,SACuB;AACvB,QAAM,WAAW,MAAM,iBAAiB;AAExC,QAAM,SAA4B,oBAAI,IAAI;AAC1C,QAAM,cAAc,oBAAI,IAA8B;AACtD,QAAM,oBAAoB,oBAAI,IAA8B;AAC5D,QAAM,cAAc,qBAAqB,SAAS,EAAE;AACpD,QAAM,kBAAkB,oBAAI,IAAY;AAExC,aAAW,WAAW,UAAU;AAC9B,eAAW,SAAS,SAAS;AAC3B,YAAM,aAAa,iBAAiB,MAAM,WAAW,MAAM,SAAS;AAEpE,UAAI,cAAc,gBAAgB,IAAI,UAAU,GAAG;AACjD;AAAA,MACF;AAEA,UAAI,YAAY;AACd,wBAAgB,IAAI,UAAU;AAAA,MAChC;AAEA,YAAM,YAAY,IAAI,KAAK,MAAM,SAAS;AAE1C,UAAI,YAAY,aAAa,YAAY,SAAS;AAChD;AAAA,MACF;AAEA,YAAM,cAAc,wBAAwB,MAAM,KAAK;AAEvD,UAAI,YAAY,SAAS,GAAG;AAC1B;AAAA,MACF;AAEA,YAAM,YACJ,MAAM,SAAS,MAAM,UAAU,gBAC3B,mBAAmB,MAAM,KAAK,IAC9B;AAEN,0BAAoB,QAAQ,WAAW,aAAa,SAAS;AAE7D,UAAI,CAAC,WAAW;AACd;AAAA,MACF;AAEA,0BAAoB,aAAa,WAAW,WAAW;AAEvD,UAAI,aAAa,aAAa;AAC5B,4BAAoB,mBAAmB,WAAW,WAAW;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC1MA,SAAS,WAAAC,gBAAe;AACxB,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AAsD9B,SAAS,oBAAoB,OAAuB;AAClD,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MAAM,gBAAgB;AACpC,QAAM,SACJ,MAAM,uBAAuB,MAAM,2BAA2B;AAChE,QAAM,SAAS,MAAM,iBAAiB;AACtC,QAAM,YAAY,MAAM,2BAA2B;AACnD,QAAM,QAAQ,MAAM,gBAAgB;AAEpC,SAAO;AAAA,IACL,cAAc;AAAA,IACd,qBAAqB;AAAA,IACrB,eAAe;AAAA,IACf,yBAAyB;AAAA,IACzB,cAAc,QAAQ,IAAI,QAAQ,QAAQ;AAAA,EAC5C;AACF;AAEA,SAAS,mBACP,SACA,UACA;AACA,SAAO;AAAA,IACL,cAAc,KAAK;AAAA,MACjB,QAAQ,gBAAgB,UAAU,gBAAgB;AAAA,MAClD;AAAA,IACF;AAAA,IACA,qBAAqB,KAAK;AAAA,MACxB,QAAQ,uBAAuB,UAAU,uBAAuB;AAAA,MAChE;AAAA,IACF;AAAA,IACA,eAAe,KAAK;AAAA,MAClB,QAAQ,iBAAiB,UAAU,iBAAiB;AAAA,MACpD;AAAA,IACF;AAAA,IACA,yBAAyB,KAAK;AAAA,MAC5B,QAAQ,2BACL,UAAU,2BAA2B;AAAA,MACxC;AAAA,IACF;AAAA,IACA,cAAc,KAAK;AAAA,MACjB,QAAQ,gBAAgB,UAAU,gBAAgB;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,OAAgB;AACxC,QAAM,UAAU,OAAO,KAAK;AAE5B,SAAO,YAAY,KAAK,SAAY;AACtC;AAEA,SAAS,kBAAkB,SAA6B;AACtD,QAAM,cACJ,iBAAiB,SAAS,KAAK,KAAK,iBAAiB,SAAS,UAAU;AAE1E,MAAI,aAAa;AACf,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,MAAM;AACjB,UAAM,YACJ,iBAAiB,QAAQ,KAAK,KAAK,KACnC,iBAAiB,QAAQ,KAAK,UAAU;AAE1C,QAAI,WAAW;AACb,aAAO;AAAA,IACT;AAEA,QAAI,QAAQ,KAAK,UAAU;AACzB,YAAM,QAAQ,iBAAiB,QAAQ,KAAK,SAAS,KAAK;AAE1D,UAAI,OAAO;AACT,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,UAAU;AACrB,WAAO,iBAAiB,QAAQ,SAAS,KAAK;AAAA,EAChD;AAEA,SAAO;AACT;AAEA,eAAe,eAAe,UAAkB;AAC9C,SAAO,cAA+B,QAAQ;AAChD;AAEA,eAAe,kBAAkB;AAC/B,QAAM,YAAY,QAAQ,IAAI,YAAY,KAAK,IAC3CC,SAAQ,QAAQ,IAAI,UAAU,IAC9BC,MAAKC,SAAQ,GAAG,QAAQ;AAE5B,QAAM,cAAcD,MAAK,WAAW,UAAU;AAE9C,QAAM,QAAQ,MAAM,mBAAmB,aAAa,QAAQ;AAE5D,SAAO,QAAQ,IAAI,MAAM,IAAI,CAAC,SAAS,eAAe,IAAI,CAAC,CAAC;AAC9D;AAEA,eAAsB,cACpB,OACA,KACuB;AACvB,QAAM,WAAW,MAAM,gBAAgB;AAEvC,QAAM,SAA4B,oBAAI,IAAI;AAC1C,QAAM,cAAc,qBAAqB,KAAK,EAAE;AAChD,QAAM,cAAc,oBAAI,IAA8B;AACtD,QAAM,oBAAoB,oBAAI,IAA8B;AAE5D,aAAW,WAAW,UAAU;AAC9B,QAAI,iBAA8C;AAClD,QAAI;AAEJ,eAAW,SAAS,SAAS;AAC3B,YAAM,iBAAiB,kBAAkB,MAAM,OAAO;AAEtD,UAAI,MAAM,SAAS,gBAAgB;AACjC,uBAAe,kBAAkB;AACjC;AAAA,MACF;AAEA,UAAI,MAAM,SAAS,eAAe,MAAM,SAAS,SAAS,eAAe;AACvE;AAAA,MACF;AAEA,YAAM,OAAO,MAAM,QAAQ;AAC3B,YAAM,YAAY,oBAAoB,MAAM,gBAAgB;AAC5D,YAAM,aAAa,oBAAoB,MAAM,iBAAiB;AAC9D,UAAI,WAAW;AAEf,UAAI,CAAC,YAAY,YAAY;AAC3B,mBAAW,mBAAmB,YAAY,cAAc;AAAA,MAC1D;AAEA,UAAI,YAAY;AACd,yBAAiB;AAAA,MACnB;AAEA,UAAI,CAAC,UAAU;AACb;AAAA,MACF;AAEA,YAAM,QAA0B;AAAA,QAC9B,OAAO,SAAS;AAAA,QAChB,QAAQ,SAAS;AAAA,QACjB,OAAO,EAAE,OAAO,SAAS,qBAAqB,QAAQ,EAAE;AAAA,QACxD,OAAO,SAAS;AAAA,MAClB;AAEA,UAAI,MAAM,SAAS,GAAG;AACpB;AAAA,MACF;AAEA,YAAM,OAAO,IAAI,KAAK,MAAM,SAAS;AAErC,UAAI,OAAO,SAAS,OAAO,KAAK;AAC9B;AAAA,MACF;AAEA,YAAM,YAAY,kBAAkB;AACpC,YAAM,sBAAsB,YACxB,mBAAmB,SAAS,IAC5B;AAEJ,0BAAoB,QAAQ,MAAM,OAAO,mBAAmB;AAE5D,UAAI,qBAAqB;AACvB,4BAAoB,aAAa,qBAAqB,KAAK;AAE3D,YAAI,QAAQ,aAAa;AACvB,8BAAoB,mBAAmB,qBAAqB,KAAK;AAAA,QACnE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,mBAAmB,SAAS,QAAQ,aAAa,mBAAmB,GAAG;AAChF;;;AC3OO,IAAM,cAA4B,CAAC,UAAU,SAAS,UAAU;AAEhE,IAAM,sBAAkD;AAAA,EAC7D,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,UAAU;AACZ;;;ACVA,SAAS,YAAAE,iBAAgB;AACzB,SAAS,WAAAC,gBAAe;AACxB,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AAiC9B,SAAS,kBAAkB,QAA2C;AACpE,QAAM,aAAa,QAAQ,OAAO,QAAQ;AAC1C,QAAM,cAAc,QAAQ,OAAO,SAAS;AAC5C,QAAM,SAAS,QAAQ,SAAS,KAAK;AACrC,QAAM,UAAU,QAAQ,UAAU,KAAK;AAEvC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,EAAE,OAAO,YAAY,QAAQ,YAAY;AAAA,IAChD,OAAO,QAAQ;AAAA,EACjB;AACF;AAEA,eAAe,kBAAkB,UAAkB;AACjD,QAAM,UAAU,MAAMC,UAAS,UAAU,MAAM;AAE/C,SAAO,KAAK,MAAM,OAAO;AAC3B;AAEA,eAAe,qBAAqB;AAClC,QAAM,UAAU,QAAQ,IAAI,mBAAmB,KAAK,IAChDC,SAAQ,QAAQ,IAAI,iBAAiB,IACrCC,MAAKC,SAAQ,GAAG,UAAU,SAAS,UAAU;AAEjD,QAAM,cAAcD,MAAK,SAAS,WAAW,SAAS;AAEtD,QAAM,QAAQ,MAAM,mBAAmB,aAAa,OAAO;AAE3D,SAAO,QAAQ,IAAI,MAAM,IAAI,CAAC,SAAS,kBAAkB,IAAI,CAAC,CAAC;AACjE;AAEA,eAAsB,iBACpB,OACA,KACuB;AACvB,QAAM,WAAW,MAAM,mBAAmB;AAC1C,QAAM,SAA4B,oBAAI,IAAI;AAC1C,QAAM,SAAS,oBAAI,IAAY;AAC/B,QAAM,cAAc,qBAAqB,KAAK,EAAE;AAChD,QAAM,cAAc,oBAAI,IAA8B;AACtD,QAAM,oBAAoB,oBAAI,IAA8B;AAE5D,aAAW,WAAW,UAAU;AAC9B,QAAI,OAAO,IAAI,QAAQ,EAAE,GAAG;AAC1B;AAAA,IACF;AAEA,WAAO,IAAI,QAAQ,EAAE;AAErB,UAAM,cAAc,kBAAkB,QAAQ,MAAM;AAEpD,QAAI,YAAY,SAAS,GAAG;AAC1B;AAAA,IACF;AAEA,UAAM,OAAO,IAAI,KAAK,QAAQ,KAAK,OAAO;AAE1C,QAAI,OAAO,SAAS,OAAO,KAAK;AAC9B;AAAA,IACF;AAEA,UAAM,YAAY,mBAAmB,QAAQ,OAAO;AAEpD,wBAAoB,QAAQ,MAAM,aAAa,SAAS;AACxD,wBAAoB,aAAa,WAAW,WAAW;AAEvD,QAAI,QAAQ,aAAa;AACvB,0BAAoB,mBAAmB,WAAW,WAAW;AAAA,IAC/D;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AChGA,eAAsB,eAAe;AAAA,EACnC;AAAA,EACA;AACF,GAA4E;AAC1E,QAAM,CAAC,QAAQ,OAAO,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,IAClD,eAAe,OAAO,GAAG;AAAA,IACzB,cAAc,OAAO,GAAG;AAAA,IACxB,iBAAiB,OAAO,GAAG;AAAA,EAC7B,CAAC;AAED,SAAO;AAAA,IACL,QAAQ,SAAS,MAAM,IAAI,SAAS;AAAA,IACpC,OAAO,SAAS,KAAK,IAAI,QAAQ;AAAA,IACjC,UAAU,SAAS,QAAQ,IAAI,WAAW;AAAA,EAC5C;AACF;;;AbNA,IAAM,iBAAiB;AACvB,IAAM,YAAY;AAClB,IAAM,mBAAmB,iBAAiB;AAC1C,IAAM,sBAAsB;AAE5B,IAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBlB,SAAS,YAAY;AACnB,UAAQ,OAAO,MAAM,SAAS;AAChC;AAEA,SAAS,aAAa,QAAiD;AACrE;AAAA,IACE;AAAA,IACA,GAAG,OAAO,WAAW;AAAA,MACnB,QAAQ,GAAG,SAAS,OAAO;AAAA,MAC3B,QAAQ,GAAG,SAAS,OAAO;AAAA,MAC3B,MAAM,GAAG;AAAA,MACT,MAAM,GAAG;AAAA,MACT,QAAQ,GAAG;AAAA,MACX,OAAO,GAAG;AAAA,MACV,UAAU,GAAG;AAAA,IACf,CAAC;AAAA,EACH;AACF;AAEA,SAAS,YACP,WACA,WACA;AACA,MAAI,WAAW;AACb,OAAG,WAAW,GAAG,OAAO,MAAM,CAAC,OAAO,OAAO,MAAM,CAAU,CAAC;AAE9D,WAAO;AAAA,EACT;AAEA,MAAI,WAAW;AACb,UAAM,kBAAkB,QAAQ,SAAS,EAAE,YAAY;AAEvD,QAAI,oBAAoB,QAAQ;AAC9B,aAAO;AAAA,IACT;AAEA,QAAI,oBAAoB,SAAS;AAC/B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,iBACb,YACA,QACA,KACA,YACA;AACA,MAAI,WAAW,OAAO;AACpB,kBAAc,YAAY,KAAK,MAAM;AAErC;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,MAAM,OAAO,KAAK,GAAG,GAAG,EAAE,SAAS,IAAI,CAAC,EAC7D,OAAO,EAAE,OAAO,iBAAiB,CAAC,EAClC,QAAQ,EAAE,WAAW,CAAC,EACtB,IAAI,EACJ,SAAS;AAEZ,gBAAc,YAAY,SAAS;AACrC;AAEA,SAAS,gBAAgB,YAAoB,SAA4B;AACvE,gBAAc,YAAY,GAAG,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAC3E;AAEA,SAAS,mBAAmB,SAAyC;AACnE,SAAO;AAAA,IACL,UAAU,QAAQ;AAAA,IAClB,UAAU,QAAQ;AAAA,IAClB,OAAO,QAAQ,MAAM,IAAI,CAAC,SAAS;AAAA,MACjC,MAAM,gBAAgB,IAAI,IAAI;AAAA,MAC9B,OAAO,IAAI;AAAA,MACX,QAAQ,IAAI;AAAA,MACZ,OAAO,IAAI;AAAA,MACX,OAAO,IAAI;AAAA,MACX,WAAW,IAAI;AAAA,IACjB,EAAE;AAAA,EACJ;AACF;AAEA,SAAS,gBAAgB;AACvB,QAAM,QAAQ,oBAAI,KAAK;AACvB,QAAM,SAAS,GAAG,GAAG,GAAG,CAAC;AACzB,QAAM,YAAY,MAAM,YAAY,IAAI,CAAC;AAEzC,QAAM,MAAM,oBAAI,KAAK;AACrB,MAAI,SAAS,IAAI,IAAI,IAAI,GAAG;AAE5B,SAAO,EAAE,OAAO,IAAI;AACtB;AAEA,SAAS,0BACP,gBACA;AACA,aAAW,YAAY,aAAa;AAClC,UAAM,QAAQ,eAAe,QAAQ,IAAI,UAAU;AAEnD,YAAQ,OAAO,MAAM,GAAG,oBAAoB,QAAQ,CAAC,IAAI,KAAK;AAAA,CAAI;AAAA,EACpE;AACF;AAEA,SAAS,sBAAsB,QAAsB;AACnD,SAAO,YAAY,OAAO,CAAC,OAAO,OAAO,EAAE,CAAC;AAC9C;AAEA,SAAS,wBACP,gBACA,WACA;AACA,QAAM,oBACJ,UAAU,SAAS,IACf,UAAU,OAAO,CAAC,aAAa,eAAe,QAAQ,CAAC,IACvD,YAAY,OAAO,CAAC,aAAa,eAAe,QAAQ,CAAC;AAE/D,MAAI,UAAU,SAAS,KAAK,kBAAkB,SAAS,UAAU,QAAQ;AACvE,UAAM,UAAU,UAAU,OAAO,CAAC,aAAa,CAAC,eAAe,QAAQ,CAAC;AAExE,UAAM,IAAI;AAAA,MACR,sCAAsC,QAAQ,IAAI,CAAC,aAAa,oBAAoB,QAAQ,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,IAC3G;AAAA,EACF;AAEA,MAAI,kBAAkB,WAAW,GAAG;AAClC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,kBAAkB,IAAI,CAAC,aAAa,eAAe,QAAQ,CAAE;AACtE;AAEA,SAAS,gBACP,YACA,QACA,WACA,WACA,SACA,UACA;AACA,UAAQ,OAAO;AAAA,IACb,GAAG,KAAK;AAAA,MACN;AAAA,QACE,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,WAAW,gBAAgB,SAAS;AAAA,QACpC,SAAS,gBAAgB,OAAO;AAAA,QAChC;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA;AAAA,EACH;AACF;AAEA,eAAe,OAAO;AACpB,MAAI;AAEJ,QAAM,SAAS,UAAU;AAAA,IACvB,SAAS;AAAA,MACP,QAAQ,EAAE,MAAM,UAAU,OAAO,IAAI;AAAA,MACrC,QAAQ,EAAE,MAAM,UAAU,OAAO,IAAI;AAAA,MACrC,MAAM,EAAE,MAAM,WAAW,OAAO,KAAK,SAAS,MAAM;AAAA,MACpD,MAAM,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MACxC,QAAQ,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MAC1C,OAAO,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MACzC,UAAU,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,IAC9C;AAAA,IACA,kBAAkB;AAAA,EACpB,CAAC;AAED,eAAa,OAAO,MAAM;AAE1B,QAAM,EAAE,OAAO,IAAI;AAEnB,MAAI,OAAO,MAAM;AACf,cAAU;AAEV;AAAA,EACF;AAEA,MAAI;AACF,cAAU,IAAI;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC,EAAE,MAAM;AAET,UAAM,EAAE,OAAO,IAAI,IAAI,cAAc;AACrC,UAAM,YAAuB,OAAO,OAAO,SAAS;AACpD,UAAM,SAAS,YAAY,OAAO,QAAQ,OAAO,MAAM;AACvD,UAAM,iBAAiB,MAAM,eAAe,EAAE,OAAO,IAAI,CAAC;AAE1D,YAAQ,KAAK;AACb,8BAA0B,cAAc;AAExC,UAAM,kBAAkB;AAAA,MACtB;AAAA,MACA,sBAAsB,MAAM;AAAA,IAC9B;AAEA,UAAM,aAAaE;AAAA,MACjB,OAAO,UAAU,uBAAuB,MAAM;AAAA,IAChD;AAEA,cAAU,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAElD,QAAI,WAAW,QAAQ;AACrB,cAAQ,MAAM,0BAA0B;AAExC,YAAM,UAA6B;AAAA,QACjC,SAAS;AAAA,QACT,OAAO,gBAAgB,KAAK;AAAA,QAC5B,KAAK,gBAAgB,GAAG;AAAA,QACxB,WAAW,gBAAgB;AAAA,UAAI,CAAC,aAC9B,mBAAmB,QAAQ;AAAA,QAC7B;AAAA,MACF;AAEA,cAAQ,OAAO;AACf,sBAAgB,YAAY,OAAO;AAAA,IACrC,OAAO;AACL,cAAQ,MAAM,uBAAuB;AAErC,YAAM,MAAM,uBAAuB;AAAA,QACjC,WAAW;AAAA,QACX,SAAS;AAAA,QACT;AAAA,QACA,UAAU,gBAAgB,IAAI,CAAC,EAAE,UAAU,OAAO,SAAS,OAAO;AAAA,UAChE;AAAA,UACA;AAAA,UACA,OAAO,cAAc,QAAQ,EAAE;AAAA,UAC/B,QAAQ,cAAc,QAAQ,EAAE;AAAA,QAClC,EAAE;AAAA,MACJ,CAAC;AACD,YAAM,aAAa,cAAc,SAAS,YAAY;AAEtD,cAAQ,OAAO;AACf,YAAM,iBAAiB,YAAY,QAAQ,KAAK,UAAU;AAAA,IAC5D;AAEA,YAAQ,QAAQ,mBAAmB;AAEnC;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,gBAAgB,IAAI,CAAC,EAAE,SAAS,MAAM,QAAQ;AAAA,IAChD;AAAA,EACF,SAAS,OAAgB;AACvB,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAErE,QAAI,SAAS;AACX,cAAQ,KAAK,WAAW,OAAO,EAAE;AAAA,IACnC,OAAO;AACL,cAAQ,OAAO,MAAM,GAAG,OAAO;AAAA,CAAI;AAAA,IACrC;AAEA,YAAQ,WAAW;AAAA,EACrB;AACF;AAEA,KAAK,KAAK;","names":["resolve","registry","join","join","homedir","join","resolve","resolve","join","homedir","readFile","homedir","join","resolve","readFile","resolve","join","homedir","resolve"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "slopmeter",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CLI for generating yearly usage heatmaps for Claude Code, Codex, and Open Code.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"engines": {
|
|
7
|
+
"node": ">=22"
|
|
8
|
+
},
|
|
9
|
+
"license": "MIT",
|
|
10
|
+
"author": "Jean P.D. Meijer",
|
|
11
|
+
"homepage": "https://github.com/JeanMeijer/slopmeter",
|
|
12
|
+
"repository": {
|
|
13
|
+
"type": "git",
|
|
14
|
+
"url": "git+https://github.com/JeanMeijer/slopmeter.git"
|
|
15
|
+
},
|
|
16
|
+
"bugs": {
|
|
17
|
+
"url": "https://github.com/JeanMeijer/slopmeter/issues"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [
|
|
20
|
+
"cli",
|
|
21
|
+
"heatmap",
|
|
22
|
+
"usage",
|
|
23
|
+
"codex",
|
|
24
|
+
"claude-code",
|
|
25
|
+
"opencode"
|
|
26
|
+
],
|
|
27
|
+
"bin": {
|
|
28
|
+
"slopmeter": "./dist/cli.js"
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"dist",
|
|
32
|
+
"README.md",
|
|
33
|
+
"LICENSE"
|
|
34
|
+
],
|
|
35
|
+
"scripts": {
|
|
36
|
+
"dev": "tsx src/cli.ts",
|
|
37
|
+
"build": "tsup",
|
|
38
|
+
"typecheck": "tsc --noEmit",
|
|
39
|
+
"check": "bun run typecheck && bun run build",
|
|
40
|
+
"start": "node dist/cli.js",
|
|
41
|
+
"prepublishOnly": "bun run build",
|
|
42
|
+
"lint": "eslint .",
|
|
43
|
+
"lint:fix": "eslint . --fix"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@repo/eslint-config": "workspace:*",
|
|
47
|
+
"@stylistic/eslint-plugin": "^5.10.0",
|
|
48
|
+
"@types/node": "latest",
|
|
49
|
+
"eslint": "^9.39.2",
|
|
50
|
+
"tsup": "latest",
|
|
51
|
+
"tsx": "latest",
|
|
52
|
+
"typescript": "latest",
|
|
53
|
+
"typescript-eslint": "^8.50.1"
|
|
54
|
+
},
|
|
55
|
+
"dependencies": {
|
|
56
|
+
"ora": "^9.3.0",
|
|
57
|
+
"ow": "^3.1.1",
|
|
58
|
+
"sharp": "^0.34.5",
|
|
59
|
+
"svg-builder": "^3.0.4"
|
|
60
|
+
}
|
|
61
|
+
}
|