inboxctl 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/core/demo/index.ts","../src/tui/app.tsx","../src/core/demo/demo-transport.ts","../src/core/demo/seed.ts","../src/core/setup/setup.ts","../src/core/setup/gcloud.ts","../src/core/setup/credentials.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { createInterface } from \"node:readline/promises\";\nimport { stdin as input, stdout as output } from \"node:process\";\nimport {\n getGoogleCredentialStatus,\n loadConfig,\n type Config,\n} from \"./config.js\";\nimport {\n createExecutionRun,\n addExecutionItems,\n getRecentRuns,\n getRunsByEmail,\n} from \"./core/actions/audit.js\";\nimport { undoRun } from \"./core/actions/undo.js\";\nimport { startOAuthFlow } from \"./core/auth/oauth.js\";\nimport { isTokenExpired, loadTokens, saveTokens } from \"./core/auth/tokens.js\";\nimport { initializeDb } from \"./core/db/client.js\";\nimport { getGmailReadiness } from \"./core/gmail/client.js\";\nimport { createLabel, listLabels } from \"./core/gmail/labels.js\";\nimport { getMessage, listMessages } from \"./core/gmail/messages.js\";\nimport {\n archiveEmails,\n forwardEmail,\n labelEmails,\n markRead,\n} from \"./core/gmail/modify.js\";\nimport { getLabelDistribution } from \"./core/stats/labels.js\";\nimport { getNewsletters } from \"./core/stats/newsletters.js\";\nimport { getSenderStats, getTopSenders } from \"./core/stats/sender.js\";\nimport { getInboxOverview, getVolumeByPeriod } from \"./core/stats/volume.js\";\nimport {\n deployAllRules,\n deployLoadedRule,\n detectDrift,\n disableRule,\n enableRule,\n getAllRulesStatus,\n getRuleStatus,\n} from \"./core/rules/deploy.js\";\nimport { loadRuleFile } from \"./core/rules/loader.js\";\nimport { runAllRules, runRule } from \"./core/rules/executor.js\";\nimport {\n createFilter,\n deleteFilter,\n getFilter,\n listFilters,\n} from \"./core/gmail/filters.js\";\nimport { runDemoSession } from \"./core/demo/index.js\";\nimport { runSetupWizard } from \"./core/setup/setup.js\";\nimport { getGmailTransport } from \"./core/gmail/transport.js\";\nimport { getRecentEmails } from \"./core/sync/cache.js\";\nimport {\n fullSync,\n getSyncStatus,\n incrementalSync,\n reconcileCacheForAuthenticatedAccount,\n} from \"./core/sync/sync.js\";\nimport { startMcpServer } from \"./mcp/server.js\";\nimport { startTuiApp } from \"./tui/app.js\";\nimport type { Action } from \"./core/rules/types.js\";\n\nconst program = new Command();\n\ninterface RuntimeStatus {\n config: Config;\n tokensPresent: boolean;\n tokenExpired: boolean | null;\n googleConfigured: boolean;\n googleMissing: string[];\n gmailReady: boolean;\n}\n\ninterface MutationItem {\n emailId: string;\n status: \"planned\" | \"applied\" | \"warning\" | \"error\" | \"undone\";\n beforeLabelIds: string[];\n afterLabelIds: string[];\n errorMessage?: string | null;\n}\n\ninterface MutationResult {\n items: MutationItem[];\n}\n\nconst colorEnabled = output.isTTY && process.env.NO_COLOR === undefined;\n\nfunction ansi(code: number, value: string): string {\n return colorEnabled ? `\\u001B[${code}m${value}\\u001B[0m` : value;\n}\n\nconst ui = {\n bold: (value: string) => ansi(1, value),\n dim: (value: string) => ansi(2, value),\n cyan: (value: string) => ansi(36, value),\n green: (value: string) => ansi(32, value),\n yellow: (value: string) => ansi(33, value),\n red: (value: string) => ansi(31, value),\n magenta: (value: string) => ansi(35, value),\n};\n\nfunction stripAnsi(value: string): string {\n return value.replace(/\\u001B\\[[0-9;]*m/g, \"\");\n}\n\nfunction truncate(value: string, width: number): string {\n if (width <= 0) {\n return \"\";\n }\n\n if (value.length <= width) {\n return value;\n }\n\n if (width <= 1) {\n return value.slice(0, width);\n }\n\n return `${value.slice(0, width - 1)}…`;\n}\n\nfunction pad(value: string, width: number): string {\n const visible = stripAnsi(value);\n\n if (visible.length >= width) {\n return value;\n }\n\n return `${value}${\" \".repeat(width - visible.length)}`;\n}\n\nfunction printSection(title: string): void {\n console.log(ui.bold(title));\n}\n\nfunction printKeyValue(label: string, value: string): void {\n console.log(`${ui.dim(`${label}:`)} ${value}`);\n}\n\nfunction formatStatus(status: MutationItem[\"status\"] | \"partial\" | \"noop\"): string {\n const upper = status.toUpperCase();\n\n switch (status) {\n case \"applied\":\n case \"undone\":\n return ui.green(upper);\n case \"warning\":\n case \"partial\":\n case \"noop\":\n return ui.yellow(upper);\n case \"error\":\n return ui.red(upper);\n case \"planned\":\n return ui.cyan(upper);\n }\n}\n\nfunction hasLabelChange(item: MutationItem): boolean {\n return item.beforeLabelIds.join(\"\\0\") !== item.afterLabelIds.join(\"\\0\");\n}\n\nfunction formatList(values: string[]): string {\n return values.length > 0 ? values.join(\", \") : \"none\";\n}\n\nasync function loadRuntimeStatus(): Promise<RuntimeStatus> {\n const config = loadConfig();\n initializeDb(config.dbPath);\n\n const tokens = await loadTokens(config.tokensPath);\n const googleStatus = getGoogleCredentialStatus(config);\n const gmailReadiness = getGmailReadiness(config, tokens);\n\n return {\n config,\n tokensPresent: tokens !== null,\n tokenExpired: tokens ? isTokenExpired(tokens) : null,\n googleConfigured: googleStatus.configured,\n googleMissing: googleStatus.missing,\n gmailReady: gmailReadiness.ready,\n };\n}\n\nfunction printCheckpointSummary(status: RuntimeStatus): void {\n printSection(\"Environment\");\n printKeyValue(\"dataDir\", status.config.dataDir);\n printKeyValue(\"dbPath\", status.config.dbPath);\n printKeyValue(\"rulesDir\", status.config.rulesDir);\n printKeyValue(\"tokensPath\", status.config.tokensPath);\n printKeyValue(\n \"googleCredentials\",\n status.googleConfigured ? ui.green(\"configured\") : ui.red(\"missing\"),\n );\n printKeyValue(\"missingGoogleCredentials\", formatList(status.googleMissing));\n printKeyValue(\"tokens\", status.tokensPresent ? ui.green(\"present\") : ui.red(\"missing\"));\n printKeyValue(\n \"tokenExpired\",\n status.tokenExpired === null ? ui.dim(\"unknown (no tokens yet)\") : status.tokenExpired ? ui.red(\"yes\") : ui.green(\"no\"),\n );\n printKeyValue(\"gmailReady\", status.gmailReady ? ui.green(\"yes\") : ui.red(\"no\"));\n}\n\nfunction printGoogleCheckpointInstructions(status: RuntimeStatus): void {\n console.log(\"\");\n console.log(\"Gmail access is not ready yet.\");\n\n if (!status.googleConfigured) {\n console.log(\"Still needed:\");\n console.log(`- GOOGLE_CLIENT_ID${status.googleMissing.includes(\"GOOGLE_CLIENT_ID\") ? \" (missing)\" : \"\"}`);\n console.log(\n `- GOOGLE_CLIENT_SECRET${status.googleMissing.includes(\"GOOGLE_CLIENT_SECRET\") ? \" (missing)\" : \"\"}`,\n );\n console.log(\"- OAuth consent screen configured in Google Cloud\");\n console.log(\"- Localhost redirect URI allowed for the OAuth client\");\n console.log(\"- Run `inboxctl setup` to configure this interactively\");\n return;\n }\n\n if (!status.tokensPresent) {\n console.log(\"Google OAuth credentials are configured, but no Gmail account is authenticated yet.\");\n console.log(\"- Run `inboxctl auth login` to sign in\");\n return;\n }\n\n if (status.tokenExpired) {\n console.log(\"A Gmail account was authenticated before, but the saved token is expired or unusable.\");\n console.log(\"- Run `inboxctl auth login` again\");\n return;\n }\n\n console.log(\"Google OAuth is configured, but Gmail readiness still failed.\");\n console.log(\"- Re-run `inboxctl auth login`\");\n}\n\nasync function requireLiveGmailReadiness(commandName: string): Promise<void> {\n const status = await loadRuntimeStatus();\n\n if (!status.gmailReady) {\n console.log(`${commandName} requires authenticated Gmail access.`);\n printCheckpointSummary(status);\n printGoogleCheckpointInstructions(status);\n process.exitCode = 1;\n return;\n }\n}\n\nasync function resolveAuthenticatedEmail(config: Config): Promise<string | null> {\n const tokens = await loadTokens(config.tokensPath);\n\n if (!tokens) {\n return null;\n }\n\n if (tokens.email && tokens.email !== \"unknown\") {\n return tokens.email;\n }\n\n const transport = await getGmailTransport(config);\n const profile = await transport.getProfile();\n\n if (!profile.emailAddress) {\n return null;\n }\n\n await saveTokens(config.tokensPath, {\n ...tokens,\n email: profile.emailAddress,\n });\n\n return profile.emailAddress;\n}\n\nfunction formatEmailRow(email: {\n id: string;\n date: number;\n fromAddress: string;\n subject: string;\n isRead: boolean;\n}): string {\n const state = pad(email.isRead ? ui.dim(\"read\") : ui.yellow(\"unread\"), 6);\n const date = ui.dim(new Date(email.date).toISOString().slice(0, 10));\n const sender = pad(truncate(email.fromAddress, 30), 30);\n const subject = truncate(email.subject, 58);\n const id = ui.dim(email.id);\n return `${state} ${date} ${sender} ${subject} ${id}`;\n}\n\nfunction printEmailTableHeader(): void {\n console.log(\n [\n pad(ui.dim(\"STATE\"), 6),\n ui.dim(\"DATE\"),\n pad(ui.dim(\"FROM\"), 30),\n ui.dim(\"SUBJECT\"),\n ui.dim(\"ID\"),\n ].join(\" \"),\n );\n}\n\nfunction formatTimestamp(value: number | null | undefined): string {\n if (!value) {\n return \"-\";\n }\n\n return new Date(value).toISOString();\n}\n\nfunction formatDate(value: number | Date | null | undefined): string {\n if (!value) {\n return \"-\";\n }\n\n const timestamp = value instanceof Date ? value.getTime() : value;\n return new Date(timestamp).toISOString().slice(0, 10);\n}\n\nfunction formatRelativeTime(value: number | Date | null | undefined): string {\n if (!value) {\n return \"-\";\n }\n\n const timestamp = value instanceof Date ? value.getTime() : value;\n const diff = Date.now() - timestamp;\n\n if (diff < 0) {\n return formatDate(timestamp);\n }\n\n if (diff < 60_000) {\n return `${Math.max(1, Math.floor(diff / 1_000))}s ago`;\n }\n\n if (diff < 3_600_000) {\n return `${Math.floor(diff / 60_000)}m ago`;\n }\n\n if (diff < 86_400_000) {\n return `${Math.floor(diff / 3_600_000)}h ago`;\n }\n\n if (diff < 604_800_000) {\n return `${Math.floor(diff / 86_400_000)}d ago`;\n }\n\n if (diff < 2_592_000_000) {\n return `${Math.floor(diff / 604_800_000)}w ago`;\n }\n\n return formatDate(timestamp);\n}\n\nfunction formatPercent(value: number): string {\n const normalized = Number.isInteger(value) ? String(value) : value.toFixed(1).replace(/\\.0$/, \"\");\n return `${normalized}%`;\n}\n\nfunction formatSenderIdentity(name: string, email: string, width: number): string {\n const identity = name && name !== email ? `${name} <${email}>` : email;\n return pad(truncate(identity, width), width);\n}\n\nfunction parseIntegerOption(value: string, label: string, min: number = 1): number {\n const parsed = Number(value);\n\n if (!Number.isInteger(parsed) || parsed < min) {\n throw new Error(`${label} must be an integer greater than or equal to ${min}.`);\n }\n\n return parsed;\n}\n\nfunction parsePercentOption(value: string | undefined, label: string): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n const parsed = Number(value);\n\n if (Number.isNaN(parsed) || parsed < 0 || parsed > 100) {\n throw new Error(`${label} must be between 0 and 100.`);\n }\n\n return parsed;\n}\n\nfunction printInboxOverview(overview: Awaited<ReturnType<typeof getInboxOverview>>): void {\n printSection(\"Inbox Overview\");\n printKeyValue(\"total\", String(overview.total));\n printKeyValue(\"unread\", overview.unread > 0 ? ui.yellow(String(overview.unread)) : ui.dim(\"0\"));\n printKeyValue(\"starred\", overview.starred > 0 ? ui.magenta(String(overview.starred)) : ui.dim(\"0\"));\n printKeyValue(\n \"today\",\n `${overview.today.received} received, ${overview.today.unread} unread`,\n );\n printKeyValue(\n \"thisWeek\",\n `${overview.thisWeek.received} received, ${overview.thisWeek.unread} unread`,\n );\n printKeyValue(\n \"thisMonth\",\n `${overview.thisMonth.received} received, ${overview.thisMonth.unread} unread`,\n );\n printKeyValue(\n \"oldestUnread\",\n overview.oldestUnread\n ? `${formatRelativeTime(overview.oldestUnread)} (${formatDate(overview.oldestUnread)})`\n : \"-\",\n );\n}\n\nfunction printTopSendersTable(\n label: string,\n senders: Awaited<ReturnType<typeof getTopSenders>>,\n): void {\n printSection(`Top Senders (${label})`);\n console.log(\n [\n pad(ui.dim(\"SENDER\"), 42),\n pad(ui.dim(\"TOTAL\"), 7),\n pad(ui.dim(\"UNREAD\"), 8),\n pad(ui.dim(\"UNREAD%\"), 8),\n ui.dim(\"LAST EMAIL\"),\n ].join(\" \"),\n );\n\n for (const sender of senders) {\n console.log(\n [\n formatSenderIdentity(sender.name, sender.email, 42),\n pad(String(sender.totalMessages), 7),\n pad(String(sender.unreadMessages), 8),\n pad(formatPercent(sender.unreadRate), 8),\n formatRelativeTime(sender.lastEmailDate),\n ].join(\" \"),\n );\n }\n}\n\nfunction printNewslettersTable(\n newsletters: Awaited<ReturnType<typeof getNewsletters>>,\n): void {\n printSection(\"Newsletters\");\n console.log(\n [\n pad(ui.dim(\"SENDER\"), 36),\n pad(ui.dim(\"TOTAL\"), 7),\n pad(ui.dim(\"UNREAD\"), 8),\n pad(ui.dim(\"UNREAD%\"), 8),\n pad(ui.dim(\"STATUS\"), 14),\n pad(ui.dim(\"LAST EMAIL\"), 11),\n ui.dim(\"REASON\"),\n ].join(\" \"),\n );\n\n for (const sender of newsletters) {\n const statusColor =\n sender.status === \"active\"\n ? ui.green(sender.status)\n : sender.status === \"archived\"\n ? ui.dim(sender.status)\n : ui.yellow(sender.status);\n\n console.log(\n [\n formatSenderIdentity(sender.name, sender.email, 36),\n pad(String(sender.messageCount), 7),\n pad(String(sender.unreadCount), 8),\n pad(formatPercent(sender.unreadRate), 8),\n pad(statusColor, 14),\n pad(formatRelativeTime(sender.lastSeen), 11),\n truncate(sender.detectionReason, 32),\n ].join(\" \"),\n );\n }\n}\n\nfunction printLabelDistributionTable(\n labels: Awaited<ReturnType<typeof getLabelDistribution>>,\n): void {\n printSection(\"Label Distribution\");\n console.log(\n [\n pad(ui.dim(\"LABEL\"), 22),\n pad(ui.dim(\"TOTAL\"), 7),\n pad(ui.dim(\"UNREAD\"), 8),\n ui.dim(\"ID\"),\n ].join(\" \"),\n );\n\n for (const label of labels) {\n console.log(\n [\n pad(truncate(label.labelName, 22), 22),\n pad(String(label.totalMessages), 7),\n pad(String(label.unreadMessages), 8),\n ui.dim(label.labelId),\n ].join(\" \"),\n );\n }\n}\n\nfunction printVolumeTable(\n label: string,\n points: Awaited<ReturnType<typeof getVolumeByPeriod>>,\n): void {\n printSection(`Volume (${label})`);\n console.log(\n [\n pad(ui.dim(\"PERIOD\"), 12),\n pad(ui.dim(\"RECEIVED\"), 10),\n pad(ui.dim(\"READ\"), 7),\n pad(ui.dim(\"UNREAD\"), 8),\n ui.dim(\"ARCHIVED\"),\n ].join(\" \"),\n );\n\n for (const point of points) {\n console.log(\n [\n pad(point.period, 12),\n pad(String(point.received), 10),\n pad(String(point.read), 7),\n pad(String(point.unread), 8),\n String(point.archived),\n ].join(\" \"),\n );\n }\n}\n\nfunction printSenderDetail(detail: NonNullable<Awaited<ReturnType<typeof getSenderStats>>>): void {\n printSection(detail.query);\n printKeyValue(\"type\", detail.type);\n printKeyValue(\"name\", detail.name);\n printKeyValue(\"messages\", String(detail.totalMessages));\n printKeyValue(\"unread\", `${detail.unreadMessages} (${formatPercent(detail.unreadRate)})`);\n printKeyValue(\"firstSeen\", formatDate(detail.firstEmailDate));\n printKeyValue(\n \"lastSeen\",\n `${formatRelativeTime(detail.lastEmailDate)} (${formatDate(detail.lastEmailDate)})`,\n );\n printKeyValue(\"labels\", detail.labels.join(\", \") || \"-\");\n\n if (detail.type === \"domain\") {\n printKeyValue(\"matchedSenders\", String(detail.matchingSenders.length));\n for (const sender of detail.matchingSenders) {\n console.log(`- ${sender}`);\n }\n }\n\n if (detail.recentEmails.length === 0) {\n return;\n }\n\n console.log(\"\");\n printSection(\"Recent Emails\");\n console.log(\n [\n pad(ui.dim(\"STATE\"), 6),\n pad(ui.dim(\"DATE\"), 10),\n pad(ui.dim(\"FROM\"), 30),\n ui.dim(\"SUBJECT\"),\n ].join(\" \"),\n );\n\n for (const email of detail.recentEmails) {\n console.log(\n [\n pad(email.isRead ? ui.dim(\"read\") : ui.yellow(\"unread\"), 6),\n pad(formatDate(email.date), 10),\n pad(truncate(email.fromAddress, 30), 30),\n truncate(email.subject || \"(no subject)\", 60),\n ].join(\" \"),\n );\n }\n}\n\nfunction getVolumeRange(period: \"day\" | \"week\" | \"month\"): { start: number; end: number } {\n const end = Date.now();\n const dayMs = 24 * 60 * 60 * 1000;\n\n switch (period) {\n case \"day\":\n return { start: end - 30 * dayMs, end };\n case \"week\":\n return { start: end - 26 * 7 * dayMs, end };\n case \"month\":\n return { start: end - 365 * dayMs, end };\n }\n}\n\nfunction formatActions(actions: Action[]): string {\n if (actions.length === 0) {\n return \"none\";\n }\n\n return actions\n .map((action) => {\n switch (action.type) {\n case \"label\":\n return `label:${action.label}`;\n case \"forward\":\n return `forward:${action.to}`;\n case \"archive\":\n return \"archive\";\n case \"mark_read\":\n return \"mark_read\";\n case \"mark_spam\":\n return \"mark_spam\";\n }\n })\n .join(\", \");\n}\n\nasync function promptForConfirmation(message: string): Promise<boolean> {\n const rl = createInterface({ input, output });\n\n try {\n const answer = await rl.question(`${message} [y/N] `);\n const normalized = answer.trim().toLowerCase();\n return normalized === \"y\" || normalized === \"yes\";\n } finally {\n rl.close();\n }\n}\n\nasync function collectMessageIdsForQuery(query: string): Promise<string[]> {\n const config = loadConfig();\n const transport = await getGmailTransport(config);\n const ids = new Set<string>();\n let pageToken: string | undefined;\n\n do {\n const response = await transport.listMessages({\n query,\n maxResults: 500,\n pageToken,\n });\n\n for (const message of response.messages || []) {\n if (message.id) {\n ids.add(message.id);\n }\n }\n\n pageToken = response.nextPageToken || undefined;\n } while (pageToken);\n\n return [...ids];\n}\n\nasync function resolveMessageIds(id: string | undefined, query?: string): Promise<string[]> {\n if (query) {\n return collectMessageIdsForQuery(query);\n }\n\n if (!id) {\n throw new Error(\"Provide an email ID or use --query to target matching Gmail messages.\");\n }\n\n return [id];\n}\n\nasync function confirmBatchIfNeeded(query: string | undefined, ids: string[], verb: string): Promise<void> {\n if (!query || ids.length <= 1) {\n return;\n }\n\n const confirmed = await promptForConfirmation(\n `Found ${ids.length} emails matching \"${query}\"\\n${verb} all ${ids.length} emails?`,\n );\n\n if (!confirmed) {\n throw new Error(\"Cancelled.\");\n }\n}\n\nasync function recordManualRun(options: {\n query?: string;\n requestedActions: Action[];\n result: MutationResult;\n}): Promise<string> {\n const run = await createExecutionRun({\n sourceType: \"manual\",\n ruleId: null,\n dryRun: false,\n requestedActions: options.requestedActions,\n query: options.query || null,\n status: options.result.items.every((item) => item.status === \"applied\")\n ? \"applied\"\n : options.result.items.some((item) => item.status === \"applied\" || item.status === \"warning\")\n ? \"partial\"\n : \"error\",\n });\n\n await addExecutionItems(\n run.id,\n options.result.items.map((item) => ({\n emailId: item.emailId,\n status: item.status,\n appliedActions: options.requestedActions,\n beforeLabelIds: item.beforeLabelIds,\n afterLabelIds: item.afterLabelIds,\n errorMessage: item.errorMessage || null,\n })),\n );\n\n return run.id;\n}\n\nfunction printMutationSummary(result: MutationResult, runId: string): void {\n const applied = result.items.filter((item) => item.status === \"applied\").length;\n const warnings = result.items.filter((item) => item.status === \"warning\").length;\n const errors = result.items.filter((item) => item.status === \"error\").length;\n const noops = result.items.filter((item) => item.status === \"applied\" && !hasLabelChange(item)).length;\n\n printSection(`Run ${ui.dim(runId)}`);\n printKeyValue(\"total\", String(result.items.length));\n printKeyValue(\"applied\", ui.green(String(applied)));\n printKeyValue(\"noChange\", noops > 0 ? ui.yellow(String(noops)) : ui.dim(\"0\"));\n printKeyValue(\"warnings\", warnings > 0 ? ui.yellow(String(warnings)) : ui.dim(\"0\"));\n printKeyValue(\"errors\", errors > 0 ? ui.red(String(errors)) : ui.dim(\"0\"));\n console.log(\"\");\n\n for (const item of result.items) {\n const displayStatus =\n item.status === \"applied\" && !hasLabelChange(item) ? \"noop\" : item.status;\n const line = [\n pad(formatStatus(displayStatus), 9),\n ui.dim(item.emailId),\n `${ui.dim(\"before\")} ${item.beforeLabelIds.join(\",\") || \"-\"}`,\n `${ui.dim(\"after\")} ${item.afterLabelIds.join(\",\") || \"-\"}`,\n ].join(\" \");\n console.log(line);\n\n if (item.errorMessage) {\n console.log(` ${ui.yellow(\"note\")} ${item.errorMessage}`);\n }\n }\n}\n\nfunction printHistoryTable(runs: Awaited<ReturnType<typeof getRecentRuns>>): void {\n printSection(\"History\");\n console.log(\n [\n pad(ui.dim(\"STATUS\"), 10),\n pad(ui.dim(\"ACTION\"), 20),\n pad(ui.dim(\"WHEN\"), 22),\n pad(ui.dim(\"RUN ID\"), 38),\n ui.dim(\"QUERY\"),\n ].join(\" \"),\n );\n\n for (const run of runs) {\n console.log(\n [\n pad(formatStatus(run.status), 10),\n pad(truncate(formatActions(run.requestedActions), 20), 20),\n pad(ui.dim(formatTimestamp(run.createdAt)), 22),\n pad(ui.dim(run.id), 38),\n truncate(run.query || \"-\", 60),\n ].join(\" \"),\n );\n }\n}\n\nfunction formatEnabled(enabled: boolean): string {\n return enabled ? ui.green(\"enabled\") : ui.yellow(\"disabled\");\n}\n\ntype RuleDeploySummaryInput =\n | Awaited<ReturnType<typeof deployAllRules>>\n | Awaited<ReturnType<typeof deployLoadedRule>>;\n\nfunction printRuleDeploySummary(result: RuleDeploySummaryInput): void {\n const results = (Array.isArray(result) ? result : [result]) as Array<{\n status: \"created\" | \"updated\" | \"unchanged\";\n name: string;\n priority: number;\n enabled: boolean;\n }>;\n\n printSection(\"Rules Deployed\");\n console.log(\n [\n pad(ui.dim(\"STATUS\"), 10),\n pad(ui.dim(\"NAME\"), 28),\n pad(ui.dim(\"PRIORITY\"), 8),\n pad(ui.dim(\"ENABLED\"), 10),\n ui.dim(\"FILE\"),\n ].join(\" \"),\n );\n\n for (const entry of results) {\n const statusColor =\n entry.status === \"created\"\n ? ui.green(entry.status.toUpperCase())\n : entry.status === \"updated\"\n ? ui.yellow(entry.status.toUpperCase())\n : ui.dim(entry.status.toUpperCase());\n\n console.log(\n [\n pad(statusColor, 10),\n pad(entry.name, 28),\n pad(String(entry.priority), 8),\n pad(formatEnabled(entry.enabled), 10),\n truncate(\"-\", 60),\n ].join(\" \"),\n );\n }\n}\n\nfunction printRuleStatusTable(rules: Awaited<ReturnType<typeof getAllRulesStatus>>): void {\n printSection(\"Rules\");\n console.log(\n [\n pad(ui.dim(\"NAME\"), 28),\n pad(ui.dim(\"STATE\"), 10),\n pad(ui.dim(\"PRIORITY\"), 8),\n pad(ui.dim(\"RUNS\"), 6),\n pad(ui.dim(\"LAST RUN\"), 22),\n ui.dim(\"ACTIONS\"),\n ].join(\" \"),\n );\n\n for (const rule of rules) {\n console.log(\n [\n pad(truncate(rule.name, 28), 28),\n pad(formatEnabled(rule.enabled), 10),\n pad(String(rule.priority), 8),\n pad(String(rule.totalRuns), 6),\n pad(ui.dim(formatTimestamp(rule.lastExecutionAt)), 22),\n truncate(formatActions(rule.actions), 40),\n ].join(\" \"),\n );\n }\n}\n\nfunction printRuleStatusDetail(rule: NonNullable<Awaited<ReturnType<typeof getRuleStatus>>>): void {\n printSection(rule.name);\n printKeyValue(\"description\", rule.description || \"-\");\n printKeyValue(\"enabled\", formatEnabled(rule.enabled));\n printKeyValue(\"priority\", String(rule.priority));\n printKeyValue(\"actions\", formatActions(rule.actions));\n printKeyValue(\"totalRuns\", String(rule.totalRuns));\n printKeyValue(\"appliedRuns\", String(rule.appliedRuns));\n printKeyValue(\"partialRuns\", String(rule.partialRuns));\n printKeyValue(\"errorRuns\", String(rule.errorRuns));\n printKeyValue(\"undoneRuns\", String(rule.undoneRuns));\n printKeyValue(\"lastRunId\", rule.lastRunId ? ui.dim(rule.lastRunId) : \"-\");\n printKeyValue(\"lastExecutionAt\", ui.dim(formatTimestamp(rule.lastExecutionAt)));\n}\n\nfunction printRuleRunResult(result: Awaited<ReturnType<typeof runRule>>): void {\n printSection(`Rule ${result.rule.name}`);\n printKeyValue(\"mode\", result.dryRun ? ui.cyan(\"dry-run\") : ui.green(\"apply\"));\n printKeyValue(\"runId\", ui.dim(result.runId));\n printKeyValue(\"status\", formatStatus(result.status));\n printKeyValue(\"matched\", String(result.matchedCount));\n printKeyValue(\"actions\", formatActions(result.rule.actions));\n console.log(\"\");\n\n if (result.items.length === 0) {\n console.log(\"No matching cached emails.\");\n return;\n }\n\n for (const item of result.items) {\n const subject = truncate(item.subject || \"(no subject)\", 50);\n const from = truncate(item.fromAddress || \"-\", 28);\n const date = ui.dim(new Date(item.date).toISOString().slice(0, 10));\n console.log(\n [\n pad(formatStatus(item.status), 9),\n pad(from, 28),\n pad(date, 12),\n subject,\n ].join(\" \"),\n );\n console.log(` ${ui.dim(item.emailId)} matched=${item.matchedFields.join(\",\") || \"-\"}`);\n\n if (item.errorMessage) {\n console.log(` ${ui.yellow(\"note\")} ${item.errorMessage}`);\n }\n }\n\n if (result.dryRun) {\n console.log(\"\");\n console.log(\"Run again with `--apply` to execute these actions.\");\n }\n}\n\nfunction printRunAllRulesResult(result: Awaited<ReturnType<typeof runAllRules>>): void {\n if (result.results.length === 0) {\n console.log(\"No enabled rules are currently deployed.\");\n return;\n }\n\n for (const ruleResult of result.results) {\n printRuleRunResult(ruleResult);\n console.log(\"\");\n }\n}\n\nfunction printDriftReport(result: Awaited<ReturnType<typeof detectDrift>>): void {\n printSection(\"Rule Drift\");\n console.log(\n [\n pad(ui.dim(\"STATUS\"), 14),\n pad(ui.dim(\"NAME\"), 28),\n pad(ui.dim(\"DEPLOYED\"), 16),\n pad(ui.dim(\"FILE\"), 16),\n ui.dim(\"PATH\"),\n ].join(\" \"),\n );\n\n for (const entry of result.entries) {\n const label =\n entry.status === \"in_sync\"\n ? ui.green(\"IN_SYNC\")\n : entry.status === \"changed\"\n ? ui.yellow(\"CHANGED\")\n : ui.red(entry.status.toUpperCase());\n\n console.log(\n [\n pad(label, 14),\n pad(truncate(entry.name, 28), 28),\n pad(truncate(entry.deployedHash || \"-\", 16), 16),\n pad(truncate(entry.fileHash || \"-\", 16), 16),\n truncate(entry.filePath || \"-\", 60),\n ].join(\" \"),\n );\n }\n}\n\nprogram\n .name(\"inboxctl\")\n .description(\"CLI email management with MCP server, rules-as-code, and TUI\")\n .version(\"0.1.0\")\n .option(\"--demo\", \"Launch the seeded demo mailbox\")\n .option(\"--no-sync\", \"Launch the TUI without running the initial background sync\");\n\nprogram\n .command(\"setup\")\n .description(\"Run the interactive Google Cloud and OAuth setup wizard\")\n .option(\"--skip-gcloud\", \"Skip gcloud detection and API enablement\")\n .option(\"--project <id>\", \"Pre-set the Google Cloud project ID\")\n .action(async (options) => {\n try {\n await runSetupWizard({\n skipGcloud: options.skipGcloud,\n project: options.project,\n });\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nconst auth = program.command(\"auth\").description(\"Gmail authentication\");\n\nauth\n .command(\"login\")\n .description(\"Authenticate with Gmail via OAuth2\")\n .action(async () => {\n const config = loadConfig();\n\n try {\n const result = await startOAuthFlow(config);\n const reconciliation = reconcileCacheForAuthenticatedAccount(\n config.dbPath,\n result.email,\n { clearLegacyUnscoped: true },\n );\n console.log(`Authenticated Gmail account: ${result.email}`);\n console.log(`Redirect URI used: ${result.redirectUri}`);\n if (reconciliation.cleared) {\n console.log(\"Local cache reset to avoid mixing data from another Gmail account.\");\n }\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n const status = await loadRuntimeStatus();\n printCheckpointSummary(status);\n printGoogleCheckpointInstructions(status);\n process.exitCode = 1;\n }\n });\n\nauth\n .command(\"status\")\n .description(\"Show authentication status\")\n .action(async () => {\n const status = await loadRuntimeStatus();\n printCheckpointSummary(status);\n\n if (status.tokensPresent) {\n try {\n const email = await resolveAuthenticatedEmail(status.config);\n if (email) {\n console.log(`authenticatedEmail: ${email}`);\n }\n } catch (error) {\n console.log(\n `authenticatedEmail: unavailable (${\n error instanceof Error ? error.message : String(error)\n })`,\n );\n }\n }\n\n if (!status.gmailReady) {\n printGoogleCheckpointInstructions(status);\n }\n });\n\nprogram\n .command(\"sync\")\n .description(\"Sync emails from Gmail\")\n .option(\"--full\", \"Force full sync (ignore incremental)\")\n .action(async (options) => {\n const status = await loadRuntimeStatus();\n\n if (!status.gmailReady) {\n await requireLiveGmailReadiness(\"sync\");\n return;\n }\n\n const result = options.full\n ? await fullSync((synced, total) => {\n console.log(`synced=${synced}${total ? ` total=${total}` : \"\"}`);\n })\n : await incrementalSync();\n\n console.log(`mode: ${result.mode}`);\n console.log(`messagesProcessed: ${result.messagesProcessed}`);\n console.log(`historyId: ${result.historyId}`);\n console.log(`usedHistoryFallback: ${result.usedHistoryFallback ? \"yes\" : \"no\"}`);\n\n const syncStatus = await getSyncStatus();\n console.log(`cacheTotalMessages: ${syncStatus.totalMessages}`);\n });\n\nprogram\n .command(\"inbox\")\n .description(\"List recent inbox emails\")\n .option(\"-n, --count <number>\", \"Number of emails to show\", \"20\")\n .action(async (options) => {\n const emails = await getRecentEmails(Number(options.count));\n\n if (emails.length === 0) {\n console.log(\"No cached emails yet. Run `inboxctl sync` first.\");\n return;\n }\n\n printSection(\"Inbox\");\n printEmailTableHeader();\n for (const email of emails) {\n console.log(formatEmailRow(email));\n }\n });\n\nprogram\n .command(\"search <query>\")\n .description(\"Search emails using Gmail query syntax\")\n .option(\"-n, --count <number>\", \"Max results\", \"20\")\n .action(async (query, options) => {\n const status = await loadRuntimeStatus();\n\n if (!status.gmailReady) {\n await requireLiveGmailReadiness(\"search\");\n return;\n }\n\n const emails = await listMessages(query, Number(options.count));\n\n if (emails.length === 0) {\n console.log(\"No matching Gmail messages.\");\n return;\n }\n\n printSection(`Search ${ui.dim(query)}`);\n printEmailTableHeader();\n for (const email of emails) {\n console.log(formatEmailRow(email));\n }\n });\n\nprogram\n .command(\"email <id>\")\n .description(\"View a single email\")\n .action(async (id) => {\n const status = await loadRuntimeStatus();\n\n if (!status.gmailReady) {\n await requireLiveGmailReadiness(\"email\");\n return;\n }\n\n const email = await getMessage(id);\n printSection(email.subject || \"Email\");\n printKeyValue(\"from\", email.fromAddress);\n printKeyValue(\"to\", email.toAddresses.join(\", \"));\n printKeyValue(\"date\", new Date(email.date).toISOString());\n printKeyValue(\"labels\", email.labelIds.join(\", \") || \"-\");\n console.log(\"\");\n console.log(email.textPlain || email.body || email.snippet);\n });\n\nprogram\n .command(\"archive [id]\")\n .description(\"Archive email(s)\")\n .option(\"-q, --query <query>\", \"Archive all emails matching query\")\n .action(async (id, options) => {\n const status = await loadRuntimeStatus();\n\n if (!status.gmailReady) {\n await requireLiveGmailReadiness(\"archive\");\n return;\n }\n\n try {\n const ids = await resolveMessageIds(id, options.query);\n\n if (ids.length === 0) {\n console.log(\"No matching Gmail messages.\");\n return;\n }\n\n await confirmBatchIfNeeded(options.query, ids, \"Archive\");\n const result = await archiveEmails(ids);\n const runId = await recordManualRun({\n query: options.query,\n requestedActions: [{ type: \"archive\" }],\n result,\n });\n printMutationSummary(result, runId);\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nprogram\n .command(\"label <idOrLabel> [label]\")\n .description(\"Apply label to email(s)\")\n .option(\"-q, --query <query>\", \"Label all emails matching query\")\n .action(async (idOrLabel, label, options) => {\n const status = await loadRuntimeStatus();\n\n if (!status.gmailReady) {\n await requireLiveGmailReadiness(\"label\");\n return;\n }\n\n const labelName = options.query ? label || idOrLabel : label;\n const id = options.query ? undefined : idOrLabel;\n\n if (!labelName) {\n console.log(\"Provide a label name.\");\n process.exitCode = 1;\n return;\n }\n\n try {\n const ids = await resolveMessageIds(id, options.query);\n\n if (ids.length === 0) {\n console.log(\"No matching Gmail messages.\");\n return;\n }\n\n await confirmBatchIfNeeded(options.query, ids, \"Apply label to\");\n const result = await labelEmails(ids, labelName);\n const runId = await recordManualRun({\n query: options.query,\n requestedActions: [{ type: \"label\", label: labelName }],\n result,\n });\n printMutationSummary(result, runId);\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nprogram\n .command(\"read [id]\")\n .description(\"Mark email(s) as read\")\n .option(\"-q, --query <query>\", \"Mark all matching emails as read\")\n .action(async (id, options) => {\n const status = await loadRuntimeStatus();\n\n if (!status.gmailReady) {\n await requireLiveGmailReadiness(\"read\");\n return;\n }\n\n try {\n const ids = await resolveMessageIds(id, options.query);\n\n if (ids.length === 0) {\n console.log(\"No matching Gmail messages.\");\n return;\n }\n\n await confirmBatchIfNeeded(options.query, ids, \"Mark as read\");\n const result = await markRead(ids);\n const runId = await recordManualRun({\n query: options.query,\n requestedActions: [{ type: \"mark_read\" }],\n result,\n });\n printMutationSummary(result, runId);\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nprogram\n .command(\"forward <id> <email>\")\n .description(\"Forward email to another address\")\n .action(async (id, email) => {\n const status = await loadRuntimeStatus();\n\n if (!status.gmailReady) {\n await requireLiveGmailReadiness(\"forward\");\n return;\n }\n\n try {\n const result = await forwardEmail(id, email);\n const runId = await recordManualRun({\n requestedActions: [{ type: \"forward\", to: email }],\n result,\n });\n printMutationSummary(result, runId);\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nprogram\n .command(\"undo <run-id>\")\n .description(\"Undo a previous action run\")\n .action(async (runId) => {\n const status = await loadRuntimeStatus();\n\n if (!status.gmailReady) {\n await requireLiveGmailReadiness(\"undo\");\n return;\n }\n\n try {\n const result = await undoRun(runId);\n printSection(`Undo ${ui.dim(result.runId)}`);\n printKeyValue(\"status\", formatStatus(result.status));\n printKeyValue(\"undone\", ui.green(String(result.undoneCount)));\n printKeyValue(\"warnings\", result.warningCount > 0 ? ui.yellow(String(result.warningCount)) : ui.dim(\"0\"));\n printKeyValue(\"errors\", result.errorCount > 0 ? ui.red(String(result.errorCount)) : ui.dim(\"0\"));\n\n for (const warning of result.warnings) {\n console.log(`${ui.yellow(\"warning\")} ${warning}`);\n }\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nprogram\n .command(\"history\")\n .description(\"Show recent run history\")\n .option(\"-n, --count <number>\", \"Number of entries\", \"20\")\n .option(\"--email <id>\", \"Filter by email ID\")\n .action(async (options) => {\n const runs = options.email\n ? await getRunsByEmail(options.email)\n : await getRecentRuns(Number(options.count));\n\n if (runs.length === 0) {\n console.log(\"No action history yet.\");\n return;\n }\n\n printHistoryTable(runs);\n });\n\nconst labels = program.command(\"labels\").description(\"Manage Gmail labels\");\n\nlabels\n .command(\"list\")\n .description(\"List all Gmail labels\")\n .action(async () => {\n const status = await loadRuntimeStatus();\n\n if (!status.gmailReady) {\n await requireLiveGmailReadiness(\"labels list\");\n return;\n }\n\n const labels = await listLabels();\n printSection(\"Labels\");\n console.log(\n [\n pad(ui.dim(\"TYPE\"), 8),\n pad(ui.dim(\"NAME\"), 24),\n pad(ui.dim(\"MESSAGES\"), 10),\n pad(ui.dim(\"UNREAD\"), 8),\n ui.dim(\"ID\"),\n ].join(\" \"),\n );\n\n for (const label of labels) {\n console.log(\n [\n pad(label.type === \"system\" ? ui.cyan(label.type) : ui.magenta(label.type), 8),\n pad(truncate(label.name, 24), 24),\n pad(String(label.messagesTotal), 10),\n pad(String(label.messagesUnread), 8),\n ui.dim(label.id),\n ].join(\" \"),\n );\n }\n });\n\nlabels\n .command(\"create <name>\")\n .description(\"Create a new Gmail label\")\n .action(async (name) => {\n const status = await loadRuntimeStatus();\n\n if (!status.gmailReady) {\n await requireLiveGmailReadiness(\"labels create\");\n return;\n }\n\n try {\n const label = await createLabel(name);\n printSection(\"Label Created\");\n printKeyValue(\"name\", label.name);\n printKeyValue(\"id\", ui.dim(label.id));\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nconst stats = program.command(\"stats\").description(\"Email analytics\");\n\nstats\n .command(\"overview\", { isDefault: true })\n .description(\"Inbox overview stats\")\n .action(async () => {\n const overview = await getInboxOverview();\n\n if (overview.total === 0) {\n console.log(\"No cached emails yet. Run `inboxctl sync` first.\");\n return;\n }\n\n printInboxOverview(overview);\n });\n\nstats\n .command(\"senders\")\n .description(\"Top senders by volume\")\n .option(\"--top <number>\", \"Number of senders\", \"20\")\n .option(\"--period <period>\", \"Time period (day|week|month|year|all)\", \"all\")\n .option(\"--min-unread <percent>\", \"Minimum unread rate filter\")\n .action(async (options) => {\n try {\n const top = parseIntegerOption(options.top, \"top\");\n const minUnread = parsePercentOption(options.minUnread, \"min-unread\");\n const period = options.period as \"day\" | \"week\" | \"month\" | \"year\" | \"all\";\n\n if (![\"day\", \"week\", \"month\", \"year\", \"all\"].includes(period)) {\n throw new Error(\"period must be one of: day, week, month, year, all.\");\n }\n\n const senders = await getTopSenders({\n limit: top,\n period,\n minUnreadRate: minUnread,\n });\n\n if (senders.length === 0) {\n console.log(\"No cached sender stats matched that filter.\");\n return;\n }\n\n printTopSendersTable(period, senders);\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nstats\n .command(\"newsletters\")\n .description(\"Detected newsletters and mailing lists\")\n .option(\"--min-unread <percent>\", \"Minimum unread rate filter\")\n .action(async (options) => {\n try {\n const minUnread = parsePercentOption(options.minUnread, \"min-unread\");\n const newsletters = await getNewsletters({\n minUnreadRate: minUnread,\n });\n\n if (newsletters.length === 0) {\n console.log(\"No newsletter senders matched that filter.\");\n return;\n }\n\n printNewslettersTable(newsletters);\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nstats\n .command(\"labels\")\n .description(\"Email count per label\")\n .action(async () => {\n const labels = await getLabelDistribution();\n\n if (labels.length === 0) {\n console.log(\"No cached emails yet. Run `inboxctl sync` first.\");\n return;\n }\n\n printLabelDistributionTable(labels);\n });\n\nstats\n .command(\"volume\")\n .description(\"Email volume over time\")\n .option(\"--period <period>\", \"Granularity (day|week|month)\", \"day\")\n .action(async (options) => {\n try {\n const period = options.period as \"day\" | \"week\" | \"month\";\n\n if (![\"day\", \"week\", \"month\"].includes(period)) {\n throw new Error(\"period must be one of: day, week, month.\");\n }\n\n const points = await getVolumeByPeriod(period, getVolumeRange(period));\n\n if (points.length === 0) {\n console.log(\"No cached emails yet. Run `inboxctl sync` first.\");\n return;\n }\n\n printVolumeTable(period, points);\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nstats\n .command(\"sender <email>\")\n .description(\"Detailed stats for a sender or @domain\")\n .action(async (email) => {\n const detail = await getSenderStats(email);\n\n if (!detail) {\n console.log(`No cached emails found for ${email}.`);\n return;\n }\n\n printSenderDetail(detail);\n });\n\nconst rules = program.command(\"rules\").description(\"Rule management (IaC)\");\n\nrules\n .command(\"deploy [file]\")\n .description(\"Deploy rules from YAML files\")\n .action(async (file) => {\n const config = loadConfig();\n\n try {\n const result = file\n ? await deployLoadedRule(await loadRuleFile(file))\n : await deployAllRules(config.rulesDir);\n printRuleDeploySummary(result);\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nrules\n .command(\"status [name]\")\n .description(\"Show deployed rules and their status\")\n .action(async (name) => {\n try {\n if (name) {\n const rule = await getRuleStatus(name);\n\n if (!rule) {\n console.log(`Rule not found: ${name}`);\n process.exitCode = 1;\n return;\n }\n\n printRuleStatusDetail(rule);\n return;\n }\n\n const rules = await getAllRulesStatus();\n\n if (rules.length === 0) {\n console.log(\"No rules have been deployed yet.\");\n return;\n }\n\n printRuleStatusTable(rules);\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nrules\n .command(\"run [name]\")\n .description(\"Execute a rule against matching emails\")\n .option(\"--apply\", \"Actually execute (default is dry-run)\")\n .option(\"--max <number>\", \"Maximum emails to process\", \"100\")\n .option(\"--all\", \"Run all enabled rules\")\n .action(async (name, options) => {\n const maxEmails = Number(options.max);\n\n if (!Number.isInteger(maxEmails) || maxEmails <= 0) {\n console.log(`Invalid --max value: ${options.max}`);\n process.exitCode = 1;\n return;\n }\n\n if (!options.all && !name) {\n console.log(\"Provide a rule name or use --all.\");\n process.exitCode = 1;\n return;\n }\n\n if (options.apply) {\n const status = await loadRuntimeStatus();\n\n if (!status.gmailReady) {\n await requireLiveGmailReadiness(\"rules run --apply\");\n return;\n }\n }\n\n try {\n if (options.all) {\n const result = await runAllRules({\n dryRun: !options.apply,\n maxEmails,\n });\n printRunAllRulesResult(result);\n return;\n }\n\n const result = await runRule(name, {\n dryRun: !options.apply,\n maxEmails,\n });\n printRuleRunResult(result);\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nrules\n .command(\"undo <run-id>\")\n .description(\"Undo a specific rule run\")\n .action(async (runId) => {\n const status = await loadRuntimeStatus();\n\n if (!status.gmailReady) {\n await requireLiveGmailReadiness(\"rules undo\");\n return;\n }\n\n try {\n const result = await undoRun(runId);\n printSection(`Undo ${ui.dim(result.runId)}`);\n printKeyValue(\"status\", formatStatus(result.status));\n printKeyValue(\"undone\", ui.green(String(result.undoneCount)));\n printKeyValue(\"warnings\", result.warningCount > 0 ? ui.yellow(String(result.warningCount)) : ui.dim(\"0\"));\n printKeyValue(\"errors\", result.errorCount > 0 ? ui.red(String(result.errorCount)) : ui.dim(\"0\"));\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nrules\n .command(\"enable <name>\")\n .description(\"Enable a deployed rule\")\n .action(async (name) => {\n try {\n const rule = await enableRule(name);\n printSection(\"Rule Enabled\");\n printKeyValue(\"name\", rule.name);\n printKeyValue(\"enabled\", formatEnabled(rule.enabled));\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nrules\n .command(\"disable <name>\")\n .description(\"Disable a deployed rule\")\n .action(async (name) => {\n try {\n const rule = await disableRule(name);\n printSection(\"Rule Disabled\");\n printKeyValue(\"name\", rule.name);\n printKeyValue(\"enabled\", formatEnabled(rule.enabled));\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nrules\n .command(\"diff\")\n .description(\"Show drift between YAML files and deployed rules\")\n .action(async () => {\n const config = loadConfig();\n\n try {\n const result = await detectDrift(config.rulesDir);\n\n if (result.entries.length === 0) {\n console.log(\"No rule files found.\");\n return;\n }\n\n printDriftReport(result);\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\n// ─── filters ────────────────────────────────────────────────────────────────\n\nconst filters = program\n .command(\"filters\")\n .description(\"Gmail server-side filters (always-on, applied at delivery time)\");\n\nfilters\n .command(\"list\")\n .description(\"List all Gmail server-side filters\")\n .action(async () => {\n try {\n const all = await listFilters();\n\n if (all.length === 0) {\n console.log(\"No Gmail filters found.\");\n return;\n }\n\n printSection(\"Gmail Filters\");\n console.log(\n [\n pad(ui.dim(\"ID\"), 32),\n pad(ui.dim(\"CRITERIA\"), 36),\n ui.dim(\"ACTIONS\"),\n ].join(\" \"),\n );\n\n for (const f of all) {\n const criteria: string[] = [];\n if (f.criteria.from) criteria.push(`from:${f.criteria.from}`);\n if (f.criteria.to) criteria.push(`to:${f.criteria.to}`);\n if (f.criteria.subject) criteria.push(`subject:${f.criteria.subject}`);\n if (f.criteria.query) criteria.push(`query:${f.criteria.query}`);\n if (f.criteria.hasAttachment) criteria.push(\"has-attachment\");\n if (f.criteria.size != null) criteria.push(`size:${f.criteria.sizeComparison ?? \"\"}${f.criteria.size}`);\n\n const actions: string[] = [];\n if (f.actions.archive) actions.push(\"archive\");\n if (f.actions.markRead) actions.push(\"mark-read\");\n if (f.actions.star) actions.push(\"star\");\n if (f.actions.addLabelNames.length > 0) actions.push(`label:${f.actions.addLabelNames.join(\",\")}`);\n if (f.actions.forward) actions.push(`forward:${f.actions.forward}`);\n\n console.log(\n [\n pad(ui.dim(f.id), 32),\n pad(truncate(criteria.join(\" \"), 36), 36),\n truncate(actions.join(\", \") || \"-\", 60),\n ].join(\" \"),\n );\n }\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nfilters\n .command(\"get <id>\")\n .description(\"Get details of a Gmail server-side filter\")\n .action(async (id: string) => {\n try {\n const f = await getFilter(id);\n\n printSection(\"Filter\");\n printKeyValue(\"id\", f.id);\n console.log();\n\n console.log(ui.bold(\"Criteria\"));\n if (f.criteria.from) printKeyValue(\" from\", f.criteria.from);\n if (f.criteria.to) printKeyValue(\" to\", f.criteria.to);\n if (f.criteria.subject) printKeyValue(\" subject\", f.criteria.subject);\n if (f.criteria.query) printKeyValue(\" query\", f.criteria.query);\n if (f.criteria.negatedQuery) printKeyValue(\" not\", f.criteria.negatedQuery);\n if (f.criteria.hasAttachment) printKeyValue(\" has-attachment\", \"yes\");\n if (f.criteria.excludeChats) printKeyValue(\" exclude-chats\", \"yes\");\n if (f.criteria.size != null) {\n printKeyValue(\n \" size\",\n `${f.criteria.sizeComparison ?? \"\"} ${f.criteria.size} bytes`,\n );\n }\n console.log();\n\n console.log(ui.bold(\"Actions\"));\n if (f.actions.archive) printKeyValue(\" archive\", \"yes\");\n if (f.actions.markRead) printKeyValue(\" mark-read\", \"yes\");\n if (f.actions.star) printKeyValue(\" star\", \"yes\");\n if (f.actions.addLabelNames.length > 0) printKeyValue(\" add-label\", f.actions.addLabelNames.join(\", \"));\n if (f.actions.removeLabelNames.length > 0) printKeyValue(\" remove-label\", f.actions.removeLabelNames.join(\", \"));\n if (f.actions.forward) printKeyValue(\" forward\", f.actions.forward);\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nfilters\n .command(\"create\")\n .description(\"Create a Gmail server-side filter\")\n .option(\"--from <address>\", \"Match emails from this address\")\n .option(\"--to <address>\", \"Match emails sent to this address\")\n .option(\"--subject <text>\", \"Match emails with this text in the subject\")\n .option(\"--query <q>\", \"Match using Gmail search syntax\")\n .option(\"--negated-query <q>\", \"Exclude emails matching this Gmail query\")\n .option(\"--has-attachment\", \"Match emails with attachments\")\n .option(\"--exclude-chats\", \"Exclude chat messages from matches\")\n .option(\"--size <bytes>\", \"Match emails by size threshold\", parseInt)\n .option(\"--size-comparison <direction>\", \"larger or smaller (use with --size)\")\n .option(\"--label <name>\", \"Apply this label to matching emails (created if missing)\")\n .option(\"--archive\", \"Archive matching emails (skip inbox)\")\n .option(\"--mark-read\", \"Mark matching emails as read\")\n .option(\"--star\", \"Star matching emails\")\n .option(\"--forward <email>\", \"Forward matching emails to this address\")\n .action(async (opts) => {\n try {\n const f = await createFilter({\n from: opts.from,\n to: opts.to,\n subject: opts.subject,\n query: opts.query,\n negatedQuery: opts.negatedQuery,\n hasAttachment: opts.hasAttachment || undefined,\n excludeChats: opts.excludeChats || undefined,\n size: opts.size,\n sizeComparison: opts.sizeComparison,\n labelName: opts.label,\n archive: opts.archive || undefined,\n markRead: opts.markRead || undefined,\n star: opts.star || undefined,\n forward: opts.forward,\n });\n\n printSection(\"Filter Created\");\n printKeyValue(\"id\", f.id);\n const criteriaStr: string[] = [];\n if (f.criteria.from) criteriaStr.push(`from:${f.criteria.from}`);\n if (f.criteria.to) criteriaStr.push(`to:${f.criteria.to}`);\n if (f.criteria.subject) criteriaStr.push(`subject:${f.criteria.subject}`);\n if (f.criteria.query) criteriaStr.push(f.criteria.query);\n if (criteriaStr.length > 0) printKeyValue(\"criteria\", criteriaStr.join(\", \"));\n const actionsStr: string[] = [];\n if (f.actions.archive) actionsStr.push(\"archive\");\n if (f.actions.markRead) actionsStr.push(\"mark-read\");\n if (f.actions.star) actionsStr.push(\"star\");\n if (f.actions.addLabelNames.length > 0) actionsStr.push(`label: ${f.actions.addLabelNames.join(\", \")}`);\n if (f.actions.forward) actionsStr.push(`forward: ${f.actions.forward}`);\n if (actionsStr.length > 0) printKeyValue(\"actions\", actionsStr.join(\", \"));\n\n console.log();\n console.log(ui.dim(\"Note: filters apply to incoming mail from now on. To process existing mail, use `inboxctl rules`.\"));\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nfilters\n .command(\"delete <id>\")\n .description(\"Delete a Gmail server-side filter\")\n .action(async (id: string) => {\n try {\n await deleteFilter(id);\n printSection(\"Filter Deleted\");\n printKeyValue(\"id\", id);\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nprogram\n .command(\"demo\")\n .description(\"Launch the seeded demo mailbox for screenshots, recordings, and safe exploration\")\n .action(async () => {\n await runDemoSession();\n });\n\nprogram\n .command(\"mcp\")\n .description(\"Start MCP server on stdio\")\n .action(async () => {\n await startMcpServer();\n });\n\nprogram.action(async (options) => {\n if (options.demo) {\n await runDemoSession();\n return;\n }\n\n await startTuiApp({\n noSync: Boolean(options.noSync),\n });\n});\n\nprogram.parse();\n","import { mkdir, mkdtemp, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { loadConfig } from \"../../config.js\";\nimport { saveTokens } from \"../auth/tokens.js\";\nimport { closeDb, getSqlite, initializeDb } from \"../db/client.js\";\nimport {\n clearGmailTransportOverride,\n setGmailTransportOverride,\n} from \"../gmail/transport.js\";\nimport { syncLabels } from \"../gmail/labels.js\";\nimport { startTuiApp } from \"../../tui/app.js\";\nimport { createDemoTransport } from \"./demo-transport.js\";\nimport { DEMO_ACCOUNT_EMAIL, seedDemoData } from \"./seed.js\";\n\nconst DEMO_ENV_KEYS = [\n \"INBOXCTL_DATA_DIR\",\n \"INBOXCTL_DB_PATH\",\n \"INBOXCTL_RULES_DIR\",\n \"INBOXCTL_TOKENS_PATH\",\n \"GOOGLE_CLIENT_ID\",\n \"GOOGLE_CLIENT_SECRET\",\n \"GOOGLE_REDIRECT_URI\",\n] as const;\n\nasync function seedDemoRulesDirectory(rulesDir: string): Promise<void> {\n const sourcePath = fileURLToPath(\n new URL(\"../rules/example.yaml\", import.meta.url),\n );\n const targetPath = join(rulesDir, \"example.yaml\");\n await mkdir(rulesDir, { recursive: true });\n await writeFile(targetPath, await readFile(sourcePath, \"utf8\"), \"utf8\");\n}\n\nexport async function runDemoSession(): Promise<void> {\n const previousEnv = Object.fromEntries(\n DEMO_ENV_KEYS.map((key) => [key, process.env[key]]),\n ) as Record<(typeof DEMO_ENV_KEYS)[number], string | undefined>;\n const tempDir = await mkdtemp(join(tmpdir(), \"inboxctl-demo-\"));\n const dbPath = join(tempDir, \"demo.db\");\n const rulesDir = join(tempDir, \"rules\");\n const tokensPath = join(tempDir, \"tokens.json\");\n const referenceNow = Date.now();\n\n process.env.INBOXCTL_DATA_DIR = tempDir;\n process.env.INBOXCTL_DB_PATH = dbPath;\n process.env.INBOXCTL_RULES_DIR = rulesDir;\n process.env.INBOXCTL_TOKENS_PATH = tokensPath;\n process.env.GOOGLE_CLIENT_ID = \"demo-client-id\";\n process.env.GOOGLE_CLIENT_SECRET = \"demo-client-secret\";\n process.env.GOOGLE_REDIRECT_URI = \"http://127.0.0.1:3456/callback\";\n\n try {\n await mkdir(dirname(tokensPath), { recursive: true });\n await seedDemoRulesDirectory(rulesDir);\n\n initializeDb(dbPath);\n const sqlite = getSqlite(dbPath);\n const dataset = seedDemoData(sqlite, referenceNow);\n await saveTokens(tokensPath, {\n accessToken: \"demo-access-token\",\n refreshToken: \"demo-refresh-token\",\n expiryDate: referenceNow + 365 * 24 * 60 * 60 * 1000,\n email: DEMO_ACCOUNT_EMAIL,\n });\n\n const config = loadConfig();\n setGmailTransportOverride(config.dataDir, createDemoTransport(dataset));\n await syncLabels({ config, forceRefresh: true });\n await startTuiApp({ noSync: true });\n } finally {\n try {\n clearGmailTransportOverride(tempDir);\n closeDb(dbPath);\n await rm(tempDir, { recursive: true, force: true });\n } finally {\n for (const key of DEMO_ENV_KEYS) {\n const value = previousEnv[key];\n\n if (value === undefined) {\n delete process.env[key];\n } else {\n process.env[key] = value;\n }\n }\n }\n }\n}\n","import { convert } from \"html-to-text\";\nimport {\n Box,\n Newline,\n Spacer,\n Text,\n render,\n useApp,\n useInput,\n useStdout,\n} from \"ink\";\nimport Spinner from \"ink-spinner\";\nimport TextInput from \"ink-text-input\";\nimport React, { useEffect, useState } from \"react\";\nimport { loadConfig } from \"../config.js\";\nimport { undoRun } from \"../core/actions/undo.js\";\nimport { loadTokens } from \"../core/auth/tokens.js\";\nimport type { GmailLabel, EmailDetail, EmailMessage } from \"../core/gmail/types.js\";\nimport { createLabel, listLabels } from \"../core/gmail/labels.js\";\nimport { getMessage, listMessages } from \"../core/gmail/messages.js\";\nimport {\n archiveEmails,\n labelEmails,\n markRead,\n markUnread,\n} from \"../core/gmail/modify.js\";\nimport { getLabelDistribution } from \"../core/stats/labels.js\";\nimport { getNewsletters } from \"../core/stats/newsletters.js\";\nimport { getTopSenders } from \"../core/stats/sender.js\";\nimport { getInboxOverview, getVolumeByPeriod } from \"../core/stats/volume.js\";\nimport {\n deployAllRules,\n disableRule,\n enableRule,\n getAllRulesStatus,\n type RuleStatus,\n} from \"../core/rules/deploy.js\";\nimport { runRule } from \"../core/rules/executor.js\";\nimport { getExecutionHistory } from \"../core/rules/history.js\";\nimport { getRecentEmails } from \"../core/sync/cache.js\";\nimport {\n getSyncStatus,\n incrementalSync,\n type SyncProgressEvent,\n} from \"../core/sync/sync.js\";\n\ntype Screen = \"inbox\" | \"email\" | \"stats\" | \"rules\" | \"search\";\ntype StatsTab = \"senders\" | \"labels\" | \"newsletters\";\ntype RulesFocus = \"rules\" | \"history\";\ntype SearchFocus = \"input\" | \"results\";\ntype FlashTone = \"info\" | \"success\" | \"error\";\n\ninterface AppProps {\n initialSync?: boolean;\n}\n\ninterface FlashMessage {\n tone: FlashTone;\n text: string;\n}\n\ninterface ConfirmState {\n title: string;\n message: string;\n onConfirm: () => Promise<void>;\n}\n\ninterface LabelPickerState {\n open: boolean;\n loading: boolean;\n labels: GmailLabel[];\n selectedIndex: number;\n targetEmailId: string | null;\n createMode: boolean;\n newLabelName: string;\n}\n\ninterface SyncState {\n syncing: boolean;\n message: string;\n lastSync: number | null;\n totalMessages: number;\n resumableProgressCurrent: number;\n resumableProgressTotal: number | null;\n progressCurrent: number;\n progressTotal: number | null;\n progressMode: \"full\" | \"incremental\" | null;\n progressPhase: SyncProgressEvent[\"phase\"] | null;\n startedAt: number | null;\n progressStartedAt: number | null;\n lastProgressAt: number | null;\n lastProgressCurrent: number;\n ratePerSecond: number | null;\n}\n\nconst PAGE_SIZE = 20;\nconst SEARCH_LIMIT = 50;\nconst MIN_CONTENT_HEIGHT = 10;\n\nfunction stripAnsi(value: string): string {\n return value.replace(/\\u001B\\[[0-9;]*m/g, \"\");\n}\n\nfunction pad(value: string, width: number): string {\n const visible = stripAnsi(value);\n\n if (visible.length >= width) {\n return value;\n }\n\n return `${value}${\" \".repeat(width - visible.length)}`;\n}\n\nfunction truncate(value: string, width: number): string {\n if (width <= 0) {\n return \"\";\n }\n\n if (value.length <= width) {\n return value;\n }\n\n if (width === 1) {\n return value.slice(0, 1);\n }\n\n return `${value.slice(0, width - 1)}…`;\n}\n\nfunction flattenWhitespace(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction sanitizeInlineText(value: string, width?: number): string {\n let next = value.replace(/[\\r\\n\\t]+/g, \" \");\n\n if (/<[a-z][\\s\\S]*>/i.test(next)) {\n next = convert(next, {\n wordwrap: false,\n selectors: [{ selector: \"a\", options: { ignoreHref: true } }],\n });\n }\n\n next = flattenWhitespace(next);\n return width ? truncate(next, width) : next;\n}\n\nfunction formatFlashText(value: string): string {\n return sanitizeInlineText(value, 240);\n}\n\nfunction formatRelativeTime(value: number | Date | null | undefined): string {\n if (!value) {\n return \"-\";\n }\n\n const timestamp = value instanceof Date ? value.getTime() : value;\n const diff = Date.now() - timestamp;\n\n if (diff < 60_000) {\n return `${Math.max(1, Math.floor(diff / 1_000))}s ago`;\n }\n\n if (diff < 3_600_000) {\n return `${Math.floor(diff / 60_000)}m ago`;\n }\n\n if (diff < 86_400_000) {\n return `${Math.floor(diff / 3_600_000)}h ago`;\n }\n\n if (diff < 604_800_000) {\n return `${Math.floor(diff / 86_400_000)}d ago`;\n }\n\n return new Date(timestamp).toISOString().slice(0, 10);\n}\n\nfunction formatPercent(value: number): string {\n return `${Number.isInteger(value) ? value : Number(value.toFixed(1))}%`;\n}\n\nfunction formatCount(value: number | null | undefined): string {\n if (value == null) {\n return \"-\";\n }\n\n return new Intl.NumberFormat(\"en-US\").format(value);\n}\n\nfunction formatDurationEstimate(seconds: number): string {\n if (seconds < 60) {\n return `${Math.max(1, Math.round(seconds))}s`;\n }\n\n if (seconds < 3_600) {\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = Math.round(seconds % 60);\n return remainingSeconds === 0 ? `${minutes}m` : `${minutes}m ${remainingSeconds}s`;\n }\n\n const hours = Math.floor(seconds / 3_600);\n const minutes = Math.round((seconds % 3_600) / 60);\n return minutes === 0 ? `${hours}h` : `${hours}h ${minutes}m`;\n}\n\nfunction getMinimumItemsForEta(total: number | null): number {\n if (!total || total <= 0) {\n return 500;\n }\n\n return Math.min(2_000, Math.max(500, Math.floor(total * 0.01)));\n}\n\nfunction clampIndex(index: number, length: number): number {\n if (length <= 0) {\n return 0;\n }\n\n return Math.max(0, Math.min(index, length - 1));\n}\n\nfunction terminalWidth(): number {\n return process.stdout.columns || 100;\n}\n\nfunction terminalHeight(): number {\n return process.stdout.rows || 30;\n}\n\nfunction toneColor(tone: FlashTone): \"blue\" | \"green\" | \"red\" {\n switch (tone) {\n case \"success\":\n return \"green\";\n case \"error\":\n return \"red\";\n case \"info\":\n return \"blue\";\n }\n}\n\nfunction getBodyText(detail: EmailDetail): string {\n if (detail.textPlain?.trim()) {\n return detail.textPlain.trim();\n }\n\n if (detail.bodyHtml?.trim()) {\n return convert(detail.bodyHtml, {\n wordwrap: Math.max(terminalWidth() - 10, 40),\n }).trim();\n }\n\n return detail.body?.trim() || detail.snippet || \"\";\n}\n\nfunction useTerminalSize(): { columns: number; rows: number } {\n const { stdout } = useStdout();\n const [size, setSize] = useState({\n columns: stdout.columns || terminalWidth(),\n rows: stdout.rows || terminalHeight(),\n });\n\n useEffect(() => {\n function handleResize() {\n setSize({\n columns: stdout.columns || terminalWidth(),\n rows: stdout.rows || terminalHeight(),\n });\n }\n\n handleResize();\n stdout.on(\"resize\", handleResize);\n return () => {\n stdout.off(\"resize\", handleResize);\n };\n }, [stdout]);\n\n return size;\n}\n\nfunction getViewportRange(\n length: number,\n selectedIndex: number,\n visibleCount: number,\n): { start: number; end: number } {\n if (length <= visibleCount) {\n return { start: 0, end: length };\n }\n\n const half = Math.floor(visibleCount / 2);\n const start = Math.max(0, Math.min(selectedIndex - half, length - visibleCount));\n return {\n start,\n end: Math.min(length, start + visibleCount),\n };\n}\n\nfunction getScreenGuide(screen: Screen, focus?: RulesFocus | SearchFocus): string {\n const global = \"q quit • s sync • / search • d stats • R rules\";\n\n switch (screen) {\n case \"inbox\":\n return `${global} • j/k move • Enter open • a archive • l label • r read`;\n case \"email\":\n return \"Esc back • j/k scroll • a archive • l label • r toggle read\";\n case \"stats\":\n return \"Esc back • s senders • l labels • n newsletters\";\n case \"rules\":\n return `Esc back • Tab switch ${focus === \"history\" ? \"history\" : \"rules\"} focus • d deploy • e toggle • r dry-run • R apply • u undo`;\n case \"search\":\n return `Esc back • Enter search • i focus input • ${focus === \"input\" ? \"type Gmail query\" : \"j/k move • Enter open • a archive • l label • r read\"}`;\n }\n}\n\nfunction renderProgressBar(current: number, total: number, width: number): string {\n if (total <= 0 || width <= 0) {\n return \"\";\n }\n\n const ratio = Math.max(0, Math.min(1, current / total));\n const filled = Math.round(ratio * width);\n return `${\"█\".repeat(filled)}${\"░\".repeat(Math.max(0, width - filled))}`;\n}\n\nfunction Panel(props: {\n title: string;\n subtitle?: string;\n accent?: \"cyan\" | \"green\" | \"magenta\" | \"yellow\";\n children: React.ReactNode;\n}) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={props.accent || \"cyan\"}\n paddingX={1}\n paddingY={0}\n width=\"100%\"\n >\n <Box>\n <Text bold color={props.accent || \"cyan\"}>\n {props.title}\n </Text>\n <Spacer />\n {props.subtitle ? <Text color=\"gray\">{props.subtitle}</Text> : null}\n </Box>\n {props.children}\n </Box>\n );\n}\n\nfunction Header(props: {\n screen: Screen;\n sync: SyncState;\n columns: number;\n guide: string;\n}) {\n const items: Array<{ key: Screen; label: string }> = [\n { key: \"inbox\", label: \"Inbox\" },\n { key: \"email\", label: \"Email\" },\n { key: \"stats\", label: \"Stats\" },\n { key: \"rules\", label: \"Rules\" },\n { key: \"search\", label: \"Search\" },\n ];\n\n return (\n <Box\n width={props.columns}\n borderStyle=\"round\"\n borderColor=\"blue\"\n paddingX={1}\n paddingY={0}\n flexDirection=\"column\"\n >\n <Box>\n <Text bold color=\"cyan\">\n inboxctl\n </Text>\n <Text color=\"gray\"> local-first Gmail cockpit</Text>\n <Spacer />\n <Text color={props.sync.syncing ? \"yellow\" : \"gray\"}>\n {props.sync.syncing ? props.sync.message : \"ready\"}\n </Text>\n </Box>\n <Box marginTop={1}>\n {items.map((item, index) => (\n <Box key={item.key} marginRight={index === items.length - 1 ? 0 : 2}>\n <Text color={props.screen === item.key ? \"black\" : \"gray\"} backgroundColor={props.screen === item.key ? \"cyan\" : undefined}>\n {` ${item.label} `}\n </Text>\n </Box>\n ))}\n </Box>\n <Box marginTop={1}>\n <Text color=\"gray\">{truncate(props.guide, Math.max(20, props.columns - 4))}</Text>\n </Box>\n </Box>\n );\n}\n\nfunction EmailList(props: {\n emails: EmailMessage[];\n selectedIndex: number;\n title: string;\n loading?: boolean;\n emptyMessage: string;\n visibleRows: number;\n subtitle?: string;\n}) {\n const senderWidth = 28;\n const dateWidth = 10;\n const subjectWidth = Math.max(terminalWidth() - senderWidth - dateWidth - 20, 20);\n const { start, end } = getViewportRange(props.emails.length, props.selectedIndex, props.visibleRows);\n const visibleEmails = props.emails.slice(start, end);\n\n return (\n <Panel\n title={props.title}\n subtitle={props.subtitle || `${props.emails.length} loaded`}\n accent=\"cyan\"\n >\n <Text color=\"gray\">\n {pad(\"STATE\", 6)} {pad(\"FROM\", senderWidth)} {pad(\"DATE\", dateWidth)} SUBJECT\n </Text>\n {props.loading ? (\n <Box marginTop={1}>\n <Text color=\"cyan\">\n <Spinner type=\"dots\" /> Loading inbox…\n </Text>\n </Box>\n ) : props.emails.length === 0 ? (\n <Text color=\"gray\">{props.emptyMessage}</Text>\n ) : (\n <>\n {visibleEmails.map((email, index) => {\n const absoluteIndex = start + index;\n const selected = absoluteIndex === props.selectedIndex;\n const sender = sanitizeInlineText(email.fromName || email.fromAddress || \"(unknown)\", senderWidth);\n const subject = sanitizeInlineText(email.subject || \"(no subject)\", subjectWidth);\n const state = email.isRead ? \" \" : \"●\";\n\n return (\n <Text\n key={email.id}\n backgroundColor={selected ? \"white\" : undefined}\n color={selected ? \"black\" : !email.isRead ? \"white\" : \"gray\"}\n bold={!email.isRead}\n >\n {pad(state, 6)} {pad(sender, senderWidth)} {pad(formatRelativeTime(email.date), dateWidth)} {subject}\n </Text>\n );\n })}\n <Box marginTop={1}>\n <Text color=\"gray\">\n showing {start + 1}-{end} of {props.emails.length}\n </Text>\n </Box>\n </>\n )}\n </Panel>\n );\n}\n\nfunction Table(props: {\n title: string;\n headers: string[];\n rows: string[][];\n emptyMessage: string;\n}) {\n const widths = props.headers.map((header, index) =>\n Math.max(\n header.length,\n ...props.rows.map((row) => stripAnsi(row[index] || \"\").length),\n ),\n );\n\n return (\n <Panel title={props.title} accent=\"magenta\">\n {props.rows.length === 0 ? (\n <Text color=\"gray\">{props.emptyMessage}</Text>\n ) : (\n <>\n <Text color=\"gray\">\n {props.headers.map((header, index) => pad(header, widths[index] || header.length)).join(\" \")}\n </Text>\n {props.rows.map((row, index) => (\n <Text key={`${props.title}-${index}`}>\n {row.map((cell, cellIndex) => pad(cell, widths[cellIndex] || cell.length)).join(\" \")}\n </Text>\n ))}\n </>\n )}\n </Panel>\n );\n}\n\nfunction Modal(props: {\n title: string;\n children: React.ReactNode;\n}) {\n return (\n <Box\n borderStyle=\"round\"\n borderColor=\"cyan\"\n paddingX={1}\n paddingY={0}\n marginTop={1}\n flexDirection=\"column\"\n >\n <Text bold color=\"cyan\">\n {props.title}\n </Text>\n {props.children}\n </Box>\n );\n}\n\nfunction StatusBar(props: {\n screen: Screen;\n email: string | null;\n unreadCount: number;\n sync: SyncState;\n flash: FlashMessage | null;\n columns: number;\n}) {\n const lastSync = props.sync.lastSync ? formatRelativeTime(props.sync.lastSync) : \"never\";\n const progressWidth = Math.max(12, Math.min(36, Math.floor((props.columns - 48) / 2)));\n const hasProgressBar =\n props.sync.syncing &&\n props.sync.progressTotal !== null &&\n props.sync.progressTotal > 0;\n const progressBar = hasProgressBar\n ? renderProgressBar(\n props.sync.progressCurrent,\n props.sync.progressTotal || 0,\n progressWidth,\n )\n : \"\";\n const progressSummary = hasProgressBar\n ? `${formatCount(props.sync.progressCurrent)} / ${formatCount(props.sync.progressTotal)}`\n : props.sync.syncing\n ? props.sync.progressMode === \"incremental\"\n ? \"checking for changes\"\n : \"preparing sync\"\n : `Last sync ${lastSync}`;\n const elapsedSeconds = props.sync.startedAt\n ? Math.max(1, (Date.now() - props.sync.startedAt) / 1_000)\n : 0;\n const remainingItems = props.sync.progressTotal !== null\n ? Math.max(0, props.sync.progressTotal - props.sync.progressCurrent)\n : 0;\n const minimumItemsForEta = getMinimumItemsForEta(props.sync.progressTotal);\n const canShowEta =\n hasProgressBar &&\n props.sync.progressMode === \"full\" &&\n props.sync.progressPhase === \"fetching_messages\" &&\n props.sync.ratePerSecond !== null &&\n props.sync.ratePerSecond > 0 &&\n elapsedSeconds >= 15 &&\n props.sync.progressCurrent >= minimumItemsForEta &&\n remainingItems > 0;\n const etaSummary = canShowEta\n ? `ETA ~${formatDurationEstimate(remainingItems / (props.sync.ratePerSecond || 1))}`\n : hasProgressBar &&\n props.sync.progressMode === \"full\" &&\n props.sync.progressPhase === \"fetching_messages\" &&\n props.sync.progressCurrent > 0 &&\n remainingItems > 0\n ? \"ETA calculating…\"\n : null;\n\n return (\n <Box\n borderStyle=\"round\"\n borderColor={props.flash ? toneColor(props.flash.tone) : \"gray\"}\n paddingX={1}\n paddingY={0}\n flexDirection=\"column\"\n width=\"100%\"\n >\n <Box>\n <Text color=\"cyan\">inboxctl</Text>\n <Text color=\"gray\"> {props.email || \"not authenticated\"}</Text>\n <Spacer />\n <Text color=\"yellow\">{props.unreadCount} unread</Text>\n <Text color=\"gray\"> | </Text>\n <Text color=\"gray\">{truncate(progressSummary, Math.max(18, props.columns - 56))}</Text>\n <Text color=\"gray\"> | </Text>\n <Text color=\"magenta\">{props.screen}</Text>\n </Box>\n {props.sync.syncing ? (\n <>\n <Newline />\n <Box>\n <Text color={props.sync.progressMode === \"full\" ? \"yellow\" : \"cyan\"}>\n {props.sync.progressMode === \"full\" ? \"full\" : \"incr\"}\n </Text>\n <Text color=\"gray\"> {truncate(props.sync.message, Math.max(24, props.columns - 34))}</Text>\n {hasProgressBar ? (\n <>\n <Spacer />\n {etaSummary ? <Text color=\"gray\">{etaSummary} </Text> : null}\n <Text color=\"green\">{progressBar}</Text>\n <Text color=\"gray\"> {formatPercent((props.sync.progressCurrent / (props.sync.progressTotal || 1)) * 100)}</Text>\n </>\n ) : null}\n </Box>\n </>\n ) : null}\n {props.flash ? (\n <>\n <Newline />\n <Text color={toneColor(props.flash.tone)}>{props.flash.text}</Text>\n </>\n ) : null}\n </Box>\n );\n}\n\nexport function App({ initialSync = true }: AppProps) {\n const { exit } = useApp();\n const { columns, rows } = useTerminalSize();\n const config = loadConfig();\n\n const [screen, setScreen] = useState<Screen>(\"inbox\");\n const [emailOrigin, setEmailOrigin] = useState<\"inbox\" | \"search\">(\"inbox\");\n const [flash, setFlash] = useState<FlashMessage | null>(null);\n const [confirmState, setConfirmState] = useState<ConfirmState | null>(null);\n\n const [authEmail, setAuthEmail] = useState<string | null>(null);\n const [syncState, setSyncState] = useState<SyncState>({\n syncing: false,\n message: \"Syncing…\",\n lastSync: null,\n totalMessages: 0,\n resumableProgressCurrent: 0,\n resumableProgressTotal: null,\n progressCurrent: 0,\n progressTotal: null,\n progressMode: null,\n progressPhase: null,\n startedAt: null,\n progressStartedAt: null,\n lastProgressAt: null,\n lastProgressCurrent: 0,\n ratePerSecond: null,\n });\n const [unreadCount, setUnreadCount] = useState(0);\n\n const [inboxEmails, setInboxEmails] = useState<EmailMessage[]>([]);\n const [inboxSelectedIndex, setInboxSelectedIndex] = useState(0);\n const [inboxLoading, setInboxLoading] = useState(true);\n const [inboxHasMore, setInboxHasMore] = useState(true);\n\n const [selectedEmailId, setSelectedEmailId] = useState<string | null>(null);\n const [emailDetail, setEmailDetail] = useState<EmailDetail | null>(null);\n const [emailBody, setEmailBody] = useState(\"\");\n const [emailLoading, setEmailLoading] = useState(false);\n const [emailScroll, setEmailScroll] = useState(0);\n\n const [statsLoading, setStatsLoading] = useState(false);\n const [statsTab, setStatsTab] = useState<StatsTab>(\"senders\");\n const [statsOverview, setStatsOverview] = useState<Awaited<ReturnType<typeof getInboxOverview>> | null>(null);\n const [statsSenders, setStatsSenders] = useState<Awaited<ReturnType<typeof getTopSenders>>>([]);\n const [statsLabels, setStatsLabels] = useState<Awaited<ReturnType<typeof getLabelDistribution>>>([]);\n const [statsNewsletters, setStatsNewsletters] = useState<Awaited<ReturnType<typeof getNewsletters>>>([]);\n const [statsVolume, setStatsVolume] = useState<Awaited<ReturnType<typeof getVolumeByPeriod>>>([]);\n\n const [rulesLoading, setRulesLoading] = useState(false);\n const [rulesFocus, setRulesFocus] = useState<RulesFocus>(\"rules\");\n const [rules, setRules] = useState<RuleStatus[]>([]);\n const [rulesSelectedIndex, setRulesSelectedIndex] = useState(0);\n const [ruleHistory, setRuleHistory] = useState<Awaited<ReturnType<typeof getExecutionHistory>>>([]);\n const [historySelectedIndex, setHistorySelectedIndex] = useState(0);\n\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [searchFocus, setSearchFocus] = useState<SearchFocus>(\"input\");\n const [searchLoading, setSearchLoading] = useState(false);\n const [searchResults, setSearchResults] = useState<EmailMessage[]>([]);\n const [searchSelectedIndex, setSearchSelectedIndex] = useState(0);\n\n const [labelPicker, setLabelPicker] = useState<LabelPickerState>({\n open: false,\n loading: false,\n labels: [],\n selectedIndex: 0,\n targetEmailId: null,\n createMode: false,\n newLabelName: \"\",\n });\n\n function pushFlash(tone: FlashTone, text: string) {\n setFlash({ tone, text: formatFlashText(text) });\n }\n\n async function refreshStatus(): Promise<void> {\n const [syncStatus, overview, tokens] = await Promise.all([\n getSyncStatus(),\n getInboxOverview(),\n loadTokens(config.tokensPath),\n ]);\n\n setSyncState((current) => ({\n ...current,\n lastSync: syncStatus.lastIncrementalSync ?? syncStatus.lastFullSync,\n totalMessages: syncStatus.totalMessages,\n resumableProgressCurrent: syncStatus.fullSyncProcessed,\n resumableProgressTotal: syncStatus.fullSyncTotal,\n }));\n setUnreadCount(overview.unread);\n setAuthEmail(tokens?.email && tokens.email !== \"unknown\" ? tokens.email : null);\n }\n\n async function loadInbox(reset: boolean): Promise<void> {\n setInboxLoading(true);\n\n try {\n const offset = reset ? 0 : inboxEmails.length;\n const rows = await getRecentEmails(PAGE_SIZE, offset);\n\n setInboxEmails((current) => (reset ? rows : [...current, ...rows]));\n setInboxHasMore(rows.length === PAGE_SIZE);\n setInboxSelectedIndex((current) => clampIndex(reset ? 0 : current, reset ? rows.length : offset + rows.length));\n } catch (error) {\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n } finally {\n setInboxLoading(false);\n }\n }\n\n async function loadStats(): Promise<void> {\n setStatsLoading(true);\n\n try {\n const [overview, senders, labels, newsletters, volume] = await Promise.all([\n getInboxOverview(),\n getTopSenders({ limit: 10 }),\n getLabelDistribution(),\n getNewsletters({ minMessages: 1 }),\n getVolumeByPeriod(\"day\", { start: Date.now() - 30 * 24 * 60 * 60 * 1000, end: Date.now() }),\n ]);\n\n setStatsOverview(overview);\n setStatsSenders(senders);\n setStatsLabels(labels.slice(0, 10));\n setStatsNewsletters(newsletters.slice(0, 10));\n setStatsVolume(volume.slice(-7));\n } catch (error) {\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n } finally {\n setStatsLoading(false);\n }\n }\n\n async function loadRules(): Promise<void> {\n setRulesLoading(true);\n\n try {\n const [nextRules, nextHistory] = await Promise.all([\n getAllRulesStatus(),\n getExecutionHistory(undefined, 10),\n ]);\n\n setRules(nextRules);\n setRuleHistory(nextHistory);\n setRulesSelectedIndex((current) => clampIndex(current, nextRules.length));\n setHistorySelectedIndex((current) => clampIndex(current, nextHistory.length));\n } catch (error) {\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n } finally {\n setRulesLoading(false);\n }\n }\n\n async function loadEmailDetail(emailId: string): Promise<void> {\n setEmailLoading(true);\n setEmailScroll(0);\n\n try {\n const detail = await getMessage(emailId);\n setEmailDetail(detail);\n setEmailBody(getBodyText(detail));\n } catch (error) {\n setEmailDetail(null);\n setEmailBody(\"\");\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n } finally {\n setEmailLoading(false);\n }\n }\n\n async function runSync(message: string): Promise<void> {\n const startedAt = Date.now();\n\n setSyncState((current) => ({\n ...current,\n syncing: true,\n message,\n progressCurrent: current.resumableProgressCurrent,\n progressTotal: current.resumableProgressTotal,\n progressMode: current.resumableProgressCurrent > 0 ? \"full\" : null,\n progressPhase: current.resumableProgressCurrent > 0 ? \"starting\" : \"starting\",\n startedAt,\n progressStartedAt: null,\n lastProgressAt: startedAt,\n lastProgressCurrent: current.resumableProgressCurrent,\n ratePerSecond: null,\n }));\n\n try {\n await incrementalSync(\n (synced, total) => {\n setSyncState((current) => {\n const now = Date.now();\n const progressStartedAt =\n current.progressStartedAt ?? (synced > 0 ? now : null);\n const elapsedSinceProgressStart = progressStartedAt\n ? (now - progressStartedAt) / 1_000\n : 0;\n const nextRate =\n synced > 0 && elapsedSinceProgressStart > 0\n ? synced / elapsedSinceProgressStart\n : current.ratePerSecond;\n\n return {\n ...current,\n progressCurrent: synced,\n progressTotal: total,\n progressStartedAt,\n lastProgressAt: now,\n lastProgressCurrent: Math.max(current.lastProgressCurrent, synced),\n ratePerSecond: nextRate,\n };\n });\n },\n (event) => {\n setSyncState((current) => ({\n ...current,\n message: event.detail,\n progressCurrent: event.synced,\n progressTotal: event.total,\n progressMode: event.mode,\n progressPhase: event.phase,\n }));\n },\n );\n await Promise.all([\n refreshStatus(),\n loadInbox(true),\n screen === \"stats\" ? loadStats() : Promise.resolve(),\n screen === \"rules\" ? loadRules() : Promise.resolve(),\n ]);\n pushFlash(\"success\", \"Inbox sync complete.\");\n } catch (error) {\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n } finally {\n setSyncState((current) => ({\n ...current,\n syncing: false,\n progressCurrent: 0,\n progressTotal: null,\n progressMode: null,\n progressPhase: null,\n startedAt: null,\n progressStartedAt: null,\n lastProgressAt: null,\n lastProgressCurrent: 0,\n ratePerSecond: null,\n }));\n }\n }\n\n async function refreshAfterMutation(): Promise<void> {\n await Promise.all([\n refreshStatus(),\n loadInbox(true),\n screen === \"stats\" ? loadStats() : Promise.resolve(),\n screen === \"rules\" ? loadRules() : Promise.resolve(),\n selectedEmailId && screen === \"email\" ? loadEmailDetail(selectedEmailId) : Promise.resolve(),\n ]);\n }\n\n function currentListSelection(): EmailMessage | null {\n if (screen === \"search\") {\n return searchResults[searchSelectedIndex] || null;\n }\n\n return inboxEmails[inboxSelectedIndex] || null;\n }\n\n async function archiveCurrentEmail(): Promise<void> {\n const email = screen === \"email\"\n ? emailDetail\n : currentListSelection();\n\n if (!email) {\n return;\n }\n\n try {\n await archiveEmails([email.id]);\n pushFlash(\"success\", `Archived ${email.subject || email.id}.`);\n await refreshAfterMutation();\n } catch (error) {\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n }\n }\n\n async function toggleReadCurrentEmail(): Promise<void> {\n const email = screen === \"email\"\n ? emailDetail\n : currentListSelection();\n\n if (!email) {\n return;\n }\n\n try {\n if (email.isRead) {\n await markUnread([email.id]);\n pushFlash(\"success\", `Marked ${email.subject || email.id} as unread.`);\n } else {\n await markRead([email.id]);\n pushFlash(\"success\", `Marked ${email.subject || email.id} as read.`);\n }\n await refreshAfterMutation();\n } catch (error) {\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n }\n }\n\n async function openLabelPicker(targetEmailId: string | null): Promise<void> {\n if (!targetEmailId) {\n return;\n }\n\n setLabelPicker({\n open: true,\n loading: true,\n labels: [],\n selectedIndex: 0,\n targetEmailId,\n createMode: false,\n newLabelName: \"\",\n });\n\n try {\n const labels = await listLabels();\n setLabelPicker((current) => ({\n ...current,\n loading: false,\n labels,\n }));\n } catch (error) {\n setLabelPicker((current) => ({\n ...current,\n loading: false,\n }));\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n }\n }\n\n async function applySelectedLabel(labelName: string): Promise<void> {\n if (!labelPicker.targetEmailId) {\n return;\n }\n\n try {\n await labelEmails([labelPicker.targetEmailId], labelName);\n setLabelPicker((current) => ({\n ...current,\n open: false,\n }));\n pushFlash(\"success\", `Applied label ${labelName}.`);\n await refreshAfterMutation();\n } catch (error) {\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n }\n }\n\n async function createAndApplyLabel(name: string): Promise<void> {\n const trimmed = name.trim();\n\n if (!trimmed) {\n pushFlash(\"error\", \"Label name cannot be empty.\");\n return;\n }\n\n try {\n await createLabel(trimmed);\n await applySelectedLabel(trimmed);\n } catch (error) {\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n }\n }\n\n async function executeSearch(query: string): Promise<void> {\n const trimmed = query.trim();\n\n if (!trimmed) {\n pushFlash(\"error\", \"Enter a Gmail query first.\");\n return;\n }\n\n setSearchLoading(true);\n\n try {\n const results = await listMessages(trimmed, SEARCH_LIMIT);\n setSearchResults(results);\n setSearchSelectedIndex(0);\n setSearchFocus(\"results\");\n pushFlash(\"info\", `${results.length} search results loaded.`);\n } catch (error) {\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n } finally {\n setSearchLoading(false);\n }\n }\n\n function openSelectedEmail(email: EmailMessage, origin: \"inbox\" | \"search\"): void {\n setEmailOrigin(origin);\n setSelectedEmailId(email.id);\n setScreen(\"email\");\n }\n\n useEffect(() => {\n void (async () => {\n await Promise.all([\n refreshStatus(),\n loadInbox(true),\n ]);\n\n if (initialSync) {\n await runSync(\"Syncing inbox…\");\n }\n })();\n }, []);\n\n useEffect(() => {\n if (screen === \"stats\") {\n void loadStats();\n }\n\n if (screen === \"rules\") {\n void loadRules();\n }\n }, [screen]);\n\n useEffect(() => {\n if (screen === \"email\" && selectedEmailId) {\n void loadEmailDetail(selectedEmailId);\n }\n }, [screen, selectedEmailId]);\n\n useEffect(() => {\n if (!flash) {\n return;\n }\n\n const timeout = setTimeout(() => {\n setFlash(null);\n }, 3500);\n\n return () => clearTimeout(timeout);\n }, [flash]);\n\n useInput((input, key) => {\n if (confirmState) {\n if (input === \"y\" || input === \"Y\") {\n const action = confirmState.onConfirm;\n setConfirmState(null);\n void action();\n } else if (input === \"n\" || input === \"N\" || key.escape) {\n setConfirmState(null);\n }\n return;\n }\n\n if (labelPicker.open) {\n if (labelPicker.createMode) {\n if (key.escape) {\n setLabelPicker((current) => ({\n ...current,\n createMode: false,\n newLabelName: \"\",\n }));\n }\n return;\n }\n\n if (key.escape) {\n setLabelPicker((current) => ({\n ...current,\n open: false,\n }));\n return;\n }\n\n if (input === \"j\" || key.downArrow) {\n setLabelPicker((current) => ({\n ...current,\n selectedIndex: clampIndex(current.selectedIndex + 1, current.labels.length),\n }));\n return;\n }\n\n if (input === \"k\" || key.upArrow) {\n setLabelPicker((current) => ({\n ...current,\n selectedIndex: clampIndex(current.selectedIndex - 1, current.labels.length),\n }));\n return;\n }\n\n if (input === \"c\") {\n setLabelPicker((current) => ({\n ...current,\n createMode: true,\n newLabelName: \"\",\n }));\n return;\n }\n\n if (key.return) {\n const label = labelPicker.labels[labelPicker.selectedIndex];\n if (label) {\n void applySelectedLabel(label.name);\n }\n return;\n }\n\n return;\n }\n\n if (screen === \"search\" && searchFocus === \"input\") {\n if (key.escape) {\n setScreen(\"inbox\");\n }\n return;\n }\n\n if (input === \"q\") {\n exit();\n return;\n }\n\n if (screen === \"inbox\") {\n if (input === \"j\" || key.downArrow) {\n if (inboxSelectedIndex === inboxEmails.length - 1 && inboxHasMore && !inboxLoading) {\n void loadInbox(false);\n }\n setInboxSelectedIndex((current) => clampIndex(current + 1, inboxEmails.length));\n return;\n }\n\n if (input === \"k\" || key.upArrow) {\n setInboxSelectedIndex((current) => clampIndex(current - 1, inboxEmails.length));\n return;\n }\n\n if (key.return) {\n const email = inboxEmails[inboxSelectedIndex];\n if (email) {\n openSelectedEmail(email, \"inbox\");\n }\n return;\n }\n\n if (input === \"a\") {\n void archiveCurrentEmail();\n return;\n }\n\n if (input === \"l\") {\n void openLabelPicker(inboxEmails[inboxSelectedIndex]?.id || null);\n return;\n }\n\n if (input === \"r\") {\n void toggleReadCurrentEmail();\n return;\n }\n\n if (input === \"/\") {\n setScreen(\"search\");\n setSearchFocus(\"input\");\n return;\n }\n\n if (input === \"s\") {\n void runSync(\"Syncing inbox…\");\n return;\n }\n\n if (input === \"d\") {\n setScreen(\"stats\");\n return;\n }\n\n if (input === \"R\") {\n setScreen(\"rules\");\n }\n return;\n }\n\n if (screen === \"email\") {\n if (key.escape || key.backspace) {\n setScreen(emailOrigin);\n return;\n }\n\n if (input === \"j\" || key.downArrow) {\n setEmailScroll((current) => current + 1);\n return;\n }\n\n if (input === \"k\" || key.upArrow) {\n setEmailScroll((current) => Math.max(0, current - 1));\n return;\n }\n\n if (input === \"a\") {\n void archiveCurrentEmail();\n return;\n }\n\n if (input === \"l\") {\n void openLabelPicker(selectedEmailId);\n return;\n }\n\n if (input === \"r\") {\n void toggleReadCurrentEmail();\n }\n return;\n }\n\n if (screen === \"stats\") {\n if (key.escape || key.backspace) {\n setScreen(\"inbox\");\n return;\n }\n\n if (input === \"s\") {\n setStatsTab(\"senders\");\n return;\n }\n\n if (input === \"l\") {\n setStatsTab(\"labels\");\n return;\n }\n\n if (input === \"n\") {\n setStatsTab(\"newsletters\");\n }\n return;\n }\n\n if (screen === \"rules\") {\n if (key.escape || key.backspace) {\n setScreen(\"inbox\");\n return;\n }\n\n if (key.tab) {\n setRulesFocus((current) => (current === \"rules\" ? \"history\" : \"rules\"));\n return;\n }\n\n if (input === \"j\" || key.downArrow) {\n if (rulesFocus === \"rules\") {\n setRulesSelectedIndex((current) => clampIndex(current + 1, rules.length));\n } else {\n setHistorySelectedIndex((current) => clampIndex(current + 1, ruleHistory.length));\n }\n return;\n }\n\n if (input === \"k\" || key.upArrow) {\n if (rulesFocus === \"rules\") {\n setRulesSelectedIndex((current) => clampIndex(current - 1, rules.length));\n } else {\n setHistorySelectedIndex((current) => clampIndex(current - 1, ruleHistory.length));\n }\n return;\n }\n\n if (input === \"d\") {\n void (async () => {\n try {\n await deployAllRules(config.rulesDir);\n pushFlash(\"success\", \"Rules deployed from YAML.\");\n await loadRules();\n } catch (error) {\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n }\n })();\n return;\n }\n\n if (input === \"e\" && rulesFocus === \"rules\") {\n const rule = rules[rulesSelectedIndex];\n\n if (!rule) {\n return;\n }\n\n void (async () => {\n try {\n if (rule.enabled) {\n await disableRule(rule.name);\n pushFlash(\"success\", `Disabled rule ${rule.name}.`);\n } else {\n await enableRule(rule.name);\n pushFlash(\"success\", `Enabled rule ${rule.name}.`);\n }\n await loadRules();\n } catch (error) {\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n }\n })();\n return;\n }\n\n if (input === \"r\" && rulesFocus === \"rules\") {\n const rule = rules[rulesSelectedIndex];\n if (!rule) {\n return;\n }\n\n void (async () => {\n try {\n await runRule(rule.name, { dryRun: true, maxEmails: 100 });\n pushFlash(\"success\", `Dry-ran rule ${rule.name}.`);\n await loadRules();\n } catch (error) {\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n }\n })();\n return;\n }\n\n if (input === \"R\" && rulesFocus === \"rules\") {\n const rule = rules[rulesSelectedIndex];\n if (!rule) {\n return;\n }\n\n setConfirmState({\n title: \"Run Rule\",\n message: `Apply rule ${rule.name} against cached matches?`,\n onConfirm: async () => {\n try {\n await runRule(rule.name, { dryRun: false, maxEmails: 100 });\n pushFlash(\"success\", `Applied rule ${rule.name}.`);\n await refreshAfterMutation();\n await loadRules();\n } catch (error) {\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n }\n },\n });\n return;\n }\n\n if (input === \"u\" && rulesFocus === \"history\") {\n const run = ruleHistory[historySelectedIndex];\n if (!run) {\n return;\n }\n\n void (async () => {\n try {\n await undoRun(run.id);\n pushFlash(\"success\", `Undid run ${run.id}.`);\n await refreshAfterMutation();\n await loadRules();\n } catch (error) {\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n }\n })();\n }\n return;\n }\n\n if (screen === \"search\") {\n if (key.escape || key.backspace) {\n setScreen(\"inbox\");\n return;\n }\n\n if (input === \"i\") {\n setSearchFocus(\"input\");\n return;\n }\n\n if (input === \"j\" || key.downArrow) {\n setSearchSelectedIndex((current) => clampIndex(current + 1, searchResults.length));\n return;\n }\n\n if (input === \"k\" || key.upArrow) {\n setSearchSelectedIndex((current) => clampIndex(current - 1, searchResults.length));\n return;\n }\n\n if (key.return) {\n const email = searchResults[searchSelectedIndex];\n if (email) {\n openSelectedEmail(email, \"search\");\n }\n return;\n }\n\n if (input === \"a\") {\n void archiveCurrentEmail();\n return;\n }\n\n if (input === \"l\") {\n void openLabelPicker(searchResults[searchSelectedIndex]?.id || null);\n return;\n }\n\n if (input === \"r\") {\n void toggleReadCurrentEmail();\n }\n }\n });\n\n const chromeHeight = 9;\n const contentHeight = Math.max(MIN_CONTENT_HEIGHT, rows - chromeHeight);\n const emailBodyHeight = Math.max(8, contentHeight - 8);\n const listVisibleRows = Math.max(8, contentHeight - 6);\n const emailBodyLines = emailBody.split(\"\\n\");\n const visibleBodyLines = emailBodyLines.slice(emailScroll, emailScroll + emailBodyHeight);\n const rulesVisibleCount = Math.max(5, Math.floor(contentHeight / 3));\n const historyVisibleCount = Math.max(4, Math.floor(contentHeight / 4));\n const rulesRange = getViewportRange(rules.length, rulesSelectedIndex, rulesVisibleCount);\n const historyRange = getViewportRange(\n ruleHistory.length,\n historySelectedIndex,\n historyVisibleCount,\n );\n const visibleRules = rules.slice(rulesRange.start, rulesRange.end);\n const visibleHistory = ruleHistory.slice(historyRange.start, historyRange.end);\n const selectedRule = rules[rulesSelectedIndex];\n const selectedRun = ruleHistory[historySelectedIndex];\n const screenGuide = getScreenGuide(\n screen,\n screen === \"rules\" ? rulesFocus : screen === \"search\" ? searchFocus : undefined,\n );\n\n return (\n <Box flexDirection=\"column\" width={columns} height={rows} paddingX={1} paddingY={0}>\n <Header\n screen={screen}\n sync={syncState}\n columns={Math.max(40, columns - 2)}\n guide={screenGuide}\n />\n <Box height={contentHeight} flexDirection=\"column\" marginTop={1}>\n {screen === \"inbox\" ? (\n <EmailList\n emails={inboxEmails}\n selectedIndex={inboxSelectedIndex}\n title=\"Inbox\"\n loading={inboxLoading}\n emptyMessage=\"No cached emails yet. Sync to populate the local inbox.\"\n visibleRows={listVisibleRows}\n subtitle=\"Local cache first, background sync second\"\n />\n ) : null}\n\n {screen === \"email\" ? (\n <Panel\n title={sanitizeInlineText(emailDetail?.subject || \"Email Detail\", Math.max(20, columns - 12))}\n subtitle=\"Esc back • j/k scroll • a archive • l label • r toggle read\"\n accent=\"green\"\n >\n {emailLoading ? (\n <Text color=\"cyan\">\n <Spinner type=\"dots\" /> Loading full email body…\n </Text>\n ) : emailDetail ? (\n <>\n <Text>\n From: {sanitizeInlineText(emailDetail.fromName ? `${emailDetail.fromName} <${emailDetail.fromAddress}>` : emailDetail.fromAddress)}\n </Text>\n <Text>To: {sanitizeInlineText(emailDetail.toAddresses.join(\", \") || \"-\")}</Text>\n <Text>Date: {new Date(emailDetail.date).toISOString()}</Text>\n <Text>Labels: {sanitizeInlineText(emailDetail.labelIds.join(\", \") || \"-\")}</Text>\n <Box marginTop={1} flexDirection=\"column\">\n {visibleBodyLines.length === 0 ? (\n <Text color=\"gray\">(no body content)</Text>\n ) : (\n visibleBodyLines.map((line, index) => (\n <Text key={`body-${index}`}>{sanitizeInlineText(line || \" \", Math.max(20, columns - 8))}</Text>\n ))\n )}\n </Box>\n <Box marginTop={1}>\n <Text color=\"gray\">line {Math.min(emailBodyLines.length, emailScroll + 1)} of {emailBodyLines.length || 1}</Text>\n </Box>\n </>\n ) : (\n <Text color=\"gray\">Unable to load email detail.</Text>\n )}\n </Panel>\n ) : null}\n\n {screen === \"stats\" ? (\n <Panel\n title=\"Stats Dashboard\"\n subtitle=\"s senders • l labels • n newsletters • Esc back\"\n accent=\"yellow\"\n >\n {statsLoading ? (\n <Text color=\"cyan\">\n <Spinner type=\"dots\" /> Loading stats…\n </Text>\n ) : (\n <>\n <Box marginTop={1} flexDirection=\"column\">\n <Text>Total: {statsOverview?.total ?? 0}</Text>\n <Text>Unread: {statsOverview?.unread ?? 0}</Text>\n <Text>Starred: {statsOverview?.starred ?? 0}</Text>\n <Text>\n Today: {statsOverview?.today.received ?? 0} received / {statsOverview?.today.unread ?? 0} unread\n </Text>\n <Text>\n Week: {statsOverview?.thisWeek.received ?? 0} received / {statsOverview?.thisWeek.unread ?? 0} unread\n </Text>\n <Text>\n Month: {statsOverview?.thisMonth.received ?? 0} received / {statsOverview?.thisMonth.unread ?? 0} unread\n </Text>\n </Box>\n <Box marginTop={1}>\n <Text color={statsTab === \"senders\" ? \"cyan\" : \"gray\"}>[Senders]</Text>\n <Text> </Text>\n <Text color={statsTab === \"labels\" ? \"cyan\" : \"gray\"}>[Labels]</Text>\n <Text> </Text>\n <Text color={statsTab === \"newsletters\" ? \"cyan\" : \"gray\"}>[Newsletters]</Text>\n </Box>\n {statsTab === \"senders\" ? (\n <Table\n title=\"Top Senders\"\n headers={[\"SENDER\", \"TOTAL\", \"UNREAD%\"]}\n rows={statsSenders.map((sender) => [\n truncate(sender.name || sender.email, 28),\n String(sender.totalMessages),\n formatPercent(sender.unreadRate),\n ])}\n emptyMessage=\"No sender stats available.\"\n />\n ) : null}\n {statsTab === \"labels\" ? (\n <Table\n title=\"Top Labels\"\n headers={[\"LABEL\", \"TOTAL\", \"UNREAD\"]}\n rows={statsLabels.map((label) => [\n truncate(label.labelName, 24),\n String(label.totalMessages),\n String(label.unreadMessages),\n ])}\n emptyMessage=\"No label stats available.\"\n />\n ) : null}\n {statsTab === \"newsletters\" ? (\n <Table\n title=\"Newsletters\"\n headers={[\"SENDER\", \"TOTAL\", \"UNREAD%\", \"STATUS\"]}\n rows={statsNewsletters.map((newsletter) => [\n truncate(newsletter.name || newsletter.email, 24),\n String(newsletter.messageCount),\n formatPercent(newsletter.unreadRate),\n newsletter.status,\n ])}\n emptyMessage=\"No newsletters detected.\"\n />\n ) : null}\n <Table\n title=\"Recent Volume\"\n headers={[\"DAY\", \"RECEIVED\", \"UNREAD\"]}\n rows={statsVolume.map((point) => [\n point.period,\n String(point.received),\n String(point.unread),\n ])}\n emptyMessage=\"No cached volume data.\"\n />\n </>\n )}\n </Panel>\n ) : null}\n\n {screen === \"rules\" ? (\n <Panel\n title=\"Rules Control\"\n subtitle=\"Tab switches focus • d deploy • e toggle • r dry-run • R apply • u undo\"\n accent=\"magenta\"\n >\n {rulesLoading ? (\n <Text color=\"cyan\">\n <Spinner type=\"dots\" /> Loading rules…\n </Text>\n ) : (\n <>\n <Text color={rulesFocus === \"rules\" ? \"cyan\" : \"gray\"}>Rules</Text>\n {rules.length === 0 ? (\n <Text color=\"gray\">No deployed rules.</Text>\n ) : (\n visibleRules.map((rule, index) => {\n const absoluteIndex = rulesRange.start + index;\n\n return (\n <Text\n key={rule.id}\n backgroundColor={rulesFocus === \"rules\" && absoluteIndex === rulesSelectedIndex ? \"magenta\" : undefined}\n color={rulesFocus === \"rules\" && absoluteIndex === rulesSelectedIndex ? \"black\" : undefined}\n >\n {rule.enabled ? \"✓\" : \"·\"} {rule.name} ({rule.totalRuns} runs, last {formatRelativeTime(rule.lastExecutionAt)})\n </Text>\n );\n })\n )}\n <Box marginTop={1} flexDirection=\"column\">\n <Text color={rulesFocus === \"history\" ? \"cyan\" : \"gray\"}>Recent History</Text>\n {ruleHistory.length === 0 ? (\n <Text color=\"gray\">No execution history yet.</Text>\n ) : (\n visibleHistory.map((run, index) => {\n const absoluteIndex = historyRange.start + index;\n\n return (\n <Text\n key={run.id}\n backgroundColor={rulesFocus === \"history\" && absoluteIndex === historySelectedIndex ? \"white\" : undefined}\n color={rulesFocus === \"history\" && absoluteIndex === historySelectedIndex ? \"black\" : undefined}\n >\n {run.status} {run.id} ({run.itemCount} items, {formatRelativeTime(run.createdAt)})\n </Text>\n );\n })\n )}\n </Box>\n {selectedRule && rulesFocus === \"rules\" ? (\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"gray\">Selected rule: {selectedRule.name}</Text>\n <Text color=\"gray\">Actions: {selectedRule.actions.map((action) => action.type).join(\", \") || \"-\"}</Text>\n </Box>\n ) : null}\n {selectedRun && rulesFocus === \"history\" ? (\n <Text color=\"gray\">Selected run: {selectedRun.id}</Text>\n ) : null}\n </>\n )}\n </Panel>\n ) : null}\n\n {screen === \"search\" ? (\n <Panel\n title=\"Search\"\n subtitle=\"Enter Gmail query syntax • Enter search • i focus input • Esc back\"\n accent=\"cyan\"\n >\n <Box>\n <Text color=\"cyan\">query: </Text>\n <TextInput\n value={searchQuery}\n onChange={setSearchQuery}\n onSubmit={(value) => {\n void executeSearch(value);\n }}\n focus={searchFocus === \"input\"}\n />\n </Box>\n {searchLoading ? (\n <Text color=\"cyan\">\n <Spinner type=\"dots\" /> Searching Gmail…\n </Text>\n ) : (\n <EmailList\n emails={searchResults}\n selectedIndex={searchSelectedIndex}\n title=\"Results\"\n emptyMessage=\"No results yet.\"\n visibleRows={Math.max(6, listVisibleRows - 4)}\n />\n )}\n </Panel>\n ) : null}\n </Box>\n\n {labelPicker.open ? (\n <Modal title=\"Label Picker\">\n {labelPicker.loading ? (\n <Text color=\"cyan\">\n <Spinner type=\"dots\" /> Loading labels…\n </Text>\n ) : labelPicker.createMode ? (\n <>\n <Text color=\"gray\">Enter new label name, then press Enter. Esc cancels.</Text>\n <TextInput\n value={labelPicker.newLabelName}\n onChange={(value) => {\n setLabelPicker((current) => ({\n ...current,\n newLabelName: value,\n }));\n }}\n onSubmit={(value) => {\n void createAndApplyLabel(value);\n }}\n focus\n />\n </>\n ) : labelPicker.labels.length === 0 ? (\n <Text color=\"gray\">No labels available. Press c to create one.</Text>\n ) : (\n <>\n <Text color=\"gray\">j/k navigate, Enter apply, c create label, Esc cancel</Text>\n {labelPicker.labels.map((label, index) => (\n <Text key={label.id} inverse={index === labelPicker.selectedIndex}>\n {label.name}\n </Text>\n ))}\n </>\n )}\n </Modal>\n ) : null}\n\n {confirmState ? (\n <Modal title={confirmState.title}>\n <Text>{confirmState.message}</Text>\n <Text color=\"gray\">Press y to continue or n to cancel.</Text>\n </Modal>\n ) : null}\n\n <StatusBar\n screen={screen}\n email={authEmail}\n unreadCount={unreadCount}\n sync={syncState}\n flash={flash}\n columns={columns}\n />\n </Box>\n );\n}\n\nexport async function startTuiApp(options?: { noSync?: boolean }): Promise<void> {\n if (process.stdout.isTTY) {\n process.stdout.write(\"\\u001B[?1049h\\u001B[2J\\u001B[H\");\n }\n\n try {\n const instance = render(<App initialSync={!options?.noSync} />);\n await instance.waitUntilExit();\n } finally {\n if (process.stdout.isTTY) {\n process.stdout.write(\"\\u001B[?1049l\");\n }\n }\n}\n","import type {\n RawGmailFilter,\n RawGmailFilterAction,\n RawGmailFilterCriteria,\n RawGmailHistoryResponse,\n RawGmailLabel,\n RawGmailListFiltersResponse,\n RawGmailListLabelsResponse,\n RawGmailListMessagesResponse,\n RawGmailMessage,\n RawGmailProfile,\n RawGmailSendMessageResponse,\n RawGmailThread,\n} from \"../gmail/types.js\";\nimport type { GmailTransport } from \"../gmail/transport.js\";\nimport type { DemoDataset, DemoMessageRecord } from \"./seed.js\";\n\nfunction copyMessage(message: RawGmailMessage): RawGmailMessage {\n return JSON.parse(JSON.stringify(message)) as RawGmailMessage;\n}\n\nfunction copyLabel(label: RawGmailLabel): RawGmailLabel {\n return { ...label };\n}\n\nfunction copyFilter(filter: RawGmailFilter): RawGmailFilter {\n return JSON.parse(JSON.stringify(filter)) as RawGmailFilter;\n}\n\nfunction getSearchTokens(query: string): string[] {\n return query.match(/\"[^\"]+\"|\\S+/g) || [];\n}\n\nfunction normalize(value: string | null | undefined): string {\n return (value || \"\").trim().toLowerCase();\n}\n\nfunction includesLabel(\n labelIds: string[],\n rawLabels: Map<string, RawGmailLabel>,\n expected: string,\n): boolean {\n return labelIds.some((labelId) => {\n const label = rawLabels.get(labelId);\n return (\n normalize(labelId) === expected ||\n normalize(label?.name) === expected ||\n normalize(label?.name).replace(/\\s+/g, \"-\") === expected\n );\n });\n}\n\nfunction matchesQuery(\n entry: DemoMessageRecord,\n query: string,\n rawLabels: Map<string, RawGmailLabel>,\n): boolean {\n const trimmed = query.trim();\n\n if (!trimmed) {\n return true;\n }\n\n const searchableText = normalize(\n [\n entry.message.fromAddress,\n entry.message.fromName,\n entry.message.subject,\n entry.message.snippet,\n ...entry.message.toAddresses,\n ].join(\" \"),\n );\n\n return getSearchTokens(trimmed).every((token) => {\n const cleaned = token.replace(/^\"|\"$/g, \"\");\n const separator = cleaned.indexOf(\":\");\n\n if (separator === -1) {\n return searchableText.includes(normalize(cleaned));\n }\n\n const key = normalize(cleaned.slice(0, separator));\n const value = normalize(cleaned.slice(separator + 1));\n\n switch (key) {\n case \"from\":\n return normalize(entry.message.fromAddress).includes(value) || normalize(entry.message.fromName).includes(value);\n case \"to\":\n return entry.message.toAddresses.some((address) => normalize(address).includes(value));\n case \"subject\":\n return normalize(entry.message.subject).includes(value);\n case \"label\":\n return includesLabel(entry.message.labelIds, rawLabels, value);\n case \"is\":\n if (value === \"unread\") return !entry.message.isRead;\n if (value === \"read\") return entry.message.isRead;\n if (value === \"starred\") return entry.message.isStarred;\n return true;\n case \"has\":\n if (value === \"attachment\") return entry.message.hasAttachments;\n return true;\n default:\n return searchableText.includes(normalize(cleaned));\n }\n });\n}\n\nfunction applyLabelMutation(\n labelIds: string[],\n addLabelIds: string[] = [],\n removeLabelIds: string[] = [],\n): string[] {\n const next = labelIds.filter((labelId) => !removeLabelIds.includes(labelId));\n\n for (const labelId of addLabelIds) {\n if (!next.includes(labelId)) {\n next.push(labelId);\n }\n }\n\n return next;\n}\n\nexport class DemoTransport implements GmailTransport {\n kind = \"rest\" as const;\n private readonly labels = new Map<string, RawGmailLabel>();\n private readonly messages = new Map<string, DemoMessageRecord>();\n private readonly filters = new Map<string, RawGmailFilter>();\n private historyCounter: number;\n\n constructor(private readonly dataset: DemoDataset) {\n this.historyCounter = Number.parseInt(dataset.historyId, 10) || 12345678;\n\n for (const label of dataset.labels) {\n if (label.id) {\n this.labels.set(label.id, copyLabel(label));\n }\n }\n\n for (const message of dataset.messages) {\n this.messages.set(message.message.id, {\n ...message,\n message: {\n ...message.message,\n labelIds: [...message.message.labelIds],\n },\n rawMessage: copyMessage(message.rawMessage),\n });\n }\n\n for (const filter of dataset.filters) {\n if (filter.id) {\n this.filters.set(filter.id, copyFilter(filter));\n }\n }\n }\n\n async getProfile(): Promise<RawGmailProfile> {\n return {\n emailAddress: this.dataset.accountEmail,\n historyId: String(this.historyCounter),\n messagesTotal: this.messages.size,\n threadsTotal: new Set(\n [...this.messages.values()].map((entry) => entry.message.threadId),\n ).size,\n };\n }\n\n private buildLabelDetails(label: RawGmailLabel): RawGmailLabel {\n const id = label.id || label.name || \"\";\n const matching = [...this.messages.values()].filter((entry) =>\n entry.message.labelIds.includes(id),\n );\n\n return {\n ...copyLabel(label),\n messagesTotal: matching.length,\n messagesUnread: matching.filter((entry) => !entry.message.isRead).length,\n threadsTotal: new Set(matching.map((entry) => entry.message.threadId)).size,\n threadsUnread: new Set(\n matching\n .filter((entry) => !entry.message.isRead)\n .map((entry) => entry.message.threadId),\n ).size,\n };\n }\n\n async listLabels(): Promise<RawGmailListLabelsResponse> {\n return {\n labels: [...this.labels.values()].map((label) => this.buildLabelDetails(label)),\n };\n }\n\n async getLabel(id: string): Promise<RawGmailLabel> {\n const label = this.labels.get(id);\n\n if (!label) {\n throw new Error(`Demo label not found: ${id}`);\n }\n\n return this.buildLabelDetails(label);\n }\n\n async createLabel(input: {\n name: string;\n color?: RawGmailLabel[\"color\"];\n }): Promise<RawGmailLabel> {\n const existing = [...this.labels.values()].find(\n (label) => normalize(label.name) === normalize(input.name),\n );\n\n if (existing) {\n return this.buildLabelDetails(existing);\n }\n\n const nextUserLabelCount =\n [...this.labels.values()].filter((label) => label.type === \"user\").length + 1;\n const created: RawGmailLabel = {\n id: `Label_${nextUserLabelCount}`,\n name: input.name.trim(),\n type: \"user\",\n color: input.color || null,\n };\n this.labels.set(created.id as string, created);\n return this.buildLabelDetails(created);\n }\n\n async batchModifyMessages(input: {\n ids: string[];\n addLabelIds?: string[];\n removeLabelIds?: string[];\n }): Promise<void> {\n for (const id of input.ids) {\n const entry = this.messages.get(id);\n\n if (!entry) {\n continue;\n }\n\n const nextLabelIds = applyLabelMutation(\n entry.message.labelIds,\n input.addLabelIds,\n input.removeLabelIds,\n );\n\n entry.message.labelIds = nextLabelIds;\n entry.message.isRead = !nextLabelIds.includes(\"UNREAD\");\n entry.message.isStarred = nextLabelIds.includes(\"STARRED\");\n entry.rawMessage.labelIds = [...nextLabelIds];\n }\n\n this.historyCounter += 1;\n }\n\n async sendMessage(): Promise<RawGmailSendMessageResponse> {\n this.historyCounter += 1;\n return {\n id: `sent-demo-${this.historyCounter}`,\n threadId: `sent-thread-${this.historyCounter}`,\n labelIds: [\"SENT\"],\n };\n }\n\n async listMessages(options: {\n query?: string;\n maxResults?: number;\n pageToken?: string;\n }): Promise<RawGmailListMessagesResponse> {\n const matching = [...this.messages.values()]\n .filter((entry) => matchesQuery(entry, options.query || \"\", this.labels))\n .sort((left, right) => right.message.date - left.message.date);\n const offset = options.pageToken ? Number.parseInt(options.pageToken, 10) : 0;\n const limit = options.maxResults || 20;\n const slice = matching.slice(offset, offset + limit);\n const nextOffset = offset + slice.length;\n\n return {\n messages: slice.map((entry) => ({\n id: entry.message.id,\n threadId: entry.message.threadId,\n })),\n nextPageToken: nextOffset < matching.length ? String(nextOffset) : undefined,\n resultSizeEstimate: matching.length,\n };\n }\n\n async getMessage(options: {\n id: string;\n }): Promise<RawGmailMessage> {\n const entry = this.messages.get(options.id);\n\n if (!entry) {\n throw new Error(`Demo message not found: ${options.id}`);\n }\n\n return copyMessage(entry.rawMessage);\n }\n\n async getThread(id: string): Promise<RawGmailThread> {\n const messages = [...this.messages.values()]\n .filter((entry) => entry.message.threadId === id)\n .sort((left, right) => left.message.date - right.message.date)\n .map((entry) => copyMessage(entry.rawMessage));\n\n return {\n id,\n messages,\n };\n }\n\n async listHistory(): Promise<RawGmailHistoryResponse> {\n return {\n history: [],\n historyId: String(this.historyCounter),\n };\n }\n\n async listFilters(): Promise<RawGmailListFiltersResponse> {\n return {\n filter: [...this.filters.values()].map((filter) => copyFilter(filter)),\n };\n }\n\n async getFilter(id: string): Promise<RawGmailFilter> {\n const filter = this.filters.get(id);\n\n if (!filter) {\n throw new Error(`Demo filter not found: ${id}`);\n }\n\n return copyFilter(filter);\n }\n\n async createFilter(filter: {\n criteria: RawGmailFilterCriteria;\n action: RawGmailFilterAction;\n }): Promise<RawGmailFilter> {\n const created: RawGmailFilter = {\n id: `filter-demo-${this.filters.size + 1}`,\n criteria: filter.criteria,\n action: filter.action,\n };\n this.filters.set(created.id as string, created);\n return copyFilter(created);\n }\n\n async deleteFilter(id: string): Promise<void> {\n if (!this.filters.delete(id)) {\n throw new Error(`Demo filter not found: ${id}`);\n }\n }\n}\n\nexport function createDemoTransport(dataset: DemoDataset): GmailTransport {\n return new DemoTransport(dataset);\n}\n","import type Database from \"better-sqlite3\";\nimport type {\n EmailMessage,\n RawGmailFilter,\n RawGmailLabel,\n RawGmailMessage,\n} from \"../gmail/types.js\";\n\nexport const DEMO_ACCOUNT_EMAIL = \"demo@example.com\";\nconst USER_LABELS = {\n receipts: \"Label_1\",\n awsAlerts: \"Label_2\",\n important: \"Label_3\",\n} as const;\n\ntype SenderKey =\n | \"github\"\n | \"stripe\"\n | \"aws\"\n | \"vercel\"\n | \"linear\"\n | \"alice\"\n | \"bob\"\n | \"newsletter\"\n | \"hn\"\n | \"paypal\"\n | \"shopify\"\n | \"docker\"\n | \"sarah\"\n | \"npm\"\n | \"slack\";\n\ninterface SenderSpec {\n key: SenderKey;\n name: string;\n email: string;\n count: number;\n unread: number;\n hasListUnsubscribe?: boolean;\n}\n\nexport interface DemoMessageRecord {\n senderKey: SenderKey;\n message: EmailMessage;\n rawMessage: RawGmailMessage;\n bodyText: string;\n}\n\nexport interface DemoRuleRecord {\n id: string;\n name: string;\n description: string;\n enabled: boolean;\n yamlHash: string;\n conditions: Record<string, unknown>;\n actions: Array<Record<string, unknown>>;\n priority: number;\n deployedAt: number;\n createdAt: number;\n}\n\nexport interface DemoExecutionRunRecord {\n id: string;\n sourceType: \"manual\" | \"rule\";\n ruleId: string | null;\n dryRun: boolean;\n requestedActions: Array<Record<string, unknown>>;\n query: string | null;\n status: \"planned\" | \"applied\";\n createdAt: number;\n undoneAt: number | null;\n}\n\nexport interface DemoExecutionItemRecord {\n id: string;\n runId: string;\n emailId: string;\n status: \"planned\" | \"applied\";\n appliedActions: Array<Record<string, unknown>>;\n beforeLabelIds: string[];\n afterLabelIds: string[];\n errorMessage: string | null;\n executedAt: number;\n undoneAt: number | null;\n}\n\nexport interface DemoNewsletterRecord {\n id: string;\n email: string;\n name: string;\n messageCount: number;\n unreadCount: number;\n status: \"active\";\n unsubscribeLink: string | null;\n detectionReason: string;\n firstSeen: number;\n lastSeen: number;\n}\n\nexport interface DemoDataset {\n accountEmail: string;\n historyId: string;\n labels: RawGmailLabel[];\n messages: DemoMessageRecord[];\n rules: DemoRuleRecord[];\n executionRuns: DemoExecutionRunRecord[];\n executionItems: DemoExecutionItemRecord[];\n newsletters: DemoNewsletterRecord[];\n filters: RawGmailFilter[];\n}\n\nconst SYSTEM_LABELS: RawGmailLabel[] = [\n { id: \"INBOX\", name: \"Inbox\", type: \"system\" },\n { id: \"UNREAD\", name: \"Unread\", type: \"system\" },\n { id: \"STARRED\", name: \"Starred\", type: \"system\" },\n { id: \"SENT\", name: \"Sent\", type: \"system\" },\n { id: \"DRAFT\", name: \"Drafts\", type: \"system\" },\n { id: \"SPAM\", name: \"Spam\", type: \"system\" },\n { id: \"TRASH\", name: \"Trash\", type: \"system\" },\n { id: \"CATEGORY_UPDATES\", name: \"Updates\", type: \"system\" },\n { id: \"CATEGORY_PROMOTIONS\", name: \"Promotions\", type: \"system\" },\n];\n\nconst DEMO_LABELS: RawGmailLabel[] = [\n ...SYSTEM_LABELS,\n { id: USER_LABELS.receipts, name: \"Receipts\", type: \"user\" },\n { id: USER_LABELS.awsAlerts, name: \"AWS-Alerts\", type: \"user\" },\n { id: USER_LABELS.important, name: \"Important\", type: \"user\" },\n];\n\nconst SENDERS: SenderSpec[] = [\n { key: \"github\", name: \"GitHub\", email: \"notifications@github.com\", count: 25, unread: 8 },\n { key: \"stripe\", name: \"Stripe\", email: \"receipts@stripe.com\", count: 12, unread: 0 },\n { key: \"aws\", name: \"AWS Notifications\", email: \"no-reply@amazonaws.com\", count: 18, unread: 14 },\n { key: \"vercel\", name: \"Vercel\", email: \"notifications@vercel.com\", count: 10, unread: 7 },\n { key: \"linear\", name: \"Linear\", email: \"notifications@linear.app\", count: 15, unread: 3 },\n { key: \"alice\", name: \"Alice Chen\", email: \"alice.chen@example.com\", count: 8, unread: 2 },\n { key: \"bob\", name: \"Bob Martinez\", email: \"bob.martinez@example.com\", count: 6, unread: 1 },\n { key: \"newsletter\", name: \"Newsletter Weekly\", email: \"digest@newsletterweekly.com\", count: 14, unread: 12, hasListUnsubscribe: true },\n { key: \"hn\", name: \"Hacker News Digest\", email: \"hn@newsletters.hackernews.com\", count: 12, unread: 10, hasListUnsubscribe: true },\n { key: \"paypal\", name: \"PayPal\", email: \"service@paypal.com\", count: 8, unread: 0 },\n { key: \"shopify\", name: \"Shopify\", email: \"no-reply@shopify.com\", count: 6, unread: 0 },\n { key: \"docker\", name: \"Docker Hub\", email: \"noreply@docker.com\", count: 5, unread: 4 },\n { key: \"sarah\", name: \"Sarah Kim\", email: \"sarah.kim@example.com\", count: 4, unread: 1 },\n { key: \"npm\", name: \"npm\", email: \"support@npmjs.com\", count: 4, unread: 3 },\n { key: \"slack\", name: \"Slack\", email: \"notification@slack.com\", count: 3, unread: 2 },\n];\n\nconst PRIORITY_SEQUENCE: SenderKey[] = [\n \"github\",\n \"aws\",\n \"stripe\",\n \"alice\",\n \"linear\",\n \"github\",\n \"newsletter\",\n \"stripe\",\n \"vercel\",\n \"hn\",\n \"bob\",\n \"github\",\n];\n\nfunction createRng(seed: number): () => number {\n let state = seed >>> 0;\n return () => {\n state = (state * 1664525 + 1013904223) >>> 0;\n return state / 0x100000000;\n };\n}\n\nfunction encodeBase64Url(value: string): string {\n return Buffer.from(value, \"utf8\")\n .toString(\"base64\")\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=+$/g, \"\");\n}\n\nfunction buildTimestamps(now: number, total: number): number[] {\n const timestamps: number[] = [];\n const blocks = [\n { count: 10, startHours: 0.5, endHours: 23 },\n { count: 15, startHours: 26, endHours: 72 },\n { count: 30, startHours: 74, endHours: 168 },\n { count: total - 55, startHours: 170, endHours: 720 },\n ];\n\n for (const block of blocks) {\n for (let index = 0; index < block.count; index += 1) {\n const ratio = block.count === 1 ? 0 : index / (block.count - 1);\n const offsetHours = block.startHours + ratio * (block.endHours - block.startHours);\n timestamps.push(now - Math.round(offsetHours * 60 * 60 * 1000));\n }\n }\n\n return timestamps.sort((a, b) => b - a);\n}\n\nfunction chooseSender(\n slotIndex: number,\n remaining: Map<SenderKey, number>,\n rng: () => number,\n): SenderKey {\n const preferred = PRIORITY_SEQUENCE[slotIndex];\n\n if (preferred && (remaining.get(preferred) || 0) > 0) {\n remaining.set(preferred, (remaining.get(preferred) || 0) - 1);\n return preferred;\n }\n\n const weighted = [...remaining.entries()].filter(([, count]) => count > 0);\n const totalWeight = weighted.reduce((sum, [, count]) => sum + count, 0);\n let cursor = rng() * totalWeight;\n\n for (const [key, count] of weighted) {\n cursor -= count;\n\n if (cursor <= 0) {\n remaining.set(key, count - 1);\n return key;\n }\n }\n\n const fallback = weighted[weighted.length - 1]?.[0];\n\n if (!fallback) {\n throw new Error(\"Demo sender pool exhausted unexpectedly.\");\n }\n\n remaining.set(fallback, (remaining.get(fallback) || 1) - 1);\n return fallback;\n}\n\nfunction getSubject(senderKey: SenderKey, sequence: number): string {\n switch (senderKey) {\n case \"github\":\n return [\n `Re: [acme/inboxctl] Fix race condition in worker pool (#12${sequence + 1})`,\n `[acme/inboxctl] New issue: Memory leak in cache layer (#23${sequence + 1})`,\n `[acme/platform] Review requested on PR #45${sequence + 1}`,\n `Re: [acme/inboxctl] TUI search pagination follow-up (#34${sequence + 1})`,\n ][sequence % 4];\n case \"stripe\":\n return [\n \"Your receipt from Acme Corp - $49.00\",\n \"Payment to DigitalOcean - $12.00\",\n \"Your receipt from Render, Inc. - $29.00\",\n \"Invoice paid: GitHub Team - $9.00\",\n ][sequence % 4];\n case \"aws\":\n return [\n \"AWS Billing Alert: Your estimated charges exceed $50\",\n \"Amazon EC2 Maintenance Notification\",\n \"AWS Trusted Advisor weekly summary\",\n \"Amazon RDS performance insights available\",\n ][sequence % 4];\n case \"vercel\":\n return [\n \"Deployment completed for inboxctl-web\",\n \"Build failed for docs-preview\",\n \"Preview ready for PR #184\",\n \"Your project has a new domain alias\",\n ][sequence % 4];\n case \"linear\":\n return [\n \"Issue assigned: PROJ-142 Implement retry logic\",\n \"Comment on PROJ-138\",\n \"Cycle planning notes are ready\",\n \"Issue updated: PROJ-155 Improve inbox search\",\n ][sequence % 4];\n case \"alice\":\n return [\n \"Re: Architecture review notes\",\n \"Quick question about the deploy pipeline\",\n \"Lunch tomorrow?\",\n \"Follow-up on MCP prompt defaults\",\n ][sequence % 4];\n case \"bob\":\n return [\n \"Re: Sprint planning agenda\",\n \"Can you sanity-check the release notes?\",\n \"Quick update on the billing incident\",\n ][sequence % 3];\n case \"newsletter\":\n return [\n \"Weekly systems brief: incidents, launches, and lessons learned\",\n \"This week in developer tools\",\n \"Five workflows worth stealing this week\",\n ][sequence % 3];\n case \"hn\":\n return [\n \"Hacker News Digest: Top stories this week\",\n \"HN Digest: AI tooling, terminals, and SQLite\",\n \"Your weekly Hacker News roundup\",\n ][sequence % 3];\n case \"paypal\":\n return [\n \"Receipt for your payment to Figma\",\n \"You sent a payment to Notion Labs\",\n \"Transaction receipt from OpenAI\",\n ][sequence % 3];\n case \"shopify\":\n return [\n \"Order confirmation from Acme Supply\",\n \"Receipt from Shopify Billing\",\n \"Your Shopify payment receipt\",\n ][sequence % 3];\n case \"docker\":\n return [\n \"Docker Hub autobuild completed\",\n \"New image vulnerability summary\",\n \"Usage summary for your Docker plan\",\n ][sequence % 3];\n case \"sarah\":\n return [\n \"Re: Copy review for the setup guide\",\n \"Notes from today's product sync\",\n \"Small wording suggestion for the README\",\n ][sequence % 3];\n case \"npm\":\n return [\n \"Security notice for one of your dependencies\",\n \"Your npm access token was used\",\n \"Package advisory summary\",\n ][sequence % 3];\n case \"slack\":\n return [\n \"You have unread mentions in #engineering\",\n \"Slack summary for yesterday\",\n \"Reminder: action requested in #launches\",\n ][sequence % 3];\n }\n}\n\nfunction buildBody(sender: SenderSpec, subject: string, sequence: number): string {\n switch (sender.key) {\n case \"github\":\n return [\n subject,\n \"\",\n \"A reviewer left feedback on your pull request.\",\n \"\",\n \"File: src/core/rules/executor.ts\",\n \"\",\n \"```ts\",\n \"if (result.status === \\\"warning\\\") {\",\n \" retryQueue.push(item);\",\n \"}\",\n \"```\",\n \"\",\n \"Comment:\",\n \"The warning path looks good, but we may still emit duplicate audit items\",\n \"when the retry branch is hit after a partial apply. Can we move the\",\n \"audit append behind the final status resolution?\",\n \"\",\n \"Suggested follow-up:\",\n \"- add a regression test around repeated partial retries\",\n \"- confirm undo still sees a single logical execution item\",\n \"\",\n \"View pull request\",\n \"Reply to comment\",\n ].join(\"\\n\");\n case \"stripe\":\n return [\n subject,\n \"\",\n \"Receipt summary\",\n \"----------------------------------------\",\n `Receipt number: rcpt_demo_${sequence + 1}`,\n \"Paid with: Visa ending in 4242\",\n \"Billing contact: demo@example.com\",\n \"\",\n \"Line items\",\n \"- Team plan........................ $29.00\",\n \"- Usage overage................... $20.00\",\n \"\",\n \"Subtotal.......................... $49.00\",\n \"Tax............................... $0.00\",\n \"Total............................. $49.00\",\n \"\",\n \"If you have questions about this charge, reply to this email and include\",\n \"the receipt number above.\",\n ].join(\"\\n\");\n case \"aws\":\n return [\n subject,\n \"\",\n \"Account: demo-platform\",\n \"Region highlights:\",\n \"- us-east-1 EC2 running hours increased by 14%\",\n \"- ap-southeast-2 RDS backup storage exceeded forecast\",\n \"- CloudWatch logs ingestion steady week over week\",\n \"\",\n \"Estimated charges\",\n \"- EC2.............................. $28.40\",\n \"- RDS.............................. $13.10\",\n \"- CloudWatch....................... $7.92\",\n \"- Data transfer.................... $3.61\",\n \"\",\n \"Recommended actions\",\n \"- review orphaned volumes\",\n \"- confirm dev database retention\",\n \"- validate expected scale-up window\",\n ].join(\"\\n\");\n case \"newsletter\":\n case \"hn\":\n return [\n subject,\n \"\",\n \"Good morning.\",\n \"\",\n \"Here is your roundup of the links and ideas people kept passing around\",\n \"this week, from terminal UX to pricing models to practical SQLite tips.\",\n \"\",\n \"Featured reads\",\n \"- A better way to review notification-heavy inboxes\",\n \"- Why local-first tools feel faster and safer\",\n \"- The hidden costs of brittle automation\",\n \"\",\n \"Worth a skim if you missed them\",\n \"- Building humane CLIs\",\n \"- Debugging MCP integrations in practice\",\n \"- Shipping small tools without creating trust debt\",\n \"\",\n \"Read online\",\n \"Manage subscription\",\n ].join(\"\\n\");\n case \"alice\":\n case \"bob\":\n case \"sarah\":\n return [\n subject,\n \"\",\n `Hey team,`,\n \"\",\n \"A couple of quick notes from my side:\",\n \"- the current flow feels solid once the first sync is done\",\n \"- the setup copy could be a little shorter\",\n \"- I like that the TUI keeps the audit story visible\",\n \"\",\n \"Can you take a look when you get a chance?\",\n \"\",\n \"Thanks,\",\n sender.name,\n ].join(\"\\n\");\n default:\n return [\n subject,\n \"\",\n `${sender.name} generated this notification for the demo mailbox.`,\n \"\",\n \"This message exists so the TUI detail view, sender stats, and search\",\n \"screens all have realistic data to work with.\",\n ].join(\"\\n\");\n }\n}\n\nfunction getBaseLabelIds(senderKey: SenderKey, unread: boolean, sequence: number): string[] {\n const labels = [\"INBOX\"];\n\n if (unread) {\n labels.push(\"UNREAD\");\n }\n\n switch (senderKey) {\n case \"github\":\n case \"linear\":\n labels.push(\"CATEGORY_UPDATES\");\n break;\n case \"stripe\":\n case \"paypal\":\n case \"shopify\":\n labels.push(USER_LABELS.receipts);\n break;\n case \"alice\":\n case \"bob\":\n case \"sarah\":\n if (sequence === 0) {\n labels.push(USER_LABELS.important);\n }\n break;\n case \"aws\":\n if (sequence < 2) {\n labels.push(USER_LABELS.awsAlerts);\n }\n break;\n case \"npm\":\n labels.push(USER_LABELS.important);\n break;\n }\n\n return Array.from(new Set(labels));\n}\n\nfunction buildRawMessage(record: EmailMessage, bodyText: string): RawGmailMessage {\n return {\n id: record.id,\n threadId: record.threadId,\n snippet: record.snippet,\n internalDate: String(record.date),\n labelIds: record.labelIds,\n sizeEstimate: record.sizeEstimate,\n payload: {\n mimeType: \"multipart/alternative\",\n headers: [\n { name: \"From\", value: `${record.fromName} <${record.fromAddress}>` },\n { name: \"To\", value: record.toAddresses.join(\", \") },\n { name: \"Subject\", value: record.subject },\n { name: \"Date\", value: new Date(record.date).toUTCString() },\n ...(record.listUnsubscribe\n ? [{ name: \"List-Unsubscribe\", value: record.listUnsubscribe }]\n : []),\n ],\n parts: [\n {\n mimeType: \"text/plain\",\n filename: \"\",\n body: {\n data: encodeBase64Url(bodyText),\n },\n },\n ],\n },\n };\n}\n\nfunction buildMessage(\n sender: SenderSpec,\n sequence: number,\n date: number,\n): DemoMessageRecord {\n const subject = getSubject(sender.key, sequence);\n const bodyText = buildBody(sender, subject, sequence);\n const unread = sequence < sender.unread;\n const labelIds = getBaseLabelIds(sender.key, unread, sequence);\n const message: EmailMessage = {\n id: `demo-${sender.key}-${String(sequence + 1).padStart(2, \"0\")}`,\n threadId: `thread-${sender.key}-${Math.floor(sequence / 2) + 1}`,\n fromAddress: sender.email,\n fromName: sender.name,\n toAddresses: [DEMO_ACCOUNT_EMAIL],\n subject,\n snippet: bodyText.split(\"\\n\").slice(0, 3).join(\" \").slice(0, 160),\n date,\n isRead: !unread,\n isStarred:\n (sender.key === \"alice\" && sequence === 0) ||\n (sender.key === \"stripe\" && sequence === 0) ||\n (sender.key === \"github\" && sequence === 0),\n labelIds,\n sizeEstimate: 1024 + sequence * 17,\n hasAttachments: sender.key === \"stripe\" || sender.key === \"aws\",\n listUnsubscribe: sender.hasListUnsubscribe\n ? `<mailto:unsubscribe@${sender.email.split(\"@\")[1]}>`\n : null,\n };\n\n return {\n senderKey: sender.key,\n message,\n rawMessage: buildRawMessage(message, bodyText),\n bodyText,\n };\n}\n\nfunction makeRuleRecords(now: number): DemoRuleRecord[] {\n return [\n {\n id: \"rule-label-receipts\",\n name: \"label-receipts\",\n description: \"Label emails that look like receipts\",\n enabled: true,\n yamlHash: \"demo-hash-label-receipts\",\n conditions: {\n operator: \"OR\",\n matchers: [\n {\n field: \"from\",\n values: [\"receipts@stripe.com\", \"service@paypal.com\", \"no-reply@shopify.com\"],\n },\n {\n field: \"subject\",\n contains: [\"receipt\", \"invoice\", \"order confirmation\"],\n },\n ],\n },\n actions: [{ type: \"label\", label: \"Receipts\" }],\n priority: 30,\n deployedAt: now - 6 * 24 * 60 * 60 * 1000,\n createdAt: now - 6 * 24 * 60 * 60 * 1000,\n },\n {\n id: \"rule-archive-newsletters\",\n name: \"archive-newsletters\",\n description: \"Archive low-engagement newsletters\",\n enabled: true,\n yamlHash: \"demo-hash-archive-newsletters\",\n conditions: {\n operator: \"AND\",\n matchers: [\n {\n field: \"from\",\n values: [\"digest@newsletterweekly.com\", \"hn@newsletters.hackernews.com\"],\n },\n ],\n },\n actions: [{ type: \"archive\" }, { type: \"mark_read\" }],\n priority: 50,\n deployedAt: now - 5 * 24 * 60 * 60 * 1000,\n createdAt: now - 5 * 24 * 60 * 60 * 1000,\n },\n {\n id: \"rule-flag-aws-alerts\",\n name: \"flag-aws-alerts\",\n description: \"Label AWS billing and maintenance alerts\",\n enabled: false,\n yamlHash: \"demo-hash-flag-aws-alerts\",\n conditions: {\n operator: \"OR\",\n matchers: [\n {\n field: \"from\",\n values: [\"no-reply@amazonaws.com\"],\n },\n {\n field: \"subject\",\n contains: [\"billing\", \"maintenance\"],\n },\n ],\n },\n actions: [{ type: \"label\", label: \"AWS-Alerts\" }],\n priority: 40,\n deployedAt: now - 4 * 24 * 60 * 60 * 1000,\n createdAt: now - 4 * 24 * 60 * 60 * 1000,\n },\n ];\n}\n\nfunction pickIds(messages: DemoMessageRecord[], senderKey: SenderKey, count: number): string[] {\n return messages\n .filter((entry) => entry.senderKey === senderKey)\n .slice(0, count)\n .map((entry) => entry.message.id);\n}\n\nfunction makeExecutionRecords(\n now: number,\n messages: DemoMessageRecord[],\n): Pick<DemoDataset, \"executionRuns\" | \"executionItems\"> {\n const receiptIds = [\n ...pickIds(messages, \"stripe\", 2),\n ...pickIds(messages, \"paypal\", 1),\n ...pickIds(messages, \"shopify\", 1),\n ];\n const newsletterIds = [\n ...pickIds(messages, \"newsletter\", 2),\n ...pickIds(messages, \"hn\", 2),\n ];\n const manualIds = [\n ...pickIds(messages, \"alice\", 1),\n ...pickIds(messages, \"bob\", 1),\n ...pickIds(messages, \"github\", 1),\n ];\n\n const executionRuns: DemoExecutionRunRecord[] = [\n {\n id: \"run-receipts-apply\",\n sourceType: \"rule\",\n ruleId: \"rule-label-receipts\",\n dryRun: false,\n requestedActions: [{ type: \"label\", label: \"Receipts\" }],\n query: null,\n status: \"applied\",\n createdAt: now - 3 * 24 * 60 * 60 * 1000,\n undoneAt: null,\n },\n {\n id: \"run-receipts-plan\",\n sourceType: \"rule\",\n ruleId: \"rule-label-receipts\",\n dryRun: true,\n requestedActions: [{ type: \"label\", label: \"Receipts\" }],\n query: null,\n status: \"planned\",\n createdAt: now - 3 * 24 * 60 * 60 * 1000 + 20 * 60 * 1000,\n undoneAt: null,\n },\n {\n id: \"run-newsletters-apply\",\n sourceType: \"rule\",\n ruleId: \"rule-archive-newsletters\",\n dryRun: false,\n requestedActions: [{ type: \"archive\" }, { type: \"mark_read\" }],\n query: null,\n status: \"applied\",\n createdAt: now - 24 * 60 * 60 * 1000,\n undoneAt: null,\n },\n {\n id: \"run-manual-read\",\n sourceType: \"manual\",\n ruleId: null,\n dryRun: false,\n requestedActions: [{ type: \"mark_read\" }],\n query: \"label:UNREAD older_than:2d\",\n status: \"applied\",\n createdAt: now - 6 * 60 * 60 * 1000,\n undoneAt: null,\n },\n {\n id: \"run-newsletters-plan\",\n sourceType: \"rule\",\n ruleId: \"rule-archive-newsletters\",\n dryRun: true,\n requestedActions: [{ type: \"archive\" }, { type: \"mark_read\" }],\n query: null,\n status: \"planned\",\n createdAt: now - 2 * 60 * 60 * 1000,\n undoneAt: null,\n },\n ];\n\n const executionItems: DemoExecutionItemRecord[] = [\n ...receiptIds.map((emailId, index) => ({\n id: `item-receipts-apply-${index + 1}`,\n runId: \"run-receipts-apply\",\n emailId,\n status: \"applied\" as const,\n appliedActions: [{ type: \"label\", label: \"Receipts\" }],\n beforeLabelIds: [\"INBOX\"],\n afterLabelIds: [\"INBOX\", USER_LABELS.receipts],\n errorMessage: null,\n executedAt: now - 3 * 24 * 60 * 60 * 1000 + index * 60 * 1000,\n undoneAt: null,\n })),\n ...receiptIds.map((emailId, index) => ({\n id: `item-receipts-plan-${index + 1}`,\n runId: \"run-receipts-plan\",\n emailId,\n status: \"planned\" as const,\n appliedActions: [{ type: \"label\", label: \"Receipts\" }],\n beforeLabelIds: [\"INBOX\"],\n afterLabelIds: [\"INBOX\", USER_LABELS.receipts],\n errorMessage: null,\n executedAt: now - 3 * 24 * 60 * 60 * 1000 + 20 * 60 * 1000 + index * 60 * 1000,\n undoneAt: null,\n })),\n ...newsletterIds.map((emailId, index) => ({\n id: `item-newsletters-apply-${index + 1}`,\n runId: \"run-newsletters-apply\",\n emailId,\n status: \"applied\" as const,\n appliedActions: [{ type: \"archive\" }, { type: \"mark_read\" }],\n beforeLabelIds: [\"INBOX\", \"UNREAD\"],\n afterLabelIds: [],\n errorMessage: null,\n executedAt: now - 24 * 60 * 60 * 1000 + index * 60 * 1000,\n undoneAt: null,\n })),\n ...manualIds.map((emailId, index) => ({\n id: `item-manual-read-${index + 1}`,\n runId: \"run-manual-read\",\n emailId,\n status: \"applied\" as const,\n appliedActions: [{ type: \"mark_read\" }],\n beforeLabelIds: [\"INBOX\", \"UNREAD\"],\n afterLabelIds: [\"INBOX\"],\n errorMessage: null,\n executedAt: now - 6 * 60 * 60 * 1000 + index * 60 * 1000,\n undoneAt: null,\n })),\n ...newsletterIds.map((emailId, index) => ({\n id: `item-newsletters-plan-${index + 1}`,\n runId: \"run-newsletters-plan\",\n emailId,\n status: \"planned\" as const,\n appliedActions: [{ type: \"archive\" }, { type: \"mark_read\" }],\n beforeLabelIds: [\"INBOX\", \"UNREAD\"],\n afterLabelIds: [],\n errorMessage: null,\n executedAt: now - 2 * 60 * 60 * 1000 + index * 60 * 1000,\n undoneAt: null,\n })),\n ];\n\n return { executionRuns, executionItems };\n}\n\nfunction makeNewsletterRecords(messages: DemoMessageRecord[]): DemoNewsletterRecord[] {\n const senders = [\n {\n email: \"digest@newsletterweekly.com\",\n name: \"Newsletter Weekly\",\n reason: \"list-unsubscribe,high-unread\",\n },\n {\n email: \"hn@newsletters.hackernews.com\",\n name: \"Hacker News Digest\",\n reason: \"list-unsubscribe,high-unread\",\n },\n {\n email: \"no-reply@amazonaws.com\",\n name: \"AWS Notifications\",\n reason: \"noreply-pattern,high-unread\",\n },\n {\n email: \"noreply@docker.com\",\n name: \"Docker Hub\",\n reason: \"noreply-pattern\",\n },\n {\n email: \"notifications@github.com\",\n name: \"GitHub\",\n reason: \"high-volume\",\n },\n {\n email: \"notification@slack.com\",\n name: \"Slack\",\n reason: \"noreply-pattern\",\n },\n ];\n\n return senders.map((sender, index) => {\n const matching = messages.filter((entry) => entry.message.fromAddress === sender.email);\n\n return {\n id: `newsletter-${index + 1}`,\n email: sender.email,\n name: sender.name,\n messageCount: matching.length,\n unreadCount: matching.filter((entry) => !entry.message.isRead).length,\n status: \"active\",\n unsubscribeLink: matching[0]?.message.listUnsubscribe || null,\n detectionReason: sender.reason,\n firstSeen: matching[matching.length - 1]?.message.date || Date.now(),\n lastSeen: matching[0]?.message.date || Date.now(),\n };\n });\n}\n\nexport function buildDemoDataset(referenceNow: number = Date.now()): DemoDataset {\n const timestamps = buildTimestamps(referenceNow, 150);\n const remaining = new Map<SenderKey, number>(\n SENDERS.map((sender) => [sender.key, sender.count]),\n );\n const sequenceBySender = new Map<SenderKey, number>();\n const senderByKey = new Map(SENDERS.map((sender) => [sender.key, sender]));\n const rng = createRng(42);\n const messages: DemoMessageRecord[] = [];\n\n for (let index = 0; index < timestamps.length; index += 1) {\n const senderKey = chooseSender(index, remaining, rng);\n const sender = senderByKey.get(senderKey);\n\n if (!sender) {\n throw new Error(`Missing demo sender spec for ${senderKey}`);\n }\n\n const sequence = sequenceBySender.get(senderKey) || 0;\n messages.push(buildMessage(sender, sequence, timestamps[index] || referenceNow));\n sequenceBySender.set(senderKey, sequence + 1);\n }\n\n messages.sort((left, right) => right.message.date - left.message.date);\n\n const rules = makeRuleRecords(referenceNow);\n const { executionRuns, executionItems } = makeExecutionRecords(referenceNow, messages);\n\n return {\n accountEmail: DEMO_ACCOUNT_EMAIL,\n historyId: \"12345678\",\n labels: DEMO_LABELS.map((label) => ({ ...label })),\n messages,\n rules,\n executionRuns,\n executionItems,\n newsletters: makeNewsletterRecords(messages),\n filters: [],\n };\n}\n\nexport function seedDemoData(\n sqlite: Database.Database,\n referenceNow: number = Date.now(),\n): DemoDataset {\n const dataset = buildDemoDataset(referenceNow);\n\n sqlite.exec(`\n DELETE FROM execution_items;\n DELETE FROM execution_runs;\n DELETE FROM rules;\n DELETE FROM newsletter_senders;\n DELETE FROM emails;\n `);\n\n const insertEmail = sqlite.prepare(`\n INSERT INTO emails (\n id, thread_id, from_address, from_name, to_addresses, subject, snippet, date,\n is_read, is_starred, label_ids, size_estimate, has_attachments, list_unsubscribe, synced_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n const insertRule = sqlite.prepare(`\n INSERT INTO rules (\n id, name, description, enabled, yaml_hash, conditions, actions, priority, deployed_at, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n const insertRun = sqlite.prepare(`\n INSERT INTO execution_runs (\n id, source_type, rule_id, dry_run, requested_actions, query, status, created_at, undone_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n const insertItem = sqlite.prepare(`\n INSERT INTO execution_items (\n id, run_id, email_id, status, applied_actions, before_label_ids, after_label_ids, error_message, executed_at, undone_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n const insertNewsletter = sqlite.prepare(`\n INSERT INTO newsletter_senders (\n id, email, name, message_count, unread_count, status, unsubscribe_link, detection_reason, first_seen, last_seen\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n const transaction = sqlite.transaction(() => {\n for (const entry of dataset.messages) {\n insertEmail.run(\n entry.message.id,\n entry.message.threadId,\n entry.message.fromAddress,\n entry.message.fromName,\n JSON.stringify(entry.message.toAddresses),\n entry.message.subject,\n entry.message.snippet,\n entry.message.date,\n entry.message.isRead ? 1 : 0,\n entry.message.isStarred ? 1 : 0,\n JSON.stringify(entry.message.labelIds),\n entry.message.sizeEstimate,\n entry.message.hasAttachments ? 1 : 0,\n entry.message.listUnsubscribe,\n referenceNow,\n );\n }\n\n for (const rule of dataset.rules) {\n insertRule.run(\n rule.id,\n rule.name,\n rule.description,\n rule.enabled ? 1 : 0,\n rule.yamlHash,\n JSON.stringify(rule.conditions),\n JSON.stringify(rule.actions),\n rule.priority,\n rule.deployedAt,\n rule.createdAt,\n );\n }\n\n for (const run of dataset.executionRuns) {\n insertRun.run(\n run.id,\n run.sourceType,\n run.ruleId,\n run.dryRun ? 1 : 0,\n JSON.stringify(run.requestedActions),\n run.query,\n run.status,\n run.createdAt,\n run.undoneAt,\n );\n }\n\n for (const item of dataset.executionItems) {\n insertItem.run(\n item.id,\n item.runId,\n item.emailId,\n item.status,\n JSON.stringify(item.appliedActions),\n JSON.stringify(item.beforeLabelIds),\n JSON.stringify(item.afterLabelIds),\n item.errorMessage,\n item.executedAt,\n item.undoneAt,\n );\n }\n\n for (const newsletter of dataset.newsletters) {\n insertNewsletter.run(\n newsletter.id,\n newsletter.email,\n newsletter.name,\n newsletter.messageCount,\n newsletter.unreadCount,\n newsletter.status,\n newsletter.unsubscribeLink,\n newsletter.detectionReason,\n newsletter.firstSeen,\n newsletter.lastSeen,\n );\n }\n\n sqlite\n .prepare(\n `\n UPDATE sync_state\n SET account_email = ?,\n history_id = ?,\n last_full_sync = ?,\n last_incremental_sync = ?,\n total_messages = ?,\n full_sync_cursor = NULL,\n full_sync_processed = 0,\n full_sync_total = 0\n WHERE id = 1\n `,\n )\n .run(\n dataset.accountEmail,\n dataset.historyId,\n referenceNow - 2 * 60 * 60 * 1000,\n referenceNow - 5 * 60 * 1000,\n dataset.messages.length,\n );\n });\n\n transaction();\n return dataset;\n}\n","import {\n cancel,\n confirm,\n intro,\n isCancel,\n log,\n note,\n outro,\n password,\n spinner,\n text,\n} from \"@clack/prompts\";\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport {\n DEFAULT_GOOGLE_REDIRECT_URI,\n getConfigFilePath,\n getGoogleCredentialStatus,\n loadConfig,\n} from \"../../config.js\";\nimport {\n createOAuthClient,\n getOAuthReadiness,\n GMAIL_SCOPES,\n startOAuthFlow,\n} from \"../auth/oauth.js\";\nimport { reconcileCacheForAuthenticatedAccount } from \"../sync/sync.js\";\nimport {\n checkGcloudAuthenticated,\n checkGcloudInstalled,\n enableApi,\n getGcloudActiveAccount,\n getGcloudProject,\n openBrowser,\n runGcloudAuthLogin,\n} from \"./gcloud.js\";\nimport { writeGoogleCredentials } from \"./credentials.js\";\n\nexport interface SetupOptions {\n skipGcloud?: boolean;\n project?: string;\n}\n\nexport interface SetupResult {\n completed: boolean;\n configPath: string;\n projectId: string | null;\n credentialsUpdated: boolean;\n usedGcloud: boolean;\n authenticatedEmail: string | null;\n}\n\nconst GMAIL_API = \"gmail.googleapis.com\";\nconst AUDIENCE_URL = \"https://console.cloud.google.com/auth/audience\";\nconst CREDENTIALS_URL = \"https://console.cloud.google.com/apis/credentials\";\n\nfunction withProject(url: string, projectId: string | null): string {\n return projectId ? `${url}?project=${encodeURIComponent(projectId)}` : url;\n}\n\nfunction validateProjectId(value: string | undefined): string | undefined {\n if (!value?.trim()) {\n return \"Enter a Google Cloud project ID.\";\n }\n\n return undefined;\n}\n\nfunction validateClientId(value: string | undefined): string | undefined {\n if (!value?.trim()) {\n return \"Enter a Google OAuth client ID.\";\n }\n\n if (!value.includes(\".apps.googleusercontent.com\")) {\n return \"Google client IDs usually end with .apps.googleusercontent.com.\";\n }\n\n return undefined;\n}\n\nfunction validateClientSecret(value: string | undefined): string | undefined {\n if (!value?.trim()) {\n return \"Enter a Google OAuth client secret.\";\n }\n\n return undefined;\n}\n\nfunction validateRedirectUri(value: string | undefined): string | undefined {\n if (!value?.trim()) {\n return \"Enter a redirect URI.\";\n }\n\n try {\n const parsed = new URL(value);\n if (!parsed.protocol.startsWith(\"http\")) {\n return \"Redirect URI must start with http:// or https://.\";\n }\n } catch {\n return \"Enter a valid redirect URI.\";\n }\n\n return undefined;\n}\n\nasync function promptValue<T>(promise: Promise<T | symbol>, cancelMessage: string): Promise<T | null> {\n const value = await promise;\n\n if (isCancel(value)) {\n cancel(cancelMessage);\n return null;\n }\n\n return value as T;\n}\n\nfunction printConsentScreenHelp(projectId: string | null): void {\n note(\n [\n \"In Google Cloud Console, go to Google Auth Platform > Audience.\",\n \"\",\n \"1. Set User type:\",\n \" External — required for personal Gmail (@gmail.com).\",\n \" Internal — only if your account is part of a Google Workspace org.\",\n \" Personal Gmail accounts cannot use Internal.\",\n \"\",\n \"2. Complete the Branding section (app name, support email, etc.)\",\n \"\",\n '3. Publishing status should be \"Testing\" (this is the default).',\n \"\",\n \"4. IMPORTANT: Scroll down to Test Users and click + Add Users.\",\n \" Add your Gmail address here. Without this you will get\",\n ' \"Error 403: access_denied\" when signing in.',\n \"\",\n `Console: ${withProject(AUDIENCE_URL, projectId)}`,\n ].join(\"\\n\"),\n \"OAuth Consent Screen (Audience)\",\n );\n}\n\nfunction printCredentialHelp(projectId: string | null, redirectUri: string): void {\n note(\n [\n \"Create an OAuth 2.0 client with these settings:\",\n \"\",\n '1. Application type: \"Web application\"',\n '2. Name: \"inboxctl\"',\n `3. Authorized redirect URI: ${redirectUri}`,\n \"4. Click Create and copy the Client ID and Client Secret\",\n \"\",\n `Console: ${withProject(CREDENTIALS_URL, projectId)}`,\n ].join(\"\\n\"),\n \"OAuth Credentials\",\n );\n}\n\nfunction findEnvFile(): string | null {\n const candidates = [\n resolve(process.cwd(), \".env\"),\n resolve(process.cwd(), \".env.local\"),\n ];\n return candidates.find((p) => existsSync(p)) || null;\n}\n\nfunction updateEnvFile(\n envPath: string,\n credentials: { clientId: string; clientSecret: string; redirectUri: string },\n): void {\n let content = readFileSync(envPath, \"utf8\");\n\n const replacements: [string, string][] = [\n [\"GOOGLE_CLIENT_ID\", credentials.clientId],\n [\"GOOGLE_CLIENT_SECRET\", credentials.clientSecret],\n [\"GOOGLE_REDIRECT_URI\", credentials.redirectUri],\n ];\n\n for (const [key, value] of replacements) {\n const regex = new RegExp(`^${key}=.*$`, \"m\");\n if (regex.test(content)) {\n content = content.replace(regex, `${key}=${value}`);\n }\n }\n\n writeFileSync(envPath, content, \"utf8\");\n}\n\nasync function handleEnvironmentOverrides(\n credentials: { clientId: string; clientSecret: string; redirectUri: string } | null,\n): Promise<void> {\n const overrides = [\"GOOGLE_CLIENT_ID\", \"GOOGLE_CLIENT_SECRET\", \"GOOGLE_REDIRECT_URI\"]\n .filter((key) => Boolean(process.env[key]));\n\n if (overrides.length === 0) {\n return;\n }\n\n const envPath = findEnvFile();\n\n if (envPath && credentials) {\n log.warn(\n `Your .env file (${envPath}) has credentials that override config.json.`,\n );\n\n const shouldUpdate = await promptValue(\n confirm({\n message: \"Update .env with the new credentials too?\",\n initialValue: true,\n }),\n \"Setup cancelled.\",\n );\n\n if (shouldUpdate) {\n updateEnvFile(envPath, credentials);\n // Reload process.env so the verify step uses the right values\n process.env.GOOGLE_CLIENT_ID = credentials.clientId;\n process.env.GOOGLE_CLIENT_SECRET = credentials.clientSecret;\n process.env.GOOGLE_REDIRECT_URI = credentials.redirectUri;\n log.success(`.env updated at ${envPath}`);\n } else {\n note(\n `Your .env values still override config.json for: ${overrides.join(\", \")}.\\n` +\n \"If auth fails, update or remove those overrides in your .env file.\",\n \"Environment Overrides\",\n );\n }\n } else {\n note(\n `Environment variables override config.json for: ${overrides.join(\", \")}.\\n` +\n \"If the wizard's saved credentials do not take effect, update or remove those overrides first.\",\n \"Environment Overrides\",\n );\n }\n}\n\nfunction verifyOAuthSetup(): void {\n const config = loadConfig();\n const readiness = getOAuthReadiness(config);\n\n if (!readiness.ready) {\n throw new Error(`OAuth credentials are still incomplete: ${readiness.missing.join(\", \")}`);\n }\n\n const client = createOAuthClient(config);\n client.generateAuthUrl({\n access_type: \"offline\",\n scope: GMAIL_SCOPES,\n });\n}\n\nexport async function runSetupWizard(options: SetupOptions = {}): Promise<SetupResult> {\n intro(\"inboxctl Setup Wizard\");\n\n const initialConfig = loadConfig();\n const configPath = getConfigFilePath(initialConfig.dataDir);\n const existingGoogleStatus = getGoogleCredentialStatus(initialConfig);\n\n let useGcloud = !options.skipGcloud;\n let projectId = options.project || null;\n let credentialsUpdated = false;\n let gmailApiEnabled = false;\n let authenticatedEmail: string | null = null;\n\n if (useGcloud) {\n const gcloudSpinner = spinner();\n gcloudSpinner.start(\"Checking gcloud CLI...\");\n\n if (!checkGcloudInstalled()) {\n gcloudSpinner.error(\"gcloud CLI not found.\");\n note(\n \"Install the Google Cloud CLI to let inboxctl enable the Gmail API for you.\\n\" +\n \"You can still continue with the manual credential flow if you prefer.\",\n \"gcloud CLI\",\n );\n\n const continueManual = await promptValue(\n confirm({\n message: \"Continue with manual setup only?\",\n initialValue: true,\n }),\n \"Setup cancelled.\",\n );\n\n if (!continueManual) {\n cancel(\"Setup cancelled.\");\n return {\n completed: false,\n configPath,\n projectId,\n credentialsUpdated,\n usedGcloud: false,\n authenticatedEmail,\n };\n }\n\n useGcloud = false;\n } else {\n const account = getGcloudActiveAccount();\n gcloudSpinner.stop(account ? `gcloud CLI found (${account})` : \"gcloud CLI found\");\n }\n }\n\n if (useGcloud && !checkGcloudAuthenticated()) {\n log.warn(\"gcloud is installed but not authenticated.\");\n\n const shouldLogin = await promptValue(\n confirm({\n message: \"Run `gcloud auth login` now?\",\n initialValue: true,\n }),\n \"Setup cancelled.\",\n );\n\n if (!shouldLogin) {\n const continueManual = await promptValue(\n confirm({\n message: \"Continue without gcloud and finish setup manually?\",\n initialValue: true,\n }),\n \"Setup cancelled.\",\n );\n\n if (!continueManual) {\n cancel(\"Setup cancelled.\");\n return {\n completed: false,\n configPath,\n projectId,\n credentialsUpdated,\n usedGcloud: false,\n authenticatedEmail,\n };\n }\n\n useGcloud = false;\n } else {\n const loginResult = runGcloudAuthLogin();\n\n if (!loginResult.success || !checkGcloudAuthenticated()) {\n throw new Error(loginResult.error || \"gcloud authentication did not complete successfully.\");\n }\n\n const account = getGcloudActiveAccount();\n log.success(account ? `Authenticated as ${account}` : \"gcloud authentication complete.\");\n }\n }\n\n if (useGcloud) {\n projectId = projectId || getGcloudProject();\n\n if (!projectId) {\n projectId = await promptValue(\n text({\n message: \"Google Cloud project ID\",\n placeholder: \"my-project-123\",\n validate: validateProjectId,\n }),\n \"Setup cancelled.\",\n );\n } else {\n log.step(`Using project: ${projectId}`);\n }\n\n if (!projectId) {\n cancel(\"Setup cancelled.\");\n return {\n completed: false,\n configPath,\n projectId: null,\n credentialsUpdated,\n usedGcloud: true,\n authenticatedEmail,\n };\n }\n\n const enableSpinner = spinner();\n enableSpinner.start(\"Enabling Gmail API...\");\n\n const enabled = enableApi(projectId, GMAIL_API);\n\n if (!enabled.success) {\n enableSpinner.error(`Failed to enable Gmail API: ${enabled.error}`);\n const continueManual = await promptValue(\n confirm({\n message: \"Continue anyway and finish the remaining setup steps manually?\",\n initialValue: false,\n }),\n \"Setup cancelled.\",\n );\n\n if (!continueManual) {\n cancel(\"Setup cancelled.\");\n return {\n completed: false,\n configPath,\n projectId,\n credentialsUpdated,\n usedGcloud: true,\n authenticatedEmail,\n };\n }\n } else {\n enableSpinner.stop(\"Gmail API enabled.\");\n gmailApiEnabled = true;\n }\n }\n\n const consentAlreadyConfigured = existingGoogleStatus.configured\n ? await promptValue(\n confirm({\n message: \"Is the OAuth consent screen already configured for this project?\",\n initialValue: false,\n }),\n \"Setup cancelled.\",\n )\n : false;\n\n if (consentAlreadyConfigured === null) {\n return {\n completed: false,\n configPath,\n projectId,\n credentialsUpdated,\n usedGcloud: useGcloud,\n authenticatedEmail,\n };\n }\n\n if (!consentAlreadyConfigured) {\n printConsentScreenHelp(projectId);\n log.step(`Opening ${withProject(AUDIENCE_URL, projectId)}`);\n openBrowser(withProject(AUDIENCE_URL, projectId));\n\n const completedConsent = await promptValue(\n confirm({\n message: \"Have you completed the consent screen setup?\",\n initialValue: false,\n }),\n \"Setup cancelled.\",\n );\n\n if (!completedConsent) {\n cancel(\"Finish the consent screen setup, then rerun `inboxctl setup`.\");\n return {\n completed: false,\n configPath,\n projectId,\n credentialsUpdated,\n usedGcloud: useGcloud,\n authenticatedEmail,\n };\n }\n\n note(\n 'When you sign in, you may see \"This app isn\\'t verified\".\\n' +\n \"This is normal for personal/testing apps. Click \\\"Advanced\\\", then\\n\" +\n '\"Go to inboxctl (unsafe)\" to continue.',\n \"Unverified App Warning\",\n );\n } else {\n note(\n \"Quick check — verify these in Google Auth Platform > Audience:\\n\\n\" +\n \"- User type is External (required for personal Gmail)\\n\" +\n \"- Your Gmail address is listed under Test Users\\n\" +\n ' (without this you will get \"Error 403: access_denied\")\\n\\n' +\n `Verify at: ${withProject(AUDIENCE_URL, projectId)}`,\n \"Consent Screen Checklist\",\n );\n\n note(\n 'When you sign in, you may see \"This app isn\\'t verified\".\\n' +\n \"This is normal for personal/testing apps. Click \\\"Advanced\\\", then\\n\" +\n '\"Go to inboxctl (unsafe)\" to continue.',\n \"Unverified App Warning\",\n );\n }\n\n const shouldReplaceCredentials = existingGoogleStatus.configured\n ? await promptValue(\n confirm({\n message: \"Google OAuth credentials already exist. Replace them?\",\n initialValue: false,\n }),\n \"Setup cancelled.\",\n )\n : true;\n\n if (shouldReplaceCredentials === null) {\n return {\n completed: false,\n configPath,\n projectId,\n credentialsUpdated,\n usedGcloud: useGcloud,\n authenticatedEmail,\n };\n }\n\n const redirectUri = initialConfig.google.redirectUri || DEFAULT_GOOGLE_REDIRECT_URI;\n\n if (shouldReplaceCredentials) {\n printCredentialHelp(projectId, redirectUri);\n log.step(`Opening ${withProject(CREDENTIALS_URL, projectId)}`);\n openBrowser(withProject(CREDENTIALS_URL, projectId));\n\n const clientId = await promptValue(\n text({\n message: \"Paste your Google Client ID\",\n placeholder: \"123456789.apps.googleusercontent.com\",\n validate: validateClientId,\n }),\n \"Setup cancelled.\",\n );\n\n if (!clientId) {\n return {\n completed: false,\n configPath,\n projectId,\n credentialsUpdated,\n usedGcloud: useGcloud,\n authenticatedEmail,\n };\n }\n\n const clientSecret = await promptValue(\n password({\n message: \"Paste your Google Client Secret\",\n validate: validateClientSecret,\n }),\n \"Setup cancelled.\",\n );\n\n if (!clientSecret) {\n return {\n completed: false,\n configPath,\n projectId,\n credentialsUpdated,\n usedGcloud: useGcloud,\n authenticatedEmail,\n };\n }\n\n const selectedRedirectUri = await promptValue(\n text({\n message: \"Redirect URI\",\n initialValue: redirectUri,\n validate: validateRedirectUri,\n }),\n \"Setup cancelled.\",\n );\n\n if (!selectedRedirectUri) {\n return {\n completed: false,\n configPath,\n projectId,\n credentialsUpdated,\n usedGcloud: useGcloud,\n authenticatedEmail,\n };\n }\n\n const saveSpinner = spinner();\n saveSpinner.start(`Saving credentials to ${configPath}...`);\n writeGoogleCredentials({\n clientId,\n clientSecret,\n redirectUri: selectedRedirectUri,\n }, configPath);\n saveSpinner.stop(\"Credentials saved.\");\n credentialsUpdated = true;\n\n await handleEnvironmentOverrides({\n clientId,\n clientSecret,\n redirectUri: selectedRedirectUri,\n });\n } else {\n log.step(\"Keeping existing Google OAuth credentials from config.json.\");\n await handleEnvironmentOverrides(null);\n }\n\n const verifySpinner = spinner();\n verifySpinner.start(\"Verifying setup...\");\n verifyOAuthSetup();\n verifySpinner.stop(\"OAuth credentials look valid.\");\n\n const shouldAuthenticateNow = await promptValue(\n confirm({\n message: \"Authenticate a Gmail account now?\",\n initialValue: true,\n }),\n \"Setup cancelled.\",\n );\n\n if (shouldAuthenticateNow === null) {\n return {\n completed: false,\n configPath,\n projectId,\n credentialsUpdated,\n usedGcloud: useGcloud,\n authenticatedEmail,\n };\n }\n\n if (shouldAuthenticateNow) {\n log.step(\"Starting Gmail sign-in in your browser...\");\n\n try {\n const activeConfig = loadConfig();\n const authResult = await startOAuthFlow(activeConfig);\n authenticatedEmail = authResult.email;\n const reconciliation = reconcileCacheForAuthenticatedAccount(\n activeConfig.dbPath,\n authenticatedEmail,\n { clearLegacyUnscoped: true },\n );\n log.success(\n authenticatedEmail && authenticatedEmail !== \"unknown\"\n ? `Authenticated Gmail account: ${authenticatedEmail}`\n : \"Gmail authentication complete.\",\n );\n if (reconciliation.cleared) {\n log.step(\"Local cache reset to avoid mixing data from another Gmail account.\");\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes(\"access_denied\") || message.includes(\"access denied\")) {\n log.error(\"Google blocked the sign-in request.\");\n note(\n \"This usually means one of:\\n\" +\n \"- Your Gmail address is not added as a test user (for External apps)\\n\" +\n \"- You chose Internal but are using a personal Gmail account\\n\\n\" +\n \"Fix it in Google Auth Platform > Audience, then retry with: inboxctl auth login\",\n \"Access Denied\",\n );\n } else {\n throw error;\n }\n }\n }\n\n note(\n [\n gmailApiEnabled && projectId\n ? `✓ Gmail API enabled for project ${projectId}`\n : \"✓ Gmail API step reviewed\",\n \"✓ OAuth consent screen reviewed\",\n existingGoogleStatus.configured && !credentialsUpdated\n ? \"✓ Existing OAuth credentials kept\"\n : `✓ OAuth credentials saved to ${configPath}`,\n authenticatedEmail\n ? `✓ Gmail authenticated as ${authenticatedEmail}`\n : \"✓ Gmail authentication ready\",\n \"\",\n authenticatedEmail\n ? \"You can start using inboxctl now.\"\n : \"Next: run `inboxctl auth login` to authenticate your Gmail account.\",\n ].join(\"\\n\"),\n \"Setup Complete\",\n );\n\n outro(\"Setup complete.\");\n\n return {\n completed: true,\n configPath,\n projectId,\n credentialsUpdated,\n usedGcloud: useGcloud,\n authenticatedEmail,\n };\n}\n","import { spawnSync } from \"node:child_process\";\nimport open from \"open\";\n\ninterface GcloudCommandResult {\n success: boolean;\n stdout: string;\n stderr: string;\n error?: string;\n}\n\nfunction runGcloud(args: string[], inheritStdio: boolean = false): GcloudCommandResult {\n const result = spawnSync(\"gcloud\", args, {\n encoding: \"utf8\",\n stdio: inheritStdio ? \"inherit\" : \"pipe\",\n });\n\n if (result.error) {\n return {\n success: false,\n stdout: \"\",\n stderr: \"\",\n error: result.error.message,\n };\n }\n\n return {\n success: result.status === 0,\n stdout: typeof result.stdout === \"string\" ? result.stdout : \"\",\n stderr: typeof result.stderr === \"string\" ? result.stderr : \"\",\n };\n}\n\nfunction normalizeValue(value: string): string | null {\n const trimmed = value.trim();\n\n if (!trimmed || trimmed === \"(unset)\") {\n return null;\n }\n\n return trimmed;\n}\n\nexport function checkGcloudInstalled(): boolean {\n return runGcloud([\"--version\"]).success;\n}\n\nexport function getGcloudActiveAccount(): string | null {\n const result = runGcloud([\n \"auth\",\n \"list\",\n \"--filter=status:ACTIVE\",\n \"--format=value(account)\",\n ]);\n\n if (!result.success) {\n return null;\n }\n\n return normalizeValue(result.stdout);\n}\n\nexport function checkGcloudAuthenticated(): boolean {\n return getGcloudActiveAccount() !== null;\n}\n\nexport function runGcloudAuthLogin(): { success: boolean; error?: string } {\n const result = runGcloud([\"auth\", \"login\"], true);\n return result.success ? { success: true } : { success: false, error: result.error || result.stderr || \"gcloud auth login failed.\" };\n}\n\nexport function getGcloudProject(): string | null {\n const result = runGcloud([\"config\", \"get-value\", \"project\", \"--quiet\"]);\n\n if (!result.success) {\n return null;\n }\n\n return normalizeValue(result.stdout);\n}\n\nexport function enableApi(projectId: string, api: string): { success: boolean; error?: string } {\n const result = runGcloud([\"services\", \"enable\", api, \"--project\", projectId]);\n\n if (result.success) {\n return { success: true };\n }\n\n return {\n success: false,\n error: normalizeValue(result.stderr) || normalizeValue(result.stdout) || result.error || `Failed to enable ${api}.`,\n };\n}\n\nexport function openBrowser(url: string): void {\n void open(url, {\n wait: false,\n newInstance: false,\n }).catch(() => {\n // The wizard also prints the URL, so failure to auto-open is non-fatal.\n });\n}\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { getConfigFilePath, getDefaultDataDir, ensureDir, DEFAULT_GOOGLE_REDIRECT_URI } from \"../../config.js\";\n\nexport interface SetupCredentials {\n clientId: string;\n clientSecret: string;\n redirectUri?: string;\n}\n\ntype StoredConfig = {\n google?: {\n clientId?: string;\n clientSecret?: string;\n redirectUri?: string;\n };\n [key: string]: unknown;\n};\n\nfunction readStoredConfig(configPath: string): StoredConfig {\n if (!existsSync(configPath)) {\n return {};\n }\n\n const raw = readFileSync(configPath, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(`Invalid config file at ${configPath}: expected JSON object`);\n }\n\n return parsed as StoredConfig;\n}\n\nexport function writeGoogleCredentials(\n credentials: SetupCredentials,\n configPath: string = getConfigFilePath(getDefaultDataDir()),\n): void {\n const current = readStoredConfig(configPath);\n\n ensureDir(dirname(configPath));\n const next: StoredConfig = {\n ...current,\n google: {\n ...(current.google || {}),\n clientId: credentials.clientId,\n clientSecret: credentials.clientSecret,\n redirectUri: credentials.redirectUri || current.google?.redirectUri || DEFAULT_GOOGLE_REDIRECT_URI,\n },\n };\n\n writeFileSync(configPath, `${JSON.stringify(next, null, 2)}\\n`, \"utf8\");\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,eAAe;AACxB,SAAS,uBAAuB;AAChC,SAAS,SAAS,OAAO,UAAU,cAAc;;;ACFjD,SAAS,OAAO,SAAS,UAAU,IAAI,iBAAiB;AACxD,SAAS,cAAc;AACvB,SAAS,SAAS,YAAY;AAC9B,SAAS,qBAAqB;;;ACH9B,SAAS,eAAe;AACxB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,OAAO,aAAa;AACpB,OAAO,eAAe;AACtB,SAAgB,WAAW,gBAAgB;AAsUrC,SA8FE,UA7FA,KADF;AApPN,IAAM,YAAY;AAClB,IAAM,eAAe;AACrB,IAAM,qBAAqB;AAE3B,SAAS,UAAU,OAAuB;AACxC,SAAO,MAAM,QAAQ,qBAAqB,EAAE;AAC9C;AAEA,SAAS,IAAI,OAAe,OAAuB;AACjD,QAAM,UAAU,UAAU,KAAK;AAE/B,MAAI,QAAQ,UAAU,OAAO;AAC3B,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,KAAK,GAAG,IAAI,OAAO,QAAQ,QAAQ,MAAM,CAAC;AACtD;AAEA,SAAS,SAAS,OAAe,OAAuB;AACtD,MAAI,SAAS,GAAG;AACd,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,UAAU,OAAO;AACzB,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,GAAG;AACf,WAAO,MAAM,MAAM,GAAG,CAAC;AAAA,EACzB;AAEA,SAAO,GAAG,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC;AACrC;AAEA,SAAS,kBAAkB,OAAuB;AAChD,SAAO,MAAM,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACzC;AAEA,SAAS,mBAAmB,OAAe,OAAwB;AACjE,MAAI,OAAO,MAAM,QAAQ,cAAc,GAAG;AAE1C,MAAI,kBAAkB,KAAK,IAAI,GAAG;AAChC,WAAO,QAAQ,MAAM;AAAA,MACnB,UAAU;AAAA,MACV,WAAW,CAAC,EAAE,UAAU,KAAK,SAAS,EAAE,YAAY,KAAK,EAAE,CAAC;AAAA,IAC9D,CAAC;AAAA,EACH;AAEA,SAAO,kBAAkB,IAAI;AAC7B,SAAO,QAAQ,SAAS,MAAM,KAAK,IAAI;AACzC;AAEA,SAAS,gBAAgB,OAAuB;AAC9C,SAAO,mBAAmB,OAAO,GAAG;AACtC;AAEA,SAAS,mBAAmB,OAAiD;AAC3E,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,iBAAiB,OAAO,MAAM,QAAQ,IAAI;AAC5D,QAAM,OAAO,KAAK,IAAI,IAAI;AAE1B,MAAI,OAAO,KAAQ;AACjB,WAAO,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,GAAK,CAAC,CAAC;AAAA,EACjD;AAEA,MAAI,OAAO,MAAW;AACpB,WAAO,GAAG,KAAK,MAAM,OAAO,GAAM,CAAC;AAAA,EACrC;AAEA,MAAI,OAAO,OAAY;AACrB,WAAO,GAAG,KAAK,MAAM,OAAO,IAAS,CAAC;AAAA,EACxC;AAEA,MAAI,OAAO,QAAa;AACtB,WAAO,GAAG,KAAK,MAAM,OAAO,KAAU,CAAC;AAAA,EACzC;AAEA,SAAO,IAAI,KAAK,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AACtD;AAEA,SAAS,cAAc,OAAuB;AAC5C,SAAO,GAAG,OAAO,UAAU,KAAK,IAAI,QAAQ,OAAO,MAAM,QAAQ,CAAC,CAAC,CAAC;AACtE;AAEA,SAAS,YAAY,OAA0C;AAC7D,MAAI,SAAS,MAAM;AACjB,WAAO;AAAA,EACT;AAEA,SAAO,IAAI,KAAK,aAAa,OAAO,EAAE,OAAO,KAAK;AACpD;AAEA,SAAS,uBAAuB,SAAyB;AACvD,MAAI,UAAU,IAAI;AAChB,WAAO,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,CAAC,CAAC;AAAA,EAC5C;AAEA,MAAI,UAAU,MAAO;AACnB,UAAMA,WAAU,KAAK,MAAM,UAAU,EAAE;AACvC,UAAM,mBAAmB,KAAK,MAAM,UAAU,EAAE;AAChD,WAAO,qBAAqB,IAAI,GAAGA,QAAO,MAAM,GAAGA,QAAO,KAAK,gBAAgB;AAAA,EACjF;AAEA,QAAM,QAAQ,KAAK,MAAM,UAAU,IAAK;AACxC,QAAM,UAAU,KAAK,MAAO,UAAU,OAAS,EAAE;AACjD,SAAO,YAAY,IAAI,GAAG,KAAK,MAAM,GAAG,KAAK,KAAK,OAAO;AAC3D;AAEA,SAAS,sBAAsB,OAA8B;AAC3D,MAAI,CAAC,SAAS,SAAS,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,IAAI,KAAO,KAAK,IAAI,KAAK,KAAK,MAAM,QAAQ,IAAI,CAAC,CAAC;AAChE;AAEA,SAAS,WAAW,OAAe,QAAwB;AACzD,MAAI,UAAU,GAAG;AACf,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,SAAS,CAAC,CAAC;AAChD;AAEA,SAAS,gBAAwB;AAC/B,SAAO,QAAQ,OAAO,WAAW;AACnC;AAEA,SAAS,iBAAyB;AAChC,SAAO,QAAQ,OAAO,QAAQ;AAChC;AAEA,SAAS,UAAU,MAA2C;AAC5D,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEA,SAAS,YAAY,QAA6B;AAChD,MAAI,OAAO,WAAW,KAAK,GAAG;AAC5B,WAAO,OAAO,UAAU,KAAK;AAAA,EAC/B;AAEA,MAAI,OAAO,UAAU,KAAK,GAAG;AAC3B,WAAO,QAAQ,OAAO,UAAU;AAAA,MAC9B,UAAU,KAAK,IAAI,cAAc,IAAI,IAAI,EAAE;AAAA,IAC7C,CAAC,EAAE,KAAK;AAAA,EACV;AAEA,SAAO,OAAO,MAAM,KAAK,KAAK,OAAO,WAAW;AAClD;AAEA,SAAS,kBAAqD;AAC5D,QAAM,EAAE,OAAO,IAAI,UAAU;AAC7B,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS;AAAA,IAC/B,SAAS,OAAO,WAAW,cAAc;AAAA,IACzC,MAAM,OAAO,QAAQ,eAAe;AAAA,EACtC,CAAC;AAED,YAAU,MAAM;AACd,aAAS,eAAe;AACtB,cAAQ;AAAA,QACN,SAAS,OAAO,WAAW,cAAc;AAAA,QACzC,MAAM,OAAO,QAAQ,eAAe;AAAA,MACtC,CAAC;AAAA,IACH;AAEA,iBAAa;AACb,WAAO,GAAG,UAAU,YAAY;AAChC,WAAO,MAAM;AACX,aAAO,IAAI,UAAU,YAAY;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,SAAO;AACT;AAEA,SAAS,iBACP,QACA,eACA,cACgC;AAChC,MAAI,UAAU,cAAc;AAC1B,WAAO,EAAE,OAAO,GAAG,KAAK,OAAO;AAAA,EACjC;AAEA,QAAM,OAAO,KAAK,MAAM,eAAe,CAAC;AACxC,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,gBAAgB,MAAM,SAAS,YAAY,CAAC;AAC/E,SAAO;AAAA,IACL;AAAA,IACA,KAAK,KAAK,IAAI,QAAQ,QAAQ,YAAY;AAAA,EAC5C;AACF;AAEA,SAAS,eAAe,QAAgB,OAA0C;AAChF,QAAM,SAAS;AAEf,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,GAAG,MAAM;AAAA,IAClB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,gCAA2B,UAAU,YAAY,YAAY,OAAO;AAAA,IAC7E,KAAK;AACH,aAAO,kEAAmD,UAAU,UAAU,qBAAqB,kFAA8D;AAAA,EACrK;AACF;AAEA,SAAS,kBAAkB,SAAiB,OAAe,OAAuB;AAChF,MAAI,SAAS,KAAK,SAAS,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,UAAU,KAAK,CAAC;AACtD,QAAM,SAAS,KAAK,MAAM,QAAQ,KAAK;AACvC,SAAO,GAAG,SAAI,OAAO,MAAM,CAAC,GAAG,SAAI,OAAO,KAAK,IAAI,GAAG,QAAQ,MAAM,CAAC,CAAC;AACxE;AAEA,SAAS,MAAM,OAKZ;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa,MAAM,UAAU;AAAA,MAC7B,UAAU;AAAA,MACV,UAAU;AAAA,MACV,OAAM;AAAA,MAEN;AAAA,6BAAC,OACC;AAAA,8BAAC,QAAK,MAAI,MAAC,OAAO,MAAM,UAAU,QAC/B,gBAAM,OACT;AAAA,UACA,oBAAC,UAAO;AAAA,UACP,MAAM,WAAW,oBAAC,QAAK,OAAM,QAAQ,gBAAM,UAAS,IAAU;AAAA,WACjE;AAAA,QACC,MAAM;AAAA;AAAA;AAAA,EACT;AAEJ;AAEA,SAAS,OAAO,OAKb;AACD,QAAM,QAA+C;AAAA,IACnD,EAAE,KAAK,SAAS,OAAO,QAAQ;AAAA,IAC/B,EAAE,KAAK,SAAS,OAAO,QAAQ;AAAA,IAC/B,EAAE,KAAK,SAAS,OAAO,QAAQ;AAAA,IAC/B,EAAE,KAAK,SAAS,OAAO,QAAQ;AAAA,IAC/B,EAAE,KAAK,UAAU,OAAO,SAAS;AAAA,EACnC;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,MAAM;AAAA,MACb,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,eAAc;AAAA,MAEd;AAAA,6BAAC,OACC;AAAA,8BAAC,QAAK,MAAI,MAAC,OAAM,QAAO,sBAExB;AAAA,UACA,oBAAC,QAAK,OAAM,QAAO,yCAA2B;AAAA,UAC9C,oBAAC,UAAO;AAAA,UACR,oBAAC,QAAK,OAAO,MAAM,KAAK,UAAU,WAAW,QAC1C,gBAAM,KAAK,UAAU,MAAM,KAAK,UAAU,SAC7C;AAAA,WACF;AAAA,QACA,oBAAC,OAAI,WAAW,GACb,gBAAM,IAAI,CAAC,MAAM,UAChB,oBAAC,OAAmB,aAAa,UAAU,MAAM,SAAS,IAAI,IAAI,GAChE,8BAAC,QAAK,OAAO,MAAM,WAAW,KAAK,MAAM,UAAU,QAAQ,iBAAiB,MAAM,WAAW,KAAK,MAAM,SAAS,QAC9G,cAAI,KAAK,KAAK,KACjB,KAHQ,KAAK,GAIf,CACD,GACH;AAAA,QACA,oBAAC,OAAI,WAAW,GACd,8BAAC,QAAK,OAAM,QAAQ,mBAAS,MAAM,OAAO,KAAK,IAAI,IAAI,MAAM,UAAU,CAAC,CAAC,GAAE,GAC7E;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,UAAU,OAQhB;AACD,QAAM,cAAc;AACpB,QAAM,YAAY;AAClB,QAAM,eAAe,KAAK,IAAI,cAAc,IAAI,cAAc,YAAY,IAAI,EAAE;AAChF,QAAM,EAAE,OAAO,IAAI,IAAI,iBAAiB,MAAM,OAAO,QAAQ,MAAM,eAAe,MAAM,WAAW;AACnG,QAAM,gBAAgB,MAAM,OAAO,MAAM,OAAO,GAAG;AAEnD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,MAAM;AAAA,MACb,UAAU,MAAM,YAAY,GAAG,MAAM,OAAO,MAAM;AAAA,MAClD,QAAO;AAAA,MAEP;AAAA,6BAAC,QAAK,OAAM,QACT;AAAA,cAAI,SAAS,CAAC;AAAA,UAAE;AAAA,UAAE,IAAI,QAAQ,WAAW;AAAA,UAAE;AAAA,UAAE,IAAI,QAAQ,SAAS;AAAA,UAAE;AAAA,WACvE;AAAA,QACC,MAAM,UACL,oBAAC,OAAI,WAAW,GACd,+BAAC,QAAK,OAAM,QACV;AAAA,8BAAC,WAAQ,MAAK,QAAO;AAAA,UAAE;AAAA,WACzB,GACF,IACE,MAAM,OAAO,WAAW,IAC1B,oBAAC,QAAK,OAAM,QAAQ,gBAAM,cAAa,IAEvC,iCACG;AAAA,wBAAc,IAAI,CAAC,OAAO,UAAU;AACnC,kBAAM,gBAAgB,QAAQ;AAC9B,kBAAM,WAAW,kBAAkB,MAAM;AACzC,kBAAM,SAAS,mBAAmB,MAAM,YAAY,MAAM,eAAe,aAAa,WAAW;AACjG,kBAAM,UAAU,mBAAmB,MAAM,WAAW,gBAAgB,YAAY;AAChF,kBAAM,QAAQ,MAAM,SAAS,MAAM;AAEnC,mBACE;AAAA,cAAC;AAAA;AAAA,gBAEC,iBAAiB,WAAW,UAAU;AAAA,gBACtC,OAAO,WAAW,UAAU,CAAC,MAAM,SAAS,UAAU;AAAA,gBACtD,MAAM,CAAC,MAAM;AAAA,gBAEZ;AAAA,sBAAI,OAAO,CAAC;AAAA,kBAAE;AAAA,kBAAE,IAAI,QAAQ,WAAW;AAAA,kBAAE;AAAA,kBAAE,IAAI,mBAAmB,MAAM,IAAI,GAAG,SAAS;AAAA,kBAAE;AAAA,kBAAE;AAAA;AAAA;AAAA,cALxF,MAAM;AAAA,YAMb;AAAA,UAEJ,CAAC;AAAA,UACD,oBAAC,OAAI,WAAW,GACd,+BAAC,QAAK,OAAM,QAAO;AAAA;AAAA,YACR,QAAQ;AAAA,YAAE;AAAA,YAAE;AAAA,YAAI;AAAA,YAAK,MAAM,OAAO;AAAA,aAC7C,GACF;AAAA,WACF;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAEA,SAAS,MAAM,OAKZ;AACD,QAAM,SAAS,MAAM,QAAQ;AAAA,IAAI,CAAC,QAAQ,UACxC,KAAK;AAAA,MACH,OAAO;AAAA,MACP,GAAG,MAAM,KAAK,IAAI,CAAC,QAAQ,UAAU,IAAI,KAAK,KAAK,EAAE,EAAE,MAAM;AAAA,IAC/D;AAAA,EACF;AAEA,SACE,oBAAC,SAAM,OAAO,MAAM,OAAO,QAAO,WAC/B,gBAAM,KAAK,WAAW,IACrB,oBAAC,QAAK,OAAM,QAAQ,gBAAM,cAAa,IAEvC,iCACE;AAAA,wBAAC,QAAK,OAAM,QACT,gBAAM,QAAQ,IAAI,CAAC,QAAQ,UAAU,IAAI,QAAQ,OAAO,KAAK,KAAK,OAAO,MAAM,CAAC,EAAE,KAAK,IAAI,GAC9F;AAAA,IACC,MAAM,KAAK,IAAI,CAAC,KAAK,UACpB,oBAAC,QACE,cAAI,IAAI,CAAC,MAAM,cAAc,IAAI,MAAM,OAAO,SAAS,KAAK,KAAK,MAAM,CAAC,EAAE,KAAK,IAAI,KAD3E,GAAG,MAAM,KAAK,IAAI,KAAK,EAElC,CACD;AAAA,KACH,GAEJ;AAEJ;AAEA,SAAS,MAAM,OAGZ;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,WAAW;AAAA,MACX,eAAc;AAAA,MAEd;AAAA,4BAAC,QAAK,MAAI,MAAC,OAAM,QACd,gBAAM,OACT;AAAA,QACC,MAAM;AAAA;AAAA;AAAA,EACT;AAEJ;AAEA,SAAS,UAAU,OAOhB;AACD,QAAM,WAAW,MAAM,KAAK,WAAW,mBAAmB,MAAM,KAAK,QAAQ,IAAI;AACjF,QAAM,gBAAgB,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,OAAO,MAAM,UAAU,MAAM,CAAC,CAAC,CAAC;AACrF,QAAM,iBACJ,MAAM,KAAK,WACX,MAAM,KAAK,kBAAkB,QAC7B,MAAM,KAAK,gBAAgB;AAC7B,QAAM,cAAc,iBAChB;AAAA,IACE,MAAM,KAAK;AAAA,IACX,MAAM,KAAK,iBAAiB;AAAA,IAC5B;AAAA,EACF,IACA;AACJ,QAAM,kBAAkB,iBACpB,GAAG,YAAY,MAAM,KAAK,eAAe,CAAC,MAAM,YAAY,MAAM,KAAK,aAAa,CAAC,KACrF,MAAM,KAAK,UACT,MAAM,KAAK,iBAAiB,gBAC1B,yBACA,mBACF,aAAa,QAAQ;AAC3B,QAAM,iBAAiB,MAAM,KAAK,YAC9B,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,MAAM,KAAK,aAAa,GAAK,IACvD;AACJ,QAAM,iBAAiB,MAAM,KAAK,kBAAkB,OAChD,KAAK,IAAI,GAAG,MAAM,KAAK,gBAAgB,MAAM,KAAK,eAAe,IACjE;AACJ,QAAM,qBAAqB,sBAAsB,MAAM,KAAK,aAAa;AACzE,QAAM,aACJ,kBACA,MAAM,KAAK,iBAAiB,UAC5B,MAAM,KAAK,kBAAkB,uBAC7B,MAAM,KAAK,kBAAkB,QAC7B,MAAM,KAAK,gBAAgB,KAC3B,kBAAkB,MAClB,MAAM,KAAK,mBAAmB,sBAC9B,iBAAiB;AACnB,QAAM,aAAa,aACf,QAAQ,uBAAuB,kBAAkB,MAAM,KAAK,iBAAiB,EAAE,CAAC,KAChF,kBACE,MAAM,KAAK,iBAAiB,UAC5B,MAAM,KAAK,kBAAkB,uBAC7B,MAAM,KAAK,kBAAkB,KAC7B,iBAAiB,IACjB,0BACA;AAEN,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAY;AAAA,MACZ,aAAa,MAAM,QAAQ,UAAU,MAAM,MAAM,IAAI,IAAI;AAAA,MACzD,UAAU;AAAA,MACV,UAAU;AAAA,MACV,eAAc;AAAA,MACd,OAAM;AAAA,MAEN;AAAA,6BAAC,OACC;AAAA,8BAAC,QAAK,OAAM,QAAO,sBAAQ;AAAA,UAC3B,qBAAC,QAAK,OAAM,QAAO;AAAA;AAAA,YAAG,MAAM,SAAS;AAAA,aAAoB;AAAA,UACzD,oBAAC,UAAO;AAAA,UACR,qBAAC,QAAK,OAAM,UAAU;AAAA,kBAAM;AAAA,YAAY;AAAA,aAAO;AAAA,UAC/C,oBAAC,QAAK,OAAM,QAAO,mBAAK;AAAA,UACxB,oBAAC,QAAK,OAAM,QAAQ,mBAAS,iBAAiB,KAAK,IAAI,IAAI,MAAM,UAAU,EAAE,CAAC,GAAE;AAAA,UAChF,oBAAC,QAAK,OAAM,QAAO,mBAAK;AAAA,UACxB,oBAAC,QAAK,OAAM,WAAW,gBAAM,QAAO;AAAA,WACtC;AAAA,QACC,MAAM,KAAK,UACV,iCACE;AAAA,8BAAC,WAAQ;AAAA,UACT,qBAAC,OACC;AAAA,gCAAC,QAAK,OAAO,MAAM,KAAK,iBAAiB,SAAS,WAAW,QAC1D,gBAAM,KAAK,iBAAiB,SAAS,SAAS,QACjD;AAAA,YACA,qBAAC,QAAK,OAAM,QAAO;AAAA;AAAA,cAAG,SAAS,MAAM,KAAK,SAAS,KAAK,IAAI,IAAI,MAAM,UAAU,EAAE,CAAC;AAAA,eAAE;AAAA,YACpF,iBACC,iCACE;AAAA,kCAAC,UAAO;AAAA,cACP,aAAa,qBAAC,QAAK,OAAM,QAAQ;AAAA;AAAA,gBAAW;AAAA,iBAAE,IAAU;AAAA,cACzD,oBAAC,QAAK,OAAM,SAAS,uBAAY;AAAA,cACjC,qBAAC,QAAK,OAAM,QAAO;AAAA;AAAA,gBAAG,cAAe,MAAM,KAAK,mBAAmB,MAAM,KAAK,iBAAiB,KAAM,GAAG;AAAA,iBAAE;AAAA,eAC5G,IACE;AAAA,aACN;AAAA,WACF,IACE;AAAA,QACH,MAAM,QACL,iCACE;AAAA,8BAAC,WAAQ;AAAA,UACT,oBAAC,QAAK,OAAO,UAAU,MAAM,MAAM,IAAI,GAAI,gBAAM,MAAM,MAAK;AAAA,WAC9D,IACE;AAAA;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,IAAI,EAAE,cAAc,KAAK,GAAa;AACpD,QAAM,EAAE,KAAK,IAAI,OAAO;AACxB,QAAM,EAAE,SAAS,KAAK,IAAI,gBAAgB;AAC1C,QAAM,SAAS,WAAW;AAE1B,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAiB,OAAO;AACpD,QAAM,CAAC,aAAa,cAAc,IAAI,SAA6B,OAAO;AAC1E,QAAM,CAAC,OAAO,QAAQ,IAAI,SAA8B,IAAI;AAC5D,QAAM,CAAC,cAAc,eAAe,IAAI,SAA8B,IAAI;AAE1E,QAAM,CAAC,WAAW,YAAY,IAAI,SAAwB,IAAI;AAC9D,QAAM,CAAC,WAAW,YAAY,IAAI,SAAoB;AAAA,IACpD,SAAS;AAAA,IACT,SAAS;AAAA,IACT,UAAU;AAAA,IACV,eAAe;AAAA,IACf,0BAA0B;AAAA,IAC1B,wBAAwB;AAAA,IACxB,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,cAAc;AAAA,IACd,eAAe;AAAA,IACf,WAAW;AAAA,IACX,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,IACrB,eAAe;AAAA,EACjB,CAAC;AACD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,CAAC;AAEhD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAyB,CAAC,CAAC;AACjE,QAAM,CAAC,oBAAoB,qBAAqB,IAAI,SAAS,CAAC;AAC9D,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,IAAI;AACrD,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,IAAI;AAErD,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAwB,IAAI;AAC1E,QAAM,CAAC,aAAa,cAAc,IAAI,SAA6B,IAAI;AACvE,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,EAAE;AAC7C,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,KAAK;AACtD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,CAAC;AAEhD,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,KAAK;AACtD,QAAM,CAAC,UAAU,WAAW,IAAI,SAAmB,SAAS;AAC5D,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAA8D,IAAI;AAC5G,QAAM,CAAC,cAAc,eAAe,IAAI,SAAoD,CAAC,CAAC;AAC9F,QAAM,CAAC,aAAa,cAAc,IAAI,SAA2D,CAAC,CAAC;AACnG,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAqD,CAAC,CAAC;AACvG,QAAM,CAAC,aAAa,cAAc,IAAI,SAAwD,CAAC,CAAC;AAEhG,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,KAAK;AACtD,QAAM,CAAC,YAAY,aAAa,IAAI,SAAqB,OAAO;AAChE,QAAM,CAACC,QAAO,QAAQ,IAAI,SAAuB,CAAC,CAAC;AACnD,QAAM,CAAC,oBAAoB,qBAAqB,IAAI,SAAS,CAAC;AAC9D,QAAM,CAAC,aAAa,cAAc,IAAI,SAA0D,CAAC,CAAC;AAClG,QAAM,CAAC,sBAAsB,uBAAuB,IAAI,SAAS,CAAC;AAElE,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,EAAE;AACjD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAsB,OAAO;AACnE,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,KAAK;AACxD,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAyB,CAAC,CAAC;AACrE,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,SAAS,CAAC;AAEhE,QAAM,CAAC,aAAa,cAAc,IAAI,SAA2B;AAAA,IAC/D,MAAM;AAAA,IACN,SAAS;AAAA,IACT,QAAQ,CAAC;AAAA,IACT,eAAe;AAAA,IACf,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB,CAAC;AAED,WAAS,UAAU,MAAiBC,OAAc;AAChD,aAAS,EAAE,MAAM,MAAM,gBAAgBA,KAAI,EAAE,CAAC;AAAA,EAChD;AAEA,iBAAe,gBAA+B;AAC5C,UAAM,CAAC,YAAY,UAAU,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,MACvD,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,WAAW,OAAO,UAAU;AAAA,IAC9B,CAAC;AAED,iBAAa,CAAC,aAAa;AAAA,MACzB,GAAG;AAAA,MACH,UAAU,WAAW,uBAAuB,WAAW;AAAA,MACvD,eAAe,WAAW;AAAA,MAC1B,0BAA0B,WAAW;AAAA,MACrC,wBAAwB,WAAW;AAAA,IACrC,EAAE;AACF,mBAAe,SAAS,MAAM;AAC9B,iBAAa,QAAQ,SAAS,OAAO,UAAU,YAAY,OAAO,QAAQ,IAAI;AAAA,EAChF;AAEA,iBAAe,UAAU,OAA+B;AACtD,oBAAgB,IAAI;AAEpB,QAAI;AACF,YAAM,SAAS,QAAQ,IAAI,YAAY;AACvC,YAAMC,QAAO,MAAM,gBAAgB,WAAW,MAAM;AAEpD,qBAAe,CAAC,YAAa,QAAQA,QAAO,CAAC,GAAG,SAAS,GAAGA,KAAI,CAAE;AAClE,sBAAgBA,MAAK,WAAW,SAAS;AACzC,4BAAsB,CAAC,YAAY,WAAW,QAAQ,IAAI,SAAS,QAAQA,MAAK,SAAS,SAASA,MAAK,MAAM,CAAC;AAAA,IAChH,SAAS,OAAO;AACd,gBAAU,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAC3E,UAAE;AACA,sBAAgB,KAAK;AAAA,IACvB;AAAA,EACF;AAEA,iBAAe,YAA2B;AACxC,oBAAgB,IAAI;AAEpB,QAAI;AACF,YAAM,CAAC,UAAU,SAASC,SAAQ,aAAa,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,QACzE,iBAAiB;AAAA,QACjB,cAAc,EAAE,OAAO,GAAG,CAAC;AAAA,QAC3B,qBAAqB;AAAA,QACrB,eAAe,EAAE,aAAa,EAAE,CAAC;AAAA,QACjC,kBAAkB,OAAO,EAAE,OAAO,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAM,KAAK,KAAK,IAAI,EAAE,CAAC;AAAA,MAC5F,CAAC;AAED,uBAAiB,QAAQ;AACzB,sBAAgB,OAAO;AACvB,qBAAeA,QAAO,MAAM,GAAG,EAAE,CAAC;AAClC,0BAAoB,YAAY,MAAM,GAAG,EAAE,CAAC;AAC5C,qBAAe,OAAO,MAAM,EAAE,CAAC;AAAA,IACjC,SAAS,OAAO;AACd,gBAAU,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAC3E,UAAE;AACA,sBAAgB,KAAK;AAAA,IACvB;AAAA,EACF;AAEA,iBAAe,YAA2B;AACxC,oBAAgB,IAAI;AAEpB,QAAI;AACF,YAAM,CAAC,WAAW,WAAW,IAAI,MAAM,QAAQ,IAAI;AAAA,QACjD,kBAAkB;AAAA,QAClB,oBAAoB,QAAW,EAAE;AAAA,MACnC,CAAC;AAED,eAAS,SAAS;AAClB,qBAAe,WAAW;AAC1B,4BAAsB,CAAC,YAAY,WAAW,SAAS,UAAU,MAAM,CAAC;AACxE,8BAAwB,CAAC,YAAY,WAAW,SAAS,YAAY,MAAM,CAAC;AAAA,IAC9E,SAAS,OAAO;AACd,gBAAU,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAC3E,UAAE;AACA,sBAAgB,KAAK;AAAA,IACvB;AAAA,EACF;AAEA,iBAAe,gBAAgB,SAAgC;AAC7D,oBAAgB,IAAI;AACpB,mBAAe,CAAC;AAEhB,QAAI;AACF,YAAM,SAAS,MAAM,WAAW,OAAO;AACvC,qBAAe,MAAM;AACrB,mBAAa,YAAY,MAAM,CAAC;AAAA,IAClC,SAAS,OAAO;AACd,qBAAe,IAAI;AACnB,mBAAa,EAAE;AACf,gBAAU,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAC3E,UAAE;AACA,sBAAgB,KAAK;AAAA,IACvB;AAAA,EACF;AAEA,iBAAe,QAAQ,SAAgC;AACrD,UAAM,YAAY,KAAK,IAAI;AAE3B,iBAAa,CAAC,aAAa;AAAA,MACzB,GAAG;AAAA,MACH,SAAS;AAAA,MACT;AAAA,MACA,iBAAiB,QAAQ;AAAA,MACzB,eAAe,QAAQ;AAAA,MACvB,cAAc,QAAQ,2BAA2B,IAAI,SAAS;AAAA,MAC9D,eAAe,QAAQ,2BAA2B,IAAI,aAAa;AAAA,MACnE;AAAA,MACA,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,qBAAqB,QAAQ;AAAA,MAC7B,eAAe;AAAA,IACjB,EAAE;AAEF,QAAI;AACF,YAAM;AAAA,QACJ,CAAC,QAAQ,UAAU;AACjB,uBAAa,CAAC,YAAY;AACxB,kBAAM,MAAM,KAAK,IAAI;AACrB,kBAAM,oBACJ,QAAQ,sBAAsB,SAAS,IAAI,MAAM;AACnD,kBAAM,4BAA4B,qBAC7B,MAAM,qBAAqB,MAC5B;AACJ,kBAAM,WACJ,SAAS,KAAK,4BAA4B,IACtC,SAAS,4BACT,QAAQ;AAEd,mBAAO;AAAA,cACL,GAAG;AAAA,cACH,iBAAiB;AAAA,cACjB,eAAe;AAAA,cACf;AAAA,cACA,gBAAgB;AAAA,cAChB,qBAAqB,KAAK,IAAI,QAAQ,qBAAqB,MAAM;AAAA,cACjE,eAAe;AAAA,YACjB;AAAA,UACF,CAAC;AAAA,QACH;AAAA,QACA,CAAC,UAAU;AACT,uBAAa,CAAC,aAAa;AAAA,YACzB,GAAG;AAAA,YACH,SAAS,MAAM;AAAA,YACf,iBAAiB,MAAM;AAAA,YACvB,eAAe,MAAM;AAAA,YACrB,cAAc,MAAM;AAAA,YACpB,eAAe,MAAM;AAAA,UACvB,EAAE;AAAA,QACJ;AAAA,MACF;AACA,YAAM,QAAQ,IAAI;AAAA,QAChB,cAAc;AAAA,QACd,UAAU,IAAI;AAAA,QACd,WAAW,UAAU,UAAU,IAAI,QAAQ,QAAQ;AAAA,QACnD,WAAW,UAAU,UAAU,IAAI,QAAQ,QAAQ;AAAA,MACrD,CAAC;AACD,gBAAU,WAAW,sBAAsB;AAAA,IAC7C,SAAS,OAAO;AACd,gBAAU,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAC3E,UAAE;AACA,mBAAa,CAAC,aAAa;AAAA,QACzB,GAAG;AAAA,QACH,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,eAAe;AAAA,QACf,cAAc;AAAA,QACd,eAAe;AAAA,QACf,WAAW;AAAA,QACX,mBAAmB;AAAA,QACnB,gBAAgB;AAAA,QAChB,qBAAqB;AAAA,QACrB,eAAe;AAAA,MACjB,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,iBAAe,uBAAsC;AACnD,UAAM,QAAQ,IAAI;AAAA,MAChB,cAAc;AAAA,MACd,UAAU,IAAI;AAAA,MACd,WAAW,UAAU,UAAU,IAAI,QAAQ,QAAQ;AAAA,MACnD,WAAW,UAAU,UAAU,IAAI,QAAQ,QAAQ;AAAA,MACnD,mBAAmB,WAAW,UAAU,gBAAgB,eAAe,IAAI,QAAQ,QAAQ;AAAA,IAC7F,CAAC;AAAA,EACH;AAEA,WAAS,uBAA4C;AACnD,QAAI,WAAW,UAAU;AACvB,aAAO,cAAc,mBAAmB,KAAK;AAAA,IAC/C;AAEA,WAAO,YAAY,kBAAkB,KAAK;AAAA,EAC5C;AAEA,iBAAe,sBAAqC;AAClD,UAAM,QAAQ,WAAW,UACrB,cACA,qBAAqB;AAEzB,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AAEA,QAAI;AACF,YAAM,cAAc,CAAC,MAAM,EAAE,CAAC;AAC9B,gBAAU,WAAW,YAAY,MAAM,WAAW,MAAM,EAAE,GAAG;AAC7D,YAAM,qBAAqB;AAAA,IAC7B,SAAS,OAAO;AACd,gBAAU,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAC3E;AAAA,EACF;AAEA,iBAAe,yBAAwC;AACrD,UAAM,QAAQ,WAAW,UACrB,cACA,qBAAqB;AAEzB,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AAEA,QAAI;AACF,UAAI,MAAM,QAAQ;AAChB,cAAM,WAAW,CAAC,MAAM,EAAE,CAAC;AAC3B,kBAAU,WAAW,UAAU,MAAM,WAAW,MAAM,EAAE,aAAa;AAAA,MACvE,OAAO;AACL,cAAM,SAAS,CAAC,MAAM,EAAE,CAAC;AACzB,kBAAU,WAAW,UAAU,MAAM,WAAW,MAAM,EAAE,WAAW;AAAA,MACrE;AACA,YAAM,qBAAqB;AAAA,IAC7B,SAAS,OAAO;AACd,gBAAU,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAC3E;AAAA,EACF;AAEA,iBAAe,gBAAgB,eAA6C;AAC1E,QAAI,CAAC,eAAe;AAClB;AAAA,IACF;AAEA,mBAAe;AAAA,MACb,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ,CAAC;AAAA,MACT,eAAe;AAAA,MACf;AAAA,MACA,YAAY;AAAA,MACZ,cAAc;AAAA,IAChB,CAAC;AAED,QAAI;AACF,YAAMA,UAAS,MAAM,WAAW;AAChC,qBAAe,CAAC,aAAa;AAAA,QAC3B,GAAG;AAAA,QACH,SAAS;AAAA,QACT,QAAAA;AAAA,MACF,EAAE;AAAA,IACJ,SAAS,OAAO;AACd,qBAAe,CAAC,aAAa;AAAA,QAC3B,GAAG;AAAA,QACH,SAAS;AAAA,MACX,EAAE;AACF,gBAAU,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAC3E;AAAA,EACF;AAEA,iBAAe,mBAAmB,WAAkC;AAClE,QAAI,CAAC,YAAY,eAAe;AAC9B;AAAA,IACF;AAEA,QAAI;AACF,YAAM,YAAY,CAAC,YAAY,aAAa,GAAG,SAAS;AACxD,qBAAe,CAAC,aAAa;AAAA,QAC3B,GAAG;AAAA,QACH,MAAM;AAAA,MACR,EAAE;AACF,gBAAU,WAAW,iBAAiB,SAAS,GAAG;AAClD,YAAM,qBAAqB;AAAA,IAC7B,SAAS,OAAO;AACd,gBAAU,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAC3E;AAAA,EACF;AAEA,iBAAe,oBAAoB,MAA6B;AAC9D,UAAM,UAAU,KAAK,KAAK;AAE1B,QAAI,CAAC,SAAS;AACZ,gBAAU,SAAS,6BAA6B;AAChD;AAAA,IACF;AAEA,QAAI;AACF,YAAM,YAAY,OAAO;AACzB,YAAM,mBAAmB,OAAO;AAAA,IAClC,SAAS,OAAO;AACd,gBAAU,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAC3E;AAAA,EACF;AAEA,iBAAe,cAAc,OAA8B;AACzD,UAAM,UAAU,MAAM,KAAK;AAE3B,QAAI,CAAC,SAAS;AACZ,gBAAU,SAAS,4BAA4B;AAC/C;AAAA,IACF;AAEA,qBAAiB,IAAI;AAErB,QAAI;AACF,YAAM,UAAU,MAAM,aAAa,SAAS,YAAY;AACxD,uBAAiB,OAAO;AACxB,6BAAuB,CAAC;AACxB,qBAAe,SAAS;AACxB,gBAAU,QAAQ,GAAG,QAAQ,MAAM,yBAAyB;AAAA,IAC9D,SAAS,OAAO;AACd,gBAAU,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAC3E,UAAE;AACA,uBAAiB,KAAK;AAAA,IACxB;AAAA,EACF;AAEA,WAAS,kBAAkB,OAAqB,QAAkC;AAChF,mBAAe,MAAM;AACrB,uBAAmB,MAAM,EAAE;AAC3B,cAAU,OAAO;AAAA,EACnB;AAEA,YAAU,MAAM;AACd,UAAM,YAAY;AAChB,YAAM,QAAQ,IAAI;AAAA,QAChB,cAAc;AAAA,QACd,UAAU,IAAI;AAAA,MAChB,CAAC;AAED,UAAI,aAAa;AACf,cAAM,QAAQ,qBAAgB;AAAA,MAChC;AAAA,IACF,GAAG;AAAA,EACL,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AACd,QAAI,WAAW,SAAS;AACtB,WAAK,UAAU;AAAA,IACjB;AAEA,QAAI,WAAW,SAAS;AACtB,WAAK,UAAU;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,YAAU,MAAM;AACd,QAAI,WAAW,WAAW,iBAAiB;AACzC,WAAK,gBAAgB,eAAe;AAAA,IACtC;AAAA,EACF,GAAG,CAAC,QAAQ,eAAe,CAAC;AAE5B,YAAU,MAAM;AACd,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AAEA,UAAM,UAAU,WAAW,MAAM;AAC/B,eAAS,IAAI;AAAA,IACf,GAAG,IAAI;AAEP,WAAO,MAAM,aAAa,OAAO;AAAA,EACnC,GAAG,CAAC,KAAK,CAAC;AAEV,WAAS,CAACC,QAAO,QAAQ;AACvB,QAAI,cAAc;AAChB,UAAIA,WAAU,OAAOA,WAAU,KAAK;AAClC,cAAM,SAAS,aAAa;AAC5B,wBAAgB,IAAI;AACpB,aAAK,OAAO;AAAA,MACd,WAAWA,WAAU,OAAOA,WAAU,OAAO,IAAI,QAAQ;AACvD,wBAAgB,IAAI;AAAA,MACtB;AACA;AAAA,IACF;AAEA,QAAI,YAAY,MAAM;AACpB,UAAI,YAAY,YAAY;AAC1B,YAAI,IAAI,QAAQ;AACd,yBAAe,CAAC,aAAa;AAAA,YAC3B,GAAG;AAAA,YACH,YAAY;AAAA,YACZ,cAAc;AAAA,UAChB,EAAE;AAAA,QACJ;AACA;AAAA,MACF;AAEA,UAAI,IAAI,QAAQ;AACd,uBAAe,CAAC,aAAa;AAAA,UAC3B,GAAG;AAAA,UACH,MAAM;AAAA,QACR,EAAE;AACF;AAAA,MACF;AAEA,UAAIA,WAAU,OAAO,IAAI,WAAW;AAClC,uBAAe,CAAC,aAAa;AAAA,UAC3B,GAAG;AAAA,UACH,eAAe,WAAW,QAAQ,gBAAgB,GAAG,QAAQ,OAAO,MAAM;AAAA,QAC5E,EAAE;AACF;AAAA,MACF;AAEA,UAAIA,WAAU,OAAO,IAAI,SAAS;AAChC,uBAAe,CAAC,aAAa;AAAA,UAC3B,GAAG;AAAA,UACH,eAAe,WAAW,QAAQ,gBAAgB,GAAG,QAAQ,OAAO,MAAM;AAAA,QAC5E,EAAE;AACF;AAAA,MACF;AAEA,UAAIA,WAAU,KAAK;AACjB,uBAAe,CAAC,aAAa;AAAA,UAC3B,GAAG;AAAA,UACH,YAAY;AAAA,UACZ,cAAc;AAAA,QAChB,EAAE;AACF;AAAA,MACF;AAEA,UAAI,IAAI,QAAQ;AACd,cAAM,QAAQ,YAAY,OAAO,YAAY,aAAa;AAC1D,YAAI,OAAO;AACT,eAAK,mBAAmB,MAAM,IAAI;AAAA,QACpC;AACA;AAAA,MACF;AAEA;AAAA,IACF;AAEA,QAAI,WAAW,YAAY,gBAAgB,SAAS;AAClD,UAAI,IAAI,QAAQ;AACd,kBAAU,OAAO;AAAA,MACnB;AACA;AAAA,IACF;AAEA,QAAIA,WAAU,KAAK;AACjB,WAAK;AACL;AAAA,IACF;AAEA,QAAI,WAAW,SAAS;AACtB,UAAIA,WAAU,OAAO,IAAI,WAAW;AAClC,YAAI,uBAAuB,YAAY,SAAS,KAAK,gBAAgB,CAAC,cAAc;AAClF,eAAK,UAAU,KAAK;AAAA,QACtB;AACA,8BAAsB,CAAC,YAAY,WAAW,UAAU,GAAG,YAAY,MAAM,CAAC;AAC9E;AAAA,MACF;AAEA,UAAIA,WAAU,OAAO,IAAI,SAAS;AAChC,8BAAsB,CAAC,YAAY,WAAW,UAAU,GAAG,YAAY,MAAM,CAAC;AAC9E;AAAA,MACF;AAEA,UAAI,IAAI,QAAQ;AACd,cAAM,QAAQ,YAAY,kBAAkB;AAC5C,YAAI,OAAO;AACT,4BAAkB,OAAO,OAAO;AAAA,QAClC;AACA;AAAA,MACF;AAEA,UAAIA,WAAU,KAAK;AACjB,aAAK,oBAAoB;AACzB;AAAA,MACF;AAEA,UAAIA,WAAU,KAAK;AACjB,aAAK,gBAAgB,YAAY,kBAAkB,GAAG,MAAM,IAAI;AAChE;AAAA,MACF;AAEA,UAAIA,WAAU,KAAK;AACjB,aAAK,uBAAuB;AAC5B;AAAA,MACF;AAEA,UAAIA,WAAU,KAAK;AACjB,kBAAU,QAAQ;AAClB,uBAAe,OAAO;AACtB;AAAA,MACF;AAEA,UAAIA,WAAU,KAAK;AACjB,aAAK,QAAQ,qBAAgB;AAC7B;AAAA,MACF;AAEA,UAAIA,WAAU,KAAK;AACjB,kBAAU,OAAO;AACjB;AAAA,MACF;AAEA,UAAIA,WAAU,KAAK;AACjB,kBAAU,OAAO;AAAA,MACnB;AACA;AAAA,IACF;AAEA,QAAI,WAAW,SAAS;AACtB,UAAI,IAAI,UAAU,IAAI,WAAW;AAC/B,kBAAU,WAAW;AACrB;AAAA,MACF;AAEA,UAAIA,WAAU,OAAO,IAAI,WAAW;AAClC,uBAAe,CAAC,YAAY,UAAU,CAAC;AACvC;AAAA,MACF;AAEA,UAAIA,WAAU,OAAO,IAAI,SAAS;AAChC,uBAAe,CAAC,YAAY,KAAK,IAAI,GAAG,UAAU,CAAC,CAAC;AACpD;AAAA,MACF;AAEA,UAAIA,WAAU,KAAK;AACjB,aAAK,oBAAoB;AACzB;AAAA,MACF;AAEA,UAAIA,WAAU,KAAK;AACjB,aAAK,gBAAgB,eAAe;AACpC;AAAA,MACF;AAEA,UAAIA,WAAU,KAAK;AACjB,aAAK,uBAAuB;AAAA,MAC9B;AACA;AAAA,IACF;AAEA,QAAI,WAAW,SAAS;AACtB,UAAI,IAAI,UAAU,IAAI,WAAW;AAC/B,kBAAU,OAAO;AACjB;AAAA,MACF;AAEA,UAAIA,WAAU,KAAK;AACjB,oBAAY,SAAS;AACrB;AAAA,MACF;AAEA,UAAIA,WAAU,KAAK;AACjB,oBAAY,QAAQ;AACpB;AAAA,MACF;AAEA,UAAIA,WAAU,KAAK;AACjB,oBAAY,aAAa;AAAA,MAC3B;AACA;AAAA,IACF;AAEA,QAAI,WAAW,SAAS;AACtB,UAAI,IAAI,UAAU,IAAI,WAAW;AAC/B,kBAAU,OAAO;AACjB;AAAA,MACF;AAEA,UAAI,IAAI,KAAK;AACX,sBAAc,CAAC,YAAa,YAAY,UAAU,YAAY,OAAQ;AACtE;AAAA,MACF;AAEA,UAAIA,WAAU,OAAO,IAAI,WAAW;AAClC,YAAI,eAAe,SAAS;AAC1B,gCAAsB,CAAC,YAAY,WAAW,UAAU,GAAGJ,OAAM,MAAM,CAAC;AAAA,QAC1E,OAAO;AACL,kCAAwB,CAAC,YAAY,WAAW,UAAU,GAAG,YAAY,MAAM,CAAC;AAAA,QAClF;AACA;AAAA,MACF;AAEA,UAAII,WAAU,OAAO,IAAI,SAAS;AAChC,YAAI,eAAe,SAAS;AAC1B,gCAAsB,CAAC,YAAY,WAAW,UAAU,GAAGJ,OAAM,MAAM,CAAC;AAAA,QAC1E,OAAO;AACL,kCAAwB,CAAC,YAAY,WAAW,UAAU,GAAG,YAAY,MAAM,CAAC;AAAA,QAClF;AACA;AAAA,MACF;AAEA,UAAII,WAAU,KAAK;AACjB,cAAM,YAAY;AAChB,cAAI;AACF,kBAAM,eAAe,OAAO,QAAQ;AACpC,sBAAU,WAAW,2BAA2B;AAChD,kBAAM,UAAU;AAAA,UAClB,SAAS,OAAO;AACd,sBAAU,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,UAC3E;AAAA,QACF,GAAG;AACH;AAAA,MACF;AAEA,UAAIA,WAAU,OAAO,eAAe,SAAS;AAC3C,cAAM,OAAOJ,OAAM,kBAAkB;AAErC,YAAI,CAAC,MAAM;AACT;AAAA,QACF;AAEA,cAAM,YAAY;AAChB,cAAI;AACF,gBAAI,KAAK,SAAS;AAChB,oBAAM,YAAY,KAAK,IAAI;AAC3B,wBAAU,WAAW,iBAAiB,KAAK,IAAI,GAAG;AAAA,YACpD,OAAO;AACL,oBAAM,WAAW,KAAK,IAAI;AAC1B,wBAAU,WAAW,gBAAgB,KAAK,IAAI,GAAG;AAAA,YACnD;AACA,kBAAM,UAAU;AAAA,UAClB,SAAS,OAAO;AACd,sBAAU,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,UAC3E;AAAA,QACF,GAAG;AACH;AAAA,MACF;AAEA,UAAII,WAAU,OAAO,eAAe,SAAS;AAC3C,cAAM,OAAOJ,OAAM,kBAAkB;AACrC,YAAI,CAAC,MAAM;AACT;AAAA,QACF;AAEA,cAAM,YAAY;AAChB,cAAI;AACF,kBAAM,QAAQ,KAAK,MAAM,EAAE,QAAQ,MAAM,WAAW,IAAI,CAAC;AACzD,sBAAU,WAAW,gBAAgB,KAAK,IAAI,GAAG;AACjD,kBAAM,UAAU;AAAA,UAClB,SAAS,OAAO;AACd,sBAAU,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,UAC3E;AAAA,QACF,GAAG;AACH;AAAA,MACF;AAEA,UAAII,WAAU,OAAO,eAAe,SAAS;AAC3C,cAAM,OAAOJ,OAAM,kBAAkB;AACrC,YAAI,CAAC,MAAM;AACT;AAAA,QACF;AAEA,wBAAgB;AAAA,UACd,OAAO;AAAA,UACP,SAAS,cAAc,KAAK,IAAI;AAAA,UAChC,WAAW,YAAY;AACrB,gBAAI;AACF,oBAAM,QAAQ,KAAK,MAAM,EAAE,QAAQ,OAAO,WAAW,IAAI,CAAC;AAC1D,wBAAU,WAAW,gBAAgB,KAAK,IAAI,GAAG;AACjD,oBAAM,qBAAqB;AAC3B,oBAAM,UAAU;AAAA,YAClB,SAAS,OAAO;AACd,wBAAU,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,YAC3E;AAAA,UACF;AAAA,QACF,CAAC;AACD;AAAA,MACF;AAEA,UAAII,WAAU,OAAO,eAAe,WAAW;AAC7C,cAAM,MAAM,YAAY,oBAAoB;AAC5C,YAAI,CAAC,KAAK;AACR;AAAA,QACF;AAEA,cAAM,YAAY;AAChB,cAAI;AACF,kBAAM,QAAQ,IAAI,EAAE;AACpB,sBAAU,WAAW,aAAa,IAAI,EAAE,GAAG;AAC3C,kBAAM,qBAAqB;AAC3B,kBAAM,UAAU;AAAA,UAClB,SAAS,OAAO;AACd,sBAAU,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,UAC3E;AAAA,QACF,GAAG;AAAA,MACL;AACA;AAAA,IACF;AAEA,QAAI,WAAW,UAAU;AACvB,UAAI,IAAI,UAAU,IAAI,WAAW;AAC/B,kBAAU,OAAO;AACjB;AAAA,MACF;AAEA,UAAIA,WAAU,KAAK;AACjB,uBAAe,OAAO;AACtB;AAAA,MACF;AAEA,UAAIA,WAAU,OAAO,IAAI,WAAW;AAClC,+BAAuB,CAAC,YAAY,WAAW,UAAU,GAAG,cAAc,MAAM,CAAC;AACjF;AAAA,MACF;AAEA,UAAIA,WAAU,OAAO,IAAI,SAAS;AAChC,+BAAuB,CAAC,YAAY,WAAW,UAAU,GAAG,cAAc,MAAM,CAAC;AACjF;AAAA,MACF;AAEA,UAAI,IAAI,QAAQ;AACd,cAAM,QAAQ,cAAc,mBAAmB;AAC/C,YAAI,OAAO;AACT,4BAAkB,OAAO,QAAQ;AAAA,QACnC;AACA;AAAA,MACF;AAEA,UAAIA,WAAU,KAAK;AACjB,aAAK,oBAAoB;AACzB;AAAA,MACF;AAEA,UAAIA,WAAU,KAAK;AACjB,aAAK,gBAAgB,cAAc,mBAAmB,GAAG,MAAM,IAAI;AACnE;AAAA,MACF;AAEA,UAAIA,WAAU,KAAK;AACjB,aAAK,uBAAuB;AAAA,MAC9B;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,eAAe;AACrB,QAAM,gBAAgB,KAAK,IAAI,oBAAoB,OAAO,YAAY;AACtE,QAAM,kBAAkB,KAAK,IAAI,GAAG,gBAAgB,CAAC;AACrD,QAAM,kBAAkB,KAAK,IAAI,GAAG,gBAAgB,CAAC;AACrD,QAAM,iBAAiB,UAAU,MAAM,IAAI;AAC3C,QAAM,mBAAmB,eAAe,MAAM,aAAa,cAAc,eAAe;AACxF,QAAM,oBAAoB,KAAK,IAAI,GAAG,KAAK,MAAM,gBAAgB,CAAC,CAAC;AACnE,QAAM,sBAAsB,KAAK,IAAI,GAAG,KAAK,MAAM,gBAAgB,CAAC,CAAC;AACrE,QAAM,aAAa,iBAAiBJ,OAAM,QAAQ,oBAAoB,iBAAiB;AACvF,QAAM,eAAe;AAAA,IACnB,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,EACF;AACA,QAAM,eAAeA,OAAM,MAAM,WAAW,OAAO,WAAW,GAAG;AACjE,QAAM,iBAAiB,YAAY,MAAM,aAAa,OAAO,aAAa,GAAG;AAC7E,QAAM,eAAeA,OAAM,kBAAkB;AAC7C,QAAM,cAAc,YAAY,oBAAoB;AACpD,QAAM,cAAc;AAAA,IAClB;AAAA,IACA,WAAW,UAAU,aAAa,WAAW,WAAW,cAAc;AAAA,EACxE;AAEA,SACE,qBAAC,OAAI,eAAc,UAAS,OAAO,SAAS,QAAQ,MAAM,UAAU,GAAG,UAAU,GAC/E;AAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAM;AAAA,QACN,SAAS,KAAK,IAAI,IAAI,UAAU,CAAC;AAAA,QACjC,OAAO;AAAA;AAAA,IACT;AAAA,IACA,qBAAC,OAAI,QAAQ,eAAe,eAAc,UAAS,WAAW,GAC7D;AAAA,iBAAW,UACV;AAAA,QAAC;AAAA;AAAA,UACC,QAAQ;AAAA,UACR,eAAe;AAAA,UACf,OAAM;AAAA,UACN,SAAS;AAAA,UACT,cAAa;AAAA,UACb,aAAa;AAAA,UACb,UAAS;AAAA;AAAA,MACX,IACE;AAAA,MAEH,WAAW,UACV;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,mBAAmB,aAAa,WAAW,gBAAgB,KAAK,IAAI,IAAI,UAAU,EAAE,CAAC;AAAA,UAC5F,UAAS;AAAA,UACT,QAAO;AAAA,UAEN,yBACC,qBAAC,QAAK,OAAM,QACV;AAAA,gCAAC,WAAQ,MAAK,QAAO;AAAA,YAAE;AAAA,aACzB,IACE,cACF,iCACE;AAAA,iCAAC,QAAK;AAAA;AAAA,cACG,mBAAmB,YAAY,WAAW,GAAG,YAAY,QAAQ,KAAK,YAAY,WAAW,MAAM,YAAY,WAAW;AAAA,eACnI;AAAA,YACA,qBAAC,QAAK;AAAA;AAAA,cAAK,mBAAmB,YAAY,YAAY,KAAK,IAAI,KAAK,GAAG;AAAA,eAAE;AAAA,YACzE,qBAAC,QAAK;AAAA;AAAA,cAAO,IAAI,KAAK,YAAY,IAAI,EAAE,YAAY;AAAA,eAAE;AAAA,YACtD,qBAAC,QAAK;AAAA;AAAA,cAAS,mBAAmB,YAAY,SAAS,KAAK,IAAI,KAAK,GAAG;AAAA,eAAE;AAAA,YAC1E,oBAAC,OAAI,WAAW,GAAG,eAAc,UAC9B,2BAAiB,WAAW,IAC3B,oBAAC,QAAK,OAAM,QAAO,+BAAiB,IAEpC,iBAAiB,IAAI,CAAC,MAAM,UAC1B,oBAAC,QAA4B,6BAAmB,QAAQ,KAAK,KAAK,IAAI,IAAI,UAAU,CAAC,CAAC,KAA3E,QAAQ,KAAK,EAAgE,CACzF,GAEL;AAAA,YACA,oBAAC,OAAI,WAAW,GACd,+BAAC,QAAK,OAAM,QAAO;AAAA;AAAA,cAAM,KAAK,IAAI,eAAe,QAAQ,cAAc,CAAC;AAAA,cAAE;AAAA,cAAK,eAAe,UAAU;AAAA,eAAE,GAC5G;AAAA,aACF,IAEA,oBAAC,QAAK,OAAM,QAAO,0CAA4B;AAAA;AAAA,MAEnD,IACE;AAAA,MAEH,WAAW,UACV;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,UAAS;AAAA,UACT,QAAO;AAAA,UAEN,yBACC,qBAAC,QAAK,OAAM,QACV;AAAA,gCAAC,WAAQ,MAAK,QAAO;AAAA,YAAE;AAAA,aACzB,IAEA,iCACE;AAAA,iCAAC,OAAI,WAAW,GAAG,eAAc,UAC/B;AAAA,mCAAC,QAAK;AAAA;AAAA,gBAAQ,eAAe,SAAS;AAAA,iBAAE;AAAA,cACxC,qBAAC,QAAK;AAAA;AAAA,gBAAS,eAAe,UAAU;AAAA,iBAAE;AAAA,cAC1C,qBAAC,QAAK;AAAA;AAAA,gBAAU,eAAe,WAAW;AAAA,iBAAE;AAAA,cAC5C,qBAAC,QAAK;AAAA;AAAA,gBACI,eAAe,MAAM,YAAY;AAAA,gBAAE;AAAA,gBAAa,eAAe,MAAM,UAAU;AAAA,gBAAE;AAAA,iBAC3F;AAAA,cACA,qBAAC,QAAK;AAAA;AAAA,gBACG,eAAe,SAAS,YAAY;AAAA,gBAAE;AAAA,gBAAa,eAAe,SAAS,UAAU;AAAA,gBAAE;AAAA,iBAChG;AAAA,cACA,qBAAC,QAAK;AAAA;AAAA,gBACI,eAAe,UAAU,YAAY;AAAA,gBAAE;AAAA,gBAAa,eAAe,UAAU,UAAU;AAAA,gBAAE;AAAA,iBACnG;AAAA,eACF;AAAA,YACA,qBAAC,OAAI,WAAW,GACd;AAAA,kCAAC,QAAK,OAAO,aAAa,YAAY,SAAS,QAAQ,uBAAS;AAAA,cAChE,oBAAC,QAAK,eAAC;AAAA,cACP,oBAAC,QAAK,OAAO,aAAa,WAAW,SAAS,QAAQ,sBAAQ;AAAA,cAC9D,oBAAC,QAAK,eAAC;AAAA,cACP,oBAAC,QAAK,OAAO,aAAa,gBAAgB,SAAS,QAAQ,2BAAa;AAAA,eAC1E;AAAA,YACC,aAAa,YACZ;AAAA,cAAC;AAAA;AAAA,gBACC,OAAM;AAAA,gBACN,SAAS,CAAC,UAAU,SAAS,SAAS;AAAA,gBACtC,MAAM,aAAa,IAAI,CAAC,WAAW;AAAA,kBACjC,SAAS,OAAO,QAAQ,OAAO,OAAO,EAAE;AAAA,kBACxC,OAAO,OAAO,aAAa;AAAA,kBAC3B,cAAc,OAAO,UAAU;AAAA,gBACjC,CAAC;AAAA,gBACD,cAAa;AAAA;AAAA,YACf,IACE;AAAA,YACH,aAAa,WACZ;AAAA,cAAC;AAAA;AAAA,gBACC,OAAM;AAAA,gBACN,SAAS,CAAC,SAAS,SAAS,QAAQ;AAAA,gBACpC,MAAM,YAAY,IAAI,CAAC,UAAU;AAAA,kBAC/B,SAAS,MAAM,WAAW,EAAE;AAAA,kBAC5B,OAAO,MAAM,aAAa;AAAA,kBAC1B,OAAO,MAAM,cAAc;AAAA,gBAC7B,CAAC;AAAA,gBACD,cAAa;AAAA;AAAA,YACf,IACE;AAAA,YACH,aAAa,gBACZ;AAAA,cAAC;AAAA;AAAA,gBACC,OAAM;AAAA,gBACN,SAAS,CAAC,UAAU,SAAS,WAAW,QAAQ;AAAA,gBAChD,MAAM,iBAAiB,IAAI,CAAC,eAAe;AAAA,kBACzC,SAAS,WAAW,QAAQ,WAAW,OAAO,EAAE;AAAA,kBAChD,OAAO,WAAW,YAAY;AAAA,kBAC9B,cAAc,WAAW,UAAU;AAAA,kBACnC,WAAW;AAAA,gBACb,CAAC;AAAA,gBACD,cAAa;AAAA;AAAA,YACf,IACE;AAAA,YACJ;AAAA,cAAC;AAAA;AAAA,gBACC,OAAM;AAAA,gBACN,SAAS,CAAC,OAAO,YAAY,QAAQ;AAAA,gBACrC,MAAM,YAAY,IAAI,CAAC,UAAU;AAAA,kBAC/B,MAAM;AAAA,kBACN,OAAO,MAAM,QAAQ;AAAA,kBACrB,OAAO,MAAM,MAAM;AAAA,gBACrB,CAAC;AAAA,gBACD,cAAa;AAAA;AAAA,YACf;AAAA,aACF;AAAA;AAAA,MAEJ,IACE;AAAA,MAEH,WAAW,UACV;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,UAAS;AAAA,UACT,QAAO;AAAA,UAEN,yBACC,qBAAC,QAAK,OAAM,QACV;AAAA,gCAAC,WAAQ,MAAK,QAAO;AAAA,YAAE;AAAA,aACzB,IAEA,iCACE;AAAA,gCAAC,QAAK,OAAO,eAAe,UAAU,SAAS,QAAQ,mBAAK;AAAA,YAC3DA,OAAM,WAAW,IAChB,oBAAC,QAAK,OAAM,QAAO,gCAAkB,IAErC,aAAa,IAAI,CAAC,MAAM,UAAU;AAChC,oBAAM,gBAAgB,WAAW,QAAQ;AAEzC,qBACE;AAAA,gBAAC;AAAA;AAAA,kBAEC,iBAAiB,eAAe,WAAW,kBAAkB,qBAAqB,YAAY;AAAA,kBAC9F,OAAO,eAAe,WAAW,kBAAkB,qBAAqB,UAAU;AAAA,kBAEjF;AAAA,yBAAK,UAAU,WAAM;AAAA,oBAAI;AAAA,oBAAE,KAAK;AAAA,oBAAK;AAAA,oBAAG,KAAK;AAAA,oBAAU;AAAA,oBAAa,mBAAmB,KAAK,eAAe;AAAA,oBAAE;AAAA;AAAA;AAAA,gBAJzG,KAAK;AAAA,cAKZ;AAAA,YAEJ,CAAC;AAAA,YAEH,qBAAC,OAAI,WAAW,GAAG,eAAc,UAC/B;AAAA,kCAAC,QAAK,OAAO,eAAe,YAAY,SAAS,QAAQ,4BAAc;AAAA,cACtE,YAAY,WAAW,IACtB,oBAAC,QAAK,OAAM,QAAO,uCAAyB,IAE5C,eAAe,IAAI,CAAC,KAAK,UAAU;AACjC,sBAAM,gBAAgB,aAAa,QAAQ;AAE3C,uBACE;AAAA,kBAAC;AAAA;AAAA,oBAEC,iBAAiB,eAAe,aAAa,kBAAkB,uBAAuB,UAAU;AAAA,oBAChG,OAAO,eAAe,aAAa,kBAAkB,uBAAuB,UAAU;AAAA,oBAErF;AAAA,0BAAI;AAAA,sBAAO;AAAA,sBAAE,IAAI;AAAA,sBAAG;AAAA,sBAAG,IAAI;AAAA,sBAAU;AAAA,sBAAS,mBAAmB,IAAI,SAAS;AAAA,sBAAE;AAAA;AAAA;AAAA,kBAJ5E,IAAI;AAAA,gBAKX;AAAA,cAEJ,CAAC;AAAA,eAEL;AAAA,YACC,gBAAgB,eAAe,UAC9B,qBAAC,OAAI,WAAW,GAAG,eAAc,UAC/B;AAAA,mCAAC,QAAK,OAAM,QAAO;AAAA;AAAA,gBAAgB,aAAa;AAAA,iBAAK;AAAA,cACrD,qBAAC,QAAK,OAAM,QAAO;AAAA;AAAA,gBAAU,aAAa,QAAQ,IAAI,CAAC,WAAW,OAAO,IAAI,EAAE,KAAK,IAAI,KAAK;AAAA,iBAAI;AAAA,eACnG,IACE;AAAA,YACH,eAAe,eAAe,YAC7B,qBAAC,QAAK,OAAM,QAAO;AAAA;AAAA,cAAe,YAAY;AAAA,eAAG,IAC/C;AAAA,aACN;AAAA;AAAA,MAEJ,IACE;AAAA,MAEH,WAAW,WACV;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,UAAS;AAAA,UACT,QAAO;AAAA,UAEP;AAAA,iCAAC,OACC;AAAA,kCAAC,QAAK,OAAM,QAAO,qBAAO;AAAA,cAC1B;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,kBACP,UAAU;AAAA,kBACV,UAAU,CAAC,UAAU;AACnB,yBAAK,cAAc,KAAK;AAAA,kBAC1B;AAAA,kBACA,OAAO,gBAAgB;AAAA;AAAA,cACzB;AAAA,eACF;AAAA,YACC,gBACC,qBAAC,QAAK,OAAM,QACV;AAAA,kCAAC,WAAQ,MAAK,QAAO;AAAA,cAAE;AAAA,eACzB,IAEA;AAAA,cAAC;AAAA;AAAA,gBACC,QAAQ;AAAA,gBACR,eAAe;AAAA,gBACf,OAAM;AAAA,gBACN,cAAa;AAAA,gBACb,aAAa,KAAK,IAAI,GAAG,kBAAkB,CAAC;AAAA;AAAA,YAC9C;AAAA;AAAA;AAAA,MAEJ,IACE;AAAA,OACJ;AAAA,IAEC,YAAY,OACX,oBAAC,SAAM,OAAM,gBACV,sBAAY,UACX,qBAAC,QAAK,OAAM,QACV;AAAA,0BAAC,WAAQ,MAAK,QAAO;AAAA,MAAE;AAAA,OACzB,IACE,YAAY,aACd,iCACE;AAAA,0BAAC,QAAK,OAAM,QAAO,kEAAoD;AAAA,MACvE;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,YAAY;AAAA,UACnB,UAAU,CAAC,UAAU;AACnB,2BAAe,CAAC,aAAa;AAAA,cAC3B,GAAG;AAAA,cACH,cAAc;AAAA,YAChB,EAAE;AAAA,UACJ;AAAA,UACA,UAAU,CAAC,UAAU;AACnB,iBAAK,oBAAoB,KAAK;AAAA,UAChC;AAAA,UACA,OAAK;AAAA;AAAA,MACP;AAAA,OACF,IACE,YAAY,OAAO,WAAW,IAChC,oBAAC,QAAK,OAAM,QAAO,yDAA2C,IAE9D,iCACE;AAAA,0BAAC,QAAK,OAAM,QAAO,mEAAqD;AAAA,MACvE,YAAY,OAAO,IAAI,CAAC,OAAO,UAC9B,oBAAC,QAAoB,SAAS,UAAU,YAAY,eACjD,gBAAM,QADE,MAAM,EAEjB,CACD;AAAA,OACH,GAEJ,IACE;AAAA,IAEH,eACC,qBAAC,SAAM,OAAO,aAAa,OACzB;AAAA,0BAAC,QAAM,uBAAa,SAAQ;AAAA,MAC5B,oBAAC,QAAK,OAAM,QAAO,iDAAmC;AAAA,OACxD,IACE;AAAA,IAEJ;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,OAAO;AAAA,QACP;AAAA,QACA,MAAM;AAAA,QACN;AAAA,QACA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAEA,eAAsB,YAAY,SAA+C;AAC/E,MAAI,QAAQ,OAAO,OAAO;AACxB,YAAQ,OAAO,MAAM,0BAAgC;AAAA,EACvD;AAEA,MAAI;AACF,UAAM,WAAW,OAAO,oBAAC,OAAI,aAAa,CAAC,SAAS,QAAQ,CAAE;AAC9D,UAAM,SAAS,cAAc;AAAA,EAC/B,UAAE;AACA,QAAI,QAAQ,OAAO,OAAO;AACxB,cAAQ,OAAO,MAAM,aAAe;AAAA,IACtC;AAAA,EACF;AACF;;;ACptDA,SAAS,YAAY,SAA2C;AAC9D,SAAO,KAAK,MAAM,KAAK,UAAU,OAAO,CAAC;AAC3C;AAEA,SAAS,UAAU,OAAqC;AACtD,SAAO,EAAE,GAAG,MAAM;AACpB;AAEA,SAAS,WAAW,QAAwC;AAC1D,SAAO,KAAK,MAAM,KAAK,UAAU,MAAM,CAAC;AAC1C;AAEA,SAAS,gBAAgB,OAAyB;AAChD,SAAO,MAAM,MAAM,cAAc,KAAK,CAAC;AACzC;AAEA,SAAS,UAAU,OAA0C;AAC3D,UAAQ,SAAS,IAAI,KAAK,EAAE,YAAY;AAC1C;AAEA,SAAS,cACP,UACA,WACA,UACS;AACT,SAAO,SAAS,KAAK,CAAC,YAAY;AAChC,UAAM,QAAQ,UAAU,IAAI,OAAO;AACnC,WACE,UAAU,OAAO,MAAM,YACvB,UAAU,OAAO,IAAI,MAAM,YAC3B,UAAU,OAAO,IAAI,EAAE,QAAQ,QAAQ,GAAG,MAAM;AAAA,EAEpD,CAAC;AACH;AAEA,SAAS,aACP,OACA,OACA,WACS;AACT,QAAM,UAAU,MAAM,KAAK;AAE3B,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB;AAAA,IACrB;AAAA,MACE,MAAM,QAAQ;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,GAAG,MAAM,QAAQ;AAAA,IACnB,EAAE,KAAK,GAAG;AAAA,EACZ;AAEA,SAAO,gBAAgB,OAAO,EAAE,MAAM,CAAC,UAAU;AAC/C,UAAM,UAAU,MAAM,QAAQ,UAAU,EAAE;AAC1C,UAAM,YAAY,QAAQ,QAAQ,GAAG;AAErC,QAAI,cAAc,IAAI;AACpB,aAAO,eAAe,SAAS,UAAU,OAAO,CAAC;AAAA,IACnD;AAEA,UAAM,MAAM,UAAU,QAAQ,MAAM,GAAG,SAAS,CAAC;AACjD,UAAM,QAAQ,UAAU,QAAQ,MAAM,YAAY,CAAC,CAAC;AAEpD,YAAQ,KAAK;AAAA,MACX,KAAK;AACH,eAAO,UAAU,MAAM,QAAQ,WAAW,EAAE,SAAS,KAAK,KAAK,UAAU,MAAM,QAAQ,QAAQ,EAAE,SAAS,KAAK;AAAA,MACjH,KAAK;AACH,eAAO,MAAM,QAAQ,YAAY,KAAK,CAAC,YAAY,UAAU,OAAO,EAAE,SAAS,KAAK,CAAC;AAAA,MACvF,KAAK;AACH,eAAO,UAAU,MAAM,QAAQ,OAAO,EAAE,SAAS,KAAK;AAAA,MACxD,KAAK;AACH,eAAO,cAAc,MAAM,QAAQ,UAAU,WAAW,KAAK;AAAA,MAC/D,KAAK;AACH,YAAI,UAAU,SAAU,QAAO,CAAC,MAAM,QAAQ;AAC9C,YAAI,UAAU,OAAQ,QAAO,MAAM,QAAQ;AAC3C,YAAI,UAAU,UAAW,QAAO,MAAM,QAAQ;AAC9C,eAAO;AAAA,MACT,KAAK;AACH,YAAI,UAAU,aAAc,QAAO,MAAM,QAAQ;AACjD,eAAO;AAAA,MACT;AACE,eAAO,eAAe,SAAS,UAAU,OAAO,CAAC;AAAA,IACrD;AAAA,EACF,CAAC;AACH;AAEA,SAAS,mBACP,UACA,cAAwB,CAAC,GACzB,iBAA2B,CAAC,GAClB;AACV,QAAM,OAAO,SAAS,OAAO,CAAC,YAAY,CAAC,eAAe,SAAS,OAAO,CAAC;AAE3E,aAAW,WAAW,aAAa;AACjC,QAAI,CAAC,KAAK,SAAS,OAAO,GAAG;AAC3B,WAAK,KAAK,OAAO;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,gBAAN,MAA8C;AAAA,EAOnD,YAA6B,SAAsB;AAAtB;AAC3B,SAAK,iBAAiB,OAAO,SAAS,QAAQ,WAAW,EAAE,KAAK;AAEhE,eAAW,SAAS,QAAQ,QAAQ;AAClC,UAAI,MAAM,IAAI;AACZ,aAAK,OAAO,IAAI,MAAM,IAAI,UAAU,KAAK,CAAC;AAAA,MAC5C;AAAA,IACF;AAEA,eAAW,WAAW,QAAQ,UAAU;AACtC,WAAK,SAAS,IAAI,QAAQ,QAAQ,IAAI;AAAA,QACpC,GAAG;AAAA,QACH,SAAS;AAAA,UACP,GAAG,QAAQ;AAAA,UACX,UAAU,CAAC,GAAG,QAAQ,QAAQ,QAAQ;AAAA,QACxC;AAAA,QACA,YAAY,YAAY,QAAQ,UAAU;AAAA,MAC5C,CAAC;AAAA,IACH;AAEA,eAAW,UAAU,QAAQ,SAAS;AACpC,UAAI,OAAO,IAAI;AACb,aAAK,QAAQ,IAAI,OAAO,IAAI,WAAW,MAAM,CAAC;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAAA,EAzB6B;AAAA,EAN7B,OAAO;AAAA,EACU,SAAS,oBAAI,IAA2B;AAAA,EACxC,WAAW,oBAAI,IAA+B;AAAA,EAC9C,UAAU,oBAAI,IAA4B;AAAA,EACnD;AAAA,EA6BR,MAAM,aAAuC;AAC3C,WAAO;AAAA,MACL,cAAc,KAAK,QAAQ;AAAA,MAC3B,WAAW,OAAO,KAAK,cAAc;AAAA,MACrC,eAAe,KAAK,SAAS;AAAA,MAC7B,cAAc,IAAI;AAAA,QAChB,CAAC,GAAG,KAAK,SAAS,OAAO,CAAC,EAAE,IAAI,CAAC,UAAU,MAAM,QAAQ,QAAQ;AAAA,MACnE,EAAE;AAAA,IACJ;AAAA,EACF;AAAA,EAEQ,kBAAkB,OAAqC;AAC7D,UAAM,KAAK,MAAM,MAAM,MAAM,QAAQ;AACrC,UAAM,WAAW,CAAC,GAAG,KAAK,SAAS,OAAO,CAAC,EAAE;AAAA,MAAO,CAAC,UACnD,MAAM,QAAQ,SAAS,SAAS,EAAE;AAAA,IACpC;AAEA,WAAO;AAAA,MACL,GAAG,UAAU,KAAK;AAAA,MAClB,eAAe,SAAS;AAAA,MACxB,gBAAgB,SAAS,OAAO,CAAC,UAAU,CAAC,MAAM,QAAQ,MAAM,EAAE;AAAA,MAClE,cAAc,IAAI,IAAI,SAAS,IAAI,CAAC,UAAU,MAAM,QAAQ,QAAQ,CAAC,EAAE;AAAA,MACvE,eAAe,IAAI;AAAA,QACjB,SACG,OAAO,CAAC,UAAU,CAAC,MAAM,QAAQ,MAAM,EACvC,IAAI,CAAC,UAAU,MAAM,QAAQ,QAAQ;AAAA,MAC1C,EAAE;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,MAAM,aAAkD;AACtD,WAAO;AAAA,MACL,QAAQ,CAAC,GAAG,KAAK,OAAO,OAAO,CAAC,EAAE,IAAI,CAAC,UAAU,KAAK,kBAAkB,KAAK,CAAC;AAAA,IAChF;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,IAAoC;AACjD,UAAM,QAAQ,KAAK,OAAO,IAAI,EAAE;AAEhC,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,yBAAyB,EAAE,EAAE;AAAA,IAC/C;AAEA,WAAO,KAAK,kBAAkB,KAAK;AAAA,EACrC;AAAA,EAEA,MAAM,YAAYK,QAGS;AACzB,UAAM,WAAW,CAAC,GAAG,KAAK,OAAO,OAAO,CAAC,EAAE;AAAA,MACzC,CAAC,UAAU,UAAU,MAAM,IAAI,MAAM,UAAUA,OAAM,IAAI;AAAA,IAC3D;AAEA,QAAI,UAAU;AACZ,aAAO,KAAK,kBAAkB,QAAQ;AAAA,IACxC;AAEA,UAAM,qBACJ,CAAC,GAAG,KAAK,OAAO,OAAO,CAAC,EAAE,OAAO,CAAC,UAAU,MAAM,SAAS,MAAM,EAAE,SAAS;AAC9E,UAAM,UAAyB;AAAA,MAC7B,IAAI,SAAS,kBAAkB;AAAA,MAC/B,MAAMA,OAAM,KAAK,KAAK;AAAA,MACtB,MAAM;AAAA,MACN,OAAOA,OAAM,SAAS;AAAA,IACxB;AACA,SAAK,OAAO,IAAI,QAAQ,IAAc,OAAO;AAC7C,WAAO,KAAK,kBAAkB,OAAO;AAAA,EACvC;AAAA,EAEA,MAAM,oBAAoBA,QAIR;AAChB,eAAW,MAAMA,OAAM,KAAK;AAC1B,YAAM,QAAQ,KAAK,SAAS,IAAI,EAAE;AAElC,UAAI,CAAC,OAAO;AACV;AAAA,MACF;AAEA,YAAM,eAAe;AAAA,QACnB,MAAM,QAAQ;AAAA,QACdA,OAAM;AAAA,QACNA,OAAM;AAAA,MACR;AAEA,YAAM,QAAQ,WAAW;AACzB,YAAM,QAAQ,SAAS,CAAC,aAAa,SAAS,QAAQ;AACtD,YAAM,QAAQ,YAAY,aAAa,SAAS,SAAS;AACzD,YAAM,WAAW,WAAW,CAAC,GAAG,YAAY;AAAA,IAC9C;AAEA,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEA,MAAM,cAAoD;AACxD,SAAK,kBAAkB;AACvB,WAAO;AAAA,MACL,IAAI,aAAa,KAAK,cAAc;AAAA,MACpC,UAAU,eAAe,KAAK,cAAc;AAAA,MAC5C,UAAU,CAAC,MAAM;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,SAIuB;AACxC,UAAM,WAAW,CAAC,GAAG,KAAK,SAAS,OAAO,CAAC,EACxC,OAAO,CAAC,UAAU,aAAa,OAAO,QAAQ,SAAS,IAAI,KAAK,MAAM,CAAC,EACvE,KAAK,CAAC,MAAM,UAAU,MAAM,QAAQ,OAAO,KAAK,QAAQ,IAAI;AAC/D,UAAM,SAAS,QAAQ,YAAY,OAAO,SAAS,QAAQ,WAAW,EAAE,IAAI;AAC5E,UAAM,QAAQ,QAAQ,cAAc;AACpC,UAAM,QAAQ,SAAS,MAAM,QAAQ,SAAS,KAAK;AACnD,UAAM,aAAa,SAAS,MAAM;AAElC,WAAO;AAAA,MACL,UAAU,MAAM,IAAI,CAAC,WAAW;AAAA,QAC9B,IAAI,MAAM,QAAQ;AAAA,QAClB,UAAU,MAAM,QAAQ;AAAA,MAC1B,EAAE;AAAA,MACF,eAAe,aAAa,SAAS,SAAS,OAAO,UAAU,IAAI;AAAA,MACnE,oBAAoB,SAAS;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,SAEY;AAC3B,UAAM,QAAQ,KAAK,SAAS,IAAI,QAAQ,EAAE;AAE1C,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,2BAA2B,QAAQ,EAAE,EAAE;AAAA,IACzD;AAEA,WAAO,YAAY,MAAM,UAAU;AAAA,EACrC;AAAA,EAEA,MAAM,UAAU,IAAqC;AACnD,UAAM,WAAW,CAAC,GAAG,KAAK,SAAS,OAAO,CAAC,EACxC,OAAO,CAAC,UAAU,MAAM,QAAQ,aAAa,EAAE,EAC/C,KAAK,CAAC,MAAM,UAAU,KAAK,QAAQ,OAAO,MAAM,QAAQ,IAAI,EAC5D,IAAI,CAAC,UAAU,YAAY,MAAM,UAAU,CAAC;AAE/C,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,cAAgD;AACpD,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,WAAW,OAAO,KAAK,cAAc;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,MAAM,cAAoD;AACxD,WAAO;AAAA,MACL,QAAQ,CAAC,GAAG,KAAK,QAAQ,OAAO,CAAC,EAAE,IAAI,CAAC,WAAW,WAAW,MAAM,CAAC;AAAA,IACvE;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,IAAqC;AACnD,UAAM,SAAS,KAAK,QAAQ,IAAI,EAAE;AAElC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,0BAA0B,EAAE,EAAE;AAAA,IAChD;AAEA,WAAO,WAAW,MAAM;AAAA,EAC1B;AAAA,EAEA,MAAM,aAAa,QAGS;AAC1B,UAAM,UAA0B;AAAA,MAC9B,IAAI,eAAe,KAAK,QAAQ,OAAO,CAAC;AAAA,MACxC,UAAU,OAAO;AAAA,MACjB,QAAQ,OAAO;AAAA,IACjB;AACA,SAAK,QAAQ,IAAI,QAAQ,IAAc,OAAO;AAC9C,WAAO,WAAW,OAAO;AAAA,EAC3B;AAAA,EAEA,MAAM,aAAa,IAA2B;AAC5C,QAAI,CAAC,KAAK,QAAQ,OAAO,EAAE,GAAG;AAC5B,YAAM,IAAI,MAAM,0BAA0B,EAAE,EAAE;AAAA,IAChD;AAAA,EACF;AACF;AAEO,SAAS,oBAAoB,SAAsC;AACxE,SAAO,IAAI,cAAc,OAAO;AAClC;;;AC3VO,IAAM,qBAAqB;AAClC,IAAM,cAAc;AAAA,EAClB,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AACb;AAkGA,IAAM,gBAAiC;AAAA,EACrC,EAAE,IAAI,SAAS,MAAM,SAAS,MAAM,SAAS;AAAA,EAC7C,EAAE,IAAI,UAAU,MAAM,UAAU,MAAM,SAAS;AAAA,EAC/C,EAAE,IAAI,WAAW,MAAM,WAAW,MAAM,SAAS;AAAA,EACjD,EAAE,IAAI,QAAQ,MAAM,QAAQ,MAAM,SAAS;AAAA,EAC3C,EAAE,IAAI,SAAS,MAAM,UAAU,MAAM,SAAS;AAAA,EAC9C,EAAE,IAAI,QAAQ,MAAM,QAAQ,MAAM,SAAS;AAAA,EAC3C,EAAE,IAAI,SAAS,MAAM,SAAS,MAAM,SAAS;AAAA,EAC7C,EAAE,IAAI,oBAAoB,MAAM,WAAW,MAAM,SAAS;AAAA,EAC1D,EAAE,IAAI,uBAAuB,MAAM,cAAc,MAAM,SAAS;AAClE;AAEA,IAAM,cAA+B;AAAA,EACnC,GAAG;AAAA,EACH,EAAE,IAAI,YAAY,UAAU,MAAM,YAAY,MAAM,OAAO;AAAA,EAC3D,EAAE,IAAI,YAAY,WAAW,MAAM,cAAc,MAAM,OAAO;AAAA,EAC9D,EAAE,IAAI,YAAY,WAAW,MAAM,aAAa,MAAM,OAAO;AAC/D;AAEA,IAAM,UAAwB;AAAA,EAC5B,EAAE,KAAK,UAAU,MAAM,UAAU,OAAO,4BAA4B,OAAO,IAAI,QAAQ,EAAE;AAAA,EACzF,EAAE,KAAK,UAAU,MAAM,UAAU,OAAO,uBAAuB,OAAO,IAAI,QAAQ,EAAE;AAAA,EACpF,EAAE,KAAK,OAAO,MAAM,qBAAqB,OAAO,0BAA0B,OAAO,IAAI,QAAQ,GAAG;AAAA,EAChG,EAAE,KAAK,UAAU,MAAM,UAAU,OAAO,4BAA4B,OAAO,IAAI,QAAQ,EAAE;AAAA,EACzF,EAAE,KAAK,UAAU,MAAM,UAAU,OAAO,4BAA4B,OAAO,IAAI,QAAQ,EAAE;AAAA,EACzF,EAAE,KAAK,SAAS,MAAM,cAAc,OAAO,0BAA0B,OAAO,GAAG,QAAQ,EAAE;AAAA,EACzF,EAAE,KAAK,OAAO,MAAM,gBAAgB,OAAO,4BAA4B,OAAO,GAAG,QAAQ,EAAE;AAAA,EAC3F,EAAE,KAAK,cAAc,MAAM,qBAAqB,OAAO,+BAA+B,OAAO,IAAI,QAAQ,IAAI,oBAAoB,KAAK;AAAA,EACtI,EAAE,KAAK,MAAM,MAAM,sBAAsB,OAAO,iCAAiC,OAAO,IAAI,QAAQ,IAAI,oBAAoB,KAAK;AAAA,EACjI,EAAE,KAAK,UAAU,MAAM,UAAU,OAAO,sBAAsB,OAAO,GAAG,QAAQ,EAAE;AAAA,EAClF,EAAE,KAAK,WAAW,MAAM,WAAW,OAAO,wBAAwB,OAAO,GAAG,QAAQ,EAAE;AAAA,EACtF,EAAE,KAAK,UAAU,MAAM,cAAc,OAAO,sBAAsB,OAAO,GAAG,QAAQ,EAAE;AAAA,EACtF,EAAE,KAAK,SAAS,MAAM,aAAa,OAAO,yBAAyB,OAAO,GAAG,QAAQ,EAAE;AAAA,EACvF,EAAE,KAAK,OAAO,MAAM,OAAO,OAAO,qBAAqB,OAAO,GAAG,QAAQ,EAAE;AAAA,EAC3E,EAAE,KAAK,SAAS,MAAM,SAAS,OAAO,0BAA0B,OAAO,GAAG,QAAQ,EAAE;AACtF;AAEA,IAAM,oBAAiC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,UAAU,MAA4B;AAC7C,MAAI,QAAQ,SAAS;AACrB,SAAO,MAAM;AACX,YAAS,QAAQ,UAAU,eAAgB;AAC3C,WAAO,QAAQ;AAAA,EACjB;AACF;AAEA,SAAS,gBAAgB,OAAuB;AAC9C,SAAO,OAAO,KAAK,OAAO,MAAM,EAC7B,SAAS,QAAQ,EACjB,QAAQ,OAAO,GAAG,EAClB,QAAQ,OAAO,GAAG,EAClB,QAAQ,QAAQ,EAAE;AACvB;AAEA,SAAS,gBAAgB,KAAa,OAAyB;AAC7D,QAAM,aAAuB,CAAC;AAC9B,QAAM,SAAS;AAAA,IACb,EAAE,OAAO,IAAI,YAAY,KAAK,UAAU,GAAG;AAAA,IAC3C,EAAE,OAAO,IAAI,YAAY,IAAI,UAAU,GAAG;AAAA,IAC1C,EAAE,OAAO,IAAI,YAAY,IAAI,UAAU,IAAI;AAAA,IAC3C,EAAE,OAAO,QAAQ,IAAI,YAAY,KAAK,UAAU,IAAI;AAAA,EACtD;AAEA,aAAW,SAAS,QAAQ;AAC1B,aAAS,QAAQ,GAAG,QAAQ,MAAM,OAAO,SAAS,GAAG;AACnD,YAAM,QAAQ,MAAM,UAAU,IAAI,IAAI,SAAS,MAAM,QAAQ;AAC7D,YAAM,cAAc,MAAM,aAAa,SAAS,MAAM,WAAW,MAAM;AACvE,iBAAW,KAAK,MAAM,KAAK,MAAM,cAAc,KAAK,KAAK,GAAI,CAAC;AAAA,IAChE;AAAA,EACF;AAEA,SAAO,WAAW,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AACxC;AAEA,SAAS,aACP,WACA,WACA,KACW;AACX,QAAM,YAAY,kBAAkB,SAAS;AAE7C,MAAI,cAAc,UAAU,IAAI,SAAS,KAAK,KAAK,GAAG;AACpD,cAAU,IAAI,YAAY,UAAU,IAAI,SAAS,KAAK,KAAK,CAAC;AAC5D,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,CAAC,GAAG,UAAU,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,QAAQ,CAAC;AACzE,QAAM,cAAc,SAAS,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,MAAM,MAAM,OAAO,CAAC;AACtE,MAAI,SAAS,IAAI,IAAI;AAErB,aAAW,CAAC,KAAK,KAAK,KAAK,UAAU;AACnC,cAAU;AAEV,QAAI,UAAU,GAAG;AACf,gBAAU,IAAI,KAAK,QAAQ,CAAC;AAC5B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,WAAW,SAAS,SAAS,SAAS,CAAC,IAAI,CAAC;AAElD,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC5D;AAEA,YAAU,IAAI,WAAW,UAAU,IAAI,QAAQ,KAAK,KAAK,CAAC;AAC1D,SAAO;AACT;AAEA,SAAS,WAAW,WAAsB,UAA0B;AAClE,UAAQ,WAAW;AAAA,IACjB,KAAK;AACH,aAAO;AAAA,QACL,6DAA6D,WAAW,CAAC;AAAA,QACzE,6DAA6D,WAAW,CAAC;AAAA,QACzE,6CAA6C,WAAW,CAAC;AAAA,QACzD,2DAA2D,WAAW,CAAC;AAAA,MACzE,EAAE,WAAW,CAAC;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,WAAW,CAAC;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,WAAW,CAAC;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,WAAW,CAAC;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,WAAW,CAAC;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,WAAW,CAAC;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,WAAW,CAAC;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,WAAW,CAAC;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,WAAW,CAAC;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,WAAW,CAAC;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,WAAW,CAAC;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,WAAW,CAAC;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,WAAW,CAAC;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,WAAW,CAAC;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,WAAW,CAAC;AAAA,EAClB;AACF;AAEA,SAAS,UAAU,QAAoB,SAAiB,UAA0B;AAChF,UAAQ,OAAO,KAAK;AAAA,IAClB,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,6BAA6B,WAAW,CAAC;AAAA,QACzC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO;AAAA,MACT,EAAE,KAAK,IAAI;AAAA,IACb;AACE,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,GAAG,OAAO,IAAI;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,EACf;AACF;AAEA,SAAS,gBAAgB,WAAsB,QAAiB,UAA4B;AAC1F,QAAMC,UAAS,CAAC,OAAO;AAEvB,MAAI,QAAQ;AACV,IAAAA,QAAO,KAAK,QAAQ;AAAA,EACtB;AAEA,UAAQ,WAAW;AAAA,IACjB,KAAK;AAAA,IACL,KAAK;AACH,MAAAA,QAAO,KAAK,kBAAkB;AAC9B;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,MAAAA,QAAO,KAAK,YAAY,QAAQ;AAChC;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,UAAI,aAAa,GAAG;AAClB,QAAAA,QAAO,KAAK,YAAY,SAAS;AAAA,MACnC;AACA;AAAA,IACF,KAAK;AACH,UAAI,WAAW,GAAG;AAChB,QAAAA,QAAO,KAAK,YAAY,SAAS;AAAA,MACnC;AACA;AAAA,IACF,KAAK;AACH,MAAAA,QAAO,KAAK,YAAY,SAAS;AACjC;AAAA,EACJ;AAEA,SAAO,MAAM,KAAK,IAAI,IAAIA,OAAM,CAAC;AACnC;AAEA,SAAS,gBAAgB,QAAsB,UAAmC;AAChF,SAAO;AAAA,IACL,IAAI,OAAO;AAAA,IACX,UAAU,OAAO;AAAA,IACjB,SAAS,OAAO;AAAA,IAChB,cAAc,OAAO,OAAO,IAAI;AAAA,IAChC,UAAU,OAAO;AAAA,IACjB,cAAc,OAAO;AAAA,IACrB,SAAS;AAAA,MACP,UAAU;AAAA,MACV,SAAS;AAAA,QACP,EAAE,MAAM,QAAQ,OAAO,GAAG,OAAO,QAAQ,KAAK,OAAO,WAAW,IAAI;AAAA,QACpE,EAAE,MAAM,MAAM,OAAO,OAAO,YAAY,KAAK,IAAI,EAAE;AAAA,QACnD,EAAE,MAAM,WAAW,OAAO,OAAO,QAAQ;AAAA,QACzC,EAAE,MAAM,QAAQ,OAAO,IAAI,KAAK,OAAO,IAAI,EAAE,YAAY,EAAE;AAAA,QAC3D,GAAI,OAAO,kBACP,CAAC,EAAE,MAAM,oBAAoB,OAAO,OAAO,gBAAgB,CAAC,IAC5D,CAAC;AAAA,MACP;AAAA,MACA,OAAO;AAAA,QACL;AAAA,UACE,UAAU;AAAA,UACV,UAAU;AAAA,UACV,MAAM;AAAA,YACJ,MAAM,gBAAgB,QAAQ;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,aACP,QACA,UACA,MACmB;AACnB,QAAM,UAAU,WAAW,OAAO,KAAK,QAAQ;AAC/C,QAAM,WAAW,UAAU,QAAQ,SAAS,QAAQ;AACpD,QAAM,SAAS,WAAW,OAAO;AACjC,QAAM,WAAW,gBAAgB,OAAO,KAAK,QAAQ,QAAQ;AAC7D,QAAM,UAAwB;AAAA,IAC5B,IAAI,QAAQ,OAAO,GAAG,IAAI,OAAO,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,IAC/D,UAAU,UAAU,OAAO,GAAG,IAAI,KAAK,MAAM,WAAW,CAAC,IAAI,CAAC;AAAA,IAC9D,aAAa,OAAO;AAAA,IACpB,UAAU,OAAO;AAAA,IACjB,aAAa,CAAC,kBAAkB;AAAA,IAChC;AAAA,IACA,SAAS,SAAS,MAAM,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,MAAM,GAAG,GAAG;AAAA,IAChE;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,WACG,OAAO,QAAQ,WAAW,aAAa,KACvC,OAAO,QAAQ,YAAY,aAAa,KACxC,OAAO,QAAQ,YAAY,aAAa;AAAA,IAC3C;AAAA,IACA,cAAc,OAAO,WAAW;AAAA,IAChC,gBAAgB,OAAO,QAAQ,YAAY,OAAO,QAAQ;AAAA,IAC1D,iBAAiB,OAAO,qBACpB,uBAAuB,OAAO,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC,MACjD;AAAA,EACN;AAEA,SAAO;AAAA,IACL,WAAW,OAAO;AAAA,IAClB;AAAA,IACA,YAAY,gBAAgB,SAAS,QAAQ;AAAA,IAC7C;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,KAA+B;AACtD,SAAO;AAAA,IACL;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAY;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,UACR;AAAA,YACE,OAAO;AAAA,YACP,QAAQ,CAAC,uBAAuB,sBAAsB,sBAAsB;AAAA,UAC9E;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,UAAU,CAAC,WAAW,WAAW,oBAAoB;AAAA,UACvD;AAAA,QACF;AAAA,MACF;AAAA,MACA,SAAS,CAAC,EAAE,MAAM,SAAS,OAAO,WAAW,CAAC;AAAA,MAC9C,UAAU;AAAA,MACV,YAAY,MAAM,IAAI,KAAK,KAAK,KAAK;AAAA,MACrC,WAAW,MAAM,IAAI,KAAK,KAAK,KAAK;AAAA,IACtC;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAY;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,UACR;AAAA,YACE,OAAO;AAAA,YACP,QAAQ,CAAC,+BAA+B,+BAA+B;AAAA,UACzE;AAAA,QACF;AAAA,MACF;AAAA,MACA,SAAS,CAAC,EAAE,MAAM,UAAU,GAAG,EAAE,MAAM,YAAY,CAAC;AAAA,MACpD,UAAU;AAAA,MACV,YAAY,MAAM,IAAI,KAAK,KAAK,KAAK;AAAA,MACrC,WAAW,MAAM,IAAI,KAAK,KAAK,KAAK;AAAA,IACtC;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAY;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,UACR;AAAA,YACE,OAAO;AAAA,YACP,QAAQ,CAAC,wBAAwB;AAAA,UACnC;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,UAAU,CAAC,WAAW,aAAa;AAAA,UACrC;AAAA,QACF;AAAA,MACF;AAAA,MACA,SAAS,CAAC,EAAE,MAAM,SAAS,OAAO,aAAa,CAAC;AAAA,MAChD,UAAU;AAAA,MACV,YAAY,MAAM,IAAI,KAAK,KAAK,KAAK;AAAA,MACrC,WAAW,MAAM,IAAI,KAAK,KAAK,KAAK;AAAA,IACtC;AAAA,EACF;AACF;AAEA,SAAS,QAAQ,UAA+B,WAAsB,OAAyB;AAC7F,SAAO,SACJ,OAAO,CAAC,UAAU,MAAM,cAAc,SAAS,EAC/C,MAAM,GAAG,KAAK,EACd,IAAI,CAAC,UAAU,MAAM,QAAQ,EAAE;AACpC;AAEA,SAAS,qBACP,KACA,UACuD;AACvD,QAAM,aAAa;AAAA,IACjB,GAAG,QAAQ,UAAU,UAAU,CAAC;AAAA,IAChC,GAAG,QAAQ,UAAU,UAAU,CAAC;AAAA,IAChC,GAAG,QAAQ,UAAU,WAAW,CAAC;AAAA,EACnC;AACA,QAAM,gBAAgB;AAAA,IACpB,GAAG,QAAQ,UAAU,cAAc,CAAC;AAAA,IACpC,GAAG,QAAQ,UAAU,MAAM,CAAC;AAAA,EAC9B;AACA,QAAM,YAAY;AAAA,IAChB,GAAG,QAAQ,UAAU,SAAS,CAAC;AAAA,IAC/B,GAAG,QAAQ,UAAU,OAAO,CAAC;AAAA,IAC7B,GAAG,QAAQ,UAAU,UAAU,CAAC;AAAA,EAClC;AAEA,QAAM,gBAA0C;AAAA,IAC9C;AAAA,MACE,IAAI;AAAA,MACJ,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,kBAAkB,CAAC,EAAE,MAAM,SAAS,OAAO,WAAW,CAAC;AAAA,MACvD,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,WAAW,MAAM,IAAI,KAAK,KAAK,KAAK;AAAA,MACpC,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,kBAAkB,CAAC,EAAE,MAAM,SAAS,OAAO,WAAW,CAAC;AAAA,MACvD,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,WAAW,MAAM,IAAI,KAAK,KAAK,KAAK,MAAO,KAAK,KAAK;AAAA,MACrD,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,kBAAkB,CAAC,EAAE,MAAM,UAAU,GAAG,EAAE,MAAM,YAAY,CAAC;AAAA,MAC7D,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,WAAW,MAAM,KAAK,KAAK,KAAK;AAAA,MAChC,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,kBAAkB,CAAC,EAAE,MAAM,YAAY,CAAC;AAAA,MACxC,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,WAAW,MAAM,IAAI,KAAK,KAAK;AAAA,MAC/B,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,kBAAkB,CAAC,EAAE,MAAM,UAAU,GAAG,EAAE,MAAM,YAAY,CAAC;AAAA,MAC7D,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,WAAW,MAAM,IAAI,KAAK,KAAK;AAAA,MAC/B,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,iBAA4C;AAAA,IAChD,GAAG,WAAW,IAAI,CAAC,SAAS,WAAW;AAAA,MACrC,IAAI,uBAAuB,QAAQ,CAAC;AAAA,MACpC,OAAO;AAAA,MACP;AAAA,MACA,QAAQ;AAAA,MACR,gBAAgB,CAAC,EAAE,MAAM,SAAS,OAAO,WAAW,CAAC;AAAA,MACrD,gBAAgB,CAAC,OAAO;AAAA,MACxB,eAAe,CAAC,SAAS,YAAY,QAAQ;AAAA,MAC7C,cAAc;AAAA,MACd,YAAY,MAAM,IAAI,KAAK,KAAK,KAAK,MAAO,QAAQ,KAAK;AAAA,MACzD,UAAU;AAAA,IACZ,EAAE;AAAA,IACF,GAAG,WAAW,IAAI,CAAC,SAAS,WAAW;AAAA,MACrC,IAAI,sBAAsB,QAAQ,CAAC;AAAA,MACnC,OAAO;AAAA,MACP;AAAA,MACA,QAAQ;AAAA,MACR,gBAAgB,CAAC,EAAE,MAAM,SAAS,OAAO,WAAW,CAAC;AAAA,MACrD,gBAAgB,CAAC,OAAO;AAAA,MACxB,eAAe,CAAC,SAAS,YAAY,QAAQ;AAAA,MAC7C,cAAc;AAAA,MACd,YAAY,MAAM,IAAI,KAAK,KAAK,KAAK,MAAO,KAAK,KAAK,MAAO,QAAQ,KAAK;AAAA,MAC1E,UAAU;AAAA,IACZ,EAAE;AAAA,IACF,GAAG,cAAc,IAAI,CAAC,SAAS,WAAW;AAAA,MACxC,IAAI,0BAA0B,QAAQ,CAAC;AAAA,MACvC,OAAO;AAAA,MACP;AAAA,MACA,QAAQ;AAAA,MACR,gBAAgB,CAAC,EAAE,MAAM,UAAU,GAAG,EAAE,MAAM,YAAY,CAAC;AAAA,MAC3D,gBAAgB,CAAC,SAAS,QAAQ;AAAA,MAClC,eAAe,CAAC;AAAA,MAChB,cAAc;AAAA,MACd,YAAY,MAAM,KAAK,KAAK,KAAK,MAAO,QAAQ,KAAK;AAAA,MACrD,UAAU;AAAA,IACZ,EAAE;AAAA,IACF,GAAG,UAAU,IAAI,CAAC,SAAS,WAAW;AAAA,MACpC,IAAI,oBAAoB,QAAQ,CAAC;AAAA,MACjC,OAAO;AAAA,MACP;AAAA,MACA,QAAQ;AAAA,MACR,gBAAgB,CAAC,EAAE,MAAM,YAAY,CAAC;AAAA,MACtC,gBAAgB,CAAC,SAAS,QAAQ;AAAA,MAClC,eAAe,CAAC,OAAO;AAAA,MACvB,cAAc;AAAA,MACd,YAAY,MAAM,IAAI,KAAK,KAAK,MAAO,QAAQ,KAAK;AAAA,MACpD,UAAU;AAAA,IACZ,EAAE;AAAA,IACF,GAAG,cAAc,IAAI,CAAC,SAAS,WAAW;AAAA,MACxC,IAAI,yBAAyB,QAAQ,CAAC;AAAA,MACtC,OAAO;AAAA,MACP;AAAA,MACA,QAAQ;AAAA,MACR,gBAAgB,CAAC,EAAE,MAAM,UAAU,GAAG,EAAE,MAAM,YAAY,CAAC;AAAA,MAC3D,gBAAgB,CAAC,SAAS,QAAQ;AAAA,MAClC,eAAe,CAAC;AAAA,MAChB,cAAc;AAAA,MACd,YAAY,MAAM,IAAI,KAAK,KAAK,MAAO,QAAQ,KAAK;AAAA,MACpD,UAAU;AAAA,IACZ,EAAE;AAAA,EACJ;AAEA,SAAO,EAAE,eAAe,eAAe;AACzC;AAEA,SAAS,sBAAsB,UAAuD;AACpF,QAAM,UAAU;AAAA,IACd;AAAA,MACE,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,SAAO,QAAQ,IAAI,CAAC,QAAQ,UAAU;AACpC,UAAM,WAAW,SAAS,OAAO,CAAC,UAAU,MAAM,QAAQ,gBAAgB,OAAO,KAAK;AAEtF,WAAO;AAAA,MACL,IAAI,cAAc,QAAQ,CAAC;AAAA,MAC3B,OAAO,OAAO;AAAA,MACd,MAAM,OAAO;AAAA,MACb,cAAc,SAAS;AAAA,MACvB,aAAa,SAAS,OAAO,CAAC,UAAU,CAAC,MAAM,QAAQ,MAAM,EAAE;AAAA,MAC/D,QAAQ;AAAA,MACR,iBAAiB,SAAS,CAAC,GAAG,QAAQ,mBAAmB;AAAA,MACzD,iBAAiB,OAAO;AAAA,MACxB,WAAW,SAAS,SAAS,SAAS,CAAC,GAAG,QAAQ,QAAQ,KAAK,IAAI;AAAA,MACnE,UAAU,SAAS,CAAC,GAAG,QAAQ,QAAQ,KAAK,IAAI;AAAA,IAClD;AAAA,EACF,CAAC;AACH;AAEO,SAAS,iBAAiB,eAAuB,KAAK,IAAI,GAAgB;AAC/E,QAAM,aAAa,gBAAgB,cAAc,GAAG;AACpD,QAAM,YAAY,IAAI;AAAA,IACpB,QAAQ,IAAI,CAAC,WAAW,CAAC,OAAO,KAAK,OAAO,KAAK,CAAC;AAAA,EACpD;AACA,QAAM,mBAAmB,oBAAI,IAAuB;AACpD,QAAM,cAAc,IAAI,IAAI,QAAQ,IAAI,CAAC,WAAW,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC;AACzE,QAAM,MAAM,UAAU,EAAE;AACxB,QAAM,WAAgC,CAAC;AAEvC,WAAS,QAAQ,GAAG,QAAQ,WAAW,QAAQ,SAAS,GAAG;AACzD,UAAM,YAAY,aAAa,OAAO,WAAW,GAAG;AACpD,UAAM,SAAS,YAAY,IAAI,SAAS;AAExC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,gCAAgC,SAAS,EAAE;AAAA,IAC7D;AAEA,UAAM,WAAW,iBAAiB,IAAI,SAAS,KAAK;AACpD,aAAS,KAAK,aAAa,QAAQ,UAAU,WAAW,KAAK,KAAK,YAAY,CAAC;AAC/E,qBAAiB,IAAI,WAAW,WAAW,CAAC;AAAA,EAC9C;AAEA,WAAS,KAAK,CAAC,MAAM,UAAU,MAAM,QAAQ,OAAO,KAAK,QAAQ,IAAI;AAErE,QAAMC,SAAQ,gBAAgB,YAAY;AAC1C,QAAM,EAAE,eAAe,eAAe,IAAI,qBAAqB,cAAc,QAAQ;AAErF,SAAO;AAAA,IACL,cAAc;AAAA,IACd,WAAW;AAAA,IACX,QAAQ,YAAY,IAAI,CAAC,WAAW,EAAE,GAAG,MAAM,EAAE;AAAA,IACjD;AAAA,IACA,OAAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,sBAAsB,QAAQ;AAAA,IAC3C,SAAS,CAAC;AAAA,EACZ;AACF;AAEO,SAAS,aACd,QACA,eAAuB,KAAK,IAAI,GACnB;AACb,QAAM,UAAU,iBAAiB,YAAY;AAE7C,SAAO,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAMX;AAED,QAAM,cAAc,OAAO,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,GAKlC;AACD,QAAM,aAAa,OAAO,QAAQ;AAAA;AAAA;AAAA;AAAA,GAIjC;AACD,QAAM,YAAY,OAAO,QAAQ;AAAA;AAAA;AAAA;AAAA,GAIhC;AACD,QAAM,aAAa,OAAO,QAAQ;AAAA;AAAA;AAAA;AAAA,GAIjC;AACD,QAAM,mBAAmB,OAAO,QAAQ;AAAA;AAAA;AAAA;AAAA,GAIvC;AAED,QAAM,cAAc,OAAO,YAAY,MAAM;AAC3C,eAAW,SAAS,QAAQ,UAAU;AACpC,kBAAY;AAAA,QACV,MAAM,QAAQ;AAAA,QACd,MAAM,QAAQ;AAAA,QACd,MAAM,QAAQ;AAAA,QACd,MAAM,QAAQ;AAAA,QACd,KAAK,UAAU,MAAM,QAAQ,WAAW;AAAA,QACxC,MAAM,QAAQ;AAAA,QACd,MAAM,QAAQ;AAAA,QACd,MAAM,QAAQ;AAAA,QACd,MAAM,QAAQ,SAAS,IAAI;AAAA,QAC3B,MAAM,QAAQ,YAAY,IAAI;AAAA,QAC9B,KAAK,UAAU,MAAM,QAAQ,QAAQ;AAAA,QACrC,MAAM,QAAQ;AAAA,QACd,MAAM,QAAQ,iBAAiB,IAAI;AAAA,QACnC,MAAM,QAAQ;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAEA,eAAW,QAAQ,QAAQ,OAAO;AAChC,iBAAW;AAAA,QACT,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK,UAAU,IAAI;AAAA,QACnB,KAAK;AAAA,QACL,KAAK,UAAU,KAAK,UAAU;AAAA,QAC9B,KAAK,UAAU,KAAK,OAAO;AAAA,QAC3B,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AAAA,IACF;AAEA,eAAW,OAAO,QAAQ,eAAe;AACvC,gBAAU;AAAA,QACR,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI,SAAS,IAAI;AAAA,QACjB,KAAK,UAAU,IAAI,gBAAgB;AAAA,QACnC,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MACN;AAAA,IACF;AAEA,eAAW,QAAQ,QAAQ,gBAAgB;AACzC,iBAAW;AAAA,QACT,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK,UAAU,KAAK,cAAc;AAAA,QAClC,KAAK,UAAU,KAAK,cAAc;AAAA,QAClC,KAAK,UAAU,KAAK,aAAa;AAAA,QACjC,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AAAA,IACF;AAEA,eAAW,cAAc,QAAQ,aAAa;AAC5C,uBAAiB;AAAA,QACf,WAAW;AAAA,QACX,WAAW;AAAA,QACX,WAAW;AAAA,QACX,WAAW;AAAA,QACX,WAAW;AAAA,QACX,WAAW;AAAA,QACX,WAAW;AAAA,QACX,WAAW;AAAA,QACX,WAAW;AAAA,QACX,WAAW;AAAA,MACb;AAAA,IACF;AAEA,WACG;AAAA,MACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAYF,EACC;AAAA,MACC,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,eAAe,IAAI,KAAK,KAAK;AAAA,MAC7B,eAAe,IAAI,KAAK;AAAA,MACxB,QAAQ,SAAS;AAAA,IACnB;AAAA,EACJ,CAAC;AAED,cAAY;AACZ,SAAO;AACT;;;AHr/BA,IAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,eAAe,uBAAuB,UAAiC;AACrE,QAAM,aAAa;AAAA,IACjB,IAAI,IAAI,yBAAyB,YAAY,GAAG;AAAA,EAClD;AACA,QAAM,aAAa,KAAK,UAAU,cAAc;AAChD,QAAM,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AACzC,QAAM,UAAU,YAAY,MAAM,SAAS,YAAY,MAAM,GAAG,MAAM;AACxE;AAEA,eAAsB,iBAAgC;AACpD,QAAM,cAAc,OAAO;AAAA,IACzB,cAAc,IAAI,CAAC,QAAQ,CAAC,KAAK,QAAQ,IAAI,GAAG,CAAC,CAAC;AAAA,EACpD;AACA,QAAM,UAAU,MAAM,QAAQ,KAAK,OAAO,GAAG,gBAAgB,CAAC;AAC9D,QAAM,SAAS,KAAK,SAAS,SAAS;AACtC,QAAM,WAAW,KAAK,SAAS,OAAO;AACtC,QAAM,aAAa,KAAK,SAAS,aAAa;AAC9C,QAAM,eAAe,KAAK,IAAI;AAE9B,UAAQ,IAAI,oBAAoB;AAChC,UAAQ,IAAI,mBAAmB;AAC/B,UAAQ,IAAI,qBAAqB;AACjC,UAAQ,IAAI,uBAAuB;AACnC,UAAQ,IAAI,mBAAmB;AAC/B,UAAQ,IAAI,uBAAuB;AACnC,UAAQ,IAAI,sBAAsB;AAElC,MAAI;AACF,UAAM,MAAM,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AACpD,UAAM,uBAAuB,QAAQ;AAErC,iBAAa,MAAM;AACnB,UAAM,SAAS,UAAU,MAAM;AAC/B,UAAM,UAAU,aAAa,QAAQ,YAAY;AACjD,UAAM,WAAW,YAAY;AAAA,MAC3B,aAAa;AAAA,MACb,cAAc;AAAA,MACd,YAAY,eAAe,MAAM,KAAK,KAAK,KAAK;AAAA,MAChD,OAAO;AAAA,IACT,CAAC;AAED,UAAM,SAAS,WAAW;AAC1B,8BAA0B,OAAO,SAAS,oBAAoB,OAAO,CAAC;AACtE,UAAM,WAAW,EAAE,QAAQ,cAAc,KAAK,CAAC;AAC/C,UAAM,YAAY,EAAE,QAAQ,KAAK,CAAC;AAAA,EACpC,UAAE;AACA,QAAI;AACF,kCAA4B,OAAO;AACnC,cAAQ,MAAM;AACd,YAAM,GAAG,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IACpD,UAAE;AACA,iBAAW,OAAO,eAAe;AAC/B,cAAM,QAAQ,YAAY,GAAG;AAE7B,YAAI,UAAU,QAAW;AACvB,iBAAO,QAAQ,IAAI,GAAG;AAAA,QACxB,OAAO;AACL,kBAAQ,IAAI,GAAG,IAAI;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AIxFA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,cAAAC,aAAY,gBAAAC,eAAc,iBAAAC,sBAAqB;AACxD,SAAS,eAAe;;;ACbxB,SAAS,iBAAiB;AAC1B,OAAO,UAAU;AASjB,SAAS,UAAU,MAAgB,eAAwB,OAA4B;AACrF,QAAM,SAAS,UAAU,UAAU,MAAM;AAAA,IACvC,UAAU;AAAA,IACV,OAAO,eAAe,YAAY;AAAA,EACpC,CAAC;AAED,MAAI,OAAO,OAAO;AAChB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO,OAAO,MAAM;AAAA,IACtB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS,OAAO,WAAW;AAAA,IAC3B,QAAQ,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS;AAAA,IAC5D,QAAQ,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS;AAAA,EAC9D;AACF;AAEA,SAAS,eAAe,OAA8B;AACpD,QAAM,UAAU,MAAM,KAAK;AAE3B,MAAI,CAAC,WAAW,YAAY,WAAW;AACrC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,uBAAgC;AAC9C,SAAO,UAAU,CAAC,WAAW,CAAC,EAAE;AAClC;AAEO,SAAS,yBAAwC;AACtD,QAAM,SAAS,UAAU;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO;AAAA,EACT;AAEA,SAAO,eAAe,OAAO,MAAM;AACrC;AAEO,SAAS,2BAAoC;AAClD,SAAO,uBAAuB,MAAM;AACtC;AAEO,SAAS,qBAA2D;AACzE,QAAM,SAAS,UAAU,CAAC,QAAQ,OAAO,GAAG,IAAI;AAChD,SAAO,OAAO,UAAU,EAAE,SAAS,KAAK,IAAI,EAAE,SAAS,OAAO,OAAO,OAAO,SAAS,OAAO,UAAU,4BAA4B;AACpI;AAEO,SAAS,mBAAkC;AAChD,QAAM,SAAS,UAAU,CAAC,UAAU,aAAa,WAAW,SAAS,CAAC;AAEtE,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO;AAAA,EACT;AAEA,SAAO,eAAe,OAAO,MAAM;AACrC;AAEO,SAAS,UAAU,WAAmB,KAAmD;AAC9F,QAAM,SAAS,UAAU,CAAC,YAAY,UAAU,KAAK,aAAa,SAAS,CAAC;AAE5E,MAAI,OAAO,SAAS;AAClB,WAAO,EAAE,SAAS,KAAK;AAAA,EACzB;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,OAAO,eAAe,OAAO,MAAM,KAAK,eAAe,OAAO,MAAM,KAAK,OAAO,SAAS,oBAAoB,GAAG;AAAA,EAClH;AACF;AAEO,SAAS,YAAY,KAAmB;AAC7C,OAAK,KAAK,KAAK;AAAA,IACb,MAAM;AAAA,IACN,aAAa;AAAA,EACf,CAAC,EAAE,MAAM,MAAM;AAAA,EAEf,CAAC;AACH;;;ACpGA,SAAS,YAAY,cAAc,qBAAqB;AACxD,SAAS,WAAAC,gBAAe;AAkBxB,SAAS,iBAAiB,YAAkC;AAC1D,MAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,MAAM,aAAa,YAAY,MAAM;AAC3C,QAAM,SAAS,KAAK,MAAM,GAAG;AAE7B,MAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAClE,UAAM,IAAI,MAAM,0BAA0B,UAAU,wBAAwB;AAAA,EAC9E;AAEA,SAAO;AACT;AAEO,SAAS,uBACd,aACA,aAAqB,kBAAkB,kBAAkB,CAAC,GACpD;AACN,QAAM,UAAU,iBAAiB,UAAU;AAE3C,YAAUC,SAAQ,UAAU,CAAC;AAC7B,QAAM,OAAqB;AAAA,IACzB,GAAG;AAAA,IACH,QAAQ;AAAA,MACN,GAAI,QAAQ,UAAU,CAAC;AAAA,MACvB,UAAU,YAAY;AAAA,MACtB,cAAc,YAAY;AAAA,MAC1B,aAAa,YAAY,eAAe,QAAQ,QAAQ,eAAe;AAAA,IACzE;AAAA,EACF;AAEA,gBAAc,YAAY,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AACxE;;;AFAA,IAAM,YAAY;AAClB,IAAM,eAAe;AACrB,IAAM,kBAAkB;AAExB,SAAS,YAAY,KAAa,WAAkC;AAClE,SAAO,YAAY,GAAG,GAAG,YAAY,mBAAmB,SAAS,CAAC,KAAK;AACzE;AAEA,SAAS,kBAAkB,OAA+C;AACxE,MAAI,CAAC,OAAO,KAAK,GAAG;AAClB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAA+C;AACvE,MAAI,CAAC,OAAO,KAAK,GAAG;AAClB,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,MAAM,SAAS,6BAA6B,GAAG;AAClD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,OAA+C;AAC3E,MAAI,CAAC,OAAO,KAAK,GAAG;AAClB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,OAA+C;AAC1E,MAAI,CAAC,OAAO,KAAK,GAAG;AAClB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,KAAK;AAC5B,QAAI,CAAC,OAAO,SAAS,WAAW,MAAM,GAAG;AACvC,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,eAAe,YAAe,SAA8B,eAA0C;AACpG,QAAM,QAAQ,MAAM;AAEpB,MAAI,SAAS,KAAK,GAAG;AACnB,WAAO,aAAa;AACpB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,WAAgC;AAC9D;AAAA,IACE;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,YAAY,cAAc,SAAS,CAAC;AAAA,IAClD,EAAE,KAAK,IAAI;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,WAA0B,aAA2B;AAChF;AAAA,IACE;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,+BAA+B,WAAW;AAAA,MAC1C;AAAA,MACA;AAAA,MACA,YAAY,YAAY,iBAAiB,SAAS,CAAC;AAAA,IACrD,EAAE,KAAK,IAAI;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,cAA6B;AACpC,QAAM,aAAa;AAAA,IACjB,QAAQ,QAAQ,IAAI,GAAG,MAAM;AAAA,IAC7B,QAAQ,QAAQ,IAAI,GAAG,YAAY;AAAA,EACrC;AACA,SAAO,WAAW,KAAK,CAAC,MAAMC,YAAW,CAAC,CAAC,KAAK;AAClD;AAEA,SAAS,cACP,SACA,aACM;AACN,MAAI,UAAUC,cAAa,SAAS,MAAM;AAE1C,QAAM,eAAmC;AAAA,IACvC,CAAC,oBAAoB,YAAY,QAAQ;AAAA,IACzC,CAAC,wBAAwB,YAAY,YAAY;AAAA,IACjD,CAAC,uBAAuB,YAAY,WAAW;AAAA,EACjD;AAEA,aAAW,CAAC,KAAK,KAAK,KAAK,cAAc;AACvC,UAAM,QAAQ,IAAI,OAAO,IAAI,GAAG,QAAQ,GAAG;AAC3C,QAAI,MAAM,KAAK,OAAO,GAAG;AACvB,gBAAU,QAAQ,QAAQ,OAAO,GAAG,GAAG,IAAI,KAAK,EAAE;AAAA,IACpD;AAAA,EACF;AAEA,EAAAC,eAAc,SAAS,SAAS,MAAM;AACxC;AAEA,eAAe,2BACb,aACe;AACf,QAAM,YAAY,CAAC,oBAAoB,wBAAwB,qBAAqB,EACjF,OAAO,CAAC,QAAQ,QAAQ,QAAQ,IAAI,GAAG,CAAC,CAAC;AAE5C,MAAI,UAAU,WAAW,GAAG;AAC1B;AAAA,EACF;AAEA,QAAM,UAAU,YAAY;AAE5B,MAAI,WAAW,aAAa;AAC1B,QAAI;AAAA,MACF,mBAAmB,OAAO;AAAA,IAC5B;AAEA,UAAM,eAAe,MAAM;AAAA,MACzB,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,cAAc;AAAA,MAChB,CAAC;AAAA,MACD;AAAA,IACF;AAEA,QAAI,cAAc;AAChB,oBAAc,SAAS,WAAW;AAElC,cAAQ,IAAI,mBAAmB,YAAY;AAC3C,cAAQ,IAAI,uBAAuB,YAAY;AAC/C,cAAQ,IAAI,sBAAsB,YAAY;AAC9C,UAAI,QAAQ,mBAAmB,OAAO,EAAE;AAAA,IAC1C,OAAO;AACL;AAAA,QACE,oDAAoD,UAAU,KAAK,IAAI,CAAC;AAAA;AAAA,QAExE;AAAA,MACF;AAAA,IACF;AAAA,EACF,OAAO;AACL;AAAA,MACE,mDAAmD,UAAU,KAAK,IAAI,CAAC;AAAA;AAAA,MAEvE;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,mBAAyB;AAChC,QAAM,SAAS,WAAW;AAC1B,QAAM,YAAY,kBAAkB,MAAM;AAE1C,MAAI,CAAC,UAAU,OAAO;AACpB,UAAM,IAAI,MAAM,2CAA2C,UAAU,QAAQ,KAAK,IAAI,CAAC,EAAE;AAAA,EAC3F;AAEA,QAAM,SAAS,kBAAkB,MAAM;AACvC,SAAO,gBAAgB;AAAA,IACrB,aAAa;AAAA,IACb,OAAO;AAAA,EACT,CAAC;AACH;AAEA,eAAsB,eAAe,UAAwB,CAAC,GAAyB;AACrF,QAAM,uBAAuB;AAE7B,QAAM,gBAAgB,WAAW;AACjC,QAAM,aAAa,kBAAkB,cAAc,OAAO;AAC1D,QAAM,uBAAuB,0BAA0B,aAAa;AAEpE,MAAI,YAAY,CAAC,QAAQ;AACzB,MAAI,YAAY,QAAQ,WAAW;AACnC,MAAI,qBAAqB;AACzB,MAAI,kBAAkB;AACtB,MAAI,qBAAoC;AAExC,MAAI,WAAW;AACb,UAAM,gBAAgB,QAAQ;AAC9B,kBAAc,MAAM,wBAAwB;AAE5C,QAAI,CAAC,qBAAqB,GAAG;AAC3B,oBAAc,MAAM,uBAAuB;AAC3C;AAAA,QACE;AAAA,QAEA;AAAA,MACF;AAEA,YAAM,iBAAiB,MAAM;AAAA,QAC3B,QAAQ;AAAA,UACN,SAAS;AAAA,UACT,cAAc;AAAA,QAChB,CAAC;AAAA,QACD;AAAA,MACF;AAEA,UAAI,CAAC,gBAAgB;AACnB,eAAO,kBAAkB;AACzB,eAAO;AAAA,UACL,WAAW;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA,YAAY;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AAEA,kBAAY;AAAA,IACd,OAAO;AACL,YAAM,UAAU,uBAAuB;AACvC,oBAAc,KAAK,UAAU,qBAAqB,OAAO,MAAM,kBAAkB;AAAA,IACnF;AAAA,EACF;AAEA,MAAI,aAAa,CAAC,yBAAyB,GAAG;AAC5C,QAAI,KAAK,4CAA4C;AAErD,UAAM,cAAc,MAAM;AAAA,MACxB,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,cAAc;AAAA,MAChB,CAAC;AAAA,MACD;AAAA,IACF;AAEA,QAAI,CAAC,aAAa;AAChB,YAAM,iBAAiB,MAAM;AAAA,QAC3B,QAAQ;AAAA,UACN,SAAS;AAAA,UACT,cAAc;AAAA,QAChB,CAAC;AAAA,QACD;AAAA,MACF;AAEA,UAAI,CAAC,gBAAgB;AACnB,eAAO,kBAAkB;AACzB,eAAO;AAAA,UACL,WAAW;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA,YAAY;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AAEA,kBAAY;AAAA,IACd,OAAO;AACL,YAAM,cAAc,mBAAmB;AAEvC,UAAI,CAAC,YAAY,WAAW,CAAC,yBAAyB,GAAG;AACvD,cAAM,IAAI,MAAM,YAAY,SAAS,sDAAsD;AAAA,MAC7F;AAEA,YAAM,UAAU,uBAAuB;AACvC,UAAI,QAAQ,UAAU,oBAAoB,OAAO,KAAK,iCAAiC;AAAA,IACzF;AAAA,EACF;AAEA,MAAI,WAAW;AACb,gBAAY,aAAa,iBAAiB;AAE1C,QAAI,CAAC,WAAW;AACd,kBAAY,MAAM;AAAA,QAChB,KAAK;AAAA,UACH,SAAS;AAAA,UACT,aAAa;AAAA,UACb,UAAU;AAAA,QACZ,CAAC;AAAA,QACD;AAAA,MACF;AAAA,IACF,OAAO;AACL,UAAI,KAAK,kBAAkB,SAAS,EAAE;AAAA,IACxC;AAEA,QAAI,CAAC,WAAW;AACd,aAAO,kBAAkB;AACzB,aAAO;AAAA,QACL,WAAW;AAAA,QACX;AAAA,QACA,WAAW;AAAA,QACX;AAAA,QACA,YAAY;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAEA,UAAM,gBAAgB,QAAQ;AAC9B,kBAAc,MAAM,uBAAuB;AAE3C,UAAM,UAAU,UAAU,WAAW,SAAS;AAE9C,QAAI,CAAC,QAAQ,SAAS;AACpB,oBAAc,MAAM,+BAA+B,QAAQ,KAAK,EAAE;AAClE,YAAM,iBAAiB,MAAM;AAAA,QAC3B,QAAQ;AAAA,UACN,SAAS;AAAA,UACT,cAAc;AAAA,QAChB,CAAC;AAAA,QACD;AAAA,MACF;AAEA,UAAI,CAAC,gBAAgB;AACnB,eAAO,kBAAkB;AACzB,eAAO;AAAA,UACL,WAAW;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA,YAAY;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,oBAAc,KAAK,oBAAoB;AACvC,wBAAkB;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,2BAA2B,qBAAqB,aAClD,MAAM;AAAA,IACJ,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,IAChB,CAAC;AAAA,IACD;AAAA,EACF,IACA;AAEJ,MAAI,6BAA6B,MAAM;AACrC,WAAO;AAAA,MACL,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,0BAA0B;AAC7B,2BAAuB,SAAS;AAChC,QAAI,KAAK,WAAW,YAAY,cAAc,SAAS,CAAC,EAAE;AAC1D,gBAAY,YAAY,cAAc,SAAS,CAAC;AAEhD,UAAM,mBAAmB,MAAM;AAAA,MAC7B,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,cAAc;AAAA,MAChB,CAAC;AAAA,MACD;AAAA,IACF;AAEA,QAAI,CAAC,kBAAkB;AACrB,aAAO,+DAA+D;AACtE,aAAO;AAAA,QACL,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAEA;AAAA,MACE;AAAA;AAAA;AAAA,MAGA;AAAA,IACF;AAAA,EACF,OAAO;AACL;AAAA,MACE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAIgB,YAAY,cAAc,SAAS,CAAC;AAAA,MACpD;AAAA,IACF;AAEA;AAAA,MACE;AAAA;AAAA;AAAA,MAGA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,2BAA2B,qBAAqB,aAClD,MAAM;AAAA,IACJ,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,IAChB,CAAC;AAAA,IACD;AAAA,EACF,IACA;AAEJ,MAAI,6BAA6B,MAAM;AACrC,WAAO;AAAA,MACL,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,cAAc,OAAO,eAAe;AAExD,MAAI,0BAA0B;AAC5B,wBAAoB,WAAW,WAAW;AAC1C,QAAI,KAAK,WAAW,YAAY,iBAAiB,SAAS,CAAC,EAAE;AAC7D,gBAAY,YAAY,iBAAiB,SAAS,CAAC;AAEnD,UAAM,WAAW,MAAM;AAAA,MACrB,KAAK;AAAA,QACH,SAAS;AAAA,QACT,aAAa;AAAA,QACb,UAAU;AAAA,MACZ,CAAC;AAAA,MACD;AAAA,IACF;AAEA,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,QACL,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAEA,UAAM,eAAe,MAAM;AAAA,MACzB,SAAS;AAAA,QACP,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,MACD;AAAA,IACF;AAEA,QAAI,CAAC,cAAc;AACjB,aAAO;AAAA,QACL,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAEA,UAAM,sBAAsB,MAAM;AAAA,MAChC,KAAK;AAAA,QACH,SAAS;AAAA,QACT,cAAc;AAAA,QACd,UAAU;AAAA,MACZ,CAAC;AAAA,MACD;AAAA,IACF;AAEA,QAAI,CAAC,qBAAqB;AACxB,aAAO;AAAA,QACL,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAEA,UAAM,cAAc,QAAQ;AAC5B,gBAAY,MAAM,yBAAyB,UAAU,KAAK;AAC1D,2BAAuB;AAAA,MACrB;AAAA,MACA;AAAA,MACA,aAAa;AAAA,IACf,GAAG,UAAU;AACb,gBAAY,KAAK,oBAAoB;AACrC,yBAAqB;AAErB,UAAM,2BAA2B;AAAA,MAC/B;AAAA,MACA;AAAA,MACA,aAAa;AAAA,IACf,CAAC;AAAA,EACH,OAAO;AACL,QAAI,KAAK,6DAA6D;AACtE,UAAM,2BAA2B,IAAI;AAAA,EACvC;AAEA,QAAM,gBAAgB,QAAQ;AAC9B,gBAAc,MAAM,oBAAoB;AACxC,mBAAiB;AACjB,gBAAc,KAAK,+BAA+B;AAElD,QAAM,wBAAwB,MAAM;AAAA,IAClC,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,IAChB,CAAC;AAAA,IACD;AAAA,EACF;AAEA,MAAI,0BAA0B,MAAM;AAClC,WAAO;AAAA,MACL,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAEA,MAAI,uBAAuB;AACzB,QAAI,KAAK,2CAA2C;AAEpD,QAAI;AACF,YAAM,eAAe,WAAW;AAChC,YAAM,aAAa,MAAM,eAAe,YAAY;AACpD,2BAAqB,WAAW;AAChC,YAAM,iBAAiB;AAAA,QACrB,aAAa;AAAA,QACb;AAAA,QACA,EAAE,qBAAqB,KAAK;AAAA,MAC9B;AACA,UAAI;AAAA,QACF,sBAAsB,uBAAuB,YACzC,gCAAgC,kBAAkB,KAClD;AAAA,MACN;AACA,UAAI,eAAe,SAAS;AAC1B,YAAI,KAAK,oEAAoE;AAAA,MAC/E;AAAA,IACF,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,UAAI,QAAQ,SAAS,eAAe,KAAK,QAAQ,SAAS,eAAe,GAAG;AAC1E,YAAI,MAAM,qCAAqC;AAC/C;AAAA,UACE;AAAA,UAIA;AAAA,QACF;AAAA,MACF,OAAO;AACL,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA;AAAA,IACE;AAAA,MACE,mBAAmB,YACf,wCAAmC,SAAS,KAC5C;AAAA,MACJ;AAAA,MACA,qBAAqB,cAAc,CAAC,qBAChC,2CACA,qCAAgC,UAAU;AAAA,MAC9C,qBACI,iCAA4B,kBAAkB,KAC9C;AAAA,MACJ;AAAA,MACA,qBACI,sCACA;AAAA,IACN,EAAE,KAAK,IAAI;AAAA,IACX;AAAA,EACF;AAEA,QAAM,iBAAiB;AAEvB,SAAO;AAAA,IACL,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,EACF;AACF;;;ALpmBA,IAAM,UAAU,IAAI,QAAQ;AAuB5B,IAAM,eAAe,OAAO,SAAS,QAAQ,IAAI,aAAa;AAE9D,SAAS,KAAK,MAAc,OAAuB;AACjD,SAAO,eAAe,QAAU,IAAI,IAAI,KAAK,YAAc;AAC7D;AAEA,IAAM,KAAK;AAAA,EACT,MAAM,CAAC,UAAkB,KAAK,GAAG,KAAK;AAAA,EACtC,KAAK,CAAC,UAAkB,KAAK,GAAG,KAAK;AAAA,EACrC,MAAM,CAAC,UAAkB,KAAK,IAAI,KAAK;AAAA,EACvC,OAAO,CAAC,UAAkB,KAAK,IAAI,KAAK;AAAA,EACxC,QAAQ,CAAC,UAAkB,KAAK,IAAI,KAAK;AAAA,EACzC,KAAK,CAAC,UAAkB,KAAK,IAAI,KAAK;AAAA,EACtC,SAAS,CAAC,UAAkB,KAAK,IAAI,KAAK;AAC5C;AAEA,SAASC,WAAU,OAAuB;AACxC,SAAO,MAAM,QAAQ,qBAAqB,EAAE;AAC9C;AAEA,SAASC,UAAS,OAAe,OAAuB;AACtD,MAAI,SAAS,GAAG;AACd,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,UAAU,OAAO;AACzB,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,GAAG;AACd,WAAO,MAAM,MAAM,GAAG,KAAK;AAAA,EAC7B;AAEA,SAAO,GAAG,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC;AACrC;AAEA,SAASC,KAAI,OAAe,OAAuB;AACjD,QAAM,UAAUF,WAAU,KAAK;AAE/B,MAAI,QAAQ,UAAU,OAAO;AAC3B,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,KAAK,GAAG,IAAI,OAAO,QAAQ,QAAQ,MAAM,CAAC;AACtD;AAEA,SAAS,aAAa,OAAqB;AACzC,UAAQ,IAAI,GAAG,KAAK,KAAK,CAAC;AAC5B;AAEA,SAAS,cAAc,OAAe,OAAqB;AACzD,UAAQ,IAAI,GAAG,GAAG,IAAI,GAAG,KAAK,GAAG,CAAC,IAAI,KAAK,EAAE;AAC/C;AAEA,SAAS,aAAa,QAA6D;AACjF,QAAM,QAAQ,OAAO,YAAY;AAEjC,UAAQ,QAAQ;AAAA,IACd,KAAK;AAAA,IACL,KAAK;AACH,aAAO,GAAG,MAAM,KAAK;AAAA,IACvB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,GAAG,OAAO,KAAK;AAAA,IACxB,KAAK;AACH,aAAO,GAAG,IAAI,KAAK;AAAA,IACrB,KAAK;AACH,aAAO,GAAG,KAAK,KAAK;AAAA,EACxB;AACF;AAEA,SAAS,eAAe,MAA6B;AACnD,SAAO,KAAK,eAAe,KAAK,IAAI,MAAM,KAAK,cAAc,KAAK,IAAI;AACxE;AAEA,SAAS,WAAW,QAA0B;AAC5C,SAAO,OAAO,SAAS,IAAI,OAAO,KAAK,IAAI,IAAI;AACjD;AAEA,eAAe,oBAA4C;AACzD,QAAM,SAAS,WAAW;AAC1B,eAAa,OAAO,MAAM;AAE1B,QAAM,SAAS,MAAM,WAAW,OAAO,UAAU;AACjD,QAAM,eAAe,0BAA0B,MAAM;AACrD,QAAM,iBAAiB,kBAAkB,QAAQ,MAAM;AAEvD,SAAO;AAAA,IACL;AAAA,IACA,eAAe,WAAW;AAAA,IAC1B,cAAc,SAAS,eAAe,MAAM,IAAI;AAAA,IAChD,kBAAkB,aAAa;AAAA,IAC/B,eAAe,aAAa;AAAA,IAC5B,YAAY,eAAe;AAAA,EAC7B;AACF;AAEA,SAAS,uBAAuB,QAA6B;AAC3D,eAAa,aAAa;AAC1B,gBAAc,WAAW,OAAO,OAAO,OAAO;AAC9C,gBAAc,UAAU,OAAO,OAAO,MAAM;AAC5C,gBAAc,YAAY,OAAO,OAAO,QAAQ;AAChD,gBAAc,cAAc,OAAO,OAAO,UAAU;AACpD;AAAA,IACE;AAAA,IACA,OAAO,mBAAmB,GAAG,MAAM,YAAY,IAAI,GAAG,IAAI,SAAS;AAAA,EACrE;AACA,gBAAc,4BAA4B,WAAW,OAAO,aAAa,CAAC;AAC1E,gBAAc,UAAU,OAAO,gBAAgB,GAAG,MAAM,SAAS,IAAI,GAAG,IAAI,SAAS,CAAC;AACtF;AAAA,IACE;AAAA,IACA,OAAO,iBAAiB,OAAO,GAAG,IAAI,yBAAyB,IAAI,OAAO,eAAe,GAAG,IAAI,KAAK,IAAI,GAAG,MAAM,IAAI;AAAA,EACxH;AACA,gBAAc,cAAc,OAAO,aAAa,GAAG,MAAM,KAAK,IAAI,GAAG,IAAI,IAAI,CAAC;AAChF;AAEA,SAAS,kCAAkC,QAA6B;AACtE,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,gCAAgC;AAE5C,MAAI,CAAC,OAAO,kBAAkB;AAC5B,YAAQ,IAAI,eAAe;AAC3B,YAAQ,IAAI,qBAAqB,OAAO,cAAc,SAAS,kBAAkB,IAAI,eAAe,EAAE,EAAE;AACxG,YAAQ;AAAA,MACN,yBAAyB,OAAO,cAAc,SAAS,sBAAsB,IAAI,eAAe,EAAE;AAAA,IACpG;AACA,YAAQ,IAAI,mDAAmD;AAC/D,YAAQ,IAAI,uDAAuD;AACnE,YAAQ,IAAI,wDAAwD;AACpE;AAAA,EACF;AAEA,MAAI,CAAC,OAAO,eAAe;AACzB,YAAQ,IAAI,qFAAqF;AACjG,YAAQ,IAAI,wCAAwC;AACpD;AAAA,EACF;AAEA,MAAI,OAAO,cAAc;AACvB,YAAQ,IAAI,uFAAuF;AACnG,YAAQ,IAAI,mCAAmC;AAC/C;AAAA,EACF;AAEA,UAAQ,IAAI,+DAA+D;AAC3E,UAAQ,IAAI,gCAAgC;AAC9C;AAEA,eAAe,0BAA0B,aAAoC;AAC3E,QAAM,SAAS,MAAM,kBAAkB;AAEvC,MAAI,CAAC,OAAO,YAAY;AACtB,YAAQ,IAAI,GAAG,WAAW,uCAAuC;AACjE,2BAAuB,MAAM;AAC7B,sCAAkC,MAAM;AACxC,YAAQ,WAAW;AACnB;AAAA,EACF;AACF;AAEA,eAAe,0BAA0B,QAAwC;AAC/E,QAAM,SAAS,MAAM,WAAW,OAAO,UAAU;AAEjD,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,SAAS,OAAO,UAAU,WAAW;AAC9C,WAAO,OAAO;AAAA,EAChB;AAEA,QAAM,YAAY,MAAM,kBAAkB,MAAM;AAChD,QAAM,UAAU,MAAM,UAAU,WAAW;AAE3C,MAAI,CAAC,QAAQ,cAAc;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,OAAO,YAAY;AAAA,IAClC,GAAG;AAAA,IACH,OAAO,QAAQ;AAAA,EACjB,CAAC;AAED,SAAO,QAAQ;AACjB;AAEA,SAAS,eAAe,OAMb;AACT,QAAM,QAAQE,KAAI,MAAM,SAAS,GAAG,IAAI,MAAM,IAAI,GAAG,OAAO,QAAQ,GAAG,CAAC;AACxE,QAAM,OAAO,GAAG,IAAI,IAAI,KAAK,MAAM,IAAI,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AACnE,QAAM,SAASA,KAAID,UAAS,MAAM,aAAa,EAAE,GAAG,EAAE;AACtD,QAAM,UAAUA,UAAS,MAAM,SAAS,EAAE;AAC1C,QAAM,KAAK,GAAG,IAAI,MAAM,EAAE;AAC1B,SAAO,GAAG,KAAK,KAAK,IAAI,KAAK,MAAM,KAAK,OAAO,IAAI,EAAE;AACvD;AAEA,SAAS,wBAA8B;AACrC,UAAQ;AAAA,IACN;AAAA,MACEC,KAAI,GAAG,IAAI,OAAO,GAAG,CAAC;AAAA,MACtB,GAAG,IAAI,MAAM;AAAA,MACbA,KAAI,GAAG,IAAI,MAAM,GAAG,EAAE;AAAA,MACtB,GAAG,IAAI,SAAS;AAAA,MAChB,GAAG,IAAI,IAAI;AAAA,IACb,EAAE,KAAK,IAAI;AAAA,EACb;AACF;AAEA,SAAS,gBAAgB,OAA0C;AACjE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO,IAAI,KAAK,KAAK,EAAE,YAAY;AACrC;AAEA,SAAS,WAAW,OAAiD;AACnE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,iBAAiB,OAAO,MAAM,QAAQ,IAAI;AAC5D,SAAO,IAAI,KAAK,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AACtD;AAEA,SAASC,oBAAmB,OAAiD;AAC3E,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,iBAAiB,OAAO,MAAM,QAAQ,IAAI;AAC5D,QAAM,OAAO,KAAK,IAAI,IAAI;AAE1B,MAAI,OAAO,GAAG;AACZ,WAAO,WAAW,SAAS;AAAA,EAC7B;AAEA,MAAI,OAAO,KAAQ;AACjB,WAAO,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,GAAK,CAAC,CAAC;AAAA,EACjD;AAEA,MAAI,OAAO,MAAW;AACpB,WAAO,GAAG,KAAK,MAAM,OAAO,GAAM,CAAC;AAAA,EACrC;AAEA,MAAI,OAAO,OAAY;AACrB,WAAO,GAAG,KAAK,MAAM,OAAO,IAAS,CAAC;AAAA,EACxC;AAEA,MAAI,OAAO,QAAa;AACtB,WAAO,GAAG,KAAK,MAAM,OAAO,KAAU,CAAC;AAAA,EACzC;AAEA,MAAI,OAAO,QAAe;AACxB,WAAO,GAAG,KAAK,MAAM,OAAO,MAAW,CAAC;AAAA,EAC1C;AAEA,SAAO,WAAW,SAAS;AAC7B;AAEA,SAASC,eAAc,OAAuB;AAC5C,QAAM,aAAa,OAAO,UAAU,KAAK,IAAI,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC,EAAE,QAAQ,QAAQ,EAAE;AAChG,SAAO,GAAG,UAAU;AACtB;AAEA,SAAS,qBAAqB,MAAc,OAAe,OAAuB;AAChF,QAAM,WAAW,QAAQ,SAAS,QAAQ,GAAG,IAAI,KAAK,KAAK,MAAM;AACjE,SAAOF,KAAID,UAAS,UAAU,KAAK,GAAG,KAAK;AAC7C;AAEA,SAAS,mBAAmB,OAAe,OAAe,MAAc,GAAW;AACjF,QAAM,SAAS,OAAO,KAAK;AAE3B,MAAI,CAAC,OAAO,UAAU,MAAM,KAAK,SAAS,KAAK;AAC7C,UAAM,IAAI,MAAM,GAAG,KAAK,gDAAgD,GAAG,GAAG;AAAA,EAChF;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAA2B,OAAmC;AACxF,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,OAAO,KAAK;AAE3B,MAAI,OAAO,MAAM,MAAM,KAAK,SAAS,KAAK,SAAS,KAAK;AACtD,UAAM,IAAI,MAAM,GAAG,KAAK,6BAA6B;AAAA,EACvD;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,UAA8D;AACxF,eAAa,gBAAgB;AAC7B,gBAAc,SAAS,OAAO,SAAS,KAAK,CAAC;AAC7C,gBAAc,UAAU,SAAS,SAAS,IAAI,GAAG,OAAO,OAAO,SAAS,MAAM,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC;AAC9F,gBAAc,WAAW,SAAS,UAAU,IAAI,GAAG,QAAQ,OAAO,SAAS,OAAO,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC;AAClG;AAAA,IACE;AAAA,IACA,GAAG,SAAS,MAAM,QAAQ,cAAc,SAAS,MAAM,MAAM;AAAA,EAC/D;AACA;AAAA,IACE;AAAA,IACA,GAAG,SAAS,SAAS,QAAQ,cAAc,SAAS,SAAS,MAAM;AAAA,EACrE;AACA;AAAA,IACE;AAAA,IACA,GAAG,SAAS,UAAU,QAAQ,cAAc,SAAS,UAAU,MAAM;AAAA,EACvE;AACA;AAAA,IACE;AAAA,IACA,SAAS,eACL,GAAGE,oBAAmB,SAAS,YAAY,CAAC,KAAK,WAAW,SAAS,YAAY,CAAC,MAClF;AAAA,EACN;AACF;AAEA,SAAS,qBACP,OACA,SACM;AACN,eAAa,gBAAgB,KAAK,GAAG;AACrC,UAAQ;AAAA,IACN;AAAA,MACED,KAAI,GAAG,IAAI,QAAQ,GAAG,EAAE;AAAA,MACxBA,KAAI,GAAG,IAAI,OAAO,GAAG,CAAC;AAAA,MACtBA,KAAI,GAAG,IAAI,QAAQ,GAAG,CAAC;AAAA,MACvBA,KAAI,GAAG,IAAI,SAAS,GAAG,CAAC;AAAA,MACxB,GAAG,IAAI,YAAY;AAAA,IACrB,EAAE,KAAK,IAAI;AAAA,EACb;AAEA,aAAW,UAAU,SAAS;AAC5B,YAAQ;AAAA,MACN;AAAA,QACE,qBAAqB,OAAO,MAAM,OAAO,OAAO,EAAE;AAAA,QAClDA,KAAI,OAAO,OAAO,aAAa,GAAG,CAAC;AAAA,QACnCA,KAAI,OAAO,OAAO,cAAc,GAAG,CAAC;AAAA,QACpCA,KAAIE,eAAc,OAAO,UAAU,GAAG,CAAC;AAAA,QACvCD,oBAAmB,OAAO,aAAa;AAAA,MACzC,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF;AACF;AAEA,SAAS,sBACP,aACM;AACN,eAAa,aAAa;AAC1B,UAAQ;AAAA,IACN;AAAA,MACED,KAAI,GAAG,IAAI,QAAQ,GAAG,EAAE;AAAA,MACxBA,KAAI,GAAG,IAAI,OAAO,GAAG,CAAC;AAAA,MACtBA,KAAI,GAAG,IAAI,QAAQ,GAAG,CAAC;AAAA,MACvBA,KAAI,GAAG,IAAI,SAAS,GAAG,CAAC;AAAA,MACxBA,KAAI,GAAG,IAAI,QAAQ,GAAG,EAAE;AAAA,MACxBA,KAAI,GAAG,IAAI,YAAY,GAAG,EAAE;AAAA,MAC5B,GAAG,IAAI,QAAQ;AAAA,IACjB,EAAE,KAAK,IAAI;AAAA,EACb;AAEA,aAAW,UAAU,aAAa;AAChC,UAAM,cACJ,OAAO,WAAW,WACd,GAAG,MAAM,OAAO,MAAM,IACtB,OAAO,WAAW,aAChB,GAAG,IAAI,OAAO,MAAM,IACpB,GAAG,OAAO,OAAO,MAAM;AAE/B,YAAQ;AAAA,MACN;AAAA,QACE,qBAAqB,OAAO,MAAM,OAAO,OAAO,EAAE;AAAA,QAClDA,KAAI,OAAO,OAAO,YAAY,GAAG,CAAC;AAAA,QAClCA,KAAI,OAAO,OAAO,WAAW,GAAG,CAAC;AAAA,QACjCA,KAAIE,eAAc,OAAO,UAAU,GAAG,CAAC;AAAA,QACvCF,KAAI,aAAa,EAAE;AAAA,QACnBA,KAAIC,oBAAmB,OAAO,QAAQ,GAAG,EAAE;AAAA,QAC3CF,UAAS,OAAO,iBAAiB,EAAE;AAAA,MACrC,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF;AACF;AAEA,SAAS,4BACPI,SACM;AACN,eAAa,oBAAoB;AACjC,UAAQ;AAAA,IACN;AAAA,MACEH,KAAI,GAAG,IAAI,OAAO,GAAG,EAAE;AAAA,MACvBA,KAAI,GAAG,IAAI,OAAO,GAAG,CAAC;AAAA,MACtBA,KAAI,GAAG,IAAI,QAAQ,GAAG,CAAC;AAAA,MACvB,GAAG,IAAI,IAAI;AAAA,IACb,EAAE,KAAK,IAAI;AAAA,EACb;AAEA,aAAW,SAASG,SAAQ;AAC1B,YAAQ;AAAA,MACN;AAAA,QACEH,KAAID,UAAS,MAAM,WAAW,EAAE,GAAG,EAAE;AAAA,QACrCC,KAAI,OAAO,MAAM,aAAa,GAAG,CAAC;AAAA,QAClCA,KAAI,OAAO,MAAM,cAAc,GAAG,CAAC;AAAA,QACnC,GAAG,IAAI,MAAM,OAAO;AAAA,MACtB,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF;AACF;AAEA,SAAS,iBACP,OACA,QACM;AACN,eAAa,WAAW,KAAK,GAAG;AAChC,UAAQ;AAAA,IACN;AAAA,MACEA,KAAI,GAAG,IAAI,QAAQ,GAAG,EAAE;AAAA,MACxBA,KAAI,GAAG,IAAI,UAAU,GAAG,EAAE;AAAA,MAC1BA,KAAI,GAAG,IAAI,MAAM,GAAG,CAAC;AAAA,MACrBA,KAAI,GAAG,IAAI,QAAQ,GAAG,CAAC;AAAA,MACvB,GAAG,IAAI,UAAU;AAAA,IACnB,EAAE,KAAK,IAAI;AAAA,EACb;AAEA,aAAW,SAAS,QAAQ;AAC1B,YAAQ;AAAA,MACN;AAAA,QACEA,KAAI,MAAM,QAAQ,EAAE;AAAA,QACpBA,KAAI,OAAO,MAAM,QAAQ,GAAG,EAAE;AAAA,QAC9BA,KAAI,OAAO,MAAM,IAAI,GAAG,CAAC;AAAA,QACzBA,KAAI,OAAO,MAAM,MAAM,GAAG,CAAC;AAAA,QAC3B,OAAO,MAAM,QAAQ;AAAA,MACvB,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,QAAuE;AAChG,eAAa,OAAO,KAAK;AACzB,gBAAc,QAAQ,OAAO,IAAI;AACjC,gBAAc,QAAQ,OAAO,IAAI;AACjC,gBAAc,YAAY,OAAO,OAAO,aAAa,CAAC;AACtD,gBAAc,UAAU,GAAG,OAAO,cAAc,KAAKE,eAAc,OAAO,UAAU,CAAC,GAAG;AACxF,gBAAc,aAAa,WAAW,OAAO,cAAc,CAAC;AAC5D;AAAA,IACE;AAAA,IACA,GAAGD,oBAAmB,OAAO,aAAa,CAAC,KAAK,WAAW,OAAO,aAAa,CAAC;AAAA,EAClF;AACA,gBAAc,UAAU,OAAO,OAAO,KAAK,IAAI,KAAK,GAAG;AAEvD,MAAI,OAAO,SAAS,UAAU;AAC5B,kBAAc,kBAAkB,OAAO,OAAO,gBAAgB,MAAM,CAAC;AACrE,eAAW,UAAU,OAAO,iBAAiB;AAC3C,cAAQ,IAAI,KAAK,MAAM,EAAE;AAAA,IAC3B;AAAA,EACF;AAEA,MAAI,OAAO,aAAa,WAAW,GAAG;AACpC;AAAA,EACF;AAEA,UAAQ,IAAI,EAAE;AACd,eAAa,eAAe;AAC5B,UAAQ;AAAA,IACN;AAAA,MACED,KAAI,GAAG,IAAI,OAAO,GAAG,CAAC;AAAA,MACtBA,KAAI,GAAG,IAAI,MAAM,GAAG,EAAE;AAAA,MACtBA,KAAI,GAAG,IAAI,MAAM,GAAG,EAAE;AAAA,MACtB,GAAG,IAAI,SAAS;AAAA,IAClB,EAAE,KAAK,IAAI;AAAA,EACb;AAEA,aAAW,SAAS,OAAO,cAAc;AACvC,YAAQ;AAAA,MACN;AAAA,QACEA,KAAI,MAAM,SAAS,GAAG,IAAI,MAAM,IAAI,GAAG,OAAO,QAAQ,GAAG,CAAC;AAAA,QAC1DA,KAAI,WAAW,MAAM,IAAI,GAAG,EAAE;AAAA,QAC9BA,KAAID,UAAS,MAAM,aAAa,EAAE,GAAG,EAAE;AAAA,QACvCA,UAAS,MAAM,WAAW,gBAAgB,EAAE;AAAA,MAC9C,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF;AACF;AAEA,SAAS,eAAe,QAAkE;AACxF,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,QAAQ,KAAK,KAAK,KAAK;AAE7B,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,EAAE,OAAO,MAAM,KAAK,OAAO,IAAI;AAAA,IACxC,KAAK;AACH,aAAO,EAAE,OAAO,MAAM,KAAK,IAAI,OAAO,IAAI;AAAA,IAC5C,KAAK;AACH,aAAO,EAAE,OAAO,MAAM,MAAM,OAAO,IAAI;AAAA,EAC3C;AACF;AAEA,SAAS,cAAc,SAA2B;AAChD,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,SAAO,QACJ,IAAI,CAAC,WAAW;AACf,YAAQ,OAAO,MAAM;AAAA,MACnB,KAAK;AACH,eAAO,SAAS,OAAO,KAAK;AAAA,MAC9B,KAAK;AACH,eAAO,WAAW,OAAO,EAAE;AAAA,MAC7B,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,IACX;AAAA,EACF,CAAC,EACA,KAAK,IAAI;AACd;AAEA,eAAe,sBAAsB,SAAmC;AACtE,QAAM,KAAK,gBAAgB,EAAE,OAAO,OAAO,CAAC;AAE5C,MAAI;AACF,UAAM,SAAS,MAAM,GAAG,SAAS,GAAG,OAAO,SAAS;AACpD,UAAM,aAAa,OAAO,KAAK,EAAE,YAAY;AAC7C,WAAO,eAAe,OAAO,eAAe;AAAA,EAC9C,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AACF;AAEA,eAAe,0BAA0B,OAAkC;AACzE,QAAM,SAAS,WAAW;AAC1B,QAAM,YAAY,MAAM,kBAAkB,MAAM;AAChD,QAAM,MAAM,oBAAI,IAAY;AAC5B,MAAI;AAEJ,KAAG;AACD,UAAM,WAAW,MAAM,UAAU,aAAa;AAAA,MAC5C;AAAA,MACA,YAAY;AAAA,MACZ;AAAA,IACF,CAAC;AAED,eAAW,WAAW,SAAS,YAAY,CAAC,GAAG;AAC7C,UAAI,QAAQ,IAAI;AACd,YAAI,IAAI,QAAQ,EAAE;AAAA,MACpB;AAAA,IACF;AAEA,gBAAY,SAAS,iBAAiB;AAAA,EACxC,SAAS;AAET,SAAO,CAAC,GAAG,GAAG;AAChB;AAEA,eAAe,kBAAkB,IAAwB,OAAmC;AAC1F,MAAI,OAAO;AACT,WAAO,0BAA0B,KAAK;AAAA,EACxC;AAEA,MAAI,CAAC,IAAI;AACP,UAAM,IAAI,MAAM,uEAAuE;AAAA,EACzF;AAEA,SAAO,CAAC,EAAE;AACZ;AAEA,eAAe,qBAAqB,OAA2B,KAAe,MAA6B;AACzG,MAAI,CAAC,SAAS,IAAI,UAAU,GAAG;AAC7B;AAAA,EACF;AAEA,QAAM,YAAY,MAAM;AAAA,IACtB,SAAS,IAAI,MAAM,qBAAqB,KAAK;AAAA,EAAM,IAAI,QAAQ,IAAI,MAAM;AAAA,EAC3E;AAEA,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,YAAY;AAAA,EAC9B;AACF;AAEA,eAAe,gBAAgB,SAIX;AAClB,QAAM,MAAM,MAAM,mBAAmB;AAAA,IACnC,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,kBAAkB,QAAQ;AAAA,IAC1B,OAAO,QAAQ,SAAS;AAAA,IACxB,QAAQ,QAAQ,OAAO,MAAM,MAAM,CAAC,SAAS,KAAK,WAAW,SAAS,IAClE,YACA,QAAQ,OAAO,MAAM,KAAK,CAAC,SAAS,KAAK,WAAW,aAAa,KAAK,WAAW,SAAS,IACxF,YACA;AAAA,EACR,CAAC;AAED,QAAM;AAAA,IACJ,IAAI;AAAA,IACJ,QAAQ,OAAO,MAAM,IAAI,CAAC,UAAU;AAAA,MAClC,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,gBAAgB,QAAQ;AAAA,MACxB,gBAAgB,KAAK;AAAA,MACrB,eAAe,KAAK;AAAA,MACpB,cAAc,KAAK,gBAAgB;AAAA,IACrC,EAAE;AAAA,EACJ;AAEA,SAAO,IAAI;AACb;AAEA,SAAS,qBAAqB,QAAwB,OAAqB;AACzE,QAAM,UAAU,OAAO,MAAM,OAAO,CAAC,SAAS,KAAK,WAAW,SAAS,EAAE;AACzE,QAAM,WAAW,OAAO,MAAM,OAAO,CAAC,SAAS,KAAK,WAAW,SAAS,EAAE;AAC1E,QAAM,SAAS,OAAO,MAAM,OAAO,CAAC,SAAS,KAAK,WAAW,OAAO,EAAE;AACtE,QAAM,QAAQ,OAAO,MAAM,OAAO,CAAC,SAAS,KAAK,WAAW,aAAa,CAAC,eAAe,IAAI,CAAC,EAAE;AAEhG,eAAa,OAAO,GAAG,IAAI,KAAK,CAAC,EAAE;AACnC,gBAAc,SAAS,OAAO,OAAO,MAAM,MAAM,CAAC;AAClD,gBAAc,WAAW,GAAG,MAAM,OAAO,OAAO,CAAC,CAAC;AAClD,gBAAc,YAAY,QAAQ,IAAI,GAAG,OAAO,OAAO,KAAK,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC;AAC5E,gBAAc,YAAY,WAAW,IAAI,GAAG,OAAO,OAAO,QAAQ,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC;AAClF,gBAAc,UAAU,SAAS,IAAI,GAAG,IAAI,OAAO,MAAM,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC;AACzE,UAAQ,IAAI,EAAE;AAEd,aAAW,QAAQ,OAAO,OAAO;AAC/B,UAAM,gBACJ,KAAK,WAAW,aAAa,CAAC,eAAe,IAAI,IAAI,SAAS,KAAK;AACrE,UAAM,OAAO;AAAA,MACXC,KAAI,aAAa,aAAa,GAAG,CAAC;AAAA,MAClC,GAAG,IAAI,KAAK,OAAO;AAAA,MACnB,GAAG,GAAG,IAAI,QAAQ,CAAC,IAAI,KAAK,eAAe,KAAK,GAAG,KAAK,GAAG;AAAA,MAC3D,GAAG,GAAG,IAAI,OAAO,CAAC,IAAI,KAAK,cAAc,KAAK,GAAG,KAAK,GAAG;AAAA,IAC3D,EAAE,KAAK,IAAI;AACX,YAAQ,IAAI,IAAI;AAEhB,QAAI,KAAK,cAAc;AACrB,cAAQ,IAAI,KAAK,GAAG,OAAO,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE;AAAA,IAC3D;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,MAAuD;AAChF,eAAa,SAAS;AACtB,UAAQ;AAAA,IACN;AAAA,MACEA,KAAI,GAAG,IAAI,QAAQ,GAAG,EAAE;AAAA,MACxBA,KAAI,GAAG,IAAI,QAAQ,GAAG,EAAE;AAAA,MACxBA,KAAI,GAAG,IAAI,MAAM,GAAG,EAAE;AAAA,MACtBA,KAAI,GAAG,IAAI,QAAQ,GAAG,EAAE;AAAA,MACxB,GAAG,IAAI,OAAO;AAAA,IAChB,EAAE,KAAK,IAAI;AAAA,EACb;AAEA,aAAW,OAAO,MAAM;AACtB,YAAQ;AAAA,MACN;AAAA,QACEA,KAAI,aAAa,IAAI,MAAM,GAAG,EAAE;AAAA,QAChCA,KAAID,UAAS,cAAc,IAAI,gBAAgB,GAAG,EAAE,GAAG,EAAE;AAAA,QACzDC,KAAI,GAAG,IAAI,gBAAgB,IAAI,SAAS,CAAC,GAAG,EAAE;AAAA,QAC9CA,KAAI,GAAG,IAAI,IAAI,EAAE,GAAG,EAAE;AAAA,QACtBD,UAAS,IAAI,SAAS,KAAK,EAAE;AAAA,MAC/B,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF;AACF;AAEA,SAAS,cAAc,SAA0B;AAC/C,SAAO,UAAU,GAAG,MAAM,SAAS,IAAI,GAAG,OAAO,UAAU;AAC7D;AAMA,SAAS,uBAAuB,QAAsC;AACpE,QAAM,UAAW,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,MAAM;AAOzD,eAAa,gBAAgB;AAC7B,UAAQ;AAAA,IACN;AAAA,MACEC,KAAI,GAAG,IAAI,QAAQ,GAAG,EAAE;AAAA,MACxBA,KAAI,GAAG,IAAI,MAAM,GAAG,EAAE;AAAA,MACtBA,KAAI,GAAG,IAAI,UAAU,GAAG,CAAC;AAAA,MACzBA,KAAI,GAAG,IAAI,SAAS,GAAG,EAAE;AAAA,MACzB,GAAG,IAAI,MAAM;AAAA,IACf,EAAE,KAAK,IAAI;AAAA,EACb;AAEA,aAAW,SAAS,SAAS;AAC3B,UAAM,cACJ,MAAM,WAAW,YACb,GAAG,MAAM,MAAM,OAAO,YAAY,CAAC,IACnC,MAAM,WAAW,YACf,GAAG,OAAO,MAAM,OAAO,YAAY,CAAC,IACpC,GAAG,IAAI,MAAM,OAAO,YAAY,CAAC;AAEzC,YAAQ;AAAA,MACN;AAAA,QACEA,KAAI,aAAa,EAAE;AAAA,QACnBA,KAAI,MAAM,MAAM,EAAE;AAAA,QAClBA,KAAI,OAAO,MAAM,QAAQ,GAAG,CAAC;AAAA,QAC7BA,KAAI,cAAc,MAAM,OAAO,GAAG,EAAE;AAAA,QACpCD,UAAS,KAAK,EAAE;AAAA,MAClB,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF;AACF;AAEA,SAAS,qBAAqBK,QAA4D;AACxF,eAAa,OAAO;AACpB,UAAQ;AAAA,IACN;AAAA,MACEJ,KAAI,GAAG,IAAI,MAAM,GAAG,EAAE;AAAA,MACtBA,KAAI,GAAG,IAAI,OAAO,GAAG,EAAE;AAAA,MACvBA,KAAI,GAAG,IAAI,UAAU,GAAG,CAAC;AAAA,MACzBA,KAAI,GAAG,IAAI,MAAM,GAAG,CAAC;AAAA,MACrBA,KAAI,GAAG,IAAI,UAAU,GAAG,EAAE;AAAA,MAC1B,GAAG,IAAI,SAAS;AAAA,IAClB,EAAE,KAAK,IAAI;AAAA,EACb;AAEA,aAAW,QAAQI,QAAO;AACxB,YAAQ;AAAA,MACN;AAAA,QACEJ,KAAID,UAAS,KAAK,MAAM,EAAE,GAAG,EAAE;AAAA,QAC/BC,KAAI,cAAc,KAAK,OAAO,GAAG,EAAE;AAAA,QACnCA,KAAI,OAAO,KAAK,QAAQ,GAAG,CAAC;AAAA,QAC5BA,KAAI,OAAO,KAAK,SAAS,GAAG,CAAC;AAAA,QAC7BA,KAAI,GAAG,IAAI,gBAAgB,KAAK,eAAe,CAAC,GAAG,EAAE;AAAA,QACrDD,UAAS,cAAc,KAAK,OAAO,GAAG,EAAE;AAAA,MAC1C,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF;AACF;AAEA,SAAS,sBAAsB,MAAoE;AACjG,eAAa,KAAK,IAAI;AACtB,gBAAc,eAAe,KAAK,eAAe,GAAG;AACpD,gBAAc,WAAW,cAAc,KAAK,OAAO,CAAC;AACpD,gBAAc,YAAY,OAAO,KAAK,QAAQ,CAAC;AAC/C,gBAAc,WAAW,cAAc,KAAK,OAAO,CAAC;AACpD,gBAAc,aAAa,OAAO,KAAK,SAAS,CAAC;AACjD,gBAAc,eAAe,OAAO,KAAK,WAAW,CAAC;AACrD,gBAAc,eAAe,OAAO,KAAK,WAAW,CAAC;AACrD,gBAAc,aAAa,OAAO,KAAK,SAAS,CAAC;AACjD,gBAAc,cAAc,OAAO,KAAK,UAAU,CAAC;AACnD,gBAAc,aAAa,KAAK,YAAY,GAAG,IAAI,KAAK,SAAS,IAAI,GAAG;AACxE,gBAAc,mBAAmB,GAAG,IAAI,gBAAgB,KAAK,eAAe,CAAC,CAAC;AAChF;AAEA,SAAS,mBAAmB,QAAmD;AAC7E,eAAa,QAAQ,OAAO,KAAK,IAAI,EAAE;AACvC,gBAAc,QAAQ,OAAO,SAAS,GAAG,KAAK,SAAS,IAAI,GAAG,MAAM,OAAO,CAAC;AAC5E,gBAAc,SAAS,GAAG,IAAI,OAAO,KAAK,CAAC;AAC3C,gBAAc,UAAU,aAAa,OAAO,MAAM,CAAC;AACnD,gBAAc,WAAW,OAAO,OAAO,YAAY,CAAC;AACpD,gBAAc,WAAW,cAAc,OAAO,KAAK,OAAO,CAAC;AAC3D,UAAQ,IAAI,EAAE;AAEd,MAAI,OAAO,MAAM,WAAW,GAAG;AAC7B,YAAQ,IAAI,4BAA4B;AACxC;AAAA,EACF;AAEA,aAAW,QAAQ,OAAO,OAAO;AAC/B,UAAM,UAAUA,UAAS,KAAK,WAAW,gBAAgB,EAAE;AAC3D,UAAM,OAAOA,UAAS,KAAK,eAAe,KAAK,EAAE;AACjD,UAAM,OAAO,GAAG,IAAI,IAAI,KAAK,KAAK,IAAI,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAClE,YAAQ;AAAA,MACN;AAAA,QACEC,KAAI,aAAa,KAAK,MAAM,GAAG,CAAC;AAAA,QAChCA,KAAI,MAAM,EAAE;AAAA,QACZA,KAAI,MAAM,EAAE;AAAA,QACZ;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb;AACA,YAAQ,IAAI,KAAK,GAAG,IAAI,KAAK,OAAO,CAAC,YAAY,KAAK,cAAc,KAAK,GAAG,KAAK,GAAG,EAAE;AAEtF,QAAI,KAAK,cAAc;AACrB,cAAQ,IAAI,KAAK,GAAG,OAAO,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE;AAAA,IAC3D;AAAA,EACF;AAEA,MAAI,OAAO,QAAQ;AACjB,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,oDAAoD;AAAA,EAClE;AACF;AAEA,SAAS,uBAAuB,QAAuD;AACrF,MAAI,OAAO,QAAQ,WAAW,GAAG;AAC/B,YAAQ,IAAI,0CAA0C;AACtD;AAAA,EACF;AAEA,aAAW,cAAc,OAAO,SAAS;AACvC,uBAAmB,UAAU;AAC7B,YAAQ,IAAI,EAAE;AAAA,EAChB;AACF;AAEA,SAAS,iBAAiB,QAAuD;AAC/E,eAAa,YAAY;AACzB,UAAQ;AAAA,IACN;AAAA,MACEA,KAAI,GAAG,IAAI,QAAQ,GAAG,EAAE;AAAA,MACxBA,KAAI,GAAG,IAAI,MAAM,GAAG,EAAE;AAAA,MACtBA,KAAI,GAAG,IAAI,UAAU,GAAG,EAAE;AAAA,MAC1BA,KAAI,GAAG,IAAI,MAAM,GAAG,EAAE;AAAA,MACtB,GAAG,IAAI,MAAM;AAAA,IACf,EAAE,KAAK,IAAI;AAAA,EACb;AAEA,aAAW,SAAS,OAAO,SAAS;AAClC,UAAM,QACJ,MAAM,WAAW,YACb,GAAG,MAAM,SAAS,IAClB,MAAM,WAAW,YACf,GAAG,OAAO,SAAS,IACnB,GAAG,IAAI,MAAM,OAAO,YAAY,CAAC;AAEzC,YAAQ;AAAA,MACN;AAAA,QACEA,KAAI,OAAO,EAAE;AAAA,QACbA,KAAID,UAAS,MAAM,MAAM,EAAE,GAAG,EAAE;AAAA,QAChCC,KAAID,UAAS,MAAM,gBAAgB,KAAK,EAAE,GAAG,EAAE;AAAA,QAC/CC,KAAID,UAAS,MAAM,YAAY,KAAK,EAAE,GAAG,EAAE;AAAA,QAC3CA,UAAS,MAAM,YAAY,KAAK,EAAE;AAAA,MACpC,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF;AACF;AAEA,QACG,KAAK,UAAU,EACf,YAAY,8DAA8D,EAC1E,QAAQ,OAAO,EACf,OAAO,UAAU,gCAAgC,EACjD,OAAO,aAAa,4DAA4D;AAEnF,QACG,QAAQ,OAAO,EACf,YAAY,yDAAyD,EACrE,OAAO,iBAAiB,0CAA0C,EAClE,OAAO,kBAAkB,qCAAqC,EAC9D,OAAO,OAAO,YAAY;AACzB,MAAI;AACF,UAAM,eAAe;AAAA,MACnB,YAAY,QAAQ;AAAA,MACpB,SAAS,QAAQ;AAAA,IACnB,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAClE,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,IAAM,OAAO,QAAQ,QAAQ,MAAM,EAAE,YAAY,sBAAsB;AAEvE,KACG,QAAQ,OAAO,EACf,YAAY,oCAAoC,EAChD,OAAO,YAAY;AAClB,QAAM,SAAS,WAAW;AAE1B,MAAI;AACF,UAAM,SAAS,MAAM,eAAe,MAAM;AAC1C,UAAM,iBAAiB;AAAA,MACrB,OAAO;AAAA,MACP,OAAO;AAAA,MACP,EAAE,qBAAqB,KAAK;AAAA,IAC9B;AACA,YAAQ,IAAI,gCAAgC,OAAO,KAAK,EAAE;AAC1D,YAAQ,IAAI,sBAAsB,OAAO,WAAW,EAAE;AACtD,QAAI,eAAe,SAAS;AAC1B,cAAQ,IAAI,oEAAoE;AAAA,IAClF;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAClE,UAAM,SAAS,MAAM,kBAAkB;AACvC,2BAAuB,MAAM;AAC7B,sCAAkC,MAAM;AACxC,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,KACG,QAAQ,QAAQ,EAChB,YAAY,4BAA4B,EACxC,OAAO,YAAY;AAClB,QAAM,SAAS,MAAM,kBAAkB;AACvC,yBAAuB,MAAM;AAE7B,MAAI,OAAO,eAAe;AACxB,QAAI;AACF,YAAM,QAAQ,MAAM,0BAA0B,OAAO,MAAM;AAC3D,UAAI,OAAO;AACT,gBAAQ,IAAI,uBAAuB,KAAK,EAAE;AAAA,MAC5C;AAAA,IACF,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,oCACE,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,OAAO,YAAY;AACtB,sCAAkC,MAAM;AAAA,EAC1C;AACF,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,wBAAwB,EACpC,OAAO,UAAU,sCAAsC,EACvD,OAAO,OAAO,YAAY;AACzB,QAAM,SAAS,MAAM,kBAAkB;AAEvC,MAAI,CAAC,OAAO,YAAY;AACtB,UAAM,0BAA0B,MAAM;AACtC;AAAA,EACF;AAEA,QAAM,SAAS,QAAQ,OACnB,MAAM,SAAS,CAAC,QAAQ,UAAU;AAChC,YAAQ,IAAI,UAAU,MAAM,GAAG,QAAQ,UAAU,KAAK,KAAK,EAAE,EAAE;AAAA,EACjE,CAAC,IACD,MAAM,gBAAgB;AAE1B,UAAQ,IAAI,SAAS,OAAO,IAAI,EAAE;AAClC,UAAQ,IAAI,sBAAsB,OAAO,iBAAiB,EAAE;AAC5D,UAAQ,IAAI,cAAc,OAAO,SAAS,EAAE;AAC5C,UAAQ,IAAI,wBAAwB,OAAO,sBAAsB,QAAQ,IAAI,EAAE;AAE/E,QAAM,aAAa,MAAM,cAAc;AACvC,UAAQ,IAAI,uBAAuB,WAAW,aAAa,EAAE;AAC/D,CAAC;AAEH,QACG,QAAQ,OAAO,EACf,YAAY,0BAA0B,EACtC,OAAO,wBAAwB,4BAA4B,IAAI,EAC/D,OAAO,OAAO,YAAY;AACzB,QAAM,SAAS,MAAM,gBAAgB,OAAO,QAAQ,KAAK,CAAC;AAE1D,MAAI,OAAO,WAAW,GAAG;AACvB,YAAQ,IAAI,kDAAkD;AAC9D;AAAA,EACF;AAEA,eAAa,OAAO;AACpB,wBAAsB;AACtB,aAAW,SAAS,QAAQ;AAC1B,YAAQ,IAAI,eAAe,KAAK,CAAC;AAAA,EACnC;AACF,CAAC;AAEH,QACG,QAAQ,gBAAgB,EACxB,YAAY,wCAAwC,EACpD,OAAO,wBAAwB,eAAe,IAAI,EAClD,OAAO,OAAO,OAAO,YAAY;AAChC,QAAM,SAAS,MAAM,kBAAkB;AAEvC,MAAI,CAAC,OAAO,YAAY;AACtB,UAAM,0BAA0B,QAAQ;AACxC;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,aAAa,OAAO,OAAO,QAAQ,KAAK,CAAC;AAE9D,MAAI,OAAO,WAAW,GAAG;AACvB,YAAQ,IAAI,6BAA6B;AACzC;AAAA,EACF;AAEA,eAAa,UAAU,GAAG,IAAI,KAAK,CAAC,EAAE;AACtC,wBAAsB;AACtB,aAAW,SAAS,QAAQ;AAC1B,YAAQ,IAAI,eAAe,KAAK,CAAC;AAAA,EACnC;AACF,CAAC;AAEH,QACG,QAAQ,YAAY,EACpB,YAAY,qBAAqB,EACjC,OAAO,OAAO,OAAO;AACpB,QAAM,SAAS,MAAM,kBAAkB;AAEvC,MAAI,CAAC,OAAO,YAAY;AACtB,UAAM,0BAA0B,OAAO;AACvC;AAAA,EACF;AAEA,QAAM,QAAQ,MAAM,WAAW,EAAE;AACjC,eAAa,MAAM,WAAW,OAAO;AACrC,gBAAc,QAAQ,MAAM,WAAW;AACvC,gBAAc,MAAM,MAAM,YAAY,KAAK,IAAI,CAAC;AAChD,gBAAc,QAAQ,IAAI,KAAK,MAAM,IAAI,EAAE,YAAY,CAAC;AACxD,gBAAc,UAAU,MAAM,SAAS,KAAK,IAAI,KAAK,GAAG;AACxD,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,MAAM,aAAa,MAAM,QAAQ,MAAM,OAAO;AAC5D,CAAC;AAEH,QACG,QAAQ,cAAc,EACtB,YAAY,kBAAkB,EAC9B,OAAO,uBAAuB,mCAAmC,EACjE,OAAO,OAAO,IAAI,YAAY;AAC7B,QAAM,SAAS,MAAM,kBAAkB;AAEvC,MAAI,CAAC,OAAO,YAAY;AACtB,UAAM,0BAA0B,SAAS;AACzC;AAAA,EACF;AAEA,MAAI;AACF,UAAM,MAAM,MAAM,kBAAkB,IAAI,QAAQ,KAAK;AAErD,QAAI,IAAI,WAAW,GAAG;AACpB,cAAQ,IAAI,6BAA6B;AACzC;AAAA,IACF;AAEA,UAAM,qBAAqB,QAAQ,OAAO,KAAK,SAAS;AACxD,UAAM,SAAS,MAAM,cAAc,GAAG;AACtC,UAAM,QAAQ,MAAM,gBAAgB;AAAA,MAClC,OAAO,QAAQ;AAAA,MACf,kBAAkB,CAAC,EAAE,MAAM,UAAU,CAAC;AAAA,MACtC;AAAA,IACF,CAAC;AACD,yBAAqB,QAAQ,KAAK;AAAA,EACpC,SAAS,OAAO;AACd,YAAQ,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAClE,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,QACG,QAAQ,2BAA2B,EACnC,YAAY,yBAAyB,EACrC,OAAO,uBAAuB,iCAAiC,EAC/D,OAAO,OAAO,WAAW,OAAO,YAAY;AAC3C,QAAM,SAAS,MAAM,kBAAkB;AAEvC,MAAI,CAAC,OAAO,YAAY;AACtB,UAAM,0BAA0B,OAAO;AACvC;AAAA,EACF;AAEA,QAAM,YAAY,QAAQ,QAAQ,SAAS,YAAY;AACvD,QAAM,KAAK,QAAQ,QAAQ,SAAY;AAEvC,MAAI,CAAC,WAAW;AACd,YAAQ,IAAI,uBAAuB;AACnC,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,MAAI;AACF,UAAM,MAAM,MAAM,kBAAkB,IAAI,QAAQ,KAAK;AAErD,QAAI,IAAI,WAAW,GAAG;AACpB,cAAQ,IAAI,6BAA6B;AACzC;AAAA,IACF;AAEA,UAAM,qBAAqB,QAAQ,OAAO,KAAK,gBAAgB;AAC/D,UAAM,SAAS,MAAM,YAAY,KAAK,SAAS;AAC/C,UAAM,QAAQ,MAAM,gBAAgB;AAAA,MAClC,OAAO,QAAQ;AAAA,MACf,kBAAkB,CAAC,EAAE,MAAM,SAAS,OAAO,UAAU,CAAC;AAAA,MACtD;AAAA,IACF,CAAC;AACD,yBAAqB,QAAQ,KAAK;AAAA,EACpC,SAAS,OAAO;AACd,YAAQ,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAClE,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,QACG,QAAQ,WAAW,EACnB,YAAY,uBAAuB,EACnC,OAAO,uBAAuB,kCAAkC,EAChE,OAAO,OAAO,IAAI,YAAY;AAC7B,QAAM,SAAS,MAAM,kBAAkB;AAEvC,MAAI,CAAC,OAAO,YAAY;AACtB,UAAM,0BAA0B,MAAM;AACtC;AAAA,EACF;AAEA,MAAI;AACF,UAAM,MAAM,MAAM,kBAAkB,IAAI,QAAQ,KAAK;AAErD,QAAI,IAAI,WAAW,GAAG;AACpB,cAAQ,IAAI,6BAA6B;AACzC;AAAA,IACF;AAEA,UAAM,qBAAqB,QAAQ,OAAO,KAAK,cAAc;AAC7D,UAAM,SAAS,MAAM,SAAS,GAAG;AACjC,UAAM,QAAQ,MAAM,gBAAgB;AAAA,MAClC,OAAO,QAAQ;AAAA,MACf,kBAAkB,CAAC,EAAE,MAAM,YAAY,CAAC;AAAA,MACxC;AAAA,IACF,CAAC;AACD,yBAAqB,QAAQ,KAAK;AAAA,EACpC,SAAS,OAAO;AACd,YAAQ,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAClE,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,QACG,QAAQ,sBAAsB,EAC9B,YAAY,kCAAkC,EAC9C,OAAO,OAAO,IAAI,UAAU;AAC3B,QAAM,SAAS,MAAM,kBAAkB;AAEvC,MAAI,CAAC,OAAO,YAAY;AACtB,UAAM,0BAA0B,SAAS;AACzC;AAAA,EACF;AAEA,MAAI;AACF,UAAM,SAAS,MAAM,aAAa,IAAI,KAAK;AAC3C,UAAM,QAAQ,MAAM,gBAAgB;AAAA,MAClC,kBAAkB,CAAC,EAAE,MAAM,WAAW,IAAI,MAAM,CAAC;AAAA,MACjD;AAAA,IACF,CAAC;AACD,yBAAqB,QAAQ,KAAK;AAAA,EACpC,SAAS,OAAO;AACd,YAAQ,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAClE,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,QACG,QAAQ,eAAe,EACvB,YAAY,4BAA4B,EACxC,OAAO,OAAO,UAAU;AACvB,QAAM,SAAS,MAAM,kBAAkB;AAEvC,MAAI,CAAC,OAAO,YAAY;AACtB,UAAM,0BAA0B,MAAM;AACtC;AAAA,EACF;AAEA,MAAI;AACF,UAAM,SAAS,MAAM,QAAQ,KAAK;AAClC,iBAAa,QAAQ,GAAG,IAAI,OAAO,KAAK,CAAC,EAAE;AAC3C,kBAAc,UAAU,aAAa,OAAO,MAAM,CAAC;AACnD,kBAAc,UAAU,GAAG,MAAM,OAAO,OAAO,WAAW,CAAC,CAAC;AAC5D,kBAAc,YAAY,OAAO,eAAe,IAAI,GAAG,OAAO,OAAO,OAAO,YAAY,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC;AACxG,kBAAc,UAAU,OAAO,aAAa,IAAI,GAAG,IAAI,OAAO,OAAO,UAAU,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC;AAE/F,eAAW,WAAW,OAAO,UAAU;AACrC,cAAQ,IAAI,GAAG,GAAG,OAAO,SAAS,CAAC,IAAI,OAAO,EAAE;AAAA,IAClD;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAClE,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,QACG,QAAQ,SAAS,EACjB,YAAY,yBAAyB,EACrC,OAAO,wBAAwB,qBAAqB,IAAI,EACxD,OAAO,gBAAgB,oBAAoB,EAC3C,OAAO,OAAO,YAAY;AACzB,QAAM,OAAO,QAAQ,QACjB,MAAM,eAAe,QAAQ,KAAK,IAClC,MAAM,cAAc,OAAO,QAAQ,KAAK,CAAC;AAE7C,MAAI,KAAK,WAAW,GAAG;AACrB,YAAQ,IAAI,wBAAwB;AACpC;AAAA,EACF;AAEA,oBAAkB,IAAI;AACxB,CAAC;AAEH,IAAM,SAAS,QAAQ,QAAQ,QAAQ,EAAE,YAAY,qBAAqB;AAE1E,OACG,QAAQ,MAAM,EACd,YAAY,uBAAuB,EACnC,OAAO,YAAY;AAClB,QAAM,SAAS,MAAM,kBAAkB;AAEvC,MAAI,CAAC,OAAO,YAAY;AACtB,UAAM,0BAA0B,aAAa;AAC7C;AAAA,EACF;AAEA,QAAMI,UAAS,MAAM,WAAW;AAChC,eAAa,QAAQ;AACrB,UAAQ;AAAA,IACN;AAAA,MACEH,KAAI,GAAG,IAAI,MAAM,GAAG,CAAC;AAAA,MACrBA,KAAI,GAAG,IAAI,MAAM,GAAG,EAAE;AAAA,MACtBA,KAAI,GAAG,IAAI,UAAU,GAAG,EAAE;AAAA,MAC1BA,KAAI,GAAG,IAAI,QAAQ,GAAG,CAAC;AAAA,MACvB,GAAG,IAAI,IAAI;AAAA,IACb,EAAE,KAAK,IAAI;AAAA,EACb;AAEA,aAAW,SAASG,SAAQ;AAC1B,YAAQ;AAAA,MACN;AAAA,QACEH,KAAI,MAAM,SAAS,WAAW,GAAG,KAAK,MAAM,IAAI,IAAI,GAAG,QAAQ,MAAM,IAAI,GAAG,CAAC;AAAA,QAC7EA,KAAID,UAAS,MAAM,MAAM,EAAE,GAAG,EAAE;AAAA,QAChCC,KAAI,OAAO,MAAM,aAAa,GAAG,EAAE;AAAA,QACnCA,KAAI,OAAO,MAAM,cAAc,GAAG,CAAC;AAAA,QACnC,GAAG,IAAI,MAAM,EAAE;AAAA,MACjB,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF;AACF,CAAC;AAEH,OACG,QAAQ,eAAe,EACvB,YAAY,0BAA0B,EACtC,OAAO,OAAO,SAAS;AACtB,QAAM,SAAS,MAAM,kBAAkB;AAEvC,MAAI,CAAC,OAAO,YAAY;AACtB,UAAM,0BAA0B,eAAe;AAC/C;AAAA,EACF;AAEA,MAAI;AACF,UAAM,QAAQ,MAAM,YAAY,IAAI;AACpC,iBAAa,eAAe;AAC5B,kBAAc,QAAQ,MAAM,IAAI;AAChC,kBAAc,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;AAAA,EACtC,SAAS,OAAO;AACd,YAAQ,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAClE,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,IAAM,QAAQ,QAAQ,QAAQ,OAAO,EAAE,YAAY,iBAAiB;AAEpE,MACG,QAAQ,YAAY,EAAE,WAAW,KAAK,CAAC,EACvC,YAAY,sBAAsB,EAClC,OAAO,YAAY;AAClB,QAAM,WAAW,MAAM,iBAAiB;AAExC,MAAI,SAAS,UAAU,GAAG;AACxB,YAAQ,IAAI,kDAAkD;AAC9D;AAAA,EACF;AAEA,qBAAmB,QAAQ;AAC7B,CAAC;AAEH,MACG,QAAQ,SAAS,EACjB,YAAY,uBAAuB,EACnC,OAAO,kBAAkB,qBAAqB,IAAI,EAClD,OAAO,qBAAqB,yCAAyC,KAAK,EAC1E,OAAO,0BAA0B,4BAA4B,EAC7D,OAAO,OAAO,YAAY;AACzB,MAAI;AACF,UAAM,MAAM,mBAAmB,QAAQ,KAAK,KAAK;AACjD,UAAM,YAAY,mBAAmB,QAAQ,WAAW,YAAY;AACpE,UAAM,SAAS,QAAQ;AAEvB,QAAI,CAAC,CAAC,OAAO,QAAQ,SAAS,QAAQ,KAAK,EAAE,SAAS,MAAM,GAAG;AAC7D,YAAM,IAAI,MAAM,qDAAqD;AAAA,IACvE;AAEA,UAAM,UAAU,MAAM,cAAc;AAAA,MAClC,OAAO;AAAA,MACP;AAAA,MACA,eAAe;AAAA,IACjB,CAAC;AAED,QAAI,QAAQ,WAAW,GAAG;AACxB,cAAQ,IAAI,6CAA6C;AACzD;AAAA,IACF;AAEA,yBAAqB,QAAQ,OAAO;AAAA,EACtC,SAAS,OAAO;AACd,YAAQ,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAClE,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,MACG,QAAQ,aAAa,EACrB,YAAY,wCAAwC,EACpD,OAAO,0BAA0B,4BAA4B,EAC7D,OAAO,OAAO,YAAY;AACzB,MAAI;AACF,UAAM,YAAY,mBAAmB,QAAQ,WAAW,YAAY;AACpE,UAAM,cAAc,MAAM,eAAe;AAAA,MACvC,eAAe;AAAA,IACjB,CAAC;AAED,QAAI,YAAY,WAAW,GAAG;AAC5B,cAAQ,IAAI,4CAA4C;AACxD;AAAA,IACF;AAEA,0BAAsB,WAAW;AAAA,EACnC,SAAS,OAAO;AACd,YAAQ,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAClE,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,MACG,QAAQ,QAAQ,EAChB,YAAY,uBAAuB,EACnC,OAAO,YAAY;AAClB,QAAMG,UAAS,MAAM,qBAAqB;AAE1C,MAAIA,QAAO,WAAW,GAAG;AACvB,YAAQ,IAAI,kDAAkD;AAC9D;AAAA,EACF;AAEA,8BAA4BA,OAAM;AACpC,CAAC;AAEH,MACG,QAAQ,QAAQ,EAChB,YAAY,wBAAwB,EACpC,OAAO,qBAAqB,gCAAgC,KAAK,EACjE,OAAO,OAAO,YAAY;AACzB,MAAI;AACF,UAAM,SAAS,QAAQ;AAEvB,QAAI,CAAC,CAAC,OAAO,QAAQ,OAAO,EAAE,SAAS,MAAM,GAAG;AAC9C,YAAM,IAAI,MAAM,0CAA0C;AAAA,IAC5D;AAEA,UAAM,SAAS,MAAM,kBAAkB,QAAQ,eAAe,MAAM,CAAC;AAErE,QAAI,OAAO,WAAW,GAAG;AACvB,cAAQ,IAAI,kDAAkD;AAC9D;AAAA,IACF;AAEA,qBAAiB,QAAQ,MAAM;AAAA,EACjC,SAAS,OAAO;AACd,YAAQ,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAClE,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,MACG,QAAQ,gBAAgB,EACxB,YAAY,wCAAwC,EACpD,OAAO,OAAO,UAAU;AACvB,QAAM,SAAS,MAAM,eAAe,KAAK;AAEzC,MAAI,CAAC,QAAQ;AACX,YAAQ,IAAI,8BAA8B,KAAK,GAAG;AAClD;AAAA,EACF;AAEA,oBAAkB,MAAM;AAC1B,CAAC;AAEH,IAAM,QAAQ,QAAQ,QAAQ,OAAO,EAAE,YAAY,uBAAuB;AAE1E,MACG,QAAQ,eAAe,EACvB,YAAY,8BAA8B,EAC1C,OAAO,OAAO,SAAS;AACtB,QAAM,SAAS,WAAW;AAE1B,MAAI;AACF,UAAM,SAAS,OACX,MAAM,iBAAiB,MAAM,aAAa,IAAI,CAAC,IAC/C,MAAM,eAAe,OAAO,QAAQ;AACxC,2BAAuB,MAAM;AAAA,EAC/B,SAAS,OAAO;AACd,YAAQ,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAClE,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,MACG,QAAQ,eAAe,EACvB,YAAY,sCAAsC,EAClD,OAAO,OAAO,SAAS;AACtB,MAAI;AACF,QAAI,MAAM;AACR,YAAM,OAAO,MAAM,cAAc,IAAI;AAErC,UAAI,CAAC,MAAM;AACT,gBAAQ,IAAI,mBAAmB,IAAI,EAAE;AACrC,gBAAQ,WAAW;AACnB;AAAA,MACF;AAEA,4BAAsB,IAAI;AAC1B;AAAA,IACF;AAEA,UAAMC,SAAQ,MAAM,kBAAkB;AAEtC,QAAIA,OAAM,WAAW,GAAG;AACtB,cAAQ,IAAI,kCAAkC;AAC9C;AAAA,IACF;AAEA,yBAAqBA,MAAK;AAAA,EAC5B,SAAS,OAAO;AACd,YAAQ,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAClE,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,MACG,QAAQ,YAAY,EACpB,YAAY,wCAAwC,EACpD,OAAO,WAAW,uCAAuC,EACzD,OAAO,kBAAkB,6BAA6B,KAAK,EAC3D,OAAO,SAAS,uBAAuB,EACvC,OAAO,OAAO,MAAM,YAAY;AAC/B,QAAM,YAAY,OAAO,QAAQ,GAAG;AAEpC,MAAI,CAAC,OAAO,UAAU,SAAS,KAAK,aAAa,GAAG;AAClD,YAAQ,IAAI,wBAAwB,QAAQ,GAAG,EAAE;AACjD,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,OAAO,CAAC,MAAM;AACzB,YAAQ,IAAI,mCAAmC;AAC/C,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,MAAI,QAAQ,OAAO;AACjB,UAAM,SAAS,MAAM,kBAAkB;AAEvC,QAAI,CAAC,OAAO,YAAY;AACtB,YAAM,0BAA0B,mBAAmB;AACnD;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AACF,QAAI,QAAQ,KAAK;AACf,YAAMC,UAAS,MAAM,YAAY;AAAA,QAC/B,QAAQ,CAAC,QAAQ;AAAA,QACjB;AAAA,MACF,CAAC;AACD,6BAAuBA,OAAM;AAC7B;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,QAAQ,MAAM;AAAA,MACjC,QAAQ,CAAC,QAAQ;AAAA,MACjB;AAAA,IACF,CAAC;AACD,uBAAmB,MAAM;AAAA,EAC3B,SAAS,OAAO;AACd,YAAQ,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAClE,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,MACG,QAAQ,eAAe,EACvB,YAAY,0BAA0B,EACtC,OAAO,OAAO,UAAU;AACvB,QAAM,SAAS,MAAM,kBAAkB;AAEvC,MAAI,CAAC,OAAO,YAAY;AACtB,UAAM,0BAA0B,YAAY;AAC5C;AAAA,EACF;AAEA,MAAI;AACF,UAAM,SAAS,MAAM,QAAQ,KAAK;AAClC,iBAAa,QAAQ,GAAG,IAAI,OAAO,KAAK,CAAC,EAAE;AAC3C,kBAAc,UAAU,aAAa,OAAO,MAAM,CAAC;AACnD,kBAAc,UAAU,GAAG,MAAM,OAAO,OAAO,WAAW,CAAC,CAAC;AAC5D,kBAAc,YAAY,OAAO,eAAe,IAAI,GAAG,OAAO,OAAO,OAAO,YAAY,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC;AACxG,kBAAc,UAAU,OAAO,aAAa,IAAI,GAAG,IAAI,OAAO,OAAO,UAAU,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC;AAAA,EACjG,SAAS,OAAO;AACd,YAAQ,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAClE,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,MACG,QAAQ,eAAe,EACvB,YAAY,wBAAwB,EACpC,OAAO,OAAO,SAAS;AACtB,MAAI;AACF,UAAM,OAAO,MAAM,WAAW,IAAI;AAClC,iBAAa,cAAc;AAC3B,kBAAc,QAAQ,KAAK,IAAI;AAC/B,kBAAc,WAAW,cAAc,KAAK,OAAO,CAAC;AAAA,EACtD,SAAS,OAAO;AACd,YAAQ,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAClE,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,MACG,QAAQ,gBAAgB,EACxB,YAAY,yBAAyB,EACrC,OAAO,OAAO,SAAS;AACtB,MAAI;AACF,UAAM,OAAO,MAAM,YAAY,IAAI;AACnC,iBAAa,eAAe;AAC5B,kBAAc,QAAQ,KAAK,IAAI;AAC/B,kBAAc,WAAW,cAAc,KAAK,OAAO,CAAC;AAAA,EACtD,SAAS,OAAO;AACd,YAAQ,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAClE,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,MACG,QAAQ,MAAM,EACd,YAAY,kDAAkD,EAC9D,OAAO,YAAY;AAClB,QAAM,SAAS,WAAW;AAE1B,MAAI;AACF,UAAM,SAAS,MAAM,YAAY,OAAO,QAAQ;AAEhD,QAAI,OAAO,QAAQ,WAAW,GAAG;AAC/B,cAAQ,IAAI,sBAAsB;AAClC;AAAA,IACF;AAEA,qBAAiB,MAAM;AAAA,EACzB,SAAS,OAAO;AACd,YAAQ,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAClE,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAIH,IAAM,UAAU,QACb,QAAQ,SAAS,EACjB,YAAY,iEAAiE;AAEhF,QACG,QAAQ,MAAM,EACd,YAAY,oCAAoC,EAChD,OAAO,YAAY;AAClB,MAAI;AACF,UAAM,MAAM,MAAM,YAAY;AAE9B,QAAI,IAAI,WAAW,GAAG;AACpB,cAAQ,IAAI,yBAAyB;AACrC;AAAA,IACF;AAEA,iBAAa,eAAe;AAC5B,YAAQ;AAAA,MACN;AAAA,QACEL,KAAI,GAAG,IAAI,IAAI,GAAG,EAAE;AAAA,QACpBA,KAAI,GAAG,IAAI,UAAU,GAAG,EAAE;AAAA,QAC1B,GAAG,IAAI,SAAS;AAAA,MAClB,EAAE,KAAK,IAAI;AAAA,IACb;AAEA,eAAW,KAAK,KAAK;AACnB,YAAM,WAAqB,CAAC;AAC5B,UAAI,EAAE,SAAS,KAAM,UAAS,KAAK,QAAQ,EAAE,SAAS,IAAI,EAAE;AAC5D,UAAI,EAAE,SAAS,GAAI,UAAS,KAAK,MAAM,EAAE,SAAS,EAAE,EAAE;AACtD,UAAI,EAAE,SAAS,QAAS,UAAS,KAAK,WAAW,EAAE,SAAS,OAAO,EAAE;AACrE,UAAI,EAAE,SAAS,MAAO,UAAS,KAAK,SAAS,EAAE,SAAS,KAAK,EAAE;AAC/D,UAAI,EAAE,SAAS,cAAe,UAAS,KAAK,gBAAgB;AAC5D,UAAI,EAAE,SAAS,QAAQ,KAAM,UAAS,KAAK,QAAQ,EAAE,SAAS,kBAAkB,EAAE,GAAG,EAAE,SAAS,IAAI,EAAE;AAEtG,YAAM,UAAoB,CAAC;AAC3B,UAAI,EAAE,QAAQ,QAAS,SAAQ,KAAK,SAAS;AAC7C,UAAI,EAAE,QAAQ,SAAU,SAAQ,KAAK,WAAW;AAChD,UAAI,EAAE,QAAQ,KAAM,SAAQ,KAAK,MAAM;AACvC,UAAI,EAAE,QAAQ,cAAc,SAAS,EAAG,SAAQ,KAAK,SAAS,EAAE,QAAQ,cAAc,KAAK,GAAG,CAAC,EAAE;AACjG,UAAI,EAAE,QAAQ,QAAS,SAAQ,KAAK,WAAW,EAAE,QAAQ,OAAO,EAAE;AAElE,cAAQ;AAAA,QACN;AAAA,UACEA,KAAI,GAAG,IAAI,EAAE,EAAE,GAAG,EAAE;AAAA,UACpBA,KAAID,UAAS,SAAS,KAAK,GAAG,GAAG,EAAE,GAAG,EAAE;AAAA,UACxCA,UAAS,QAAQ,KAAK,IAAI,KAAK,KAAK,EAAE;AAAA,QACxC,EAAE,KAAK,IAAI;AAAA,MACb;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAClE,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,QACG,QAAQ,UAAU,EAClB,YAAY,2CAA2C,EACvD,OAAO,OAAO,OAAe;AAC5B,MAAI;AACF,UAAM,IAAI,MAAM,UAAU,EAAE;AAE5B,iBAAa,QAAQ;AACrB,kBAAc,MAAM,EAAE,EAAE;AACxB,YAAQ,IAAI;AAEZ,YAAQ,IAAI,GAAG,KAAK,UAAU,CAAC;AAC/B,QAAI,EAAE,SAAS,KAAM,eAAc,UAAU,EAAE,SAAS,IAAI;AAC5D,QAAI,EAAE,SAAS,GAAI,eAAc,QAAQ,EAAE,SAAS,EAAE;AACtD,QAAI,EAAE,SAAS,QAAS,eAAc,aAAa,EAAE,SAAS,OAAO;AACrE,QAAI,EAAE,SAAS,MAAO,eAAc,WAAW,EAAE,SAAS,KAAK;AAC/D,QAAI,EAAE,SAAS,aAAc,eAAc,SAAS,EAAE,SAAS,YAAY;AAC3E,QAAI,EAAE,SAAS,cAAe,eAAc,oBAAoB,KAAK;AACrE,QAAI,EAAE,SAAS,aAAc,eAAc,mBAAmB,KAAK;AACnE,QAAI,EAAE,SAAS,QAAQ,MAAM;AAC3B;AAAA,QACE;AAAA,QACA,GAAG,EAAE,SAAS,kBAAkB,EAAE,IAAI,EAAE,SAAS,IAAI;AAAA,MACvD;AAAA,IACF;AACA,YAAQ,IAAI;AAEZ,YAAQ,IAAI,GAAG,KAAK,SAAS,CAAC;AAC9B,QAAI,EAAE,QAAQ,QAAS,eAAc,aAAa,KAAK;AACvD,QAAI,EAAE,QAAQ,SAAU,eAAc,eAAe,KAAK;AAC1D,QAAI,EAAE,QAAQ,KAAM,eAAc,UAAU,KAAK;AACjD,QAAI,EAAE,QAAQ,cAAc,SAAS,EAAG,eAAc,eAAe,EAAE,QAAQ,cAAc,KAAK,IAAI,CAAC;AACvG,QAAI,EAAE,QAAQ,iBAAiB,SAAS,EAAG,eAAc,kBAAkB,EAAE,QAAQ,iBAAiB,KAAK,IAAI,CAAC;AAChH,QAAI,EAAE,QAAQ,QAAS,eAAc,aAAa,EAAE,QAAQ,OAAO;AAAA,EACrE,SAAS,OAAO;AACd,YAAQ,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAClE,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,mCAAmC,EAC/C,OAAO,oBAAoB,gCAAgC,EAC3D,OAAO,kBAAkB,mCAAmC,EAC5D,OAAO,oBAAoB,4CAA4C,EACvE,OAAO,eAAe,iCAAiC,EACvD,OAAO,uBAAuB,0CAA0C,EACxE,OAAO,oBAAoB,+BAA+B,EAC1D,OAAO,mBAAmB,oCAAoC,EAC9D,OAAO,kBAAkB,kCAAkC,QAAQ,EACnE,OAAO,iCAAiC,qCAAqC,EAC7E,OAAO,kBAAkB,0DAA0D,EACnF,OAAO,aAAa,sCAAsC,EAC1D,OAAO,eAAe,8BAA8B,EACpD,OAAO,UAAU,sBAAsB,EACvC,OAAO,qBAAqB,yCAAyC,EACrE,OAAO,OAAO,SAAS;AACtB,MAAI;AACF,UAAM,IAAI,MAAM,aAAa;AAAA,MAC3B,MAAM,KAAK;AAAA,MACX,IAAI,KAAK;AAAA,MACT,SAAS,KAAK;AAAA,MACd,OAAO,KAAK;AAAA,MACZ,cAAc,KAAK;AAAA,MACnB,eAAe,KAAK,iBAAiB;AAAA,MACrC,cAAc,KAAK,gBAAgB;AAAA,MACnC,MAAM,KAAK;AAAA,MACX,gBAAgB,KAAK;AAAA,MACrB,WAAW,KAAK;AAAA,MAChB,SAAS,KAAK,WAAW;AAAA,MACzB,UAAU,KAAK,YAAY;AAAA,MAC3B,MAAM,KAAK,QAAQ;AAAA,MACnB,SAAS,KAAK;AAAA,IAChB,CAAC;AAED,iBAAa,gBAAgB;AAC7B,kBAAc,MAAM,EAAE,EAAE;AACxB,UAAM,cAAwB,CAAC;AAC/B,QAAI,EAAE,SAAS,KAAM,aAAY,KAAK,QAAQ,EAAE,SAAS,IAAI,EAAE;AAC/D,QAAI,EAAE,SAAS,GAAI,aAAY,KAAK,MAAM,EAAE,SAAS,EAAE,EAAE;AACzD,QAAI,EAAE,SAAS,QAAS,aAAY,KAAK,WAAW,EAAE,SAAS,OAAO,EAAE;AACxE,QAAI,EAAE,SAAS,MAAO,aAAY,KAAK,EAAE,SAAS,KAAK;AACvD,QAAI,YAAY,SAAS,EAAG,eAAc,YAAY,YAAY,KAAK,IAAI,CAAC;AAC5E,UAAM,aAAuB,CAAC;AAC9B,QAAI,EAAE,QAAQ,QAAS,YAAW,KAAK,SAAS;AAChD,QAAI,EAAE,QAAQ,SAAU,YAAW,KAAK,WAAW;AACnD,QAAI,EAAE,QAAQ,KAAM,YAAW,KAAK,MAAM;AAC1C,QAAI,EAAE,QAAQ,cAAc,SAAS,EAAG,YAAW,KAAK,UAAU,EAAE,QAAQ,cAAc,KAAK,IAAI,CAAC,EAAE;AACtG,QAAI,EAAE,QAAQ,QAAS,YAAW,KAAK,YAAY,EAAE,QAAQ,OAAO,EAAE;AACtE,QAAI,WAAW,SAAS,EAAG,eAAc,WAAW,WAAW,KAAK,IAAI,CAAC;AAEzE,YAAQ,IAAI;AACZ,YAAQ,IAAI,GAAG,IAAI,mGAAmG,CAAC;AAAA,EACzH,SAAS,OAAO;AACd,YAAQ,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAClE,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,QACG,QAAQ,aAAa,EACrB,YAAY,mCAAmC,EAC/C,OAAO,OAAO,OAAe;AAC5B,MAAI;AACF,UAAM,aAAa,EAAE;AACrB,iBAAa,gBAAgB;AAC7B,kBAAc,MAAM,EAAE;AAAA,EACxB,SAAS,OAAO;AACd,YAAQ,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAClE,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,kFAAkF,EAC9F,OAAO,YAAY;AAClB,QAAM,eAAe;AACvB,CAAC;AAEH,QACG,QAAQ,KAAK,EACb,YAAY,2BAA2B,EACvC,OAAO,YAAY;AAClB,QAAM,eAAe;AACvB,CAAC;AAEH,QAAQ,OAAO,OAAO,YAAY;AAChC,MAAI,QAAQ,MAAM;AAChB,UAAM,eAAe;AACrB;AAAA,EACF;AAEA,QAAM,YAAY;AAAA,IAChB,QAAQ,QAAQ,QAAQ,MAAM;AAAA,EAChC,CAAC;AACH,CAAC;AAED,QAAQ,MAAM;","names":["minutes","rules","text","rows","labels","input","input","labels","rules","existsSync","readFileSync","writeFileSync","dirname","dirname","existsSync","readFileSync","writeFileSync","stripAnsi","truncate","pad","formatRelativeTime","formatPercent","labels","rules","result"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/core/demo/index.ts","../src/tui/app.tsx","../src/core/demo/demo-transport.ts","../src/core/demo/seed.ts","../src/core/setup/setup.ts","../src/core/setup/gcloud.ts","../src/core/setup/credentials.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { createInterface } from \"node:readline/promises\";\nimport { stdin as input, stdout as output } from \"node:process\";\nimport {\n getGoogleCredentialStatus,\n loadConfig,\n type Config,\n} from \"./config.js\";\nimport {\n createExecutionRun,\n addExecutionItems,\n getRecentRuns,\n getRunsByEmail,\n} from \"./core/actions/audit.js\";\nimport { undoRun } from \"./core/actions/undo.js\";\nimport { startOAuthFlow } from \"./core/auth/oauth.js\";\nimport { isTokenExpired, loadTokens, saveTokens } from \"./core/auth/tokens.js\";\nimport { initializeDb } from \"./core/db/client.js\";\nimport { getGmailReadiness } from \"./core/gmail/client.js\";\nimport { createLabel, listLabels } from \"./core/gmail/labels.js\";\nimport { getMessage, listMessages } from \"./core/gmail/messages.js\";\nimport { getThread } from \"./core/gmail/threads.js\";\nimport {\n archiveEmails,\n forwardEmail,\n labelEmails,\n markRead,\n} from \"./core/gmail/modify.js\";\nimport { unsubscribe } from \"./core/gmail/unsubscribe.js\";\nimport { reviewCategorized } from \"./core/stats/anomalies.js\";\nimport { getLabelDistribution } from \"./core/stats/labels.js\";\nimport { getNewsletters } from \"./core/stats/newsletters.js\";\nimport { getNoiseSenders } from \"./core/stats/noise.js\";\nimport { queryEmails } from \"./core/stats/query.js\";\nimport { getSenderStats, getTopSenders } from \"./core/stats/sender.js\";\nimport { getUncategorizedSenders } from \"./core/stats/uncategorized-senders.js\";\nimport { getUnsubscribeSuggestions } from \"./core/stats/unsubscribe.js\";\nimport { getInboxOverview, getVolumeByPeriod } from \"./core/stats/volume.js\";\nimport {\n deployAllRules,\n deployLoadedRule,\n detectDrift,\n disableRule,\n enableRule,\n getAllRulesStatus,\n getRuleStatus,\n} from \"./core/rules/deploy.js\";\nimport { loadRuleFile } from \"./core/rules/loader.js\";\nimport { runAllRules, runRule } from \"./core/rules/executor.js\";\nimport {\n createFilter,\n deleteFilter,\n getFilter,\n listFilters,\n} from \"./core/gmail/filters.js\";\nimport { runDemoSession } from \"./core/demo/index.js\";\nimport { runSetupWizard } from \"./core/setup/setup.js\";\nimport { getGmailTransport } from \"./core/gmail/transport.js\";\nimport { getRecentEmails } from \"./core/sync/cache.js\";\nimport {\n fullSync,\n getSyncStatus,\n incrementalSync,\n reconcileCacheForAuthenticatedAccount,\n} from \"./core/sync/sync.js\";\nimport { startMcpServer } from \"./mcp/server.js\";\nimport { startTuiApp } from \"./tui/app.js\";\nimport type { Action } from \"./core/rules/types.js\";\n\nconst program = new Command();\n\ninterface RuntimeStatus {\n config: Config;\n tokensPresent: boolean;\n tokenExpired: boolean | null;\n googleConfigured: boolean;\n googleMissing: string[];\n gmailReady: boolean;\n}\n\ninterface MutationItem {\n emailId: string;\n status: \"planned\" | \"applied\" | \"warning\" | \"error\" | \"undone\";\n beforeLabelIds: string[];\n afterLabelIds: string[];\n errorMessage?: string | null;\n}\n\ninterface MutationResult {\n items: MutationItem[];\n}\n\nconst colorEnabled = output.isTTY && process.env.NO_COLOR === undefined;\n\nfunction ansi(code: number, value: string): string {\n return colorEnabled ? `\\u001B[${code}m${value}\\u001B[0m` : value;\n}\n\nconst ui = {\n bold: (value: string) => ansi(1, value),\n dim: (value: string) => ansi(2, value),\n cyan: (value: string) => ansi(36, value),\n green: (value: string) => ansi(32, value),\n yellow: (value: string) => ansi(33, value),\n red: (value: string) => ansi(31, value),\n magenta: (value: string) => ansi(35, value),\n};\n\nfunction stripAnsi(value: string): string {\n return value.replace(/\\u001B\\[[0-9;]*m/g, \"\");\n}\n\nfunction truncate(value: string, width: number): string {\n if (width <= 0) {\n return \"\";\n }\n\n if (value.length <= width) {\n return value;\n }\n\n if (width <= 1) {\n return value.slice(0, width);\n }\n\n return `${value.slice(0, width - 1)}…`;\n}\n\nfunction pad(value: string, width: number): string {\n const visible = stripAnsi(value);\n\n if (visible.length >= width) {\n return value;\n }\n\n return `${value}${\" \".repeat(width - visible.length)}`;\n}\n\nfunction printSection(title: string): void {\n console.log(ui.bold(title));\n}\n\nfunction printSimpleTable(headers: string[], rows: string[][]): void {\n const widths = headers.map((header, index) =>\n Math.max(\n header.length,\n ...rows.map((row) => stripAnsi(row[index] || \"\").length),\n ),\n );\n\n console.log(\n headers\n .map((header, index) => pad(ui.dim(header), widths[index] || header.length))\n .join(\" \"),\n );\n\n for (const row of rows) {\n console.log(\n row.map((cell, index) => pad(cell, widths[index] || cell.length)).join(\" \"),\n );\n }\n}\n\nfunction printKeyValue(label: string, value: string): void {\n console.log(`${ui.dim(`${label}:`)} ${value}`);\n}\n\nfunction formatStatus(status: MutationItem[\"status\"] | \"partial\" | \"noop\"): string {\n const upper = status.toUpperCase();\n\n switch (status) {\n case \"applied\":\n case \"undone\":\n return ui.green(upper);\n case \"warning\":\n case \"partial\":\n case \"noop\":\n return ui.yellow(upper);\n case \"error\":\n return ui.red(upper);\n case \"planned\":\n return ui.cyan(upper);\n }\n}\n\nfunction hasLabelChange(item: MutationItem): boolean {\n return item.beforeLabelIds.join(\"\\0\") !== item.afterLabelIds.join(\"\\0\");\n}\n\nfunction formatList(values: string[]): string {\n return values.length > 0 ? values.join(\", \") : \"none\";\n}\n\nasync function loadRuntimeStatus(): Promise<RuntimeStatus> {\n const config = loadConfig();\n initializeDb(config.dbPath);\n\n const tokens = await loadTokens(config.tokensPath);\n const googleStatus = getGoogleCredentialStatus(config);\n const gmailReadiness = getGmailReadiness(config, tokens);\n\n return {\n config,\n tokensPresent: tokens !== null,\n tokenExpired: tokens ? isTokenExpired(tokens) : null,\n googleConfigured: googleStatus.configured,\n googleMissing: googleStatus.missing,\n gmailReady: gmailReadiness.ready,\n };\n}\n\nfunction printCheckpointSummary(status: RuntimeStatus): void {\n printSection(\"Environment\");\n printKeyValue(\"dataDir\", status.config.dataDir);\n printKeyValue(\"dbPath\", status.config.dbPath);\n printKeyValue(\"rulesDir\", status.config.rulesDir);\n printKeyValue(\"tokensPath\", status.config.tokensPath);\n printKeyValue(\n \"googleCredentials\",\n status.googleConfigured ? ui.green(\"configured\") : ui.red(\"missing\"),\n );\n printKeyValue(\"missingGoogleCredentials\", formatList(status.googleMissing));\n printKeyValue(\"tokens\", status.tokensPresent ? ui.green(\"present\") : ui.red(\"missing\"));\n printKeyValue(\n \"tokenExpired\",\n status.tokenExpired === null ? ui.dim(\"unknown (no tokens yet)\") : status.tokenExpired ? ui.red(\"yes\") : ui.green(\"no\"),\n );\n printKeyValue(\"gmailReady\", status.gmailReady ? ui.green(\"yes\") : ui.red(\"no\"));\n}\n\nfunction printGoogleCheckpointInstructions(status: RuntimeStatus): void {\n console.log(\"\");\n console.log(\"Gmail access is not ready yet.\");\n\n if (!status.googleConfigured) {\n console.log(\"Still needed:\");\n console.log(`- GOOGLE_CLIENT_ID${status.googleMissing.includes(\"GOOGLE_CLIENT_ID\") ? \" (missing)\" : \"\"}`);\n console.log(\n `- GOOGLE_CLIENT_SECRET${status.googleMissing.includes(\"GOOGLE_CLIENT_SECRET\") ? \" (missing)\" : \"\"}`,\n );\n console.log(\"- OAuth consent screen configured in Google Cloud\");\n console.log(\"- Localhost redirect URI allowed for the OAuth client\");\n console.log(\"- Run `inboxctl setup` to configure this interactively\");\n return;\n }\n\n if (!status.tokensPresent) {\n console.log(\"Google OAuth credentials are configured, but no Gmail account is authenticated yet.\");\n console.log(\"- Run `inboxctl auth login` to sign in\");\n return;\n }\n\n if (status.tokenExpired) {\n console.log(\"A Gmail account was authenticated before, but the saved token is expired or unusable.\");\n console.log(\"- Run `inboxctl auth login` again\");\n return;\n }\n\n console.log(\"Google OAuth is configured, but Gmail readiness still failed.\");\n console.log(\"- Re-run `inboxctl auth login`\");\n}\n\nasync function requireLiveGmailReadiness(commandName: string): Promise<void> {\n const status = await loadRuntimeStatus();\n\n if (!status.gmailReady) {\n console.log(`${commandName} requires authenticated Gmail access.`);\n printCheckpointSummary(status);\n printGoogleCheckpointInstructions(status);\n process.exitCode = 1;\n return;\n }\n}\n\nasync function resolveAuthenticatedEmail(config: Config): Promise<string | null> {\n const tokens = await loadTokens(config.tokensPath);\n\n if (!tokens) {\n return null;\n }\n\n if (tokens.email && tokens.email !== \"unknown\") {\n return tokens.email;\n }\n\n const transport = await getGmailTransport(config);\n const profile = await transport.getProfile();\n\n if (!profile.emailAddress) {\n return null;\n }\n\n await saveTokens(config.tokensPath, {\n ...tokens,\n email: profile.emailAddress,\n });\n\n return profile.emailAddress;\n}\n\nfunction formatEmailRow(email: {\n id: string;\n date: number;\n fromAddress: string;\n subject: string;\n isRead: boolean;\n}): string {\n const state = pad(email.isRead ? ui.dim(\"read\") : ui.yellow(\"unread\"), 6);\n const date = ui.dim(new Date(email.date).toISOString().slice(0, 10));\n const sender = pad(truncate(email.fromAddress, 30), 30);\n const subject = truncate(email.subject, 58);\n const id = ui.dim(email.id);\n return `${state} ${date} ${sender} ${subject} ${id}`;\n}\n\nfunction printEmailTableHeader(): void {\n console.log(\n [\n pad(ui.dim(\"STATE\"), 6),\n ui.dim(\"DATE\"),\n pad(ui.dim(\"FROM\"), 30),\n ui.dim(\"SUBJECT\"),\n ui.dim(\"ID\"),\n ].join(\" \"),\n );\n}\n\nfunction formatTimestamp(value: number | null | undefined): string {\n if (!value) {\n return \"-\";\n }\n\n return new Date(value).toISOString();\n}\n\nfunction formatDate(value: number | Date | null | undefined): string {\n if (!value) {\n return \"-\";\n }\n\n const timestamp = value instanceof Date ? value.getTime() : value;\n return new Date(timestamp).toISOString().slice(0, 10);\n}\n\nfunction formatRelativeTime(value: number | Date | null | undefined): string {\n if (!value) {\n return \"-\";\n }\n\n const timestamp = value instanceof Date ? value.getTime() : value;\n const diff = Date.now() - timestamp;\n\n if (diff < 0) {\n return formatDate(timestamp);\n }\n\n if (diff < 60_000) {\n return `${Math.max(1, Math.floor(diff / 1_000))}s ago`;\n }\n\n if (diff < 3_600_000) {\n return `${Math.floor(diff / 60_000)}m ago`;\n }\n\n if (diff < 86_400_000) {\n return `${Math.floor(diff / 3_600_000)}h ago`;\n }\n\n if (diff < 604_800_000) {\n return `${Math.floor(diff / 86_400_000)}d ago`;\n }\n\n if (diff < 2_592_000_000) {\n return `${Math.floor(diff / 604_800_000)}w ago`;\n }\n\n return formatDate(timestamp);\n}\n\nfunction formatPercent(value: number): string {\n const normalized = Number.isInteger(value) ? String(value) : value.toFixed(1).replace(/\\.0$/, \"\");\n return `${normalized}%`;\n}\n\nfunction maybePrintJson(enabled: boolean | undefined, value: unknown): boolean {\n if (!enabled) {\n return false;\n }\n\n console.log(JSON.stringify(value, null, 2));\n return true;\n}\n\nfunction formatSenderIdentity(name: string, email: string, width: number): string {\n const identity = name && name !== email ? `${name} <${email}>` : email;\n return pad(truncate(identity, width), width);\n}\n\nfunction parseIntegerOption(value: string, label: string, min: number = 1): number {\n const parsed = Number(value);\n\n if (!Number.isInteger(parsed) || parsed < min) {\n throw new Error(`${label} must be an integer greater than or equal to ${min}.`);\n }\n\n return parsed;\n}\n\nfunction parsePercentOption(value: string | undefined, label: string): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n const parsed = Number(value);\n\n if (Number.isNaN(parsed) || parsed < 0 || parsed > 100) {\n throw new Error(`${label} must be between 0 and 100.`);\n }\n\n return parsed;\n}\n\nfunction printInboxOverview(overview: Awaited<ReturnType<typeof getInboxOverview>>): void {\n printSection(\"Inbox Overview\");\n printKeyValue(\"total\", String(overview.total));\n printKeyValue(\"unread\", overview.unread > 0 ? ui.yellow(String(overview.unread)) : ui.dim(\"0\"));\n printKeyValue(\"starred\", overview.starred > 0 ? ui.magenta(String(overview.starred)) : ui.dim(\"0\"));\n printKeyValue(\n \"today\",\n `${overview.today.received} received, ${overview.today.unread} unread`,\n );\n printKeyValue(\n \"thisWeek\",\n `${overview.thisWeek.received} received, ${overview.thisWeek.unread} unread`,\n );\n printKeyValue(\n \"thisMonth\",\n `${overview.thisMonth.received} received, ${overview.thisMonth.unread} unread`,\n );\n printKeyValue(\n \"oldestUnread\",\n overview.oldestUnread\n ? `${formatRelativeTime(overview.oldestUnread)} (${formatDate(overview.oldestUnread)})`\n : \"-\",\n );\n}\n\nfunction printTopSendersTable(\n label: string,\n senders: Awaited<ReturnType<typeof getTopSenders>>,\n): void {\n printSection(`Top Senders (${label})`);\n console.log(\n [\n pad(ui.dim(\"SENDER\"), 42),\n pad(ui.dim(\"TOTAL\"), 7),\n pad(ui.dim(\"UNREAD\"), 8),\n pad(ui.dim(\"UNREAD%\"), 8),\n ui.dim(\"LAST EMAIL\"),\n ].join(\" \"),\n );\n\n for (const sender of senders) {\n console.log(\n [\n formatSenderIdentity(sender.name, sender.email, 42),\n pad(String(sender.totalMessages), 7),\n pad(String(sender.unreadMessages), 8),\n pad(formatPercent(sender.unreadRate), 8),\n formatRelativeTime(sender.lastEmailDate),\n ].join(\" \"),\n );\n }\n}\n\nfunction printNewslettersTable(\n newsletters: Awaited<ReturnType<typeof getNewsletters>>,\n): void {\n printSection(\"Newsletters\");\n console.log(\n [\n pad(ui.dim(\"SENDER\"), 36),\n pad(ui.dim(\"TOTAL\"), 7),\n pad(ui.dim(\"UNREAD\"), 8),\n pad(ui.dim(\"UNREAD%\"), 8),\n pad(ui.dim(\"STATUS\"), 14),\n pad(ui.dim(\"LAST EMAIL\"), 11),\n ui.dim(\"REASON\"),\n ].join(\" \"),\n );\n\n for (const sender of newsletters) {\n const statusColor =\n sender.status === \"active\"\n ? ui.green(sender.status)\n : sender.status === \"archived\"\n ? ui.dim(sender.status)\n : ui.yellow(sender.status);\n\n console.log(\n [\n formatSenderIdentity(sender.name, sender.email, 36),\n pad(String(sender.messageCount), 7),\n pad(String(sender.unreadCount), 8),\n pad(formatPercent(sender.unreadRate), 8),\n pad(statusColor, 14),\n pad(formatRelativeTime(sender.lastSeen), 11),\n truncate(sender.detectionReason, 32),\n ].join(\" \"),\n );\n }\n}\n\nfunction printLabelDistributionTable(\n labels: Awaited<ReturnType<typeof getLabelDistribution>>,\n): void {\n printSection(\"Label Distribution\");\n console.log(\n [\n pad(ui.dim(\"LABEL\"), 22),\n pad(ui.dim(\"TOTAL\"), 7),\n pad(ui.dim(\"UNREAD\"), 8),\n ui.dim(\"ID\"),\n ].join(\" \"),\n );\n\n for (const label of labels) {\n console.log(\n [\n pad(truncate(label.labelName, 22), 22),\n pad(String(label.totalMessages), 7),\n pad(String(label.unreadMessages), 8),\n ui.dim(label.labelId),\n ].join(\" \"),\n );\n }\n}\n\nfunction printVolumeTable(\n label: string,\n points: Awaited<ReturnType<typeof getVolumeByPeriod>>,\n): void {\n printSection(`Volume (${label})`);\n console.log(\n [\n pad(ui.dim(\"PERIOD\"), 12),\n pad(ui.dim(\"RECEIVED\"), 10),\n pad(ui.dim(\"READ\"), 7),\n pad(ui.dim(\"UNREAD\"), 8),\n ui.dim(\"ARCHIVED\"),\n ].join(\" \"),\n );\n\n for (const point of points) {\n console.log(\n [\n pad(point.period, 12),\n pad(String(point.received), 10),\n pad(String(point.read), 7),\n pad(String(point.unread), 8),\n String(point.archived),\n ].join(\" \"),\n );\n }\n}\n\nfunction formatConfidence(confidence: \"high\" | \"medium\" | \"low\"): string {\n const upper = confidence.toUpperCase();\n\n switch (confidence) {\n case \"high\":\n return ui.green(upper);\n case \"medium\":\n return ui.yellow(upper);\n case \"low\":\n return ui.red(upper);\n }\n}\n\nfunction formatSeverity(severity: \"high\" | \"medium\"): string {\n return severity === \"high\" ? ui.red(severity.toUpperCase()) : ui.yellow(severity.toUpperCase());\n}\n\nfunction formatYesNo(value: boolean): string {\n return value ? ui.green(\"Yes\") : ui.dim(\"No\");\n}\n\nfunction formatImpactLevel(score: number): string {\n if (score >= 25) {\n return ui.red(\"HIGH\");\n }\n\n if (score >= 10) {\n return ui.yellow(\"MEDIUM\");\n }\n\n return ui.green(\"LOW\");\n}\n\nfunction formatGenericCell(value: unknown): string {\n if (value === null || value === undefined) {\n return \"-\";\n }\n\n if (typeof value === \"boolean\") {\n return value ? \"true\" : \"false\";\n }\n\n if (typeof value === \"number\") {\n return Number.isInteger(value) ? String(value) : value.toFixed(1).replace(/\\.0$/, \"\");\n }\n\n return String(value);\n}\n\nfunction printNoiseSendersTable(\n result: Awaited<ReturnType<typeof getNoiseSenders>>,\n): void {\n printSection(`Noise Senders (${result.senders.length})`);\n printSimpleTable(\n [\"SENDER\", \"EMAILS\", \"UNREAD\", \"SCORE\", \"UNSUB?\"],\n result.senders.map((sender) => [\n truncate(sender.name || sender.email, 34),\n String(sender.messageCount),\n formatPercent(sender.unreadRate),\n String(sender.noiseScore),\n formatYesNo(sender.hasUnsubscribeLink),\n ]),\n );\n}\n\nfunction printUncategorizedSendersTable(\n result: Awaited<ReturnType<typeof getUncategorizedSenders>>,\n): void {\n printSection(`Uncategorized: ${result.totalEmails} emails from ${result.totalSenders} senders`);\n console.log(\"\");\n printSimpleTable(\n [\"CONFIDENCE\", \"SENDERS\", \"EMAILS\"],\n [\n [\"HIGH\", String(result.summary.byConfidence.high.senders), String(result.summary.byConfidence.high.emails)],\n [\"MEDIUM\", String(result.summary.byConfidence.medium.senders), String(result.summary.byConfidence.medium.emails)],\n [\"LOW\", String(result.summary.byConfidence.low.senders), String(result.summary.byConfidence.low.emails)],\n ],\n );\n\n if (result.summary.topDomains.length > 0) {\n console.log(\"\");\n printSection(\"Top Domains\");\n printSimpleTable(\n [\"DOMAIN\", \"EMAILS\", \"SENDERS\"],\n result.summary.topDomains.map((domain) => [\n domain.domain,\n String(domain.emails),\n String(domain.senders),\n ]),\n );\n }\n\n console.log(\"\");\n printSection(\"Top Senders\");\n printSimpleTable(\n [\"SENDER\", \"EMAILS\", \"UNREAD\", \"CONFIDENCE\", \"SIGNALS\"],\n result.senders.map((sender) => [\n truncate(sender.name && sender.name !== sender.sender ? `${sender.name} <${sender.sender}>` : sender.sender, 36),\n String(sender.emailCount),\n formatPercent(sender.unreadRate),\n formatConfidence(sender.confidence),\n truncate(sender.signals.join(\", \"), 40),\n ]),\n );\n}\n\nfunction printUnsubscribeSuggestionsTable(\n result: Awaited<ReturnType<typeof getUnsubscribeSuggestions>>,\n): void {\n printSection(`Unsubscribe Suggestions (${result.suggestions.length} candidates)`);\n printSimpleTable(\n [\"SENDER\", \"EMAILS\", \"UNREAD\", \"IMPACT\", \"METHOD\"],\n result.suggestions.map((sender) => [\n truncate(sender.name || sender.email, 34),\n String(sender.allTimeMessageCount),\n formatPercent(sender.unreadRate),\n formatImpactLevel(sender.impactScore),\n sender.unsubscribeMethod,\n ]),\n );\n}\n\nfunction printAnomaliesTable(\n result: Awaited<ReturnType<typeof reviewCategorized>>,\n): void {\n printSection(result.summary);\n\n if (result.anomalies.length === 0) {\n return;\n }\n\n console.log(\"\");\n printSimpleTable(\n [\"SEVERITY\", \"SENDER\", \"SUBJECT\", \"LABEL\", \"RULE\"],\n result.anomalies.map((anomaly) => [\n formatSeverity(anomaly.severity),\n truncate(anomaly.from, 24),\n truncate(anomaly.subject || \"(no subject)\", 32),\n truncate(anomaly.assignedLabel, 14),\n anomaly.rule,\n ]),\n );\n}\n\nfunction printQueryResult(\n result: Awaited<ReturnType<typeof queryEmails>>,\n): void {\n printSection(`Query Results (${result.rows.length} of ${result.totalRows})`);\n\n if (result.rows.length === 0) {\n console.log(\"No rows matched that query.\");\n return;\n }\n\n const headers = Object.keys(result.rows[0] || {});\n printSimpleTable(\n headers.map((header) => header.toUpperCase()),\n result.rows.map((row) => headers.map((header) => formatGenericCell(row[header]))),\n );\n}\n\nfunction printThreadResult(\n result: Awaited<ReturnType<typeof getThread>>,\n): void {\n printSection(`Thread ${ui.dim(result.id)}`);\n printKeyValue(\"messages\", String(result.messages.length));\n\n for (const message of result.messages) {\n console.log(\"\");\n printSection(message.subject || \"(no subject)\");\n printKeyValue(\"from\", message.fromAddress);\n printKeyValue(\"to\", message.toAddresses.join(\", \"));\n printKeyValue(\"date\", new Date(message.date).toISOString());\n printKeyValue(\"labels\", message.labelIds.join(\", \") || \"-\");\n console.log(\"\");\n console.log(message.textPlain || message.body || message.snippet);\n }\n}\n\nfunction printSenderDetail(detail: NonNullable<Awaited<ReturnType<typeof getSenderStats>>>): void {\n printSection(detail.query);\n printKeyValue(\"type\", detail.type);\n printKeyValue(\"name\", detail.name);\n printKeyValue(\"messages\", String(detail.totalMessages));\n printKeyValue(\"unread\", `${detail.unreadMessages} (${formatPercent(detail.unreadRate)})`);\n printKeyValue(\"firstSeen\", formatDate(detail.firstEmailDate));\n printKeyValue(\n \"lastSeen\",\n `${formatRelativeTime(detail.lastEmailDate)} (${formatDate(detail.lastEmailDate)})`,\n );\n printKeyValue(\"labels\", detail.labels.join(\", \") || \"-\");\n\n if (detail.type === \"domain\") {\n printKeyValue(\"matchedSenders\", String(detail.matchingSenders.length));\n for (const sender of detail.matchingSenders) {\n console.log(`- ${sender}`);\n }\n }\n\n if (detail.recentEmails.length === 0) {\n return;\n }\n\n console.log(\"\");\n printSection(\"Recent Emails\");\n console.log(\n [\n pad(ui.dim(\"STATE\"), 6),\n pad(ui.dim(\"DATE\"), 10),\n pad(ui.dim(\"FROM\"), 30),\n ui.dim(\"SUBJECT\"),\n ].join(\" \"),\n );\n\n for (const email of detail.recentEmails) {\n console.log(\n [\n pad(email.isRead ? ui.dim(\"read\") : ui.yellow(\"unread\"), 6),\n pad(formatDate(email.date), 10),\n pad(truncate(email.fromAddress, 30), 30),\n truncate(email.subject || \"(no subject)\", 60),\n ].join(\" \"),\n );\n }\n}\n\nfunction getVolumeRange(period: \"day\" | \"week\" | \"month\"): { start: number; end: number } {\n const end = Date.now();\n const dayMs = 24 * 60 * 60 * 1000;\n\n switch (period) {\n case \"day\":\n return { start: end - 30 * dayMs, end };\n case \"week\":\n return { start: end - 26 * 7 * dayMs, end };\n case \"month\":\n return { start: end - 365 * dayMs, end };\n }\n}\n\nfunction formatActions(actions: Action[]): string {\n if (actions.length === 0) {\n return \"none\";\n }\n\n return actions\n .map((action) => {\n switch (action.type) {\n case \"label\":\n return `label:${action.label}`;\n case \"forward\":\n return `forward:${action.to}`;\n case \"archive\":\n return \"archive\";\n case \"mark_read\":\n return \"mark_read\";\n case \"mark_spam\":\n return \"mark_spam\";\n }\n })\n .join(\", \");\n}\n\nasync function promptForConfirmation(message: string): Promise<boolean> {\n const rl = createInterface({ input, output });\n\n try {\n const answer = await rl.question(`${message} [y/N] `);\n const normalized = answer.trim().toLowerCase();\n return normalized === \"y\" || normalized === \"yes\";\n } finally {\n rl.close();\n }\n}\n\nasync function collectMessageIdsForQuery(query: string): Promise<string[]> {\n const config = loadConfig();\n const transport = await getGmailTransport(config);\n const ids = new Set<string>();\n let pageToken: string | undefined;\n\n do {\n const response = await transport.listMessages({\n query,\n maxResults: 500,\n pageToken,\n });\n\n for (const message of response.messages || []) {\n if (message.id) {\n ids.add(message.id);\n }\n }\n\n pageToken = response.nextPageToken || undefined;\n } while (pageToken);\n\n return [...ids];\n}\n\nasync function resolveMessageIds(id: string | undefined, query?: string): Promise<string[]> {\n if (query) {\n return collectMessageIdsForQuery(query);\n }\n\n if (!id) {\n throw new Error(\"Provide an email ID or use --query to target matching Gmail messages.\");\n }\n\n return [id];\n}\n\nasync function confirmBatchIfNeeded(query: string | undefined, ids: string[], verb: string): Promise<void> {\n if (!query || ids.length <= 1) {\n return;\n }\n\n const confirmed = await promptForConfirmation(\n `Found ${ids.length} emails matching \"${query}\"\\n${verb} all ${ids.length} emails?`,\n );\n\n if (!confirmed) {\n throw new Error(\"Cancelled.\");\n }\n}\n\nasync function recordManualRun(options: {\n query?: string;\n requestedActions: Action[];\n result: MutationResult;\n}): Promise<string> {\n const run = await createExecutionRun({\n sourceType: \"manual\",\n ruleId: null,\n dryRun: false,\n requestedActions: options.requestedActions,\n query: options.query || null,\n status: options.result.items.every((item) => item.status === \"applied\")\n ? \"applied\"\n : options.result.items.some((item) => item.status === \"applied\" || item.status === \"warning\")\n ? \"partial\"\n : \"error\",\n });\n\n await addExecutionItems(\n run.id,\n options.result.items.map((item) => ({\n emailId: item.emailId,\n status: item.status,\n appliedActions: options.requestedActions,\n beforeLabelIds: item.beforeLabelIds,\n afterLabelIds: item.afterLabelIds,\n errorMessage: item.errorMessage || null,\n })),\n );\n\n return run.id;\n}\n\nfunction printMutationSummary(result: MutationResult, runId: string): void {\n const applied = result.items.filter((item) => item.status === \"applied\").length;\n const warnings = result.items.filter((item) => item.status === \"warning\").length;\n const errors = result.items.filter((item) => item.status === \"error\").length;\n const noops = result.items.filter((item) => item.status === \"applied\" && !hasLabelChange(item)).length;\n\n printSection(`Run ${ui.dim(runId)}`);\n printKeyValue(\"total\", String(result.items.length));\n printKeyValue(\"applied\", ui.green(String(applied)));\n printKeyValue(\"noChange\", noops > 0 ? ui.yellow(String(noops)) : ui.dim(\"0\"));\n printKeyValue(\"warnings\", warnings > 0 ? ui.yellow(String(warnings)) : ui.dim(\"0\"));\n printKeyValue(\"errors\", errors > 0 ? ui.red(String(errors)) : ui.dim(\"0\"));\n console.log(\"\");\n\n for (const item of result.items) {\n const displayStatus =\n item.status === \"applied\" && !hasLabelChange(item) ? \"noop\" : item.status;\n const line = [\n pad(formatStatus(displayStatus), 9),\n ui.dim(item.emailId),\n `${ui.dim(\"before\")} ${item.beforeLabelIds.join(\",\") || \"-\"}`,\n `${ui.dim(\"after\")} ${item.afterLabelIds.join(\",\") || \"-\"}`,\n ].join(\" \");\n console.log(line);\n\n if (item.errorMessage) {\n console.log(` ${ui.yellow(\"note\")} ${item.errorMessage}`);\n }\n }\n}\n\nfunction printHistoryTable(runs: Awaited<ReturnType<typeof getRecentRuns>>): void {\n printSection(\"History\");\n console.log(\n [\n pad(ui.dim(\"STATUS\"), 10),\n pad(ui.dim(\"ACTION\"), 20),\n pad(ui.dim(\"WHEN\"), 22),\n pad(ui.dim(\"RUN ID\"), 38),\n ui.dim(\"QUERY\"),\n ].join(\" \"),\n );\n\n for (const run of runs) {\n console.log(\n [\n pad(formatStatus(run.status), 10),\n pad(truncate(formatActions(run.requestedActions), 20), 20),\n pad(ui.dim(formatTimestamp(run.createdAt)), 22),\n pad(ui.dim(run.id), 38),\n truncate(run.query || \"-\", 60),\n ].join(\" \"),\n );\n }\n}\n\nfunction formatEnabled(enabled: boolean): string {\n return enabled ? ui.green(\"enabled\") : ui.yellow(\"disabled\");\n}\n\ntype RuleDeploySummaryInput =\n | Awaited<ReturnType<typeof deployAllRules>>\n | Awaited<ReturnType<typeof deployLoadedRule>>;\n\nfunction printRuleDeploySummary(result: RuleDeploySummaryInput): void {\n const results = (Array.isArray(result) ? result : [result]) as Array<{\n status: \"created\" | \"updated\" | \"unchanged\";\n name: string;\n priority: number;\n enabled: boolean;\n }>;\n\n printSection(\"Rules Deployed\");\n console.log(\n [\n pad(ui.dim(\"STATUS\"), 10),\n pad(ui.dim(\"NAME\"), 28),\n pad(ui.dim(\"PRIORITY\"), 8),\n pad(ui.dim(\"ENABLED\"), 10),\n ui.dim(\"FILE\"),\n ].join(\" \"),\n );\n\n for (const entry of results) {\n const statusColor =\n entry.status === \"created\"\n ? ui.green(entry.status.toUpperCase())\n : entry.status === \"updated\"\n ? ui.yellow(entry.status.toUpperCase())\n : ui.dim(entry.status.toUpperCase());\n\n console.log(\n [\n pad(statusColor, 10),\n pad(entry.name, 28),\n pad(String(entry.priority), 8),\n pad(formatEnabled(entry.enabled), 10),\n truncate(\"-\", 60),\n ].join(\" \"),\n );\n }\n}\n\nfunction printRuleStatusTable(rules: Awaited<ReturnType<typeof getAllRulesStatus>>): void {\n printSection(\"Rules\");\n console.log(\n [\n pad(ui.dim(\"NAME\"), 28),\n pad(ui.dim(\"STATE\"), 10),\n pad(ui.dim(\"PRIORITY\"), 8),\n pad(ui.dim(\"RUNS\"), 6),\n pad(ui.dim(\"LAST RUN\"), 22),\n ui.dim(\"ACTIONS\"),\n ].join(\" \"),\n );\n\n for (const rule of rules) {\n console.log(\n [\n pad(truncate(rule.name, 28), 28),\n pad(formatEnabled(rule.enabled), 10),\n pad(String(rule.priority), 8),\n pad(String(rule.totalRuns), 6),\n pad(ui.dim(formatTimestamp(rule.lastExecutionAt)), 22),\n truncate(formatActions(rule.actions), 40),\n ].join(\" \"),\n );\n }\n}\n\nfunction printRuleStatusDetail(rule: NonNullable<Awaited<ReturnType<typeof getRuleStatus>>>): void {\n printSection(rule.name);\n printKeyValue(\"description\", rule.description || \"-\");\n printKeyValue(\"enabled\", formatEnabled(rule.enabled));\n printKeyValue(\"priority\", String(rule.priority));\n printKeyValue(\"actions\", formatActions(rule.actions));\n printKeyValue(\"totalRuns\", String(rule.totalRuns));\n printKeyValue(\"appliedRuns\", String(rule.appliedRuns));\n printKeyValue(\"partialRuns\", String(rule.partialRuns));\n printKeyValue(\"errorRuns\", String(rule.errorRuns));\n printKeyValue(\"undoneRuns\", String(rule.undoneRuns));\n printKeyValue(\"lastRunId\", rule.lastRunId ? ui.dim(rule.lastRunId) : \"-\");\n printKeyValue(\"lastExecutionAt\", ui.dim(formatTimestamp(rule.lastExecutionAt)));\n}\n\nfunction printRuleRunResult(result: Awaited<ReturnType<typeof runRule>>): void {\n printSection(`Rule ${result.rule.name}`);\n printKeyValue(\"mode\", result.dryRun ? ui.cyan(\"dry-run\") : ui.green(\"apply\"));\n printKeyValue(\"runId\", ui.dim(result.runId));\n printKeyValue(\"status\", formatStatus(result.status));\n printKeyValue(\"matched\", String(result.matchedCount));\n printKeyValue(\"actions\", formatActions(result.rule.actions));\n console.log(\"\");\n\n if (result.items.length === 0) {\n console.log(\"No matching cached emails.\");\n return;\n }\n\n for (const item of result.items) {\n const subject = truncate(item.subject || \"(no subject)\", 50);\n const from = truncate(item.fromAddress || \"-\", 28);\n const date = ui.dim(new Date(item.date).toISOString().slice(0, 10));\n console.log(\n [\n pad(formatStatus(item.status), 9),\n pad(from, 28),\n pad(date, 12),\n subject,\n ].join(\" \"),\n );\n console.log(` ${ui.dim(item.emailId)} matched=${item.matchedFields.join(\",\") || \"-\"}`);\n\n if (item.errorMessage) {\n console.log(` ${ui.yellow(\"note\")} ${item.errorMessage}`);\n }\n }\n\n if (result.dryRun) {\n console.log(\"\");\n console.log(\"Run again with `--apply` to execute these actions.\");\n }\n}\n\nfunction printRunAllRulesResult(result: Awaited<ReturnType<typeof runAllRules>>): void {\n if (result.results.length === 0) {\n console.log(\"No enabled rules are currently deployed.\");\n return;\n }\n\n for (const ruleResult of result.results) {\n printRuleRunResult(ruleResult);\n console.log(\"\");\n }\n}\n\nfunction printDriftReport(result: Awaited<ReturnType<typeof detectDrift>>): void {\n printSection(\"Rule Drift\");\n console.log(\n [\n pad(ui.dim(\"STATUS\"), 14),\n pad(ui.dim(\"NAME\"), 28),\n pad(ui.dim(\"DEPLOYED\"), 16),\n pad(ui.dim(\"FILE\"), 16),\n ui.dim(\"PATH\"),\n ].join(\" \"),\n );\n\n for (const entry of result.entries) {\n const label =\n entry.status === \"in_sync\"\n ? ui.green(\"IN_SYNC\")\n : entry.status === \"changed\"\n ? ui.yellow(\"CHANGED\")\n : ui.red(entry.status.toUpperCase());\n\n console.log(\n [\n pad(label, 14),\n pad(truncate(entry.name, 28), 28),\n pad(truncate(entry.deployedHash || \"-\", 16), 16),\n pad(truncate(entry.fileHash || \"-\", 16), 16),\n truncate(entry.filePath || \"-\", 60),\n ].join(\" \"),\n );\n }\n}\n\nprogram\n .name(\"inboxctl\")\n .description(\"CLI email management with MCP server, rules-as-code, and TUI\")\n .version(\"0.4.0\")\n .option(\"--demo\", \"Launch the seeded demo mailbox\")\n .option(\"--no-sync\", \"Launch the TUI without running the initial background sync\");\n\nprogram\n .command(\"setup\")\n .description(\"Run the interactive Google Cloud and OAuth setup wizard\")\n .option(\"--skip-gcloud\", \"Skip gcloud detection and API enablement\")\n .option(\"--project <id>\", \"Pre-set the Google Cloud project ID\")\n .action(async (options) => {\n try {\n await runSetupWizard({\n skipGcloud: options.skipGcloud,\n project: options.project,\n });\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nconst auth = program.command(\"auth\").description(\"Gmail authentication\");\n\nauth\n .command(\"login\")\n .description(\"Authenticate with Gmail via OAuth2\")\n .action(async () => {\n const config = loadConfig();\n\n try {\n const result = await startOAuthFlow(config);\n const reconciliation = reconcileCacheForAuthenticatedAccount(\n config.dbPath,\n result.email,\n { clearLegacyUnscoped: true },\n );\n console.log(`Authenticated Gmail account: ${result.email}`);\n console.log(`Redirect URI used: ${result.redirectUri}`);\n if (reconciliation.cleared) {\n console.log(\"Local cache reset to avoid mixing data from another Gmail account.\");\n }\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n const status = await loadRuntimeStatus();\n printCheckpointSummary(status);\n printGoogleCheckpointInstructions(status);\n process.exitCode = 1;\n }\n });\n\nauth\n .command(\"status\")\n .description(\"Show authentication status\")\n .action(async () => {\n const status = await loadRuntimeStatus();\n printCheckpointSummary(status);\n\n if (status.tokensPresent) {\n try {\n const email = await resolveAuthenticatedEmail(status.config);\n if (email) {\n console.log(`authenticatedEmail: ${email}`);\n }\n } catch (error) {\n console.log(\n `authenticatedEmail: unavailable (${\n error instanceof Error ? error.message : String(error)\n })`,\n );\n }\n }\n\n if (!status.gmailReady) {\n printGoogleCheckpointInstructions(status);\n }\n });\n\nprogram\n .command(\"sync\")\n .description(\"Sync emails from Gmail\")\n .option(\"--full\", \"Force full sync (ignore incremental)\")\n .action(async (options) => {\n const status = await loadRuntimeStatus();\n\n if (!status.gmailReady) {\n await requireLiveGmailReadiness(\"sync\");\n return;\n }\n\n const result = options.full\n ? await fullSync((synced, total) => {\n console.log(`synced=${synced}${total ? ` total=${total}` : \"\"}`);\n })\n : await incrementalSync();\n\n console.log(`mode: ${result.mode}`);\n console.log(`messagesProcessed: ${result.messagesProcessed}`);\n console.log(`historyId: ${result.historyId}`);\n console.log(`usedHistoryFallback: ${result.usedHistoryFallback ? \"yes\" : \"no\"}`);\n\n const syncStatus = await getSyncStatus();\n console.log(`cacheTotalMessages: ${syncStatus.totalMessages}`);\n });\n\nprogram\n .command(\"inbox\")\n .description(\"List recent inbox emails\")\n .option(\"-n, --count <number>\", \"Number of emails to show\", \"20\")\n .action(async (options) => {\n const emails = await getRecentEmails(Number(options.count));\n\n if (emails.length === 0) {\n console.log(\"No cached emails yet. Run `inboxctl sync` first.\");\n return;\n }\n\n printSection(\"Inbox\");\n printEmailTableHeader();\n for (const email of emails) {\n console.log(formatEmailRow(email));\n }\n });\n\nprogram\n .command(\"search <query>\")\n .description(\"Search emails using Gmail query syntax\")\n .option(\"-n, --count <number>\", \"Max results\", \"20\")\n .action(async (query, options) => {\n const status = await loadRuntimeStatus();\n\n if (!status.gmailReady) {\n await requireLiveGmailReadiness(\"search\");\n return;\n }\n\n const emails = await listMessages(query, Number(options.count));\n\n if (emails.length === 0) {\n console.log(\"No matching Gmail messages.\");\n return;\n }\n\n printSection(`Search ${ui.dim(query)}`);\n printEmailTableHeader();\n for (const email of emails) {\n console.log(formatEmailRow(email));\n }\n });\n\nprogram\n .command(\"email <id>\")\n .description(\"View a single email\")\n .action(async (id) => {\n const status = await loadRuntimeStatus();\n\n if (!status.gmailReady) {\n await requireLiveGmailReadiness(\"email\");\n return;\n }\n\n const email = await getMessage(id);\n printSection(email.subject || \"Email\");\n printKeyValue(\"from\", email.fromAddress);\n printKeyValue(\"to\", email.toAddresses.join(\", \"));\n printKeyValue(\"date\", new Date(email.date).toISOString());\n printKeyValue(\"labels\", email.labelIds.join(\", \") || \"-\");\n console.log(\"\");\n console.log(email.textPlain || email.body || email.snippet);\n });\n\nprogram\n .command(\"thread <id>\")\n .description(\"View a full email thread\")\n .action(async (id) => {\n const status = await loadRuntimeStatus();\n\n if (!status.gmailReady) {\n await requireLiveGmailReadiness(\"thread\");\n return;\n }\n\n try {\n const thread = await getThread(id);\n printThreadResult(thread);\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nprogram\n .command(\"archive [id]\")\n .description(\"Archive email(s)\")\n .option(\"-q, --query <query>\", \"Archive all emails matching query\")\n .action(async (id, options) => {\n const status = await loadRuntimeStatus();\n\n if (!status.gmailReady) {\n await requireLiveGmailReadiness(\"archive\");\n return;\n }\n\n try {\n const ids = await resolveMessageIds(id, options.query);\n\n if (ids.length === 0) {\n console.log(\"No matching Gmail messages.\");\n return;\n }\n\n await confirmBatchIfNeeded(options.query, ids, \"Archive\");\n const result = await archiveEmails(ids);\n const runId = await recordManualRun({\n query: options.query,\n requestedActions: [{ type: \"archive\" }],\n result,\n });\n printMutationSummary(result, runId);\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nprogram\n .command(\"label <idOrLabel> [label]\")\n .description(\"Apply label to email(s)\")\n .option(\"-q, --query <query>\", \"Label all emails matching query\")\n .action(async (idOrLabel, label, options) => {\n const status = await loadRuntimeStatus();\n\n if (!status.gmailReady) {\n await requireLiveGmailReadiness(\"label\");\n return;\n }\n\n const labelName = options.query ? label || idOrLabel : label;\n const id = options.query ? undefined : idOrLabel;\n\n if (!labelName) {\n console.log(\"Provide a label name.\");\n process.exitCode = 1;\n return;\n }\n\n try {\n const ids = await resolveMessageIds(id, options.query);\n\n if (ids.length === 0) {\n console.log(\"No matching Gmail messages.\");\n return;\n }\n\n await confirmBatchIfNeeded(options.query, ids, \"Apply label to\");\n const result = await labelEmails(ids, labelName);\n const runId = await recordManualRun({\n query: options.query,\n requestedActions: [{ type: \"label\", label: labelName }],\n result,\n });\n printMutationSummary(result, runId);\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nprogram\n .command(\"read [id]\")\n .description(\"Mark email(s) as read\")\n .option(\"-q, --query <query>\", \"Mark all matching emails as read\")\n .action(async (id, options) => {\n const status = await loadRuntimeStatus();\n\n if (!status.gmailReady) {\n await requireLiveGmailReadiness(\"read\");\n return;\n }\n\n try {\n const ids = await resolveMessageIds(id, options.query);\n\n if (ids.length === 0) {\n console.log(\"No matching Gmail messages.\");\n return;\n }\n\n await confirmBatchIfNeeded(options.query, ids, \"Mark as read\");\n const result = await markRead(ids);\n const runId = await recordManualRun({\n query: options.query,\n requestedActions: [{ type: \"mark_read\" }],\n result,\n });\n printMutationSummary(result, runId);\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nprogram\n .command(\"forward <id> <email>\")\n .description(\"Forward email to another address\")\n .action(async (id, email) => {\n const status = await loadRuntimeStatus();\n\n if (!status.gmailReady) {\n await requireLiveGmailReadiness(\"forward\");\n return;\n }\n\n try {\n const result = await forwardEmail(id, email);\n const runId = await recordManualRun({\n requestedActions: [{ type: \"forward\", to: email }],\n result,\n });\n printMutationSummary(result, runId);\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nprogram\n .command(\"undo <run-id>\")\n .description(\"Undo a previous action run\")\n .action(async (runId) => {\n const status = await loadRuntimeStatus();\n\n if (!status.gmailReady) {\n await requireLiveGmailReadiness(\"undo\");\n return;\n }\n\n try {\n const result = await undoRun(runId);\n printSection(`Undo ${ui.dim(result.runId)}`);\n printKeyValue(\"status\", formatStatus(result.status));\n printKeyValue(\"undone\", ui.green(String(result.undoneCount)));\n printKeyValue(\"warnings\", result.warningCount > 0 ? ui.yellow(String(result.warningCount)) : ui.dim(\"0\"));\n printKeyValue(\"errors\", result.errorCount > 0 ? ui.red(String(result.errorCount)) : ui.dim(\"0\"));\n\n for (const warning of result.warnings) {\n console.log(`${ui.yellow(\"warning\")} ${warning}`);\n }\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nprogram\n .command(\"history\")\n .description(\"Show recent run history\")\n .option(\"-n, --count <number>\", \"Number of entries\", \"20\")\n .option(\"--email <id>\", \"Filter by email ID\")\n .action(async (options) => {\n const runs = options.email\n ? await getRunsByEmail(options.email)\n : await getRecentRuns(Number(options.count));\n\n if (runs.length === 0) {\n console.log(\"No action history yet.\");\n return;\n }\n\n printHistoryTable(runs);\n });\n\nprogram\n .command(\"query\")\n .description(\"Run structured analytics queries over the cached inbox\")\n .option(\"--group-by <dimension>\", \"Group by sender|domain|label|year_month|year_week|day_of_week|is_read|is_newsletter\")\n .option(\"--aggregate <values...>\", \"Aggregates to return (count, unread_count, unread_rate, newest, oldest, sender_count)\")\n .option(\"--from <address>\", \"Exact sender email\")\n .option(\"--from-contains <text>\", \"Partial sender match\")\n .option(\"--domain <domain>\", \"Exact sender domain\")\n .option(\"--domain-contains <text>\", \"Partial sender domain match\")\n .option(\"--subject-contains <text>\", \"Partial subject match\")\n .option(\"--since <date>\", \"Filter to emails on or after this ISO date\")\n .option(\"--before <date>\", \"Filter to emails on or before this ISO date\")\n .option(\"--read\", \"Only read emails\")\n .option(\"--unread\", \"Only unread emails\")\n .option(\"--newsletter\", \"Only newsletter senders\")\n .option(\"--without-newsletter\", \"Exclude newsletter senders\")\n .option(\"--label <name>\", \"Only emails with a specific label\")\n .option(\"--has-label\", \"Only emails with any user label\")\n .option(\"--without-label\", \"Only emails with no user labels\")\n .option(\"--has-unsubscribe\", \"Only emails with a List-Unsubscribe header\")\n .option(\"--min-sender-messages <number>\", \"Only senders with at least this many total emails\")\n .option(\"--having-count-gte <number>\", \"Require grouped count to be >= this value\")\n .option(\"--having-count-lte <number>\", \"Require grouped count to be <= this value\")\n .option(\"--having-unread-rate-gte <number>\", \"Require grouped unread_rate to be >= this value\")\n .option(\"--sort <value>\", \"Sort expression, for example: \\\"count desc\\\"\")\n .option(\"--limit <number>\", \"Maximum rows to return\", \"50\")\n .option(\"--json\", \"Output raw JSON\")\n .action(async (options) => {\n try {\n if (options.read && options.unread) {\n throw new Error(\"Use only one of --read or --unread.\");\n }\n\n if (options.newsletter && options.withoutNewsletter) {\n throw new Error(\"Use only one of --newsletter or --without-newsletter.\");\n }\n\n if (options.hasLabel && options.withoutLabel) {\n throw new Error(\"Use only one of --has-label or --without-label.\");\n }\n\n const result = await queryEmails({\n filters: {\n ...(options.from ? { from: options.from } : {}),\n ...(options.fromContains ? { from_contains: options.fromContains } : {}),\n ...(options.domain ? { domain: options.domain } : {}),\n ...(options.domainContains ? { domain_contains: options.domainContains } : {}),\n ...(options.subjectContains ? { subject_contains: options.subjectContains } : {}),\n ...(options.since ? { date_after: options.since } : {}),\n ...(options.before ? { date_before: options.before } : {}),\n ...(options.read ? { is_read: true } : {}),\n ...(options.unread ? { is_read: false } : {}),\n ...(options.newsletter ? { is_newsletter: true } : {}),\n ...(options.withoutNewsletter ? { is_newsletter: false } : {}),\n ...(options.label ? { label: options.label } : {}),\n ...(options.hasLabel ? { has_label: true } : {}),\n ...(options.withoutLabel ? { has_label: false } : {}),\n ...(options.hasUnsubscribe ? { has_unsubscribe: true } : {}),\n ...(options.minSenderMessages\n ? { min_sender_messages: parseIntegerOption(options.minSenderMessages, \"min-sender-messages\") }\n : {}),\n },\n ...(options.groupBy ? { group_by: options.groupBy } : {}),\n ...(options.aggregate ? { aggregates: options.aggregate } : {}),\n ...(options.sort ? { order_by: options.sort } : {}),\n ...(options.havingCountGte || options.havingCountLte || options.havingUnreadRateGte\n ? {\n having: {\n ...(options.havingCountGte || options.havingCountLte\n ? {\n count: {\n ...(options.havingCountGte\n ? { gte: parseIntegerOption(options.havingCountGte, \"having-count-gte\") }\n : {}),\n ...(options.havingCountLte\n ? { lte: parseIntegerOption(options.havingCountLte, \"having-count-lte\") }\n : {}),\n },\n }\n : {}),\n ...(options.havingUnreadRateGte\n ? {\n unread_rate: {\n gte: parsePercentOption(options.havingUnreadRateGte, \"having-unread-rate-gte\"),\n },\n }\n : {}),\n },\n }\n : {}),\n limit: parseIntegerOption(options.limit, \"limit\"),\n });\n\n if (maybePrintJson(options.json, result)) {\n return;\n }\n\n printQueryResult(result);\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nprogram\n .command(\"unsubscribe <sender>\")\n .description(\"Return an unsubscribe target for a sender and optionally archive or label existing mail\")\n .option(\"--no-archive\", \"Only return the unsubscribe link, do not archive existing mail\")\n .option(\"--label <name>\", \"Label existing emails while unsubscribing\")\n .action(async (sender, options) => {\n if (options.archive || options.label) {\n const status = await loadRuntimeStatus();\n\n if (!status.gmailReady) {\n await requireLiveGmailReadiness(\"unsubscribe\");\n return;\n }\n }\n\n try {\n const result = await unsubscribe({\n senderEmail: sender,\n alsoArchive: options.archive,\n alsoLabel: options.label,\n });\n\n printSection(`Unsubscribing from ${result.sender}`);\n printKeyValue(\"messages\", String(result.messageCount));\n printKeyValue(\"archived\", String(result.archivedCount));\n printKeyValue(\"labeled\", String(result.labeledCount));\n if (result.runId) {\n printKeyValue(\"runId\", `${ui.dim(result.runId)} (undo with: inboxctl undo ${result.runId})`);\n }\n printKeyValue(\"method\", result.unsubscribeMethod);\n console.log(\"\");\n console.log(result.instruction);\n console.log(\"\");\n console.log(result.unsubscribeLink);\n if (options.archive) {\n console.log(\"\");\n console.log(`Tip: Create a Gmail filter to auto-archive future mail: inboxctl filters create --from ${result.sender} --archive`);\n }\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nconst labels = program.command(\"labels\").description(\"Manage Gmail labels\");\n\nlabels\n .command(\"list\")\n .description(\"List all Gmail labels\")\n .action(async () => {\n const status = await loadRuntimeStatus();\n\n if (!status.gmailReady) {\n await requireLiveGmailReadiness(\"labels list\");\n return;\n }\n\n const labels = await listLabels();\n printSection(\"Labels\");\n console.log(\n [\n pad(ui.dim(\"TYPE\"), 8),\n pad(ui.dim(\"NAME\"), 24),\n pad(ui.dim(\"MESSAGES\"), 10),\n pad(ui.dim(\"UNREAD\"), 8),\n ui.dim(\"ID\"),\n ].join(\" \"),\n );\n\n for (const label of labels) {\n console.log(\n [\n pad(label.type === \"system\" ? ui.cyan(label.type) : ui.magenta(label.type), 8),\n pad(truncate(label.name, 24), 24),\n pad(String(label.messagesTotal), 10),\n pad(String(label.messagesUnread), 8),\n ui.dim(label.id),\n ].join(\" \"),\n );\n }\n });\n\nlabels\n .command(\"create <name>\")\n .description(\"Create a new Gmail label\")\n .action(async (name) => {\n const status = await loadRuntimeStatus();\n\n if (!status.gmailReady) {\n await requireLiveGmailReadiness(\"labels create\");\n return;\n }\n\n try {\n const label = await createLabel(name);\n printSection(\"Label Created\");\n printKeyValue(\"name\", label.name);\n printKeyValue(\"id\", ui.dim(label.id));\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nconst stats = program.command(\"stats\").description(\"Email analytics\");\n\nstats\n .command(\"overview\", { isDefault: true })\n .description(\"Inbox overview stats\")\n .action(async () => {\n const overview = await getInboxOverview();\n\n if (overview.total === 0) {\n console.log(\"No cached emails yet. Run `inboxctl sync` first.\");\n return;\n }\n\n printInboxOverview(overview);\n });\n\nstats\n .command(\"senders\")\n .description(\"Top senders by volume\")\n .option(\"--top <number>\", \"Number of senders\", \"20\")\n .option(\"--period <period>\", \"Time period (day|week|month|year|all)\", \"all\")\n .option(\"--min-unread <percent>\", \"Minimum unread rate filter\")\n .action(async (options) => {\n try {\n const top = parseIntegerOption(options.top, \"top\");\n const minUnread = parsePercentOption(options.minUnread, \"min-unread\");\n const period = options.period as \"day\" | \"week\" | \"month\" | \"year\" | \"all\";\n\n if (![\"day\", \"week\", \"month\", \"year\", \"all\"].includes(period)) {\n throw new Error(\"period must be one of: day, week, month, year, all.\");\n }\n\n const senders = await getTopSenders({\n limit: top,\n period,\n minUnreadRate: minUnread,\n });\n\n if (senders.length === 0) {\n console.log(\"No cached sender stats matched that filter.\");\n return;\n }\n\n printTopSendersTable(period, senders);\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nstats\n .command(\"noise\")\n .description(\"High-noise senders ranked by noise score\")\n .option(\"--top <number>\", \"Number of senders\", \"20\")\n .option(\"--sort <mode>\", \"Sort by noise_score|all_time_noise_score|message_count|unread_rate\", \"noise_score\")\n .option(\"--min-score <number>\", \"Minimum noise score\", \"5\")\n .option(\"--active-days <number>\", \"Only consider recent activity within this many days\", \"90\")\n .option(\"--json\", \"Output raw JSON\")\n .action(async (options) => {\n try {\n const result = await getNoiseSenders({\n limit: parseIntegerOption(options.top, \"top\"),\n sortBy: options.sort,\n minNoiseScore: Number(options.minScore),\n activeDays: parseIntegerOption(options.activeDays, \"active-days\"),\n });\n\n if (maybePrintJson(options.json, result)) {\n return;\n }\n\n if (result.senders.length === 0) {\n console.log(\"No noisy senders matched that filter.\");\n return;\n }\n\n printNoiseSendersTable(result);\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nstats\n .command(\"uncategorized\")\n .description(\"Summarize uncategorized emails by sender\")\n .option(\"--top <number>\", \"Number of senders\", \"20\")\n .option(\"--confidence <level>\", \"Filter by confidence: high|medium|low\")\n .option(\"--min-emails <number>\", \"Minimum uncategorized emails per sender\", \"1\")\n .option(\"--since <date>\", \"Only include uncategorized emails on or after this ISO date\")\n .option(\"--sort <mode>\", \"Sort by email_count|newest|unread_rate\", \"email_count\")\n .option(\"--json\", \"Output raw JSON\")\n .action(async (options) => {\n try {\n const result = await getUncategorizedSenders({\n limit: parseIntegerOption(options.top, \"top\"),\n confidence: options.confidence,\n minEmails: parseIntegerOption(options.minEmails, \"min-emails\"),\n since: options.since,\n sortBy: options.sort,\n });\n\n if (maybePrintJson(options.json, result)) {\n return;\n }\n\n if (result.totalSenders === 0) {\n console.log(\"No uncategorized senders matched that filter.\");\n return;\n }\n\n printUncategorizedSendersTable(result);\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nstats\n .command(\"unsubscribe\")\n .description(\"Rank unsubscribe candidates by impact\")\n .option(\"--top <number>\", \"Number of senders\", \"20\")\n .option(\"--min-emails <number>\", \"Minimum emails from a sender\", \"5\")\n .option(\"--unread-only-senders\", \"Only show senders where every email is unread\")\n .option(\"--json\", \"Output raw JSON\")\n .action(async (options) => {\n try {\n const result = await getUnsubscribeSuggestions({\n limit: parseIntegerOption(options.top, \"top\"),\n minMessages: parseIntegerOption(options.minEmails, \"min-emails\"),\n unreadOnlySenders: options.unreadOnlySenders,\n });\n\n if (maybePrintJson(options.json, result)) {\n return;\n }\n\n if (result.suggestions.length === 0) {\n console.log(\"No unsubscribe suggestions matched that filter.\");\n return;\n }\n\n printUnsubscribeSuggestionsTable(result);\n console.log(\"\");\n console.log(\"Run `inboxctl unsubscribe <sender>` to process a specific sender.\");\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nstats\n .command(\"anomalies\")\n .description(\"Review recently categorized emails for potential misclassifications\")\n .option(\"--since <date>\", \"Only review items on or after this ISO date\")\n .option(\"--limit <number>\", \"Maximum anomalies to return\", \"20\")\n .option(\"--json\", \"Output raw JSON\")\n .action(async (options) => {\n try {\n const result = await reviewCategorized({\n ...(options.since ? { since: options.since } : {}),\n limit: parseIntegerOption(options.limit, \"limit\"),\n });\n\n if (maybePrintJson(options.json, result)) {\n return;\n }\n\n printAnomaliesTable(result);\n if (result.anomalies.length > 0) {\n console.log(\"\");\n console.log(\"Undo a run with `inboxctl undo <run-id>`.\");\n }\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nstats\n .command(\"newsletters\")\n .description(\"Detected newsletters and mailing lists\")\n .option(\"--min-unread <percent>\", \"Minimum unread rate filter\")\n .action(async (options) => {\n try {\n const minUnread = parsePercentOption(options.minUnread, \"min-unread\");\n const newsletters = await getNewsletters({\n minUnreadRate: minUnread,\n });\n\n if (newsletters.length === 0) {\n console.log(\"No newsletter senders matched that filter.\");\n return;\n }\n\n printNewslettersTable(newsletters);\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nstats\n .command(\"labels\")\n .description(\"Email count per label\")\n .action(async () => {\n const labels = await getLabelDistribution();\n\n if (labels.length === 0) {\n console.log(\"No cached emails yet. Run `inboxctl sync` first.\");\n return;\n }\n\n printLabelDistributionTable(labels);\n });\n\nstats\n .command(\"volume\")\n .description(\"Email volume over time\")\n .option(\"--period <period>\", \"Granularity (day|week|month)\", \"day\")\n .action(async (options) => {\n try {\n const period = options.period as \"day\" | \"week\" | \"month\";\n\n if (![\"day\", \"week\", \"month\"].includes(period)) {\n throw new Error(\"period must be one of: day, week, month.\");\n }\n\n const points = await getVolumeByPeriod(period, getVolumeRange(period));\n\n if (points.length === 0) {\n console.log(\"No cached emails yet. Run `inboxctl sync` first.\");\n return;\n }\n\n printVolumeTable(period, points);\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nstats\n .command(\"sender <email>\")\n .description(\"Detailed stats for a sender or @domain\")\n .action(async (email) => {\n const detail = await getSenderStats(email);\n\n if (!detail) {\n console.log(`No cached emails found for ${email}.`);\n return;\n }\n\n printSenderDetail(detail);\n });\n\nconst rules = program.command(\"rules\").description(\"Rule management (IaC)\");\n\nrules\n .command(\"deploy [file]\")\n .description(\"Deploy rules from YAML files\")\n .action(async (file) => {\n const config = loadConfig();\n\n try {\n const result = file\n ? await deployLoadedRule(await loadRuleFile(file))\n : await deployAllRules(config.rulesDir);\n printRuleDeploySummary(result);\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nrules\n .command(\"status [name]\")\n .description(\"Show deployed rules and their status\")\n .action(async (name) => {\n try {\n if (name) {\n const rule = await getRuleStatus(name);\n\n if (!rule) {\n console.log(`Rule not found: ${name}`);\n process.exitCode = 1;\n return;\n }\n\n printRuleStatusDetail(rule);\n return;\n }\n\n const rules = await getAllRulesStatus();\n\n if (rules.length === 0) {\n console.log(\"No rules have been deployed yet.\");\n return;\n }\n\n printRuleStatusTable(rules);\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nrules\n .command(\"run [name]\")\n .description(\"Execute a rule against matching emails\")\n .option(\"--apply\", \"Actually execute (default is dry-run)\")\n .option(\"--max <number>\", \"Maximum emails to process\", \"100\")\n .option(\"--all\", \"Run all enabled rules\")\n .action(async (name, options) => {\n const maxEmails = Number(options.max);\n\n if (!Number.isInteger(maxEmails) || maxEmails <= 0) {\n console.log(`Invalid --max value: ${options.max}`);\n process.exitCode = 1;\n return;\n }\n\n if (!options.all && !name) {\n console.log(\"Provide a rule name or use --all.\");\n process.exitCode = 1;\n return;\n }\n\n if (options.apply) {\n const status = await loadRuntimeStatus();\n\n if (!status.gmailReady) {\n await requireLiveGmailReadiness(\"rules run --apply\");\n return;\n }\n }\n\n try {\n if (options.all) {\n const result = await runAllRules({\n dryRun: !options.apply,\n maxEmails,\n });\n printRunAllRulesResult(result);\n return;\n }\n\n const result = await runRule(name, {\n dryRun: !options.apply,\n maxEmails,\n });\n printRuleRunResult(result);\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nrules\n .command(\"undo <run-id>\")\n .description(\"Undo a specific rule run\")\n .action(async (runId) => {\n const status = await loadRuntimeStatus();\n\n if (!status.gmailReady) {\n await requireLiveGmailReadiness(\"rules undo\");\n return;\n }\n\n try {\n const result = await undoRun(runId);\n printSection(`Undo ${ui.dim(result.runId)}`);\n printKeyValue(\"status\", formatStatus(result.status));\n printKeyValue(\"undone\", ui.green(String(result.undoneCount)));\n printKeyValue(\"warnings\", result.warningCount > 0 ? ui.yellow(String(result.warningCount)) : ui.dim(\"0\"));\n printKeyValue(\"errors\", result.errorCount > 0 ? ui.red(String(result.errorCount)) : ui.dim(\"0\"));\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nrules\n .command(\"enable <name>\")\n .description(\"Enable a deployed rule\")\n .action(async (name) => {\n try {\n const rule = await enableRule(name);\n printSection(\"Rule Enabled\");\n printKeyValue(\"name\", rule.name);\n printKeyValue(\"enabled\", formatEnabled(rule.enabled));\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nrules\n .command(\"disable <name>\")\n .description(\"Disable a deployed rule\")\n .action(async (name) => {\n try {\n const rule = await disableRule(name);\n printSection(\"Rule Disabled\");\n printKeyValue(\"name\", rule.name);\n printKeyValue(\"enabled\", formatEnabled(rule.enabled));\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nrules\n .command(\"diff\")\n .description(\"Show drift between YAML files and deployed rules\")\n .action(async () => {\n const config = loadConfig();\n\n try {\n const result = await detectDrift(config.rulesDir);\n\n if (result.entries.length === 0) {\n console.log(\"No rule files found.\");\n return;\n }\n\n printDriftReport(result);\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\n// ─── filters ────────────────────────────────────────────────────────────────\n\nconst filters = program\n .command(\"filters\")\n .description(\"Gmail server-side filters (always-on, applied at delivery time)\");\n\nfilters\n .command(\"list\")\n .description(\"List all Gmail server-side filters\")\n .action(async () => {\n try {\n const all = await listFilters();\n\n if (all.length === 0) {\n console.log(\"No Gmail filters found.\");\n return;\n }\n\n printSection(\"Gmail Filters\");\n console.log(\n [\n pad(ui.dim(\"ID\"), 32),\n pad(ui.dim(\"CRITERIA\"), 36),\n ui.dim(\"ACTIONS\"),\n ].join(\" \"),\n );\n\n for (const f of all) {\n const criteria: string[] = [];\n if (f.criteria.from) criteria.push(`from:${f.criteria.from}`);\n if (f.criteria.to) criteria.push(`to:${f.criteria.to}`);\n if (f.criteria.subject) criteria.push(`subject:${f.criteria.subject}`);\n if (f.criteria.query) criteria.push(`query:${f.criteria.query}`);\n if (f.criteria.hasAttachment) criteria.push(\"has-attachment\");\n if (f.criteria.size != null) criteria.push(`size:${f.criteria.sizeComparison ?? \"\"}${f.criteria.size}`);\n\n const actions: string[] = [];\n if (f.actions.archive) actions.push(\"archive\");\n if (f.actions.markRead) actions.push(\"mark-read\");\n if (f.actions.star) actions.push(\"star\");\n if (f.actions.addLabelNames.length > 0) actions.push(`label:${f.actions.addLabelNames.join(\",\")}`);\n if (f.actions.forward) actions.push(`forward:${f.actions.forward}`);\n\n console.log(\n [\n pad(ui.dim(f.id), 32),\n pad(truncate(criteria.join(\" \"), 36), 36),\n truncate(actions.join(\", \") || \"-\", 60),\n ].join(\" \"),\n );\n }\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nfilters\n .command(\"get <id>\")\n .description(\"Get details of a Gmail server-side filter\")\n .action(async (id: string) => {\n try {\n const f = await getFilter(id);\n\n printSection(\"Filter\");\n printKeyValue(\"id\", f.id);\n console.log();\n\n console.log(ui.bold(\"Criteria\"));\n if (f.criteria.from) printKeyValue(\" from\", f.criteria.from);\n if (f.criteria.to) printKeyValue(\" to\", f.criteria.to);\n if (f.criteria.subject) printKeyValue(\" subject\", f.criteria.subject);\n if (f.criteria.query) printKeyValue(\" query\", f.criteria.query);\n if (f.criteria.negatedQuery) printKeyValue(\" not\", f.criteria.negatedQuery);\n if (f.criteria.hasAttachment) printKeyValue(\" has-attachment\", \"yes\");\n if (f.criteria.excludeChats) printKeyValue(\" exclude-chats\", \"yes\");\n if (f.criteria.size != null) {\n printKeyValue(\n \" size\",\n `${f.criteria.sizeComparison ?? \"\"} ${f.criteria.size} bytes`,\n );\n }\n console.log();\n\n console.log(ui.bold(\"Actions\"));\n if (f.actions.archive) printKeyValue(\" archive\", \"yes\");\n if (f.actions.markRead) printKeyValue(\" mark-read\", \"yes\");\n if (f.actions.star) printKeyValue(\" star\", \"yes\");\n if (f.actions.addLabelNames.length > 0) printKeyValue(\" add-label\", f.actions.addLabelNames.join(\", \"));\n if (f.actions.removeLabelNames.length > 0) printKeyValue(\" remove-label\", f.actions.removeLabelNames.join(\", \"));\n if (f.actions.forward) printKeyValue(\" forward\", f.actions.forward);\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nfilters\n .command(\"create\")\n .description(\"Create a Gmail server-side filter\")\n .option(\"--from <address>\", \"Match emails from this address\")\n .option(\"--to <address>\", \"Match emails sent to this address\")\n .option(\"--subject <text>\", \"Match emails with this text in the subject\")\n .option(\"--query <q>\", \"Match using Gmail search syntax\")\n .option(\"--negated-query <q>\", \"Exclude emails matching this Gmail query\")\n .option(\"--has-attachment\", \"Match emails with attachments\")\n .option(\"--exclude-chats\", \"Exclude chat messages from matches\")\n .option(\"--size <bytes>\", \"Match emails by size threshold\", parseInt)\n .option(\"--size-comparison <direction>\", \"larger or smaller (use with --size)\")\n .option(\"--label <name>\", \"Apply this label to matching emails (created if missing)\")\n .option(\"--archive\", \"Archive matching emails (skip inbox)\")\n .option(\"--mark-read\", \"Mark matching emails as read\")\n .option(\"--star\", \"Star matching emails\")\n .option(\"--forward <email>\", \"Forward matching emails to this address\")\n .action(async (opts) => {\n try {\n const f = await createFilter({\n from: opts.from,\n to: opts.to,\n subject: opts.subject,\n query: opts.query,\n negatedQuery: opts.negatedQuery,\n hasAttachment: opts.hasAttachment || undefined,\n excludeChats: opts.excludeChats || undefined,\n size: opts.size,\n sizeComparison: opts.sizeComparison,\n labelName: opts.label,\n archive: opts.archive || undefined,\n markRead: opts.markRead || undefined,\n star: opts.star || undefined,\n forward: opts.forward,\n });\n\n printSection(\"Filter Created\");\n printKeyValue(\"id\", f.id);\n const criteriaStr: string[] = [];\n if (f.criteria.from) criteriaStr.push(`from:${f.criteria.from}`);\n if (f.criteria.to) criteriaStr.push(`to:${f.criteria.to}`);\n if (f.criteria.subject) criteriaStr.push(`subject:${f.criteria.subject}`);\n if (f.criteria.query) criteriaStr.push(f.criteria.query);\n if (criteriaStr.length > 0) printKeyValue(\"criteria\", criteriaStr.join(\", \"));\n const actionsStr: string[] = [];\n if (f.actions.archive) actionsStr.push(\"archive\");\n if (f.actions.markRead) actionsStr.push(\"mark-read\");\n if (f.actions.star) actionsStr.push(\"star\");\n if (f.actions.addLabelNames.length > 0) actionsStr.push(`label: ${f.actions.addLabelNames.join(\", \")}`);\n if (f.actions.forward) actionsStr.push(`forward: ${f.actions.forward}`);\n if (actionsStr.length > 0) printKeyValue(\"actions\", actionsStr.join(\", \"));\n\n console.log();\n console.log(ui.dim(\"Note: filters apply to incoming mail from now on. To process existing mail, use `inboxctl rules`.\"));\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nfilters\n .command(\"delete <id>\")\n .description(\"Delete a Gmail server-side filter\")\n .action(async (id: string) => {\n try {\n await deleteFilter(id);\n printSection(\"Filter Deleted\");\n printKeyValue(\"id\", id);\n } catch (error) {\n console.log(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nprogram\n .command(\"demo\")\n .description(\"Launch the seeded demo mailbox for screenshots, recordings, and safe exploration\")\n .action(async () => {\n await runDemoSession();\n });\n\nprogram\n .command(\"mcp\")\n .description(\"Start MCP server on stdio\")\n .action(async () => {\n await startMcpServer();\n });\n\nprogram.action(async (options) => {\n if (options.demo) {\n await runDemoSession();\n return;\n }\n\n await startTuiApp({\n noSync: Boolean(options.noSync),\n });\n});\n\nprogram.parse();\n","import { mkdir, mkdtemp, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { loadConfig } from \"../../config.js\";\nimport { saveTokens } from \"../auth/tokens.js\";\nimport { closeDb, getSqlite, initializeDb } from \"../db/client.js\";\nimport {\n clearGmailTransportOverride,\n setGmailTransportOverride,\n} from \"../gmail/transport.js\";\nimport { syncLabels } from \"../gmail/labels.js\";\nimport { startTuiApp } from \"../../tui/app.js\";\nimport { createDemoTransport } from \"./demo-transport.js\";\nimport { DEMO_ACCOUNT_EMAIL, seedDemoData } from \"./seed.js\";\n\nconst DEMO_ENV_KEYS = [\n \"INBOXCTL_DATA_DIR\",\n \"INBOXCTL_DB_PATH\",\n \"INBOXCTL_RULES_DIR\",\n \"INBOXCTL_TOKENS_PATH\",\n \"GOOGLE_CLIENT_ID\",\n \"GOOGLE_CLIENT_SECRET\",\n \"GOOGLE_REDIRECT_URI\",\n] as const;\n\nasync function seedDemoRulesDirectory(rulesDir: string): Promise<void> {\n const sourcePath = fileURLToPath(\n new URL(\"../rules/example.yaml\", import.meta.url),\n );\n const targetPath = join(rulesDir, \"example.yaml\");\n await mkdir(rulesDir, { recursive: true });\n await writeFile(targetPath, await readFile(sourcePath, \"utf8\"), \"utf8\");\n}\n\nexport async function runDemoSession(): Promise<void> {\n const previousEnv = Object.fromEntries(\n DEMO_ENV_KEYS.map((key) => [key, process.env[key]]),\n ) as Record<(typeof DEMO_ENV_KEYS)[number], string | undefined>;\n const tempDir = await mkdtemp(join(tmpdir(), \"inboxctl-demo-\"));\n const dbPath = join(tempDir, \"demo.db\");\n const rulesDir = join(tempDir, \"rules\");\n const tokensPath = join(tempDir, \"tokens.json\");\n const referenceNow = Date.now();\n\n process.env.INBOXCTL_DATA_DIR = tempDir;\n process.env.INBOXCTL_DB_PATH = dbPath;\n process.env.INBOXCTL_RULES_DIR = rulesDir;\n process.env.INBOXCTL_TOKENS_PATH = tokensPath;\n process.env.GOOGLE_CLIENT_ID = \"demo-client-id\";\n process.env.GOOGLE_CLIENT_SECRET = \"demo-client-secret\";\n process.env.GOOGLE_REDIRECT_URI = \"http://127.0.0.1:3456/callback\";\n\n try {\n await mkdir(dirname(tokensPath), { recursive: true });\n await seedDemoRulesDirectory(rulesDir);\n\n initializeDb(dbPath);\n const sqlite = getSqlite(dbPath);\n const dataset = seedDemoData(sqlite, referenceNow);\n await saveTokens(tokensPath, {\n accessToken: \"demo-access-token\",\n refreshToken: \"demo-refresh-token\",\n expiryDate: referenceNow + 365 * 24 * 60 * 60 * 1000,\n email: DEMO_ACCOUNT_EMAIL,\n });\n\n const config = loadConfig();\n setGmailTransportOverride(config.dataDir, createDemoTransport(dataset));\n await syncLabels({ config, forceRefresh: true });\n await startTuiApp({ noSync: true });\n } finally {\n try {\n clearGmailTransportOverride(tempDir);\n closeDb(dbPath);\n await rm(tempDir, { recursive: true, force: true });\n } finally {\n for (const key of DEMO_ENV_KEYS) {\n const value = previousEnv[key];\n\n if (value === undefined) {\n delete process.env[key];\n } else {\n process.env[key] = value;\n }\n }\n }\n }\n}\n","import { convert } from \"html-to-text\";\nimport {\n Box,\n Newline,\n Spacer,\n Text,\n render,\n useApp,\n useInput,\n useStdout,\n} from \"ink\";\nimport Spinner from \"ink-spinner\";\nimport TextInput from \"ink-text-input\";\nimport React, { useEffect, useState } from \"react\";\nimport { loadConfig } from \"../config.js\";\nimport { undoRun } from \"../core/actions/undo.js\";\nimport { loadTokens } from \"../core/auth/tokens.js\";\nimport type { GmailLabel, EmailDetail, EmailMessage } from \"../core/gmail/types.js\";\nimport { createLabel, listLabels } from \"../core/gmail/labels.js\";\nimport { getMessage, listMessages } from \"../core/gmail/messages.js\";\nimport {\n archiveEmails,\n labelEmails,\n markRead,\n markUnread,\n} from \"../core/gmail/modify.js\";\nimport { getLabelDistribution } from \"../core/stats/labels.js\";\nimport { getNewsletters } from \"../core/stats/newsletters.js\";\nimport { getNoiseSenders } from \"../core/stats/noise.js\";\nimport { getTopSenders } from \"../core/stats/sender.js\";\nimport { getUncategorizedSenders } from \"../core/stats/uncategorized-senders.js\";\nimport { getUnsubscribeSuggestions } from \"../core/stats/unsubscribe.js\";\nimport { getInboxOverview, getVolumeByPeriod } from \"../core/stats/volume.js\";\nimport {\n deployAllRules,\n disableRule,\n enableRule,\n getAllRulesStatus,\n type RuleStatus,\n} from \"../core/rules/deploy.js\";\nimport { runRule } from \"../core/rules/executor.js\";\nimport { getExecutionHistory } from \"../core/rules/history.js\";\nimport { getRecentEmails } from \"../core/sync/cache.js\";\nimport {\n getSyncStatus,\n incrementalSync,\n type SyncProgressEvent,\n} from \"../core/sync/sync.js\";\n\ntype Screen = \"inbox\" | \"email\" | \"stats\" | \"rules\" | \"search\";\ntype StatsTab = \"senders\" | \"labels\" | \"newsletters\" | \"noise\" | \"uncategorized\" | \"unsubscribe\";\ntype RulesFocus = \"rules\" | \"history\";\ntype SearchFocus = \"input\" | \"results\";\ntype FlashTone = \"info\" | \"success\" | \"error\";\n\ninterface AppProps {\n initialSync?: boolean;\n}\n\ninterface FlashMessage {\n tone: FlashTone;\n text: string;\n}\n\ninterface ConfirmState {\n title: string;\n message: string;\n onConfirm: () => Promise<void>;\n}\n\ninterface LabelPickerState {\n open: boolean;\n loading: boolean;\n labels: GmailLabel[];\n selectedIndex: number;\n targetEmailId: string | null;\n createMode: boolean;\n newLabelName: string;\n}\n\ninterface SyncState {\n syncing: boolean;\n message: string;\n lastSync: number | null;\n totalMessages: number;\n resumableProgressCurrent: number;\n resumableProgressTotal: number | null;\n progressCurrent: number;\n progressTotal: number | null;\n progressMode: \"full\" | \"incremental\" | null;\n progressPhase: SyncProgressEvent[\"phase\"] | null;\n startedAt: number | null;\n progressStartedAt: number | null;\n lastProgressAt: number | null;\n lastProgressCurrent: number;\n ratePerSecond: number | null;\n}\n\nconst PAGE_SIZE = 20;\nconst SEARCH_LIMIT = 50;\nconst MIN_CONTENT_HEIGHT = 10;\n\nfunction stripAnsi(value: string): string {\n return value.replace(/\\u001B\\[[0-9;]*m/g, \"\");\n}\n\nfunction pad(value: string, width: number): string {\n const visible = stripAnsi(value);\n\n if (visible.length >= width) {\n return value;\n }\n\n return `${value}${\" \".repeat(width - visible.length)}`;\n}\n\nfunction truncate(value: string, width: number): string {\n if (width <= 0) {\n return \"\";\n }\n\n if (value.length <= width) {\n return value;\n }\n\n if (width === 1) {\n return value.slice(0, 1);\n }\n\n return `${value.slice(0, width - 1)}…`;\n}\n\nfunction flattenWhitespace(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction sanitizeInlineText(value: string, width?: number): string {\n let next = value.replace(/[\\r\\n\\t]+/g, \" \");\n\n if (/<[a-z][\\s\\S]*>/i.test(next)) {\n next = convert(next, {\n wordwrap: false,\n selectors: [{ selector: \"a\", options: { ignoreHref: true } }],\n });\n }\n\n next = flattenWhitespace(next);\n return width ? truncate(next, width) : next;\n}\n\nfunction formatFlashText(value: string): string {\n return sanitizeInlineText(value, 240);\n}\n\nfunction formatRelativeTime(value: number | Date | null | undefined): string {\n if (!value) {\n return \"-\";\n }\n\n const timestamp = value instanceof Date ? value.getTime() : value;\n const diff = Date.now() - timestamp;\n\n if (diff < 60_000) {\n return `${Math.max(1, Math.floor(diff / 1_000))}s ago`;\n }\n\n if (diff < 3_600_000) {\n return `${Math.floor(diff / 60_000)}m ago`;\n }\n\n if (diff < 86_400_000) {\n return `${Math.floor(diff / 3_600_000)}h ago`;\n }\n\n if (diff < 604_800_000) {\n return `${Math.floor(diff / 86_400_000)}d ago`;\n }\n\n return new Date(timestamp).toISOString().slice(0, 10);\n}\n\nfunction formatPercent(value: number): string {\n return `${Number.isInteger(value) ? value : Number(value.toFixed(1))}%`;\n}\n\nfunction formatCount(value: number | null | undefined): string {\n if (value == null) {\n return \"-\";\n }\n\n return new Intl.NumberFormat(\"en-US\").format(value);\n}\n\nfunction formatDurationEstimate(seconds: number): string {\n if (seconds < 60) {\n return `${Math.max(1, Math.round(seconds))}s`;\n }\n\n if (seconds < 3_600) {\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = Math.round(seconds % 60);\n return remainingSeconds === 0 ? `${minutes}m` : `${minutes}m ${remainingSeconds}s`;\n }\n\n const hours = Math.floor(seconds / 3_600);\n const minutes = Math.round((seconds % 3_600) / 60);\n return minutes === 0 ? `${hours}h` : `${hours}h ${minutes}m`;\n}\n\nfunction getMinimumItemsForEta(total: number | null): number {\n if (!total || total <= 0) {\n return 500;\n }\n\n return Math.min(2_000, Math.max(500, Math.floor(total * 0.01)));\n}\n\nfunction clampIndex(index: number, length: number): number {\n if (length <= 0) {\n return 0;\n }\n\n return Math.max(0, Math.min(index, length - 1));\n}\n\nfunction terminalWidth(): number {\n return process.stdout.columns || 100;\n}\n\nfunction terminalHeight(): number {\n return process.stdout.rows || 30;\n}\n\nfunction toneColor(tone: FlashTone): \"blue\" | \"green\" | \"red\" {\n switch (tone) {\n case \"success\":\n return \"green\";\n case \"error\":\n return \"red\";\n case \"info\":\n return \"blue\";\n }\n}\n\nfunction getBodyText(detail: EmailDetail): string {\n if (detail.textPlain?.trim()) {\n return detail.textPlain.trim();\n }\n\n if (detail.bodyHtml?.trim()) {\n return convert(detail.bodyHtml, {\n wordwrap: Math.max(terminalWidth() - 10, 40),\n }).trim();\n }\n\n return detail.body?.trim() || detail.snippet || \"\";\n}\n\nfunction useTerminalSize(): { columns: number; rows: number } {\n const { stdout } = useStdout();\n const [size, setSize] = useState({\n columns: stdout.columns || terminalWidth(),\n rows: stdout.rows || terminalHeight(),\n });\n\n useEffect(() => {\n function handleResize() {\n setSize({\n columns: stdout.columns || terminalWidth(),\n rows: stdout.rows || terminalHeight(),\n });\n }\n\n handleResize();\n stdout.on(\"resize\", handleResize);\n return () => {\n stdout.off(\"resize\", handleResize);\n };\n }, [stdout]);\n\n return size;\n}\n\nfunction getViewportRange(\n length: number,\n selectedIndex: number,\n visibleCount: number,\n): { start: number; end: number } {\n if (length <= visibleCount) {\n return { start: 0, end: length };\n }\n\n const half = Math.floor(visibleCount / 2);\n const start = Math.max(0, Math.min(selectedIndex - half, length - visibleCount));\n return {\n start,\n end: Math.min(length, start + visibleCount),\n };\n}\n\nfunction getScreenGuide(screen: Screen, focus?: RulesFocus | SearchFocus): string {\n const global = \"q quit • s sync • / search • d stats • R rules\";\n\n switch (screen) {\n case \"inbox\":\n return `${global} • j/k move • Enter open • a archive • l label • r read`;\n case \"email\":\n return \"Esc back • j/k scroll • a archive • l label • r toggle read\";\n case \"stats\":\n return \"Esc back • s senders • l labels • n newsletters • o noise • c uncategorized • u unsubscribe\";\n case \"rules\":\n return `Esc back • Tab switch ${focus === \"history\" ? \"history\" : \"rules\"} focus • d deploy • e toggle • r dry-run • R apply • u undo`;\n case \"search\":\n return `Esc back • Enter search • i focus input • ${focus === \"input\" ? \"type Gmail query\" : \"j/k move • Enter open • a archive • l label • r read\"}`;\n }\n}\n\nfunction renderProgressBar(current: number, total: number, width: number): string {\n if (total <= 0 || width <= 0) {\n return \"\";\n }\n\n const ratio = Math.max(0, Math.min(1, current / total));\n const filled = Math.round(ratio * width);\n return `${\"█\".repeat(filled)}${\"░\".repeat(Math.max(0, width - filled))}`;\n}\n\nfunction Panel(props: {\n title: string;\n subtitle?: string;\n accent?: \"cyan\" | \"green\" | \"magenta\" | \"yellow\";\n children: React.ReactNode;\n}) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={props.accent || \"cyan\"}\n paddingX={1}\n paddingY={0}\n width=\"100%\"\n >\n <Box>\n <Text bold color={props.accent || \"cyan\"}>\n {props.title}\n </Text>\n <Spacer />\n {props.subtitle ? <Text color=\"gray\">{props.subtitle}</Text> : null}\n </Box>\n {props.children}\n </Box>\n );\n}\n\nfunction Header(props: {\n screen: Screen;\n sync: SyncState;\n columns: number;\n guide: string;\n}) {\n const items: Array<{ key: Screen; label: string }> = [\n { key: \"inbox\", label: \"Inbox\" },\n { key: \"email\", label: \"Email\" },\n { key: \"stats\", label: \"Stats\" },\n { key: \"rules\", label: \"Rules\" },\n { key: \"search\", label: \"Search\" },\n ];\n\n return (\n <Box\n width={props.columns}\n borderStyle=\"round\"\n borderColor=\"blue\"\n paddingX={1}\n paddingY={0}\n flexDirection=\"column\"\n >\n <Box>\n <Text bold color=\"cyan\">\n inboxctl\n </Text>\n <Text color=\"gray\"> local-first Gmail cockpit</Text>\n <Spacer />\n <Text color={props.sync.syncing ? \"yellow\" : \"gray\"}>\n {props.sync.syncing ? props.sync.message : \"ready\"}\n </Text>\n </Box>\n <Box marginTop={1}>\n {items.map((item, index) => (\n <Box key={item.key} marginRight={index === items.length - 1 ? 0 : 2}>\n <Text color={props.screen === item.key ? \"black\" : \"gray\"} backgroundColor={props.screen === item.key ? \"cyan\" : undefined}>\n {` ${item.label} `}\n </Text>\n </Box>\n ))}\n </Box>\n <Box marginTop={1}>\n <Text color=\"gray\">{truncate(props.guide, Math.max(20, props.columns - 4))}</Text>\n </Box>\n </Box>\n );\n}\n\nfunction EmailList(props: {\n emails: EmailMessage[];\n selectedIndex: number;\n title: string;\n loading?: boolean;\n emptyMessage: string;\n visibleRows: number;\n subtitle?: string;\n}) {\n const senderWidth = 28;\n const dateWidth = 10;\n const subjectWidth = Math.max(terminalWidth() - senderWidth - dateWidth - 20, 20);\n const { start, end } = getViewportRange(props.emails.length, props.selectedIndex, props.visibleRows);\n const visibleEmails = props.emails.slice(start, end);\n\n return (\n <Panel\n title={props.title}\n subtitle={props.subtitle || `${props.emails.length} loaded`}\n accent=\"cyan\"\n >\n <Text color=\"gray\">\n {pad(\"STATE\", 6)} {pad(\"FROM\", senderWidth)} {pad(\"DATE\", dateWidth)} SUBJECT\n </Text>\n {props.loading ? (\n <Box marginTop={1}>\n <Text color=\"cyan\">\n <Spinner type=\"dots\" /> Loading inbox…\n </Text>\n </Box>\n ) : props.emails.length === 0 ? (\n <Text color=\"gray\">{props.emptyMessage}</Text>\n ) : (\n <>\n {visibleEmails.map((email, index) => {\n const absoluteIndex = start + index;\n const selected = absoluteIndex === props.selectedIndex;\n const sender = sanitizeInlineText(email.fromName || email.fromAddress || \"(unknown)\", senderWidth);\n const subject = sanitizeInlineText(email.subject || \"(no subject)\", subjectWidth);\n const state = email.isRead ? \" \" : \"●\";\n\n return (\n <Text\n key={email.id}\n backgroundColor={selected ? \"white\" : undefined}\n color={selected ? \"black\" : !email.isRead ? \"white\" : \"gray\"}\n bold={!email.isRead}\n >\n {pad(state, 6)} {pad(sender, senderWidth)} {pad(formatRelativeTime(email.date), dateWidth)} {subject}\n </Text>\n );\n })}\n <Box marginTop={1}>\n <Text color=\"gray\">\n showing {start + 1}-{end} of {props.emails.length}\n </Text>\n </Box>\n </>\n )}\n </Panel>\n );\n}\n\nfunction Table(props: {\n title: string;\n headers: string[];\n rows: string[][];\n emptyMessage: string;\n}) {\n const widths = props.headers.map((header, index) =>\n Math.max(\n header.length,\n ...props.rows.map((row) => stripAnsi(row[index] || \"\").length),\n ),\n );\n\n return (\n <Panel title={props.title} accent=\"magenta\">\n {props.rows.length === 0 ? (\n <Text color=\"gray\">{props.emptyMessage}</Text>\n ) : (\n <>\n <Text color=\"gray\">\n {props.headers.map((header, index) => pad(header, widths[index] || header.length)).join(\" \")}\n </Text>\n {props.rows.map((row, index) => (\n <Text key={`${props.title}-${index}`}>\n {row.map((cell, cellIndex) => pad(cell, widths[cellIndex] || cell.length)).join(\" \")}\n </Text>\n ))}\n </>\n )}\n </Panel>\n );\n}\n\nfunction Modal(props: {\n title: string;\n children: React.ReactNode;\n}) {\n return (\n <Box\n borderStyle=\"round\"\n borderColor=\"cyan\"\n paddingX={1}\n paddingY={0}\n marginTop={1}\n flexDirection=\"column\"\n >\n <Text bold color=\"cyan\">\n {props.title}\n </Text>\n {props.children}\n </Box>\n );\n}\n\nfunction StatusBar(props: {\n screen: Screen;\n email: string | null;\n unreadCount: number;\n sync: SyncState;\n flash: FlashMessage | null;\n columns: number;\n}) {\n const lastSync = props.sync.lastSync ? formatRelativeTime(props.sync.lastSync) : \"never\";\n const progressWidth = Math.max(12, Math.min(36, Math.floor((props.columns - 48) / 2)));\n const hasProgressBar =\n props.sync.syncing &&\n props.sync.progressTotal !== null &&\n props.sync.progressTotal > 0;\n const progressBar = hasProgressBar\n ? renderProgressBar(\n props.sync.progressCurrent,\n props.sync.progressTotal || 0,\n progressWidth,\n )\n : \"\";\n const progressSummary = hasProgressBar\n ? `${formatCount(props.sync.progressCurrent)} / ${formatCount(props.sync.progressTotal)}`\n : props.sync.syncing\n ? props.sync.progressMode === \"incremental\"\n ? \"checking for changes\"\n : \"preparing sync\"\n : `Last sync ${lastSync}`;\n const elapsedSeconds = props.sync.startedAt\n ? Math.max(1, (Date.now() - props.sync.startedAt) / 1_000)\n : 0;\n const remainingItems = props.sync.progressTotal !== null\n ? Math.max(0, props.sync.progressTotal - props.sync.progressCurrent)\n : 0;\n const minimumItemsForEta = getMinimumItemsForEta(props.sync.progressTotal);\n const canShowEta =\n hasProgressBar &&\n props.sync.progressMode === \"full\" &&\n props.sync.progressPhase === \"fetching_messages\" &&\n props.sync.ratePerSecond !== null &&\n props.sync.ratePerSecond > 0 &&\n elapsedSeconds >= 15 &&\n props.sync.progressCurrent >= minimumItemsForEta &&\n remainingItems > 0;\n const etaSummary = canShowEta\n ? `ETA ~${formatDurationEstimate(remainingItems / (props.sync.ratePerSecond || 1))}`\n : hasProgressBar &&\n props.sync.progressMode === \"full\" &&\n props.sync.progressPhase === \"fetching_messages\" &&\n props.sync.progressCurrent > 0 &&\n remainingItems > 0\n ? \"ETA calculating…\"\n : null;\n\n return (\n <Box\n borderStyle=\"round\"\n borderColor={props.flash ? toneColor(props.flash.tone) : \"gray\"}\n paddingX={1}\n paddingY={0}\n flexDirection=\"column\"\n width=\"100%\"\n >\n <Box>\n <Text color=\"cyan\">inboxctl</Text>\n <Text color=\"gray\"> {props.email || \"not authenticated\"}</Text>\n <Spacer />\n <Text color=\"yellow\">{props.unreadCount} unread</Text>\n <Text color=\"gray\"> | </Text>\n <Text color=\"gray\">{truncate(progressSummary, Math.max(18, props.columns - 56))}</Text>\n <Text color=\"gray\"> | </Text>\n <Text color=\"magenta\">{props.screen}</Text>\n </Box>\n {props.sync.syncing ? (\n <>\n <Newline />\n <Box>\n <Text color={props.sync.progressMode === \"full\" ? \"yellow\" : \"cyan\"}>\n {props.sync.progressMode === \"full\" ? \"full\" : \"incr\"}\n </Text>\n <Text color=\"gray\"> {truncate(props.sync.message, Math.max(24, props.columns - 34))}</Text>\n {hasProgressBar ? (\n <>\n <Spacer />\n {etaSummary ? <Text color=\"gray\">{etaSummary} </Text> : null}\n <Text color=\"green\">{progressBar}</Text>\n <Text color=\"gray\"> {formatPercent((props.sync.progressCurrent / (props.sync.progressTotal || 1)) * 100)}</Text>\n </>\n ) : null}\n </Box>\n </>\n ) : null}\n {props.flash ? (\n <>\n <Newline />\n <Text color={toneColor(props.flash.tone)}>{props.flash.text}</Text>\n </>\n ) : null}\n </Box>\n );\n}\n\nexport function App({ initialSync = true }: AppProps) {\n const { exit } = useApp();\n const { columns, rows } = useTerminalSize();\n const config = loadConfig();\n\n const [screen, setScreen] = useState<Screen>(\"inbox\");\n const [emailOrigin, setEmailOrigin] = useState<\"inbox\" | \"search\">(\"inbox\");\n const [flash, setFlash] = useState<FlashMessage | null>(null);\n const [confirmState, setConfirmState] = useState<ConfirmState | null>(null);\n\n const [authEmail, setAuthEmail] = useState<string | null>(null);\n const [syncState, setSyncState] = useState<SyncState>({\n syncing: false,\n message: \"Syncing…\",\n lastSync: null,\n totalMessages: 0,\n resumableProgressCurrent: 0,\n resumableProgressTotal: null,\n progressCurrent: 0,\n progressTotal: null,\n progressMode: null,\n progressPhase: null,\n startedAt: null,\n progressStartedAt: null,\n lastProgressAt: null,\n lastProgressCurrent: 0,\n ratePerSecond: null,\n });\n const [unreadCount, setUnreadCount] = useState(0);\n\n const [inboxEmails, setInboxEmails] = useState<EmailMessage[]>([]);\n const [inboxSelectedIndex, setInboxSelectedIndex] = useState(0);\n const [inboxLoading, setInboxLoading] = useState(true);\n const [inboxHasMore, setInboxHasMore] = useState(true);\n\n const [selectedEmailId, setSelectedEmailId] = useState<string | null>(null);\n const [emailDetail, setEmailDetail] = useState<EmailDetail | null>(null);\n const [emailBody, setEmailBody] = useState(\"\");\n const [emailLoading, setEmailLoading] = useState(false);\n const [emailScroll, setEmailScroll] = useState(0);\n\n const [statsLoading, setStatsLoading] = useState(false);\n const [statsTab, setStatsTab] = useState<StatsTab>(\"senders\");\n const [statsOverview, setStatsOverview] = useState<Awaited<ReturnType<typeof getInboxOverview>> | null>(null);\n const [statsSenders, setStatsSenders] = useState<Awaited<ReturnType<typeof getTopSenders>>>([]);\n const [statsLabels, setStatsLabels] = useState<Awaited<ReturnType<typeof getLabelDistribution>>>([]);\n const [statsNewsletters, setStatsNewsletters] = useState<Awaited<ReturnType<typeof getNewsletters>>>([]);\n const [statsNoise, setStatsNoise] = useState<Awaited<ReturnType<typeof getNoiseSenders>>[\"senders\"]>([]);\n const [statsUncategorized, setStatsUncategorized] = useState<Awaited<ReturnType<typeof getUncategorizedSenders>> | null>(null);\n const [statsUnsubscribe, setStatsUnsubscribe] = useState<Awaited<ReturnType<typeof getUnsubscribeSuggestions>>[\"suggestions\"]>([]);\n const [statsVolume, setStatsVolume] = useState<Awaited<ReturnType<typeof getVolumeByPeriod>>>([]);\n\n const [rulesLoading, setRulesLoading] = useState(false);\n const [rulesFocus, setRulesFocus] = useState<RulesFocus>(\"rules\");\n const [rules, setRules] = useState<RuleStatus[]>([]);\n const [rulesSelectedIndex, setRulesSelectedIndex] = useState(0);\n const [ruleHistory, setRuleHistory] = useState<Awaited<ReturnType<typeof getExecutionHistory>>>([]);\n const [historySelectedIndex, setHistorySelectedIndex] = useState(0);\n\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [searchFocus, setSearchFocus] = useState<SearchFocus>(\"input\");\n const [searchLoading, setSearchLoading] = useState(false);\n const [searchResults, setSearchResults] = useState<EmailMessage[]>([]);\n const [searchSelectedIndex, setSearchSelectedIndex] = useState(0);\n\n const [labelPicker, setLabelPicker] = useState<LabelPickerState>({\n open: false,\n loading: false,\n labels: [],\n selectedIndex: 0,\n targetEmailId: null,\n createMode: false,\n newLabelName: \"\",\n });\n\n function pushFlash(tone: FlashTone, text: string) {\n setFlash({ tone, text: formatFlashText(text) });\n }\n\n async function refreshStatus(): Promise<void> {\n const [syncStatus, overview, tokens] = await Promise.all([\n getSyncStatus(),\n getInboxOverview(),\n loadTokens(config.tokensPath),\n ]);\n\n setSyncState((current) => ({\n ...current,\n lastSync: syncStatus.lastIncrementalSync ?? syncStatus.lastFullSync,\n totalMessages: syncStatus.totalMessages,\n resumableProgressCurrent: syncStatus.fullSyncProcessed,\n resumableProgressTotal: syncStatus.fullSyncTotal,\n }));\n setUnreadCount(overview.unread);\n setAuthEmail(tokens?.email && tokens.email !== \"unknown\" ? tokens.email : null);\n }\n\n async function loadInbox(reset: boolean): Promise<void> {\n setInboxLoading(true);\n\n try {\n const offset = reset ? 0 : inboxEmails.length;\n const rows = await getRecentEmails(PAGE_SIZE, offset);\n\n setInboxEmails((current) => (reset ? rows : [...current, ...rows]));\n setInboxHasMore(rows.length === PAGE_SIZE);\n setInboxSelectedIndex((current) => clampIndex(reset ? 0 : current, reset ? rows.length : offset + rows.length));\n } catch (error) {\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n } finally {\n setInboxLoading(false);\n }\n }\n\n async function loadStats(): Promise<void> {\n setStatsLoading(true);\n\n try {\n const [overview, senders, labels, newsletters, noise, uncategorized, unsubscribe, volume] = await Promise.all([\n getInboxOverview(),\n getTopSenders({ limit: 10 }),\n getLabelDistribution(),\n getNewsletters({ minMessages: 1 }),\n getNoiseSenders({ limit: 10 }),\n getUncategorizedSenders({ limit: 10 }),\n getUnsubscribeSuggestions({ limit: 10 }),\n getVolumeByPeriod(\"day\", { start: Date.now() - 30 * 24 * 60 * 60 * 1000, end: Date.now() }),\n ]);\n\n setStatsOverview(overview);\n setStatsSenders(senders);\n setStatsLabels(labels.slice(0, 10));\n setStatsNewsletters(newsletters.slice(0, 10));\n setStatsNoise(noise.senders);\n setStatsUncategorized(uncategorized);\n setStatsUnsubscribe(unsubscribe.suggestions);\n setStatsVolume(volume.slice(-7));\n } catch (error) {\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n } finally {\n setStatsLoading(false);\n }\n }\n\n async function loadRules(): Promise<void> {\n setRulesLoading(true);\n\n try {\n const [nextRules, nextHistory] = await Promise.all([\n getAllRulesStatus(),\n getExecutionHistory(undefined, 10),\n ]);\n\n setRules(nextRules);\n setRuleHistory(nextHistory);\n setRulesSelectedIndex((current) => clampIndex(current, nextRules.length));\n setHistorySelectedIndex((current) => clampIndex(current, nextHistory.length));\n } catch (error) {\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n } finally {\n setRulesLoading(false);\n }\n }\n\n async function loadEmailDetail(emailId: string): Promise<void> {\n setEmailLoading(true);\n setEmailScroll(0);\n\n try {\n const detail = await getMessage(emailId);\n setEmailDetail(detail);\n setEmailBody(getBodyText(detail));\n } catch (error) {\n setEmailDetail(null);\n setEmailBody(\"\");\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n } finally {\n setEmailLoading(false);\n }\n }\n\n async function runSync(message: string): Promise<void> {\n const startedAt = Date.now();\n\n setSyncState((current) => ({\n ...current,\n syncing: true,\n message,\n progressCurrent: current.resumableProgressCurrent,\n progressTotal: current.resumableProgressTotal,\n progressMode: current.resumableProgressCurrent > 0 ? \"full\" : null,\n progressPhase: current.resumableProgressCurrent > 0 ? \"starting\" : \"starting\",\n startedAt,\n progressStartedAt: null,\n lastProgressAt: startedAt,\n lastProgressCurrent: current.resumableProgressCurrent,\n ratePerSecond: null,\n }));\n\n try {\n await incrementalSync(\n (synced, total) => {\n setSyncState((current) => {\n const now = Date.now();\n const progressStartedAt =\n current.progressStartedAt ?? (synced > 0 ? now : null);\n const elapsedSinceProgressStart = progressStartedAt\n ? (now - progressStartedAt) / 1_000\n : 0;\n const nextRate =\n synced > 0 && elapsedSinceProgressStart > 0\n ? synced / elapsedSinceProgressStart\n : current.ratePerSecond;\n\n return {\n ...current,\n progressCurrent: synced,\n progressTotal: total,\n progressStartedAt,\n lastProgressAt: now,\n lastProgressCurrent: Math.max(current.lastProgressCurrent, synced),\n ratePerSecond: nextRate,\n };\n });\n },\n (event) => {\n setSyncState((current) => ({\n ...current,\n message: event.detail,\n progressCurrent: event.synced,\n progressTotal: event.total,\n progressMode: event.mode,\n progressPhase: event.phase,\n }));\n },\n );\n await Promise.all([\n refreshStatus(),\n loadInbox(true),\n screen === \"stats\" ? loadStats() : Promise.resolve(),\n screen === \"rules\" ? loadRules() : Promise.resolve(),\n ]);\n pushFlash(\"success\", \"Inbox sync complete.\");\n } catch (error) {\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n } finally {\n setSyncState((current) => ({\n ...current,\n syncing: false,\n progressCurrent: 0,\n progressTotal: null,\n progressMode: null,\n progressPhase: null,\n startedAt: null,\n progressStartedAt: null,\n lastProgressAt: null,\n lastProgressCurrent: 0,\n ratePerSecond: null,\n }));\n }\n }\n\n async function refreshAfterMutation(): Promise<void> {\n await Promise.all([\n refreshStatus(),\n loadInbox(true),\n screen === \"stats\" ? loadStats() : Promise.resolve(),\n screen === \"rules\" ? loadRules() : Promise.resolve(),\n selectedEmailId && screen === \"email\" ? loadEmailDetail(selectedEmailId) : Promise.resolve(),\n ]);\n }\n\n function currentListSelection(): EmailMessage | null {\n if (screen === \"search\") {\n return searchResults[searchSelectedIndex] || null;\n }\n\n return inboxEmails[inboxSelectedIndex] || null;\n }\n\n async function archiveCurrentEmail(): Promise<void> {\n const email = screen === \"email\"\n ? emailDetail\n : currentListSelection();\n\n if (!email) {\n return;\n }\n\n try {\n await archiveEmails([email.id]);\n pushFlash(\"success\", `Archived ${email.subject || email.id}.`);\n await refreshAfterMutation();\n } catch (error) {\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n }\n }\n\n async function toggleReadCurrentEmail(): Promise<void> {\n const email = screen === \"email\"\n ? emailDetail\n : currentListSelection();\n\n if (!email) {\n return;\n }\n\n try {\n if (email.isRead) {\n await markUnread([email.id]);\n pushFlash(\"success\", `Marked ${email.subject || email.id} as unread.`);\n } else {\n await markRead([email.id]);\n pushFlash(\"success\", `Marked ${email.subject || email.id} as read.`);\n }\n await refreshAfterMutation();\n } catch (error) {\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n }\n }\n\n async function openLabelPicker(targetEmailId: string | null): Promise<void> {\n if (!targetEmailId) {\n return;\n }\n\n setLabelPicker({\n open: true,\n loading: true,\n labels: [],\n selectedIndex: 0,\n targetEmailId,\n createMode: false,\n newLabelName: \"\",\n });\n\n try {\n const labels = await listLabels();\n setLabelPicker((current) => ({\n ...current,\n loading: false,\n labels,\n }));\n } catch (error) {\n setLabelPicker((current) => ({\n ...current,\n loading: false,\n }));\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n }\n }\n\n async function applySelectedLabel(labelName: string): Promise<void> {\n if (!labelPicker.targetEmailId) {\n return;\n }\n\n try {\n await labelEmails([labelPicker.targetEmailId], labelName);\n setLabelPicker((current) => ({\n ...current,\n open: false,\n }));\n pushFlash(\"success\", `Applied label ${labelName}.`);\n await refreshAfterMutation();\n } catch (error) {\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n }\n }\n\n async function createAndApplyLabel(name: string): Promise<void> {\n const trimmed = name.trim();\n\n if (!trimmed) {\n pushFlash(\"error\", \"Label name cannot be empty.\");\n return;\n }\n\n try {\n await createLabel(trimmed);\n await applySelectedLabel(trimmed);\n } catch (error) {\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n }\n }\n\n async function executeSearch(query: string): Promise<void> {\n const trimmed = query.trim();\n\n if (!trimmed) {\n pushFlash(\"error\", \"Enter a Gmail query first.\");\n return;\n }\n\n setSearchLoading(true);\n\n try {\n const results = await listMessages(trimmed, SEARCH_LIMIT);\n setSearchResults(results);\n setSearchSelectedIndex(0);\n setSearchFocus(\"results\");\n pushFlash(\"info\", `${results.length} search results loaded.`);\n } catch (error) {\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n } finally {\n setSearchLoading(false);\n }\n }\n\n function openSelectedEmail(email: EmailMessage, origin: \"inbox\" | \"search\"): void {\n setEmailOrigin(origin);\n setSelectedEmailId(email.id);\n setScreen(\"email\");\n }\n\n useEffect(() => {\n void (async () => {\n await Promise.all([\n refreshStatus(),\n loadInbox(true),\n ]);\n\n if (initialSync) {\n await runSync(\"Syncing inbox…\");\n }\n })();\n }, []);\n\n useEffect(() => {\n if (screen === \"stats\") {\n void loadStats();\n }\n\n if (screen === \"rules\") {\n void loadRules();\n }\n }, [screen]);\n\n useEffect(() => {\n if (screen === \"email\" && selectedEmailId) {\n void loadEmailDetail(selectedEmailId);\n }\n }, [screen, selectedEmailId]);\n\n useEffect(() => {\n if (!flash) {\n return;\n }\n\n const timeout = setTimeout(() => {\n setFlash(null);\n }, 3500);\n\n return () => clearTimeout(timeout);\n }, [flash]);\n\n useInput((input, key) => {\n if (confirmState) {\n if (input === \"y\" || input === \"Y\") {\n const action = confirmState.onConfirm;\n setConfirmState(null);\n void action();\n } else if (input === \"n\" || input === \"N\" || key.escape) {\n setConfirmState(null);\n }\n return;\n }\n\n if (labelPicker.open) {\n if (labelPicker.createMode) {\n if (key.escape) {\n setLabelPicker((current) => ({\n ...current,\n createMode: false,\n newLabelName: \"\",\n }));\n }\n return;\n }\n\n if (key.escape) {\n setLabelPicker((current) => ({\n ...current,\n open: false,\n }));\n return;\n }\n\n if (input === \"j\" || key.downArrow) {\n setLabelPicker((current) => ({\n ...current,\n selectedIndex: clampIndex(current.selectedIndex + 1, current.labels.length),\n }));\n return;\n }\n\n if (input === \"k\" || key.upArrow) {\n setLabelPicker((current) => ({\n ...current,\n selectedIndex: clampIndex(current.selectedIndex - 1, current.labels.length),\n }));\n return;\n }\n\n if (input === \"c\") {\n setLabelPicker((current) => ({\n ...current,\n createMode: true,\n newLabelName: \"\",\n }));\n return;\n }\n\n if (key.return) {\n const label = labelPicker.labels[labelPicker.selectedIndex];\n if (label) {\n void applySelectedLabel(label.name);\n }\n return;\n }\n\n return;\n }\n\n if (screen === \"search\" && searchFocus === \"input\") {\n if (key.escape) {\n setScreen(\"inbox\");\n }\n return;\n }\n\n if (input === \"q\") {\n exit();\n return;\n }\n\n if (screen === \"inbox\") {\n if (input === \"j\" || key.downArrow) {\n if (inboxSelectedIndex === inboxEmails.length - 1 && inboxHasMore && !inboxLoading) {\n void loadInbox(false);\n }\n setInboxSelectedIndex((current) => clampIndex(current + 1, inboxEmails.length));\n return;\n }\n\n if (input === \"k\" || key.upArrow) {\n setInboxSelectedIndex((current) => clampIndex(current - 1, inboxEmails.length));\n return;\n }\n\n if (key.return) {\n const email = inboxEmails[inboxSelectedIndex];\n if (email) {\n openSelectedEmail(email, \"inbox\");\n }\n return;\n }\n\n if (input === \"a\") {\n void archiveCurrentEmail();\n return;\n }\n\n if (input === \"l\") {\n void openLabelPicker(inboxEmails[inboxSelectedIndex]?.id || null);\n return;\n }\n\n if (input === \"r\") {\n void toggleReadCurrentEmail();\n return;\n }\n\n if (input === \"/\") {\n setScreen(\"search\");\n setSearchFocus(\"input\");\n return;\n }\n\n if (input === \"s\") {\n void runSync(\"Syncing inbox…\");\n return;\n }\n\n if (input === \"d\") {\n setScreen(\"stats\");\n return;\n }\n\n if (input === \"R\") {\n setScreen(\"rules\");\n }\n return;\n }\n\n if (screen === \"email\") {\n if (key.escape || key.backspace) {\n setScreen(emailOrigin);\n return;\n }\n\n if (input === \"j\" || key.downArrow) {\n setEmailScroll((current) => current + 1);\n return;\n }\n\n if (input === \"k\" || key.upArrow) {\n setEmailScroll((current) => Math.max(0, current - 1));\n return;\n }\n\n if (input === \"a\") {\n void archiveCurrentEmail();\n return;\n }\n\n if (input === \"l\") {\n void openLabelPicker(selectedEmailId);\n return;\n }\n\n if (input === \"r\") {\n void toggleReadCurrentEmail();\n }\n return;\n }\n\n if (screen === \"stats\") {\n if (key.escape || key.backspace) {\n setScreen(\"inbox\");\n return;\n }\n\n if (input === \"s\") {\n setStatsTab(\"senders\");\n return;\n }\n\n if (input === \"l\") {\n setStatsTab(\"labels\");\n return;\n }\n\n if (input === \"n\") {\n setStatsTab(\"newsletters\");\n return;\n }\n\n if (input === \"o\") {\n setStatsTab(\"noise\");\n return;\n }\n\n if (input === \"c\") {\n setStatsTab(\"uncategorized\");\n return;\n }\n\n if (input === \"u\") {\n setStatsTab(\"unsubscribe\");\n }\n return;\n }\n\n if (screen === \"rules\") {\n if (key.escape || key.backspace) {\n setScreen(\"inbox\");\n return;\n }\n\n if (key.tab) {\n setRulesFocus((current) => (current === \"rules\" ? \"history\" : \"rules\"));\n return;\n }\n\n if (input === \"j\" || key.downArrow) {\n if (rulesFocus === \"rules\") {\n setRulesSelectedIndex((current) => clampIndex(current + 1, rules.length));\n } else {\n setHistorySelectedIndex((current) => clampIndex(current + 1, ruleHistory.length));\n }\n return;\n }\n\n if (input === \"k\" || key.upArrow) {\n if (rulesFocus === \"rules\") {\n setRulesSelectedIndex((current) => clampIndex(current - 1, rules.length));\n } else {\n setHistorySelectedIndex((current) => clampIndex(current - 1, ruleHistory.length));\n }\n return;\n }\n\n if (input === \"d\") {\n void (async () => {\n try {\n await deployAllRules(config.rulesDir);\n pushFlash(\"success\", \"Rules deployed from YAML.\");\n await loadRules();\n } catch (error) {\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n }\n })();\n return;\n }\n\n if (input === \"e\" && rulesFocus === \"rules\") {\n const rule = rules[rulesSelectedIndex];\n\n if (!rule) {\n return;\n }\n\n void (async () => {\n try {\n if (rule.enabled) {\n await disableRule(rule.name);\n pushFlash(\"success\", `Disabled rule ${rule.name}.`);\n } else {\n await enableRule(rule.name);\n pushFlash(\"success\", `Enabled rule ${rule.name}.`);\n }\n await loadRules();\n } catch (error) {\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n }\n })();\n return;\n }\n\n if (input === \"r\" && rulesFocus === \"rules\") {\n const rule = rules[rulesSelectedIndex];\n if (!rule) {\n return;\n }\n\n void (async () => {\n try {\n await runRule(rule.name, { dryRun: true, maxEmails: 100 });\n pushFlash(\"success\", `Dry-ran rule ${rule.name}.`);\n await loadRules();\n } catch (error) {\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n }\n })();\n return;\n }\n\n if (input === \"R\" && rulesFocus === \"rules\") {\n const rule = rules[rulesSelectedIndex];\n if (!rule) {\n return;\n }\n\n setConfirmState({\n title: \"Run Rule\",\n message: `Apply rule ${rule.name} against cached matches?`,\n onConfirm: async () => {\n try {\n await runRule(rule.name, { dryRun: false, maxEmails: 100 });\n pushFlash(\"success\", `Applied rule ${rule.name}.`);\n await refreshAfterMutation();\n await loadRules();\n } catch (error) {\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n }\n },\n });\n return;\n }\n\n if (input === \"u\" && rulesFocus === \"history\") {\n const run = ruleHistory[historySelectedIndex];\n if (!run) {\n return;\n }\n\n void (async () => {\n try {\n await undoRun(run.id);\n pushFlash(\"success\", `Undid run ${run.id}.`);\n await refreshAfterMutation();\n await loadRules();\n } catch (error) {\n pushFlash(\"error\", error instanceof Error ? error.message : String(error));\n }\n })();\n }\n return;\n }\n\n if (screen === \"search\") {\n if (key.escape || key.backspace) {\n setScreen(\"inbox\");\n return;\n }\n\n if (input === \"i\") {\n setSearchFocus(\"input\");\n return;\n }\n\n if (input === \"j\" || key.downArrow) {\n setSearchSelectedIndex((current) => clampIndex(current + 1, searchResults.length));\n return;\n }\n\n if (input === \"k\" || key.upArrow) {\n setSearchSelectedIndex((current) => clampIndex(current - 1, searchResults.length));\n return;\n }\n\n if (key.return) {\n const email = searchResults[searchSelectedIndex];\n if (email) {\n openSelectedEmail(email, \"search\");\n }\n return;\n }\n\n if (input === \"a\") {\n void archiveCurrentEmail();\n return;\n }\n\n if (input === \"l\") {\n void openLabelPicker(searchResults[searchSelectedIndex]?.id || null);\n return;\n }\n\n if (input === \"r\") {\n void toggleReadCurrentEmail();\n }\n }\n });\n\n const chromeHeight = 9;\n const contentHeight = Math.max(MIN_CONTENT_HEIGHT, rows - chromeHeight);\n const emailBodyHeight = Math.max(8, contentHeight - 8);\n const listVisibleRows = Math.max(8, contentHeight - 6);\n const emailBodyLines = emailBody.split(\"\\n\");\n const visibleBodyLines = emailBodyLines.slice(emailScroll, emailScroll + emailBodyHeight);\n const rulesVisibleCount = Math.max(5, Math.floor(contentHeight / 3));\n const historyVisibleCount = Math.max(4, Math.floor(contentHeight / 4));\n const rulesRange = getViewportRange(rules.length, rulesSelectedIndex, rulesVisibleCount);\n const historyRange = getViewportRange(\n ruleHistory.length,\n historySelectedIndex,\n historyVisibleCount,\n );\n const visibleRules = rules.slice(rulesRange.start, rulesRange.end);\n const visibleHistory = ruleHistory.slice(historyRange.start, historyRange.end);\n const selectedRule = rules[rulesSelectedIndex];\n const selectedRun = ruleHistory[historySelectedIndex];\n const screenGuide = getScreenGuide(\n screen,\n screen === \"rules\" ? rulesFocus : screen === \"search\" ? searchFocus : undefined,\n );\n\n return (\n <Box flexDirection=\"column\" width={columns} height={rows} paddingX={1} paddingY={0}>\n <Header\n screen={screen}\n sync={syncState}\n columns={Math.max(40, columns - 2)}\n guide={screenGuide}\n />\n <Box height={contentHeight} flexDirection=\"column\" marginTop={1}>\n {screen === \"inbox\" ? (\n <EmailList\n emails={inboxEmails}\n selectedIndex={inboxSelectedIndex}\n title=\"Inbox\"\n loading={inboxLoading}\n emptyMessage=\"No cached emails yet. Sync to populate the local inbox.\"\n visibleRows={listVisibleRows}\n subtitle=\"Local cache first, background sync second\"\n />\n ) : null}\n\n {screen === \"email\" ? (\n <Panel\n title={sanitizeInlineText(emailDetail?.subject || \"Email Detail\", Math.max(20, columns - 12))}\n subtitle=\"Esc back • j/k scroll • a archive • l label • r toggle read\"\n accent=\"green\"\n >\n {emailLoading ? (\n <Text color=\"cyan\">\n <Spinner type=\"dots\" /> Loading full email body…\n </Text>\n ) : emailDetail ? (\n <>\n <Text>\n From: {sanitizeInlineText(emailDetail.fromName ? `${emailDetail.fromName} <${emailDetail.fromAddress}>` : emailDetail.fromAddress)}\n </Text>\n <Text>To: {sanitizeInlineText(emailDetail.toAddresses.join(\", \") || \"-\")}</Text>\n <Text>Date: {new Date(emailDetail.date).toISOString()}</Text>\n <Text>Labels: {sanitizeInlineText(emailDetail.labelIds.join(\", \") || \"-\")}</Text>\n <Box marginTop={1} flexDirection=\"column\">\n {visibleBodyLines.length === 0 ? (\n <Text color=\"gray\">(no body content)</Text>\n ) : (\n visibleBodyLines.map((line, index) => (\n <Text key={`body-${index}`}>{sanitizeInlineText(line || \" \", Math.max(20, columns - 8))}</Text>\n ))\n )}\n </Box>\n <Box marginTop={1}>\n <Text color=\"gray\">line {Math.min(emailBodyLines.length, emailScroll + 1)} of {emailBodyLines.length || 1}</Text>\n </Box>\n </>\n ) : (\n <Text color=\"gray\">Unable to load email detail.</Text>\n )}\n </Panel>\n ) : null}\n\n {screen === \"stats\" ? (\n <Panel\n title=\"Stats Dashboard\"\n subtitle=\"s senders • l labels • n newsletters • o noise • c uncategorized • u unsubscribe • Esc back\"\n accent=\"yellow\"\n >\n {statsLoading ? (\n <Text color=\"cyan\">\n <Spinner type=\"dots\" /> Loading stats…\n </Text>\n ) : (\n <>\n <Box marginTop={1} flexDirection=\"column\">\n <Text>Total: {statsOverview?.total ?? 0}</Text>\n <Text>Unread: {statsOverview?.unread ?? 0}</Text>\n <Text>Starred: {statsOverview?.starred ?? 0}</Text>\n <Text>\n Today: {statsOverview?.today.received ?? 0} received / {statsOverview?.today.unread ?? 0} unread\n </Text>\n <Text>\n Week: {statsOverview?.thisWeek.received ?? 0} received / {statsOverview?.thisWeek.unread ?? 0} unread\n </Text>\n <Text>\n Month: {statsOverview?.thisMonth.received ?? 0} received / {statsOverview?.thisMonth.unread ?? 0} unread\n </Text>\n </Box>\n <Box marginTop={1}>\n <Text color={statsTab === \"senders\" ? \"cyan\" : \"gray\"}>[Senders]</Text>\n <Text> </Text>\n <Text color={statsTab === \"labels\" ? \"cyan\" : \"gray\"}>[Labels]</Text>\n <Text> </Text>\n <Text color={statsTab === \"newsletters\" ? \"cyan\" : \"gray\"}>[Newsletters]</Text>\n <Text> </Text>\n <Text color={statsTab === \"noise\" ? \"cyan\" : \"gray\"}>[Noise]</Text>\n <Text> </Text>\n <Text color={statsTab === \"uncategorized\" ? \"cyan\" : \"gray\"}>[Uncategorized]</Text>\n <Text> </Text>\n <Text color={statsTab === \"unsubscribe\" ? \"cyan\" : \"gray\"}>[Unsubscribe]</Text>\n </Box>\n {statsTab === \"senders\" ? (\n <Table\n title=\"Top Senders\"\n headers={[\"SENDER\", \"TOTAL\", \"UNREAD%\"]}\n rows={statsSenders.map((sender) => [\n truncate(sender.name || sender.email, 28),\n String(sender.totalMessages),\n formatPercent(sender.unreadRate),\n ])}\n emptyMessage=\"No sender stats available.\"\n />\n ) : null}\n {statsTab === \"labels\" ? (\n <Table\n title=\"Top Labels\"\n headers={[\"LABEL\", \"TOTAL\", \"UNREAD\"]}\n rows={statsLabels.map((label) => [\n truncate(label.labelName, 24),\n String(label.totalMessages),\n String(label.unreadMessages),\n ])}\n emptyMessage=\"No label stats available.\"\n />\n ) : null}\n {statsTab === \"newsletters\" ? (\n <Table\n title=\"Newsletters\"\n headers={[\"SENDER\", \"TOTAL\", \"UNREAD%\", \"STATUS\"]}\n rows={statsNewsletters.map((newsletter) => [\n truncate(newsletter.name || newsletter.email, 24),\n String(newsletter.messageCount),\n formatPercent(newsletter.unreadRate),\n newsletter.status,\n ])}\n emptyMessage=\"No newsletters detected.\"\n />\n ) : null}\n {statsTab === \"noise\" ? (\n <Table\n title=\"Noise Senders\"\n headers={[\"SENDER\", \"EMAILS\", \"UNREAD%\", \"SCORE\", \"UNSUB\"]}\n rows={statsNoise.map((sender) => [\n truncate(sender.name || sender.email, 24),\n String(sender.messageCount),\n formatPercent(sender.unreadRate),\n String(sender.noiseScore),\n sender.hasUnsubscribeLink ? \"Yes\" : \"No\",\n ])}\n emptyMessage=\"No noisy senders detected.\"\n />\n ) : null}\n {statsTab === \"uncategorized\" ? (\n <>\n <Box marginTop={1} flexDirection=\"column\">\n <Text>\n Uncategorized: {statsUncategorized?.totalEmails ?? 0} emails from {statsUncategorized?.totalSenders ?? 0} senders\n </Text>\n <Text color=\"gray\">\n High {statsUncategorized?.summary.byConfidence.high.senders ?? 0} • Medium {statsUncategorized?.summary.byConfidence.medium.senders ?? 0} • Low {statsUncategorized?.summary.byConfidence.low.senders ?? 0}\n </Text>\n </Box>\n <Table\n title=\"Uncategorized Senders\"\n headers={[\"SENDER\", \"EMAILS\", \"UNREAD%\", \"CONF\", \"SIGNALS\"]}\n rows={(statsUncategorized?.senders || []).map((sender) => [\n truncate(sender.name || sender.sender, 20),\n String(sender.emailCount),\n formatPercent(sender.unreadRate),\n sender.confidence.toUpperCase(),\n truncate(sender.signals.join(\",\"), 22),\n ])}\n emptyMessage=\"No uncategorized senders detected.\"\n />\n </>\n ) : null}\n {statsTab === \"unsubscribe\" ? (\n <Table\n title=\"Unsubscribe Candidates\"\n headers={[\"SENDER\", \"EMAILS\", \"UNREAD%\", \"IMPACT\", \"METHOD\"]}\n rows={statsUnsubscribe.map((sender) => [\n truncate(sender.name || sender.email, 24),\n String(sender.allTimeMessageCount),\n formatPercent(sender.unreadRate),\n String(sender.impactScore),\n sender.unsubscribeMethod,\n ])}\n emptyMessage=\"No unsubscribe candidates detected.\"\n />\n ) : null}\n <Table\n title=\"Recent Volume\"\n headers={[\"DAY\", \"RECEIVED\", \"UNREAD\"]}\n rows={statsVolume.map((point) => [\n point.period,\n String(point.received),\n String(point.unread),\n ])}\n emptyMessage=\"No cached volume data.\"\n />\n </>\n )}\n </Panel>\n ) : null}\n\n {screen === \"rules\" ? (\n <Panel\n title=\"Rules Control\"\n subtitle=\"Tab switches focus • d deploy • e toggle • r dry-run • R apply • u undo\"\n accent=\"magenta\"\n >\n {rulesLoading ? (\n <Text color=\"cyan\">\n <Spinner type=\"dots\" /> Loading rules…\n </Text>\n ) : (\n <>\n <Text color={rulesFocus === \"rules\" ? \"cyan\" : \"gray\"}>Rules</Text>\n {rules.length === 0 ? (\n <Text color=\"gray\">No deployed rules.</Text>\n ) : (\n visibleRules.map((rule, index) => {\n const absoluteIndex = rulesRange.start + index;\n\n return (\n <Text\n key={rule.id}\n backgroundColor={rulesFocus === \"rules\" && absoluteIndex === rulesSelectedIndex ? \"magenta\" : undefined}\n color={rulesFocus === \"rules\" && absoluteIndex === rulesSelectedIndex ? \"black\" : undefined}\n >\n {rule.enabled ? \"✓\" : \"·\"} {rule.name} ({rule.totalRuns} runs, last {formatRelativeTime(rule.lastExecutionAt)})\n </Text>\n );\n })\n )}\n <Box marginTop={1} flexDirection=\"column\">\n <Text color={rulesFocus === \"history\" ? \"cyan\" : \"gray\"}>Recent History</Text>\n {ruleHistory.length === 0 ? (\n <Text color=\"gray\">No execution history yet.</Text>\n ) : (\n visibleHistory.map((run, index) => {\n const absoluteIndex = historyRange.start + index;\n\n return (\n <Text\n key={run.id}\n backgroundColor={rulesFocus === \"history\" && absoluteIndex === historySelectedIndex ? \"white\" : undefined}\n color={rulesFocus === \"history\" && absoluteIndex === historySelectedIndex ? \"black\" : undefined}\n >\n {run.status} {run.id} ({run.itemCount} items, {formatRelativeTime(run.createdAt)})\n </Text>\n );\n })\n )}\n </Box>\n {selectedRule && rulesFocus === \"rules\" ? (\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"gray\">Selected rule: {selectedRule.name}</Text>\n <Text color=\"gray\">Actions: {selectedRule.actions.map((action) => action.type).join(\", \") || \"-\"}</Text>\n </Box>\n ) : null}\n {selectedRun && rulesFocus === \"history\" ? (\n <Text color=\"gray\">Selected run: {selectedRun.id}</Text>\n ) : null}\n </>\n )}\n </Panel>\n ) : null}\n\n {screen === \"search\" ? (\n <Panel\n title=\"Search\"\n subtitle=\"Enter Gmail query syntax • Enter search • i focus input • Esc back\"\n accent=\"cyan\"\n >\n <Box>\n <Text color=\"cyan\">query: </Text>\n <TextInput\n value={searchQuery}\n onChange={setSearchQuery}\n onSubmit={(value) => {\n void executeSearch(value);\n }}\n focus={searchFocus === \"input\"}\n />\n </Box>\n {searchLoading ? (\n <Text color=\"cyan\">\n <Spinner type=\"dots\" /> Searching Gmail…\n </Text>\n ) : (\n <EmailList\n emails={searchResults}\n selectedIndex={searchSelectedIndex}\n title=\"Results\"\n emptyMessage=\"No results yet.\"\n visibleRows={Math.max(6, listVisibleRows - 4)}\n />\n )}\n </Panel>\n ) : null}\n </Box>\n\n {labelPicker.open ? (\n <Modal title=\"Label Picker\">\n {labelPicker.loading ? (\n <Text color=\"cyan\">\n <Spinner type=\"dots\" /> Loading labels…\n </Text>\n ) : labelPicker.createMode ? (\n <>\n <Text color=\"gray\">Enter new label name, then press Enter. Esc cancels.</Text>\n <TextInput\n value={labelPicker.newLabelName}\n onChange={(value) => {\n setLabelPicker((current) => ({\n ...current,\n newLabelName: value,\n }));\n }}\n onSubmit={(value) => {\n void createAndApplyLabel(value);\n }}\n focus\n />\n </>\n ) : labelPicker.labels.length === 0 ? (\n <Text color=\"gray\">No labels available. Press c to create one.</Text>\n ) : (\n <>\n <Text color=\"gray\">j/k navigate, Enter apply, c create label, Esc cancel</Text>\n {labelPicker.labels.map((label, index) => (\n <Text key={label.id} inverse={index === labelPicker.selectedIndex}>\n {label.name}\n </Text>\n ))}\n </>\n )}\n </Modal>\n ) : null}\n\n {confirmState ? (\n <Modal title={confirmState.title}>\n <Text>{confirmState.message}</Text>\n <Text color=\"gray\">Press y to continue or n to cancel.</Text>\n </Modal>\n ) : null}\n\n <StatusBar\n screen={screen}\n email={authEmail}\n unreadCount={unreadCount}\n sync={syncState}\n flash={flash}\n columns={columns}\n />\n </Box>\n );\n}\n\nexport async function startTuiApp(options?: { noSync?: boolean }): Promise<void> {\n if (process.stdout.isTTY) {\n process.stdout.write(\"\\u001B[?1049h\\u001B[2J\\u001B[H\");\n }\n\n try {\n const instance = render(<App initialSync={!options?.noSync} />);\n await instance.waitUntilExit();\n } finally {\n if (process.stdout.isTTY) {\n process.stdout.write(\"\\u001B[?1049l\");\n }\n }\n}\n","import type {\n RawGmailFilter,\n RawGmailFilterAction,\n RawGmailFilterCriteria,\n RawGmailHistoryResponse,\n RawGmailLabel,\n RawGmailListFiltersResponse,\n RawGmailListLabelsResponse,\n RawGmailListMessagesResponse,\n RawGmailMessage,\n RawGmailProfile,\n RawGmailSendMessageResponse,\n RawGmailThread,\n} from \"../gmail/types.js\";\nimport type { GmailTransport } from \"../gmail/transport.js\";\nimport type { DemoDataset, DemoMessageRecord } from \"./seed.js\";\n\nfunction copyMessage(message: RawGmailMessage): RawGmailMessage {\n return JSON.parse(JSON.stringify(message)) as RawGmailMessage;\n}\n\nfunction copyLabel(label: RawGmailLabel): RawGmailLabel {\n return { ...label };\n}\n\nfunction copyFilter(filter: RawGmailFilter): RawGmailFilter {\n return JSON.parse(JSON.stringify(filter)) as RawGmailFilter;\n}\n\nfunction getSearchTokens(query: string): string[] {\n return query.match(/\"[^\"]+\"|\\S+/g) || [];\n}\n\nfunction normalize(value: string | null | undefined): string {\n return (value || \"\").trim().toLowerCase();\n}\n\nfunction includesLabel(\n labelIds: string[],\n rawLabels: Map<string, RawGmailLabel>,\n expected: string,\n): boolean {\n return labelIds.some((labelId) => {\n const label = rawLabels.get(labelId);\n return (\n normalize(labelId) === expected ||\n normalize(label?.name) === expected ||\n normalize(label?.name).replace(/\\s+/g, \"-\") === expected\n );\n });\n}\n\nfunction matchesQuery(\n entry: DemoMessageRecord,\n query: string,\n rawLabels: Map<string, RawGmailLabel>,\n): boolean {\n const trimmed = query.trim();\n\n if (!trimmed) {\n return true;\n }\n\n const searchableText = normalize(\n [\n entry.message.fromAddress,\n entry.message.fromName,\n entry.message.subject,\n entry.message.snippet,\n ...entry.message.toAddresses,\n ].join(\" \"),\n );\n\n return getSearchTokens(trimmed).every((token) => {\n const cleaned = token.replace(/^\"|\"$/g, \"\");\n const separator = cleaned.indexOf(\":\");\n\n if (separator === -1) {\n return searchableText.includes(normalize(cleaned));\n }\n\n const key = normalize(cleaned.slice(0, separator));\n const value = normalize(cleaned.slice(separator + 1));\n\n switch (key) {\n case \"from\":\n return normalize(entry.message.fromAddress).includes(value) || normalize(entry.message.fromName).includes(value);\n case \"to\":\n return entry.message.toAddresses.some((address) => normalize(address).includes(value));\n case \"subject\":\n return normalize(entry.message.subject).includes(value);\n case \"label\":\n return includesLabel(entry.message.labelIds, rawLabels, value);\n case \"is\":\n if (value === \"unread\") return !entry.message.isRead;\n if (value === \"read\") return entry.message.isRead;\n if (value === \"starred\") return entry.message.isStarred;\n return true;\n case \"has\":\n if (value === \"attachment\") return entry.message.hasAttachments;\n return true;\n default:\n return searchableText.includes(normalize(cleaned));\n }\n });\n}\n\nfunction applyLabelMutation(\n labelIds: string[],\n addLabelIds: string[] = [],\n removeLabelIds: string[] = [],\n): string[] {\n const next = labelIds.filter((labelId) => !removeLabelIds.includes(labelId));\n\n for (const labelId of addLabelIds) {\n if (!next.includes(labelId)) {\n next.push(labelId);\n }\n }\n\n return next;\n}\n\nexport class DemoTransport implements GmailTransport {\n kind = \"rest\" as const;\n private readonly labels = new Map<string, RawGmailLabel>();\n private readonly messages = new Map<string, DemoMessageRecord>();\n private readonly filters = new Map<string, RawGmailFilter>();\n private historyCounter: number;\n\n constructor(private readonly dataset: DemoDataset) {\n this.historyCounter = Number.parseInt(dataset.historyId, 10) || 12345678;\n\n for (const label of dataset.labels) {\n if (label.id) {\n this.labels.set(label.id, copyLabel(label));\n }\n }\n\n for (const message of dataset.messages) {\n this.messages.set(message.message.id, {\n ...message,\n message: {\n ...message.message,\n labelIds: [...message.message.labelIds],\n },\n rawMessage: copyMessage(message.rawMessage),\n });\n }\n\n for (const filter of dataset.filters) {\n if (filter.id) {\n this.filters.set(filter.id, copyFilter(filter));\n }\n }\n }\n\n async getProfile(): Promise<RawGmailProfile> {\n return {\n emailAddress: this.dataset.accountEmail,\n historyId: String(this.historyCounter),\n messagesTotal: this.messages.size,\n threadsTotal: new Set(\n [...this.messages.values()].map((entry) => entry.message.threadId),\n ).size,\n };\n }\n\n private buildLabelDetails(label: RawGmailLabel): RawGmailLabel {\n const id = label.id || label.name || \"\";\n const matching = [...this.messages.values()].filter((entry) =>\n entry.message.labelIds.includes(id),\n );\n\n return {\n ...copyLabel(label),\n messagesTotal: matching.length,\n messagesUnread: matching.filter((entry) => !entry.message.isRead).length,\n threadsTotal: new Set(matching.map((entry) => entry.message.threadId)).size,\n threadsUnread: new Set(\n matching\n .filter((entry) => !entry.message.isRead)\n .map((entry) => entry.message.threadId),\n ).size,\n };\n }\n\n async listLabels(): Promise<RawGmailListLabelsResponse> {\n return {\n labels: [...this.labels.values()].map((label) => this.buildLabelDetails(label)),\n };\n }\n\n async getLabel(id: string): Promise<RawGmailLabel> {\n const label = this.labels.get(id);\n\n if (!label) {\n throw new Error(`Demo label not found: ${id}`);\n }\n\n return this.buildLabelDetails(label);\n }\n\n async createLabel(input: {\n name: string;\n color?: RawGmailLabel[\"color\"];\n }): Promise<RawGmailLabel> {\n const existing = [...this.labels.values()].find(\n (label) => normalize(label.name) === normalize(input.name),\n );\n\n if (existing) {\n return this.buildLabelDetails(existing);\n }\n\n const nextUserLabelCount =\n [...this.labels.values()].filter((label) => label.type === \"user\").length + 1;\n const created: RawGmailLabel = {\n id: `Label_${nextUserLabelCount}`,\n name: input.name.trim(),\n type: \"user\",\n color: input.color || null,\n };\n this.labels.set(created.id as string, created);\n return this.buildLabelDetails(created);\n }\n\n async batchModifyMessages(input: {\n ids: string[];\n addLabelIds?: string[];\n removeLabelIds?: string[];\n }): Promise<void> {\n for (const id of input.ids) {\n const entry = this.messages.get(id);\n\n if (!entry) {\n continue;\n }\n\n const nextLabelIds = applyLabelMutation(\n entry.message.labelIds,\n input.addLabelIds,\n input.removeLabelIds,\n );\n\n entry.message.labelIds = nextLabelIds;\n entry.message.isRead = !nextLabelIds.includes(\"UNREAD\");\n entry.message.isStarred = nextLabelIds.includes(\"STARRED\");\n entry.rawMessage.labelIds = [...nextLabelIds];\n }\n\n this.historyCounter += 1;\n }\n\n async sendMessage(): Promise<RawGmailSendMessageResponse> {\n this.historyCounter += 1;\n return {\n id: `sent-demo-${this.historyCounter}`,\n threadId: `sent-thread-${this.historyCounter}`,\n labelIds: [\"SENT\"],\n };\n }\n\n async listMessages(options: {\n query?: string;\n maxResults?: number;\n pageToken?: string;\n }): Promise<RawGmailListMessagesResponse> {\n const matching = [...this.messages.values()]\n .filter((entry) => matchesQuery(entry, options.query || \"\", this.labels))\n .sort((left, right) => right.message.date - left.message.date);\n const offset = options.pageToken ? Number.parseInt(options.pageToken, 10) : 0;\n const limit = options.maxResults || 20;\n const slice = matching.slice(offset, offset + limit);\n const nextOffset = offset + slice.length;\n\n return {\n messages: slice.map((entry) => ({\n id: entry.message.id,\n threadId: entry.message.threadId,\n })),\n nextPageToken: nextOffset < matching.length ? String(nextOffset) : undefined,\n resultSizeEstimate: matching.length,\n };\n }\n\n async getMessage(options: {\n id: string;\n }): Promise<RawGmailMessage> {\n const entry = this.messages.get(options.id);\n\n if (!entry) {\n throw new Error(`Demo message not found: ${options.id}`);\n }\n\n return copyMessage(entry.rawMessage);\n }\n\n async getThread(id: string): Promise<RawGmailThread> {\n const messages = [...this.messages.values()]\n .filter((entry) => entry.message.threadId === id)\n .sort((left, right) => left.message.date - right.message.date)\n .map((entry) => copyMessage(entry.rawMessage));\n\n return {\n id,\n messages,\n };\n }\n\n async listHistory(): Promise<RawGmailHistoryResponse> {\n return {\n history: [],\n historyId: String(this.historyCounter),\n };\n }\n\n async listFilters(): Promise<RawGmailListFiltersResponse> {\n return {\n filter: [...this.filters.values()].map((filter) => copyFilter(filter)),\n };\n }\n\n async getFilter(id: string): Promise<RawGmailFilter> {\n const filter = this.filters.get(id);\n\n if (!filter) {\n throw new Error(`Demo filter not found: ${id}`);\n }\n\n return copyFilter(filter);\n }\n\n async createFilter(filter: {\n criteria: RawGmailFilterCriteria;\n action: RawGmailFilterAction;\n }): Promise<RawGmailFilter> {\n const created: RawGmailFilter = {\n id: `filter-demo-${this.filters.size + 1}`,\n criteria: filter.criteria,\n action: filter.action,\n };\n this.filters.set(created.id as string, created);\n return copyFilter(created);\n }\n\n async deleteFilter(id: string): Promise<void> {\n if (!this.filters.delete(id)) {\n throw new Error(`Demo filter not found: ${id}`);\n }\n }\n}\n\nexport function createDemoTransport(dataset: DemoDataset): GmailTransport {\n return new DemoTransport(dataset);\n}\n","import type Database from \"better-sqlite3\";\nimport type {\n EmailMessage,\n RawGmailFilter,\n RawGmailLabel,\n RawGmailMessage,\n} from \"../gmail/types.js\";\n\nexport const DEMO_ACCOUNT_EMAIL = \"demo@example.com\";\nconst USER_LABELS = {\n receipts: \"Label_1\",\n awsAlerts: \"Label_2\",\n important: \"Label_3\",\n} as const;\n\ntype SenderKey =\n | \"github\"\n | \"stripe\"\n | \"aws\"\n | \"vercel\"\n | \"linear\"\n | \"alice\"\n | \"bob\"\n | \"newsletter\"\n | \"hn\"\n | \"paypal\"\n | \"shopify\"\n | \"docker\"\n | \"sarah\"\n | \"npm\"\n | \"slack\";\n\ninterface SenderSpec {\n key: SenderKey;\n name: string;\n email: string;\n count: number;\n unread: number;\n hasListUnsubscribe?: boolean;\n}\n\nexport interface DemoMessageRecord {\n senderKey: SenderKey;\n message: EmailMessage;\n rawMessage: RawGmailMessage;\n bodyText: string;\n}\n\nexport interface DemoRuleRecord {\n id: string;\n name: string;\n description: string;\n enabled: boolean;\n yamlHash: string;\n conditions: Record<string, unknown>;\n actions: Array<Record<string, unknown>>;\n priority: number;\n deployedAt: number;\n createdAt: number;\n}\n\nexport interface DemoExecutionRunRecord {\n id: string;\n sourceType: \"manual\" | \"rule\";\n ruleId: string | null;\n dryRun: boolean;\n requestedActions: Array<Record<string, unknown>>;\n query: string | null;\n status: \"planned\" | \"applied\";\n createdAt: number;\n undoneAt: number | null;\n}\n\nexport interface DemoExecutionItemRecord {\n id: string;\n runId: string;\n emailId: string;\n status: \"planned\" | \"applied\";\n appliedActions: Array<Record<string, unknown>>;\n beforeLabelIds: string[];\n afterLabelIds: string[];\n errorMessage: string | null;\n executedAt: number;\n undoneAt: number | null;\n}\n\nexport interface DemoNewsletterRecord {\n id: string;\n email: string;\n name: string;\n messageCount: number;\n unreadCount: number;\n status: \"active\";\n unsubscribeLink: string | null;\n detectionReason: string;\n firstSeen: number;\n lastSeen: number;\n}\n\nexport interface DemoDataset {\n accountEmail: string;\n historyId: string;\n labels: RawGmailLabel[];\n messages: DemoMessageRecord[];\n rules: DemoRuleRecord[];\n executionRuns: DemoExecutionRunRecord[];\n executionItems: DemoExecutionItemRecord[];\n newsletters: DemoNewsletterRecord[];\n filters: RawGmailFilter[];\n}\n\nconst SYSTEM_LABELS: RawGmailLabel[] = [\n { id: \"INBOX\", name: \"Inbox\", type: \"system\" },\n { id: \"UNREAD\", name: \"Unread\", type: \"system\" },\n { id: \"STARRED\", name: \"Starred\", type: \"system\" },\n { id: \"SENT\", name: \"Sent\", type: \"system\" },\n { id: \"DRAFT\", name: \"Drafts\", type: \"system\" },\n { id: \"SPAM\", name: \"Spam\", type: \"system\" },\n { id: \"TRASH\", name: \"Trash\", type: \"system\" },\n { id: \"CATEGORY_UPDATES\", name: \"Updates\", type: \"system\" },\n { id: \"CATEGORY_PROMOTIONS\", name: \"Promotions\", type: \"system\" },\n];\n\nconst DEMO_LABELS: RawGmailLabel[] = [\n ...SYSTEM_LABELS,\n { id: USER_LABELS.receipts, name: \"Receipts\", type: \"user\" },\n { id: USER_LABELS.awsAlerts, name: \"AWS-Alerts\", type: \"user\" },\n { id: USER_LABELS.important, name: \"Important\", type: \"user\" },\n];\n\nconst SENDERS: SenderSpec[] = [\n { key: \"github\", name: \"GitHub\", email: \"notifications@github.com\", count: 25, unread: 8 },\n { key: \"stripe\", name: \"Stripe\", email: \"receipts@stripe.com\", count: 12, unread: 0 },\n { key: \"aws\", name: \"AWS Notifications\", email: \"no-reply@amazonaws.com\", count: 18, unread: 14 },\n { key: \"vercel\", name: \"Vercel\", email: \"notifications@vercel.com\", count: 10, unread: 7 },\n { key: \"linear\", name: \"Linear\", email: \"notifications@linear.app\", count: 15, unread: 3 },\n { key: \"alice\", name: \"Alice Chen\", email: \"alice.chen@example.com\", count: 8, unread: 2 },\n { key: \"bob\", name: \"Bob Martinez\", email: \"bob.martinez@example.com\", count: 6, unread: 1 },\n { key: \"newsletter\", name: \"Newsletter Weekly\", email: \"digest@newsletterweekly.com\", count: 14, unread: 12, hasListUnsubscribe: true },\n { key: \"hn\", name: \"Hacker News Digest\", email: \"hn@newsletters.hackernews.com\", count: 12, unread: 10, hasListUnsubscribe: true },\n { key: \"paypal\", name: \"PayPal\", email: \"service@paypal.com\", count: 8, unread: 0 },\n { key: \"shopify\", name: \"Shopify\", email: \"no-reply@shopify.com\", count: 6, unread: 0 },\n { key: \"docker\", name: \"Docker Hub\", email: \"noreply@docker.com\", count: 5, unread: 4 },\n { key: \"sarah\", name: \"Sarah Kim\", email: \"sarah.kim@example.com\", count: 4, unread: 1 },\n { key: \"npm\", name: \"npm\", email: \"support@npmjs.com\", count: 4, unread: 3 },\n { key: \"slack\", name: \"Slack\", email: \"notification@slack.com\", count: 3, unread: 2 },\n];\n\nconst PRIORITY_SEQUENCE: SenderKey[] = [\n \"github\",\n \"aws\",\n \"stripe\",\n \"alice\",\n \"linear\",\n \"github\",\n \"newsletter\",\n \"stripe\",\n \"vercel\",\n \"hn\",\n \"bob\",\n \"github\",\n];\n\nfunction createRng(seed: number): () => number {\n let state = seed >>> 0;\n return () => {\n state = (state * 1664525 + 1013904223) >>> 0;\n return state / 0x100000000;\n };\n}\n\nfunction encodeBase64Url(value: string): string {\n return Buffer.from(value, \"utf8\")\n .toString(\"base64\")\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=+$/g, \"\");\n}\n\nfunction buildTimestamps(now: number, total: number): number[] {\n const timestamps: number[] = [];\n const blocks = [\n { count: 10, startHours: 0.5, endHours: 23 },\n { count: 15, startHours: 26, endHours: 72 },\n { count: 30, startHours: 74, endHours: 168 },\n { count: total - 55, startHours: 170, endHours: 720 },\n ];\n\n for (const block of blocks) {\n for (let index = 0; index < block.count; index += 1) {\n const ratio = block.count === 1 ? 0 : index / (block.count - 1);\n const offsetHours = block.startHours + ratio * (block.endHours - block.startHours);\n timestamps.push(now - Math.round(offsetHours * 60 * 60 * 1000));\n }\n }\n\n return timestamps.sort((a, b) => b - a);\n}\n\nfunction chooseSender(\n slotIndex: number,\n remaining: Map<SenderKey, number>,\n rng: () => number,\n): SenderKey {\n const preferred = PRIORITY_SEQUENCE[slotIndex];\n\n if (preferred && (remaining.get(preferred) || 0) > 0) {\n remaining.set(preferred, (remaining.get(preferred) || 0) - 1);\n return preferred;\n }\n\n const weighted = [...remaining.entries()].filter(([, count]) => count > 0);\n const totalWeight = weighted.reduce((sum, [, count]) => sum + count, 0);\n let cursor = rng() * totalWeight;\n\n for (const [key, count] of weighted) {\n cursor -= count;\n\n if (cursor <= 0) {\n remaining.set(key, count - 1);\n return key;\n }\n }\n\n const fallback = weighted[weighted.length - 1]?.[0];\n\n if (!fallback) {\n throw new Error(\"Demo sender pool exhausted unexpectedly.\");\n }\n\n remaining.set(fallback, (remaining.get(fallback) || 1) - 1);\n return fallback;\n}\n\nfunction getSubject(senderKey: SenderKey, sequence: number): string {\n switch (senderKey) {\n case \"github\":\n return [\n `Re: [acme/inboxctl] Fix race condition in worker pool (#12${sequence + 1})`,\n `[acme/inboxctl] New issue: Memory leak in cache layer (#23${sequence + 1})`,\n `[acme/platform] Review requested on PR #45${sequence + 1}`,\n `Re: [acme/inboxctl] TUI search pagination follow-up (#34${sequence + 1})`,\n ][sequence % 4];\n case \"stripe\":\n return [\n \"Your receipt from Acme Corp - $49.00\",\n \"Payment to DigitalOcean - $12.00\",\n \"Your receipt from Render, Inc. - $29.00\",\n \"Invoice paid: GitHub Team - $9.00\",\n ][sequence % 4];\n case \"aws\":\n return [\n \"AWS Billing Alert: Your estimated charges exceed $50\",\n \"Amazon EC2 Maintenance Notification\",\n \"AWS Trusted Advisor weekly summary\",\n \"Amazon RDS performance insights available\",\n ][sequence % 4];\n case \"vercel\":\n return [\n \"Deployment completed for inboxctl-web\",\n \"Build failed for docs-preview\",\n \"Preview ready for PR #184\",\n \"Your project has a new domain alias\",\n ][sequence % 4];\n case \"linear\":\n return [\n \"Issue assigned: PROJ-142 Implement retry logic\",\n \"Comment on PROJ-138\",\n \"Cycle planning notes are ready\",\n \"Issue updated: PROJ-155 Improve inbox search\",\n ][sequence % 4];\n case \"alice\":\n return [\n \"Re: Architecture review notes\",\n \"Quick question about the deploy pipeline\",\n \"Lunch tomorrow?\",\n \"Follow-up on MCP prompt defaults\",\n ][sequence % 4];\n case \"bob\":\n return [\n \"Re: Sprint planning agenda\",\n \"Can you sanity-check the release notes?\",\n \"Quick update on the billing incident\",\n ][sequence % 3];\n case \"newsletter\":\n return [\n \"Weekly systems brief: incidents, launches, and lessons learned\",\n \"This week in developer tools\",\n \"Five workflows worth stealing this week\",\n ][sequence % 3];\n case \"hn\":\n return [\n \"Hacker News Digest: Top stories this week\",\n \"HN Digest: AI tooling, terminals, and SQLite\",\n \"Your weekly Hacker News roundup\",\n ][sequence % 3];\n case \"paypal\":\n return [\n \"Receipt for your payment to Figma\",\n \"You sent a payment to Notion Labs\",\n \"Transaction receipt from OpenAI\",\n ][sequence % 3];\n case \"shopify\":\n return [\n \"Order confirmation from Acme Supply\",\n \"Receipt from Shopify Billing\",\n \"Your Shopify payment receipt\",\n ][sequence % 3];\n case \"docker\":\n return [\n \"Docker Hub autobuild completed\",\n \"New image vulnerability summary\",\n \"Usage summary for your Docker plan\",\n ][sequence % 3];\n case \"sarah\":\n return [\n \"Re: Copy review for the setup guide\",\n \"Notes from today's product sync\",\n \"Small wording suggestion for the README\",\n ][sequence % 3];\n case \"npm\":\n return [\n \"Security notice for one of your dependencies\",\n \"Your npm access token was used\",\n \"Package advisory summary\",\n ][sequence % 3];\n case \"slack\":\n return [\n \"You have unread mentions in #engineering\",\n \"Slack summary for yesterday\",\n \"Reminder: action requested in #launches\",\n ][sequence % 3];\n }\n}\n\nfunction buildBody(sender: SenderSpec, subject: string, sequence: number): string {\n switch (sender.key) {\n case \"github\":\n return [\n subject,\n \"\",\n \"A reviewer left feedback on your pull request.\",\n \"\",\n \"File: src/core/rules/executor.ts\",\n \"\",\n \"```ts\",\n \"if (result.status === \\\"warning\\\") {\",\n \" retryQueue.push(item);\",\n \"}\",\n \"```\",\n \"\",\n \"Comment:\",\n \"The warning path looks good, but we may still emit duplicate audit items\",\n \"when the retry branch is hit after a partial apply. Can we move the\",\n \"audit append behind the final status resolution?\",\n \"\",\n \"Suggested follow-up:\",\n \"- add a regression test around repeated partial retries\",\n \"- confirm undo still sees a single logical execution item\",\n \"\",\n \"View pull request\",\n \"Reply to comment\",\n ].join(\"\\n\");\n case \"stripe\":\n return [\n subject,\n \"\",\n \"Receipt summary\",\n \"----------------------------------------\",\n `Receipt number: rcpt_demo_${sequence + 1}`,\n \"Paid with: Visa ending in 4242\",\n \"Billing contact: demo@example.com\",\n \"\",\n \"Line items\",\n \"- Team plan........................ $29.00\",\n \"- Usage overage................... $20.00\",\n \"\",\n \"Subtotal.......................... $49.00\",\n \"Tax............................... $0.00\",\n \"Total............................. $49.00\",\n \"\",\n \"If you have questions about this charge, reply to this email and include\",\n \"the receipt number above.\",\n ].join(\"\\n\");\n case \"aws\":\n return [\n subject,\n \"\",\n \"Account: demo-platform\",\n \"Region highlights:\",\n \"- us-east-1 EC2 running hours increased by 14%\",\n \"- ap-southeast-2 RDS backup storage exceeded forecast\",\n \"- CloudWatch logs ingestion steady week over week\",\n \"\",\n \"Estimated charges\",\n \"- EC2.............................. $28.40\",\n \"- RDS.............................. $13.10\",\n \"- CloudWatch....................... $7.92\",\n \"- Data transfer.................... $3.61\",\n \"\",\n \"Recommended actions\",\n \"- review orphaned volumes\",\n \"- confirm dev database retention\",\n \"- validate expected scale-up window\",\n ].join(\"\\n\");\n case \"newsletter\":\n case \"hn\":\n return [\n subject,\n \"\",\n \"Good morning.\",\n \"\",\n \"Here is your roundup of the links and ideas people kept passing around\",\n \"this week, from terminal UX to pricing models to practical SQLite tips.\",\n \"\",\n \"Featured reads\",\n \"- A better way to review notification-heavy inboxes\",\n \"- Why local-first tools feel faster and safer\",\n \"- The hidden costs of brittle automation\",\n \"\",\n \"Worth a skim if you missed them\",\n \"- Building humane CLIs\",\n \"- Debugging MCP integrations in practice\",\n \"- Shipping small tools without creating trust debt\",\n \"\",\n \"Read online\",\n \"Manage subscription\",\n ].join(\"\\n\");\n case \"alice\":\n case \"bob\":\n case \"sarah\":\n return [\n subject,\n \"\",\n `Hey team,`,\n \"\",\n \"A couple of quick notes from my side:\",\n \"- the current flow feels solid once the first sync is done\",\n \"- the setup copy could be a little shorter\",\n \"- I like that the TUI keeps the audit story visible\",\n \"\",\n \"Can you take a look when you get a chance?\",\n \"\",\n \"Thanks,\",\n sender.name,\n ].join(\"\\n\");\n default:\n return [\n subject,\n \"\",\n `${sender.name} generated this notification for the demo mailbox.`,\n \"\",\n \"This message exists so the TUI detail view, sender stats, and search\",\n \"screens all have realistic data to work with.\",\n ].join(\"\\n\");\n }\n}\n\nfunction getBaseLabelIds(senderKey: SenderKey, unread: boolean, sequence: number): string[] {\n const labels = [\"INBOX\"];\n\n if (unread) {\n labels.push(\"UNREAD\");\n }\n\n switch (senderKey) {\n case \"github\":\n case \"linear\":\n labels.push(\"CATEGORY_UPDATES\");\n break;\n case \"stripe\":\n case \"paypal\":\n case \"shopify\":\n labels.push(USER_LABELS.receipts);\n break;\n case \"alice\":\n case \"bob\":\n case \"sarah\":\n if (sequence === 0) {\n labels.push(USER_LABELS.important);\n }\n break;\n case \"aws\":\n if (sequence < 2) {\n labels.push(USER_LABELS.awsAlerts);\n }\n break;\n case \"npm\":\n labels.push(USER_LABELS.important);\n break;\n }\n\n return Array.from(new Set(labels));\n}\n\nfunction buildRawMessage(record: EmailMessage, bodyText: string): RawGmailMessage {\n return {\n id: record.id,\n threadId: record.threadId,\n snippet: record.snippet,\n internalDate: String(record.date),\n labelIds: record.labelIds,\n sizeEstimate: record.sizeEstimate,\n payload: {\n mimeType: \"multipart/alternative\",\n headers: [\n { name: \"From\", value: `${record.fromName} <${record.fromAddress}>` },\n { name: \"To\", value: record.toAddresses.join(\", \") },\n { name: \"Subject\", value: record.subject },\n { name: \"Date\", value: new Date(record.date).toUTCString() },\n ...(record.listUnsubscribe\n ? [{ name: \"List-Unsubscribe\", value: record.listUnsubscribe }]\n : []),\n ],\n parts: [\n {\n mimeType: \"text/plain\",\n filename: \"\",\n body: {\n data: encodeBase64Url(bodyText),\n },\n },\n ],\n },\n };\n}\n\nfunction buildMessage(\n sender: SenderSpec,\n sequence: number,\n date: number,\n): DemoMessageRecord {\n const subject = getSubject(sender.key, sequence);\n const bodyText = buildBody(sender, subject, sequence);\n const unread = sequence < sender.unread;\n const labelIds = getBaseLabelIds(sender.key, unread, sequence);\n const message: EmailMessage = {\n id: `demo-${sender.key}-${String(sequence + 1).padStart(2, \"0\")}`,\n threadId: `thread-${sender.key}-${Math.floor(sequence / 2) + 1}`,\n fromAddress: sender.email,\n fromName: sender.name,\n toAddresses: [DEMO_ACCOUNT_EMAIL],\n subject,\n snippet: bodyText.split(\"\\n\").slice(0, 3).join(\" \").slice(0, 160),\n date,\n isRead: !unread,\n isStarred:\n (sender.key === \"alice\" && sequence === 0) ||\n (sender.key === \"stripe\" && sequence === 0) ||\n (sender.key === \"github\" && sequence === 0),\n labelIds,\n sizeEstimate: 1024 + sequence * 17,\n hasAttachments: sender.key === \"stripe\" || sender.key === \"aws\",\n listUnsubscribe: sender.hasListUnsubscribe\n ? `<mailto:unsubscribe@${sender.email.split(\"@\")[1]}>`\n : null,\n };\n\n return {\n senderKey: sender.key,\n message,\n rawMessage: buildRawMessage(message, bodyText),\n bodyText,\n };\n}\n\nfunction makeRuleRecords(now: number): DemoRuleRecord[] {\n return [\n {\n id: \"rule-label-receipts\",\n name: \"label-receipts\",\n description: \"Label emails that look like receipts\",\n enabled: true,\n yamlHash: \"demo-hash-label-receipts\",\n conditions: {\n operator: \"OR\",\n matchers: [\n {\n field: \"from\",\n values: [\"receipts@stripe.com\", \"service@paypal.com\", \"no-reply@shopify.com\"],\n },\n {\n field: \"subject\",\n contains: [\"receipt\", \"invoice\", \"order confirmation\"],\n },\n ],\n },\n actions: [{ type: \"label\", label: \"Receipts\" }],\n priority: 30,\n deployedAt: now - 6 * 24 * 60 * 60 * 1000,\n createdAt: now - 6 * 24 * 60 * 60 * 1000,\n },\n {\n id: \"rule-archive-newsletters\",\n name: \"archive-newsletters\",\n description: \"Archive low-engagement newsletters\",\n enabled: true,\n yamlHash: \"demo-hash-archive-newsletters\",\n conditions: {\n operator: \"AND\",\n matchers: [\n {\n field: \"from\",\n values: [\"digest@newsletterweekly.com\", \"hn@newsletters.hackernews.com\"],\n },\n ],\n },\n actions: [{ type: \"archive\" }, { type: \"mark_read\" }],\n priority: 50,\n deployedAt: now - 5 * 24 * 60 * 60 * 1000,\n createdAt: now - 5 * 24 * 60 * 60 * 1000,\n },\n {\n id: \"rule-flag-aws-alerts\",\n name: \"flag-aws-alerts\",\n description: \"Label AWS billing and maintenance alerts\",\n enabled: false,\n yamlHash: \"demo-hash-flag-aws-alerts\",\n conditions: {\n operator: \"OR\",\n matchers: [\n {\n field: \"from\",\n values: [\"no-reply@amazonaws.com\"],\n },\n {\n field: \"subject\",\n contains: [\"billing\", \"maintenance\"],\n },\n ],\n },\n actions: [{ type: \"label\", label: \"AWS-Alerts\" }],\n priority: 40,\n deployedAt: now - 4 * 24 * 60 * 60 * 1000,\n createdAt: now - 4 * 24 * 60 * 60 * 1000,\n },\n ];\n}\n\nfunction pickIds(messages: DemoMessageRecord[], senderKey: SenderKey, count: number): string[] {\n return messages\n .filter((entry) => entry.senderKey === senderKey)\n .slice(0, count)\n .map((entry) => entry.message.id);\n}\n\nfunction makeExecutionRecords(\n now: number,\n messages: DemoMessageRecord[],\n): Pick<DemoDataset, \"executionRuns\" | \"executionItems\"> {\n const receiptIds = [\n ...pickIds(messages, \"stripe\", 2),\n ...pickIds(messages, \"paypal\", 1),\n ...pickIds(messages, \"shopify\", 1),\n ];\n const newsletterIds = [\n ...pickIds(messages, \"newsletter\", 2),\n ...pickIds(messages, \"hn\", 2),\n ];\n const manualIds = [\n ...pickIds(messages, \"alice\", 1),\n ...pickIds(messages, \"bob\", 1),\n ...pickIds(messages, \"github\", 1),\n ];\n\n const executionRuns: DemoExecutionRunRecord[] = [\n {\n id: \"run-receipts-apply\",\n sourceType: \"rule\",\n ruleId: \"rule-label-receipts\",\n dryRun: false,\n requestedActions: [{ type: \"label\", label: \"Receipts\" }],\n query: null,\n status: \"applied\",\n createdAt: now - 3 * 24 * 60 * 60 * 1000,\n undoneAt: null,\n },\n {\n id: \"run-receipts-plan\",\n sourceType: \"rule\",\n ruleId: \"rule-label-receipts\",\n dryRun: true,\n requestedActions: [{ type: \"label\", label: \"Receipts\" }],\n query: null,\n status: \"planned\",\n createdAt: now - 3 * 24 * 60 * 60 * 1000 + 20 * 60 * 1000,\n undoneAt: null,\n },\n {\n id: \"run-newsletters-apply\",\n sourceType: \"rule\",\n ruleId: \"rule-archive-newsletters\",\n dryRun: false,\n requestedActions: [{ type: \"archive\" }, { type: \"mark_read\" }],\n query: null,\n status: \"applied\",\n createdAt: now - 24 * 60 * 60 * 1000,\n undoneAt: null,\n },\n {\n id: \"run-manual-read\",\n sourceType: \"manual\",\n ruleId: null,\n dryRun: false,\n requestedActions: [{ type: \"mark_read\" }],\n query: \"label:UNREAD older_than:2d\",\n status: \"applied\",\n createdAt: now - 6 * 60 * 60 * 1000,\n undoneAt: null,\n },\n {\n id: \"run-newsletters-plan\",\n sourceType: \"rule\",\n ruleId: \"rule-archive-newsletters\",\n dryRun: true,\n requestedActions: [{ type: \"archive\" }, { type: \"mark_read\" }],\n query: null,\n status: \"planned\",\n createdAt: now - 2 * 60 * 60 * 1000,\n undoneAt: null,\n },\n ];\n\n const executionItems: DemoExecutionItemRecord[] = [\n ...receiptIds.map((emailId, index) => ({\n id: `item-receipts-apply-${index + 1}`,\n runId: \"run-receipts-apply\",\n emailId,\n status: \"applied\" as const,\n appliedActions: [{ type: \"label\", label: \"Receipts\" }],\n beforeLabelIds: [\"INBOX\"],\n afterLabelIds: [\"INBOX\", USER_LABELS.receipts],\n errorMessage: null,\n executedAt: now - 3 * 24 * 60 * 60 * 1000 + index * 60 * 1000,\n undoneAt: null,\n })),\n ...receiptIds.map((emailId, index) => ({\n id: `item-receipts-plan-${index + 1}`,\n runId: \"run-receipts-plan\",\n emailId,\n status: \"planned\" as const,\n appliedActions: [{ type: \"label\", label: \"Receipts\" }],\n beforeLabelIds: [\"INBOX\"],\n afterLabelIds: [\"INBOX\", USER_LABELS.receipts],\n errorMessage: null,\n executedAt: now - 3 * 24 * 60 * 60 * 1000 + 20 * 60 * 1000 + index * 60 * 1000,\n undoneAt: null,\n })),\n ...newsletterIds.map((emailId, index) => ({\n id: `item-newsletters-apply-${index + 1}`,\n runId: \"run-newsletters-apply\",\n emailId,\n status: \"applied\" as const,\n appliedActions: [{ type: \"archive\" }, { type: \"mark_read\" }],\n beforeLabelIds: [\"INBOX\", \"UNREAD\"],\n afterLabelIds: [],\n errorMessage: null,\n executedAt: now - 24 * 60 * 60 * 1000 + index * 60 * 1000,\n undoneAt: null,\n })),\n ...manualIds.map((emailId, index) => ({\n id: `item-manual-read-${index + 1}`,\n runId: \"run-manual-read\",\n emailId,\n status: \"applied\" as const,\n appliedActions: [{ type: \"mark_read\" }],\n beforeLabelIds: [\"INBOX\", \"UNREAD\"],\n afterLabelIds: [\"INBOX\"],\n errorMessage: null,\n executedAt: now - 6 * 60 * 60 * 1000 + index * 60 * 1000,\n undoneAt: null,\n })),\n ...newsletterIds.map((emailId, index) => ({\n id: `item-newsletters-plan-${index + 1}`,\n runId: \"run-newsletters-plan\",\n emailId,\n status: \"planned\" as const,\n appliedActions: [{ type: \"archive\" }, { type: \"mark_read\" }],\n beforeLabelIds: [\"INBOX\", \"UNREAD\"],\n afterLabelIds: [],\n errorMessage: null,\n executedAt: now - 2 * 60 * 60 * 1000 + index * 60 * 1000,\n undoneAt: null,\n })),\n ];\n\n return { executionRuns, executionItems };\n}\n\nfunction makeNewsletterRecords(messages: DemoMessageRecord[]): DemoNewsletterRecord[] {\n const senders = [\n {\n email: \"digest@newsletterweekly.com\",\n name: \"Newsletter Weekly\",\n reason: \"list-unsubscribe,high-unread\",\n },\n {\n email: \"hn@newsletters.hackernews.com\",\n name: \"Hacker News Digest\",\n reason: \"list-unsubscribe,high-unread\",\n },\n {\n email: \"no-reply@amazonaws.com\",\n name: \"AWS Notifications\",\n reason: \"noreply-pattern,high-unread\",\n },\n {\n email: \"noreply@docker.com\",\n name: \"Docker Hub\",\n reason: \"noreply-pattern\",\n },\n {\n email: \"notifications@github.com\",\n name: \"GitHub\",\n reason: \"high-volume\",\n },\n {\n email: \"notification@slack.com\",\n name: \"Slack\",\n reason: \"noreply-pattern\",\n },\n ];\n\n return senders.map((sender, index) => {\n const matching = messages.filter((entry) => entry.message.fromAddress === sender.email);\n\n return {\n id: `newsletter-${index + 1}`,\n email: sender.email,\n name: sender.name,\n messageCount: matching.length,\n unreadCount: matching.filter((entry) => !entry.message.isRead).length,\n status: \"active\",\n unsubscribeLink: matching[0]?.message.listUnsubscribe || null,\n detectionReason: sender.reason,\n firstSeen: matching[matching.length - 1]?.message.date || Date.now(),\n lastSeen: matching[0]?.message.date || Date.now(),\n };\n });\n}\n\nexport function buildDemoDataset(referenceNow: number = Date.now()): DemoDataset {\n const timestamps = buildTimestamps(referenceNow, 150);\n const remaining = new Map<SenderKey, number>(\n SENDERS.map((sender) => [sender.key, sender.count]),\n );\n const sequenceBySender = new Map<SenderKey, number>();\n const senderByKey = new Map(SENDERS.map((sender) => [sender.key, sender]));\n const rng = createRng(42);\n const messages: DemoMessageRecord[] = [];\n\n for (let index = 0; index < timestamps.length; index += 1) {\n const senderKey = chooseSender(index, remaining, rng);\n const sender = senderByKey.get(senderKey);\n\n if (!sender) {\n throw new Error(`Missing demo sender spec for ${senderKey}`);\n }\n\n const sequence = sequenceBySender.get(senderKey) || 0;\n messages.push(buildMessage(sender, sequence, timestamps[index] || referenceNow));\n sequenceBySender.set(senderKey, sequence + 1);\n }\n\n messages.sort((left, right) => right.message.date - left.message.date);\n\n const rules = makeRuleRecords(referenceNow);\n const { executionRuns, executionItems } = makeExecutionRecords(referenceNow, messages);\n\n return {\n accountEmail: DEMO_ACCOUNT_EMAIL,\n historyId: \"12345678\",\n labels: DEMO_LABELS.map((label) => ({ ...label })),\n messages,\n rules,\n executionRuns,\n executionItems,\n newsletters: makeNewsletterRecords(messages),\n filters: [],\n };\n}\n\nexport function seedDemoData(\n sqlite: Database.Database,\n referenceNow: number = Date.now(),\n): DemoDataset {\n const dataset = buildDemoDataset(referenceNow);\n\n sqlite.exec(`\n DELETE FROM execution_items;\n DELETE FROM execution_runs;\n DELETE FROM rules;\n DELETE FROM newsletter_senders;\n DELETE FROM emails;\n `);\n\n const insertEmail = sqlite.prepare(`\n INSERT INTO emails (\n id, thread_id, from_address, from_name, to_addresses, subject, snippet, date,\n is_read, is_starred, label_ids, size_estimate, has_attachments, list_unsubscribe, synced_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n const insertRule = sqlite.prepare(`\n INSERT INTO rules (\n id, name, description, enabled, yaml_hash, conditions, actions, priority, deployed_at, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n const insertRun = sqlite.prepare(`\n INSERT INTO execution_runs (\n id, source_type, rule_id, dry_run, requested_actions, query, status, created_at, undone_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n const insertItem = sqlite.prepare(`\n INSERT INTO execution_items (\n id, run_id, email_id, status, applied_actions, before_label_ids, after_label_ids, error_message, executed_at, undone_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n const insertNewsletter = sqlite.prepare(`\n INSERT INTO newsletter_senders (\n id, email, name, message_count, unread_count, status, unsubscribe_link, detection_reason, first_seen, last_seen\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n const transaction = sqlite.transaction(() => {\n for (const entry of dataset.messages) {\n insertEmail.run(\n entry.message.id,\n entry.message.threadId,\n entry.message.fromAddress,\n entry.message.fromName,\n JSON.stringify(entry.message.toAddresses),\n entry.message.subject,\n entry.message.snippet,\n entry.message.date,\n entry.message.isRead ? 1 : 0,\n entry.message.isStarred ? 1 : 0,\n JSON.stringify(entry.message.labelIds),\n entry.message.sizeEstimate,\n entry.message.hasAttachments ? 1 : 0,\n entry.message.listUnsubscribe,\n referenceNow,\n );\n }\n\n for (const rule of dataset.rules) {\n insertRule.run(\n rule.id,\n rule.name,\n rule.description,\n rule.enabled ? 1 : 0,\n rule.yamlHash,\n JSON.stringify(rule.conditions),\n JSON.stringify(rule.actions),\n rule.priority,\n rule.deployedAt,\n rule.createdAt,\n );\n }\n\n for (const run of dataset.executionRuns) {\n insertRun.run(\n run.id,\n run.sourceType,\n run.ruleId,\n run.dryRun ? 1 : 0,\n JSON.stringify(run.requestedActions),\n run.query,\n run.status,\n run.createdAt,\n run.undoneAt,\n );\n }\n\n for (const item of dataset.executionItems) {\n insertItem.run(\n item.id,\n item.runId,\n item.emailId,\n item.status,\n JSON.stringify(item.appliedActions),\n JSON.stringify(item.beforeLabelIds),\n JSON.stringify(item.afterLabelIds),\n item.errorMessage,\n item.executedAt,\n item.undoneAt,\n );\n }\n\n for (const newsletter of dataset.newsletters) {\n insertNewsletter.run(\n newsletter.id,\n newsletter.email,\n newsletter.name,\n newsletter.messageCount,\n newsletter.unreadCount,\n newsletter.status,\n newsletter.unsubscribeLink,\n newsletter.detectionReason,\n newsletter.firstSeen,\n newsletter.lastSeen,\n );\n }\n\n sqlite\n .prepare(\n `\n UPDATE sync_state\n SET account_email = ?,\n history_id = ?,\n last_full_sync = ?,\n last_incremental_sync = ?,\n total_messages = ?,\n full_sync_cursor = NULL,\n full_sync_processed = 0,\n full_sync_total = 0\n WHERE id = 1\n `,\n )\n .run(\n dataset.accountEmail,\n dataset.historyId,\n referenceNow - 2 * 60 * 60 * 1000,\n referenceNow - 5 * 60 * 1000,\n dataset.messages.length,\n );\n });\n\n transaction();\n return dataset;\n}\n","import {\n cancel,\n confirm,\n intro,\n isCancel,\n log,\n note,\n outro,\n password,\n spinner,\n text,\n} from \"@clack/prompts\";\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport {\n DEFAULT_GOOGLE_REDIRECT_URI,\n getConfigFilePath,\n getGoogleCredentialStatus,\n loadConfig,\n} from \"../../config.js\";\nimport {\n createOAuthClient,\n getOAuthReadiness,\n GMAIL_SCOPES,\n startOAuthFlow,\n} from \"../auth/oauth.js\";\nimport { reconcileCacheForAuthenticatedAccount } from \"../sync/sync.js\";\nimport {\n checkGcloudAuthenticated,\n checkGcloudInstalled,\n enableApi,\n getGcloudActiveAccount,\n getGcloudProject,\n openBrowser,\n runGcloudAuthLogin,\n} from \"./gcloud.js\";\nimport { writeGoogleCredentials } from \"./credentials.js\";\n\nexport interface SetupOptions {\n skipGcloud?: boolean;\n project?: string;\n}\n\nexport interface SetupResult {\n completed: boolean;\n configPath: string;\n projectId: string | null;\n credentialsUpdated: boolean;\n usedGcloud: boolean;\n authenticatedEmail: string | null;\n}\n\nconst GMAIL_API = \"gmail.googleapis.com\";\nconst AUDIENCE_URL = \"https://console.cloud.google.com/auth/audience\";\nconst CREDENTIALS_URL = \"https://console.cloud.google.com/apis/credentials\";\n\nfunction withProject(url: string, projectId: string | null): string {\n return projectId ? `${url}?project=${encodeURIComponent(projectId)}` : url;\n}\n\nfunction validateProjectId(value: string | undefined): string | undefined {\n if (!value?.trim()) {\n return \"Enter a Google Cloud project ID.\";\n }\n\n return undefined;\n}\n\nfunction validateClientId(value: string | undefined): string | undefined {\n if (!value?.trim()) {\n return \"Enter a Google OAuth client ID.\";\n }\n\n if (!value.includes(\".apps.googleusercontent.com\")) {\n return \"Google client IDs usually end with .apps.googleusercontent.com.\";\n }\n\n return undefined;\n}\n\nfunction validateClientSecret(value: string | undefined): string | undefined {\n if (!value?.trim()) {\n return \"Enter a Google OAuth client secret.\";\n }\n\n return undefined;\n}\n\nfunction validateRedirectUri(value: string | undefined): string | undefined {\n if (!value?.trim()) {\n return \"Enter a redirect URI.\";\n }\n\n try {\n const parsed = new URL(value);\n if (!parsed.protocol.startsWith(\"http\")) {\n return \"Redirect URI must start with http:// or https://.\";\n }\n } catch {\n return \"Enter a valid redirect URI.\";\n }\n\n return undefined;\n}\n\nasync function promptValue<T>(promise: Promise<T | symbol>, cancelMessage: string): Promise<T | null> {\n const value = await promise;\n\n if (isCancel(value)) {\n cancel(cancelMessage);\n return null;\n }\n\n return value as T;\n}\n\nfunction printConsentScreenHelp(projectId: string | null): void {\n note(\n [\n \"In Google Cloud Console, go to Google Auth Platform > Audience.\",\n \"\",\n \"1. Set User type:\",\n \" External — required for personal Gmail (@gmail.com).\",\n \" Internal — only if your account is part of a Google Workspace org.\",\n \" Personal Gmail accounts cannot use Internal.\",\n \"\",\n \"2. Complete the Branding section (app name, support email, etc.)\",\n \"\",\n '3. Publishing status should be \"Testing\" (this is the default).',\n \"\",\n \"4. IMPORTANT: Scroll down to Test Users and click + Add Users.\",\n \" Add your Gmail address here. Without this you will get\",\n ' \"Error 403: access_denied\" when signing in.',\n \"\",\n `Console: ${withProject(AUDIENCE_URL, projectId)}`,\n ].join(\"\\n\"),\n \"OAuth Consent Screen (Audience)\",\n );\n}\n\nfunction printCredentialHelp(projectId: string | null, redirectUri: string): void {\n note(\n [\n \"Create an OAuth 2.0 client with these settings:\",\n \"\",\n '1. Application type: \"Web application\"',\n '2. Name: \"inboxctl\"',\n `3. Authorized redirect URI: ${redirectUri}`,\n \"4. Click Create and copy the Client ID and Client Secret\",\n \"\",\n `Console: ${withProject(CREDENTIALS_URL, projectId)}`,\n ].join(\"\\n\"),\n \"OAuth Credentials\",\n );\n}\n\nfunction findEnvFile(): string | null {\n const candidates = [\n resolve(process.cwd(), \".env\"),\n resolve(process.cwd(), \".env.local\"),\n ];\n return candidates.find((p) => existsSync(p)) || null;\n}\n\nfunction updateEnvFile(\n envPath: string,\n credentials: { clientId: string; clientSecret: string; redirectUri: string },\n): void {\n let content = readFileSync(envPath, \"utf8\");\n\n const replacements: [string, string][] = [\n [\"GOOGLE_CLIENT_ID\", credentials.clientId],\n [\"GOOGLE_CLIENT_SECRET\", credentials.clientSecret],\n [\"GOOGLE_REDIRECT_URI\", credentials.redirectUri],\n ];\n\n for (const [key, value] of replacements) {\n const regex = new RegExp(`^${key}=.*$`, \"m\");\n if (regex.test(content)) {\n content = content.replace(regex, `${key}=${value}`);\n }\n }\n\n writeFileSync(envPath, content, \"utf8\");\n}\n\nasync function handleEnvironmentOverrides(\n credentials: { clientId: string; clientSecret: string; redirectUri: string } | null,\n): Promise<void> {\n const overrides = [\"GOOGLE_CLIENT_ID\", \"GOOGLE_CLIENT_SECRET\", \"GOOGLE_REDIRECT_URI\"]\n .filter((key) => Boolean(process.env[key]));\n\n if (overrides.length === 0) {\n return;\n }\n\n const envPath = findEnvFile();\n\n if (envPath && credentials) {\n log.warn(\n `Your .env file (${envPath}) has credentials that override config.json.`,\n );\n\n const shouldUpdate = await promptValue(\n confirm({\n message: \"Update .env with the new credentials too?\",\n initialValue: true,\n }),\n \"Setup cancelled.\",\n );\n\n if (shouldUpdate) {\n updateEnvFile(envPath, credentials);\n // Reload process.env so the verify step uses the right values\n process.env.GOOGLE_CLIENT_ID = credentials.clientId;\n process.env.GOOGLE_CLIENT_SECRET = credentials.clientSecret;\n process.env.GOOGLE_REDIRECT_URI = credentials.redirectUri;\n log.success(`.env updated at ${envPath}`);\n } else {\n note(\n `Your .env values still override config.json for: ${overrides.join(\", \")}.\\n` +\n \"If auth fails, update or remove those overrides in your .env file.\",\n \"Environment Overrides\",\n );\n }\n } else {\n note(\n `Environment variables override config.json for: ${overrides.join(\", \")}.\\n` +\n \"If the wizard's saved credentials do not take effect, update or remove those overrides first.\",\n \"Environment Overrides\",\n );\n }\n}\n\nfunction verifyOAuthSetup(): void {\n const config = loadConfig();\n const readiness = getOAuthReadiness(config);\n\n if (!readiness.ready) {\n throw new Error(`OAuth credentials are still incomplete: ${readiness.missing.join(\", \")}`);\n }\n\n const client = createOAuthClient(config);\n client.generateAuthUrl({\n access_type: \"offline\",\n scope: GMAIL_SCOPES,\n });\n}\n\nexport async function runSetupWizard(options: SetupOptions = {}): Promise<SetupResult> {\n intro(\"inboxctl Setup Wizard\");\n\n const initialConfig = loadConfig();\n const configPath = getConfigFilePath(initialConfig.dataDir);\n const existingGoogleStatus = getGoogleCredentialStatus(initialConfig);\n\n let useGcloud = !options.skipGcloud;\n let projectId = options.project || null;\n let credentialsUpdated = false;\n let gmailApiEnabled = false;\n let authenticatedEmail: string | null = null;\n\n if (useGcloud) {\n const gcloudSpinner = spinner();\n gcloudSpinner.start(\"Checking gcloud CLI...\");\n\n if (!checkGcloudInstalled()) {\n gcloudSpinner.error(\"gcloud CLI not found.\");\n note(\n \"Install the Google Cloud CLI to let inboxctl enable the Gmail API for you.\\n\" +\n \"You can still continue with the manual credential flow if you prefer.\",\n \"gcloud CLI\",\n );\n\n const continueManual = await promptValue(\n confirm({\n message: \"Continue with manual setup only?\",\n initialValue: true,\n }),\n \"Setup cancelled.\",\n );\n\n if (!continueManual) {\n cancel(\"Setup cancelled.\");\n return {\n completed: false,\n configPath,\n projectId,\n credentialsUpdated,\n usedGcloud: false,\n authenticatedEmail,\n };\n }\n\n useGcloud = false;\n } else {\n const account = getGcloudActiveAccount();\n gcloudSpinner.stop(account ? `gcloud CLI found (${account})` : \"gcloud CLI found\");\n }\n }\n\n if (useGcloud && !checkGcloudAuthenticated()) {\n log.warn(\"gcloud is installed but not authenticated.\");\n\n const shouldLogin = await promptValue(\n confirm({\n message: \"Run `gcloud auth login` now?\",\n initialValue: true,\n }),\n \"Setup cancelled.\",\n );\n\n if (!shouldLogin) {\n const continueManual = await promptValue(\n confirm({\n message: \"Continue without gcloud and finish setup manually?\",\n initialValue: true,\n }),\n \"Setup cancelled.\",\n );\n\n if (!continueManual) {\n cancel(\"Setup cancelled.\");\n return {\n completed: false,\n configPath,\n projectId,\n credentialsUpdated,\n usedGcloud: false,\n authenticatedEmail,\n };\n }\n\n useGcloud = false;\n } else {\n const loginResult = runGcloudAuthLogin();\n\n if (!loginResult.success || !checkGcloudAuthenticated()) {\n throw new Error(loginResult.error || \"gcloud authentication did not complete successfully.\");\n }\n\n const account = getGcloudActiveAccount();\n log.success(account ? `Authenticated as ${account}` : \"gcloud authentication complete.\");\n }\n }\n\n if (useGcloud) {\n projectId = projectId || getGcloudProject();\n\n if (!projectId) {\n projectId = await promptValue(\n text({\n message: \"Google Cloud project ID\",\n placeholder: \"my-project-123\",\n validate: validateProjectId,\n }),\n \"Setup cancelled.\",\n );\n } else {\n log.step(`Using project: ${projectId}`);\n }\n\n if (!projectId) {\n cancel(\"Setup cancelled.\");\n return {\n completed: false,\n configPath,\n projectId: null,\n credentialsUpdated,\n usedGcloud: true,\n authenticatedEmail,\n };\n }\n\n const enableSpinner = spinner();\n enableSpinner.start(\"Enabling Gmail API...\");\n\n const enabled = enableApi(projectId, GMAIL_API);\n\n if (!enabled.success) {\n enableSpinner.error(`Failed to enable Gmail API: ${enabled.error}`);\n const continueManual = await promptValue(\n confirm({\n message: \"Continue anyway and finish the remaining setup steps manually?\",\n initialValue: false,\n }),\n \"Setup cancelled.\",\n );\n\n if (!continueManual) {\n cancel(\"Setup cancelled.\");\n return {\n completed: false,\n configPath,\n projectId,\n credentialsUpdated,\n usedGcloud: true,\n authenticatedEmail,\n };\n }\n } else {\n enableSpinner.stop(\"Gmail API enabled.\");\n gmailApiEnabled = true;\n }\n }\n\n const consentAlreadyConfigured = existingGoogleStatus.configured\n ? await promptValue(\n confirm({\n message: \"Is the OAuth consent screen already configured for this project?\",\n initialValue: false,\n }),\n \"Setup cancelled.\",\n )\n : false;\n\n if (consentAlreadyConfigured === null) {\n return {\n completed: false,\n configPath,\n projectId,\n credentialsUpdated,\n usedGcloud: useGcloud,\n authenticatedEmail,\n };\n }\n\n if (!consentAlreadyConfigured) {\n printConsentScreenHelp(projectId);\n log.step(`Opening ${withProject(AUDIENCE_URL, projectId)}`);\n openBrowser(withProject(AUDIENCE_URL, projectId));\n\n const completedConsent = await promptValue(\n confirm({\n message: \"Have you completed the consent screen setup?\",\n initialValue: false,\n }),\n \"Setup cancelled.\",\n );\n\n if (!completedConsent) {\n cancel(\"Finish the consent screen setup, then rerun `inboxctl setup`.\");\n return {\n completed: false,\n configPath,\n projectId,\n credentialsUpdated,\n usedGcloud: useGcloud,\n authenticatedEmail,\n };\n }\n\n note(\n 'When you sign in, you may see \"This app isn\\'t verified\".\\n' +\n \"This is normal for personal/testing apps. Click \\\"Advanced\\\", then\\n\" +\n '\"Go to inboxctl (unsafe)\" to continue.',\n \"Unverified App Warning\",\n );\n } else {\n note(\n \"Quick check — verify these in Google Auth Platform > Audience:\\n\\n\" +\n \"- User type is External (required for personal Gmail)\\n\" +\n \"- Your Gmail address is listed under Test Users\\n\" +\n ' (without this you will get \"Error 403: access_denied\")\\n\\n' +\n `Verify at: ${withProject(AUDIENCE_URL, projectId)}`,\n \"Consent Screen Checklist\",\n );\n\n note(\n 'When you sign in, you may see \"This app isn\\'t verified\".\\n' +\n \"This is normal for personal/testing apps. Click \\\"Advanced\\\", then\\n\" +\n '\"Go to inboxctl (unsafe)\" to continue.',\n \"Unverified App Warning\",\n );\n }\n\n const shouldReplaceCredentials = existingGoogleStatus.configured\n ? await promptValue(\n confirm({\n message: \"Google OAuth credentials already exist. Replace them?\",\n initialValue: false,\n }),\n \"Setup cancelled.\",\n )\n : true;\n\n if (shouldReplaceCredentials === null) {\n return {\n completed: false,\n configPath,\n projectId,\n credentialsUpdated,\n usedGcloud: useGcloud,\n authenticatedEmail,\n };\n }\n\n const redirectUri = initialConfig.google.redirectUri || DEFAULT_GOOGLE_REDIRECT_URI;\n\n if (shouldReplaceCredentials) {\n printCredentialHelp(projectId, redirectUri);\n log.step(`Opening ${withProject(CREDENTIALS_URL, projectId)}`);\n openBrowser(withProject(CREDENTIALS_URL, projectId));\n\n const clientId = await promptValue(\n text({\n message: \"Paste your Google Client ID\",\n placeholder: \"123456789.apps.googleusercontent.com\",\n validate: validateClientId,\n }),\n \"Setup cancelled.\",\n );\n\n if (!clientId) {\n return {\n completed: false,\n configPath,\n projectId,\n credentialsUpdated,\n usedGcloud: useGcloud,\n authenticatedEmail,\n };\n }\n\n const clientSecret = await promptValue(\n password({\n message: \"Paste your Google Client Secret\",\n validate: validateClientSecret,\n }),\n \"Setup cancelled.\",\n );\n\n if (!clientSecret) {\n return {\n completed: false,\n configPath,\n projectId,\n credentialsUpdated,\n usedGcloud: useGcloud,\n authenticatedEmail,\n };\n }\n\n const selectedRedirectUri = await promptValue(\n text({\n message: \"Redirect URI\",\n initialValue: redirectUri,\n validate: validateRedirectUri,\n }),\n \"Setup cancelled.\",\n );\n\n if (!selectedRedirectUri) {\n return {\n completed: false,\n configPath,\n projectId,\n credentialsUpdated,\n usedGcloud: useGcloud,\n authenticatedEmail,\n };\n }\n\n const saveSpinner = spinner();\n saveSpinner.start(`Saving credentials to ${configPath}...`);\n writeGoogleCredentials({\n clientId,\n clientSecret,\n redirectUri: selectedRedirectUri,\n }, configPath);\n saveSpinner.stop(\"Credentials saved.\");\n credentialsUpdated = true;\n\n await handleEnvironmentOverrides({\n clientId,\n clientSecret,\n redirectUri: selectedRedirectUri,\n });\n } else {\n log.step(\"Keeping existing Google OAuth credentials from config.json.\");\n await handleEnvironmentOverrides(null);\n }\n\n const verifySpinner = spinner();\n verifySpinner.start(\"Verifying setup...\");\n verifyOAuthSetup();\n verifySpinner.stop(\"OAuth credentials look valid.\");\n\n const shouldAuthenticateNow = await promptValue(\n confirm({\n message: \"Authenticate a Gmail account now?\",\n initialValue: true,\n }),\n \"Setup cancelled.\",\n );\n\n if (shouldAuthenticateNow === null) {\n return {\n completed: false,\n configPath,\n projectId,\n credentialsUpdated,\n usedGcloud: useGcloud,\n authenticatedEmail,\n };\n }\n\n if (shouldAuthenticateNow) {\n log.step(\"Starting Gmail sign-in in your browser...\");\n\n try {\n const activeConfig = loadConfig();\n const authResult = await startOAuthFlow(activeConfig);\n authenticatedEmail = authResult.email;\n const reconciliation = reconcileCacheForAuthenticatedAccount(\n activeConfig.dbPath,\n authenticatedEmail,\n { clearLegacyUnscoped: true },\n );\n log.success(\n authenticatedEmail && authenticatedEmail !== \"unknown\"\n ? `Authenticated Gmail account: ${authenticatedEmail}`\n : \"Gmail authentication complete.\",\n );\n if (reconciliation.cleared) {\n log.step(\"Local cache reset to avoid mixing data from another Gmail account.\");\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes(\"access_denied\") || message.includes(\"access denied\")) {\n log.error(\"Google blocked the sign-in request.\");\n note(\n \"This usually means one of:\\n\" +\n \"- Your Gmail address is not added as a test user (for External apps)\\n\" +\n \"- You chose Internal but are using a personal Gmail account\\n\\n\" +\n \"Fix it in Google Auth Platform > Audience, then retry with: inboxctl auth login\",\n \"Access Denied\",\n );\n } else {\n throw error;\n }\n }\n }\n\n note(\n [\n gmailApiEnabled && projectId\n ? `✓ Gmail API enabled for project ${projectId}`\n : \"✓ Gmail API step reviewed\",\n \"✓ OAuth consent screen reviewed\",\n existingGoogleStatus.configured && !credentialsUpdated\n ? \"✓ Existing OAuth credentials kept\"\n : `✓ OAuth credentials saved to ${configPath}`,\n authenticatedEmail\n ? `✓ Gmail authenticated as ${authenticatedEmail}`\n : \"✓ Gmail authentication ready\",\n \"\",\n authenticatedEmail\n ? \"You can start using inboxctl now.\"\n : \"Next: run `inboxctl auth login` to authenticate your Gmail account.\",\n ].join(\"\\n\"),\n \"Setup Complete\",\n );\n\n outro(\"Setup complete.\");\n\n return {\n completed: true,\n configPath,\n projectId,\n credentialsUpdated,\n usedGcloud: useGcloud,\n authenticatedEmail,\n };\n}\n","import { spawnSync } from \"node:child_process\";\nimport open from \"open\";\n\ninterface GcloudCommandResult {\n success: boolean;\n stdout: string;\n stderr: string;\n error?: string;\n}\n\nfunction runGcloud(args: string[], inheritStdio: boolean = false): GcloudCommandResult {\n const result = spawnSync(\"gcloud\", args, {\n encoding: \"utf8\",\n stdio: inheritStdio ? \"inherit\" : \"pipe\",\n });\n\n if (result.error) {\n return {\n success: false,\n stdout: \"\",\n stderr: \"\",\n error: result.error.message,\n };\n }\n\n return {\n success: result.status === 0,\n stdout: typeof result.stdout === \"string\" ? result.stdout : \"\",\n stderr: typeof result.stderr === \"string\" ? result.stderr : \"\",\n };\n}\n\nfunction normalizeValue(value: string): string | null {\n const trimmed = value.trim();\n\n if (!trimmed || trimmed === \"(unset)\") {\n return null;\n }\n\n return trimmed;\n}\n\nexport function checkGcloudInstalled(): boolean {\n return runGcloud([\"--version\"]).success;\n}\n\nexport function getGcloudActiveAccount(): string | null {\n const result = runGcloud([\n \"auth\",\n \"list\",\n \"--filter=status:ACTIVE\",\n \"--format=value(account)\",\n ]);\n\n if (!result.success) {\n return null;\n }\n\n return normalizeValue(result.stdout);\n}\n\nexport function checkGcloudAuthenticated(): boolean {\n return getGcloudActiveAccount() !== null;\n}\n\nexport function runGcloudAuthLogin(): { success: boolean; error?: string } {\n const result = runGcloud([\"auth\", \"login\"], true);\n return result.success ? { success: true } : { success: false, error: result.error || result.stderr || \"gcloud auth login failed.\" };\n}\n\nexport function getGcloudProject(): string | null {\n const result = runGcloud([\"config\", \"get-value\", \"project\", \"--quiet\"]);\n\n if (!result.success) {\n return null;\n }\n\n return normalizeValue(result.stdout);\n}\n\nexport function enableApi(projectId: string, api: string): { success: boolean; error?: string } {\n const result = runGcloud([\"services\", \"enable\", api, \"--project\", projectId]);\n\n if (result.success) {\n return { success: true };\n }\n\n return {\n success: false,\n error: normalizeValue(result.stderr) || normalizeValue(result.stdout) || result.error || `Failed to enable ${api}.`,\n };\n}\n\nexport function openBrowser(url: string): void {\n void open(url, {\n wait: false,\n newInstance: false,\n }).catch(() => {\n // The wizard also prints the URL, so failure to auto-open is non-fatal.\n });\n}\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { getConfigFilePath, getDefaultDataDir, ensureDir, DEFAULT_GOOGLE_REDIRECT_URI } from \"../../config.js\";\n\nexport interface SetupCredentials {\n clientId: string;\n clientSecret: string;\n redirectUri?: string;\n}\n\ntype StoredConfig = {\n google?: {\n clientId?: string;\n clientSecret?: string;\n redirectUri?: string;\n };\n [key: string]: unknown;\n};\n\nfunction readStoredConfig(configPath: string): StoredConfig {\n if (!existsSync(configPath)) {\n return {};\n }\n\n const raw = readFileSync(configPath, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(`Invalid config file at ${configPath}: expected JSON object`);\n }\n\n return parsed as StoredConfig;\n}\n\nexport function writeGoogleCredentials(\n credentials: SetupCredentials,\n configPath: string = getConfigFilePath(getDefaultDataDir()),\n): void {\n const current = readStoredConfig(configPath);\n\n ensureDir(dirname(configPath));\n const next: StoredConfig = {\n ...current,\n google: {\n ...(current.google || {}),\n clientId: credentials.clientId,\n clientSecret: credentials.clientSecret,\n redirectUri: credentials.redirectUri || current.google?.redirectUri || DEFAULT_GOOGLE_REDIRECT_URI,\n },\n };\n\n writeFileSync(configPath, `${JSON.stringify(next, null, 2)}\\n`, \"utf8\");\n}\n"],"mappings":"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","names":["minutes","rules","text","rows","labels","unsubscribe","input","input","labels","rules","existsSync","readFileSync","writeFileSync","dirname","dirname","existsSync","readFileSync","writeFileSync","stripAnsi","truncate","pad","formatRelativeTime","formatPercent","labels","rules","result"]}