@feeef.dev/cli 0.2.0 → 0.2.1

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/config.ts","../src/oauth.ts","../src/ui.ts","../src/commands/auth.ts","../src/commands/template/add.ts","../src/project.ts","../src/theme-scaffold.ts","../src/commands/template/build.ts","../src/kit.ts","../src/commands/template/dev.ts","../src/storefront.ts","../src/commands/template/init.ts","../src/kits.ts","../src/theme-package.ts","../src/theme.ts","../src/commands/template/publish.ts","../src/commands/use.ts","../src/commands/template/remove.ts","../src/commands/template/watch.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport {\n runConfigSet,\n runConfigShow,\n runSignin,\n runSignout,\n runWhoami,\n} from \"./commands/auth.js\";\nimport {\n runTemplateAddComponent,\n runTemplateAddPage,\n} from \"./commands/template/add.js\";\nimport { runTemplateBuild } from \"./commands/template/build.js\";\nimport { runTemplateDev } from \"./commands/template/dev.js\";\nimport { runTemplateInit } from \"./commands/template/init.js\";\nimport { runTemplatePublish } from \"./commands/template/publish.js\";\nimport {\n runTemplateRemoveComponent,\n runTemplateRemovePage,\n} from \"./commands/template/remove.js\";\nimport { runTemplateWatch } from \"./commands/template/watch.js\";\nimport { runUse } from \"./commands/use.js\";\nimport { banner, pc } from \"./ui.js\";\n\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name(\"feeef\")\n .description(\"Feeef developer CLI — themes today, cloud tools tomorrow\")\n .version(\"0.2.0\")\n .hook(\"preAction\", (thisCommand) => {\n // Skip banner for nested help\n if (thisCommand.args.length === 0) return;\n banner();\n });\n\n program\n .command(\"signin\")\n .description(\"Sign in via browser OAuth (or --password-auth)\")\n .option(\"-e, --email <email>\", \"Account email (password auth)\")\n .option(\n \"--password-auth\",\n \"Use email/password instead of browser OAuth (prompts for password)\",\n )\n .option(\"--api-url <url>\", \"API base URL\")\n .action(async (opts) => {\n await runSignin({\n email: opts.email,\n apiUrl: opts.apiUrl,\n passwordAuth: opts.passwordAuth,\n });\n });\n\n program\n .command(\"whoami\")\n .description(\"Show the signed-in user\")\n .action(async () => {\n await runWhoami();\n });\n\n program\n .command(\"signout\")\n .description(\"Clear saved token\")\n .action(() => {\n runSignout();\n });\n\n const config = program\n .command(\"config\")\n .description(\"Show or set CLI config (~/.config/feeef)\");\n\n config\n .command(\"show\", { isDefault: true })\n .description(\"Print non-secret config\")\n .action(() => {\n runConfigShow();\n });\n\n config\n .command(\"set\")\n .description(\"Set a config key\")\n .argument(\"<key>\", \"apiUrl | defaultStoreId | storefrontPath | devPort | …\")\n .argument(\"<value>\", \"Value\")\n .action((key: string, value: string) => {\n runConfigSet(key, value);\n });\n\n program\n .command(\"use\")\n .description(\n \"Link theme to a store (.feeefrc); omit store to pick from your list\",\n )\n .argument(\"[store]\", \"Store id or slug (optional — interactive picker)\")\n .option(\"--api-url <url>\", \"API override for this theme\")\n .action(async (store, opts) => {\n await runUse(store, opts);\n });\n\n // Top-level aliases for the common path\n program\n .command(\"publish\")\n .description(\"Build + publish current theme (alias of template publish)\")\n .argument(\"[dir]\", \"Theme directory\")\n .option(\"--public\", \"Policy public (default private)\")\n .option(\"--unlisted\", \"Policy unlisted\")\n .option(\"--store <id>\", \"Owner store id\")\n .option(\"--title <title>\", \"Marketplace title\")\n .option(\"--yes\", \"Skip prompts\")\n .option(\"--apply\", \"Install onto the store\")\n .option(\"--no-apply\", \"Do not install\")\n .action(async (dir, opts) => {\n await runTemplatePublish(dir, opts);\n });\n\n const template = program\n .command(\"template\")\n .description(\n \"Theme kit: init, add/remove page|component, build, check, watch, dev, publish\",\n );\n\n template\n .command(\"init\")\n .description(\n \"Scaffold a theme (blank, git kit, or public marketplace)\",\n )\n .argument(\"[name]\", \"Folder name\")\n .option(\"--blank\", \"Use the blank scaffold (skip picker)\")\n .option(\"--from <templateId>\", \"Clone a public template by id\")\n .option(\"--git <url>\", \"Clone a kit repo (depth 1), Adonis/Laravel style\")\n .option(\"-q, --search <query>\", \"Pre-fill marketplace search\")\n .action(async (name, opts) => {\n await runTemplateInit(name, {\n blank: opts.blank,\n from: opts.from,\n search: opts.search,\n git: opts.git,\n });\n });\n\n const templateAdd = template\n .command(\"add\")\n .description(\"Add a page or component to the current theme\");\n\n templateAdd\n .command(\"page\")\n .description(\"Create pages/<pageId>/ with flat components/ + update manifest\")\n .argument(\"<pageId>\", \"Page id (e.g. home, checkout, thank_you)\")\n .option(\"--dir <path>\", \"Theme directory\")\n .action(async (pageId, opts) => {\n await runTemplateAddPage(pageId, { dir: opts.dir });\n });\n\n templateAdd\n .command(\"component\")\n .description(\n \"Create a starter <name>.tsx under pages/<page>/components/ (or sections/main)\",\n )\n .argument(\"<pageId>\", \"Page id\")\n .argument(\"<componentId>\", \"Component file id (e.g. hero)\")\n .option(\"--title <title>\", \"meta.title (default: Title Case of id)\")\n .option(\n \"--section <id>\",\n \"Legacy: write under sections/<id>/components/ instead of flat\",\n )\n .option(\"--dir <path>\", \"Theme directory\")\n .action(async (pageId, componentId, opts) => {\n await runTemplateAddComponent(pageId, componentId, {\n dir: opts.dir,\n title: opts.title,\n section: opts.section,\n });\n });\n\n const templateRemove = template\n .command(\"remove\")\n .description(\"Remove a page or component from the current theme\");\n\n templateRemove\n .command(\"page\")\n .description(\"Delete pages/<pageId>/ and drop it from feeef.template.json\")\n .argument(\"<pageId>\", \"Page id\")\n .option(\"-y, --yes\", \"Skip confirmation\")\n .option(\"--dir <path>\", \"Theme directory\")\n .action(async (pageId, opts) => {\n await runTemplateRemovePage(pageId, { dir: opts.dir, yes: opts.yes });\n });\n\n templateRemove\n .command(\"component\")\n .description(\"Delete a component file/folder under a page\")\n .argument(\"<pageId>\", \"Page id\")\n .argument(\"<componentId>\", \"Component id\")\n .option(\"--section <id>\", \"Legacy: only search sections/<id>/components/\")\n .option(\"-y, --yes\", \"Skip confirmation\")\n .option(\"--dir <path>\", \"Theme directory\")\n .action(async (pageId, componentId, opts) => {\n await runTemplateRemoveComponent(pageId, componentId, {\n dir: opts.dir,\n section: opts.section,\n yes: opts.yes,\n });\n });\n\n template\n .command(\"build\")\n .description(\"Compile theme → dist/data.json\")\n .argument(\"[dir]\", \"Theme directory\")\n .action(async (dir) => {\n await runTemplateBuild(dir);\n });\n\n template\n .command(\"check\")\n .description(\"Validate theme without writing dist\")\n .argument(\"[dir]\", \"Theme directory\")\n .action(async (dir) => {\n await runTemplateBuild(dir, { checkOnly: true });\n });\n\n template\n .command(\"watch\")\n .description(\"Rebuild on file changes\")\n .argument(\"[dir]\", \"Theme directory\")\n .action(async (dir) => {\n await runTemplateWatch(dir);\n });\n\n template\n .command(\"dev\")\n .description(\n \"Watch + push draft preview to hosted storefront (never overwrites live theme)\",\n )\n .argument(\"[dir]\", \"Theme directory\")\n .option(\"-p, --port <port>\", \"Local Next port (only with --local)\")\n .option(\"--storefront <path>\", \"Lithium storefront root (implies --local)\")\n .option(\n \"--local\",\n \"Employee escape hatch: spawn local Next (requires storefront)\",\n )\n .action(async (dir, opts) => {\n await runTemplateDev(dir, opts);\n });\n\n template\n .command(\"publish\")\n .description(\"Build, upload components + template + locales, optional install\")\n .argument(\"[dir]\", \"Theme directory\")\n .option(\"--public\", \"Policy public (default private)\")\n .option(\"--unlisted\", \"Policy unlisted\")\n .option(\"--store <id>\", \"Owner store id\")\n .option(\"--title <title>\", \"Marketplace title\")\n .option(\"--yes\", \"Skip prompts\")\n .option(\"--apply\", \"Install onto the store\")\n .option(\"--no-apply\", \"Do not install\")\n .action(async (dir, opts) => {\n await runTemplatePublish(dir, opts);\n });\n\n // Future extension points (stubs)\n const cloud = program\n .command(\"cloud\")\n .description(\"Cloud providers (Azure / GCP / AWS) — coming soon\");\n\n cloud\n .command(\"azure\")\n .description(\"Azure helpers (coming soon)\")\n .action(() => {\n console.log(pc.dim(\"Not implemented yet. Tracked for a future release.\"));\n });\n\n cloud\n .command(\"gcp\")\n .description(\"Google Cloud helpers (coming soon)\")\n .action(() => {\n console.log(pc.dim(\"Not implemented yet.\"));\n });\n\n cloud\n .command(\"aws\")\n .description(\"AWS helpers (coming soon)\")\n .action(() => {\n console.log(pc.dim(\"Not implemented yet.\"));\n });\n\n return program;\n}\n\nexport async function runCli(argv = process.argv): Promise<void> {\n const program = createProgram();\n await program.parseAsync(argv);\n}\n","import axios, { type AxiosInstance } from \"axios\";\nimport { FeeeF } from \"feeef\";\nimport {\n defaultApiUrl,\n loadConfig,\n saveConfig,\n type FeeefCliConfig,\n} from \"./config.js\";\n\nexport interface FeeefClientBundle {\n ff: FeeeF;\n http: AxiosInstance;\n cfg: FeeefCliConfig;\n baseURL: string;\n token: string | undefined;\n}\n\nfunction createHttp(baseURL: string, token: string | undefined): AxiosInstance {\n return axios.create({\n baseURL,\n maxBodyLength: Infinity,\n maxContentLength: Infinity,\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n },\n });\n}\n\nexport function createClient(opts: { requireAuth?: boolean } = {}): FeeefClientBundle {\n const requireAuth = opts.requireAuth !== false;\n const cfg = loadConfig();\n const baseURL = defaultApiUrl(cfg);\n const token = cfg.token;\n\n if (requireAuth && !token) {\n throw new Error(\"Not signed in. Run: feeef signin\");\n }\n\n const http = createHttp(baseURL, token);\n // feeef.js bundles its own axios types — cast at the boundary.\n const ff = new FeeeF({\n apiKey: token || \"\",\n baseURL,\n client: http as never,\n cache: false,\n });\n\n return { ff, http, cfg, baseURL, token };\n}\n\nexport async function signinWithPassword(input: {\n email: string;\n password: string;\n apiUrl?: string;\n}): Promise<{ user?: { email?: string }; token?: { token?: string } }> {\n const baseURL = (input.apiUrl || defaultApiUrl()).replace(/\\/$/, \"\");\n const http = createHttp(baseURL, undefined);\n const ff = new FeeeF({\n apiKey: \"\",\n baseURL,\n client: http as never,\n cache: false,\n });\n const auth = await ff.users.signin({\n email: input.email,\n password: input.password,\n });\n const token = auth?.token?.token;\n if (!token) {\n throw new Error(\"Signin succeeded but no token was returned\");\n }\n ff.setHeader(\"Authorization\", `Bearer ${token}`);\n saveConfig({ token, email: input.email, apiUrl: baseURL });\n return auth;\n}\n","import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nexport interface FeeefCliConfig {\n token?: string;\n apiUrl?: string;\n email?: string;\n defaultStoreId?: string;\n lastPublishedTemplateId?: string;\n /**\n * Absolute path to Lithium storefront — only used with `feeef template dev --local`\n * (Feeef employees / monorepo). Public authors use remote draft preview.\n */\n storefrontPath?: string;\n /** Default local preview port for `--local` (default 3456). */\n devPort?: number;\n}\n\nconst CONFIG_DIR = path.join(os.homedir(), \".config\", \"feeef\");\nconst CONFIG_PATH = path.join(CONFIG_DIR, \"config.json\");\n\nconst DIR_MODE = 0o700;\nconst FILE_MODE = 0o600;\n\nfunction ensureConfigDir(): void {\n fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: DIR_MODE });\n try {\n fs.chmodSync(CONFIG_DIR, DIR_MODE);\n } catch {\n /* best-effort on platforms that ignore mode */\n }\n}\n\nfunction writeConfigFile(data: FeeefCliConfig): void {\n ensureConfigDir();\n const body = `${JSON.stringify(data, null, 2)}\\n`;\n fs.writeFileSync(CONFIG_PATH, body, { encoding: \"utf8\", mode: FILE_MODE });\n try {\n fs.chmodSync(CONFIG_PATH, FILE_MODE);\n } catch {\n /* best-effort */\n }\n}\n\nexport function configDir(): string {\n return CONFIG_DIR;\n}\n\nexport function configPath(): string {\n return CONFIG_PATH;\n}\n\nexport function loadConfig(): FeeefCliConfig {\n try {\n if (!fs.existsSync(CONFIG_PATH)) return {};\n return JSON.parse(fs.readFileSync(CONFIG_PATH, \"utf8\")) as FeeefCliConfig;\n } catch {\n return {};\n }\n}\n\nexport function saveConfig(patch: Partial<FeeefCliConfig>): FeeefCliConfig {\n const next: FeeefCliConfig = { ...loadConfig(), ...patch };\n for (const key of Object.keys(next) as (keyof FeeefCliConfig)[]) {\n const value = next[key];\n if (value === undefined || value === null || value === \"\") {\n delete next[key];\n }\n }\n writeConfigFile(next);\n return next;\n}\n\nexport function clearAuth(): void {\n const cfg = loadConfig();\n delete cfg.token;\n delete cfg.email;\n writeConfigFile(cfg);\n}\n\nexport function defaultApiUrl(cfg: FeeefCliConfig = loadConfig()): string {\n return (\n process.env[\"FEEEF_API_BASE_URL\"] ||\n cfg.apiUrl ||\n \"https://api.feeef.org/v1\"\n ).replace(/\\/$/, \"\");\n}\n\nexport function defaultDevPort(cfg: FeeefCliConfig = loadConfig()): number {\n const fromEnv = Number(process.env[\"FEEEF_DEV_PORT\"]);\n if (Number.isFinite(fromEnv) && fromEnv > 0) return fromEnv;\n if (typeof cfg.devPort === \"number\" && cfg.devPort > 0) return cfg.devPort;\n return 3456;\n}\n","import crypto from \"node:crypto\";\nimport http from \"node:http\";\nimport { exec } from \"node:child_process\";\nimport axios from \"axios\";\nimport { FeeeF, OAuthRepository } from \"feeef\";\nimport { defaultApiUrl, saveConfig } from \"./config.js\";\n\n/** Public OAuth app id for the Feeef CLI (safe to ship). */\nexport const DEFAULT_OAUTH_CLIENT_ID = \"gan5yqm11fk4eh1ayheelkcs\";\n\n/** Exact redirect registered on the OAuth app (http, not https). */\nexport const DEFAULT_OAUTH_REDIRECT_URI =\n \"http://localhost.feeef.org:7777/oauth/callback\";\n\nexport const DEFAULT_OAUTH_CALLBACK_PORT = 7777;\n\n/**\n * Scopes requested by the CLI (no wildcard `*`).\n * Must be allowed on the OAuth app; owners typically grant store + template access.\n */\nexport const DEFAULT_CLI_OAUTH_SCOPES = [\n \"auth\",\n \"store\",\n \"store.settings\",\n \"store_templates\",\n \"store_templates.read\",\n] as const;\n\nexport interface OAuthCliSettings {\n clientId: string;\n /** Optional — only for confidential apps / local overrides. */\n clientSecret?: string;\n redirectUri: string;\n callbackPort: number;\n /** API base for token exchange (…/v1). */\n apiUrl: string;\n /** Origin (or API base) used to build the browser authorize URL. */\n authorizeBaseUrl: string;\n scopes: string[];\n}\n\n/** Strip path/query so authorize URLs never include /api/v1. */\nfunction originOnly(raw: string): string {\n try {\n const u = new URL(raw);\n return `${u.protocol}//${u.host}`;\n } catch {\n return raw.replace(/\\/$/, \"\");\n }\n}\n\n/**\n * Prefer accounts host for the browser authorize step (origin only — no /api/v1).\n * Token exchange still uses the API base.\n */\nexport function resolveAuthorizeBaseUrl(apiUrl: string): string {\n const fromEnv =\n process.env[\"FEEEF_ACCOUNTS_URL\"]?.trim() ||\n process.env[\"FEEEF_OAUTH_AUTHORIZE_BASE_URL\"]?.trim();\n if (fromEnv) return originOnly(fromEnv);\n\n try {\n const u = new URL(apiUrl);\n if (u.hostname === \"api.feeef.org\") {\n return \"https://accounts.feeef.org\";\n }\n if (u.hostname.startsWith(\"api.\")) {\n const host = u.hostname.replace(/^api\\./, \"accounts.\");\n const port = u.port ? `:${u.port}` : \"\";\n return `${u.protocol}//${host}${port}`;\n }\n // Path-style local API (http://127.0.0.1:3333/api/v1) → accounts host.\n // Accounts mounts /oauth/authorize (not /api/v1/oauth/authorize).\n if (\n u.hostname === \"127.0.0.1\" ||\n u.hostname === \"localhost\" ||\n u.hostname === \"localhost.feeef.org\"\n ) {\n const port = u.port ? `:${u.port}` : \"\";\n return `http://accounts.localhost.feeef.org${port}`;\n }\n if (u.hostname.startsWith(\"accounts.\")) {\n return `${u.protocol}//${u.host}`;\n }\n // Unknown host: API origin only; server may 302 to accounts.\n return `${u.protocol}//${u.host}`;\n } catch {\n return apiUrl.replace(/\\/$/, \"\");\n }\n}\n\nexport function resolveOAuthSettings(apiUrlOverride?: string): OAuthCliSettings {\n const clientId =\n process.env[\"FEEEF_OAUTH_CLIENT_ID\"]?.trim() || DEFAULT_OAUTH_CLIENT_ID;\n const clientSecret =\n process.env[\"FEEEF_OAUTH_CLIENT_SECRET\"]?.trim() || undefined;\n const redirectUri =\n process.env[\"FEEEF_OAUTH_REDIRECT_URI\"]?.trim() || DEFAULT_OAUTH_REDIRECT_URI;\n const callbackPort = Number(\n process.env[\"FEEEF_OAUTH_CALLBACK_PORT\"] || DEFAULT_OAUTH_CALLBACK_PORT,\n );\n const apiUrl = (apiUrlOverride || defaultApiUrl()).replace(/\\/$/, \"\");\n const scopesEnv = process.env[\"FEEEF_OAUTH_SCOPES\"]?.trim();\n const scopes = scopesEnv\n ? scopesEnv.split(/[\\s,]+/).filter(Boolean)\n : [...DEFAULT_CLI_OAUTH_SCOPES];\n\n return {\n clientId,\n clientSecret,\n redirectUri,\n callbackPort: Number.isFinite(callbackPort)\n ? callbackPort\n : DEFAULT_OAUTH_CALLBACK_PORT,\n apiUrl,\n authorizeBaseUrl: resolveAuthorizeBaseUrl(apiUrl),\n scopes,\n };\n}\n\n/** PKCE S256 verifier/challenge pair. */\nexport function createPkcePair(): { verifier: string; challenge: string } {\n const verifier = crypto.randomBytes(32).toString(\"base64url\");\n const challenge = crypto\n .createHash(\"sha256\")\n .update(verifier)\n .digest(\"base64url\");\n return { verifier, challenge };\n}\n\nexport function openBrowser(url: string): void {\n const platform = process.platform;\n const cmd =\n platform === \"darwin\"\n ? `open \"${url}\"`\n : platform === \"win32\"\n ? `start \"\" \"${url}\"`\n : `xdg-open \"${url}\"`;\n exec(cmd, () => {\n /* ignore — user can paste the printed URL */\n });\n}\n\nfunction htmlPage(title: string, body: string): string {\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <title>${title}</title>\n <style>\n body { font-family: system-ui, sans-serif; max-width: 32rem; margin: 4rem auto; padding: 0 1rem; }\n h1 { font-size: 1.25rem; }\n p { color: #444; }\n </style>\n</head>\n<body>\n <h1>${title}</h1>\n <p>${body}</p>\n <p>You can close this tab and return to the terminal.</p>\n</body>\n</html>`;\n}\n\n/**\n * One-shot loopback server that resolves with the authorization `code`\n * once `/oauth/callback` is hit with a matching `state`.\n */\nexport function listenForOAuthCallback(opts: {\n port: number;\n expectedState: string;\n onListening?: () => void;\n timeoutMs?: number;\n}): Promise<string> {\n const timeoutMs = opts.timeoutMs ?? 5 * 60 * 1000;\n\n return new Promise<string>((resolve, reject) => {\n let settled = false;\n const settle = (fn: () => void) => {\n if (settled) return;\n settled = true;\n fn();\n };\n\n const server = http.createServer((req, res) => {\n try {\n const url = new URL(req.url || \"/\", `http://127.0.0.1:${opts.port}`);\n if (url.pathname !== \"/oauth/callback\") {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"Not found\");\n return;\n }\n\n const err = url.searchParams.get(\"error\");\n if (err) {\n const desc = url.searchParams.get(\"error_description\") || err;\n res.writeHead(400, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(htmlPage(\"Authorization failed\", desc));\n settle(() => {\n server.close();\n reject(new Error(desc));\n });\n return;\n }\n\n const returnedState = url.searchParams.get(\"state\");\n if (returnedState !== opts.expectedState) {\n res.writeHead(400, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(htmlPage(\"Invalid state\", \"CSRF check failed. Try again.\"));\n settle(() => {\n server.close();\n reject(new Error(\"OAuth state mismatch\"));\n });\n return;\n }\n\n const authCode = url.searchParams.get(\"code\");\n if (!authCode) {\n res.writeHead(400, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(htmlPage(\"Missing code\", \"No authorization code in callback.\"));\n settle(() => {\n server.close();\n reject(new Error(\"Missing authorization code\"));\n });\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(htmlPage(\"Signed in\", \"Feeef CLI authorization complete.\"));\n settle(() => {\n server.close();\n resolve(authCode);\n });\n } catch (e) {\n settle(() => {\n server.close();\n reject(e);\n });\n }\n });\n\n server.on(\"error\", (e) => {\n settle(() => {\n reject(\n e instanceof Error && (e as NodeJS.ErrnoException).code === \"EADDRINUSE\"\n ? new Error(\n `Port ${opts.port} is in use. Free it or set FEEEF_OAUTH_CALLBACK_PORT.`,\n )\n : e,\n );\n });\n });\n\n // Loopback only — do not expose the callback on all interfaces.\n server.listen(opts.port, \"127.0.0.1\", () => {\n opts.onListening?.();\n });\n\n setTimeout(() => {\n settle(() => {\n server.close();\n reject(new Error(\"OAuth timed out waiting for browser callback\"));\n });\n }, timeoutMs).unref();\n });\n}\n\n/**\n * Starts a one-shot loopback server, opens the browser authorize URL,\n * exchanges the code, persists the access token.\n *\n * Callback must be exactly: http://localhost.feeef.org:7777/oauth/callback\n * (DNS for localhost.feeef.org → 127.0.0.1).\n */\nexport async function signinWithOAuth(opts: {\n apiUrl?: string;\n onAuthorizeUrl?: (url: string) => void;\n /** Skip opening the system browser (tests). */\n openBrowser?: boolean;\n}): Promise<{ email?: string }> {\n const settings = resolveOAuthSettings(opts.apiUrl);\n const state = crypto.randomUUID();\n const { verifier, challenge } = createPkcePair();\n\n const authorizeUrl = OAuthRepository.buildAuthorizeUrl({\n baseUrl: settings.authorizeBaseUrl,\n clientId: settings.clientId,\n redirectUri: settings.redirectUri,\n scope: settings.scopes,\n state,\n codeChallenge: challenge,\n codeChallengeMethod: \"S256\",\n });\n\n opts.onAuthorizeUrl?.(authorizeUrl);\n\n const code = await listenForOAuthCallback({\n port: settings.callbackPort,\n expectedState: state,\n onListening: () => {\n if (opts.openBrowser !== false) {\n openBrowser(authorizeUrl);\n }\n },\n });\n\n const httpClient = axios.create({\n baseURL: settings.apiUrl,\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n });\n const ff = new FeeeF({\n apiKey: \"\",\n baseURL: settings.apiUrl,\n client: httpClient as never,\n cache: false,\n });\n\n const tokenResponse = await ff.oauth.exchangeAuthorizationCode({\n code,\n redirectUri: settings.redirectUri,\n clientId: settings.clientId,\n ...(settings.clientSecret ? { clientSecret: settings.clientSecret } : {}),\n codeVerifier: verifier,\n });\n\n const accessToken = tokenResponse.access_token;\n if (!accessToken) {\n throw new Error(\"Token exchange returned no access_token\");\n }\n\n saveConfig({\n token: accessToken,\n apiUrl: settings.apiUrl,\n });\n\n ff.setHeader(\"Authorization\", `Bearer ${accessToken}`);\n try {\n const me = await ff.users.me();\n const payload = me as { user?: { email?: string }; email?: string };\n const email = payload.user?.email || payload.email;\n if (email) {\n saveConfig({ email });\n return { email };\n }\n return {};\n } catch {\n return {};\n }\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\n\nexport { p, pc };\n\nexport function banner(): void {\n console.log();\n console.log(pc.cyan(\" feeef\") + pc.dim(\" developer cli\"));\n console.log();\n}\n\nexport function intro(title: string): void {\n p.intro(pc.bgCyan(pc.black(` ${title} `)));\n}\n\nexport function outro(message: string): void {\n p.outro(pc.green(message));\n}\n\nexport function note(message: string, title?: string): void {\n p.note(message, title);\n}\n\nexport function cancel(message = \"Cancelled.\"): never {\n p.cancel(message);\n process.exit(0);\n}\n\nexport async function text(\n opts: Parameters<typeof p.text>[0],\n): Promise<string> {\n const value = await p.text(opts);\n if (p.isCancel(value)) cancel();\n return String(value);\n}\n\nexport async function password(\n opts: Parameters<typeof p.password>[0],\n): Promise<string> {\n const value = await p.password(opts);\n if (p.isCancel(value)) cancel();\n return String(value);\n}\n\nexport async function confirm(\n opts: Parameters<typeof p.confirm>[0],\n): Promise<boolean> {\n const value = await p.confirm(opts);\n if (p.isCancel(value)) cancel();\n return Boolean(value);\n}\n\nexport async function select<T extends string>(\n opts: Parameters<typeof p.select>[0] & {\n options: { value: T; label: string; hint?: string }[];\n },\n): Promise<T> {\n const value = await p.select(opts);\n if (p.isCancel(value)) cancel();\n return value as T;\n}\n\nexport function fail(err: unknown): never {\n const anyErr = err as {\n response?: { data?: unknown };\n message?: string;\n };\n let message: string;\n if (anyErr?.response?.data != null) {\n message =\n typeof anyErr.response.data === \"string\"\n ? anyErr.response.data\n : JSON.stringify(anyErr.response.data).slice(0, 1500);\n } else if (err instanceof Error) {\n message = err.message;\n } else {\n message = String(err);\n }\n p.log.error(pc.red(message));\n process.exit(1);\n}\n\nexport function ok(message: string): void {\n p.log.success(message);\n}\n\nexport function info(message: string): void {\n p.log.info(message);\n}\n\nexport function warn(message: string): void {\n p.log.warn(message);\n}\n\nexport function spinner() {\n return p.spinner();\n}\n","import { createClient, signinWithPassword } from \"../client.js\";\nimport {\n clearAuth,\n configPath,\n defaultApiUrl,\n loadConfig,\n saveConfig,\n type FeeefCliConfig,\n} from \"../config.js\";\nimport { signinWithOAuth } from \"../oauth.js\";\nimport {\n fail,\n info,\n intro,\n note,\n ok,\n outro,\n password,\n spinner,\n text,\n} from \"../ui.js\";\n\nexport async function runSignin(opts: {\n email?: string;\n password?: string;\n apiUrl?: string;\n /** Force email/password instead of browser OAuth. */\n passwordAuth?: boolean;\n}): Promise<void> {\n intro(\"feeef signin\");\n try {\n // Password path only via --password-auth or --email (never -p on argv).\n const usePassword = Boolean(opts.passwordAuth) || Boolean(opts.email);\n\n if (!usePassword) {\n const s = spinner();\n s.start(\"Waiting for browser authorization…\");\n const result = await signinWithOAuth({\n ...(opts.apiUrl ? { apiUrl: opts.apiUrl } : {}),\n onAuthorizeUrl: (url) => {\n s.stop(\"Open this URL if the browser did not launch:\");\n note(url, \"Authorize\");\n s.start(\"Waiting for callback on localhost.feeef.org:7777…\");\n },\n });\n s.stop(\n result.email\n ? `Signed in as ${result.email}`\n : \"Signed in (token saved)\",\n );\n info(`Config: ${configPath()}`);\n outro(\"Ready. Try: feeef whoami\");\n return;\n }\n\n const email =\n opts.email ||\n (await text({\n message: \"Email\",\n placeholder: \"you@example.com\",\n validate: (v) => (!v?.includes(\"@\") ? \"Enter a valid email\" : undefined),\n }));\n const pass =\n opts.password ||\n (await password({\n message: \"Password\",\n validate: (v) => (!v || v.length < 8 ? \"Min 8 characters\" : undefined),\n }));\n\n const s = spinner();\n s.start(\"Signing in…\");\n const auth = await signinWithPassword({\n email,\n password: pass,\n ...(opts.apiUrl ? { apiUrl: opts.apiUrl } : {}),\n });\n s.stop(`Signed in as ${auth.user?.email || email}`);\n info(`Config: ${configPath()}`);\n outro(\"Ready. Try: feeef whoami\");\n } catch (e) {\n fail(e);\n }\n}\n\nexport async function runWhoami(): Promise<void> {\n intro(\"feeef whoami\");\n try {\n const { ff, cfg } = createClient();\n const me = await ff.users.me();\n const payload = me as {\n user?: { email?: string; id?: string };\n email?: string;\n id?: string;\n };\n const user = payload.user ?? payload;\n ok(String(user.email || user.id || JSON.stringify(me)));\n info(`API ${defaultApiUrl(cfg)}`);\n outro(\"Authenticated\");\n } catch (e) {\n fail(e);\n }\n}\n\nexport function runSignout(): void {\n intro(\"feeef signout\");\n clearAuth();\n ok(`Cleared token (${configPath()})`);\n outro(\"Signed out\");\n}\n\nexport function runConfigShow(): void {\n intro(\"feeef config\");\n const cfg = loadConfig();\n console.log(\n JSON.stringify(\n {\n path: configPath(),\n email: cfg.email,\n apiUrl: defaultApiUrl(cfg),\n defaultStoreId: cfg.defaultStoreId,\n lastPublishedTemplateId: cfg.lastPublishedTemplateId,\n storefrontPath: cfg.storefrontPath,\n devPort: cfg.devPort,\n hasToken: Boolean(cfg.token),\n },\n null,\n 2,\n ),\n );\n outro(\"Done\");\n}\n\nconst CONFIG_KEYS = [\n \"apiUrl\",\n \"defaultStoreId\",\n \"storefrontPath\",\n \"devPort\",\n \"lastPublishedTemplateId\",\n] as const;\n\ntype ConfigSetKey = (typeof CONFIG_KEYS)[number];\n\nexport function runConfigSet(key: string, value: string): void {\n intro(\"feeef config set\");\n if (!(CONFIG_KEYS as readonly string[]).includes(key)) {\n fail(`Unknown key \"${key}\". Allowed: ${CONFIG_KEYS.join(\", \")}`);\n }\n\n const typedKey = key as ConfigSetKey;\n if (typedKey === \"devPort\") {\n const n = Number(value);\n if (!Number.isFinite(n) || n <= 0) {\n fail(\"devPort must be a positive number\");\n }\n saveConfig({ devPort: n });\n } else {\n const patch: Partial<FeeefCliConfig> = { [typedKey]: value };\n saveConfig(patch);\n }\n\n ok(`Set ${typedKey}`);\n outro(configPath());\n}\n","import path from \"node:path\";\nimport { resolveThemeDir } from \"../../project.js\";\nimport {\n addComponent,\n addPage,\n} from \"../../theme-scaffold.js\";\nimport { fail, intro, ok, outro } from \"../../ui.js\";\n\nexport async function runTemplateAddPage(\n pageId: string | undefined,\n opts: { dir?: string } = {},\n): Promise<void> {\n intro(\"feeef template add page\");\n try {\n if (!pageId?.trim()) {\n fail(\"Usage: feeef template add page <pageId>\");\n }\n const themeRoot = resolveThemeDir(opts.dir);\n const { pageId: id } = addPage(themeRoot, pageId!);\n ok(`Created pages/${id}/ (flat components/)`);\n outro(`Next: feeef template add component ${id} <name>`);\n } catch (err) {\n fail(err instanceof Error ? err.message : String(err));\n }\n}\n\nexport async function runTemplateAddComponent(\n pageId: string | undefined,\n componentId: string | undefined,\n opts: { dir?: string; title?: string; section?: string } = {},\n): Promise<void> {\n intro(\"feeef template add component\");\n try {\n if (!pageId?.trim() || !componentId?.trim()) {\n fail(\"Usage: feeef template add component <pageId> <componentId>\");\n }\n const themeRoot = resolveThemeDir(opts.dir);\n const result = addComponent(themeRoot, pageId!, componentId!, {\n ...(opts.title ? { title: opts.title } : {}),\n ...(opts.section ? { section: opts.section } : {}),\n });\n const rel = path.relative(themeRoot, result.filePath);\n ok(`Created ${rel}`);\n if (result.kind === \"legacy\") {\n outro(\"Added under legacy sections/main (page already uses sections)\");\n } else {\n outro(\"Edit the file, then npm run build / npm run dev\");\n }\n } catch (err) {\n fail(err instanceof Error ? err.message : String(err));\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { FeeefCliConfig } from \"./config.js\";\n\nexport const FEEF_RC = \".feeefrc\";\nexport const TEMPLATE_META = \"feeef.template.json\";\n\nexport interface FeeefProjectRc {\n store?: string;\n slug?: string;\n templateId?: string;\n apiUrl?: string;\n title?: string;\n}\n\nexport interface TemplateMeta {\n name?: string;\n version?: string;\n defaultLocale?: string;\n store?: string;\n storeId?: string;\n pages?: string[];\n [key: string]: unknown;\n}\n\nexport function findThemeRoot(startDir = process.cwd()): string | null {\n let dir = path.resolve(startDir);\n for (;;) {\n if (fs.existsSync(path.join(dir, TEMPLATE_META))) return dir;\n const parent = path.dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nexport function loadProjectRc(themeRoot: string): FeeefProjectRc {\n const rcPath = path.join(themeRoot, FEEF_RC);\n try {\n if (!fs.existsSync(rcPath)) return {};\n return JSON.parse(fs.readFileSync(rcPath, \"utf8\")) as FeeefProjectRc;\n } catch {\n return {};\n }\n}\n\nexport function saveProjectRc(\n themeRoot: string,\n patch: Partial<FeeefProjectRc>,\n): { rcPath: string; rc: FeeefProjectRc } {\n const rcPath = path.join(themeRoot, FEEF_RC);\n const next: FeeefProjectRc = { ...loadProjectRc(themeRoot), ...patch };\n for (const key of Object.keys(next) as (keyof FeeefProjectRc)[]) {\n const value = next[key];\n if (value === undefined || value === null || value === \"\") {\n delete next[key];\n }\n }\n fs.writeFileSync(rcPath, `${JSON.stringify(next, null, 2)}\\n`, \"utf8\");\n return { rcPath, rc: next };\n}\n\nexport function loadTemplateMeta(themeRoot: string): TemplateMeta {\n const metaPath = path.join(themeRoot, TEMPLATE_META);\n if (!fs.existsSync(metaPath)) return {};\n try {\n return JSON.parse(fs.readFileSync(metaPath, \"utf8\")) as TemplateMeta;\n } catch {\n return {};\n }\n}\n\nexport function resolveStoreIdFromProject(input: {\n storeFlag?: string;\n themeRoot: string;\n globalCfg: FeeefCliConfig;\n}): string | null {\n const rc = loadProjectRc(input.themeRoot);\n const meta = loadTemplateMeta(input.themeRoot);\n return (\n input.storeFlag ||\n rc.store ||\n meta.store ||\n meta.storeId ||\n input.globalCfg.defaultStoreId ||\n null\n );\n}\n\nexport function resolveThemeDir(dirArg?: string): string {\n if (dirArg) {\n const abs = path.resolve(dirArg);\n if (!fs.existsSync(abs)) {\n throw new Error(`Theme directory not found: ${abs}`);\n }\n return findThemeRoot(abs) || abs;\n }\n const fromCwd = findThemeRoot(process.cwd());\n if (fromCwd) return fromCwd;\n throw new Error(\n \"No theme found. Run inside a theme folder (feeef.template.json) or: feeef template init\",\n );\n}\n\nexport function projectRcPath(themeRoot: string): string {\n return path.join(themeRoot, FEEF_RC);\n}\n","/**\n * Scaffold helpers for `feeef template add|remove page|component`.\n *\n * New pages use flat `pages/<id>/components/`. Components are leaf `.tsx`\n * files with `export const meta` + `function App()`. Legacy `sections/` pages\n * still accept new components under `sections/main/components/`.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { TEMPLATE_META, type TemplateMeta } from \"./project.js\";\n\nconst PAGE_ID_RE = /^[a-z][a-z0-9_]*$/;\nconst COMPONENT_ID_RE = /^[a-z][a-z0-9_-]*$/;\n\nexport function assertPageId(id: string): string {\n const trimmed = id.trim();\n if (!PAGE_ID_RE.test(trimmed)) {\n throw new Error(\n `Invalid page id \"${id}\" — use lowercase letters, digits, underscore (e.g. home, thank_you)`,\n );\n }\n return trimmed;\n}\n\nexport function assertComponentId(id: string): string {\n const trimmed = id.trim();\n if (!COMPONENT_ID_RE.test(trimmed)) {\n throw new Error(\n `Invalid component id \"${id}\" — use lowercase letters, digits, hyphen/underscore (e.g. hero, product-grid)`,\n );\n }\n return trimmed;\n}\n\nfunction titleCaseFromId(id: string): string {\n return id\n .split(/[-_]/)\n .filter(Boolean)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(\" \");\n}\n\nfunction readMeta(themeRoot: string): TemplateMeta {\n const metaPath = path.join(themeRoot, TEMPLATE_META);\n if (!fs.existsSync(metaPath)) {\n throw new Error(`Missing ${TEMPLATE_META} in ${themeRoot}`);\n }\n return JSON.parse(fs.readFileSync(metaPath, \"utf8\")) as TemplateMeta;\n}\n\nfunction writeMeta(themeRoot: string, meta: TemplateMeta): void {\n const metaPath = path.join(themeRoot, TEMPLATE_META);\n fs.writeFileSync(metaPath, `${JSON.stringify(meta, null, 2)}\\n`, \"utf8\");\n}\n\n/**\n * Whether this page already uses legacy `sections/` with real components\n * and has no flat `components/` directory (flat wins when the folder exists).\n */\nexport function pageUsesLegacySections(themeRoot: string, pageId: string): boolean {\n const flatDir = path.join(themeRoot, \"pages\", pageId, \"components\");\n if (fs.existsSync(flatDir)) return false;\n\n const sectionsDir = path.join(themeRoot, \"pages\", pageId, \"sections\");\n if (!fs.existsSync(sectionsDir)) return false;\n for (const section of fs.readdirSync(sectionsDir, { withFileTypes: true })) {\n if (!section.isDirectory() || section.name.startsWith(\".\")) continue;\n const comps = path.join(sectionsDir, section.name, \"components\");\n if (!fs.existsSync(comps)) continue;\n const entries = fs.readdirSync(comps).filter((n) => !n.startsWith(\".\"));\n if (entries.length > 0) return true;\n }\n return false;\n}\n\nexport function resolveComponentParentDir(\n themeRoot: string,\n pageId: string,\n section?: string,\n): { parentDir: string; kind: \"flat\" | \"legacy\" } {\n if (section) {\n const parentDir = path.join(\n themeRoot,\n \"pages\",\n pageId,\n \"sections\",\n section,\n \"components\",\n );\n return { parentDir, kind: \"legacy\" };\n }\n if (pageUsesLegacySections(themeRoot, pageId)) {\n return {\n parentDir: path.join(\n themeRoot,\n \"pages\",\n pageId,\n \"sections\",\n \"main\",\n \"components\",\n ),\n kind: \"legacy\",\n };\n }\n return {\n parentDir: path.join(themeRoot, \"pages\", pageId, \"components\"),\n kind: \"flat\",\n };\n}\n\n/** Starter custom component source (type-safe props + App). */\nexport function formatStarterComponent(opts: {\n title: string;\n order?: number;\n}): string {\n const order = typeof opts.order === \"number\" ? opts.order : 0;\n const titleJson = JSON.stringify(opts.title);\n return `const propsSchema = {\n heading: { type: \"string\", name: \"Heading\" },\n} as const;\n\nexport const meta = {\n type: \"custom\",\n title: ${titleJson},\n order: ${order},\n propsSchema,\n props: {\n heading: \"\",\n },\n} as const satisfies FeeefComponentMeta<typeof propsSchema>;\n\ntype Props = FeeefLivePropsOf<typeof propsSchema>;\n\nfunction App() {\n const p = props as Props;\n return (\n <section style={{ padding: \"2rem 1.5rem\" }}>\n <h2>{p.heading || ${titleJson}}</h2>\n </section>\n );\n}\n`;\n}\n\nexport function nextComponentOrder(parentDir: string): number {\n if (!fs.existsSync(parentDir)) return 0;\n let max = -1;\n for (const name of fs.readdirSync(parentDir)) {\n if (name.startsWith(\".\")) continue;\n const abs = path.join(parentDir, name);\n let sourcePath: string | null = null;\n if (fs.statSync(abs).isFile() && /\\.(tsx|jsx)$/.test(name)) {\n sourcePath = abs;\n } else if (fs.statSync(abs).isDirectory()) {\n for (const entry of [\"component.tsx\", \"component.jsx\"]) {\n const p = path.join(abs, entry);\n if (fs.existsSync(p)) {\n sourcePath = p;\n break;\n }\n }\n }\n if (!sourcePath) continue;\n const src = fs.readFileSync(sourcePath, \"utf8\");\n const m = /\\border\\s*:\\s*(\\d+)/.exec(src);\n if (m) max = Math.max(max, Number(m[1]));\n }\n return max + 1;\n}\n\nexport function addPage(\n themeRoot: string,\n pageIdRaw: string,\n): { pageDir: string; pageId: string } {\n const pageId = assertPageId(pageIdRaw);\n const pageDir = path.join(themeRoot, \"pages\", pageId);\n if (fs.existsSync(pageDir)) {\n throw new Error(`Page already exists: pages/${pageId}/`);\n }\n\n fs.mkdirSync(path.join(pageDir, \"components\"), { recursive: true });\n fs.writeFileSync(\n path.join(pageDir, \"page.json\"),\n `${JSON.stringify({ props: {} }, null, 2)}\\n`,\n \"utf8\",\n );\n\n const meta = readMeta(themeRoot);\n const pages = Array.isArray(meta.pages) ? [...meta.pages] : [];\n if (!pages.includes(pageId)) pages.push(pageId);\n meta.pages = pages;\n writeMeta(themeRoot, meta);\n\n return { pageDir, pageId };\n}\n\nexport function removePage(\n themeRoot: string,\n pageIdRaw: string,\n): { pageId: string; removedPath: string } {\n const pageId = assertPageId(pageIdRaw);\n const pageDir = path.join(themeRoot, \"pages\", pageId);\n if (!fs.existsSync(pageDir)) {\n throw new Error(`Page not found: pages/${pageId}/`);\n }\n\n fs.rmSync(pageDir, { recursive: true, force: true });\n\n const meta = readMeta(themeRoot);\n if (Array.isArray(meta.pages)) {\n meta.pages = meta.pages.filter((id) => id !== pageId);\n writeMeta(themeRoot, meta);\n }\n\n return { pageId, removedPath: pageDir };\n}\n\nexport function addComponent(\n themeRoot: string,\n pageIdRaw: string,\n componentIdRaw: string,\n opts: { title?: string; section?: string } = {},\n): { filePath: string; pageId: string; componentId: string; kind: \"flat\" | \"legacy\" } {\n const pageId = assertPageId(pageIdRaw);\n const componentId = assertComponentId(componentIdRaw);\n const pageDir = path.join(themeRoot, \"pages\", pageId);\n if (!fs.existsSync(pageDir)) {\n throw new Error(\n `Page not found: pages/${pageId}/ — run: feeef template add page ${pageId}`,\n );\n }\n\n const { parentDir, kind } = resolveComponentParentDir(\n themeRoot,\n pageId,\n opts.section,\n );\n fs.mkdirSync(parentDir, { recursive: true });\n\n const filePath = path.join(parentDir, `${componentId}.tsx`);\n const folderPath = path.join(parentDir, componentId);\n if (fs.existsSync(filePath) || fs.existsSync(folderPath)) {\n throw new Error(\n `Component already exists under ${path.relative(themeRoot, parentDir)}/${componentId}`,\n );\n }\n\n const order = nextComponentOrder(parentDir);\n const title = opts.title?.trim() || titleCaseFromId(componentId);\n fs.writeFileSync(filePath, formatStarterComponent({ title, order }), \"utf8\");\n\n return { filePath, pageId, componentId, kind };\n}\n\n/**\n * Resolve a component entry path under a page (flat file, folder, or legacy section).\n */\nexport function findComponentEntry(\n themeRoot: string,\n pageId: string,\n componentId: string,\n section?: string,\n): string | null {\n const candidates: string[] = [];\n if (section) {\n const base = path.join(\n themeRoot,\n \"pages\",\n pageId,\n \"sections\",\n section,\n \"components\",\n );\n candidates.push(\n path.join(base, `${componentId}.tsx`),\n path.join(base, `${componentId}.jsx`),\n path.join(base, `${componentId}.json`),\n path.join(base, componentId),\n );\n } else {\n const flat = path.join(themeRoot, \"pages\", pageId, \"components\");\n candidates.push(\n path.join(flat, `${componentId}.tsx`),\n path.join(flat, `${componentId}.jsx`),\n path.join(flat, `${componentId}.json`),\n path.join(flat, componentId),\n );\n const sectionsRoot = path.join(themeRoot, \"pages\", pageId, \"sections\");\n if (fs.existsSync(sectionsRoot)) {\n for (const sec of fs.readdirSync(sectionsRoot, { withFileTypes: true })) {\n if (!sec.isDirectory() || sec.name.startsWith(\".\")) continue;\n const base = path.join(sectionsRoot, sec.name, \"components\");\n candidates.push(\n path.join(base, `${componentId}.tsx`),\n path.join(base, `${componentId}.jsx`),\n path.join(base, `${componentId}.json`),\n path.join(base, componentId),\n );\n }\n }\n }\n for (const c of candidates) {\n if (fs.existsSync(c)) return c;\n }\n return null;\n}\n\nexport function removeComponent(\n themeRoot: string,\n pageIdRaw: string,\n componentIdRaw: string,\n opts: { section?: string } = {},\n): { pageId: string; componentId: string; removedPath: string } {\n const pageId = assertPageId(pageIdRaw);\n const componentId = assertComponentId(componentIdRaw);\n const entry = findComponentEntry(\n themeRoot,\n pageId,\n componentId,\n opts.section,\n );\n if (!entry) {\n throw new Error(\n `Component not found: ${pageId}/${componentId}` +\n (opts.section ? ` (section ${opts.section})` : \"\"),\n );\n }\n fs.rmSync(entry, { recursive: true, force: true });\n return { pageId, componentId, removedPath: entry };\n}\n","import path from \"node:path\";\nimport { loadBuild } from \"../../kit.js\";\nimport { resolveThemeDir } from \"../../project.js\";\nimport { fail, info, intro, ok, outro, spinner, warn } from \"../../ui.js\";\n\nexport async function runTemplateBuild(\n dirArg: string | undefined,\n opts: { checkOnly?: boolean } = {},\n): Promise<void> {\n const label = opts.checkOnly ? \"feeef template check\" : \"feeef template build\";\n intro(label);\n try {\n const srcDir = resolveThemeDir(dirArg);\n const outPath = path.join(srcDir, \"dist\", \"data.json\");\n const s = spinner();\n s.start(opts.checkOnly ? \"Checking theme…\" : \"Building theme…\");\n\n const { buildTemplate } = await loadBuild();\n const result = buildTemplate({\n srcDir,\n outPath,\n write: !opts.checkOnly,\n });\n\n for (const w of result.warnings || []) {\n warn(`[${w.path}] ${w.message}`);\n }\n\n s.stop(\n opts.checkOnly\n ? `OK — ${result.pageCount ?? \"?\"} pages / ${result.componentCount ?? \"?\"} components`\n : `Built → ${result.outPath}`,\n );\n\n if (!opts.checkOnly) {\n if (result.localeCount) info(`${result.localeCount} locales`);\n if (result.libraryCount) info(`${result.libraryCount} library entries`);\n }\n\n ok(opts.checkOnly ? \"Check passed\" : \"Build complete\");\n outro(opts.checkOnly ? \"Ready to publish\" : path.relative(process.cwd(), outPath) || outPath);\n } catch (e) {\n fail(e);\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n/** Package root whether running from dist/ or src/. */\nexport function cliRoot(): string {\n // dist/bin.js → ../ ; src during tests → ../\n const candidate = path.resolve(__dirname, \"..\");\n if (fs.existsSync(path.join(candidate, \"package.json\"))) return candidate;\n return path.resolve(__dirname, \"../..\");\n}\n\nexport function templateKitRoot(): string {\n return path.join(cliRoot(), \"vendor\", \"template-kit\");\n}\n\nexport function scaffoldsRoot(): string {\n return path.join(cliRoot(), \"scaffolds\");\n}\n\nexport interface BuildTemplateResult {\n outPath: string;\n warnings?: { path: string; message: string }[];\n pageCount?: number;\n componentCount?: number;\n localeCount?: number;\n libraryCount?: number;\n sharedCount?: number;\n sharedPlacementCount?: number;\n libraryOutPath?: string;\n}\n\nexport interface BuildModule {\n buildTemplate: (opts: {\n srcDir: string;\n outPath: string;\n write?: boolean;\n }) => BuildTemplateResult;\n}\n\nexport async function loadBuild(): Promise<BuildModule> {\n const buildPath = path.join(templateKitRoot(), \"lib\", \"build.mjs\");\n if (!fs.existsSync(buildPath)) {\n throw new Error(`template-kit missing at ${buildPath}`);\n }\n return import(pathToFileURL(buildPath).href) as Promise<BuildModule>;\n}\n\nexport interface UnpackModule {\n unpackTemplate: (opts: {\n inputPath: string;\n outDir: string;\n force?: boolean;\n }) => { files: number; pages: number; components: number };\n}\n\nexport async function loadUnpack(): Promise<UnpackModule> {\n const unpackPath = path.join(templateKitRoot(), \"lib\", \"unpack.mjs\");\n if (!fs.existsSync(unpackPath)) {\n throw new Error(`template-kit missing at ${unpackPath}`);\n }\n return import(pathToFileURL(unpackPath).href) as Promise<UnpackModule>;\n}\n\nexport function kitBin(): string {\n return path.join(templateKitRoot(), \"bin\", \"feeef-template.mjs\");\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createClient } from \"../../client.js\";\nimport { defaultDevPort, loadConfig } from \"../../config.js\";\nimport { kitBin, loadBuild } from \"../../kit.js\";\nimport {\n loadProjectRc,\n resolveStoreIdFromProject,\n resolveThemeDir,\n} from \"../../project.js\";\nimport { assertStorefrontPath } from \"../../storefront.js\";\nimport { openBrowser } from \"../../oauth.js\";\nimport {\n fail,\n info,\n intro,\n note,\n ok,\n outro,\n pc,\n spinner,\n} from \"../../ui.js\";\n\nfunction killChildren(children: ChildProcess[]): void {\n for (const c of children) {\n try {\n c.kill(\"SIGTERM\");\n } catch {\n /* ignore */\n }\n }\n}\n\nfunction debounce<T extends (...args: never[]) => void>(\n fn: T,\n ms: number,\n): T & { cancel: () => void } {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const wrapped = ((...args: never[]) => {\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => fn(...args), ms);\n }) as T & { cancel: () => void };\n wrapped.cancel = () => {\n if (timer) clearTimeout(timer);\n };\n return wrapped;\n}\n\nasync function resolveBoundStore(srcDir: string): Promise<{\n storeId: string;\n slug: string;\n}> {\n const cfg = loadConfig();\n if (!cfg.token) {\n throw new Error(\n \"Not signed in. Run: feeef signin\\nThen bind a store: feeef use <slug>\",\n );\n }\n const storeRef = resolveStoreIdFromProject({\n themeRoot: srcDir,\n globalCfg: cfg,\n });\n if (!storeRef) {\n throw new Error(\n \"No store linked. Run: feeef use <slug>\\n(Remote preview pushes a draft to your store — live theme stays unchanged.)\",\n );\n }\n\n const { ff } = createClient({ requireAuth: true });\n let store;\n try {\n store = await ff.stores.find({ id: storeRef });\n } catch {\n store = await ff.stores.find({ id: storeRef, by: \"slug\" });\n }\n return { storeId: store.id, slug: store.slug };\n}\n\n/**\n * Default: watch → build → PUT draft template-preview → open hosted ?preview= URL.\n * Never writes live `metadata.templateData`.\n */\nasync function runRemoteDraftPreview(srcDir: string): Promise<void> {\n const outPath = path.join(srcDir, \"dist\", \"data.json\");\n const { storeId, slug } = await resolveBoundStore(srcDir);\n const { ff } = createClient({ requireAuth: true });\n\n const s = spinner();\n s.start(\"Building theme…\");\n const { buildTemplate } = await loadBuild();\n buildTemplate({ srcDir, outPath, write: true });\n s.stop(\"dist ready\");\n\n let lastPreviewUrl: string | undefined;\n let pushInFlight = false;\n let pushQueued = false;\n\n const pushDraft = async () => {\n if (pushInFlight) {\n pushQueued = true;\n return;\n }\n pushInFlight = true;\n try {\n if (!fs.existsSync(outPath)) {\n info(\"Waiting for dist/data.json…\");\n return;\n }\n const data = JSON.parse(fs.readFileSync(outPath, \"utf8\")) as unknown;\n const result = await ff.stores.putTemplatePreview(storeId, { data });\n lastPreviewUrl = result.previewUrl;\n ok(`Draft preview updated → ${pc.cyan(result.previewUrl)}`);\n } catch (e) {\n fail(e);\n } finally {\n pushInFlight = false;\n if (pushQueued) {\n pushQueued = false;\n await pushDraft();\n }\n }\n };\n\n const debouncedPush = debounce(() => {\n void pushDraft();\n }, 400);\n\n await pushDraft();\n if (lastPreviewUrl) {\n openBrowser(lastPreviewUrl);\n }\n\n note(\n [\n `Theme ${srcDir}`,\n `Store ${slug} (${storeId})`,\n `Preview ${lastPreviewUrl ?? \"(pending)\"}`,\n \"\",\n \"Live customers still see metadata.templateData.\",\n \"Exit preview in the browser: banner → Exit, or /?preview=0\",\n \"Stopping the CLI clears the draft.\",\n ].join(\"\\n\"),\n \"Remote draft preview\",\n );\n\n const watch = spawn(\n process.execPath,\n [kitBin(), \"watch\", srcDir, \"-o\", outPath],\n { cwd: srcDir, env: process.env, stdio: \"inherit\" },\n );\n\n // Re-push when dist changes (kit watch rewrites data.json).\n let watching = true;\n const onDistChange = () => {\n if (!watching) return;\n debouncedPush();\n };\n try {\n fs.watch(path.dirname(outPath), { persistent: true }, (_event, filename) => {\n if (!filename || filename === \"data.json\" || String(filename).endsWith(\"data.json\")) {\n onDistChange();\n }\n });\n } catch {\n // Fallback: periodic push if watch unsupported\n setInterval(() => onDistChange(), 2000).unref();\n }\n\n const shutdown = async (code = 0) => {\n watching = false;\n debouncedPush.cancel();\n killChildren([watch]);\n try {\n await ff.stores.clearTemplatePreview(storeId);\n info(\"Cleared draft preview on server\");\n } catch {\n /* leave until TTL */\n }\n process.exit(code);\n };\n\n process.on(\"SIGINT\", () => {\n void shutdown(0);\n });\n process.on(\"SIGTERM\", () => {\n void shutdown(0);\n });\n\n watch.on(\"exit\", (code) => {\n if (code && code !== 0) void shutdown(code);\n });\n\n ok(`Open ${pc.cyan(lastPreviewUrl ?? `https://${slug}.feeef.org`)}`);\n outro(\"Watching — Ctrl+C to stop (clears draft)\");\n\n await new Promise(() => {});\n}\n\n/**\n * Employee escape hatch: spawn local Next with FEEEF_TEMPLATE_DATA_PATH.\n */\nasync function runLocalStorefrontPreview(\n srcDir: string,\n opts: { port?: string; storefront?: string },\n): Promise<void> {\n const outPath = path.join(srcDir, \"dist\", \"data.json\");\n const libraryPath = path.join(srcDir, \"dist\", \"schema.library.json\");\n const port = Number(opts.port) || defaultDevPort();\n\n if (opts.storefront) {\n process.env[\"FEEEF_STOREFRONT_PATH\"] = path.resolve(opts.storefront);\n }\n const storefrontRoot = assertStorefrontPath();\n\n const cfg = loadConfig();\n const storeRef = resolveStoreIdFromProject({\n themeRoot: srcDir,\n globalCfg: cfg,\n });\n const rc = loadProjectRc(srcDir);\n\n let slug = rc.slug;\n if (!slug && storeRef) {\n try {\n const { ff } = createClient({ requireAuth: Boolean(cfg.token) });\n if (cfg.token) {\n try {\n const store = await ff.stores.find({ id: storeRef });\n slug = store.slug;\n } catch {\n try {\n const store = await ff.stores.find({ id: storeRef, by: \"slug\" });\n slug = store.slug;\n } catch {\n /* keep undefined */\n }\n }\n }\n } catch {\n /* offline / not signed in — still run next */\n }\n }\n\n const s = spinner();\n s.start(\"Building theme…\");\n const { buildTemplate } = await loadBuild();\n buildTemplate({ srcDir, outPath, write: true });\n s.stop(\"dist ready\");\n\n const previewHost = slug\n ? `http://${slug}.localhost.feeef.org:${port}`\n : `http://localhost:${port}`;\n\n note(\n [\n `Theme ${srcDir}`,\n `Storefront ${storefrontRoot}`,\n `Preview ${previewHost}`,\n \"Internal --local mode (not for public docs).\",\n ].join(\"\\n\"),\n \"Local Next preview\",\n );\n\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n FEEEF_TEMPLATE_DATA_PATH: outPath,\n FEEEF_TEMPLATE_LIBRARY_PATH: libraryPath,\n PORT: String(port),\n };\n if (slug) {\n env[\"NEXT_PUBLIC_DEV_STORE_SLUG\"] = slug;\n }\n\n const watch = spawn(\n process.execPath,\n [kitBin(), \"watch\", srcDir, \"-o\", outPath],\n { cwd: srcDir, env, stdio: \"inherit\" },\n );\n\n const next = spawn(\n \"npx\",\n [\"next\", \"dev\", \"--turbopack\", \"-H\", \"0.0.0.0\", \"-p\", String(port)],\n { cwd: storefrontRoot, env, stdio: \"inherit\", shell: true },\n );\n\n const children = [watch, next];\n const shutdown = (code = 0) => {\n killChildren(children);\n process.exit(code);\n };\n\n process.on(\"SIGINT\", () => shutdown(0));\n process.on(\"SIGTERM\", () => shutdown(0));\n\n next.on(\"exit\", (code) => shutdown(code ?? 0));\n watch.on(\"exit\", (code) => {\n if (code && code !== 0) shutdown(code);\n });\n\n ok(`Open ${pc.cyan(previewHost)}`);\n outro(\"Watching — Ctrl+C to stop\");\n\n await new Promise(() => {});\n}\n\nexport async function runTemplateDev(\n dirArg: string | undefined,\n opts: { port?: string; storefront?: string; local?: boolean },\n): Promise<void> {\n intro(\"feeef template dev\");\n try {\n const srcDir = resolveThemeDir(dirArg);\n if (opts.local || opts.storefront) {\n await runLocalStorefrontPreview(srcDir, opts);\n return;\n }\n await runRemoteDraftPreview(srcDir);\n } catch (e) {\n fail(e);\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { loadConfig } from \"./config.js\";\nimport { cliRoot } from \"./kit.js\";\n\n/**\n * Resolve Lithium storefront root for `feeef template dev`.\n * Order: env → global config → monorepo sibling of cli/\n */\nexport function resolveStorefrontPath(): string | null {\n const fromEnv = process.env[\"FEEEF_STOREFRONT_PATH\"]?.trim();\n if (fromEnv && fs.existsSync(path.join(fromEnv, \"package.json\"))) {\n return path.resolve(fromEnv);\n }\n\n const cfg = loadConfig();\n if (\n cfg.storefrontPath &&\n fs.existsSync(path.join(cfg.storefrontPath, \"package.json\"))\n ) {\n return path.resolve(cfg.storefrontPath);\n }\n\n const sibling = path.resolve(cliRoot(), \"../storefront\");\n if (fs.existsSync(path.join(sibling, \"package.json\"))) {\n return sibling;\n }\n\n return null;\n}\n\nexport function assertStorefrontPath(): string {\n const root = resolveStorefrontPath();\n if (!root) {\n throw new Error(\n [\n \"Lithium storefront not found.\",\n \"Set it once (theme repos do not need storefront source inside them):\",\n \" feeef config set storefrontPath /path/to/storefront\",\n \"or:\",\n \" export FEEEF_STOREFRONT_PATH=/path/to/storefront\",\n ].join(\"\\n\"),\n );\n }\n return root;\n}\n","import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type { FeeeF, StoreTemplateEntity } from \"feeef\";\nimport { TemplateComponentPolicy } from \"feeef\";\nimport { createClient } from \"../../client.js\";\nimport { cloneKitFromGit, copyKitFromLocal, resolveBlankKitGitUrl } from \"../../kits.js\";\nimport { loadUnpack, scaffoldsRoot } from \"../../kit.js\";\nimport { saveProjectRc } from \"../../project.js\";\nimport { ensureAgentPack, ensureEditorSupport, ensureNodePackage } from \"../../theme-package.js\";\nimport { materializeTemplateReferences } from \"../../theme.js\";\nimport {\n fail,\n info,\n intro,\n ok,\n outro,\n pc,\n warn,\n select,\n spinner,\n text,\n} from \"../../ui.js\";\n\nconst PAGE_SIZE = 15;\nconst LOAD_MORE = \"__load_more__\";\nconst SEARCH = \"__search__\";\nconst CLEAR_SEARCH = \"__clear_search__\";\n\nfunction copyDir(src: string, dest: string): void {\n fs.mkdirSync(dest, { recursive: true });\n for (const entry of fs.readdirSync(src, { withFileTypes: true })) {\n if (entry.name === \".\" || entry.name === \"..\") continue;\n if (\n entry.name === \"node_modules\" ||\n entry.name === \".git\" ||\n entry.name === \".env\" ||\n entry.name.startsWith(\".env.\")\n ) {\n continue;\n }\n const from = path.join(src, entry.name);\n const to = path.join(dest, entry.name);\n if (entry.isDirectory()) copyDir(from, to);\n else fs.copyFileSync(from, to);\n }\n}\n\nfunction validateFolderName(v: string | undefined): string | undefined {\n if (!v || !/^[a-z0-9-_]+$/i.test(v)) {\n return \"Use letters, numbers, - or _\";\n }\n return undefined;\n}\n\nfunction formatTemplateLabel(row: StoreTemplateEntity): string {\n const title = row.title || row.id;\n if (row.category) return `${title} · ${row.category}`;\n return title;\n}\n\nfunction writeLocaleFiles(\n dest: string,\n messages: Record<string, Record<string, unknown>>,\n): number {\n const localesDir = path.join(dest, \"locales\");\n fs.mkdirSync(localesDir, { recursive: true });\n let count = 0;\n for (const [locale, tree] of Object.entries(messages)) {\n fs.writeFileSync(\n path.join(localesDir, `${locale}.json`),\n `${JSON.stringify(tree, null, 2)}\\n`,\n \"utf8\",\n );\n count += 1;\n }\n return count;\n}\n\nfunction patchMeta(\n dest: string,\n patch: Record<string, unknown>,\n): void {\n const metaPath = path.join(dest, \"feeef.template.json\");\n if (!fs.existsSync(metaPath)) return;\n const meta = JSON.parse(fs.readFileSync(metaPath, \"utf8\")) as Record<\n string,\n unknown\n >;\n Object.assign(meta, patch);\n fs.writeFileSync(metaPath, `${JSON.stringify(meta, null, 2)}\\n`, \"utf8\");\n}\n\n/**\n * Browse public marketplace templates with search + Load more…\n */\nexport async function pickPublicTemplateInteractive(\n ff: FeeeF,\n initialQuery = \"\",\n): Promise<StoreTemplateEntity> {\n let page = 1;\n let query = initialQuery.trim();\n const accumulated: StoreTemplateEntity[] = [];\n let total: number | undefined;\n let lastBatchSize = 0;\n\n const resetList = (): void => {\n page = 1;\n accumulated.length = 0;\n total = undefined;\n lastBatchSize = 0;\n };\n\n const fetchPage = async (): Promise<void> => {\n const s = spinner();\n const label =\n page === 1\n ? query\n ? `Searching public templates for “${query}”…`\n : \"Loading public templates…\"\n : `Loading more (page ${page})…`;\n s.start(label);\n const res = await ff.storeTemplates.list({\n page,\n limit: PAGE_SIZE,\n policy: TemplateComponentPolicy.public,\n ...(query ? { q: query } : {}),\n });\n s.stop(page === 1 ? \"Templates loaded\" : \"More templates loaded\");\n if (typeof res.total === \"number\") total = res.total;\n const batch = res.data || [];\n lastBatchSize = batch.length;\n accumulated.push(...batch);\n };\n\n for (;;) {\n if (accumulated.length === 0) {\n await fetchPage();\n }\n\n if (accumulated.length === 0) {\n const again = await select({\n message: query\n ? `No public templates matched “${query}”`\n : \"No public templates found\",\n options: [\n { value: SEARCH, label: \"Search again…\" },\n ...(query\n ? [{ value: CLEAR_SEARCH, label: \"Clear search (show all)\" }]\n : []),\n ],\n });\n if (again === CLEAR_SEARCH) {\n query = \"\";\n resetList();\n continue;\n }\n query = (\n await text({\n message: \"Search templates\",\n placeholder: \"dawn, fashion, …\",\n })\n ).trim();\n resetList();\n continue;\n }\n\n const hasMore =\n lastBatchSize >= PAGE_SIZE &&\n (total == null || accumulated.length < total);\n\n const options: { value: string; label: string; hint?: string }[] = [\n ...accumulated.map((row) => ({\n value: row.id,\n label: formatTemplateLabel(row),\n hint: row.id,\n })),\n {\n value: SEARCH,\n label: `${pc.dim(\"⌕\")} Search…`,\n hint: query ? `current: ${query}` : \"filter by title\",\n },\n ];\n\n if (query) {\n options.push({\n value: CLEAR_SEARCH,\n label: `${pc.dim(\"×\")} Clear search`,\n hint: query,\n });\n }\n\n if (hasMore) {\n const hint =\n total != null\n ? `${accumulated.length} of ${total}`\n : `loaded ${accumulated.length}`;\n options.push({\n value: LOAD_MORE,\n label: `${pc.dim(\"→\")} Load more…`,\n hint,\n });\n }\n\n const chosen = await select({\n message: query\n ? `Pick a public template (search: ${query})`\n : \"Pick a public template\",\n options,\n });\n\n if (chosen === SEARCH) {\n query = (\n await text({\n message: \"Search templates\",\n placeholder: \"dawn, fashion, …\",\n initialValue: query,\n })\n ).trim();\n resetList();\n continue;\n }\n\n if (chosen === CLEAR_SEARCH) {\n query = \"\";\n resetList();\n continue;\n }\n\n if (chosen === LOAD_MORE) {\n page += 1;\n await fetchPage();\n if (lastBatchSize === 0) {\n info(\"No more templates\");\n total = accumulated.length;\n }\n continue;\n }\n\n const picked = accumulated.find((row) => row.id === chosen);\n if (!picked) fail(\"Selected template not found\");\n return picked;\n }\n}\n\nasync function initFromBlank(\n dest: string,\n name: string,\n opts: { gitUrl?: string } = {},\n): Promise<{ method: \"git\" | \"local\"; source: string }> {\n const blank = path.join(scaffoldsRoot(), \"blank\");\n const gitUrl = opts.gitUrl || resolveBlankKitGitUrl();\n\n let result: { method: \"git\" | \"local\"; source: string };\n if (gitUrl) {\n const s = spinner();\n s.start(`Cloning kit from ${gitUrl}…`);\n try {\n result = cloneKitFromGit({ url: gitUrl, dest });\n s.stop(\"Kit cloned\");\n } catch (e) {\n s.stop(\"Git clone failed — falling back to local blank scaffold\");\n warn(\n e instanceof Error ? e.message : String(e),\n );\n if (fs.existsSync(dest)) {\n fs.rmSync(dest, { recursive: true, force: true });\n }\n if (!fs.existsSync(blank)) {\n fail(`Scaffold missing at ${blank}`);\n }\n result = copyKitFromLocal({ src: blank, dest, copyDir });\n }\n } else {\n if (!fs.existsSync(blank)) {\n fail(`Scaffold missing at ${blank}`);\n }\n result = copyKitFromLocal({ src: blank, dest, copyDir });\n }\n\n patchMeta(dest, { name });\n ensureNodePackage(dest, name);\n ensureAgentPack(dest);\n ensureEditorSupport(dest);\n return result;\n}\n\nasync function initFromPublicTemplate(\n dest: string,\n name: string,\n templateId: string,\n ff: FeeeF,\n): Promise<{ title: string; localeCount: number }> {\n const download = spinner();\n download.start(\"Downloading template…\");\n const full = await ff.storeTemplates.find({ id: templateId });\n download.stop(\"Template downloaded\");\n\n const data = full.data;\n if (!data || typeof data !== \"object\" || !(\"pages\" in data)) {\n fail(\"Template has no usable data.pages — cannot unpack\");\n }\n\n // Marketplace themes often ship `type: \"reference\"` library placements.\n // Those only resolve against the *source* store — local `feeef template\n // dev` uses the destination store and would render a blank page. Inline\n // them as `custom` before unpack so the theme is self-contained.\n const dataForUnpack = structuredClone(data) as Record<string, unknown>;\n if (full.storeId) {\n const matSpin = spinner();\n matSpin.start(\"Inlining library references…\");\n try {\n const mat = await materializeTemplateReferences({\n data: dataForUnpack,\n sourceStoreId: full.storeId,\n resolve: (args) => ff.actions.resolveComponents(args),\n });\n if (mat.missing.length > 0) {\n matSpin.stop(\n `Inlined ${mat.resolved} library component(s); ${mat.missing.length} missing`,\n );\n warn(\n `Unresolved refId(s): ${mat.missing.slice(0, 8).join(\", \")}${mat.missing.length > 8 ? \"…\" : \"\"}`,\n );\n } else {\n matSpin.stop(\n mat.resolved > 0\n ? `Inlined ${mat.resolved} library component(s)`\n : \"No library references to inline\",\n );\n }\n } catch (e) {\n matSpin.stop(\"Could not inline library references\");\n warn(e instanceof Error ? e.message : String(e));\n }\n } else {\n warn(\"Template has no storeId — skipping library reference inline\");\n }\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"feeef-init-\"));\n const dataPath = path.join(tmpDir, \"data.json\");\n try {\n fs.writeFileSync(\n dataPath,\n `${JSON.stringify(dataForUnpack, null, 2)}\\n`,\n \"utf8\",\n );\n const { unpackTemplate } = await loadUnpack();\n const unpackSpin = spinner();\n unpackSpin.start(\"Unpacking theme files…\");\n const stats = unpackTemplate({\n inputPath: dataPath,\n outDir: dest,\n force: true,\n });\n unpackSpin.stop(\n `Unpacked ${stats.pages} pages / ${stats.components} components (${stats.files} files)`,\n );\n } finally {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n }\n\n let localeCount = 0;\n let defaultLocale: string | undefined;\n\n try {\n const localeSpin = spinner();\n localeSpin.start(\"Fetching locales…\");\n const locales = await ff.storeTemplates.listLocales(templateId);\n localeSpin.stop(\"Locales loaded\");\n defaultLocale = locales.defaultLocale;\n if (locales.messages && Object.keys(locales.messages).length > 0) {\n localeCount = writeLocaleFiles(dest, locales.messages);\n }\n } catch {\n const embedded = (data as { i18n?: { messages?: Record<string, Record<string, unknown>>; defaultLocale?: string } }).i18n;\n if (embedded?.messages) {\n localeCount = writeLocaleFiles(dest, embedded.messages);\n defaultLocale = embedded.defaultLocale;\n }\n }\n\n patchMeta(dest, {\n name,\n ...(defaultLocale ? { defaultLocale } : {}),\n sourceTemplateId: templateId,\n sourceTitle: full.title,\n });\n\n ensureNodePackage(dest, name);\n ensureAgentPack(dest);\n ensureEditorSupport(dest);\n saveProjectRc(dest, { templateId });\n\n const readmePath = path.join(dest, \"README.md\");\n if (!fs.existsSync(readmePath)) {\n fs.writeFileSync(\n readmePath,\n [\n `# ${name}`,\n \"\",\n `Cloned from public template **${full.title}** (\\`${templateId}\\`).`,\n \"\",\n \"This folder is a Node.js package — scripts wrap the global `feeef` CLI.\",\n \"\",\n \"```bash\",\n \"feeef signin\",\n \"feeef use\",\n \"npm run build\",\n \"npm run dev\",\n \"npm run publish -- --apply\",\n \"```\",\n \"\",\n ].join(\"\\n\"),\n \"utf8\",\n );\n }\n\n return { title: full.title, localeCount };\n}\n\nexport async function runTemplateInit(\n nameArg: string | undefined,\n opts: {\n blank?: boolean;\n from?: string;\n search?: string;\n /** Git URL for official/blank kit (Laravel-style). */\n git?: string;\n } = {},\n): Promise<void> {\n intro(\"feeef template init\");\n try {\n let source: \"blank\" | \"public\" | \"git\" = opts.blank\n ? \"blank\"\n : opts.from\n ? \"public\"\n : opts.git\n ? \"git\"\n : await select({\n message: \"Start from\",\n options: [\n {\n value: \"blank\",\n label: \"Blank theme\",\n hint: resolveBlankKitGitUrl()\n ? \"git clone official / monorepo kit\"\n : \"local scaffold\",\n },\n {\n value: \"git\",\n label: \"Git kit URL\",\n hint: \"clone --depth 1 (Adonis/Laravel style)\",\n },\n {\n value: \"public\",\n label: \"Public marketplace template\",\n hint: \"search + unpack\",\n },\n ],\n });\n\n const name =\n nameArg ||\n (await text({\n message: \"Theme folder name\",\n placeholder: \"my-theme\",\n validate: validateFolderName,\n }));\n\n const dest = path.resolve(process.cwd(), name);\n if (fs.existsSync(dest) && fs.readdirSync(dest).length > 0) {\n fail(`Directory not empty: ${dest}`);\n }\n\n if (source === \"blank\" || source === \"git\") {\n let gitUrl = opts.git;\n if (source === \"git\" && !gitUrl) {\n gitUrl = (\n await text({\n message: \"Git kit URL\",\n placeholder: \"https://github.com/feeef/theme-blank.git\",\n validate: (v) => (!v?.trim() ? \"URL required\" : undefined),\n })\n ).trim();\n }\n const kit = await initFromBlank(dest, name, {\n ...(gitUrl ? { gitUrl } : {}),\n });\n ok(`Created ${dest} (${kit.method}: ${kit.source})`);\n info(\n \"Next:\\n cd \" +\n name +\n \"\\n feeef signin\\n feeef use\\n npm run build\",\n );\n outro(\"Theme scaffold ready\");\n return;\n }\n\n const { ff } = createClient({ requireAuth: false });\n let templateId = opts.from;\n\n if (!templateId) {\n const picked = await pickPublicTemplateInteractive(ff, opts.search || \"\");\n templateId = picked.id;\n info(`Selected ${formatTemplateLabel(picked)}`);\n }\n\n const result = await initFromPublicTemplate(dest, name, templateId, ff);\n ok(`Created ${dest} from “${result.title}”`);\n if (result.localeCount > 0) {\n info(`Wrote ${result.localeCount} locale file(s)`);\n }\n info(\n \"Next:\\n cd \" +\n name +\n \"\\n feeef signin\\n feeef use\\n npm run build\\n npm run dev\",\n );\n outro(\"Theme cloned and ready\");\n } catch (e) {\n fail(e);\n }\n}\n","import { execFileSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { cliRoot } from \"./kit.js\";\n\n/**\n * Official kit ids. Blank ships in the CLI scaffold and as `theme-kits/blank`\n * in the monorepo (git-backed). Production default points at the public GitHub\n * kit; clone falls back to the local scaffold if git fails.\n */\nexport type OfficialKitId = \"blank\";\n\n/** Public GitHub starter (publish `theme-kits/blank` here when ready). */\nexport const DEFAULT_BLANK_KIT_GIT =\n \"https://github.com/feeef/theme-blank.git\";\n\nexport interface KitCloneResult {\n method: \"git\" | \"local\";\n source: string;\n}\n\n/**\n * Resolve which git URL to use for the blank kit.\n *\n * - `FEEEF_THEME_BLANK_GIT=local` or `0` → force local scaffold (no clone)\n * - `FEEEF_THEME_BLANK_GIT=<url|path>` → that source\n * - else monorepo `theme-kits/blank` if it has `.git`\n * - else {@link DEFAULT_BLANK_KIT_GIT} (clone may fail → scaffold fallback)\n */\nexport function resolveBlankKitGitUrl(\n root: string = cliRoot(),\n): string | undefined {\n const raw = process.env[\"FEEEF_THEME_BLANK_GIT\"];\n if (raw !== undefined) {\n const trimmed = raw.trim();\n if (trimmed === \"\" || trimmed === \"0\" || trimmed === \"local\") {\n return undefined;\n }\n return trimmed;\n }\n\n const monorepoKit = path.resolve(root, \"..\", \"theme-kits\", \"blank\");\n if (fs.existsSync(path.join(monorepoKit, \".git\"))) {\n return monorepoKit;\n }\n\n return DEFAULT_BLANK_KIT_GIT;\n}\n\n/** @deprecated Prefer {@link resolveBlankKitGitUrl} */\nexport function blankGitUrlFromEnv(): string | undefined {\n return resolveBlankKitGitUrl();\n}\n\n/**\n * Shallow-clone a theme kit into `dest` (dest must not exist or be empty).\n * Removes the nested `.git` so the user's theme starts as a fresh tree\n * (they can `git init` themselves).\n */\nexport function cloneKitFromGit(opts: {\n url: string;\n dest: string;\n /** Passed to git clone (default 1). */\n depth?: number;\n}): KitCloneResult {\n const dest = path.resolve(opts.dest);\n if (fs.existsSync(dest)) {\n const entries = fs.readdirSync(dest);\n if (entries.length > 0) {\n throw new Error(`Destination not empty: ${dest}`);\n }\n fs.rmSync(dest, { recursive: true, force: true });\n }\n\n const depth = opts.depth ?? 1;\n execFileSync(\n \"git\",\n [\"clone\", `--depth=${depth}`, opts.url, dest],\n { stdio: [\"ignore\", \"pipe\", \"pipe\"] },\n );\n\n const gitDir = path.join(dest, \".git\");\n if (fs.existsSync(gitDir)) {\n fs.rmSync(gitDir, { recursive: true, force: true });\n }\n\n return { method: \"git\", source: opts.url };\n}\n\nexport function copyKitFromLocal(opts: {\n src: string;\n dest: string;\n copyDir: (src: string, dest: string) => void;\n}): KitCloneResult {\n if (!fs.existsSync(opts.src)) {\n throw new Error(`Local kit missing: ${opts.src}`);\n }\n opts.copyDir(opts.src, opts.dest);\n return { method: \"local\", source: opts.src };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { scaffoldsRoot } from \"./kit.js\";\n\n/** npm package name from theme folder (letters/digits/-/_ → lowercase). */\nexport function packageNameFromFolder(name: string): string {\n return name.toLowerCase();\n}\n\nexport const DEFAULT_PACKAGE_JSON = {\n name: \"feeef-theme\",\n private: true,\n version: \"0.1.0\",\n description: \"Feeef Lithium theme\",\n type: \"module\",\n engines: { node: \">=18\" },\n scripts: {\n build: \"feeef template build\",\n check: \"feeef template check\",\n dev: \"feeef template dev\",\n publish: \"feeef template publish\",\n typecheck: \"tsc --noEmit\",\n },\n dependencies: {},\n devDependencies: {\n \"@types/react\": \"^19.0.0\",\n \"@types/react-dom\": \"^19.0.0\",\n typescript: \"^5.4.5\",\n },\n} as const;\n\nexport const DEFAULT_GITIGNORE = `node_modules/\ndist/\n.env\n.env.local\n.DS_Store\n`;\n\n/** Files/dirs copied for AI + editor DX (missing only; never overwrite). */\nconst AGENT_PACK_ENTRIES = [\"AGENTS.md\", \"docs\", \".cursor\"] as const;\n\n/** Editor / tsserver support — copied when missing. */\nconst EDITOR_PACK_ENTRIES = [\n \"tsconfig.json\",\n \"types\",\n \".vscode\",\n] as const;\n\nconst EDITOR_DEV_DEPS: Record<string, string> = {\n \"@types/react\": \"^19.0.0\",\n \"@types/react-dom\": \"^19.0.0\",\n typescript: \"^5.4.5\",\n};\n\nfunction copyDir(src: string, dest: string): void {\n fs.mkdirSync(dest, { recursive: true });\n for (const entry of fs.readdirSync(src, { withFileTypes: true })) {\n if (entry.name === \".\" || entry.name === \"..\") continue;\n if (\n entry.name === \"node_modules\" ||\n entry.name === \".git\" ||\n entry.name === \".env\" ||\n entry.name.startsWith(\".env.\")\n ) {\n continue;\n }\n const from = path.join(src, entry.name);\n const to = path.join(dest, entry.name);\n if (entry.isDirectory()) copyDir(from, to);\n else fs.copyFileSync(from, to);\n }\n}\n\nfunction copyEntryIfMissing(from: string, to: string): boolean {\n if (!fs.existsSync(from) || fs.existsSync(to)) return false;\n const st = fs.statSync(from);\n if (st.isDirectory()) copyDir(from, to);\n else {\n fs.mkdirSync(path.dirname(to), { recursive: true });\n fs.copyFileSync(from, to);\n }\n return true;\n}\n\n/**\n * Ensure theme has AI authoring pack (`AGENTS.md`, `docs/`, `.cursor/`).\n * Skips if `AGENTS.md` already exists (do not overwrite author customizations).\n */\nexport function ensureAgentPack(dest: string): boolean {\n const agentsPath = path.join(dest, \"AGENTS.md\");\n if (fs.existsSync(agentsPath)) return false;\n\n const blank = path.join(scaffoldsRoot(), \"blank\");\n let copied = false;\n for (const name of AGENT_PACK_ENTRIES) {\n if (copyEntryIfMissing(path.join(blank, name), path.join(dest, name))) {\n copied = true;\n }\n }\n return copied;\n}\n\n/**\n * Ensure VS Code / tsserver understand `component.tsx`:\n * `tsconfig.json`, `types/feeef-live-scope.d.ts`, `.vscode/`, and React type deps.\n *\n * Safe to call on every init — only fills missing files / missing deps.\n */\nexport function ensureEditorSupport(dest: string): boolean {\n const blank = path.join(scaffoldsRoot(), \"blank\");\n let changed = false;\n\n for (const name of EDITOR_PACK_ENTRIES) {\n if (copyEntryIfMissing(path.join(blank, name), path.join(dest, name))) {\n changed = true;\n }\n }\n\n // Always ensure ambient type files exist (even if types/ was partial).\n const scopeFrom = path.join(blank, \"types\", \"feeef-live-scope.d.ts\");\n const scopeTo = path.join(dest, \"types\", \"feeef-live-scope.d.ts\");\n if (copyEntryIfMissing(scopeFrom, scopeTo)) changed = true;\n\n const themeSchemaFrom = path.join(blank, \"types\", \"feeef-template-schema.d.ts\");\n const themeSchemaTo = path.join(dest, \"types\", \"feeef-template-schema.d.ts\");\n if (copyEntryIfMissing(themeSchemaFrom, themeSchemaTo)) changed = true;\n\n // Seed typed schema overlay when the theme has none (blank / older inits).\n if (copyEntryIfMissing(path.join(blank, \"schema.ts\"), path.join(dest, \"schema.ts\"))) {\n changed = true;\n }\n if (copyEntryIfMissing(path.join(blank, \"props.json\"), path.join(dest, \"props.json\"))) {\n changed = true;\n }\n\n const pkgPath = path.join(dest, \"package.json\");\n if (fs.existsSync(pkgPath)) {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf8\")) as Record<\n string,\n unknown\n >;\n const scripts =\n pkg.scripts && typeof pkg.scripts === \"object\"\n ? ({ ...(pkg.scripts as Record<string, string>) } as Record<\n string,\n string\n >)\n : {};\n if (!scripts.typecheck) {\n scripts.typecheck = \"tsc --noEmit\";\n pkg.scripts = scripts;\n changed = true;\n }\n const devDeps =\n pkg.devDependencies && typeof pkg.devDependencies === \"object\"\n ? ({ ...(pkg.devDependencies as Record<string, string>) } as Record<\n string,\n string\n >)\n : {};\n for (const [name, version] of Object.entries(EDITOR_DEV_DEPS)) {\n if (!devDeps[name]) {\n devDeps[name] = version;\n changed = true;\n }\n }\n pkg.devDependencies = devDeps;\n fs.writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`, \"utf8\");\n }\n\n return changed;\n}\n\n/**\n * Ensure the theme is a Node package: package.json (name patched) + .gitignore.\n * Used after blank copy and after marketplace unpack (unpack does not create these).\n */\nexport function ensureNodePackage(dest: string, folderName: string): void {\n const pkgName = packageNameFromFolder(folderName);\n const pkgPath = path.join(dest, \"package.json\");\n\n if (fs.existsSync(pkgPath)) {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf8\")) as Record<\n string,\n unknown\n >;\n pkg.name = pkgName;\n if (!pkg.scripts || typeof pkg.scripts !== \"object\") {\n pkg.scripts = { ...DEFAULT_PACKAGE_JSON.scripts };\n }\n const scripts = pkg.scripts as Record<string, string>;\n if (!scripts.typecheck) scripts.typecheck = \"tsc --noEmit\";\n const devDeps =\n pkg.devDependencies && typeof pkg.devDependencies === \"object\"\n ? (pkg.devDependencies as Record<string, string>)\n : {};\n for (const [name, version] of Object.entries(EDITOR_DEV_DEPS)) {\n if (!devDeps[name]) devDeps[name] = version;\n }\n pkg.devDependencies = devDeps;\n fs.writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`, \"utf8\");\n } else {\n fs.writeFileSync(\n pkgPath,\n `${JSON.stringify({ ...DEFAULT_PACKAGE_JSON, name: pkgName }, null, 2)}\\n`,\n \"utf8\",\n );\n }\n\n const gitignorePath = path.join(dest, \".gitignore\");\n if (!fs.existsSync(gitignorePath)) {\n fs.writeFileSync(gitignorePath, DEFAULT_GITIGNORE, \"utf8\");\n } else {\n const existing = fs.readFileSync(gitignorePath, \"utf8\");\n const extras: string[] = [];\n if (\n !/(^|\\/)node_modules\\/?$/m.test(existing) &&\n !existing.includes(\"node_modules\")\n ) {\n extras.push(\"node_modules/\");\n }\n if (!/(^|\\/)dist\\/?$/m.test(existing) && !existing.includes(\"dist/\")) {\n extras.push(\"dist/\");\n }\n if (extras.length > 0) {\n const sep = existing.endsWith(\"\\n\") ? \"\" : \"\\n\";\n fs.writeFileSync(\n gitignorePath,\n `${existing}${sep}${extras.join(\"\\n\")}\\n`,\n \"utf8\",\n );\n }\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\n\nexport interface PublishableComponent {\n sourceKey: string;\n kind: \"shared\" | \"library\";\n dir: string;\n meta: Record<string, unknown>;\n code: string;\n}\n\nexport interface LocaleUpload {\n locale: string;\n messages: Record<string, unknown>;\n isDefault: boolean;\n}\n\nexport function collectPublishableComponents(\n srcDir: string,\n): PublishableComponent[] {\n const out: PublishableComponent[] = [];\n\n for (const kind of [\"shared\", \"library\"] as const) {\n const root = path.join(srcDir, kind, \"components\");\n if (!fs.existsSync(root)) continue;\n\n /** Collect flat files + folders (folder wins on id conflict). */\n const byId = new Map<string, string>();\n for (const ent of fs.readdirSync(root, { withFileTypes: true })) {\n if (ent.name.startsWith(\".\")) continue;\n if (ent.isDirectory()) {\n byId.set(ent.name, path.join(root, ent.name));\n }\n }\n for (const ent of fs.readdirSync(root, { withFileTypes: true })) {\n if (ent.name.startsWith(\".\") || !ent.isFile()) continue;\n const m = /^(.*)\\.(tsx|jsx|json)$/.exec(ent.name);\n if (!m) continue;\n const id = m[1]!;\n if (byId.has(id)) continue;\n byId.set(id, path.join(root, ent.name));\n }\n const entries = [...byId.entries()]\n .map(([id, entryPath]) => ({ id, entryPath }))\n .sort((a, b) => a.id.localeCompare(b.id));\n\n for (const { id: name, entryPath } of entries) {\n const isDir = fs.statSync(entryPath).isDirectory();\n const metaPath = isDir\n ? path.join(entryPath, \"component.json\")\n : entryPath.endsWith(\".json\")\n ? entryPath\n : null;\n const tsxPath = isDir\n ? path.join(entryPath, \"component.tsx\")\n : entryPath.endsWith(\".tsx\")\n ? entryPath\n : null;\n const jsxPath = isDir\n ? path.join(entryPath, \"component.jsx\")\n : entryPath.endsWith(\".jsx\")\n ? entryPath\n : null;\n const entry = tsxPath && fs.existsSync(tsxPath)\n ? tsxPath\n : jsxPath && fs.existsSync(jsxPath)\n ? jsxPath\n : null;\n\n let meta: Record<string, unknown> = {};\n if (metaPath && fs.existsSync(metaPath)) {\n meta = JSON.parse(fs.readFileSync(metaPath, \"utf8\")) as Record<\n string,\n unknown\n >;\n }\n\n let code = typeof meta[\"code\"] === \"string\" ? meta[\"code\"] : \"\";\n if (entry) {\n const source = fs.readFileSync(entry, \"utf8\");\n // Prefer file body as code; build will strip meta export.\n code = source;\n const metaMatch = source.match(\n /export\\s+const\\s+meta(?:\\s+satisfies\\s+[^=]+)?\\s*=\\s*(\\{[\\s\\S]*?\\})\\s*(?:as\\s+const)?\\s*;?/,\n );\n if (metaMatch?.[1]) {\n try {\n // Best-effort for publish catalog title; full parse happens in kit build.\n meta = { ...meta, ...(new Function(`return (${metaMatch[1]})`)() as object) };\n } catch {\n /* keep json meta */\n }\n }\n }\n if (!code.trim() && !(metaPath && fs.existsSync(metaPath))) continue;\n if (!code.trim()) continue;\n\n const sourceKey =\n (typeof meta[\"libraryId\"] === \"string\" && meta[\"libraryId\"]) ||\n (typeof meta[\"id\"] === \"string\" && meta[\"id\"]) ||\n name;\n\n out.push({ sourceKey, kind, dir: entryPath, meta, code });\n }\n }\n\n const seen = new Set<string>();\n return out.filter((c) => {\n if (seen.has(c.sourceKey)) return false;\n seen.add(c.sourceKey);\n return true;\n });\n}\n\nexport function rewriteDataToReferences(\n data: unknown,\n codeToRefId: Map<string, string>,\n): unknown {\n if (!data || typeof data !== \"object\") return data;\n\n const walk = (node: unknown): unknown => {\n if (!node || typeof node !== \"object\") return node;\n if (Array.isArray(node)) return node.map(walk);\n\n const obj = node as Record<string, unknown>;\n if (\n (obj[\"type\"] === \"custom\" || !obj[\"type\"]) &&\n typeof obj[\"code\"] === \"string\" &&\n codeToRefId.has(obj[\"code\"].trim())\n ) {\n const refId = codeToRefId.get(obj[\"code\"].trim());\n const {\n code: _c,\n propsSchema: _ps,\n slotsSchema: _ss,\n ...rest\n } = obj;\n return walk({ ...rest, type: \"reference\", refId });\n }\n\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n out[k] = walk(v);\n }\n return out;\n };\n\n return walk(data);\n}\n\nexport function stripDataI18n(\n data: Record<string, unknown>,\n): Record<string, unknown> {\n const clone = structuredClone(data);\n delete clone[\"i18n\"];\n return clone;\n}\n\nexport function loadDistLocales(\n distDir: string,\n defaultLocale = \"en\",\n): LocaleUpload[] {\n const localesDir = path.join(distDir, \"locales\");\n if (!fs.existsSync(localesDir)) return [];\n\n return fs\n .readdirSync(localesDir)\n .filter((f) => f.endsWith(\".json\"))\n .map((f) => {\n const locale = path.basename(f, \".json\");\n const messages = JSON.parse(\n fs.readFileSync(path.join(localesDir, f), \"utf8\"),\n ) as Record<string, unknown>;\n return {\n locale,\n messages,\n isDefault: locale === defaultLocale,\n };\n });\n}\n\n/** Slim resolve payload (matches `actions/resolveComponents`). */\nexport interface ResolvedLibraryEntry {\n id: string;\n code: string;\n propsSchema?: Record<string, unknown>;\n slotsSchema?: Record<string, unknown> | null;\n propsDefault?: Record<string, unknown>;\n slotsDefault?: Record<string, unknown> | null;\n slotsLayout?: Record<string, unknown> | null;\n title?: string;\n deprecated?: boolean;\n}\n\nconst MAX_REF_DEPTH = 6;\nconst MAX_REF_ROUNDS = 4;\n\nexport function collectTemplateRefIds(data: unknown): Set<string> {\n const out = new Set<string>();\n\n const walkComp = (\n node: unknown,\n depth: number,\n ): void => {\n if (!node || typeof node !== \"object\" || depth > MAX_REF_DEPTH) return;\n if (Array.isArray(node)) {\n for (const item of node) walkComp(item, depth);\n return;\n }\n const obj = node as Record<string, unknown>;\n if (obj[\"type\"] === \"reference\") {\n const raw = obj[\"refId\"] ?? obj[\"ref_id\"];\n if (typeof raw === \"string\" && raw.trim()) out.add(raw.trim());\n }\n if (Array.isArray(obj[\"children\"])) {\n for (const ch of obj[\"children\"]) walkComp(ch, depth + 1);\n }\n if (obj[\"slots\"] && typeof obj[\"slots\"] === \"object\") {\n for (const arr of Object.values(obj[\"slots\"] as Record<string, unknown>)) {\n if (!Array.isArray(arr)) continue;\n for (const ch of arr) walkComp(ch, depth + 1);\n }\n }\n };\n\n const pages = (data as { pages?: Record<string, unknown> } | null)?.pages;\n if (!pages || typeof pages !== \"object\") return out;\n for (const page of Object.values(pages)) {\n const sections = (page as { sections?: Record<string, unknown> })?.sections;\n if (!sections) continue;\n for (const section of Object.values(sections)) {\n const comps = (section as { components?: unknown[] })?.components;\n if (!Array.isArray(comps)) continue;\n for (const c of comps) walkComp(c, 0);\n }\n }\n return out;\n}\n\nfunction mergeDeep(\n base: Record<string, unknown> | null | undefined,\n override: Record<string, unknown> | null | undefined,\n): Record<string, unknown> {\n if (!override || typeof override !== \"object\") return base ? { ...base } : {};\n if (!base || typeof base !== \"object\") return { ...override };\n const out: Record<string, unknown> = { ...base };\n for (const key of Object.keys(override)) {\n const ov = override[key];\n const bv = base[key];\n if (\n ov !== null &&\n typeof ov === \"object\" &&\n !Array.isArray(ov) &&\n bv !== null &&\n typeof bv === \"object\" &&\n !Array.isArray(bv)\n ) {\n out[key] = mergeDeep(\n bv as Record<string, unknown>,\n ov as Record<string, unknown>,\n );\n } else {\n out[key] = ov;\n }\n }\n return out;\n}\n\nfunction mergeSlots(\n base: Record<string, unknown[]> | null | undefined,\n override: Record<string, unknown[]> | null | undefined,\n): Record<string, unknown[]> | null {\n const hasBase = !!(base && Object.keys(base).length > 0);\n const hasOverride = !!(override && Object.keys(override).length > 0);\n if (!hasBase && !hasOverride) return null;\n const out: Record<string, unknown[]> = {};\n if (hasBase) {\n for (const [k, v] of Object.entries(base!)) {\n out[k] = Array.isArray(v) ? [...v] : [];\n }\n }\n if (hasOverride) {\n for (const [k, v] of Object.entries(override!)) {\n if (Array.isArray(v)) out[k] = v;\n }\n }\n return out;\n}\n\nfunction materializeNode(\n comp: Record<string, unknown> | null | undefined,\n resolved: Record<string, ResolvedLibraryEntry>,\n depth: number,\n): Record<string, unknown> | null {\n if (!comp || depth > MAX_REF_DEPTH) return comp ?? null;\n\n if (Array.isArray(comp[\"children\"])) {\n const next: Record<string, unknown>[] = [];\n for (const child of comp[\"children\"] as unknown[]) {\n const rewritten = materializeNode(\n child as Record<string, unknown>,\n resolved,\n depth + 1,\n );\n if (rewritten) next.push(rewritten);\n }\n comp[\"children\"] = next;\n }\n\n if (comp[\"slots\"] && typeof comp[\"slots\"] === \"object\") {\n const slots = comp[\"slots\"] as Record<string, unknown>;\n for (const [slotKey, arr] of Object.entries(slots)) {\n if (!Array.isArray(arr)) continue;\n const next: Record<string, unknown>[] = [];\n for (const child of arr) {\n const rewritten = materializeNode(\n child as Record<string, unknown>,\n resolved,\n depth + 1,\n );\n if (rewritten) next.push(rewritten);\n }\n slots[slotKey] = next;\n }\n }\n\n if (comp[\"type\"] !== \"reference\") return comp;\n\n const refId = comp[\"refId\"] ?? comp[\"ref_id\"];\n if (typeof refId !== \"string\" || !refId.trim()) return null;\n const entry = resolved[refId.trim()];\n if (!entry) return null;\n\n const mergedProps = mergeDeep(\n entry.propsDefault ?? {},\n (comp[\"props\"] as Record<string, unknown> | undefined) ?? {},\n );\n const mergedSlots = mergeSlots(\n entry.slotsDefault as Record<string, unknown[]> | null | undefined,\n comp[\"slots\"] as Record<string, unknown[]> | null | undefined,\n );\n\n const materialized: Record<string, unknown> = {\n ...comp,\n type: \"custom\",\n code: entry.code,\n propsSchema: entry.propsSchema ?? {},\n slotsSchema: entry.slotsSchema ?? {},\n props: mergedProps,\n slots: mergedSlots,\n };\n if (entry.slotsLayout != null && materialized[\"slotsLayout\"] == null) {\n materialized[\"slotsLayout\"] = entry.slotsLayout;\n }\n delete materialized[\"refId\"];\n delete materialized[\"ref_id\"];\n delete materialized[\"refVersion\"];\n return materialized;\n}\n\n/**\n * Rewrite every `type: \"reference\"` node into inline `custom` using a\n * pre-fetched resolve catalog. Mutates `data` in place.\n */\nexport function rewriteReferencesInTemplateData(\n data: Record<string, unknown>,\n resolved: Record<string, ResolvedLibraryEntry>,\n): void {\n const pages = data[\"pages\"];\n if (!pages || typeof pages !== \"object\") return;\n\n for (const page of Object.values(pages as Record<string, unknown>)) {\n if (!page || typeof page !== \"object\") continue;\n const sections = (page as Record<string, unknown>)[\"sections\"];\n if (!sections || typeof sections !== \"object\") continue;\n for (const section of Object.values(sections as Record<string, unknown>)) {\n if (!section || typeof section !== \"object\") continue;\n const comps = (section as Record<string, unknown>)[\"components\"];\n if (!Array.isArray(comps)) continue;\n const next: Record<string, unknown>[] = [];\n for (const c of comps) {\n const rewritten = materializeNode(\n c as Record<string, unknown>,\n resolved,\n 0,\n );\n if (rewritten) next.push(rewritten);\n }\n (section as Record<string, unknown>)[\"components\"] = next;\n }\n }\n}\n\nexport type ResolveComponentsFn = (opts: {\n storeId: string;\n ids: string[];\n}) => Promise<{\n resolved: Record<string, ResolvedLibraryEntry>;\n missing?: string[];\n}>;\n\n/**\n * Resolve marketplace/library `refId`s against `sourceStoreId` and inline\n * them as `custom` so local `feeef template dev` does not depend on the\n * destination store owning those library rows.\n */\nexport async function materializeTemplateReferences(opts: {\n data: Record<string, unknown>;\n sourceStoreId: string;\n resolve: ResolveComponentsFn;\n}): Promise<{ resolved: number; missing: string[] }> {\n const catalog: Record<string, ResolvedLibraryEntry> = {};\n const allMissing = new Set<string>();\n let resolvedCount = 0;\n\n for (let round = 0; round < MAX_REF_ROUNDS; round++) {\n const ids = [...collectTemplateRefIds(opts.data)].filter(\n (id) => !(id in catalog),\n );\n if (ids.length === 0) break;\n\n const res = await opts.resolve({\n storeId: opts.sourceStoreId,\n ids,\n });\n const batch = res.resolved ?? {};\n for (const [id, entry] of Object.entries(batch)) {\n catalog[id] = entry;\n resolvedCount += 1;\n }\n for (const id of res.missing ?? []) allMissing.add(id);\n\n rewriteReferencesInTemplateData(opts.data, catalog);\n if (Object.keys(batch).length === 0) break;\n }\n\n const leftover = [...collectTemplateRefIds(opts.data)];\n for (const id of leftover) allMissing.add(id);\n\n return {\n resolved: resolvedCount,\n missing: [...allMissing],\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { createClient } from \"../../client.js\";\nimport { saveConfig } from \"../../config.js\";\nimport { cliRoot, loadBuild } from \"../../kit.js\";\nimport {\n loadProjectRc,\n loadTemplateMeta,\n resolveStoreIdFromProject,\n resolveThemeDir,\n saveProjectRc,\n} from \"../../project.js\";\nimport {\n collectPublishableComponents,\n loadDistLocales,\n rewriteDataToReferences,\n stripDataI18n,\n} from \"../../theme.js\";\nimport { askApply } from \"../use.js\";\nimport {\n fail,\n info,\n intro,\n ok,\n outro,\n pc,\n spinner,\n warn,\n} from \"../../ui.js\";\n\nconst SOURCE_TAG_PREFIX = \"feeef-source:\";\n\nexport interface PublishOptions {\n public?: boolean;\n unlisted?: boolean;\n store?: string;\n title?: string;\n yes?: boolean;\n apply?: boolean;\n /** Commander --no-apply sets apply=false */\n}\n\nexport async function runTemplatePublish(\n dirArg: string | undefined,\n opts: PublishOptions & { apply?: boolean },\n): Promise<void> {\n intro(\"feeef template publish\");\n try {\n const { ff, http, cfg } = createClient();\n const srcDir = resolveThemeDir(dirArg);\n const meta = loadTemplateMeta(srcDir);\n const rc = loadProjectRc(srcDir);\n\n const policy = opts.public\n ? \"public\"\n : opts.unlisted\n ? \"unlisted\"\n : \"private\";\n\n let storeId = resolveStoreIdFromProject({\n themeRoot: srcDir,\n globalCfg: cfg,\n ...(opts.store ? { storeFlag: opts.store } : {}),\n });\n\n if (!storeId) {\n const listed = await ff.stores.list({ limit: 50 });\n const stores = listed.data || [];\n if (stores.length === 0) fail(\"No stores on this account\");\n if (stores.length === 1 || opts.yes) {\n storeId = stores[0]!.id;\n } else {\n fail(\"No store linked. Run: feeef use <storeId|slug>\");\n }\n }\n\n const store = await ff.stores.find({ id: storeId! });\n const title =\n opts.title || rc.title || meta.name || path.basename(srcDir);\n\n info(`Theme ${srcDir}`);\n info(`Store ${store.slug || storeId} (${policy})`);\n\n const outPath = path.join(srcDir, \"dist\", \"data.json\");\n const s = spinner();\n s.start(\"Building…\");\n const { buildTemplate } = await loadBuild();\n const built = buildTemplate({ srcDir, outPath, write: true });\n for (const w of built.warnings || []) {\n warn(`[${w.path}] ${w.message}`);\n }\n s.stop(`Built (${built.localeCount ?? 0} locales)`);\n\n const dataRaw = JSON.parse(fs.readFileSync(outPath, \"utf8\")) as Record<\n string,\n unknown\n >;\n const i18n = dataRaw[\"i18n\"] as\n | { defaultLocale?: string }\n | undefined;\n const defaultLocale =\n i18n?.defaultLocale ||\n (typeof meta.defaultLocale === \"string\" ? meta.defaultLocale : \"en\");\n\n const distSchemaPath = path.join(srcDir, \"dist\", \"schema.json\");\n let schema: Record<string, unknown>;\n if (fs.existsSync(distSchemaPath)) {\n schema = JSON.parse(fs.readFileSync(distSchemaPath, \"utf8\")) as Record<\n string,\n unknown\n >;\n } else {\n // Fallback if dist is stale: merge Lithium + theme overlay at publish time.\n const { buildPackagedSchema } = await import(\n pathToFileURL(\n path.join(cliRoot(), \"vendor/template-kit/lib/theme-schema.mjs\"),\n ).href\n );\n const { schema: packed } = buildPackagedSchema({\n srcDir,\n libraryDoc: fs.existsSync(path.join(srcDir, \"dist\", \"schema.library.json\"))\n ? (JSON.parse(\n fs.readFileSync(\n path.join(srcDir, \"dist\", \"schema.library.json\"),\n \"utf8\",\n ),\n ) as { components?: unknown[] })\n : { components: [] },\n });\n schema = packed as Record<string, unknown>;\n }\n\n // Ensure library is present even if an older dist/schema.json omitted it.\n const libraryPath = path.join(srcDir, \"dist\", \"schema.library.json\");\n if (fs.existsSync(libraryPath) && schema[\"library\"] == null) {\n const libDoc = JSON.parse(fs.readFileSync(libraryPath, \"utf8\")) as {\n library?: unknown;\n components?: unknown;\n };\n schema = {\n ...schema,\n library: libDoc.library ?? libDoc.components ?? libDoc,\n };\n }\n\n if (typeof schema[\"name\"] !== \"string\" || !schema[\"name\"]) {\n schema = { ...schema, name: title };\n }\n\n s.start(\"Publishing template_components…\");\n const publishables = collectPublishableComponents(srcDir);\n const codeToRefId = new Map<string, string>();\n const sourceKeyToRefId = new Map<string, string>();\n\n const existingList = await ff.templateComponents.list({\n storeId: storeId!,\n limit: 200,\n });\n const existingBySource = new Map<\n string,\n { id: string; tags?: string[] }\n >();\n for (const row of existingList.data || []) {\n const tag = (row.tags || []).find((t: string) =>\n String(t).startsWith(SOURCE_TAG_PREFIX),\n );\n if (tag) {\n existingBySource.set(\n String(tag).slice(SOURCE_TAG_PREFIX.length),\n row,\n );\n }\n }\n\n for (const comp of publishables) {\n const tags = [\n ...(Array.isArray(comp.meta[\"tags\"])\n ? (comp.meta[\"tags\"] as string[])\n : []),\n `${SOURCE_TAG_PREFIX}${comp.sourceKey}`,\n `feeef-kind:${comp.kind}`,\n ];\n const payload = {\n storeId: storeId!,\n title: (comp.meta[\"title\"] as string) || comp.sourceKey,\n subtitle: (comp.meta[\"subtitle\"] as string | null) ?? null,\n category: (comp.meta[\"category\"] as string) ?? comp.kind,\n tags,\n imageUrl: (comp.meta[\"imageUrl\"] as string | null) ?? null,\n code: comp.code,\n propsSchema: (comp.meta[\"propsSchema\"] as Record<string, unknown>) || {},\n slotsSchema: (comp.meta[\"slotsSchema\"] as Record<string, unknown> | null) ?? null,\n propsDefault:\n (comp.meta[\"props\"] as Record<string, unknown>) ||\n (comp.meta[\"propsDefault\"] as Record<string, unknown>) ||\n {},\n slotsDefault: (comp.meta[\"slotsDefault\"] as Record<string, unknown> | null) ?? null,\n slotsLayout: (comp.meta[\"slotsLayout\"] as Record<string, unknown> | null) ?? null,\n policy,\n price: 0,\n };\n\n const existing = existingBySource.get(comp.sourceKey);\n let row: { id: string };\n if (existing) {\n row = await ff.templateComponents.update({\n id: existing.id,\n data: {\n title: payload.title,\n subtitle: payload.subtitle,\n category: payload.category,\n tags: payload.tags,\n imageUrl: payload.imageUrl,\n code: payload.code,\n propsSchema: payload.propsSchema,\n slotsSchema: payload.slotsSchema,\n propsDefault: payload.propsDefault,\n slotsDefault: payload.slotsDefault,\n slotsLayout: payload.slotsLayout,\n policy: payload.policy as never,\n },\n });\n } else {\n row = await ff.templateComponents.create(payload as never);\n }\n codeToRefId.set(comp.code.trim(), row.id);\n sourceKeyToRefId.set(comp.sourceKey, row.id);\n }\n s.stop(`${publishables.length} components`);\n\n let data = rewriteDataToReferences(dataRaw, codeToRefId) as Record<\n string,\n unknown\n >;\n data = stripDataI18n(data);\n\n if (Array.isArray(schema[\"library\"])) {\n schema[\"library\"] = (schema[\"library\"] as Record<string, unknown>[]).map(\n (entry) => {\n const key = (entry[\"libraryId\"] || entry[\"id\"]) as string | undefined;\n if (key && sourceKeyToRefId.has(key)) {\n return { ...entry, refId: sourceKeyToRefId.get(key) };\n }\n return entry;\n },\n );\n }\n\n s.start(\"Publishing store_templates…\");\n let templateId =\n rc.templateId || cfg.lastPublishedTemplateId || undefined;\n let templateRow: { id: string; storeId: string } | null = null;\n\n if (templateId) {\n try {\n templateRow = await ff.storeTemplates.find({ id: templateId });\n if (templateRow && templateRow.storeId !== storeId) {\n templateRow = null;\n templateId = undefined;\n }\n } catch {\n templateRow = null;\n templateId = undefined;\n }\n }\n\n if (!templateRow) {\n const listed = await ff.storeTemplates.list({\n storeId: storeId!,\n limit: 50,\n q: title,\n });\n templateRow =\n (listed.data || []).find(\n (t: { storeId: string; title: string; id: string }) =>\n t.storeId === storeId && t.title === title,\n ) || null;\n templateId = templateRow?.id;\n }\n\n if (templateRow) {\n templateRow = await ff.storeTemplates.update({\n id: templateRow.id,\n data: { title, schema, data, policy: policy as never },\n });\n s.stop(`Updated ${templateRow.id}`);\n } else {\n templateRow = await ff.storeTemplates.create({\n storeId: storeId!,\n title,\n schema,\n data,\n policy: policy as never,\n price: 0,\n } as never);\n s.stop(`Created ${templateRow.id}`);\n }\n\n templateId = templateRow.id;\n saveConfig({\n defaultStoreId: storeId!,\n lastPublishedTemplateId: templateId,\n });\n saveProjectRc(srcDir, {\n store: storeId!,\n slug: store.slug,\n templateId,\n title,\n });\n\n const locales = loadDistLocales(path.join(srcDir, \"dist\"), defaultLocale);\n if (locales.length) {\n s.start(`Uploading ${locales.length} locales…`);\n if (typeof ff.storeTemplates.replaceLocales === \"function\") {\n await ff.storeTemplates.replaceLocales(templateId, locales);\n } else {\n await http.put(`/store_templates/${templateId}/locales`, { locales });\n }\n s.stop(`Locales: ${locales.map((l) => l.locale).join(\", \")}`);\n }\n\n const shouldApply =\n opts.yes && opts.apply !== false\n ? true\n : await askApply(store.slug || storeId!, opts.apply);\n\n if (shouldApply) {\n s.start(\"Installing on store…\");\n await ff.storeTemplates.install({\n fromId: templateId,\n storeId: storeId!,\n });\n s.stop(\"Installed\");\n const preview = `https://${store.slug}.feeef.store`;\n ok(`Preview ${pc.cyan(preview)}`);\n outro(preview);\n } else {\n ok(`Template id ${templateId}`);\n outro(\"Skipped install (use --apply next time)\");\n }\n } catch (e) {\n fail(e);\n }\n}\n","import type { FeeeF } from \"feeef\";\nimport { createClient } from \"../client.js\";\nimport { saveConfig } from \"../config.js\";\nimport { findThemeRoot, saveProjectRc } from \"../project.js\";\nimport {\n confirm,\n fail,\n info,\n intro,\n ok,\n outro,\n pc,\n select,\n spinner,\n} from \"../ui.js\";\n\ninterface StoreRow {\n id: string;\n slug?: string;\n name?: string;\n}\n\nconst PAGE_SIZE = 20;\nconst LOAD_MORE = \"__load_more__\";\n\nfunction formatStoreLabel(store: StoreRow): string {\n const title = store.name || store.slug || store.id;\n if (store.slug && store.name && store.slug !== store.name) {\n return `${store.name} (${store.slug})`;\n }\n return title;\n}\n\n/**\n * Interactive store picker with page-by-page \"Load more…\".\n * Only lists stores owned by or shared with the signed-in user.\n */\nexport async function pickStoreInteractive(ff: FeeeF): Promise<StoreRow> {\n const me = await ff.users.me();\n const userId = me.user?.id;\n if (!userId) {\n fail(\"Could not resolve the signed-in user. Run: feeef signin\");\n }\n\n let page = 1;\n const accumulated: StoreRow[] = [];\n let total: number | undefined;\n\n for (;;) {\n const s = spinner();\n s.start(page === 1 ? \"Loading your stores…\" : `Loading more (page ${page})…`);\n const res = await ff.stores.list({\n page,\n limit: PAGE_SIZE,\n userId,\n });\n s.stop(page === 1 ? \"Stores loaded\" : \"More stores loaded\");\n\n const batch = (res.data || []) as StoreRow[];\n if (typeof res.total === \"number\") total = res.total;\n accumulated.push(...batch);\n\n if (accumulated.length === 0) {\n fail(\"No stores on this account\");\n }\n\n const hasMore =\n batch.length >= PAGE_SIZE &&\n (total == null || accumulated.length < total);\n\n // Single store and nothing else to fetch — skip the menu.\n if (accumulated.length === 1 && !hasMore) {\n return accumulated[0]!;\n }\n\n const options: { value: string; label: string; hint?: string }[] = [\n ...accumulated.map((st) => ({\n value: st.id,\n label: formatStoreLabel(st),\n hint: st.id,\n })),\n ];\n\n if (hasMore) {\n const hint =\n total != null\n ? `${accumulated.length} of ${total}`\n : `loaded ${accumulated.length}`;\n options.push({\n value: LOAD_MORE,\n label: `${pc.dim(\"→\")} Load more…`,\n hint,\n });\n }\n\n const chosen = await select({\n message: \"Pick a store\",\n options,\n });\n\n if (chosen === LOAD_MORE) {\n page += 1;\n continue;\n }\n\n const picked = accumulated.find((st) => st.id === chosen);\n if (!picked) fail(\"Selected store not found\");\n return picked;\n }\n}\n\nexport async function runUse(\n storeArg: string | undefined,\n opts: { apiUrl?: string },\n): Promise<void> {\n intro(\"feeef use\");\n try {\n const themeRoot = findThemeRoot(process.cwd());\n if (!themeRoot) {\n fail(\n \"No feeef.template.json nearby. Run from a theme folder or feeef template init first.\",\n );\n }\n\n const { ff } = createClient();\n let storeId: string;\n let slug: string | undefined;\n\n if (!storeArg) {\n const picked = await pickStoreInteractive(ff);\n storeId = picked.id;\n slug = picked.slug;\n if (slug || picked.name) {\n info(`Selected ${formatStoreLabel(picked)}`);\n }\n } else {\n try {\n const bySlug = await ff.stores.find({ id: storeArg, by: \"slug\" });\n storeId = bySlug.id;\n slug = bySlug.slug;\n } catch {\n const byId = await ff.stores.find({ id: storeArg });\n storeId = byId.id;\n slug = byId.slug;\n }\n }\n\n const patch: {\n store: string;\n slug?: string;\n apiUrl?: string;\n } = { store: storeId };\n if (slug) patch.slug = slug;\n if (opts.apiUrl) patch.apiUrl = opts.apiUrl;\n\n const { rcPath } = saveProjectRc(themeRoot, patch);\n saveConfig({ defaultStoreId: storeId });\n\n ok(`Linked theme → store ${slug || storeId}`);\n info(rcPath);\n outro(\"Next: feeef template publish --apply\");\n } catch (e) {\n fail(e);\n }\n}\n\nexport async function askApply(\n slug: string,\n force?: boolean,\n): Promise<boolean> {\n if (force === true) return true;\n if (force === false) return false;\n return confirm({\n message: `Apply template to store \"${slug}\"?`,\n initialValue: true,\n });\n}\n","import path from \"node:path\";\nimport { resolveThemeDir } from \"../../project.js\";\nimport { removeComponent, removePage } from \"../../theme-scaffold.js\";\nimport { confirm, fail, intro, ok, outro } from \"../../ui.js\";\n\nexport async function runTemplateRemovePage(\n pageId: string | undefined,\n opts: { dir?: string; yes?: boolean } = {},\n): Promise<void> {\n intro(\"feeef template remove page\");\n try {\n if (!pageId?.trim()) {\n fail(\"Usage: feeef template remove page <pageId>\");\n }\n const themeRoot = resolveThemeDir(opts.dir);\n if (!opts.yes) {\n const go = await confirm({\n message: `Delete pages/${pageId}/ and remove it from feeef.template.json?`,\n initialValue: false,\n });\n if (!go) {\n outro(\"Cancelled\");\n return;\n }\n }\n const { pageId: id, removedPath } = removePage(themeRoot, pageId!);\n ok(`Removed ${path.relative(themeRoot, removedPath)}`);\n outro(`Page \"${id}\" deleted`);\n } catch (err) {\n fail(err instanceof Error ? err.message : String(err));\n }\n}\n\nexport async function runTemplateRemoveComponent(\n pageId: string | undefined,\n componentId: string | undefined,\n opts: { dir?: string; section?: string; yes?: boolean } = {},\n): Promise<void> {\n intro(\"feeef template remove component\");\n try {\n if (!pageId?.trim() || !componentId?.trim()) {\n fail(\"Usage: feeef template remove component <pageId> <componentId>\");\n }\n const themeRoot = resolveThemeDir(opts.dir);\n if (!opts.yes) {\n const go = await confirm({\n message: `Delete component ${pageId}/${componentId}?`,\n initialValue: false,\n });\n if (!go) {\n outro(\"Cancelled\");\n return;\n }\n }\n const { removedPath } = removeComponent(themeRoot, pageId!, componentId!, {\n ...(opts.section ? { section: opts.section } : {}),\n });\n ok(`Removed ${path.relative(themeRoot, removedPath)}`);\n outro(\"Done\");\n } catch (err) {\n fail(err instanceof Error ? err.message : String(err));\n }\n}\n","import { spawn } from \"node:child_process\";\nimport path from \"node:path\";\nimport { kitBin, loadBuild } from \"../../kit.js\";\nimport { resolveThemeDir } from \"../../project.js\";\nimport { fail, info, intro, outro, spinner } from \"../../ui.js\";\n\nexport async function runTemplateWatch(dirArg?: string): Promise<void> {\n intro(\"feeef template watch\");\n try {\n const srcDir = resolveThemeDir(dirArg);\n const outPath = path.join(srcDir, \"dist\", \"data.json\");\n\n const s = spinner();\n s.start(\"Initial build…\");\n const { buildTemplate } = await loadBuild();\n buildTemplate({ srcDir, outPath, write: true });\n s.stop(`Watching ${srcDir}`);\n\n info(`Output → ${outPath}`);\n info(\"Ctrl+C to stop\");\n\n const child = spawn(\n process.execPath,\n [kitBin(), \"watch\", srcDir, \"-o\", outPath],\n { stdio: \"inherit\" },\n );\n\n await new Promise<void>((resolve, reject) => {\n child.on(\"exit\", (code) => {\n if (code && code !== 0) reject(new Error(`watch exited ${code}`));\n else resolve();\n });\n });\n\n outro(\"Stopped\");\n } catch (e) {\n fail(e);\n }\n}\n"],"mappings":"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","names":["http","axios","FeeeF","axios","FeeeF","intro","outro","note","cancel","text","password","confirm","select","spinner","intro","s","spinner","note","outro","text","password","path","fs","path","fs","path","path","fs","p","intro","outro","path","path","fs","path","intro","path","spinner","outro","fs","path","fs","path","fs","path","path","spinner","fs","note","outro","intro","fs","os","path","fs","path","path","fs","path","fs","fs","path","fs","path","fs","path","copyDir","fs","path","spinner","select","text","os","intro","outro","fs","path","pathToFileURL","PAGE_SIZE","LOAD_MORE","spinner","select","intro","outro","confirm","intro","http","path","spinner","fs","pathToFileURL","outro","path","intro","confirm","outro","path","spawn","path","intro","path","spinner","spawn","outro"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/config.ts","../src/oauth.ts","../src/ui.ts","../src/commands/auth.ts","../src/commands/template/add.ts","../src/project.ts","../src/theme-scaffold.ts","../src/commands/template/build.ts","../src/kit.ts","../src/commands/template/dev.ts","../src/storefront.ts","../src/dev-error-server.ts","../src/dev-error-format.ts","../src/commands/template/init.ts","../src/kits.ts","../src/theme-package.ts","../src/theme.ts","../src/commands/template/publish.ts","../src/commands/use.ts","../src/commands/template/smoke.ts","../src/commands/template/remove.ts","../src/commands/template/watch.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport {\n runConfigSet,\n runConfigShow,\n runSignin,\n runSignout,\n runWhoami,\n} from \"./commands/auth.js\";\nimport {\n runTemplateAddComponent,\n runTemplateAddPage,\n} from \"./commands/template/add.js\";\nimport { runTemplateBuild } from \"./commands/template/build.js\";\nimport { runTemplateDev } from \"./commands/template/dev.js\";\nimport { runTemplateInit } from \"./commands/template/init.js\";\nimport { runTemplatePublish } from \"./commands/template/publish.js\";\nimport { runTemplateSmoke } from \"./commands/template/smoke.js\";\nimport {\n runTemplateRemoveComponent,\n runTemplateRemovePage,\n} from \"./commands/template/remove.js\";\nimport { runTemplateWatch } from \"./commands/template/watch.js\";\nimport { runUse } from \"./commands/use.js\";\nimport { banner, pc } from \"./ui.js\";\n\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name(\"feeef\")\n .description(\"Feeef developer CLI — templates today, cloud tools tomorrow\")\n .version(\"0.2.0\")\n .hook(\"preAction\", (thisCommand) => {\n // Skip banner for nested help\n if (thisCommand.args.length === 0) return;\n banner();\n });\n\n program\n .command(\"signin\")\n .description(\"Sign in via browser OAuth (or --password-auth)\")\n .option(\"-e, --email <email>\", \"Account email (password auth)\")\n .option(\n \"--password-auth\",\n \"Use email/password instead of browser OAuth (prompts for password)\",\n )\n .option(\"--api-url <url>\", \"API base URL\")\n .action(async (opts) => {\n await runSignin({\n email: opts.email,\n apiUrl: opts.apiUrl,\n passwordAuth: opts.passwordAuth,\n });\n });\n\n program\n .command(\"whoami\")\n .description(\"Show the signed-in user\")\n .action(async () => {\n await runWhoami();\n });\n\n program\n .command(\"signout\")\n .description(\"Clear saved token\")\n .action(() => {\n runSignout();\n });\n\n const config = program\n .command(\"config\")\n .description(\"Show or set CLI config (~/.config/feeef)\");\n\n config\n .command(\"show\", { isDefault: true })\n .description(\"Print non-secret config\")\n .action(() => {\n runConfigShow();\n });\n\n config\n .command(\"set\")\n .description(\"Set a config key\")\n .argument(\"<key>\", \"apiUrl | defaultStoreId | storefrontPath | devPort | …\")\n .argument(\"<value>\", \"Value\")\n .action((key: string, value: string) => {\n runConfigSet(key, value);\n });\n\n program\n .command(\"use\")\n .description(\n \"Link template to a store (.feeefrc); omit store to pick from your list\",\n )\n .argument(\"[store]\", \"Store id or slug (optional — interactive picker)\")\n .option(\"--api-url <url>\", \"API override for this template\")\n .action(async (store, opts) => {\n await runUse(store, opts);\n });\n\n // Top-level aliases for the common path\n program\n .command(\"publish\")\n .description(\"Build + publish current template (alias of template publish)\")\n .argument(\"[dir]\", \"Template directory\")\n .option(\"--public\", \"Policy public (default private)\")\n .option(\"--unlisted\", \"Policy unlisted\")\n .option(\"--store <id>\", \"Owner store id\")\n .option(\"--title <title>\", \"Marketplace title\")\n .option(\"--yes\", \"Skip prompts\")\n .option(\"--apply\", \"Install onto the store\")\n .option(\"--no-apply\", \"Do not install\")\n .action(async (dir, opts) => {\n await runTemplatePublish(dir, opts);\n });\n\n const template = program\n .command(\"template\")\n .description(\n \"Template kit: init, add/remove page|component, build, check, smoke, watch, dev, publish\",\n );\n\n template\n .command(\"init\")\n .description(\n \"Scaffold a template (blank, git kit, or public marketplace)\",\n )\n .argument(\"[name]\", \"Folder name\")\n .option(\"--blank\", \"Use the blank scaffold (skip picker)\")\n .option(\"--from <templateId>\", \"Clone a public template by id\")\n .option(\"--git <url>\", \"Clone a kit repo (depth 1), Adonis/Laravel style\")\n .option(\"-q, --search <query>\", \"Pre-fill marketplace search\")\n .action(async (name, opts) => {\n await runTemplateInit(name, {\n blank: opts.blank,\n from: opts.from,\n search: opts.search,\n git: opts.git,\n });\n });\n\n const templateAdd = template\n .command(\"add\")\n .description(\"Add a page or component to the current template\");\n\n templateAdd\n .command(\"page\")\n .description(\"Create pages/<pageId>/ with flat components/ + update manifest\")\n .argument(\"<pageId>\", \"Page id (e.g. home, checkout, thank_you)\")\n .option(\"--dir <path>\", \"Template directory\")\n .action(async (pageId, opts) => {\n await runTemplateAddPage(pageId, { dir: opts.dir });\n });\n\n templateAdd\n .command(\"component\")\n .description(\n \"Create a starter <name>.tsx under pages/<page>/components/ (or sections/main)\",\n )\n .argument(\"<pageId>\", \"Page id\")\n .argument(\"<componentId>\", \"Component file id (e.g. hero)\")\n .option(\"--title <title>\", \"meta.title (default: Title Case of id)\")\n .option(\n \"--section <id>\",\n \"Legacy: write under sections/<id>/components/ instead of flat\",\n )\n .option(\"--dir <path>\", \"Template directory\")\n .action(async (pageId, componentId, opts) => {\n await runTemplateAddComponent(pageId, componentId, {\n dir: opts.dir,\n title: opts.title,\n section: opts.section,\n });\n });\n\n const templateRemove = template\n .command(\"remove\")\n .description(\"Remove a page or component from the current template\");\n\n templateRemove\n .command(\"page\")\n .description(\"Delete pages/<pageId>/ and drop it from feeef.template.json\")\n .argument(\"<pageId>\", \"Page id\")\n .option(\"-y, --yes\", \"Skip confirmation\")\n .option(\"--dir <path>\", \"Template directory\")\n .action(async (pageId, opts) => {\n await runTemplateRemovePage(pageId, { dir: opts.dir, yes: opts.yes });\n });\n\n templateRemove\n .command(\"component\")\n .description(\"Delete a component file/folder under a page\")\n .argument(\"<pageId>\", \"Page id\")\n .argument(\"<componentId>\", \"Component id\")\n .option(\"--section <id>\", \"Legacy: only search sections/<id>/components/\")\n .option(\"-y, --yes\", \"Skip confirmation\")\n .option(\"--dir <path>\", \"Template directory\")\n .action(async (pageId, componentId, opts) => {\n await runTemplateRemoveComponent(pageId, componentId, {\n dir: opts.dir,\n section: opts.section,\n yes: opts.yes,\n });\n });\n\n template\n .command(\"build\")\n .description(\"Compile template → dist/data.json\")\n .argument(\"[dir]\", \"Template directory\")\n .action(async (dir) => {\n await runTemplateBuild(dir);\n });\n\n template\n .command(\"check\")\n .description(\"Validate template without writing dist\")\n .argument(\"[dir]\", \"Template directory\")\n .action(async (dir) => {\n await runTemplateBuild(dir, { checkOnly: true });\n });\n\n template\n .command(\"smoke\")\n .description(\n \"Build + SSR-eval every custom App() (catches broken components)\",\n )\n .argument(\"[dir]\", \"Template directory\")\n .option(\"--no-build\", \"Use existing dist/data.json only\")\n .action(async (dir, opts) => {\n await runTemplateSmoke(dir, { noBuild: Boolean(opts.noBuild) });\n });\n\n template\n .command(\"watch\")\n .description(\"Rebuild on file changes\")\n .argument(\"[dir]\", \"Template directory\")\n .action(async (dir) => {\n await runTemplateWatch(dir);\n });\n\n template\n .command(\"dev\")\n .description(\n \"Watch + push draft preview to hosted storefront (never overwrites live template)\",\n )\n .argument(\"[dir]\", \"Template directory\")\n .option(\"-p, --port <port>\", \"Local Next port (only with --local)\")\n .option(\"--storefront <path>\", \"Lithium storefront root (implies --local)\")\n .option(\n \"--local\",\n \"Employee escape hatch: spawn local Next (requires storefront)\",\n )\n .action(async (dir, opts) => {\n await runTemplateDev(dir, opts);\n });\n\n template\n .command(\"publish\")\n .description(\"Build, upload components + template + locales, optional install\")\n .argument(\"[dir]\", \"Template directory\")\n .option(\"--public\", \"Policy public (default private)\")\n .option(\"--unlisted\", \"Policy unlisted\")\n .option(\"--store <id>\", \"Owner store id\")\n .option(\"--title <title>\", \"Marketplace title\")\n .option(\"--yes\", \"Skip prompts\")\n .option(\"--apply\", \"Install onto the store\")\n .option(\"--no-apply\", \"Do not install\")\n .action(async (dir, opts) => {\n await runTemplatePublish(dir, opts);\n });\n\n // Future extension points (stubs)\n const cloud = program\n .command(\"cloud\")\n .description(\"Cloud providers (Azure / GCP / AWS) — coming soon\");\n\n cloud\n .command(\"azure\")\n .description(\"Azure helpers (coming soon)\")\n .action(() => {\n console.log(pc.dim(\"Not implemented yet. Tracked for a future release.\"));\n });\n\n cloud\n .command(\"gcp\")\n .description(\"Google Cloud helpers (coming soon)\")\n .action(() => {\n console.log(pc.dim(\"Not implemented yet.\"));\n });\n\n cloud\n .command(\"aws\")\n .description(\"AWS helpers (coming soon)\")\n .action(() => {\n console.log(pc.dim(\"Not implemented yet.\"));\n });\n\n return program;\n}\n\nexport async function runCli(argv = process.argv): Promise<void> {\n const program = createProgram();\n await program.parseAsync(argv);\n}\n","import axios, { type AxiosInstance } from \"axios\";\nimport { FeeeF } from \"feeef\";\nimport {\n defaultApiUrl,\n loadConfig,\n saveConfig,\n type FeeefCliConfig,\n} from \"./config.js\";\n\nexport interface FeeefClientBundle {\n ff: FeeeF;\n http: AxiosInstance;\n cfg: FeeefCliConfig;\n baseURL: string;\n token: string | undefined;\n}\n\nfunction createHttp(baseURL: string, token: string | undefined): AxiosInstance {\n return axios.create({\n baseURL,\n maxBodyLength: Infinity,\n maxContentLength: Infinity,\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n },\n });\n}\n\nexport function createClient(opts: { requireAuth?: boolean } = {}): FeeefClientBundle {\n const requireAuth = opts.requireAuth !== false;\n const cfg = loadConfig();\n const baseURL = defaultApiUrl(cfg);\n const token = cfg.token;\n\n if (requireAuth && !token) {\n throw new Error(\"Not signed in. Run: feeef signin\");\n }\n\n const http = createHttp(baseURL, token);\n // feeef.js bundles its own axios types — cast at the boundary.\n const ff = new FeeeF({\n apiKey: token || \"\",\n baseURL,\n client: http as never,\n cache: false,\n });\n\n return { ff, http, cfg, baseURL, token };\n}\n\nexport async function signinWithPassword(input: {\n email: string;\n password: string;\n apiUrl?: string;\n}): Promise<{ user?: { email?: string }; token?: { token?: string } }> {\n const baseURL = (input.apiUrl || defaultApiUrl()).replace(/\\/$/, \"\");\n const http = createHttp(baseURL, undefined);\n const ff = new FeeeF({\n apiKey: \"\",\n baseURL,\n client: http as never,\n cache: false,\n });\n const auth = await ff.users.signin({\n email: input.email,\n password: input.password,\n });\n const token = auth?.token?.token;\n if (!token) {\n throw new Error(\"Signin succeeded but no token was returned\");\n }\n ff.setHeader(\"Authorization\", `Bearer ${token}`);\n saveConfig({ token, email: input.email, apiUrl: baseURL });\n return auth;\n}\n","import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nexport interface FeeefCliConfig {\n token?: string;\n apiUrl?: string;\n email?: string;\n defaultStoreId?: string;\n lastPublishedTemplateId?: string;\n /**\n * Absolute path to Lithium storefront — only used with `feeef template dev --local`\n * (Feeef employees / monorepo). Public authors use remote draft preview.\n */\n storefrontPath?: string;\n /** Default local preview port for `--local` (default 3456). */\n devPort?: number;\n}\n\nconst CONFIG_DIR = path.join(os.homedir(), \".config\", \"feeef\");\nconst CONFIG_PATH = path.join(CONFIG_DIR, \"config.json\");\n\nconst DIR_MODE = 0o700;\nconst FILE_MODE = 0o600;\n\nfunction ensureConfigDir(): void {\n fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: DIR_MODE });\n try {\n fs.chmodSync(CONFIG_DIR, DIR_MODE);\n } catch {\n /* best-effort on platforms that ignore mode */\n }\n}\n\nfunction writeConfigFile(data: FeeefCliConfig): void {\n ensureConfigDir();\n const body = `${JSON.stringify(data, null, 2)}\\n`;\n fs.writeFileSync(CONFIG_PATH, body, { encoding: \"utf8\", mode: FILE_MODE });\n try {\n fs.chmodSync(CONFIG_PATH, FILE_MODE);\n } catch {\n /* best-effort */\n }\n}\n\nexport function configDir(): string {\n return CONFIG_DIR;\n}\n\nexport function configPath(): string {\n return CONFIG_PATH;\n}\n\nexport function loadConfig(): FeeefCliConfig {\n try {\n if (!fs.existsSync(CONFIG_PATH)) return {};\n return JSON.parse(fs.readFileSync(CONFIG_PATH, \"utf8\")) as FeeefCliConfig;\n } catch {\n return {};\n }\n}\n\nexport function saveConfig(patch: Partial<FeeefCliConfig>): FeeefCliConfig {\n const next: FeeefCliConfig = { ...loadConfig(), ...patch };\n for (const key of Object.keys(next) as (keyof FeeefCliConfig)[]) {\n const value = next[key];\n if (value === undefined || value === null || value === \"\") {\n delete next[key];\n }\n }\n writeConfigFile(next);\n return next;\n}\n\nexport function clearAuth(): void {\n const cfg = loadConfig();\n delete cfg.token;\n delete cfg.email;\n writeConfigFile(cfg);\n}\n\nexport function defaultApiUrl(cfg: FeeefCliConfig = loadConfig()): string {\n return (\n process.env[\"FEEEF_API_BASE_URL\"] ||\n cfg.apiUrl ||\n \"https://api.feeef.org/v1\"\n ).replace(/\\/$/, \"\");\n}\n\nexport function defaultDevPort(cfg: FeeefCliConfig = loadConfig()): number {\n const fromEnv = Number(process.env[\"FEEEF_DEV_PORT\"]);\n if (Number.isFinite(fromEnv) && fromEnv > 0) return fromEnv;\n if (typeof cfg.devPort === \"number\" && cfg.devPort > 0) return cfg.devPort;\n return 3456;\n}\n","import crypto from \"node:crypto\";\nimport http from \"node:http\";\nimport { exec } from \"node:child_process\";\nimport axios from \"axios\";\nimport { FeeeF, OAuthRepository } from \"feeef\";\nimport { defaultApiUrl, saveConfig } from \"./config.js\";\n\n/** Public OAuth app id for the Feeef CLI (safe to ship). */\nexport const DEFAULT_OAUTH_CLIENT_ID = \"gan5yqm11fk4eh1ayheelkcs\";\n\n/** Exact redirect registered on the OAuth app (http, not https). */\nexport const DEFAULT_OAUTH_REDIRECT_URI =\n \"http://localhost.feeef.org:7777/oauth/callback\";\n\nexport const DEFAULT_OAUTH_CALLBACK_PORT = 7777;\n\n/**\n * Scopes requested by the CLI (no wildcard `*`).\n * Must be allowed on the OAuth app; owners typically grant store + template access.\n */\nexport const DEFAULT_CLI_OAUTH_SCOPES = [\n \"auth\",\n \"store\",\n \"store.settings\",\n \"store_templates\",\n \"store_templates.read\",\n] as const;\n\nexport interface OAuthCliSettings {\n clientId: string;\n /** Optional — only for confidential apps / local overrides. */\n clientSecret?: string;\n redirectUri: string;\n callbackPort: number;\n /** API base for token exchange (…/v1). */\n apiUrl: string;\n /** Origin (or API base) used to build the browser authorize URL. */\n authorizeBaseUrl: string;\n scopes: string[];\n}\n\n/** Strip path/query so authorize URLs never include /api/v1. */\nfunction originOnly(raw: string): string {\n try {\n const u = new URL(raw);\n return `${u.protocol}//${u.host}`;\n } catch {\n return raw.replace(/\\/$/, \"\");\n }\n}\n\n/**\n * Prefer accounts host for the browser authorize step (origin only — no /api/v1).\n * Token exchange still uses the API base.\n */\nexport function resolveAuthorizeBaseUrl(apiUrl: string): string {\n const fromEnv =\n process.env[\"FEEEF_ACCOUNTS_URL\"]?.trim() ||\n process.env[\"FEEEF_OAUTH_AUTHORIZE_BASE_URL\"]?.trim();\n if (fromEnv) return originOnly(fromEnv);\n\n try {\n const u = new URL(apiUrl);\n if (u.hostname === \"api.feeef.org\") {\n return \"https://accounts.feeef.org\";\n }\n if (u.hostname.startsWith(\"api.\")) {\n const host = u.hostname.replace(/^api\\./, \"accounts.\");\n const port = u.port ? `:${u.port}` : \"\";\n return `${u.protocol}//${host}${port}`;\n }\n // Path-style local API (http://127.0.0.1:3333/api/v1) → accounts host.\n // Accounts mounts /oauth/authorize (not /api/v1/oauth/authorize).\n if (\n u.hostname === \"127.0.0.1\" ||\n u.hostname === \"localhost\" ||\n u.hostname === \"localhost.feeef.org\"\n ) {\n const port = u.port ? `:${u.port}` : \"\";\n return `http://accounts.localhost.feeef.org${port}`;\n }\n if (u.hostname.startsWith(\"accounts.\")) {\n return `${u.protocol}//${u.host}`;\n }\n // Unknown host: API origin only; server may 302 to accounts.\n return `${u.protocol}//${u.host}`;\n } catch {\n return apiUrl.replace(/\\/$/, \"\");\n }\n}\n\nexport function resolveOAuthSettings(apiUrlOverride?: string): OAuthCliSettings {\n const clientId =\n process.env[\"FEEEF_OAUTH_CLIENT_ID\"]?.trim() || DEFAULT_OAUTH_CLIENT_ID;\n const clientSecret =\n process.env[\"FEEEF_OAUTH_CLIENT_SECRET\"]?.trim() || undefined;\n const redirectUri =\n process.env[\"FEEEF_OAUTH_REDIRECT_URI\"]?.trim() || DEFAULT_OAUTH_REDIRECT_URI;\n const callbackPort = Number(\n process.env[\"FEEEF_OAUTH_CALLBACK_PORT\"] || DEFAULT_OAUTH_CALLBACK_PORT,\n );\n const apiUrl = (apiUrlOverride || defaultApiUrl()).replace(/\\/$/, \"\");\n const scopesEnv = process.env[\"FEEEF_OAUTH_SCOPES\"]?.trim();\n const scopes = scopesEnv\n ? scopesEnv.split(/[\\s,]+/).filter(Boolean)\n : [...DEFAULT_CLI_OAUTH_SCOPES];\n\n return {\n clientId,\n clientSecret,\n redirectUri,\n callbackPort: Number.isFinite(callbackPort)\n ? callbackPort\n : DEFAULT_OAUTH_CALLBACK_PORT,\n apiUrl,\n authorizeBaseUrl: resolveAuthorizeBaseUrl(apiUrl),\n scopes,\n };\n}\n\n/** PKCE S256 verifier/challenge pair. */\nexport function createPkcePair(): { verifier: string; challenge: string } {\n const verifier = crypto.randomBytes(32).toString(\"base64url\");\n const challenge = crypto\n .createHash(\"sha256\")\n .update(verifier)\n .digest(\"base64url\");\n return { verifier, challenge };\n}\n\nexport function openBrowser(url: string): void {\n const platform = process.platform;\n const cmd =\n platform === \"darwin\"\n ? `open \"${url}\"`\n : platform === \"win32\"\n ? `start \"\" \"${url}\"`\n : `xdg-open \"${url}\"`;\n exec(cmd, () => {\n /* ignore — user can paste the printed URL */\n });\n}\n\nfunction htmlPage(title: string, body: string): string {\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <title>${title}</title>\n <style>\n body { font-family: system-ui, sans-serif; max-width: 32rem; margin: 4rem auto; padding: 0 1rem; }\n h1 { font-size: 1.25rem; }\n p { color: #444; }\n </style>\n</head>\n<body>\n <h1>${title}</h1>\n <p>${body}</p>\n <p>You can close this tab and return to the terminal.</p>\n</body>\n</html>`;\n}\n\n/**\n * One-shot loopback server that resolves with the authorization `code`\n * once `/oauth/callback` is hit with a matching `state`.\n */\nexport function listenForOAuthCallback(opts: {\n port: number;\n expectedState: string;\n onListening?: () => void;\n timeoutMs?: number;\n}): Promise<string> {\n const timeoutMs = opts.timeoutMs ?? 5 * 60 * 1000;\n\n return new Promise<string>((resolve, reject) => {\n let settled = false;\n const settle = (fn: () => void) => {\n if (settled) return;\n settled = true;\n fn();\n };\n\n const server = http.createServer((req, res) => {\n try {\n const url = new URL(req.url || \"/\", `http://127.0.0.1:${opts.port}`);\n if (url.pathname !== \"/oauth/callback\") {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"Not found\");\n return;\n }\n\n const err = url.searchParams.get(\"error\");\n if (err) {\n const desc = url.searchParams.get(\"error_description\") || err;\n res.writeHead(400, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(htmlPage(\"Authorization failed\", desc));\n settle(() => {\n server.close();\n reject(new Error(desc));\n });\n return;\n }\n\n const returnedState = url.searchParams.get(\"state\");\n if (returnedState !== opts.expectedState) {\n res.writeHead(400, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(htmlPage(\"Invalid state\", \"CSRF check failed. Try again.\"));\n settle(() => {\n server.close();\n reject(new Error(\"OAuth state mismatch\"));\n });\n return;\n }\n\n const authCode = url.searchParams.get(\"code\");\n if (!authCode) {\n res.writeHead(400, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(htmlPage(\"Missing code\", \"No authorization code in callback.\"));\n settle(() => {\n server.close();\n reject(new Error(\"Missing authorization code\"));\n });\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(htmlPage(\"Signed in\", \"Feeef CLI authorization complete.\"));\n settle(() => {\n server.close();\n resolve(authCode);\n });\n } catch (e) {\n settle(() => {\n server.close();\n reject(e);\n });\n }\n });\n\n server.on(\"error\", (e) => {\n settle(() => {\n reject(\n e instanceof Error && (e as NodeJS.ErrnoException).code === \"EADDRINUSE\"\n ? new Error(\n `Port ${opts.port} is in use. Free it or set FEEEF_OAUTH_CALLBACK_PORT.`,\n )\n : e,\n );\n });\n });\n\n // Loopback only — do not expose the callback on all interfaces.\n server.listen(opts.port, \"127.0.0.1\", () => {\n opts.onListening?.();\n });\n\n setTimeout(() => {\n settle(() => {\n server.close();\n reject(new Error(\"OAuth timed out waiting for browser callback\"));\n });\n }, timeoutMs).unref();\n });\n}\n\n/**\n * Starts a one-shot loopback server, opens the browser authorize URL,\n * exchanges the code, persists the access token.\n *\n * Callback must be exactly: http://localhost.feeef.org:7777/oauth/callback\n * (DNS for localhost.feeef.org → 127.0.0.1).\n */\nexport async function signinWithOAuth(opts: {\n apiUrl?: string;\n onAuthorizeUrl?: (url: string) => void;\n /** Skip opening the system browser (tests). */\n openBrowser?: boolean;\n}): Promise<{ email?: string }> {\n const settings = resolveOAuthSettings(opts.apiUrl);\n const state = crypto.randomUUID();\n const { verifier, challenge } = createPkcePair();\n\n const authorizeUrl = OAuthRepository.buildAuthorizeUrl({\n baseUrl: settings.authorizeBaseUrl,\n clientId: settings.clientId,\n redirectUri: settings.redirectUri,\n scope: settings.scopes,\n state,\n codeChallenge: challenge,\n codeChallengeMethod: \"S256\",\n });\n\n opts.onAuthorizeUrl?.(authorizeUrl);\n\n const code = await listenForOAuthCallback({\n port: settings.callbackPort,\n expectedState: state,\n onListening: () => {\n if (opts.openBrowser !== false) {\n openBrowser(authorizeUrl);\n }\n },\n });\n\n const httpClient = axios.create({\n baseURL: settings.apiUrl,\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n });\n const ff = new FeeeF({\n apiKey: \"\",\n baseURL: settings.apiUrl,\n client: httpClient as never,\n cache: false,\n });\n\n const tokenResponse = await ff.oauth.exchangeAuthorizationCode({\n code,\n redirectUri: settings.redirectUri,\n clientId: settings.clientId,\n ...(settings.clientSecret ? { clientSecret: settings.clientSecret } : {}),\n codeVerifier: verifier,\n });\n\n const accessToken = tokenResponse.access_token;\n if (!accessToken) {\n throw new Error(\"Token exchange returned no access_token\");\n }\n\n saveConfig({\n token: accessToken,\n apiUrl: settings.apiUrl,\n });\n\n ff.setHeader(\"Authorization\", `Bearer ${accessToken}`);\n try {\n const me = await ff.users.me();\n const payload = me as { user?: { email?: string }; email?: string };\n const email = payload.user?.email || payload.email;\n if (email) {\n saveConfig({ email });\n return { email };\n }\n return {};\n } catch {\n return {};\n }\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\n\nexport { p, pc };\n\nexport function banner(): void {\n console.log();\n console.log(pc.cyan(\" feeef\") + pc.dim(\" developer cli\"));\n console.log();\n}\n\nexport function intro(title: string): void {\n p.intro(pc.bgCyan(pc.black(` ${title} `)));\n}\n\nexport function outro(message: string): void {\n p.outro(pc.green(message));\n}\n\nexport function note(message: string, title?: string): void {\n p.note(message, title);\n}\n\nexport function cancel(message = \"Cancelled.\"): never {\n p.cancel(message);\n process.exit(0);\n}\n\nexport async function text(\n opts: Parameters<typeof p.text>[0],\n): Promise<string> {\n const value = await p.text(opts);\n if (p.isCancel(value)) cancel();\n return String(value);\n}\n\nexport async function password(\n opts: Parameters<typeof p.password>[0],\n): Promise<string> {\n const value = await p.password(opts);\n if (p.isCancel(value)) cancel();\n return String(value);\n}\n\nexport async function confirm(\n opts: Parameters<typeof p.confirm>[0],\n): Promise<boolean> {\n const value = await p.confirm(opts);\n if (p.isCancel(value)) cancel();\n return Boolean(value);\n}\n\nexport async function select<T extends string>(\n opts: Parameters<typeof p.select>[0] & {\n options: { value: T; label: string; hint?: string }[];\n },\n): Promise<T> {\n const value = await p.select(opts);\n if (p.isCancel(value)) cancel();\n return value as T;\n}\n\nexport function fail(err: unknown): never {\n const anyErr = err as {\n response?: { data?: unknown };\n message?: string;\n };\n let message: string;\n if (anyErr?.response?.data != null) {\n message =\n typeof anyErr.response.data === \"string\"\n ? anyErr.response.data\n : JSON.stringify(anyErr.response.data).slice(0, 1500);\n } else if (err instanceof Error) {\n message = err.message;\n } else {\n message = String(err);\n }\n p.log.error(pc.red(message));\n process.exit(1);\n}\n\nexport function ok(message: string): void {\n p.log.success(message);\n}\n\nexport function info(message: string): void {\n p.log.info(message);\n}\n\nexport function warn(message: string): void {\n p.log.warn(message);\n}\n\nexport function spinner() {\n return p.spinner();\n}\n","import { createClient, signinWithPassword } from \"../client.js\";\nimport {\n clearAuth,\n configPath,\n defaultApiUrl,\n loadConfig,\n saveConfig,\n type FeeefCliConfig,\n} from \"../config.js\";\nimport { signinWithOAuth } from \"../oauth.js\";\nimport {\n fail,\n info,\n intro,\n note,\n ok,\n outro,\n password,\n spinner,\n text,\n} from \"../ui.js\";\n\nexport async function runSignin(opts: {\n email?: string;\n password?: string;\n apiUrl?: string;\n /** Force email/password instead of browser OAuth. */\n passwordAuth?: boolean;\n}): Promise<void> {\n intro(\"feeef signin\");\n try {\n // Password path only via --password-auth or --email (never -p on argv).\n const usePassword = Boolean(opts.passwordAuth) || Boolean(opts.email);\n\n if (!usePassword) {\n const s = spinner();\n s.start(\"Waiting for browser authorization…\");\n const result = await signinWithOAuth({\n ...(opts.apiUrl ? { apiUrl: opts.apiUrl } : {}),\n onAuthorizeUrl: (url) => {\n s.stop(\"Open this URL if the browser did not launch:\");\n note(url, \"Authorize\");\n s.start(\"Waiting for callback on localhost.feeef.org:7777…\");\n },\n });\n s.stop(\n result.email\n ? `Signed in as ${result.email}`\n : \"Signed in (token saved)\",\n );\n info(`Config: ${configPath()}`);\n outro(\"Ready. Try: feeef whoami\");\n return;\n }\n\n const email =\n opts.email ||\n (await text({\n message: \"Email\",\n placeholder: \"you@example.com\",\n validate: (v) => (!v?.includes(\"@\") ? \"Enter a valid email\" : undefined),\n }));\n const pass =\n opts.password ||\n (await password({\n message: \"Password\",\n validate: (v) => (!v || v.length < 8 ? \"Min 8 characters\" : undefined),\n }));\n\n const s = spinner();\n s.start(\"Signing in…\");\n const auth = await signinWithPassword({\n email,\n password: pass,\n ...(opts.apiUrl ? { apiUrl: opts.apiUrl } : {}),\n });\n s.stop(`Signed in as ${auth.user?.email || email}`);\n info(`Config: ${configPath()}`);\n outro(\"Ready. Try: feeef whoami\");\n } catch (e) {\n fail(e);\n }\n}\n\nexport async function runWhoami(): Promise<void> {\n intro(\"feeef whoami\");\n try {\n const { ff, cfg } = createClient();\n const me = await ff.users.me();\n const payload = me as {\n user?: { email?: string; id?: string };\n email?: string;\n id?: string;\n };\n const user = payload.user ?? payload;\n ok(String(user.email || user.id || JSON.stringify(me)));\n info(`API ${defaultApiUrl(cfg)}`);\n outro(\"Authenticated\");\n } catch (e) {\n fail(e);\n }\n}\n\nexport function runSignout(): void {\n intro(\"feeef signout\");\n clearAuth();\n ok(`Cleared token (${configPath()})`);\n outro(\"Signed out\");\n}\n\nexport function runConfigShow(): void {\n intro(\"feeef config\");\n const cfg = loadConfig();\n console.log(\n JSON.stringify(\n {\n path: configPath(),\n email: cfg.email,\n apiUrl: defaultApiUrl(cfg),\n defaultStoreId: cfg.defaultStoreId,\n lastPublishedTemplateId: cfg.lastPublishedTemplateId,\n storefrontPath: cfg.storefrontPath,\n devPort: cfg.devPort,\n hasToken: Boolean(cfg.token),\n },\n null,\n 2,\n ),\n );\n outro(\"Done\");\n}\n\nconst CONFIG_KEYS = [\n \"apiUrl\",\n \"defaultStoreId\",\n \"storefrontPath\",\n \"devPort\",\n \"lastPublishedTemplateId\",\n] as const;\n\ntype ConfigSetKey = (typeof CONFIG_KEYS)[number];\n\nexport function runConfigSet(key: string, value: string): void {\n intro(\"feeef config set\");\n if (!(CONFIG_KEYS as readonly string[]).includes(key)) {\n fail(`Unknown key \"${key}\". Allowed: ${CONFIG_KEYS.join(\", \")}`);\n }\n\n const typedKey = key as ConfigSetKey;\n if (typedKey === \"devPort\") {\n const n = Number(value);\n if (!Number.isFinite(n) || n <= 0) {\n fail(\"devPort must be a positive number\");\n }\n saveConfig({ devPort: n });\n } else {\n const patch: Partial<FeeefCliConfig> = { [typedKey]: value };\n saveConfig(patch);\n }\n\n ok(`Set ${typedKey}`);\n outro(configPath());\n}\n","import path from \"node:path\";\nimport { resolveThemeDir } from \"../../project.js\";\nimport {\n addComponent,\n addPage,\n} from \"../../theme-scaffold.js\";\nimport { fail, intro, ok, outro } from \"../../ui.js\";\n\nexport async function runTemplateAddPage(\n pageId: string | undefined,\n opts: { dir?: string } = {},\n): Promise<void> {\n intro(\"feeef template add page\");\n try {\n if (!pageId?.trim()) {\n fail(\"Usage: feeef template add page <pageId>\");\n }\n const themeRoot = resolveThemeDir(opts.dir);\n const { pageId: id } = addPage(themeRoot, pageId!);\n ok(`Created pages/${id}/ (flat components/)`);\n outro(`Next: feeef template add component ${id} <name>`);\n } catch (err) {\n fail(err instanceof Error ? err.message : String(err));\n }\n}\n\nexport async function runTemplateAddComponent(\n pageId: string | undefined,\n componentId: string | undefined,\n opts: { dir?: string; title?: string; section?: string } = {},\n): Promise<void> {\n intro(\"feeef template add component\");\n try {\n if (!pageId?.trim() || !componentId?.trim()) {\n fail(\"Usage: feeef template add component <pageId> <componentId>\");\n }\n const themeRoot = resolveThemeDir(opts.dir);\n const result = addComponent(themeRoot, pageId!, componentId!, {\n ...(opts.title ? { title: opts.title } : {}),\n ...(opts.section ? { section: opts.section } : {}),\n });\n const rel = path.relative(themeRoot, result.filePath);\n ok(`Created ${rel}`);\n if (result.kind === \"legacy\") {\n outro(\"Added under legacy sections/main (page already uses sections)\");\n } else {\n outro(\"Edit the file, then npm run build / npm run dev\");\n }\n } catch (err) {\n fail(err instanceof Error ? err.message : String(err));\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { FeeefCliConfig } from \"./config.js\";\n\nexport const FEEF_RC = \".feeefrc\";\nexport const TEMPLATE_META = \"feeef.template.json\";\n\nexport interface FeeefProjectRc {\n store?: string;\n slug?: string;\n templateId?: string;\n apiUrl?: string;\n title?: string;\n}\n\nexport interface TemplateMeta {\n name?: string;\n version?: string;\n defaultLocale?: string;\n store?: string;\n storeId?: string;\n pages?: string[];\n [key: string]: unknown;\n}\n\nexport function findThemeRoot(startDir = process.cwd()): string | null {\n let dir = path.resolve(startDir);\n for (;;) {\n if (fs.existsSync(path.join(dir, TEMPLATE_META))) return dir;\n const parent = path.dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nexport function loadProjectRc(themeRoot: string): FeeefProjectRc {\n const rcPath = path.join(themeRoot, FEEF_RC);\n try {\n if (!fs.existsSync(rcPath)) return {};\n return JSON.parse(fs.readFileSync(rcPath, \"utf8\")) as FeeefProjectRc;\n } catch {\n return {};\n }\n}\n\nexport function saveProjectRc(\n themeRoot: string,\n patch: Partial<FeeefProjectRc>,\n): { rcPath: string; rc: FeeefProjectRc } {\n const rcPath = path.join(themeRoot, FEEF_RC);\n const next: FeeefProjectRc = { ...loadProjectRc(themeRoot), ...patch };\n for (const key of Object.keys(next) as (keyof FeeefProjectRc)[]) {\n const value = next[key];\n if (value === undefined || value === null || value === \"\") {\n delete next[key];\n }\n }\n fs.writeFileSync(rcPath, `${JSON.stringify(next, null, 2)}\\n`, \"utf8\");\n return { rcPath, rc: next };\n}\n\nexport function loadTemplateMeta(themeRoot: string): TemplateMeta {\n const metaPath = path.join(themeRoot, TEMPLATE_META);\n if (!fs.existsSync(metaPath)) return {};\n try {\n return JSON.parse(fs.readFileSync(metaPath, \"utf8\")) as TemplateMeta;\n } catch {\n return {};\n }\n}\n\nexport function resolveStoreIdFromProject(input: {\n storeFlag?: string;\n themeRoot: string;\n globalCfg: FeeefCliConfig;\n}): string | null {\n const rc = loadProjectRc(input.themeRoot);\n const meta = loadTemplateMeta(input.themeRoot);\n return (\n input.storeFlag ||\n rc.store ||\n meta.store ||\n meta.storeId ||\n input.globalCfg.defaultStoreId ||\n null\n );\n}\n\nexport function resolveThemeDir(dirArg?: string): string {\n if (dirArg) {\n const abs = path.resolve(dirArg);\n if (!fs.existsSync(abs)) {\n throw new Error(`Template directory not found: ${abs}`);\n }\n return findThemeRoot(abs) || abs;\n }\n const fromCwd = findThemeRoot(process.cwd());\n if (fromCwd) return fromCwd;\n throw new Error(\n \"No template found. Run inside a template folder (feeef.template.json) or: feeef template init\",\n );\n}\n\nexport function projectRcPath(themeRoot: string): string {\n return path.join(themeRoot, FEEF_RC);\n}\n","/**\n * Scaffold helpers for `feeef template add|remove page|component`.\n *\n * New pages use flat `pages/<id>/components/`. Components are leaf `.tsx`\n * files with `export const meta` + `function App()`. Legacy `sections/` pages\n * still accept new components under `sections/main/components/`.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { TEMPLATE_META, type TemplateMeta } from \"./project.js\";\n\nconst PAGE_ID_RE = /^[a-z][a-z0-9_]*$/;\nconst COMPONENT_ID_RE = /^[a-z][a-z0-9_-]*$/;\n\nexport function assertPageId(id: string): string {\n const trimmed = id.trim();\n if (!PAGE_ID_RE.test(trimmed)) {\n throw new Error(\n `Invalid page id \"${id}\" — use lowercase letters, digits, underscore (e.g. home, thank_you)`,\n );\n }\n return trimmed;\n}\n\nexport function assertComponentId(id: string): string {\n const trimmed = id.trim();\n if (!COMPONENT_ID_RE.test(trimmed)) {\n throw new Error(\n `Invalid component id \"${id}\" — use lowercase letters, digits, hyphen/underscore (e.g. hero, product-grid)`,\n );\n }\n return trimmed;\n}\n\nfunction titleCaseFromId(id: string): string {\n return id\n .split(/[-_]/)\n .filter(Boolean)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(\" \");\n}\n\nfunction readMeta(themeRoot: string): TemplateMeta {\n const metaPath = path.join(themeRoot, TEMPLATE_META);\n if (!fs.existsSync(metaPath)) {\n throw new Error(`Missing ${TEMPLATE_META} in ${themeRoot}`);\n }\n return JSON.parse(fs.readFileSync(metaPath, \"utf8\")) as TemplateMeta;\n}\n\nfunction writeMeta(themeRoot: string, meta: TemplateMeta): void {\n const metaPath = path.join(themeRoot, TEMPLATE_META);\n fs.writeFileSync(metaPath, `${JSON.stringify(meta, null, 2)}\\n`, \"utf8\");\n}\n\n/**\n * Whether this page already uses legacy `sections/` with real components\n * and has no flat `components/` directory (flat wins when the folder exists).\n */\nexport function pageUsesLegacySections(themeRoot: string, pageId: string): boolean {\n const flatDir = path.join(themeRoot, \"pages\", pageId, \"components\");\n if (fs.existsSync(flatDir)) return false;\n\n const sectionsDir = path.join(themeRoot, \"pages\", pageId, \"sections\");\n if (!fs.existsSync(sectionsDir)) return false;\n for (const section of fs.readdirSync(sectionsDir, { withFileTypes: true })) {\n if (!section.isDirectory() || section.name.startsWith(\".\")) continue;\n const comps = path.join(sectionsDir, section.name, \"components\");\n if (!fs.existsSync(comps)) continue;\n const entries = fs.readdirSync(comps).filter((n) => !n.startsWith(\".\"));\n if (entries.length > 0) return true;\n }\n return false;\n}\n\nexport function resolveComponentParentDir(\n themeRoot: string,\n pageId: string,\n section?: string,\n): { parentDir: string; kind: \"flat\" | \"legacy\" } {\n if (section) {\n const parentDir = path.join(\n themeRoot,\n \"pages\",\n pageId,\n \"sections\",\n section,\n \"components\",\n );\n return { parentDir, kind: \"legacy\" };\n }\n if (pageUsesLegacySections(themeRoot, pageId)) {\n return {\n parentDir: path.join(\n themeRoot,\n \"pages\",\n pageId,\n \"sections\",\n \"main\",\n \"components\",\n ),\n kind: \"legacy\",\n };\n }\n return {\n parentDir: path.join(themeRoot, \"pages\", pageId, \"components\"),\n kind: \"flat\",\n };\n}\n\n/** Starter custom component source (type-safe props + App). */\nexport function formatStarterComponent(opts: {\n title: string;\n order?: number;\n}): string {\n const order = typeof opts.order === \"number\" ? opts.order : 0;\n const titleJson = JSON.stringify(opts.title);\n return `const propsSchema = {\n heading: { type: \"string\", name: \"Heading\" },\n} as const;\n\nexport const meta = {\n type: \"custom\",\n title: ${titleJson},\n order: ${order},\n propsSchema,\n props: {\n heading: \"\",\n },\n} as const satisfies FeeefComponentMeta<typeof propsSchema>;\n\ntype Props = FeeefLivePropsOf<typeof propsSchema>;\n\nfunction App() {\n const p = props as Props;\n return (\n <section style={{ padding: \"2rem 1.5rem\" }}>\n <h2>{p.heading || ${titleJson}}</h2>\n </section>\n );\n}\n`;\n}\n\nexport function nextComponentOrder(parentDir: string): number {\n if (!fs.existsSync(parentDir)) return 0;\n let max = -1;\n for (const name of fs.readdirSync(parentDir)) {\n if (name.startsWith(\".\")) continue;\n const abs = path.join(parentDir, name);\n let sourcePath: string | null = null;\n if (fs.statSync(abs).isFile() && /\\.(tsx|jsx)$/.test(name)) {\n sourcePath = abs;\n } else if (fs.statSync(abs).isDirectory()) {\n for (const entry of [\"component.tsx\", \"component.jsx\"]) {\n const p = path.join(abs, entry);\n if (fs.existsSync(p)) {\n sourcePath = p;\n break;\n }\n }\n }\n if (!sourcePath) continue;\n const src = fs.readFileSync(sourcePath, \"utf8\");\n const m = /\\border\\s*:\\s*(\\d+)/.exec(src);\n if (m) max = Math.max(max, Number(m[1]));\n }\n return max + 1;\n}\n\nexport function addPage(\n themeRoot: string,\n pageIdRaw: string,\n): { pageDir: string; pageId: string } {\n const pageId = assertPageId(pageIdRaw);\n const pageDir = path.join(themeRoot, \"pages\", pageId);\n if (fs.existsSync(pageDir)) {\n throw new Error(`Page already exists: pages/${pageId}/`);\n }\n\n fs.mkdirSync(path.join(pageDir, \"components\"), { recursive: true });\n fs.writeFileSync(\n path.join(pageDir, \"page.json\"),\n `${JSON.stringify({ props: {} }, null, 2)}\\n`,\n \"utf8\",\n );\n\n const meta = readMeta(themeRoot);\n const pages = Array.isArray(meta.pages) ? [...meta.pages] : [];\n if (!pages.includes(pageId)) pages.push(pageId);\n meta.pages = pages;\n writeMeta(themeRoot, meta);\n\n return { pageDir, pageId };\n}\n\nexport function removePage(\n themeRoot: string,\n pageIdRaw: string,\n): { pageId: string; removedPath: string } {\n const pageId = assertPageId(pageIdRaw);\n const pageDir = path.join(themeRoot, \"pages\", pageId);\n if (!fs.existsSync(pageDir)) {\n throw new Error(`Page not found: pages/${pageId}/`);\n }\n\n fs.rmSync(pageDir, { recursive: true, force: true });\n\n const meta = readMeta(themeRoot);\n if (Array.isArray(meta.pages)) {\n meta.pages = meta.pages.filter((id) => id !== pageId);\n writeMeta(themeRoot, meta);\n }\n\n return { pageId, removedPath: pageDir };\n}\n\nexport function addComponent(\n themeRoot: string,\n pageIdRaw: string,\n componentIdRaw: string,\n opts: { title?: string; section?: string } = {},\n): { filePath: string; pageId: string; componentId: string; kind: \"flat\" | \"legacy\" } {\n const pageId = assertPageId(pageIdRaw);\n const componentId = assertComponentId(componentIdRaw);\n const pageDir = path.join(themeRoot, \"pages\", pageId);\n if (!fs.existsSync(pageDir)) {\n throw new Error(\n `Page not found: pages/${pageId}/ — run: feeef template add page ${pageId}`,\n );\n }\n\n const { parentDir, kind } = resolveComponentParentDir(\n themeRoot,\n pageId,\n opts.section,\n );\n fs.mkdirSync(parentDir, { recursive: true });\n\n const filePath = path.join(parentDir, `${componentId}.tsx`);\n const folderPath = path.join(parentDir, componentId);\n if (fs.existsSync(filePath) || fs.existsSync(folderPath)) {\n throw new Error(\n `Component already exists under ${path.relative(themeRoot, parentDir)}/${componentId}`,\n );\n }\n\n const order = nextComponentOrder(parentDir);\n const title = opts.title?.trim() || titleCaseFromId(componentId);\n fs.writeFileSync(filePath, formatStarterComponent({ title, order }), \"utf8\");\n\n return { filePath, pageId, componentId, kind };\n}\n\n/**\n * Resolve a component entry path under a page (flat file, folder, or legacy section).\n */\nexport function findComponentEntry(\n themeRoot: string,\n pageId: string,\n componentId: string,\n section?: string,\n): string | null {\n const candidates: string[] = [];\n if (section) {\n const base = path.join(\n themeRoot,\n \"pages\",\n pageId,\n \"sections\",\n section,\n \"components\",\n );\n candidates.push(\n path.join(base, `${componentId}.tsx`),\n path.join(base, `${componentId}.jsx`),\n path.join(base, `${componentId}.json`),\n path.join(base, componentId),\n );\n } else {\n const flat = path.join(themeRoot, \"pages\", pageId, \"components\");\n candidates.push(\n path.join(flat, `${componentId}.tsx`),\n path.join(flat, `${componentId}.jsx`),\n path.join(flat, `${componentId}.json`),\n path.join(flat, componentId),\n );\n const sectionsRoot = path.join(themeRoot, \"pages\", pageId, \"sections\");\n if (fs.existsSync(sectionsRoot)) {\n for (const sec of fs.readdirSync(sectionsRoot, { withFileTypes: true })) {\n if (!sec.isDirectory() || sec.name.startsWith(\".\")) continue;\n const base = path.join(sectionsRoot, sec.name, \"components\");\n candidates.push(\n path.join(base, `${componentId}.tsx`),\n path.join(base, `${componentId}.jsx`),\n path.join(base, `${componentId}.json`),\n path.join(base, componentId),\n );\n }\n }\n }\n for (const c of candidates) {\n if (fs.existsSync(c)) return c;\n }\n return null;\n}\n\nexport function removeComponent(\n themeRoot: string,\n pageIdRaw: string,\n componentIdRaw: string,\n opts: { section?: string } = {},\n): { pageId: string; componentId: string; removedPath: string } {\n const pageId = assertPageId(pageIdRaw);\n const componentId = assertComponentId(componentIdRaw);\n const entry = findComponentEntry(\n themeRoot,\n pageId,\n componentId,\n opts.section,\n );\n if (!entry) {\n throw new Error(\n `Component not found: ${pageId}/${componentId}` +\n (opts.section ? ` (section ${opts.section})` : \"\"),\n );\n }\n fs.rmSync(entry, { recursive: true, force: true });\n return { pageId, componentId, removedPath: entry };\n}\n","import path from \"node:path\";\nimport { loadBuild } from \"../../kit.js\";\nimport { resolveThemeDir } from \"../../project.js\";\nimport { fail, info, intro, ok, outro, spinner, warn } from \"../../ui.js\";\n\nexport async function runTemplateBuild(\n dirArg: string | undefined,\n opts: { checkOnly?: boolean } = {},\n): Promise<void> {\n const label = opts.checkOnly ? \"feeef template check\" : \"feeef template build\";\n intro(label);\n try {\n const srcDir = resolveThemeDir(dirArg);\n const outPath = path.join(srcDir, \"dist\", \"data.json\");\n const s = spinner();\n s.start(opts.checkOnly ? \"Checking template…\" : \"Building template…\");\n\n const { buildTemplate } = await loadBuild();\n const result = buildTemplate({\n srcDir,\n outPath,\n write: !opts.checkOnly,\n });\n\n for (const w of result.warnings || []) {\n warn(`[${w.path}] ${w.message}`);\n }\n\n s.stop(\n opts.checkOnly\n ? `OK — ${result.pageCount ?? \"?\"} pages / ${result.componentCount ?? \"?\"} components`\n : `Built → ${result.outPath}`,\n );\n\n if (!opts.checkOnly) {\n if (result.localeCount) info(`${result.localeCount} locales`);\n if (result.libraryCount) info(`${result.libraryCount} library entries`);\n }\n\n ok(opts.checkOnly ? \"Check passed\" : \"Build complete\");\n outro(opts.checkOnly ? \"Ready to publish\" : path.relative(process.cwd(), outPath) || outPath);\n } catch (e) {\n fail(e);\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n/** Package root whether running from dist/ or src/. */\nexport function cliRoot(): string {\n // dist/bin.js → ../ ; src during tests → ../\n const candidate = path.resolve(__dirname, \"..\");\n if (fs.existsSync(path.join(candidate, \"package.json\"))) return candidate;\n return path.resolve(__dirname, \"../..\");\n}\n\nexport function templateKitRoot(): string {\n return path.join(cliRoot(), \"vendor\", \"template-kit\");\n}\n\nexport function scaffoldsRoot(): string {\n return path.join(cliRoot(), \"scaffolds\");\n}\n\nexport interface BuildTemplateResult {\n outPath: string;\n warnings?: { path: string; message: string }[];\n pageCount?: number;\n componentCount?: number;\n localeCount?: number;\n libraryCount?: number;\n sharedCount?: number;\n sharedPlacementCount?: number;\n libraryOutPath?: string;\n}\n\nexport interface BuildModule {\n buildTemplate: (opts: {\n srcDir: string;\n outPath: string;\n write?: boolean;\n }) => BuildTemplateResult;\n}\n\nexport async function loadBuild(): Promise<BuildModule> {\n const buildPath = path.join(templateKitRoot(), \"lib\", \"build.mjs\");\n if (!fs.existsSync(buildPath)) {\n throw new Error(`template-kit missing at ${buildPath}`);\n }\n return import(pathToFileURL(buildPath).href) as Promise<BuildModule>;\n}\n\nexport interface SmokeItem {\n loc: string;\n instanceId?: string;\n title?: string;\n sourcePath?: string;\n type: string;\n code: string;\n props: Record<string, unknown>;\n}\n\nexport interface SmokeThemeResult {\n passed: number;\n failed: Array<{ item: SmokeItem; error: Error }>;\n total: number;\n items: SmokeItem[];\n}\n\nexport interface SmokeModule {\n smokeTheme: (opts: {\n srcDir: string;\n dataPath?: string;\n build?: boolean;\n }) => Promise<SmokeThemeResult>;\n}\n\nexport async function loadSmoke(): Promise<SmokeModule> {\n const smokePath = path.join(templateKitRoot(), \"lib\", \"smoke.mjs\");\n if (!fs.existsSync(smokePath)) {\n throw new Error(`template-kit smoke missing at ${smokePath}`);\n }\n return import(pathToFileURL(smokePath).href) as Promise<SmokeModule>;\n}\n\nexport interface UnpackModule {\n unpackTemplate: (opts: {\n inputPath: string;\n outDir: string;\n force?: boolean;\n }) => { files: number; pages: number; components: number };\n}\n\nexport async function loadUnpack(): Promise<UnpackModule> {\n const unpackPath = path.join(templateKitRoot(), \"lib\", \"unpack.mjs\");\n if (!fs.existsSync(unpackPath)) {\n throw new Error(`template-kit missing at ${unpackPath}`);\n }\n return import(pathToFileURL(unpackPath).href) as Promise<UnpackModule>;\n}\n\nexport function kitBin(): string {\n return path.join(templateKitRoot(), \"bin\", \"feeef-template.mjs\");\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createClient } from \"../../client.js\";\nimport { defaultDevPort, loadConfig } from \"../../config.js\";\nimport { kitBin, loadBuild } from \"../../kit.js\";\nimport {\n loadProjectRc,\n resolveStoreIdFromProject,\n resolveThemeDir,\n} from \"../../project.js\";\nimport { assertStorefrontPath } from \"../../storefront.js\";\nimport { openBrowser } from \"../../oauth.js\";\nimport { startDevErrorServer } from \"../../dev-error-server.js\";\nimport {\n fail,\n info,\n intro,\n note,\n ok,\n outro,\n pc,\n spinner,\n} from \"../../ui.js\";\n\nfunction killChildren(children: ChildProcess[]): void {\n for (const c of children) {\n try {\n c.kill(\"SIGTERM\");\n } catch {\n /* ignore */\n }\n }\n}\n\nfunction debounce<T extends (...args: never[]) => void>(\n fn: T,\n ms: number,\n): T & { cancel: () => void } {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const wrapped = ((...args: never[]) => {\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => fn(...args), ms);\n }) as T & { cancel: () => void };\n wrapped.cancel = () => {\n if (timer) clearTimeout(timer);\n };\n return wrapped;\n}\n\nasync function resolveBoundStore(srcDir: string): Promise<{\n storeId: string;\n slug: string;\n}> {\n const cfg = loadConfig();\n if (!cfg.token) {\n throw new Error(\n \"Not signed in. Run: feeef signin\\nThen bind a store: feeef use <slug>\",\n );\n }\n const storeRef = resolveStoreIdFromProject({\n themeRoot: srcDir,\n globalCfg: cfg,\n });\n if (!storeRef) {\n throw new Error(\n \"No store linked. Run: feeef use <slug>\\n(Remote preview pushes a draft to your store — live template stays unchanged.)\",\n );\n }\n\n const { ff } = createClient({ requireAuth: true });\n let store;\n try {\n store = await ff.stores.find({ id: storeRef });\n } catch {\n store = await ff.stores.find({ id: storeRef, by: \"slug\" });\n }\n return { storeId: store.id, slug: store.slug };\n}\n\n/**\n * Default: watch → build → PUT draft template-preview → open hosted ?preview= URL.\n * Never writes live `metadata.templateData`.\n */\nasync function runRemoteDraftPreview(srcDir: string): Promise<void> {\n const outPath = path.join(srcDir, \"dist\", \"data.json\");\n const { storeId, slug } = await resolveBoundStore(srcDir);\n const { ff } = createClient({ requireAuth: true });\n\n const s = spinner();\n s.start(\"Building template…\");\n const { buildTemplate } = await loadBuild();\n buildTemplate({ srcDir, outPath, write: true });\n s.stop(\"dist ready\");\n\n const errorServer = await startDevErrorServer();\n info(`Component errors → ${pc.cyan(errorServer.url)} (terminal)`);\n\n const withDevLog = (previewUrl: string): string => {\n try {\n const u = new URL(previewUrl);\n u.searchParams.set(\"feeef_dev_log\", errorServer.url);\n return u.toString();\n } catch {\n return previewUrl;\n }\n };\n\n let lastPreviewUrl: string | undefined;\n let pushInFlight = false;\n let pushQueued = false;\n\n const pushDraft = async () => {\n if (pushInFlight) {\n pushQueued = true;\n return;\n }\n pushInFlight = true;\n try {\n if (!fs.existsSync(outPath)) {\n info(\"Waiting for dist/data.json…\");\n return;\n }\n const data = JSON.parse(fs.readFileSync(outPath, \"utf8\")) as unknown;\n const result = await ff.stores.putTemplatePreview(storeId, { data });\n lastPreviewUrl = withDevLog(result.previewUrl);\n ok(`Draft preview updated → ${pc.cyan(lastPreviewUrl)}`);\n } catch (e) {\n fail(e);\n } finally {\n pushInFlight = false;\n if (pushQueued) {\n pushQueued = false;\n await pushDraft();\n }\n }\n };\n\n const debouncedPush = debounce(() => {\n void pushDraft();\n }, 400);\n\n await pushDraft();\n if (lastPreviewUrl) {\n openBrowser(lastPreviewUrl);\n }\n\n note(\n [\n `Template ${srcDir}`,\n `Store ${slug} (${storeId})`,\n `Preview ${lastPreviewUrl ?? \"(pending)\"}`,\n \"\",\n \"Live customers still see metadata.templateData.\",\n \"Exit preview in the browser: banner → Exit, or /?preview=0\",\n `CustomLive errors print here via ${errorServer.url}`,\n \"Stopping the CLI clears the draft.\",\n ].join(\"\\n\"),\n \"Remote draft preview\",\n );\n\n const watch = spawn(\n process.execPath,\n [kitBin(), \"watch\", srcDir, \"-o\", outPath],\n { cwd: srcDir, env: process.env, stdio: \"inherit\" },\n );\n\n // Re-push when dist changes (kit watch rewrites data.json).\n let watching = true;\n const onDistChange = () => {\n if (!watching) return;\n debouncedPush();\n };\n try {\n fs.watch(path.dirname(outPath), { persistent: true }, (_event, filename) => {\n if (!filename || filename === \"data.json\" || String(filename).endsWith(\"data.json\")) {\n onDistChange();\n }\n });\n } catch {\n // Fallback: periodic push if watch unsupported\n setInterval(() => onDistChange(), 2000).unref();\n }\n\n const shutdown = async (code = 0) => {\n watching = false;\n debouncedPush.cancel();\n killChildren([watch]);\n try {\n await errorServer.close();\n } catch {\n /* ignore */\n }\n try {\n await ff.stores.clearTemplatePreview(storeId);\n info(\"Cleared draft preview on server\");\n } catch {\n /* leave until TTL */\n }\n process.exit(code);\n };\n\n process.on(\"SIGINT\", () => {\n void shutdown(0);\n });\n process.on(\"SIGTERM\", () => {\n void shutdown(0);\n });\n\n watch.on(\"exit\", (code) => {\n if (code && code !== 0) void shutdown(code);\n });\n\n ok(`Open ${pc.cyan(lastPreviewUrl ?? `https://${slug}.feeef.org`)}`);\n outro(\"Watching — Ctrl+C to stop (clears draft)\");\n\n await new Promise(() => {});\n}\n\n/**\n * Employee escape hatch: spawn local Next with FEEEF_TEMPLATE_DATA_PATH.\n */\nasync function runLocalStorefrontPreview(\n srcDir: string,\n opts: { port?: string; storefront?: string },\n): Promise<void> {\n const outPath = path.join(srcDir, \"dist\", \"data.json\");\n const libraryPath = path.join(srcDir, \"dist\", \"schema.library.json\");\n const port = Number(opts.port) || defaultDevPort();\n\n if (opts.storefront) {\n process.env[\"FEEEF_STOREFRONT_PATH\"] = path.resolve(opts.storefront);\n }\n const storefrontRoot = assertStorefrontPath();\n const errorServer = await startDevErrorServer();\n info(`Component errors → ${pc.cyan(errorServer.url)} (terminal)`);\n\n const cfg = loadConfig();\n const storeRef = resolveStoreIdFromProject({\n themeRoot: srcDir,\n globalCfg: cfg,\n });\n const rc = loadProjectRc(srcDir);\n\n let slug = rc.slug;\n if (!slug && storeRef) {\n try {\n const { ff } = createClient({ requireAuth: Boolean(cfg.token) });\n if (cfg.token) {\n try {\n const store = await ff.stores.find({ id: storeRef });\n slug = store.slug;\n } catch {\n try {\n const store = await ff.stores.find({ id: storeRef, by: \"slug\" });\n slug = store.slug;\n } catch {\n /* keep undefined */\n }\n }\n }\n } catch {\n /* offline / not signed in — still run next */\n }\n }\n\n const s = spinner();\n s.start(\"Building template…\");\n const { buildTemplate } = await loadBuild();\n buildTemplate({ srcDir, outPath, write: true });\n s.stop(\"dist ready\");\n\n const previewHost = slug\n ? `http://${slug}.localhost.feeef.org:${port}`\n : `http://localhost:${port}`;\n const previewWithLog = (() => {\n try {\n const u = new URL(previewHost);\n u.searchParams.set(\"feeef_dev_log\", errorServer.url);\n return u.toString();\n } catch {\n return previewHost;\n }\n })();\n\n note(\n [\n `Template ${srcDir}`,\n `Storefront ${storefrontRoot}`,\n `Preview ${previewWithLog}`,\n `Errors ${errorServer.url}`,\n \"Internal --local mode (not for public docs).\",\n ].join(\"\\n\"),\n \"Local Next preview\",\n );\n\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n FEEEF_TEMPLATE_DATA_PATH: outPath,\n FEEEF_TEMPLATE_LIBRARY_PATH: libraryPath,\n FEEEF_DEV_LOG_URL: errorServer.url,\n PORT: String(port),\n };\n if (slug) {\n env[\"NEXT_PUBLIC_DEV_STORE_SLUG\"] = slug;\n }\n\n const watch = spawn(\n process.execPath,\n [kitBin(), \"watch\", srcDir, \"-o\", outPath],\n { cwd: srcDir, env, stdio: \"inherit\" },\n );\n\n const next = spawn(\n \"npx\",\n [\"next\", \"dev\", \"--turbopack\", \"-H\", \"0.0.0.0\", \"-p\", String(port)],\n { cwd: storefrontRoot, env, stdio: \"inherit\", shell: true },\n );\n\n const children = [watch, next];\n const shutdown = (code = 0) => {\n killChildren(children);\n void errorServer.close().finally(() => process.exit(code));\n };\n\n process.on(\"SIGINT\", () => shutdown(0));\n process.on(\"SIGTERM\", () => shutdown(0));\n\n next.on(\"exit\", (code) => shutdown(code ?? 0));\n watch.on(\"exit\", (code) => {\n if (code && code !== 0) shutdown(code);\n });\n\n ok(`Open ${pc.cyan(previewWithLog)}`);\n outro(\"Watching — Ctrl+C to stop\");\n\n await new Promise(() => {});\n}\n\nexport async function runTemplateDev(\n dirArg: string | undefined,\n opts: { port?: string; storefront?: string; local?: boolean },\n): Promise<void> {\n intro(\"feeef template dev\");\n try {\n const srcDir = resolveThemeDir(dirArg);\n if (opts.local || opts.storefront) {\n await runLocalStorefrontPreview(srcDir, opts);\n return;\n }\n await runRemoteDraftPreview(srcDir);\n } catch (e) {\n fail(e);\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { loadConfig } from \"./config.js\";\nimport { cliRoot } from \"./kit.js\";\n\n/**\n * Resolve Lithium storefront root for `feeef template dev`.\n * Order: env → global config → monorepo sibling of cli/\n */\nexport function resolveStorefrontPath(): string | null {\n const fromEnv = process.env[\"FEEEF_STOREFRONT_PATH\"]?.trim();\n if (fromEnv && fs.existsSync(path.join(fromEnv, \"package.json\"))) {\n return path.resolve(fromEnv);\n }\n\n const cfg = loadConfig();\n if (\n cfg.storefrontPath &&\n fs.existsSync(path.join(cfg.storefrontPath, \"package.json\"))\n ) {\n return path.resolve(cfg.storefrontPath);\n }\n\n const sibling = path.resolve(cliRoot(), \"../storefront\");\n if (fs.existsSync(path.join(sibling, \"package.json\"))) {\n return sibling;\n }\n\n return null;\n}\n\nexport function assertStorefrontPath(): string {\n const root = resolveStorefrontPath();\n if (!root) {\n throw new Error(\n [\n \"Lithium storefront not found.\",\n \"Set it once (template repos do not need storefront source inside them):\",\n \" feeef config set storefrontPath /path/to/storefront\",\n \"or:\",\n \" export FEEEF_STOREFRONT_PATH=/path/to/storefront\",\n ].join(\"\\n\"),\n );\n }\n return root;\n}\n","import http from \"node:http\";\nimport { formatFeeefLiveErrorLine } from \"./dev-error-format.js\";\n\nexport type DevErrorServer = {\n port: number;\n url: string;\n close: () => Promise<void>;\n};\n\n/**\n * Tiny localhost ingest for storefront CustomLive errors during `feeef template dev`.\n * Browser on the same machine POSTs JSON to `/feeef-error`.\n */\nexport async function startDevErrorServer(opts?: {\n preferredPort?: number;\n}): Promise<DevErrorServer> {\n const preferred =\n opts?.preferredPort ??\n (Number(process.env[\"FEEEF_DEV_ERROR_PORT\"]) || 0);\n\n const server = http.createServer((req, res) => {\n // CORS — preview may be on *.feeef.org while ingest is 127.0.0.1\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n res.setHeader(\"Access-Control-Allow-Methods\", \"POST, OPTIONS\");\n res.setHeader(\"Access-Control-Allow-Headers\", \"Content-Type\");\n\n if (req.method === \"OPTIONS\") {\n res.writeHead(204);\n res.end();\n return;\n }\n\n if (req.method === \"GET\" && (req.url === \"/\" || req.url === \"/health\")) {\n res.writeHead(200, { \"Content-Type\": \"text/plain\" });\n res.end(\"feeef-dev-error-ok\");\n return;\n }\n\n if (req.method === \"POST\" && req.url?.startsWith(\"/feeef-error\")) {\n const chunks: Buffer[] = [];\n req.on(\"data\", (c) => chunks.push(c));\n req.on(\"end\", () => {\n try {\n const raw = Buffer.concat(chunks).toString(\"utf8\");\n const body = JSON.parse(raw) as Record<string, unknown>;\n const line = formatFeeefLiveErrorLine(body);\n console.error(\"\\n\" + line + \"\\n\");\n res.writeHead(204);\n res.end();\n } catch (e) {\n console.error(\"[feeef:custom-live] bad error payload\", e);\n res.writeHead(400);\n res.end(\"bad json\");\n }\n });\n return;\n }\n\n res.writeHead(404);\n res.end(\"not found\");\n });\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(preferred, \"127.0.0.1\", () => resolve());\n });\n\n const addr = server.address();\n if (!addr || typeof addr === \"string\") {\n throw new Error(\"Failed to bind feeef dev error server\");\n }\n\n const port = addr.port;\n const url = `http://127.0.0.1:${port}`;\n\n return {\n port,\n url,\n close: () =>\n new Promise((resolve) => {\n server.close(() => resolve());\n }),\n };\n}\n","/**\n * Format CustomLive error payloads for the CLI terminal (shared shape with storefront).\n */\nexport function formatFeeefLiveErrorLine(body: Record<string, unknown>): string {\n const debug = (body.debug || {}) as Record<string, unknown>;\n const kind = String(body.kind || \"error\");\n const message = String(body.message || \"unknown\");\n const lines = [\n `[feeef:custom-live] ${kind}`,\n debug.sourcePath ? ` path: ${debug.sourcePath}` : null,\n debug.instanceId ? ` instanceId: ${debug.instanceId}` : null,\n debug.title ? ` title: ${debug.title}` : null,\n debug.type ? ` type: ${debug.type}` : null,\n ` message: ${message}`,\n body.props && typeof body.props === \"object\"\n ? ` props: ${JSON.stringify(body.props)}`\n : null,\n body.href ? ` href: ${body.href}` : null,\n ].filter(Boolean);\n return lines.join(\"\\n\");\n}\n","import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type { FeeeF, StoreTemplateEntity } from \"feeef\";\nimport { TemplateComponentPolicy } from \"feeef\";\nimport { createClient } from \"../../client.js\";\nimport { cloneKitFromGit, copyKitFromLocal, resolveBlankKitGitUrl } from \"../../kits.js\";\nimport { loadUnpack, scaffoldsRoot } from \"../../kit.js\";\nimport { saveProjectRc } from \"../../project.js\";\nimport { ensureAgentPack, ensureEditorSupport, ensureNodePackage } from \"../../theme-package.js\";\nimport { materializeTemplateReferences } from \"../../theme.js\";\nimport {\n fail,\n info,\n intro,\n ok,\n outro,\n pc,\n warn,\n select,\n spinner,\n text,\n} from \"../../ui.js\";\n\nconst PAGE_SIZE = 15;\nconst LOAD_MORE = \"__load_more__\";\nconst SEARCH = \"__search__\";\nconst CLEAR_SEARCH = \"__clear_search__\";\n\nfunction copyDir(src: string, dest: string): void {\n fs.mkdirSync(dest, { recursive: true });\n for (const entry of fs.readdirSync(src, { withFileTypes: true })) {\n if (entry.name === \".\" || entry.name === \"..\") continue;\n if (\n entry.name === \"node_modules\" ||\n entry.name === \".git\" ||\n entry.name === \".env\" ||\n entry.name.startsWith(\".env.\")\n ) {\n continue;\n }\n const from = path.join(src, entry.name);\n const to = path.join(dest, entry.name);\n if (entry.isDirectory()) copyDir(from, to);\n else fs.copyFileSync(from, to);\n }\n}\n\nfunction validateFolderName(v: string | undefined): string | undefined {\n if (!v || !/^[a-z0-9-_]+$/i.test(v)) {\n return \"Use letters, numbers, - or _\";\n }\n return undefined;\n}\n\nfunction formatTemplateLabel(row: StoreTemplateEntity): string {\n const title = row.title || row.id;\n if (row.category) return `${title} · ${row.category}`;\n return title;\n}\n\nfunction writeLocaleFiles(\n dest: string,\n messages: Record<string, Record<string, unknown>>,\n): number {\n const localesDir = path.join(dest, \"locales\");\n fs.mkdirSync(localesDir, { recursive: true });\n let count = 0;\n for (const [locale, tree] of Object.entries(messages)) {\n fs.writeFileSync(\n path.join(localesDir, `${locale}.json`),\n `${JSON.stringify(tree, null, 2)}\\n`,\n \"utf8\",\n );\n count += 1;\n }\n return count;\n}\n\nfunction patchMeta(\n dest: string,\n patch: Record<string, unknown>,\n): void {\n const metaPath = path.join(dest, \"feeef.template.json\");\n if (!fs.existsSync(metaPath)) return;\n const meta = JSON.parse(fs.readFileSync(metaPath, \"utf8\")) as Record<\n string,\n unknown\n >;\n Object.assign(meta, patch);\n fs.writeFileSync(metaPath, `${JSON.stringify(meta, null, 2)}\\n`, \"utf8\");\n}\n\n/**\n * Browse public marketplace templates with search + Load more…\n */\nexport async function pickPublicTemplateInteractive(\n ff: FeeeF,\n initialQuery = \"\",\n): Promise<StoreTemplateEntity> {\n let page = 1;\n let query = initialQuery.trim();\n const accumulated: StoreTemplateEntity[] = [];\n let total: number | undefined;\n let lastBatchSize = 0;\n\n const resetList = (): void => {\n page = 1;\n accumulated.length = 0;\n total = undefined;\n lastBatchSize = 0;\n };\n\n const fetchPage = async (): Promise<void> => {\n const s = spinner();\n const label =\n page === 1\n ? query\n ? `Searching public templates for “${query}”…`\n : \"Loading public templates…\"\n : `Loading more (page ${page})…`;\n s.start(label);\n const res = await ff.storeTemplates.list({\n page,\n limit: PAGE_SIZE,\n policy: TemplateComponentPolicy.public,\n ...(query ? { q: query } : {}),\n });\n s.stop(page === 1 ? \"Templates loaded\" : \"More templates loaded\");\n if (typeof res.total === \"number\") total = res.total;\n const batch = res.data || [];\n lastBatchSize = batch.length;\n accumulated.push(...batch);\n };\n\n for (;;) {\n if (accumulated.length === 0) {\n await fetchPage();\n }\n\n if (accumulated.length === 0) {\n const again = await select({\n message: query\n ? `No public templates matched “${query}”`\n : \"No public templates found\",\n options: [\n { value: SEARCH, label: \"Search again…\" },\n ...(query\n ? [{ value: CLEAR_SEARCH, label: \"Clear search (show all)\" }]\n : []),\n ],\n });\n if (again === CLEAR_SEARCH) {\n query = \"\";\n resetList();\n continue;\n }\n query = (\n await text({\n message: \"Search templates\",\n placeholder: \"dawn, fashion, …\",\n })\n ).trim();\n resetList();\n continue;\n }\n\n const hasMore =\n lastBatchSize >= PAGE_SIZE &&\n (total == null || accumulated.length < total);\n\n const options: { value: string; label: string; hint?: string }[] = [\n ...accumulated.map((row) => ({\n value: row.id,\n label: formatTemplateLabel(row),\n hint: row.id,\n })),\n {\n value: SEARCH,\n label: `${pc.dim(\"⌕\")} Search…`,\n hint: query ? `current: ${query}` : \"filter by title\",\n },\n ];\n\n if (query) {\n options.push({\n value: CLEAR_SEARCH,\n label: `${pc.dim(\"×\")} Clear search`,\n hint: query,\n });\n }\n\n if (hasMore) {\n const hint =\n total != null\n ? `${accumulated.length} of ${total}`\n : `loaded ${accumulated.length}`;\n options.push({\n value: LOAD_MORE,\n label: `${pc.dim(\"→\")} Load more…`,\n hint,\n });\n }\n\n const chosen = await select({\n message: query\n ? `Pick a public template (search: ${query})`\n : \"Pick a public template\",\n options,\n });\n\n if (chosen === SEARCH) {\n query = (\n await text({\n message: \"Search templates\",\n placeholder: \"dawn, fashion, …\",\n initialValue: query,\n })\n ).trim();\n resetList();\n continue;\n }\n\n if (chosen === CLEAR_SEARCH) {\n query = \"\";\n resetList();\n continue;\n }\n\n if (chosen === LOAD_MORE) {\n page += 1;\n await fetchPage();\n if (lastBatchSize === 0) {\n info(\"No more templates\");\n total = accumulated.length;\n }\n continue;\n }\n\n const picked = accumulated.find((row) => row.id === chosen);\n if (!picked) fail(\"Selected template not found\");\n return picked;\n }\n}\n\nasync function initFromBlank(\n dest: string,\n name: string,\n opts: { gitUrl?: string } = {},\n): Promise<{ method: \"git\" | \"local\"; source: string }> {\n const blank = path.join(scaffoldsRoot(), \"blank\");\n const gitUrl = opts.gitUrl || resolveBlankKitGitUrl();\n\n let result: { method: \"git\" | \"local\"; source: string };\n if (gitUrl) {\n const s = spinner();\n s.start(`Cloning kit from ${gitUrl}…`);\n try {\n result = cloneKitFromGit({ url: gitUrl, dest });\n s.stop(\"Kit cloned\");\n } catch (e) {\n s.stop(\"Git clone failed — falling back to local blank scaffold\");\n warn(\n e instanceof Error ? e.message : String(e),\n );\n if (fs.existsSync(dest)) {\n fs.rmSync(dest, { recursive: true, force: true });\n }\n if (!fs.existsSync(blank)) {\n fail(`Scaffold missing at ${blank}`);\n }\n result = copyKitFromLocal({ src: blank, dest, copyDir });\n }\n } else {\n if (!fs.existsSync(blank)) {\n fail(`Scaffold missing at ${blank}`);\n }\n result = copyKitFromLocal({ src: blank, dest, copyDir });\n }\n\n patchMeta(dest, { name });\n ensureNodePackage(dest, name);\n ensureAgentPack(dest);\n ensureEditorSupport(dest);\n return result;\n}\n\nasync function initFromPublicTemplate(\n dest: string,\n name: string,\n templateId: string,\n ff: FeeeF,\n): Promise<{ title: string; localeCount: number }> {\n const download = spinner();\n download.start(\"Downloading template…\");\n const full = await ff.storeTemplates.find({ id: templateId });\n download.stop(\"Template downloaded\");\n\n const data = full.data;\n if (!data || typeof data !== \"object\" || !(\"pages\" in data)) {\n fail(\"Template has no usable data.pages — cannot unpack\");\n }\n\n // Marketplace themes often ship `type: \"reference\"` library placements.\n // Those only resolve against the *source* store — local `feeef template\n // dev` uses the destination store and would render a blank page. Inline\n // them as `custom` before unpack so the theme is self-contained.\n const dataForUnpack = structuredClone(data) as Record<string, unknown>;\n if (full.storeId) {\n const matSpin = spinner();\n matSpin.start(\"Inlining library references…\");\n try {\n const mat = await materializeTemplateReferences({\n data: dataForUnpack,\n sourceStoreId: full.storeId,\n resolve: (args) => ff.actions.resolveComponents(args),\n });\n if (mat.missing.length > 0) {\n matSpin.stop(\n `Inlined ${mat.resolved} library component(s); ${mat.missing.length} missing`,\n );\n warn(\n `Unresolved refId(s): ${mat.missing.slice(0, 8).join(\", \")}${mat.missing.length > 8 ? \"…\" : \"\"}`,\n );\n } else {\n matSpin.stop(\n mat.resolved > 0\n ? `Inlined ${mat.resolved} library component(s)`\n : \"No library references to inline\",\n );\n }\n } catch (e) {\n matSpin.stop(\"Could not inline library references\");\n warn(e instanceof Error ? e.message : String(e));\n }\n } else {\n warn(\"Template has no storeId — skipping library reference inline\");\n }\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"feeef-init-\"));\n const dataPath = path.join(tmpDir, \"data.json\");\n try {\n fs.writeFileSync(\n dataPath,\n `${JSON.stringify(dataForUnpack, null, 2)}\\n`,\n \"utf8\",\n );\n const { unpackTemplate } = await loadUnpack();\n const unpackSpin = spinner();\n unpackSpin.start(\"Unpacking template files…\");\n const stats = unpackTemplate({\n inputPath: dataPath,\n outDir: dest,\n force: true,\n });\n unpackSpin.stop(\n `Unpacked ${stats.pages} pages / ${stats.components} components (${stats.files} files)`,\n );\n } finally {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n }\n\n let localeCount = 0;\n let defaultLocale: string | undefined;\n\n try {\n const localeSpin = spinner();\n localeSpin.start(\"Fetching locales…\");\n const locales = await ff.storeTemplates.listLocales(templateId);\n localeSpin.stop(\"Locales loaded\");\n defaultLocale = locales.defaultLocale;\n if (locales.messages && Object.keys(locales.messages).length > 0) {\n localeCount = writeLocaleFiles(dest, locales.messages);\n }\n } catch {\n const embedded = (data as { i18n?: { messages?: Record<string, Record<string, unknown>>; defaultLocale?: string } }).i18n;\n if (embedded?.messages) {\n localeCount = writeLocaleFiles(dest, embedded.messages);\n defaultLocale = embedded.defaultLocale;\n }\n }\n\n patchMeta(dest, {\n name,\n ...(defaultLocale ? { defaultLocale } : {}),\n sourceTemplateId: templateId,\n sourceTitle: full.title,\n });\n\n ensureNodePackage(dest, name);\n ensureAgentPack(dest);\n ensureEditorSupport(dest);\n saveProjectRc(dest, { templateId });\n\n const readmePath = path.join(dest, \"README.md\");\n if (!fs.existsSync(readmePath)) {\n fs.writeFileSync(\n readmePath,\n [\n `# ${name}`,\n \"\",\n `Cloned from public template **${full.title}** (\\`${templateId}\\`).`,\n \"\",\n \"This folder is a Node.js package — scripts wrap the global `feeef` CLI.\",\n \"\",\n \"```bash\",\n \"feeef signin\",\n \"feeef use\",\n \"npm run build\",\n \"npm run dev\",\n \"npm run publish -- --apply\",\n \"```\",\n \"\",\n ].join(\"\\n\"),\n \"utf8\",\n );\n }\n\n return { title: full.title, localeCount };\n}\n\nexport async function runTemplateInit(\n nameArg: string | undefined,\n opts: {\n blank?: boolean;\n from?: string;\n search?: string;\n /** Git URL for official/blank kit (Laravel-style). */\n git?: string;\n } = {},\n): Promise<void> {\n intro(\"feeef template init\");\n try {\n let source: \"blank\" | \"public\" | \"git\" = opts.blank\n ? \"blank\"\n : opts.from\n ? \"public\"\n : opts.git\n ? \"git\"\n : await select({\n message: \"Start from\",\n options: [\n {\n value: \"blank\",\n label: \"Blank template\",\n hint: resolveBlankKitGitUrl()\n ? \"git clone official / monorepo kit\"\n : \"local scaffold\",\n },\n {\n value: \"git\",\n label: \"Git kit URL\",\n hint: \"clone --depth 1 (Adonis/Laravel style)\",\n },\n {\n value: \"public\",\n label: \"Public marketplace template\",\n hint: \"search + unpack\",\n },\n ],\n });\n\n const name =\n nameArg ||\n (await text({\n message: \"Template folder name\",\n placeholder: \"my-template\",\n validate: validateFolderName,\n }));\n\n const dest = path.resolve(process.cwd(), name);\n if (fs.existsSync(dest) && fs.readdirSync(dest).length > 0) {\n fail(`Directory not empty: ${dest}`);\n }\n\n if (source === \"blank\" || source === \"git\") {\n let gitUrl = opts.git;\n if (source === \"git\" && !gitUrl) {\n gitUrl = (\n await text({\n message: \"Git kit URL\",\n placeholder: \"https://github.com/feeef/theme-blank.git\",\n validate: (v) => (!v?.trim() ? \"URL required\" : undefined),\n })\n ).trim();\n }\n const kit = await initFromBlank(dest, name, {\n ...(gitUrl ? { gitUrl } : {}),\n });\n ok(`Created ${dest} (${kit.method}: ${kit.source})`);\n info(\n \"Next:\\n cd \" +\n name +\n \"\\n feeef signin\\n feeef use\\n npm run build\",\n );\n outro(\"Template scaffold ready\");\n return;\n }\n\n const { ff } = createClient({ requireAuth: false });\n let templateId = opts.from;\n\n if (!templateId) {\n const picked = await pickPublicTemplateInteractive(ff, opts.search || \"\");\n templateId = picked.id;\n info(`Selected ${formatTemplateLabel(picked)}`);\n }\n\n const result = await initFromPublicTemplate(dest, name, templateId, ff);\n ok(`Created ${dest} from “${result.title}”`);\n if (result.localeCount > 0) {\n info(`Wrote ${result.localeCount} locale file(s)`);\n }\n info(\n \"Next:\\n cd \" +\n name +\n \"\\n feeef signin\\n feeef use\\n npm run build\\n npm run dev\",\n );\n outro(\"Template cloned and ready\");\n } catch (e) {\n fail(e);\n }\n}\n","import { execFileSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { cliRoot } from \"./kit.js\";\n\n/**\n * Official kit ids. Blank ships in the CLI scaffold and as `theme-kits/blank`\n * in the monorepo (git-backed). Production default points at the public GitHub\n * kit; clone falls back to the local scaffold if git fails.\n */\nexport type OfficialKitId = \"blank\";\n\n/** Public GitHub starter (publish `theme-kits/blank` here when ready). */\nexport const DEFAULT_BLANK_KIT_GIT =\n \"https://github.com/feeef/theme-blank.git\";\n\nexport interface KitCloneResult {\n method: \"git\" | \"local\";\n source: string;\n}\n\n/**\n * Resolve which git URL to use for the blank kit.\n *\n * - `FEEEF_THEME_BLANK_GIT=local` or `0` → force local scaffold (no clone)\n * - `FEEEF_THEME_BLANK_GIT=<url|path>` → that source\n * - else monorepo `theme-kits/blank` if it has `.git`\n * - else {@link DEFAULT_BLANK_KIT_GIT} (clone may fail → scaffold fallback)\n */\nexport function resolveBlankKitGitUrl(\n root: string = cliRoot(),\n): string | undefined {\n const raw = process.env[\"FEEEF_THEME_BLANK_GIT\"];\n if (raw !== undefined) {\n const trimmed = raw.trim();\n if (trimmed === \"\" || trimmed === \"0\" || trimmed === \"local\") {\n return undefined;\n }\n return trimmed;\n }\n\n const monorepoKit = path.resolve(root, \"..\", \"theme-kits\", \"blank\");\n if (fs.existsSync(path.join(monorepoKit, \".git\"))) {\n return monorepoKit;\n }\n\n return DEFAULT_BLANK_KIT_GIT;\n}\n\n/** @deprecated Prefer {@link resolveBlankKitGitUrl} */\nexport function blankGitUrlFromEnv(): string | undefined {\n return resolveBlankKitGitUrl();\n}\n\n/**\n * Shallow-clone a theme kit into `dest` (dest must not exist or be empty).\n * Removes the nested `.git` so the user's theme starts as a fresh tree\n * (they can `git init` themselves).\n */\nexport function cloneKitFromGit(opts: {\n url: string;\n dest: string;\n /** Passed to git clone (default 1). */\n depth?: number;\n}): KitCloneResult {\n const dest = path.resolve(opts.dest);\n if (fs.existsSync(dest)) {\n const entries = fs.readdirSync(dest);\n if (entries.length > 0) {\n throw new Error(`Destination not empty: ${dest}`);\n }\n fs.rmSync(dest, { recursive: true, force: true });\n }\n\n const depth = opts.depth ?? 1;\n execFileSync(\n \"git\",\n [\"clone\", `--depth=${depth}`, opts.url, dest],\n { stdio: [\"ignore\", \"pipe\", \"pipe\"] },\n );\n\n const gitDir = path.join(dest, \".git\");\n if (fs.existsSync(gitDir)) {\n fs.rmSync(gitDir, { recursive: true, force: true });\n }\n\n return { method: \"git\", source: opts.url };\n}\n\nexport function copyKitFromLocal(opts: {\n src: string;\n dest: string;\n copyDir: (src: string, dest: string) => void;\n}): KitCloneResult {\n if (!fs.existsSync(opts.src)) {\n throw new Error(`Local kit missing: ${opts.src}`);\n }\n opts.copyDir(opts.src, opts.dest);\n return { method: \"local\", source: opts.src };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { scaffoldsRoot } from \"./kit.js\";\n\n/** npm package name from template folder (letters/digits/-/_ → lowercase). */\nexport function packageNameFromFolder(name: string): string {\n return name.toLowerCase();\n}\n\nexport const DEFAULT_PACKAGE_JSON = {\n name: \"feeef-template\",\n private: true,\n version: \"0.1.0\",\n description: \"Feeef Lithium template\",\n type: \"module\",\n engines: { node: \">=18\" },\n scripts: {\n build: \"feeef template build\",\n check: \"feeef template check\",\n test: \"feeef template smoke\",\n dev: \"feeef template dev\",\n publish: \"feeef template publish\",\n typecheck: \"tsc --noEmit\",\n },\n dependencies: {},\n devDependencies: {\n \"@types/react\": \"^19.0.0\",\n \"@types/react-dom\": \"^19.0.0\",\n typescript: \"^5.4.5\",\n },\n} as const;\n\nexport const DEFAULT_GITIGNORE = `node_modules/\ndist/\n.env\n.env.local\n.DS_Store\n`;\n\n/** Files/dirs copied for AI + editor DX (missing only; never overwrite). */\nconst AGENT_PACK_ENTRIES = [\"AGENTS.md\", \"docs\", \".cursor\"] as const;\n\n/** Editor / tsserver support — copied when missing. */\nconst EDITOR_PACK_ENTRIES = [\n \"tsconfig.json\",\n \"types\",\n \".vscode\",\n] as const;\n\nconst EDITOR_DEV_DEPS: Record<string, string> = {\n \"@types/react\": \"^19.0.0\",\n \"@types/react-dom\": \"^19.0.0\",\n typescript: \"^5.4.5\",\n};\n\nfunction copyDir(src: string, dest: string): void {\n fs.mkdirSync(dest, { recursive: true });\n for (const entry of fs.readdirSync(src, { withFileTypes: true })) {\n if (entry.name === \".\" || entry.name === \"..\") continue;\n if (\n entry.name === \"node_modules\" ||\n entry.name === \".git\" ||\n entry.name === \".env\" ||\n entry.name.startsWith(\".env.\")\n ) {\n continue;\n }\n const from = path.join(src, entry.name);\n const to = path.join(dest, entry.name);\n if (entry.isDirectory()) copyDir(from, to);\n else fs.copyFileSync(from, to);\n }\n}\n\nfunction copyEntryIfMissing(from: string, to: string): boolean {\n if (!fs.existsSync(from) || fs.existsSync(to)) return false;\n const st = fs.statSync(from);\n if (st.isDirectory()) copyDir(from, to);\n else {\n fs.mkdirSync(path.dirname(to), { recursive: true });\n fs.copyFileSync(from, to);\n }\n return true;\n}\n\n/**\n * Ensure theme has AI authoring pack (`AGENTS.md`, `docs/`, `.cursor/`).\n * Skips if `AGENTS.md` already exists (do not overwrite author customizations).\n */\nexport function ensureAgentPack(dest: string): boolean {\n const agentsPath = path.join(dest, \"AGENTS.md\");\n if (fs.existsSync(agentsPath)) return false;\n\n const blank = path.join(scaffoldsRoot(), \"blank\");\n let copied = false;\n for (const name of AGENT_PACK_ENTRIES) {\n if (copyEntryIfMissing(path.join(blank, name), path.join(dest, name))) {\n copied = true;\n }\n }\n return copied;\n}\n\n/**\n * Ensure VS Code / tsserver understand `component.tsx`:\n * `tsconfig.json`, `types/feeef-live-scope.d.ts`, `.vscode/`, and React type deps.\n *\n * Safe to call on every init — only fills missing files / missing deps.\n */\nexport function ensureEditorSupport(dest: string): boolean {\n const blank = path.join(scaffoldsRoot(), \"blank\");\n let changed = false;\n\n for (const name of EDITOR_PACK_ENTRIES) {\n if (copyEntryIfMissing(path.join(blank, name), path.join(dest, name))) {\n changed = true;\n }\n }\n\n // Always ensure ambient type files exist (even if types/ was partial).\n const scopeFrom = path.join(blank, \"types\", \"feeef-live-scope.d.ts\");\n const scopeTo = path.join(dest, \"types\", \"feeef-live-scope.d.ts\");\n if (copyEntryIfMissing(scopeFrom, scopeTo)) changed = true;\n\n const themeSchemaFrom = path.join(blank, \"types\", \"feeef-template-schema.d.ts\");\n const themeSchemaTo = path.join(dest, \"types\", \"feeef-template-schema.d.ts\");\n if (copyEntryIfMissing(themeSchemaFrom, themeSchemaTo)) changed = true;\n\n // Seed typed schema overlay when the theme has none (blank / older inits).\n if (copyEntryIfMissing(path.join(blank, \"schema.ts\"), path.join(dest, \"schema.ts\"))) {\n changed = true;\n }\n if (copyEntryIfMissing(path.join(blank, \"props.json\"), path.join(dest, \"props.json\"))) {\n changed = true;\n }\n\n const pkgPath = path.join(dest, \"package.json\");\n if (fs.existsSync(pkgPath)) {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf8\")) as Record<\n string,\n unknown\n >;\n const scripts =\n pkg.scripts && typeof pkg.scripts === \"object\"\n ? ({ ...(pkg.scripts as Record<string, string>) } as Record<\n string,\n string\n >)\n : {};\n if (!scripts.typecheck) {\n scripts.typecheck = \"tsc --noEmit\";\n pkg.scripts = scripts;\n changed = true;\n }\n const devDeps =\n pkg.devDependencies && typeof pkg.devDependencies === \"object\"\n ? ({ ...(pkg.devDependencies as Record<string, string>) } as Record<\n string,\n string\n >)\n : {};\n for (const [name, version] of Object.entries(EDITOR_DEV_DEPS)) {\n if (!devDeps[name]) {\n devDeps[name] = version;\n changed = true;\n }\n }\n pkg.devDependencies = devDeps;\n fs.writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`, \"utf8\");\n }\n\n return changed;\n}\n\n/**\n * Ensure the theme is a Node package: package.json (name patched) + .gitignore.\n * Used after blank copy and after marketplace unpack (unpack does not create these).\n */\nexport function ensureNodePackage(dest: string, folderName: string): void {\n const pkgName = packageNameFromFolder(folderName);\n const pkgPath = path.join(dest, \"package.json\");\n\n if (fs.existsSync(pkgPath)) {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf8\")) as Record<\n string,\n unknown\n >;\n pkg.name = pkgName;\n if (!pkg.scripts || typeof pkg.scripts !== \"object\") {\n pkg.scripts = { ...DEFAULT_PACKAGE_JSON.scripts };\n }\n const scripts = pkg.scripts as Record<string, string>;\n for (const [key, value] of Object.entries(DEFAULT_PACKAGE_JSON.scripts)) {\n if (!scripts[key]) scripts[key] = value;\n }\n const devDeps =\n pkg.devDependencies && typeof pkg.devDependencies === \"object\"\n ? (pkg.devDependencies as Record<string, string>)\n : {};\n for (const [name, version] of Object.entries(EDITOR_DEV_DEPS)) {\n if (!devDeps[name]) devDeps[name] = version;\n }\n pkg.devDependencies = devDeps;\n fs.writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`, \"utf8\");\n } else {\n fs.writeFileSync(\n pkgPath,\n `${JSON.stringify({ ...DEFAULT_PACKAGE_JSON, name: pkgName }, null, 2)}\\n`,\n \"utf8\",\n );\n }\n\n const gitignorePath = path.join(dest, \".gitignore\");\n if (!fs.existsSync(gitignorePath)) {\n fs.writeFileSync(gitignorePath, DEFAULT_GITIGNORE, \"utf8\");\n } else {\n const existing = fs.readFileSync(gitignorePath, \"utf8\");\n const extras: string[] = [];\n if (\n !/(^|\\/)node_modules\\/?$/m.test(existing) &&\n !existing.includes(\"node_modules\")\n ) {\n extras.push(\"node_modules/\");\n }\n if (!/(^|\\/)dist\\/?$/m.test(existing) && !existing.includes(\"dist/\")) {\n extras.push(\"dist/\");\n }\n if (extras.length > 0) {\n const sep = existing.endsWith(\"\\n\") ? \"\" : \"\\n\";\n fs.writeFileSync(\n gitignorePath,\n `${existing}${sep}${extras.join(\"\\n\")}\\n`,\n \"utf8\",\n );\n }\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\n\nexport interface PublishableComponent {\n sourceKey: string;\n kind: \"shared\" | \"library\";\n dir: string;\n meta: Record<string, unknown>;\n code: string;\n}\n\nexport interface LocaleUpload {\n locale: string;\n messages: Record<string, unknown>;\n isDefault: boolean;\n}\n\nexport function collectPublishableComponents(\n srcDir: string,\n): PublishableComponent[] {\n const out: PublishableComponent[] = [];\n\n for (const kind of [\"shared\", \"library\"] as const) {\n const root = path.join(srcDir, kind, \"components\");\n if (!fs.existsSync(root)) continue;\n\n /** Collect flat files + folders (folder wins on id conflict). */\n const byId = new Map<string, string>();\n for (const ent of fs.readdirSync(root, { withFileTypes: true })) {\n if (ent.name.startsWith(\".\")) continue;\n if (ent.isDirectory()) {\n byId.set(ent.name, path.join(root, ent.name));\n }\n }\n for (const ent of fs.readdirSync(root, { withFileTypes: true })) {\n if (ent.name.startsWith(\".\") || !ent.isFile()) continue;\n const m = /^(.*)\\.(tsx|jsx|json)$/.exec(ent.name);\n if (!m) continue;\n const id = m[1]!;\n if (byId.has(id)) continue;\n byId.set(id, path.join(root, ent.name));\n }\n const entries = [...byId.entries()]\n .map(([id, entryPath]) => ({ id, entryPath }))\n .sort((a, b) => a.id.localeCompare(b.id));\n\n for (const { id: name, entryPath } of entries) {\n const isDir = fs.statSync(entryPath).isDirectory();\n const metaPath = isDir\n ? path.join(entryPath, \"component.json\")\n : entryPath.endsWith(\".json\")\n ? entryPath\n : null;\n const tsxPath = isDir\n ? path.join(entryPath, \"component.tsx\")\n : entryPath.endsWith(\".tsx\")\n ? entryPath\n : null;\n const jsxPath = isDir\n ? path.join(entryPath, \"component.jsx\")\n : entryPath.endsWith(\".jsx\")\n ? entryPath\n : null;\n const entry = tsxPath && fs.existsSync(tsxPath)\n ? tsxPath\n : jsxPath && fs.existsSync(jsxPath)\n ? jsxPath\n : null;\n\n let meta: Record<string, unknown> = {};\n if (metaPath && fs.existsSync(metaPath)) {\n meta = JSON.parse(fs.readFileSync(metaPath, \"utf8\")) as Record<\n string,\n unknown\n >;\n }\n\n let code = typeof meta[\"code\"] === \"string\" ? meta[\"code\"] : \"\";\n if (entry) {\n const source = fs.readFileSync(entry, \"utf8\");\n // Prefer file body as code; build will strip meta export.\n code = source;\n const metaMatch = source.match(\n /export\\s+const\\s+meta(?:\\s+satisfies\\s+[^=]+)?\\s*=\\s*(\\{[\\s\\S]*?\\})\\s*(?:as\\s+const)?\\s*;?/,\n );\n if (metaMatch?.[1]) {\n try {\n // Best-effort for publish catalog title; full parse happens in kit build.\n meta = { ...meta, ...(new Function(`return (${metaMatch[1]})`)() as object) };\n } catch {\n /* keep json meta */\n }\n }\n }\n if (!code.trim() && !(metaPath && fs.existsSync(metaPath))) continue;\n if (!code.trim()) continue;\n\n const sourceKey =\n (typeof meta[\"libraryId\"] === \"string\" && meta[\"libraryId\"]) ||\n (typeof meta[\"id\"] === \"string\" && meta[\"id\"]) ||\n name;\n\n out.push({ sourceKey, kind, dir: entryPath, meta, code });\n }\n }\n\n const seen = new Set<string>();\n return out.filter((c) => {\n if (seen.has(c.sourceKey)) return false;\n seen.add(c.sourceKey);\n return true;\n });\n}\n\nexport function rewriteDataToReferences(\n data: unknown,\n codeToRefId: Map<string, string>,\n): unknown {\n if (!data || typeof data !== \"object\") return data;\n\n const walk = (node: unknown): unknown => {\n if (!node || typeof node !== \"object\") return node;\n if (Array.isArray(node)) return node.map(walk);\n\n const obj = node as Record<string, unknown>;\n if (\n (obj[\"type\"] === \"custom\" || !obj[\"type\"]) &&\n typeof obj[\"code\"] === \"string\" &&\n codeToRefId.has(obj[\"code\"].trim())\n ) {\n const refId = codeToRefId.get(obj[\"code\"].trim());\n const {\n code: _c,\n propsSchema: _ps,\n slotsSchema: _ss,\n ...rest\n } = obj;\n return walk({ ...rest, type: \"reference\", refId });\n }\n\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n out[k] = walk(v);\n }\n return out;\n };\n\n return walk(data);\n}\n\nexport function stripDataI18n(\n data: Record<string, unknown>,\n): Record<string, unknown> {\n const clone = structuredClone(data);\n delete clone[\"i18n\"];\n return clone;\n}\n\nexport function loadDistLocales(\n distDir: string,\n defaultLocale = \"en\",\n): LocaleUpload[] {\n const localesDir = path.join(distDir, \"locales\");\n if (!fs.existsSync(localesDir)) return [];\n\n return fs\n .readdirSync(localesDir)\n .filter((f) => f.endsWith(\".json\"))\n .map((f) => {\n const locale = path.basename(f, \".json\");\n const messages = JSON.parse(\n fs.readFileSync(path.join(localesDir, f), \"utf8\"),\n ) as Record<string, unknown>;\n return {\n locale,\n messages,\n isDefault: locale === defaultLocale,\n };\n });\n}\n\n/** Slim resolve payload (matches `actions/resolveComponents`). */\nexport interface ResolvedLibraryEntry {\n id: string;\n code: string;\n propsSchema?: Record<string, unknown>;\n slotsSchema?: Record<string, unknown> | null;\n propsDefault?: Record<string, unknown>;\n slotsDefault?: Record<string, unknown> | null;\n slotsLayout?: Record<string, unknown> | null;\n title?: string;\n deprecated?: boolean;\n}\n\nconst MAX_REF_DEPTH = 6;\nconst MAX_REF_ROUNDS = 4;\n\nexport function collectTemplateRefIds(data: unknown): Set<string> {\n const out = new Set<string>();\n\n const walkComp = (\n node: unknown,\n depth: number,\n ): void => {\n if (!node || typeof node !== \"object\" || depth > MAX_REF_DEPTH) return;\n if (Array.isArray(node)) {\n for (const item of node) walkComp(item, depth);\n return;\n }\n const obj = node as Record<string, unknown>;\n if (obj[\"type\"] === \"reference\") {\n const raw = obj[\"refId\"] ?? obj[\"ref_id\"];\n if (typeof raw === \"string\" && raw.trim()) out.add(raw.trim());\n }\n if (Array.isArray(obj[\"children\"])) {\n for (const ch of obj[\"children\"]) walkComp(ch, depth + 1);\n }\n if (obj[\"slots\"] && typeof obj[\"slots\"] === \"object\") {\n for (const arr of Object.values(obj[\"slots\"] as Record<string, unknown>)) {\n if (!Array.isArray(arr)) continue;\n for (const ch of arr) walkComp(ch, depth + 1);\n }\n }\n };\n\n const pages = (data as { pages?: Record<string, unknown> } | null)?.pages;\n if (!pages || typeof pages !== \"object\") return out;\n for (const page of Object.values(pages)) {\n const sections = (page as { sections?: Record<string, unknown> })?.sections;\n if (!sections) continue;\n for (const section of Object.values(sections)) {\n const comps = (section as { components?: unknown[] })?.components;\n if (!Array.isArray(comps)) continue;\n for (const c of comps) walkComp(c, 0);\n }\n }\n return out;\n}\n\nfunction mergeDeep(\n base: Record<string, unknown> | null | undefined,\n override: Record<string, unknown> | null | undefined,\n): Record<string, unknown> {\n if (!override || typeof override !== \"object\") return base ? { ...base } : {};\n if (!base || typeof base !== \"object\") return { ...override };\n const out: Record<string, unknown> = { ...base };\n for (const key of Object.keys(override)) {\n const ov = override[key];\n const bv = base[key];\n if (\n ov !== null &&\n typeof ov === \"object\" &&\n !Array.isArray(ov) &&\n bv !== null &&\n typeof bv === \"object\" &&\n !Array.isArray(bv)\n ) {\n out[key] = mergeDeep(\n bv as Record<string, unknown>,\n ov as Record<string, unknown>,\n );\n } else {\n out[key] = ov;\n }\n }\n return out;\n}\n\nfunction mergeSlots(\n base: Record<string, unknown[]> | null | undefined,\n override: Record<string, unknown[]> | null | undefined,\n): Record<string, unknown[]> | null {\n const hasBase = !!(base && Object.keys(base).length > 0);\n const hasOverride = !!(override && Object.keys(override).length > 0);\n if (!hasBase && !hasOverride) return null;\n const out: Record<string, unknown[]> = {};\n if (hasBase) {\n for (const [k, v] of Object.entries(base!)) {\n out[k] = Array.isArray(v) ? [...v] : [];\n }\n }\n if (hasOverride) {\n for (const [k, v] of Object.entries(override!)) {\n if (Array.isArray(v)) out[k] = v;\n }\n }\n return out;\n}\n\nfunction materializeNode(\n comp: Record<string, unknown> | null | undefined,\n resolved: Record<string, ResolvedLibraryEntry>,\n depth: number,\n): Record<string, unknown> | null {\n if (!comp || depth > MAX_REF_DEPTH) return comp ?? null;\n\n if (Array.isArray(comp[\"children\"])) {\n const next: Record<string, unknown>[] = [];\n for (const child of comp[\"children\"] as unknown[]) {\n const rewritten = materializeNode(\n child as Record<string, unknown>,\n resolved,\n depth + 1,\n );\n if (rewritten) next.push(rewritten);\n }\n comp[\"children\"] = next;\n }\n\n if (comp[\"slots\"] && typeof comp[\"slots\"] === \"object\") {\n const slots = comp[\"slots\"] as Record<string, unknown>;\n for (const [slotKey, arr] of Object.entries(slots)) {\n if (!Array.isArray(arr)) continue;\n const next: Record<string, unknown>[] = [];\n for (const child of arr) {\n const rewritten = materializeNode(\n child as Record<string, unknown>,\n resolved,\n depth + 1,\n );\n if (rewritten) next.push(rewritten);\n }\n slots[slotKey] = next;\n }\n }\n\n if (comp[\"type\"] !== \"reference\") return comp;\n\n const refId = comp[\"refId\"] ?? comp[\"ref_id\"];\n if (typeof refId !== \"string\" || !refId.trim()) return null;\n const entry = resolved[refId.trim()];\n if (!entry) return null;\n\n const mergedProps = mergeDeep(\n entry.propsDefault ?? {},\n (comp[\"props\"] as Record<string, unknown> | undefined) ?? {},\n );\n const mergedSlots = mergeSlots(\n entry.slotsDefault as Record<string, unknown[]> | null | undefined,\n comp[\"slots\"] as Record<string, unknown[]> | null | undefined,\n );\n\n const materialized: Record<string, unknown> = {\n ...comp,\n type: \"custom\",\n code: entry.code,\n propsSchema: entry.propsSchema ?? {},\n slotsSchema: entry.slotsSchema ?? {},\n props: mergedProps,\n slots: mergedSlots,\n };\n if (entry.slotsLayout != null && materialized[\"slotsLayout\"] == null) {\n materialized[\"slotsLayout\"] = entry.slotsLayout;\n }\n delete materialized[\"refId\"];\n delete materialized[\"ref_id\"];\n delete materialized[\"refVersion\"];\n return materialized;\n}\n\n/**\n * Rewrite every `type: \"reference\"` node into inline `custom` using a\n * pre-fetched resolve catalog. Mutates `data` in place.\n */\nexport function rewriteReferencesInTemplateData(\n data: Record<string, unknown>,\n resolved: Record<string, ResolvedLibraryEntry>,\n): void {\n const pages = data[\"pages\"];\n if (!pages || typeof pages !== \"object\") return;\n\n for (const page of Object.values(pages as Record<string, unknown>)) {\n if (!page || typeof page !== \"object\") continue;\n const sections = (page as Record<string, unknown>)[\"sections\"];\n if (!sections || typeof sections !== \"object\") continue;\n for (const section of Object.values(sections as Record<string, unknown>)) {\n if (!section || typeof section !== \"object\") continue;\n const comps = (section as Record<string, unknown>)[\"components\"];\n if (!Array.isArray(comps)) continue;\n const next: Record<string, unknown>[] = [];\n for (const c of comps) {\n const rewritten = materializeNode(\n c as Record<string, unknown>,\n resolved,\n 0,\n );\n if (rewritten) next.push(rewritten);\n }\n (section as Record<string, unknown>)[\"components\"] = next;\n }\n }\n}\n\nexport type ResolveComponentsFn = (opts: {\n storeId: string;\n ids: string[];\n}) => Promise<{\n resolved: Record<string, ResolvedLibraryEntry>;\n missing?: string[];\n}>;\n\n/**\n * Resolve marketplace/library `refId`s against `sourceStoreId` and inline\n * them as `custom` so local `feeef template dev` does not depend on the\n * destination store owning those library rows.\n */\nexport async function materializeTemplateReferences(opts: {\n data: Record<string, unknown>;\n sourceStoreId: string;\n resolve: ResolveComponentsFn;\n}): Promise<{ resolved: number; missing: string[] }> {\n const catalog: Record<string, ResolvedLibraryEntry> = {};\n const allMissing = new Set<string>();\n let resolvedCount = 0;\n\n for (let round = 0; round < MAX_REF_ROUNDS; round++) {\n const ids = [...collectTemplateRefIds(opts.data)].filter(\n (id) => !(id in catalog),\n );\n if (ids.length === 0) break;\n\n const res = await opts.resolve({\n storeId: opts.sourceStoreId,\n ids,\n });\n const batch = res.resolved ?? {};\n for (const [id, entry] of Object.entries(batch)) {\n catalog[id] = entry;\n resolvedCount += 1;\n }\n for (const id of res.missing ?? []) allMissing.add(id);\n\n rewriteReferencesInTemplateData(opts.data, catalog);\n if (Object.keys(batch).length === 0) break;\n }\n\n const leftover = [...collectTemplateRefIds(opts.data)];\n for (const id of leftover) allMissing.add(id);\n\n return {\n resolved: resolvedCount,\n missing: [...allMissing],\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { createClient } from \"../../client.js\";\nimport { saveConfig } from \"../../config.js\";\nimport { cliRoot, loadBuild } from \"../../kit.js\";\nimport {\n loadProjectRc,\n loadTemplateMeta,\n resolveStoreIdFromProject,\n resolveThemeDir,\n saveProjectRc,\n} from \"../../project.js\";\nimport {\n collectPublishableComponents,\n loadDistLocales,\n rewriteDataToReferences,\n stripDataI18n,\n} from \"../../theme.js\";\nimport { askApply } from \"../use.js\";\nimport {\n fail,\n info,\n intro,\n ok,\n outro,\n pc,\n spinner,\n warn,\n} from \"../../ui.js\";\n\nconst SOURCE_TAG_PREFIX = \"feeef-source:\";\n\nexport interface PublishOptions {\n public?: boolean;\n unlisted?: boolean;\n store?: string;\n title?: string;\n yes?: boolean;\n apply?: boolean;\n /** Commander --no-apply sets apply=false */\n}\n\nexport async function runTemplatePublish(\n dirArg: string | undefined,\n opts: PublishOptions & { apply?: boolean },\n): Promise<void> {\n intro(\"feeef template publish\");\n try {\n const { ff, http, cfg } = createClient();\n const srcDir = resolveThemeDir(dirArg);\n const meta = loadTemplateMeta(srcDir);\n const rc = loadProjectRc(srcDir);\n\n const policy = opts.public\n ? \"public\"\n : opts.unlisted\n ? \"unlisted\"\n : \"private\";\n\n let storeId = resolveStoreIdFromProject({\n themeRoot: srcDir,\n globalCfg: cfg,\n ...(opts.store ? { storeFlag: opts.store } : {}),\n });\n\n if (!storeId) {\n const listed = await ff.stores.list({ limit: 50 });\n const stores = listed.data || [];\n if (stores.length === 0) fail(\"No stores on this account\");\n if (stores.length === 1 || opts.yes) {\n storeId = stores[0]!.id;\n } else {\n fail(\"No store linked. Run: feeef use <storeId|slug>\");\n }\n }\n\n const store = await ff.stores.find({ id: storeId! });\n const title =\n opts.title || rc.title || meta.name || path.basename(srcDir);\n\n info(`Template ${srcDir}`);\n info(`Store ${store.slug || storeId} (${policy})`);\n\n const outPath = path.join(srcDir, \"dist\", \"data.json\");\n const s = spinner();\n s.start(\"Building…\");\n const { buildTemplate } = await loadBuild();\n const built = buildTemplate({ srcDir, outPath, write: true });\n for (const w of built.warnings || []) {\n warn(`[${w.path}] ${w.message}`);\n }\n s.stop(`Built (${built.localeCount ?? 0} locales)`);\n\n const dataRaw = JSON.parse(fs.readFileSync(outPath, \"utf8\")) as Record<\n string,\n unknown\n >;\n const i18n = dataRaw[\"i18n\"] as\n | { defaultLocale?: string }\n | undefined;\n const defaultLocale =\n i18n?.defaultLocale ||\n (typeof meta.defaultLocale === \"string\" ? meta.defaultLocale : \"en\");\n\n const distSchemaPath = path.join(srcDir, \"dist\", \"schema.json\");\n let schema: Record<string, unknown>;\n if (fs.existsSync(distSchemaPath)) {\n schema = JSON.parse(fs.readFileSync(distSchemaPath, \"utf8\")) as Record<\n string,\n unknown\n >;\n } else {\n // Fallback if dist is stale: merge Lithium + theme overlay at publish time.\n const { buildPackagedSchema } = await import(\n pathToFileURL(\n path.join(cliRoot(), \"vendor/template-kit/lib/theme-schema.mjs\"),\n ).href\n );\n const { schema: packed } = buildPackagedSchema({\n srcDir,\n libraryDoc: fs.existsSync(path.join(srcDir, \"dist\", \"schema.library.json\"))\n ? (JSON.parse(\n fs.readFileSync(\n path.join(srcDir, \"dist\", \"schema.library.json\"),\n \"utf8\",\n ),\n ) as { components?: unknown[] })\n : { components: [] },\n });\n schema = packed as Record<string, unknown>;\n }\n\n // Ensure library is present even if an older dist/schema.json omitted it.\n const libraryPath = path.join(srcDir, \"dist\", \"schema.library.json\");\n if (fs.existsSync(libraryPath) && schema[\"library\"] == null) {\n const libDoc = JSON.parse(fs.readFileSync(libraryPath, \"utf8\")) as {\n library?: unknown;\n components?: unknown;\n };\n schema = {\n ...schema,\n library: libDoc.library ?? libDoc.components ?? libDoc,\n };\n }\n\n if (typeof schema[\"name\"] !== \"string\" || !schema[\"name\"]) {\n schema = { ...schema, name: title };\n }\n\n s.start(\"Publishing template_components…\");\n const publishables = collectPublishableComponents(srcDir);\n const codeToRefId = new Map<string, string>();\n const sourceKeyToRefId = new Map<string, string>();\n\n const existingList = await ff.templateComponents.list({\n storeId: storeId!,\n limit: 200,\n });\n const existingBySource = new Map<\n string,\n { id: string; tags?: string[] }\n >();\n for (const row of existingList.data || []) {\n const tag = (row.tags || []).find((t: string) =>\n String(t).startsWith(SOURCE_TAG_PREFIX),\n );\n if (tag) {\n existingBySource.set(\n String(tag).slice(SOURCE_TAG_PREFIX.length),\n row,\n );\n }\n }\n\n for (const comp of publishables) {\n const tags = [\n ...(Array.isArray(comp.meta[\"tags\"])\n ? (comp.meta[\"tags\"] as string[])\n : []),\n `${SOURCE_TAG_PREFIX}${comp.sourceKey}`,\n `feeef-kind:${comp.kind}`,\n ];\n const payload = {\n storeId: storeId!,\n title: (comp.meta[\"title\"] as string) || comp.sourceKey,\n subtitle: (comp.meta[\"subtitle\"] as string | null) ?? null,\n category: (comp.meta[\"category\"] as string) ?? comp.kind,\n tags,\n imageUrl: (comp.meta[\"imageUrl\"] as string | null) ?? null,\n code: comp.code,\n propsSchema: (comp.meta[\"propsSchema\"] as Record<string, unknown>) || {},\n slotsSchema: (comp.meta[\"slotsSchema\"] as Record<string, unknown> | null) ?? null,\n propsDefault:\n (comp.meta[\"props\"] as Record<string, unknown>) ||\n (comp.meta[\"propsDefault\"] as Record<string, unknown>) ||\n {},\n slotsDefault: (comp.meta[\"slotsDefault\"] as Record<string, unknown> | null) ?? null,\n slotsLayout: (comp.meta[\"slotsLayout\"] as Record<string, unknown> | null) ?? null,\n policy,\n price: 0,\n };\n\n const existing = existingBySource.get(comp.sourceKey);\n let row: { id: string };\n if (existing) {\n row = await ff.templateComponents.update({\n id: existing.id,\n data: {\n title: payload.title,\n subtitle: payload.subtitle,\n category: payload.category,\n tags: payload.tags,\n imageUrl: payload.imageUrl,\n code: payload.code,\n propsSchema: payload.propsSchema,\n slotsSchema: payload.slotsSchema,\n propsDefault: payload.propsDefault,\n slotsDefault: payload.slotsDefault,\n slotsLayout: payload.slotsLayout,\n policy: payload.policy as never,\n },\n });\n } else {\n row = await ff.templateComponents.create(payload as never);\n }\n codeToRefId.set(comp.code.trim(), row.id);\n sourceKeyToRefId.set(comp.sourceKey, row.id);\n }\n s.stop(`${publishables.length} components`);\n\n let data = rewriteDataToReferences(dataRaw, codeToRefId) as Record<\n string,\n unknown\n >;\n data = stripDataI18n(data);\n\n if (Array.isArray(schema[\"library\"])) {\n schema[\"library\"] = (schema[\"library\"] as Record<string, unknown>[]).map(\n (entry) => {\n const key = (entry[\"libraryId\"] || entry[\"id\"]) as string | undefined;\n if (key && sourceKeyToRefId.has(key)) {\n return { ...entry, refId: sourceKeyToRefId.get(key) };\n }\n return entry;\n },\n );\n }\n\n s.start(\"Publishing store_templates…\");\n let templateId =\n rc.templateId || cfg.lastPublishedTemplateId || undefined;\n let templateRow: { id: string; storeId: string } | null = null;\n\n if (templateId) {\n try {\n templateRow = await ff.storeTemplates.find({ id: templateId });\n if (templateRow && templateRow.storeId !== storeId) {\n templateRow = null;\n templateId = undefined;\n }\n } catch {\n templateRow = null;\n templateId = undefined;\n }\n }\n\n if (!templateRow) {\n const listed = await ff.storeTemplates.list({\n storeId: storeId!,\n limit: 50,\n q: title,\n });\n templateRow =\n (listed.data || []).find(\n (t: { storeId: string; title: string; id: string }) =>\n t.storeId === storeId && t.title === title,\n ) || null;\n templateId = templateRow?.id;\n }\n\n if (templateRow) {\n templateRow = await ff.storeTemplates.update({\n id: templateRow.id,\n data: { title, schema, data, policy: policy as never },\n });\n s.stop(`Updated ${templateRow.id}`);\n } else {\n templateRow = await ff.storeTemplates.create({\n storeId: storeId!,\n title,\n schema,\n data,\n policy: policy as never,\n price: 0,\n } as never);\n s.stop(`Created ${templateRow.id}`);\n }\n\n templateId = templateRow.id;\n saveConfig({\n defaultStoreId: storeId!,\n lastPublishedTemplateId: templateId,\n });\n saveProjectRc(srcDir, {\n store: storeId!,\n slug: store.slug,\n templateId,\n title,\n });\n\n const locales = loadDistLocales(path.join(srcDir, \"dist\"), defaultLocale);\n if (locales.length) {\n s.start(`Uploading ${locales.length} locales…`);\n if (typeof ff.storeTemplates.replaceLocales === \"function\") {\n await ff.storeTemplates.replaceLocales(templateId, locales);\n } else {\n await http.put(`/store_templates/${templateId}/locales`, { locales });\n }\n s.stop(`Locales: ${locales.map((l) => l.locale).join(\", \")}`);\n }\n\n const shouldApply =\n opts.yes && opts.apply !== false\n ? true\n : await askApply(store.slug || storeId!, opts.apply);\n\n if (shouldApply) {\n s.start(\"Installing on store…\");\n await ff.storeTemplates.install({\n fromId: templateId,\n storeId: storeId!,\n });\n s.stop(\"Installed\");\n const preview = `https://${store.slug}.feeef.store`;\n ok(`Preview ${pc.cyan(preview)}`);\n outro(preview);\n } else {\n ok(`Template id ${templateId}`);\n outro(\"Skipped install (use --apply next time)\");\n }\n } catch (e) {\n fail(e);\n }\n}\n","import type { FeeeF } from \"feeef\";\nimport { createClient } from \"../client.js\";\nimport { saveConfig } from \"../config.js\";\nimport { findThemeRoot, saveProjectRc } from \"../project.js\";\nimport {\n confirm,\n fail,\n info,\n intro,\n ok,\n outro,\n pc,\n select,\n spinner,\n} from \"../ui.js\";\n\ninterface StoreRow {\n id: string;\n slug?: string;\n name?: string;\n}\n\nconst PAGE_SIZE = 20;\nconst LOAD_MORE = \"__load_more__\";\n\nfunction formatStoreLabel(store: StoreRow): string {\n const title = store.name || store.slug || store.id;\n if (store.slug && store.name && store.slug !== store.name) {\n return `${store.name} (${store.slug})`;\n }\n return title;\n}\n\n/**\n * Interactive store picker with page-by-page \"Load more…\".\n * Only lists stores owned by or shared with the signed-in user.\n */\nexport async function pickStoreInteractive(ff: FeeeF): Promise<StoreRow> {\n const me = await ff.users.me();\n const userId = me.user?.id;\n if (!userId) {\n fail(\"Could not resolve the signed-in user. Run: feeef signin\");\n }\n\n let page = 1;\n const accumulated: StoreRow[] = [];\n let total: number | undefined;\n\n for (;;) {\n const s = spinner();\n s.start(page === 1 ? \"Loading your stores…\" : `Loading more (page ${page})…`);\n const res = await ff.stores.list({\n page,\n limit: PAGE_SIZE,\n userId,\n });\n s.stop(page === 1 ? \"Stores loaded\" : \"More stores loaded\");\n\n const batch = (res.data || []) as StoreRow[];\n if (typeof res.total === \"number\") total = res.total;\n accumulated.push(...batch);\n\n if (accumulated.length === 0) {\n fail(\"No stores on this account\");\n }\n\n const hasMore =\n batch.length >= PAGE_SIZE &&\n (total == null || accumulated.length < total);\n\n // Single store and nothing else to fetch — skip the menu.\n if (accumulated.length === 1 && !hasMore) {\n return accumulated[0]!;\n }\n\n const options: { value: string; label: string; hint?: string }[] = [\n ...accumulated.map((st) => ({\n value: st.id,\n label: formatStoreLabel(st),\n hint: st.id,\n })),\n ];\n\n if (hasMore) {\n const hint =\n total != null\n ? `${accumulated.length} of ${total}`\n : `loaded ${accumulated.length}`;\n options.push({\n value: LOAD_MORE,\n label: `${pc.dim(\"→\")} Load more…`,\n hint,\n });\n }\n\n const chosen = await select({\n message: \"Pick a store\",\n options,\n });\n\n if (chosen === LOAD_MORE) {\n page += 1;\n continue;\n }\n\n const picked = accumulated.find((st) => st.id === chosen);\n if (!picked) fail(\"Selected store not found\");\n return picked;\n }\n}\n\nexport async function runUse(\n storeArg: string | undefined,\n opts: { apiUrl?: string },\n): Promise<void> {\n intro(\"feeef use\");\n try {\n const themeRoot = findThemeRoot(process.cwd());\n if (!themeRoot) {\n fail(\n \"No feeef.template.json nearby. Run from a template folder or feeef template init first.\",\n );\n }\n\n const { ff } = createClient();\n let storeId: string;\n let slug: string | undefined;\n\n if (!storeArg) {\n const picked = await pickStoreInteractive(ff);\n storeId = picked.id;\n slug = picked.slug;\n if (slug || picked.name) {\n info(`Selected ${formatStoreLabel(picked)}`);\n }\n } else {\n try {\n const bySlug = await ff.stores.find({ id: storeArg, by: \"slug\" });\n storeId = bySlug.id;\n slug = bySlug.slug;\n } catch {\n const byId = await ff.stores.find({ id: storeArg });\n storeId = byId.id;\n slug = byId.slug;\n }\n }\n\n const patch: {\n store: string;\n slug?: string;\n apiUrl?: string;\n } = { store: storeId };\n if (slug) patch.slug = slug;\n if (opts.apiUrl) patch.apiUrl = opts.apiUrl;\n\n const { rcPath } = saveProjectRc(themeRoot, patch);\n saveConfig({ defaultStoreId: storeId });\n\n ok(`Linked template → store ${slug || storeId}`);\n info(rcPath);\n outro(\"Next: feeef template publish --apply\");\n } catch (e) {\n fail(e);\n }\n}\n\nexport async function askApply(\n slug: string,\n force?: boolean,\n): Promise<boolean> {\n if (force === true) return true;\n if (force === false) return false;\n return confirm({\n message: `Apply template to store \"${slug}\"?`,\n initialValue: true,\n });\n}\n","import path from \"node:path\";\nimport { loadSmoke } from \"../../kit.js\";\nimport { resolveThemeDir } from \"../../project.js\";\nimport { fail, intro, ok, outro, pc, spinner, warn } from \"../../ui.js\";\n\n/**\n * Build (unless --no-build) and SSR-eval every custom `function App()` in the theme.\n * Catches transpile/runtime issues before `feeef template dev` / publish.\n */\nexport async function runTemplateSmoke(\n dirArg: string | undefined,\n opts: { noBuild?: boolean } = {},\n): Promise<void> {\n intro(\"feeef template smoke\");\n try {\n const srcDir = resolveThemeDir(dirArg);\n const s = spinner();\n s.start(\n opts.noBuild\n ? \"Smoking custom components (existing dist)…\"\n : \"Building + smoking custom components…\",\n );\n\n const { smokeTheme } = await loadSmoke();\n const result = await smokeTheme({\n srcDir,\n build: !opts.noBuild,\n });\n\n s.stop(\n `Smoked ${result.total} custom component${result.total === 1 ? \"\" : \"s\"}`,\n );\n\n for (const f of result.failed) {\n const label =\n f.item.sourcePath || f.item.instanceId || f.item.loc || \"?\";\n warn(`✗ ${label}`);\n console.error(pc.red(` ${f.error.message}`));\n }\n\n if (result.failed.length) {\n fail(\n new Error(\n `smoke failed — ${result.failed.length}/${result.total} components`,\n ),\n );\n return;\n }\n\n ok(\n `All ${result.passed} custom component${result.passed === 1 ? \"\" : \"s\"} rendered`,\n );\n outro(path.relative(process.cwd(), srcDir) || srcDir);\n } catch (e) {\n fail(e);\n }\n}\n","import path from \"node:path\";\nimport { resolveThemeDir } from \"../../project.js\";\nimport { removeComponent, removePage } from \"../../theme-scaffold.js\";\nimport { confirm, fail, intro, ok, outro } from \"../../ui.js\";\n\nexport async function runTemplateRemovePage(\n pageId: string | undefined,\n opts: { dir?: string; yes?: boolean } = {},\n): Promise<void> {\n intro(\"feeef template remove page\");\n try {\n if (!pageId?.trim()) {\n fail(\"Usage: feeef template remove page <pageId>\");\n }\n const themeRoot = resolveThemeDir(opts.dir);\n if (!opts.yes) {\n const go = await confirm({\n message: `Delete pages/${pageId}/ and remove it from feeef.template.json?`,\n initialValue: false,\n });\n if (!go) {\n outro(\"Cancelled\");\n return;\n }\n }\n const { pageId: id, removedPath } = removePage(themeRoot, pageId!);\n ok(`Removed ${path.relative(themeRoot, removedPath)}`);\n outro(`Page \"${id}\" deleted`);\n } catch (err) {\n fail(err instanceof Error ? err.message : String(err));\n }\n}\n\nexport async function runTemplateRemoveComponent(\n pageId: string | undefined,\n componentId: string | undefined,\n opts: { dir?: string; section?: string; yes?: boolean } = {},\n): Promise<void> {\n intro(\"feeef template remove component\");\n try {\n if (!pageId?.trim() || !componentId?.trim()) {\n fail(\"Usage: feeef template remove component <pageId> <componentId>\");\n }\n const themeRoot = resolveThemeDir(opts.dir);\n if (!opts.yes) {\n const go = await confirm({\n message: `Delete component ${pageId}/${componentId}?`,\n initialValue: false,\n });\n if (!go) {\n outro(\"Cancelled\");\n return;\n }\n }\n const { removedPath } = removeComponent(themeRoot, pageId!, componentId!, {\n ...(opts.section ? { section: opts.section } : {}),\n });\n ok(`Removed ${path.relative(themeRoot, removedPath)}`);\n outro(\"Done\");\n } catch (err) {\n fail(err instanceof Error ? err.message : String(err));\n }\n}\n","import { spawn } from \"node:child_process\";\nimport path from \"node:path\";\nimport { kitBin, loadBuild } from \"../../kit.js\";\nimport { resolveThemeDir } from \"../../project.js\";\nimport { fail, info, intro, outro, spinner } from \"../../ui.js\";\n\nexport async function runTemplateWatch(dirArg?: string): Promise<void> {\n intro(\"feeef template watch\");\n try {\n const srcDir = resolveThemeDir(dirArg);\n const outPath = path.join(srcDir, \"dist\", \"data.json\");\n\n const s = spinner();\n s.start(\"Initial build…\");\n const { buildTemplate } = await loadBuild();\n buildTemplate({ srcDir, outPath, write: true });\n s.stop(`Watching ${srcDir}`);\n\n info(`Output → ${outPath}`);\n info(\"Ctrl+C to stop\");\n\n const child = spawn(\n process.execPath,\n [kitBin(), \"watch\", srcDir, \"-o\", outPath],\n { stdio: \"inherit\" },\n );\n\n await new Promise<void>((resolve, reject) => {\n child.on(\"exit\", (code) => {\n if (code && code !== 0) reject(new Error(`watch exited ${code}`));\n else resolve();\n });\n });\n\n outro(\"Stopped\");\n } catch (e) {\n fail(e);\n }\n}\n"],"mappings":";AAAA,SAAS,eAAe;;;ACAxB,OAAO,WAAmC;AAC1C,SAAS,aAAa;;;ACDtB,OAAO,QAAQ;AACf,OAAO,QAAQ;AACf,OAAO,UAAU;AAiBjB,IAAM,aAAa,KAAK,KAAK,GAAG,QAAQ,GAAG,WAAW,OAAO;AAC7D,IAAM,cAAc,KAAK,KAAK,YAAY,aAAa;AAEvD,IAAM,WAAW;AACjB,IAAM,YAAY;AAElB,SAAS,kBAAwB;AAC/B,KAAG,UAAU,YAAY,EAAE,WAAW,MAAM,MAAM,SAAS,CAAC;AAC5D,MAAI;AACF,OAAG,UAAU,YAAY,QAAQ;AAAA,EACnC,QAAQ;AAAA,EAER;AACF;AAEA,SAAS,gBAAgB,MAA4B;AACnD,kBAAgB;AAChB,QAAM,OAAO,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA;AAC7C,KAAG,cAAc,aAAa,MAAM,EAAE,UAAU,QAAQ,MAAM,UAAU,CAAC;AACzE,MAAI;AACF,OAAG,UAAU,aAAa,SAAS;AAAA,EACrC,QAAQ;AAAA,EAER;AACF;AAMO,SAAS,aAAqB;AACnC,SAAO;AACT;AAEO,SAAS,aAA6B;AAC3C,MAAI;AACF,QAAI,CAAC,GAAG,WAAW,WAAW,EAAG,QAAO,CAAC;AACzC,WAAO,KAAK,MAAM,GAAG,aAAa,aAAa,MAAM,CAAC;AAAA,EACxD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,WAAW,OAAgD;AACzE,QAAM,OAAuB,EAAE,GAAG,WAAW,GAAG,GAAG,MAAM;AACzD,aAAW,OAAO,OAAO,KAAK,IAAI,GAA+B;AAC/D,UAAM,QAAQ,KAAK,GAAG;AACtB,QAAI,UAAU,UAAa,UAAU,QAAQ,UAAU,IAAI;AACzD,aAAO,KAAK,GAAG;AAAA,IACjB;AAAA,EACF;AACA,kBAAgB,IAAI;AACpB,SAAO;AACT;AAEO,SAAS,YAAkB;AAChC,QAAM,MAAM,WAAW;AACvB,SAAO,IAAI;AACX,SAAO,IAAI;AACX,kBAAgB,GAAG;AACrB;AAEO,SAAS,cAAc,MAAsB,WAAW,GAAW;AACxE,UACE,QAAQ,IAAI,oBAAoB,KAChC,IAAI,UACJ,4BACA,QAAQ,OAAO,EAAE;AACrB;AAEO,SAAS,eAAe,MAAsB,WAAW,GAAW;AACzE,QAAM,UAAU,OAAO,QAAQ,IAAI,gBAAgB,CAAC;AACpD,MAAI,OAAO,SAAS,OAAO,KAAK,UAAU,EAAG,QAAO;AACpD,MAAI,OAAO,IAAI,YAAY,YAAY,IAAI,UAAU,EAAG,QAAO,IAAI;AACnE,SAAO;AACT;;;AD7EA,SAAS,WAAW,SAAiB,OAA0C;AAC7E,SAAO,MAAM,OAAO;AAAA,IAClB;AAAA,IACA,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB,GAAI,QAAQ,EAAE,eAAe,UAAU,KAAK,GAAG,IAAI,CAAC;AAAA,IACtD;AAAA,EACF,CAAC;AACH;AAEO,SAAS,aAAa,OAAkC,CAAC,GAAsB;AACpF,QAAM,cAAc,KAAK,gBAAgB;AACzC,QAAM,MAAM,WAAW;AACvB,QAAM,UAAU,cAAc,GAAG;AACjC,QAAM,QAAQ,IAAI;AAElB,MAAI,eAAe,CAAC,OAAO;AACzB,UAAM,IAAI,MAAM,kCAAkC;AAAA,EACpD;AAEA,QAAMA,QAAO,WAAW,SAAS,KAAK;AAEtC,QAAM,KAAK,IAAI,MAAM;AAAA,IACnB,QAAQ,SAAS;AAAA,IACjB;AAAA,IACA,QAAQA;AAAA,IACR,OAAO;AAAA,EACT,CAAC;AAED,SAAO,EAAE,IAAI,MAAAA,OAAM,KAAK,SAAS,MAAM;AACzC;AAEA,eAAsB,mBAAmB,OAI8B;AACrE,QAAM,WAAW,MAAM,UAAU,cAAc,GAAG,QAAQ,OAAO,EAAE;AACnE,QAAMA,QAAO,WAAW,SAAS,MAAS;AAC1C,QAAM,KAAK,IAAI,MAAM;AAAA,IACnB,QAAQ;AAAA,IACR;AAAA,IACA,QAAQA;AAAA,IACR,OAAO;AAAA,EACT,CAAC;AACD,QAAM,OAAO,MAAM,GAAG,MAAM,OAAO;AAAA,IACjC,OAAO,MAAM;AAAA,IACb,UAAU,MAAM;AAAA,EAClB,CAAC;AACD,QAAM,QAAQ,MAAM,OAAO;AAC3B,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACA,KAAG,UAAU,iBAAiB,UAAU,KAAK,EAAE;AAC/C,aAAW,EAAE,OAAO,OAAO,MAAM,OAAO,QAAQ,QAAQ,CAAC;AACzD,SAAO;AACT;;;AE5EA,OAAO,YAAY;AACnB,OAAO,UAAU;AACjB,SAAS,YAAY;AACrB,OAAOC,YAAW;AAClB,SAAS,SAAAC,QAAO,uBAAuB;AAIhC,IAAM,0BAA0B;AAGhC,IAAM,6BACX;AAEK,IAAM,8BAA8B;AAMpC,IAAM,2BAA2B;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAgBA,SAAS,WAAW,KAAqB;AACvC,MAAI;AACF,UAAM,IAAI,IAAI,IAAI,GAAG;AACrB,WAAO,GAAG,EAAE,QAAQ,KAAK,EAAE,IAAI;AAAA,EACjC,QAAQ;AACN,WAAO,IAAI,QAAQ,OAAO,EAAE;AAAA,EAC9B;AACF;AAMO,SAAS,wBAAwB,QAAwB;AAC9D,QAAM,UACJ,QAAQ,IAAI,oBAAoB,GAAG,KAAK,KACxC,QAAQ,IAAI,gCAAgC,GAAG,KAAK;AACtD,MAAI,QAAS,QAAO,WAAW,OAAO;AAEtC,MAAI;AACF,UAAM,IAAI,IAAI,IAAI,MAAM;AACxB,QAAI,EAAE,aAAa,iBAAiB;AAClC,aAAO;AAAA,IACT;AACA,QAAI,EAAE,SAAS,WAAW,MAAM,GAAG;AACjC,YAAM,OAAO,EAAE,SAAS,QAAQ,UAAU,WAAW;AACrD,YAAM,OAAO,EAAE,OAAO,IAAI,EAAE,IAAI,KAAK;AACrC,aAAO,GAAG,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI;AAAA,IACtC;AAGA,QACE,EAAE,aAAa,eACf,EAAE,aAAa,eACf,EAAE,aAAa,uBACf;AACA,YAAM,OAAO,EAAE,OAAO,IAAI,EAAE,IAAI,KAAK;AACrC,aAAO,sCAAsC,IAAI;AAAA,IACnD;AACA,QAAI,EAAE,SAAS,WAAW,WAAW,GAAG;AACtC,aAAO,GAAG,EAAE,QAAQ,KAAK,EAAE,IAAI;AAAA,IACjC;AAEA,WAAO,GAAG,EAAE,QAAQ,KAAK,EAAE,IAAI;AAAA,EACjC,QAAQ;AACN,WAAO,OAAO,QAAQ,OAAO,EAAE;AAAA,EACjC;AACF;AAEO,SAAS,qBAAqB,gBAA2C;AAC9E,QAAM,WACJ,QAAQ,IAAI,uBAAuB,GAAG,KAAK,KAAK;AAClD,QAAM,eACJ,QAAQ,IAAI,2BAA2B,GAAG,KAAK,KAAK;AACtD,QAAM,cACJ,QAAQ,IAAI,0BAA0B,GAAG,KAAK,KAAK;AACrD,QAAM,eAAe;AAAA,IACnB,QAAQ,IAAI,2BAA2B,KAAK;AAAA,EAC9C;AACA,QAAM,UAAU,kBAAkB,cAAc,GAAG,QAAQ,OAAO,EAAE;AACpE,QAAM,YAAY,QAAQ,IAAI,oBAAoB,GAAG,KAAK;AAC1D,QAAM,SAAS,YACX,UAAU,MAAM,QAAQ,EAAE,OAAO,OAAO,IACxC,CAAC,GAAG,wBAAwB;AAEhC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,OAAO,SAAS,YAAY,IACtC,eACA;AAAA,IACJ;AAAA,IACA,kBAAkB,wBAAwB,MAAM;AAAA,IAChD;AAAA,EACF;AACF;AAGO,SAAS,iBAA0D;AACxE,QAAM,WAAW,OAAO,YAAY,EAAE,EAAE,SAAS,WAAW;AAC5D,QAAM,YAAY,OACf,WAAW,QAAQ,EACnB,OAAO,QAAQ,EACf,OAAO,WAAW;AACrB,SAAO,EAAE,UAAU,UAAU;AAC/B;AAEO,SAAS,YAAY,KAAmB;AAC7C,QAAM,WAAW,QAAQ;AACzB,QAAM,MACJ,aAAa,WACT,SAAS,GAAG,MACZ,aAAa,UACX,aAAa,GAAG,MAChB,aAAa,GAAG;AACxB,OAAK,KAAK,MAAM;AAAA,EAEhB,CAAC;AACH;AAEA,SAAS,SAAS,OAAe,MAAsB;AACrD,SAAO;AAAA;AAAA;AAAA;AAAA,WAIE,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAQR,KAAK;AAAA,OACN,IAAI;AAAA;AAAA;AAAA;AAIX;AAMO,SAAS,uBAAuB,MAKnB;AAClB,QAAM,YAAY,KAAK,aAAa,IAAI,KAAK;AAE7C,SAAO,IAAI,QAAgB,CAAC,SAAS,WAAW;AAC9C,QAAI,UAAU;AACd,UAAM,SAAS,CAAC,OAAmB;AACjC,UAAI,QAAS;AACb,gBAAU;AACV,SAAG;AAAA,IACL;AAEA,UAAM,SAAS,KAAK,aAAa,CAAC,KAAK,QAAQ;AAC7C,UAAI;AACF,cAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,oBAAoB,KAAK,IAAI,EAAE;AACnE,YAAI,IAAI,aAAa,mBAAmB;AACtC,cAAI,UAAU,KAAK,EAAE,gBAAgB,aAAa,CAAC;AACnD,cAAI,IAAI,WAAW;AACnB;AAAA,QACF;AAEA,cAAM,MAAM,IAAI,aAAa,IAAI,OAAO;AACxC,YAAI,KAAK;AACP,gBAAM,OAAO,IAAI,aAAa,IAAI,mBAAmB,KAAK;AAC1D,cAAI,UAAU,KAAK,EAAE,gBAAgB,2BAA2B,CAAC;AACjE,cAAI,IAAI,SAAS,wBAAwB,IAAI,CAAC;AAC9C,iBAAO,MAAM;AACX,mBAAO,MAAM;AACb,mBAAO,IAAI,MAAM,IAAI,CAAC;AAAA,UACxB,CAAC;AACD;AAAA,QACF;AAEA,cAAM,gBAAgB,IAAI,aAAa,IAAI,OAAO;AAClD,YAAI,kBAAkB,KAAK,eAAe;AACxC,cAAI,UAAU,KAAK,EAAE,gBAAgB,2BAA2B,CAAC;AACjE,cAAI,IAAI,SAAS,iBAAiB,+BAA+B,CAAC;AAClE,iBAAO,MAAM;AACX,mBAAO,MAAM;AACb,mBAAO,IAAI,MAAM,sBAAsB,CAAC;AAAA,UAC1C,CAAC;AACD;AAAA,QACF;AAEA,cAAM,WAAW,IAAI,aAAa,IAAI,MAAM;AAC5C,YAAI,CAAC,UAAU;AACb,cAAI,UAAU,KAAK,EAAE,gBAAgB,2BAA2B,CAAC;AACjE,cAAI,IAAI,SAAS,gBAAgB,oCAAoC,CAAC;AACtE,iBAAO,MAAM;AACX,mBAAO,MAAM;AACb,mBAAO,IAAI,MAAM,4BAA4B,CAAC;AAAA,UAChD,CAAC;AACD;AAAA,QACF;AAEA,YAAI,UAAU,KAAK,EAAE,gBAAgB,2BAA2B,CAAC;AACjE,YAAI,IAAI,SAAS,aAAa,mCAAmC,CAAC;AAClE,eAAO,MAAM;AACX,iBAAO,MAAM;AACb,kBAAQ,QAAQ;AAAA,QAClB,CAAC;AAAA,MACH,SAAS,GAAG;AACV,eAAO,MAAM;AACX,iBAAO,MAAM;AACb,iBAAO,CAAC;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,WAAO,GAAG,SAAS,CAAC,MAAM;AACxB,aAAO,MAAM;AACX;AAAA,UACE,aAAa,SAAU,EAA4B,SAAS,eACxD,IAAI;AAAA,YACF,QAAQ,KAAK,IAAI;AAAA,UACnB,IACA;AAAA,QACN;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAGD,WAAO,OAAO,KAAK,MAAM,aAAa,MAAM;AAC1C,WAAK,cAAc;AAAA,IACrB,CAAC;AAED,eAAW,MAAM;AACf,aAAO,MAAM;AACX,eAAO,MAAM;AACb,eAAO,IAAI,MAAM,8CAA8C,CAAC;AAAA,MAClE,CAAC;AAAA,IACH,GAAG,SAAS,EAAE,MAAM;AAAA,EACtB,CAAC;AACH;AASA,eAAsB,gBAAgB,MAKN;AAC9B,QAAM,WAAW,qBAAqB,KAAK,MAAM;AACjD,QAAM,QAAQ,OAAO,WAAW;AAChC,QAAM,EAAE,UAAU,UAAU,IAAI,eAAe;AAE/C,QAAM,eAAe,gBAAgB,kBAAkB;AAAA,IACrD,SAAS,SAAS;AAAA,IAClB,UAAU,SAAS;AAAA,IACnB,aAAa,SAAS;AAAA,IACtB,OAAO,SAAS;AAAA,IAChB;AAAA,IACA,eAAe;AAAA,IACf,qBAAqB;AAAA,EACvB,CAAC;AAED,OAAK,iBAAiB,YAAY;AAElC,QAAM,OAAO,MAAM,uBAAuB;AAAA,IACxC,MAAM,SAAS;AAAA,IACf,eAAe;AAAA,IACf,aAAa,MAAM;AACjB,UAAI,KAAK,gBAAgB,OAAO;AAC9B,oBAAY,YAAY;AAAA,MAC1B;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,aAAaC,OAAM,OAAO;AAAA,IAC9B,SAAS,SAAS;AAAA,IAClB,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,gBAAgB;AAAA,IAClB;AAAA,EACF,CAAC;AACD,QAAM,KAAK,IAAIC,OAAM;AAAA,IACnB,QAAQ;AAAA,IACR,SAAS,SAAS;AAAA,IAClB,QAAQ;AAAA,IACR,OAAO;AAAA,EACT,CAAC;AAED,QAAM,gBAAgB,MAAM,GAAG,MAAM,0BAA0B;AAAA,IAC7D;AAAA,IACA,aAAa,SAAS;AAAA,IACtB,UAAU,SAAS;AAAA,IACnB,GAAI,SAAS,eAAe,EAAE,cAAc,SAAS,aAAa,IAAI,CAAC;AAAA,IACvE,cAAc;AAAA,EAChB,CAAC;AAED,QAAM,cAAc,cAAc;AAClC,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AAEA,aAAW;AAAA,IACT,OAAO;AAAA,IACP,QAAQ,SAAS;AAAA,EACnB,CAAC;AAED,KAAG,UAAU,iBAAiB,UAAU,WAAW,EAAE;AACrD,MAAI;AACF,UAAM,KAAK,MAAM,GAAG,MAAM,GAAG;AAC7B,UAAM,UAAU;AAChB,UAAM,QAAQ,QAAQ,MAAM,SAAS,QAAQ;AAC7C,QAAI,OAAO;AACT,iBAAW,EAAE,MAAM,CAAC;AACpB,aAAO,EAAE,MAAM;AAAA,IACjB;AACA,WAAO,CAAC;AAAA,EACV,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;;;AC9VA,YAAY,OAAO;AACnB,OAAO,QAAQ;AAIR,SAAS,SAAe;AAC7B,UAAQ,IAAI;AACZ,UAAQ,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,IAAI,iBAAiB,CAAC;AAC1D,UAAQ,IAAI;AACd;AAEO,SAASC,OAAM,OAAqB;AACzC,EAAE,QAAM,GAAG,OAAO,GAAG,MAAM,IAAI,KAAK,GAAG,CAAC,CAAC;AAC3C;AAEO,SAASC,OAAM,SAAuB;AAC3C,EAAE,QAAM,GAAG,MAAM,OAAO,CAAC;AAC3B;AAEO,SAASC,MAAK,SAAiB,OAAsB;AAC1D,EAAE,OAAK,SAAS,KAAK;AACvB;AAEO,SAASC,QAAO,UAAU,cAAqB;AACpD,EAAE,SAAO,OAAO;AAChB,UAAQ,KAAK,CAAC;AAChB;AAEA,eAAsBC,MACpB,MACiB;AACjB,QAAM,QAAQ,MAAQ,OAAK,IAAI;AAC/B,MAAM,WAAS,KAAK,EAAG,CAAAD,QAAO;AAC9B,SAAO,OAAO,KAAK;AACrB;AAEA,eAAsBE,UACpB,MACiB;AACjB,QAAM,QAAQ,MAAQ,WAAS,IAAI;AACnC,MAAM,WAAS,KAAK,EAAG,CAAAF,QAAO;AAC9B,SAAO,OAAO,KAAK;AACrB;AAEA,eAAsBG,SACpB,MACkB;AAClB,QAAM,QAAQ,MAAQ,UAAQ,IAAI;AAClC,MAAM,WAAS,KAAK,EAAG,CAAAH,QAAO;AAC9B,SAAO,QAAQ,KAAK;AACtB;AAEA,eAAsBI,QACpB,MAGY;AACZ,QAAM,QAAQ,MAAQ,SAAO,IAAI;AACjC,MAAM,WAAS,KAAK,EAAG,CAAAJ,QAAO;AAC9B,SAAO;AACT;AAEO,SAAS,KAAK,KAAqB;AACxC,QAAM,SAAS;AAIf,MAAI;AACJ,MAAI,QAAQ,UAAU,QAAQ,MAAM;AAClC,cACE,OAAO,OAAO,SAAS,SAAS,WAC5B,OAAO,SAAS,OAChB,KAAK,UAAU,OAAO,SAAS,IAAI,EAAE,MAAM,GAAG,IAAI;AAAA,EAC1D,WAAW,eAAe,OAAO;AAC/B,cAAU,IAAI;AAAA,EAChB,OAAO;AACL,cAAU,OAAO,GAAG;AAAA,EACtB;AACA,EAAE,MAAI,MAAM,GAAG,IAAI,OAAO,CAAC;AAC3B,UAAQ,KAAK,CAAC;AAChB;AAEO,SAAS,GAAG,SAAuB;AACxC,EAAE,MAAI,QAAQ,OAAO;AACvB;AAEO,SAAS,KAAK,SAAuB;AAC1C,EAAE,MAAI,KAAK,OAAO;AACpB;AAEO,SAAS,KAAK,SAAuB;AAC1C,EAAE,MAAI,KAAK,OAAO;AACpB;AAEO,SAASK,WAAU;AACxB,SAAS,UAAQ;AACnB;;;AC1EA,eAAsB,UAAU,MAMd;AAChB,EAAAC,OAAM,cAAc;AACpB,MAAI;AAEF,UAAM,cAAc,QAAQ,KAAK,YAAY,KAAK,QAAQ,KAAK,KAAK;AAEpE,QAAI,CAAC,aAAa;AAChB,YAAMC,KAAIC,SAAQ;AAClB,MAAAD,GAAE,MAAM,yCAAoC;AAC5C,YAAM,SAAS,MAAM,gBAAgB;AAAA,QACnC,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,QAC7C,gBAAgB,CAAC,QAAQ;AACvB,UAAAA,GAAE,KAAK,8CAA8C;AACrD,UAAAE,MAAK,KAAK,WAAW;AACrB,UAAAF,GAAE,MAAM,wDAAmD;AAAA,QAC7D;AAAA,MACF,CAAC;AACD,MAAAA,GAAE;AAAA,QACA,OAAO,QACH,gBAAgB,OAAO,KAAK,KAC5B;AAAA,MACN;AACA,WAAK,WAAW,WAAW,CAAC,EAAE;AAC9B,MAAAG,OAAM,0BAA0B;AAChC;AAAA,IACF;AAEA,UAAM,QACJ,KAAK,SACJ,MAAMC,MAAK;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,MACb,UAAU,CAAC,MAAO,CAAC,GAAG,SAAS,GAAG,IAAI,wBAAwB;AAAA,IAChE,CAAC;AACH,UAAM,OACJ,KAAK,YACJ,MAAMC,UAAS;AAAA,MACd,SAAS;AAAA,MACT,UAAU,CAAC,MAAO,CAAC,KAAK,EAAE,SAAS,IAAI,qBAAqB;AAAA,IAC9D,CAAC;AAEH,UAAM,IAAIJ,SAAQ;AAClB,MAAE,MAAM,kBAAa;AACrB,UAAM,OAAO,MAAM,mBAAmB;AAAA,MACpC;AAAA,MACA,UAAU;AAAA,MACV,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,IAC/C,CAAC;AACD,MAAE,KAAK,gBAAgB,KAAK,MAAM,SAAS,KAAK,EAAE;AAClD,SAAK,WAAW,WAAW,CAAC,EAAE;AAC9B,IAAAE,OAAM,0BAA0B;AAAA,EAClC,SAAS,GAAG;AACV,SAAK,CAAC;AAAA,EACR;AACF;AAEA,eAAsB,YAA2B;AAC/C,EAAAJ,OAAM,cAAc;AACpB,MAAI;AACF,UAAM,EAAE,IAAI,IAAI,IAAI,aAAa;AACjC,UAAM,KAAK,MAAM,GAAG,MAAM,GAAG;AAC7B,UAAM,UAAU;AAKhB,UAAM,OAAO,QAAQ,QAAQ;AAC7B,OAAG,OAAO,KAAK,SAAS,KAAK,MAAM,KAAK,UAAU,EAAE,CAAC,CAAC;AACtD,SAAK,OAAO,cAAc,GAAG,CAAC,EAAE;AAChC,IAAAI,OAAM,eAAe;AAAA,EACvB,SAAS,GAAG;AACV,SAAK,CAAC;AAAA,EACR;AACF;AAEO,SAAS,aAAmB;AACjC,EAAAJ,OAAM,eAAe;AACrB,YAAU;AACV,KAAG,kBAAkB,WAAW,CAAC,GAAG;AACpC,EAAAI,OAAM,YAAY;AACpB;AAEO,SAAS,gBAAsB;AACpC,EAAAJ,OAAM,cAAc;AACpB,QAAM,MAAM,WAAW;AACvB,UAAQ;AAAA,IACN,KAAK;AAAA,MACH;AAAA,QACE,MAAM,WAAW;AAAA,QACjB,OAAO,IAAI;AAAA,QACX,QAAQ,cAAc,GAAG;AAAA,QACzB,gBAAgB,IAAI;AAAA,QACpB,yBAAyB,IAAI;AAAA,QAC7B,gBAAgB,IAAI;AAAA,QACpB,SAAS,IAAI;AAAA,QACb,UAAU,QAAQ,IAAI,KAAK;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,EAAAI,OAAM,MAAM;AACd;AAEA,IAAM,cAAc;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIO,SAAS,aAAa,KAAa,OAAqB;AAC7D,EAAAJ,OAAM,kBAAkB;AACxB,MAAI,CAAE,YAAkC,SAAS,GAAG,GAAG;AACrD,SAAK,gBAAgB,GAAG,eAAe,YAAY,KAAK,IAAI,CAAC,EAAE;AAAA,EACjE;AAEA,QAAM,WAAW;AACjB,MAAI,aAAa,WAAW;AAC1B,UAAM,IAAI,OAAO,KAAK;AACtB,QAAI,CAAC,OAAO,SAAS,CAAC,KAAK,KAAK,GAAG;AACjC,WAAK,mCAAmC;AAAA,IAC1C;AACA,eAAW,EAAE,SAAS,EAAE,CAAC;AAAA,EAC3B,OAAO;AACL,UAAM,QAAiC,EAAE,CAAC,QAAQ,GAAG,MAAM;AAC3D,eAAW,KAAK;AAAA,EAClB;AAEA,KAAG,OAAO,QAAQ,EAAE;AACpB,EAAAI,OAAM,WAAW,CAAC;AACpB;;;AClKA,OAAOG,WAAU;;;ACAjB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAGV,IAAM,UAAU;AAChB,IAAM,gBAAgB;AAoBtB,SAAS,cAAc,WAAW,QAAQ,IAAI,GAAkB;AACrE,MAAI,MAAMA,MAAK,QAAQ,QAAQ;AAC/B,aAAS;AACP,QAAID,IAAG,WAAWC,MAAK,KAAK,KAAK,aAAa,CAAC,EAAG,QAAO;AACzD,UAAM,SAASA,MAAK,QAAQ,GAAG;AAC/B,QAAI,WAAW,IAAK,QAAO;AAC3B,UAAM;AAAA,EACR;AACF;AAEO,SAAS,cAAc,WAAmC;AAC/D,QAAM,SAASA,MAAK,KAAK,WAAW,OAAO;AAC3C,MAAI;AACF,QAAI,CAACD,IAAG,WAAW,MAAM,EAAG,QAAO,CAAC;AACpC,WAAO,KAAK,MAAMA,IAAG,aAAa,QAAQ,MAAM,CAAC;AAAA,EACnD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,cACd,WACA,OACwC;AACxC,QAAM,SAASC,MAAK,KAAK,WAAW,OAAO;AAC3C,QAAM,OAAuB,EAAE,GAAG,cAAc,SAAS,GAAG,GAAG,MAAM;AACrE,aAAW,OAAO,OAAO,KAAK,IAAI,GAA+B;AAC/D,UAAM,QAAQ,KAAK,GAAG;AACtB,QAAI,UAAU,UAAa,UAAU,QAAQ,UAAU,IAAI;AACzD,aAAO,KAAK,GAAG;AAAA,IACjB;AAAA,EACF;AACA,EAAAD,IAAG,cAAc,QAAQ,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AACrE,SAAO,EAAE,QAAQ,IAAI,KAAK;AAC5B;AAEO,SAAS,iBAAiB,WAAiC;AAChE,QAAM,WAAWC,MAAK,KAAK,WAAW,aAAa;AACnD,MAAI,CAACD,IAAG,WAAW,QAAQ,EAAG,QAAO,CAAC;AACtC,MAAI;AACF,WAAO,KAAK,MAAMA,IAAG,aAAa,UAAU,MAAM,CAAC;AAAA,EACrD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,0BAA0B,OAIxB;AAChB,QAAM,KAAK,cAAc,MAAM,SAAS;AACxC,QAAM,OAAO,iBAAiB,MAAM,SAAS;AAC7C,SACE,MAAM,aACN,GAAG,SACH,KAAK,SACL,KAAK,WACL,MAAM,UAAU,kBAChB;AAEJ;AAEO,SAAS,gBAAgB,QAAyB;AACvD,MAAI,QAAQ;AACV,UAAM,MAAMC,MAAK,QAAQ,MAAM;AAC/B,QAAI,CAACD,IAAG,WAAW,GAAG,GAAG;AACvB,YAAM,IAAI,MAAM,iCAAiC,GAAG,EAAE;AAAA,IACxD;AACA,WAAO,cAAc,GAAG,KAAK;AAAA,EAC/B;AACA,QAAM,UAAU,cAAc,QAAQ,IAAI,CAAC;AAC3C,MAAI,QAAS,QAAO;AACpB,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;;;AC7FA,OAAOE,SAAQ;AACf,OAAOC,WAAU;AAGjB,IAAM,aAAa;AACnB,IAAM,kBAAkB;AAEjB,SAAS,aAAa,IAAoB;AAC/C,QAAM,UAAU,GAAG,KAAK;AACxB,MAAI,CAAC,WAAW,KAAK,OAAO,GAAG;AAC7B,UAAM,IAAI;AAAA,MACR,oBAAoB,EAAE;AAAA,IACxB;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,kBAAkB,IAAoB;AACpD,QAAM,UAAU,GAAG,KAAK;AACxB,MAAI,CAAC,gBAAgB,KAAK,OAAO,GAAG;AAClC,UAAM,IAAI;AAAA,MACR,yBAAyB,EAAE;AAAA,IAC7B;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,IAAoB;AAC3C,SAAO,GACJ,MAAM,MAAM,EACZ,OAAO,OAAO,EACd,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC,CAAC,EACjD,KAAK,GAAG;AACb;AAEA,SAAS,SAAS,WAAiC;AACjD,QAAM,WAAWC,MAAK,KAAK,WAAW,aAAa;AACnD,MAAI,CAACC,IAAG,WAAW,QAAQ,GAAG;AAC5B,UAAM,IAAI,MAAM,WAAW,aAAa,OAAO,SAAS,EAAE;AAAA,EAC5D;AACA,SAAO,KAAK,MAAMA,IAAG,aAAa,UAAU,MAAM,CAAC;AACrD;AAEA,SAAS,UAAU,WAAmB,MAA0B;AAC9D,QAAM,WAAWD,MAAK,KAAK,WAAW,aAAa;AACnD,EAAAC,IAAG,cAAc,UAAU,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AACzE;AAMO,SAAS,uBAAuB,WAAmB,QAAyB;AACjF,QAAM,UAAUD,MAAK,KAAK,WAAW,SAAS,QAAQ,YAAY;AAClE,MAAIC,IAAG,WAAW,OAAO,EAAG,QAAO;AAEnC,QAAM,cAAcD,MAAK,KAAK,WAAW,SAAS,QAAQ,UAAU;AACpE,MAAI,CAACC,IAAG,WAAW,WAAW,EAAG,QAAO;AACxC,aAAW,WAAWA,IAAG,YAAY,aAAa,EAAE,eAAe,KAAK,CAAC,GAAG;AAC1E,QAAI,CAAC,QAAQ,YAAY,KAAK,QAAQ,KAAK,WAAW,GAAG,EAAG;AAC5D,UAAM,QAAQD,MAAK,KAAK,aAAa,QAAQ,MAAM,YAAY;AAC/D,QAAI,CAACC,IAAG,WAAW,KAAK,EAAG;AAC3B,UAAM,UAAUA,IAAG,YAAY,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC;AACtE,QAAI,QAAQ,SAAS,EAAG,QAAO;AAAA,EACjC;AACA,SAAO;AACT;AAEO,SAAS,0BACd,WACA,QACA,SACgD;AAChD,MAAI,SAAS;AACX,UAAM,YAAYD,MAAK;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,WAAO,EAAE,WAAW,MAAM,SAAS;AAAA,EACrC;AACA,MAAI,uBAAuB,WAAW,MAAM,GAAG;AAC7C,WAAO;AAAA,MACL,WAAWA,MAAK;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,MAAM;AAAA,IACR;AAAA,EACF;AACA,SAAO;AAAA,IACL,WAAWA,MAAK,KAAK,WAAW,SAAS,QAAQ,YAAY;AAAA,IAC7D,MAAM;AAAA,EACR;AACF;AAGO,SAAS,uBAAuB,MAG5B;AACT,QAAM,QAAQ,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAC5D,QAAM,YAAY,KAAK,UAAU,KAAK,KAAK;AAC3C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAME,SAAS;AAAA,WACT,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAaU,SAAS;AAAA;AAAA;AAAA;AAAA;AAKnC;AAEO,SAAS,mBAAmB,WAA2B;AAC5D,MAAI,CAACC,IAAG,WAAW,SAAS,EAAG,QAAO;AACtC,MAAI,MAAM;AACV,aAAW,QAAQA,IAAG,YAAY,SAAS,GAAG;AAC5C,QAAI,KAAK,WAAW,GAAG,EAAG;AAC1B,UAAM,MAAMD,MAAK,KAAK,WAAW,IAAI;AACrC,QAAI,aAA4B;AAChC,QAAIC,IAAG,SAAS,GAAG,EAAE,OAAO,KAAK,eAAe,KAAK,IAAI,GAAG;AAC1D,mBAAa;AAAA,IACf,WAAWA,IAAG,SAAS,GAAG,EAAE,YAAY,GAAG;AACzC,iBAAW,SAAS,CAAC,iBAAiB,eAAe,GAAG;AACtD,cAAMC,KAAIF,MAAK,KAAK,KAAK,KAAK;AAC9B,YAAIC,IAAG,WAAWC,EAAC,GAAG;AACpB,uBAAaA;AACb;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,WAAY;AACjB,UAAM,MAAMD,IAAG,aAAa,YAAY,MAAM;AAC9C,UAAM,IAAI,sBAAsB,KAAK,GAAG;AACxC,QAAI,EAAG,OAAM,KAAK,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;AAAA,EACzC;AACA,SAAO,MAAM;AACf;AAEO,SAAS,QACd,WACA,WACqC;AACrC,QAAM,SAAS,aAAa,SAAS;AACrC,QAAM,UAAUD,MAAK,KAAK,WAAW,SAAS,MAAM;AACpD,MAAIC,IAAG,WAAW,OAAO,GAAG;AAC1B,UAAM,IAAI,MAAM,8BAA8B,MAAM,GAAG;AAAA,EACzD;AAEA,EAAAA,IAAG,UAAUD,MAAK,KAAK,SAAS,YAAY,GAAG,EAAE,WAAW,KAAK,CAAC;AAClE,EAAAC,IAAG;AAAA,IACDD,MAAK,KAAK,SAAS,WAAW;AAAA,IAC9B,GAAG,KAAK,UAAU,EAAE,OAAO,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC;AAAA;AAAA,IACzC;AAAA,EACF;AAEA,QAAM,OAAO,SAAS,SAAS;AAC/B,QAAM,QAAQ,MAAM,QAAQ,KAAK,KAAK,IAAI,CAAC,GAAG,KAAK,KAAK,IAAI,CAAC;AAC7D,MAAI,CAAC,MAAM,SAAS,MAAM,EAAG,OAAM,KAAK,MAAM;AAC9C,OAAK,QAAQ;AACb,YAAU,WAAW,IAAI;AAEzB,SAAO,EAAE,SAAS,OAAO;AAC3B;AAEO,SAAS,WACd,WACA,WACyC;AACzC,QAAM,SAAS,aAAa,SAAS;AACrC,QAAM,UAAUA,MAAK,KAAK,WAAW,SAAS,MAAM;AACpD,MAAI,CAACC,IAAG,WAAW,OAAO,GAAG;AAC3B,UAAM,IAAI,MAAM,yBAAyB,MAAM,GAAG;AAAA,EACpD;AAEA,EAAAA,IAAG,OAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAEnD,QAAM,OAAO,SAAS,SAAS;AAC/B,MAAI,MAAM,QAAQ,KAAK,KAAK,GAAG;AAC7B,SAAK,QAAQ,KAAK,MAAM,OAAO,CAAC,OAAO,OAAO,MAAM;AACpD,cAAU,WAAW,IAAI;AAAA,EAC3B;AAEA,SAAO,EAAE,QAAQ,aAAa,QAAQ;AACxC;AAEO,SAAS,aACd,WACA,WACA,gBACA,OAA6C,CAAC,GACsC;AACpF,QAAM,SAAS,aAAa,SAAS;AACrC,QAAM,cAAc,kBAAkB,cAAc;AACpD,QAAM,UAAUD,MAAK,KAAK,WAAW,SAAS,MAAM;AACpD,MAAI,CAACC,IAAG,WAAW,OAAO,GAAG;AAC3B,UAAM,IAAI;AAAA,MACR,yBAAyB,MAAM,yCAAoC,MAAM;AAAA,IAC3E;AAAA,EACF;AAEA,QAAM,EAAE,WAAW,KAAK,IAAI;AAAA,IAC1B;AAAA,IACA;AAAA,IACA,KAAK;AAAA,EACP;AACA,EAAAA,IAAG,UAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAE3C,QAAM,WAAWD,MAAK,KAAK,WAAW,GAAG,WAAW,MAAM;AAC1D,QAAM,aAAaA,MAAK,KAAK,WAAW,WAAW;AACnD,MAAIC,IAAG,WAAW,QAAQ,KAAKA,IAAG,WAAW,UAAU,GAAG;AACxD,UAAM,IAAI;AAAA,MACR,kCAAkCD,MAAK,SAAS,WAAW,SAAS,CAAC,IAAI,WAAW;AAAA,IACtF;AAAA,EACF;AAEA,QAAM,QAAQ,mBAAmB,SAAS;AAC1C,QAAM,QAAQ,KAAK,OAAO,KAAK,KAAK,gBAAgB,WAAW;AAC/D,EAAAC,IAAG,cAAc,UAAU,uBAAuB,EAAE,OAAO,MAAM,CAAC,GAAG,MAAM;AAE3E,SAAO,EAAE,UAAU,QAAQ,aAAa,KAAK;AAC/C;AAKO,SAAS,mBACd,WACA,QACA,aACA,SACe;AACf,QAAM,aAAuB,CAAC;AAC9B,MAAI,SAAS;AACX,UAAM,OAAOD,MAAK;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,eAAW;AAAA,MACTA,MAAK,KAAK,MAAM,GAAG,WAAW,MAAM;AAAA,MACpCA,MAAK,KAAK,MAAM,GAAG,WAAW,MAAM;AAAA,MACpCA,MAAK,KAAK,MAAM,GAAG,WAAW,OAAO;AAAA,MACrCA,MAAK,KAAK,MAAM,WAAW;AAAA,IAC7B;AAAA,EACF,OAAO;AACL,UAAM,OAAOA,MAAK,KAAK,WAAW,SAAS,QAAQ,YAAY;AAC/D,eAAW;AAAA,MACTA,MAAK,KAAK,MAAM,GAAG,WAAW,MAAM;AAAA,MACpCA,MAAK,KAAK,MAAM,GAAG,WAAW,MAAM;AAAA,MACpCA,MAAK,KAAK,MAAM,GAAG,WAAW,OAAO;AAAA,MACrCA,MAAK,KAAK,MAAM,WAAW;AAAA,IAC7B;AACA,UAAM,eAAeA,MAAK,KAAK,WAAW,SAAS,QAAQ,UAAU;AACrE,QAAIC,IAAG,WAAW,YAAY,GAAG;AAC/B,iBAAW,OAAOA,IAAG,YAAY,cAAc,EAAE,eAAe,KAAK,CAAC,GAAG;AACvE,YAAI,CAAC,IAAI,YAAY,KAAK,IAAI,KAAK,WAAW,GAAG,EAAG;AACpD,cAAM,OAAOD,MAAK,KAAK,cAAc,IAAI,MAAM,YAAY;AAC3D,mBAAW;AAAA,UACTA,MAAK,KAAK,MAAM,GAAG,WAAW,MAAM;AAAA,UACpCA,MAAK,KAAK,MAAM,GAAG,WAAW,MAAM;AAAA,UACpCA,MAAK,KAAK,MAAM,GAAG,WAAW,OAAO;AAAA,UACrCA,MAAK,KAAK,MAAM,WAAW;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,aAAW,KAAK,YAAY;AAC1B,QAAIC,IAAG,WAAW,CAAC,EAAG,QAAO;AAAA,EAC/B;AACA,SAAO;AACT;AAEO,SAAS,gBACd,WACA,WACA,gBACA,OAA6B,CAAC,GACgC;AAC9D,QAAM,SAAS,aAAa,SAAS;AACrC,QAAM,cAAc,kBAAkB,cAAc;AACpD,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK;AAAA,EACP;AACA,MAAI,CAAC,OAAO;AACV,UAAM,IAAI;AAAA,MACR,wBAAwB,MAAM,IAAI,WAAW,MAC1C,KAAK,UAAU,aAAa,KAAK,OAAO,MAAM;AAAA,IACnD;AAAA,EACF;AACA,EAAAA,IAAG,OAAO,OAAO,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACjD,SAAO,EAAE,QAAQ,aAAa,aAAa,MAAM;AACnD;;;AFlUA,eAAsB,mBACpB,QACA,OAAyB,CAAC,GACX;AACf,EAAAE,OAAM,yBAAyB;AAC/B,MAAI;AACF,QAAI,CAAC,QAAQ,KAAK,GAAG;AACnB,WAAK,yCAAyC;AAAA,IAChD;AACA,UAAM,YAAY,gBAAgB,KAAK,GAAG;AAC1C,UAAM,EAAE,QAAQ,GAAG,IAAI,QAAQ,WAAW,MAAO;AACjD,OAAG,iBAAiB,EAAE,sBAAsB;AAC5C,IAAAC,OAAM,sCAAsC,EAAE,SAAS;AAAA,EACzD,SAAS,KAAK;AACZ,SAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,EACvD;AACF;AAEA,eAAsB,wBACpB,QACA,aACA,OAA2D,CAAC,GAC7C;AACf,EAAAD,OAAM,8BAA8B;AACpC,MAAI;AACF,QAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,aAAa,KAAK,GAAG;AAC3C,WAAK,4DAA4D;AAAA,IACnE;AACA,UAAM,YAAY,gBAAgB,KAAK,GAAG;AAC1C,UAAM,SAAS,aAAa,WAAW,QAAS,aAAc;AAAA,MAC5D,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,MAC1C,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,IAClD,CAAC;AACD,UAAM,MAAME,MAAK,SAAS,WAAW,OAAO,QAAQ;AACpD,OAAG,WAAW,GAAG,EAAE;AACnB,QAAI,OAAO,SAAS,UAAU;AAC5B,MAAAD,OAAM,+DAA+D;AAAA,IACvE,OAAO;AACL,MAAAA,OAAM,iDAAiD;AAAA,IACzD;AAAA,EACF,SAAS,KAAK;AACZ,SAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,EACvD;AACF;;;AGnDA,OAAOE,WAAU;;;ACAjB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,eAAe,qBAAqB;AAE7C,IAAM,YAAYA,MAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAGtD,SAAS,UAAkB;AAEhC,QAAM,YAAYA,MAAK,QAAQ,WAAW,IAAI;AAC9C,MAAID,IAAG,WAAWC,MAAK,KAAK,WAAW,cAAc,CAAC,EAAG,QAAO;AAChE,SAAOA,MAAK,QAAQ,WAAW,OAAO;AACxC;AAEO,SAAS,kBAA0B;AACxC,SAAOA,MAAK,KAAK,QAAQ,GAAG,UAAU,cAAc;AACtD;AAEO,SAAS,gBAAwB;AACtC,SAAOA,MAAK,KAAK,QAAQ,GAAG,WAAW;AACzC;AAsBA,eAAsB,YAAkC;AACtD,QAAM,YAAYA,MAAK,KAAK,gBAAgB,GAAG,OAAO,WAAW;AACjE,MAAI,CAACD,IAAG,WAAW,SAAS,GAAG;AAC7B,UAAM,IAAI,MAAM,2BAA2B,SAAS,EAAE;AAAA,EACxD;AACA,SAAO,OAAO,cAAc,SAAS,EAAE;AACzC;AA2BA,eAAsB,YAAkC;AACtD,QAAM,YAAYC,MAAK,KAAK,gBAAgB,GAAG,OAAO,WAAW;AACjE,MAAI,CAACD,IAAG,WAAW,SAAS,GAAG;AAC7B,UAAM,IAAI,MAAM,iCAAiC,SAAS,EAAE;AAAA,EAC9D;AACA,SAAO,OAAO,cAAc,SAAS,EAAE;AACzC;AAUA,eAAsB,aAAoC;AACxD,QAAM,aAAaC,MAAK,KAAK,gBAAgB,GAAG,OAAO,YAAY;AACnE,MAAI,CAACD,IAAG,WAAW,UAAU,GAAG;AAC9B,UAAM,IAAI,MAAM,2BAA2B,UAAU,EAAE;AAAA,EACzD;AACA,SAAO,OAAO,cAAc,UAAU,EAAE;AAC1C;AAEO,SAAS,SAAiB;AAC/B,SAAOC,MAAK,KAAK,gBAAgB,GAAG,OAAO,oBAAoB;AACjE;;;ADhGA,eAAsB,iBACpB,QACA,OAAgC,CAAC,GAClB;AACf,QAAM,QAAQ,KAAK,YAAY,yBAAyB;AACxD,EAAAC,OAAM,KAAK;AACX,MAAI;AACF,UAAM,SAAS,gBAAgB,MAAM;AACrC,UAAM,UAAUC,MAAK,KAAK,QAAQ,QAAQ,WAAW;AACrD,UAAM,IAAIC,SAAQ;AAClB,MAAE,MAAM,KAAK,YAAY,4BAAuB,yBAAoB;AAEpE,UAAM,EAAE,cAAc,IAAI,MAAM,UAAU;AAC1C,UAAM,SAAS,cAAc;AAAA,MAC3B;AAAA,MACA;AAAA,MACA,OAAO,CAAC,KAAK;AAAA,IACf,CAAC;AAED,eAAW,KAAK,OAAO,YAAY,CAAC,GAAG;AACrC,WAAK,IAAI,EAAE,IAAI,KAAK,EAAE,OAAO,EAAE;AAAA,IACjC;AAEA,MAAE;AAAA,MACA,KAAK,YACD,aAAQ,OAAO,aAAa,GAAG,YAAY,OAAO,kBAAkB,GAAG,gBACvE,gBAAW,OAAO,OAAO;AAAA,IAC/B;AAEA,QAAI,CAAC,KAAK,WAAW;AACnB,UAAI,OAAO,YAAa,MAAK,GAAG,OAAO,WAAW,UAAU;AAC5D,UAAI,OAAO,aAAc,MAAK,GAAG,OAAO,YAAY,kBAAkB;AAAA,IACxE;AAEA,OAAG,KAAK,YAAY,iBAAiB,gBAAgB;AACrD,IAAAC,OAAM,KAAK,YAAY,qBAAqBF,MAAK,SAAS,QAAQ,IAAI,GAAG,OAAO,KAAK,OAAO;AAAA,EAC9F,SAAS,GAAG;AACV,SAAK,CAAC;AAAA,EACR;AACF;;;AE5CA,SAAS,aAAgC;AACzC,OAAOG,SAAQ;AACf,OAAOC,WAAU;;;ACFjB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAQV,SAAS,wBAAuC;AACrD,QAAM,UAAU,QAAQ,IAAI,uBAAuB,GAAG,KAAK;AAC3D,MAAI,WAAWC,IAAG,WAAWC,MAAK,KAAK,SAAS,cAAc,CAAC,GAAG;AAChE,WAAOA,MAAK,QAAQ,OAAO;AAAA,EAC7B;AAEA,QAAM,MAAM,WAAW;AACvB,MACE,IAAI,kBACJD,IAAG,WAAWC,MAAK,KAAK,IAAI,gBAAgB,cAAc,CAAC,GAC3D;AACA,WAAOA,MAAK,QAAQ,IAAI,cAAc;AAAA,EACxC;AAEA,QAAM,UAAUA,MAAK,QAAQ,QAAQ,GAAG,eAAe;AACvD,MAAID,IAAG,WAAWC,MAAK,KAAK,SAAS,cAAc,CAAC,GAAG;AACrD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,uBAA+B;AAC7C,QAAM,OAAO,sBAAsB;AACnC,MAAI,CAAC,MAAM;AACT,UAAM,IAAI;AAAA,MACR;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF;AACA,SAAO;AACT;;;AC7CA,OAAOC,WAAU;;;ACGV,SAAS,yBAAyB,MAAuC;AAC9E,QAAM,QAAS,KAAK,SAAS,CAAC;AAC9B,QAAM,OAAO,OAAO,KAAK,QAAQ,OAAO;AACxC,QAAM,UAAU,OAAO,KAAK,WAAW,SAAS;AAChD,QAAM,QAAQ;AAAA,IACZ,uBAAuB,IAAI;AAAA,IAC3B,MAAM,aAAa,WAAW,MAAM,UAAU,KAAK;AAAA,IACnD,MAAM,aAAa,iBAAiB,MAAM,UAAU,KAAK;AAAA,IACzD,MAAM,QAAQ,YAAY,MAAM,KAAK,KAAK;AAAA,IAC1C,MAAM,OAAO,WAAW,MAAM,IAAI,KAAK;AAAA,IACvC,cAAc,OAAO;AAAA,IACrB,KAAK,SAAS,OAAO,KAAK,UAAU,WAChC,YAAY,KAAK,UAAU,KAAK,KAAK,CAAC,KACtC;AAAA,IACJ,KAAK,OAAO,WAAW,KAAK,IAAI,KAAK;AAAA,EACvC,EAAE,OAAO,OAAO;AAChB,SAAO,MAAM,KAAK,IAAI;AACxB;;;ADPA,eAAsB,oBAAoB,MAEd;AAC1B,QAAM,YACJ,MAAM,kBACL,OAAO,QAAQ,IAAI,sBAAsB,CAAC,KAAK;AAElD,QAAM,SAASC,MAAK,aAAa,CAAC,KAAK,QAAQ;AAE7C,QAAI,UAAU,+BAA+B,GAAG;AAChD,QAAI,UAAU,gCAAgC,eAAe;AAC7D,QAAI,UAAU,gCAAgC,cAAc;AAE5D,QAAI,IAAI,WAAW,WAAW;AAC5B,UAAI,UAAU,GAAG;AACjB,UAAI,IAAI;AACR;AAAA,IACF;AAEA,QAAI,IAAI,WAAW,UAAU,IAAI,QAAQ,OAAO,IAAI,QAAQ,YAAY;AACtE,UAAI,UAAU,KAAK,EAAE,gBAAgB,aAAa,CAAC;AACnD,UAAI,IAAI,oBAAoB;AAC5B;AAAA,IACF;AAEA,QAAI,IAAI,WAAW,UAAU,IAAI,KAAK,WAAW,cAAc,GAAG;AAChE,YAAM,SAAmB,CAAC;AAC1B,UAAI,GAAG,QAAQ,CAAC,MAAM,OAAO,KAAK,CAAC,CAAC;AACpC,UAAI,GAAG,OAAO,MAAM;AAClB,YAAI;AACF,gBAAM,MAAM,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM;AACjD,gBAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,gBAAM,OAAO,yBAAyB,IAAI;AAC1C,kBAAQ,MAAM,OAAO,OAAO,IAAI;AAChC,cAAI,UAAU,GAAG;AACjB,cAAI,IAAI;AAAA,QACV,SAAS,GAAG;AACV,kBAAQ,MAAM,yCAAyC,CAAC;AACxD,cAAI,UAAU,GAAG;AACjB,cAAI,IAAI,UAAU;AAAA,QACpB;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAEA,QAAI,UAAU,GAAG;AACjB,QAAI,IAAI,WAAW;AAAA,EACrB,CAAC;AAED,QAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,WAAO,KAAK,SAAS,MAAM;AAC3B,WAAO,OAAO,WAAW,aAAa,MAAM,QAAQ,CAAC;AAAA,EACvD,CAAC;AAED,QAAM,OAAO,OAAO,QAAQ;AAC5B,MAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,UAAM,IAAI,MAAM,uCAAuC;AAAA,EACzD;AAEA,QAAM,OAAO,KAAK;AAClB,QAAM,MAAM,oBAAoB,IAAI;AAEpC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,MACL,IAAI,QAAQ,CAAC,YAAY;AACvB,aAAO,MAAM,MAAM,QAAQ,CAAC;AAAA,IAC9B,CAAC;AAAA,EACL;AACF;;;AF1DA,SAAS,aAAa,UAAgC;AACpD,aAAW,KAAK,UAAU;AACxB,QAAI;AACF,QAAE,KAAK,SAAS;AAAA,IAClB,QAAQ;AAAA,IAER;AAAA,EACF;AACF;AAEA,SAAS,SACP,IACA,IAC4B;AAC5B,MAAI;AACJ,QAAM,WAAW,IAAI,SAAkB;AACrC,QAAI,MAAO,cAAa,KAAK;AAC7B,YAAQ,WAAW,MAAM,GAAG,GAAG,IAAI,GAAG,EAAE;AAAA,EAC1C;AACA,UAAQ,SAAS,MAAM;AACrB,QAAI,MAAO,cAAa,KAAK;AAAA,EAC/B;AACA,SAAO;AACT;AAEA,eAAe,kBAAkB,QAG9B;AACD,QAAM,MAAM,WAAW;AACvB,MAAI,CAAC,IAAI,OAAO;AACd,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,QAAM,WAAW,0BAA0B;AAAA,IACzC,WAAW;AAAA,IACX,WAAW;AAAA,EACb,CAAC;AACD,MAAI,CAAC,UAAU;AACb,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,EAAE,GAAG,IAAI,aAAa,EAAE,aAAa,KAAK,CAAC;AACjD,MAAI;AACJ,MAAI;AACF,YAAQ,MAAM,GAAG,OAAO,KAAK,EAAE,IAAI,SAAS,CAAC;AAAA,EAC/C,QAAQ;AACN,YAAQ,MAAM,GAAG,OAAO,KAAK,EAAE,IAAI,UAAU,IAAI,OAAO,CAAC;AAAA,EAC3D;AACA,SAAO,EAAE,SAAS,MAAM,IAAI,MAAM,MAAM,KAAK;AAC/C;AAMA,eAAe,sBAAsB,QAA+B;AAClE,QAAM,UAAUC,MAAK,KAAK,QAAQ,QAAQ,WAAW;AACrD,QAAM,EAAE,SAAS,KAAK,IAAI,MAAM,kBAAkB,MAAM;AACxD,QAAM,EAAE,GAAG,IAAI,aAAa,EAAE,aAAa,KAAK,CAAC;AAEjD,QAAM,IAAIC,SAAQ;AAClB,IAAE,MAAM,yBAAoB;AAC5B,QAAM,EAAE,cAAc,IAAI,MAAM,UAAU;AAC1C,gBAAc,EAAE,QAAQ,SAAS,OAAO,KAAK,CAAC;AAC9C,IAAE,KAAK,YAAY;AAEnB,QAAM,cAAc,MAAM,oBAAoB;AAC9C,OAAK,2BAAsB,GAAG,KAAK,YAAY,GAAG,CAAC,aAAa;AAEhE,QAAM,aAAa,CAAC,eAA+B;AACjD,QAAI;AACF,YAAM,IAAI,IAAI,IAAI,UAAU;AAC5B,QAAE,aAAa,IAAI,iBAAiB,YAAY,GAAG;AACnD,aAAO,EAAE,SAAS;AAAA,IACpB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI;AACJ,MAAI,eAAe;AACnB,MAAI,aAAa;AAEjB,QAAM,YAAY,YAAY;AAC5B,QAAI,cAAc;AAChB,mBAAa;AACb;AAAA,IACF;AACA,mBAAe;AACf,QAAI;AACF,UAAI,CAACC,IAAG,WAAW,OAAO,GAAG;AAC3B,aAAK,kCAA6B;AAClC;AAAA,MACF;AACA,YAAM,OAAO,KAAK,MAAMA,IAAG,aAAa,SAAS,MAAM,CAAC;AACxD,YAAM,SAAS,MAAM,GAAG,OAAO,mBAAmB,SAAS,EAAE,KAAK,CAAC;AACnE,uBAAiB,WAAW,OAAO,UAAU;AAC7C,SAAG,gCAA2B,GAAG,KAAK,cAAc,CAAC,EAAE;AAAA,IACzD,SAAS,GAAG;AACV,WAAK,CAAC;AAAA,IACR,UAAE;AACA,qBAAe;AACf,UAAI,YAAY;AACd,qBAAa;AACb,cAAM,UAAU;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAgB,SAAS,MAAM;AACnC,SAAK,UAAU;AAAA,EACjB,GAAG,GAAG;AAEN,QAAM,UAAU;AAChB,MAAI,gBAAgB;AAClB,gBAAY,cAAc;AAAA,EAC5B;AAEA,EAAAC;AAAA,IACE;AAAA,MACE,YAAY,MAAM;AAAA,MAClB,YAAY,IAAI,KAAK,OAAO;AAAA,MAC5B,YAAY,kBAAkB,WAAW;AAAA,MACzC;AAAA,MACA;AAAA,MACA;AAAA,MACA,oCAAoC,YAAY,GAAG;AAAA,MACnD;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,IACX;AAAA,EACF;AAEA,QAAM,QAAQ;AAAA,IACZ,QAAQ;AAAA,IACR,CAAC,OAAO,GAAG,SAAS,QAAQ,MAAM,OAAO;AAAA,IACzC,EAAE,KAAK,QAAQ,KAAK,QAAQ,KAAK,OAAO,UAAU;AAAA,EACpD;AAGA,MAAI,WAAW;AACf,QAAM,eAAe,MAAM;AACzB,QAAI,CAAC,SAAU;AACf,kBAAc;AAAA,EAChB;AACA,MAAI;AACF,IAAAD,IAAG,MAAMF,MAAK,QAAQ,OAAO,GAAG,EAAE,YAAY,KAAK,GAAG,CAAC,QAAQ,aAAa;AAC1E,UAAI,CAAC,YAAY,aAAa,eAAe,OAAO,QAAQ,EAAE,SAAS,WAAW,GAAG;AACnF,qBAAa;AAAA,MACf;AAAA,IACF,CAAC;AAAA,EACH,QAAQ;AAEN,gBAAY,MAAM,aAAa,GAAG,GAAI,EAAE,MAAM;AAAA,EAChD;AAEA,QAAM,WAAW,OAAO,OAAO,MAAM;AACnC,eAAW;AACX,kBAAc,OAAO;AACrB,iBAAa,CAAC,KAAK,CAAC;AACpB,QAAI;AACF,YAAM,YAAY,MAAM;AAAA,IAC1B,QAAQ;AAAA,IAER;AACA,QAAI;AACF,YAAM,GAAG,OAAO,qBAAqB,OAAO;AAC5C,WAAK,iCAAiC;AAAA,IACxC,QAAQ;AAAA,IAER;AACA,YAAQ,KAAK,IAAI;AAAA,EACnB;AAEA,UAAQ,GAAG,UAAU,MAAM;AACzB,SAAK,SAAS,CAAC;AAAA,EACjB,CAAC;AACD,UAAQ,GAAG,WAAW,MAAM;AAC1B,SAAK,SAAS,CAAC;AAAA,EACjB,CAAC;AAED,QAAM,GAAG,QAAQ,CAAC,SAAS;AACzB,QAAI,QAAQ,SAAS,EAAG,MAAK,SAAS,IAAI;AAAA,EAC5C,CAAC;AAED,KAAG,QAAQ,GAAG,KAAK,kBAAkB,WAAW,IAAI,YAAY,CAAC,EAAE;AACnE,EAAAI,OAAM,+CAA0C;AAEhD,QAAM,IAAI,QAAQ,MAAM;AAAA,EAAC,CAAC;AAC5B;AAKA,eAAe,0BACb,QACA,MACe;AACf,QAAM,UAAUJ,MAAK,KAAK,QAAQ,QAAQ,WAAW;AACrD,QAAM,cAAcA,MAAK,KAAK,QAAQ,QAAQ,qBAAqB;AACnE,QAAM,OAAO,OAAO,KAAK,IAAI,KAAK,eAAe;AAEjD,MAAI,KAAK,YAAY;AACnB,YAAQ,IAAI,uBAAuB,IAAIA,MAAK,QAAQ,KAAK,UAAU;AAAA,EACrE;AACA,QAAM,iBAAiB,qBAAqB;AAC5C,QAAM,cAAc,MAAM,oBAAoB;AAC9C,OAAK,2BAAsB,GAAG,KAAK,YAAY,GAAG,CAAC,aAAa;AAEhE,QAAM,MAAM,WAAW;AACvB,QAAM,WAAW,0BAA0B;AAAA,IACzC,WAAW;AAAA,IACX,WAAW;AAAA,EACb,CAAC;AACD,QAAM,KAAK,cAAc,MAAM;AAE/B,MAAI,OAAO,GAAG;AACd,MAAI,CAAC,QAAQ,UAAU;AACrB,QAAI;AACF,YAAM,EAAE,GAAG,IAAI,aAAa,EAAE,aAAa,QAAQ,IAAI,KAAK,EAAE,CAAC;AAC/D,UAAI,IAAI,OAAO;AACb,YAAI;AACF,gBAAM,QAAQ,MAAM,GAAG,OAAO,KAAK,EAAE,IAAI,SAAS,CAAC;AACnD,iBAAO,MAAM;AAAA,QACf,QAAQ;AACN,cAAI;AACF,kBAAM,QAAQ,MAAM,GAAG,OAAO,KAAK,EAAE,IAAI,UAAU,IAAI,OAAO,CAAC;AAC/D,mBAAO,MAAM;AAAA,UACf,QAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,QAAM,IAAIC,SAAQ;AAClB,IAAE,MAAM,yBAAoB;AAC5B,QAAM,EAAE,cAAc,IAAI,MAAM,UAAU;AAC1C,gBAAc,EAAE,QAAQ,SAAS,OAAO,KAAK,CAAC;AAC9C,IAAE,KAAK,YAAY;AAEnB,QAAM,cAAc,OAChB,UAAU,IAAI,wBAAwB,IAAI,KAC1C,oBAAoB,IAAI;AAC5B,QAAM,kBAAkB,MAAM;AAC5B,QAAI;AACF,YAAM,IAAI,IAAI,IAAI,WAAW;AAC7B,QAAE,aAAa,IAAI,iBAAiB,YAAY,GAAG;AACnD,aAAO,EAAE,SAAS;AAAA,IACpB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,GAAG;AAEH,EAAAE;AAAA,IACE;AAAA,MACE,cAAc,MAAM;AAAA,MACpB,cAAc,cAAc;AAAA,MAC5B,cAAc,cAAc;AAAA,MAC5B,cAAc,YAAY,GAAG;AAAA,MAC7B;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,IACX;AAAA,EACF;AAEA,QAAM,MAAyB;AAAA,IAC7B,GAAG,QAAQ;AAAA,IACX,0BAA0B;AAAA,IAC1B,6BAA6B;AAAA,IAC7B,mBAAmB,YAAY;AAAA,IAC/B,MAAM,OAAO,IAAI;AAAA,EACnB;AACA,MAAI,MAAM;AACR,QAAI,4BAA4B,IAAI;AAAA,EACtC;AAEA,QAAM,QAAQ;AAAA,IACZ,QAAQ;AAAA,IACR,CAAC,OAAO,GAAG,SAAS,QAAQ,MAAM,OAAO;AAAA,IACzC,EAAE,KAAK,QAAQ,KAAK,OAAO,UAAU;AAAA,EACvC;AAEA,QAAM,OAAO;AAAA,IACX;AAAA,IACA,CAAC,QAAQ,OAAO,eAAe,MAAM,WAAW,MAAM,OAAO,IAAI,CAAC;AAAA,IAClE,EAAE,KAAK,gBAAgB,KAAK,OAAO,WAAW,OAAO,KAAK;AAAA,EAC5D;AAEA,QAAM,WAAW,CAAC,OAAO,IAAI;AAC7B,QAAM,WAAW,CAAC,OAAO,MAAM;AAC7B,iBAAa,QAAQ;AACrB,SAAK,YAAY,MAAM,EAAE,QAAQ,MAAM,QAAQ,KAAK,IAAI,CAAC;AAAA,EAC3D;AAEA,UAAQ,GAAG,UAAU,MAAM,SAAS,CAAC,CAAC;AACtC,UAAQ,GAAG,WAAW,MAAM,SAAS,CAAC,CAAC;AAEvC,OAAK,GAAG,QAAQ,CAAC,SAAS,SAAS,QAAQ,CAAC,CAAC;AAC7C,QAAM,GAAG,QAAQ,CAAC,SAAS;AACzB,QAAI,QAAQ,SAAS,EAAG,UAAS,IAAI;AAAA,EACvC,CAAC;AAED,KAAG,QAAQ,GAAG,KAAK,cAAc,CAAC,EAAE;AACpC,EAAAC,OAAM,gCAA2B;AAEjC,QAAM,IAAI,QAAQ,MAAM;AAAA,EAAC,CAAC;AAC5B;AAEA,eAAsB,eACpB,QACA,MACe;AACf,EAAAC,OAAM,oBAAoB;AAC1B,MAAI;AACF,UAAM,SAAS,gBAAgB,MAAM;AACrC,QAAI,KAAK,SAAS,KAAK,YAAY;AACjC,YAAM,0BAA0B,QAAQ,IAAI;AAC5C;AAAA,IACF;AACA,UAAM,sBAAsB,MAAM;AAAA,EACpC,SAAS,GAAG;AACV,SAAK,CAAC;AAAA,EACR;AACF;;;AIlWA,OAAOC,UAAQ;AACf,OAAOC,SAAQ;AACf,OAAOC,YAAU;AAEjB,SAAS,+BAA+B;;;ACJxC,SAAS,oBAAoB;AAC7B,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAWV,IAAM,wBACX;AAeK,SAAS,sBACd,OAAe,QAAQ,GACH;AACpB,QAAM,MAAM,QAAQ,IAAI,uBAAuB;AAC/C,MAAI,QAAQ,QAAW;AACrB,UAAM,UAAU,IAAI,KAAK;AACzB,QAAI,YAAY,MAAM,YAAY,OAAO,YAAY,SAAS;AAC5D,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,QAAM,cAAcC,MAAK,QAAQ,MAAM,MAAM,cAAc,OAAO;AAClE,MAAIC,IAAG,WAAWD,MAAK,KAAK,aAAa,MAAM,CAAC,GAAG;AACjD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAYO,SAAS,gBAAgB,MAKb;AACjB,QAAM,OAAOE,MAAK,QAAQ,KAAK,IAAI;AACnC,MAAIC,IAAG,WAAW,IAAI,GAAG;AACvB,UAAM,UAAUA,IAAG,YAAY,IAAI;AACnC,QAAI,QAAQ,SAAS,GAAG;AACtB,YAAM,IAAI,MAAM,0BAA0B,IAAI,EAAE;AAAA,IAClD;AACA,IAAAA,IAAG,OAAO,MAAM,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EAClD;AAEA,QAAM,QAAQ,KAAK,SAAS;AAC5B;AAAA,IACE;AAAA,IACA,CAAC,SAAS,WAAW,KAAK,IAAI,KAAK,KAAK,IAAI;AAAA,IAC5C,EAAE,OAAO,CAAC,UAAU,QAAQ,MAAM,EAAE;AAAA,EACtC;AAEA,QAAM,SAASD,MAAK,KAAK,MAAM,MAAM;AACrC,MAAIC,IAAG,WAAW,MAAM,GAAG;AACzB,IAAAA,IAAG,OAAO,QAAQ,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EACpD;AAEA,SAAO,EAAE,QAAQ,OAAO,QAAQ,KAAK,IAAI;AAC3C;AAEO,SAAS,iBAAiB,MAId;AACjB,MAAI,CAACA,IAAG,WAAW,KAAK,GAAG,GAAG;AAC5B,UAAM,IAAI,MAAM,sBAAsB,KAAK,GAAG,EAAE;AAAA,EAClD;AACA,OAAK,QAAQ,KAAK,KAAK,KAAK,IAAI;AAChC,SAAO,EAAE,QAAQ,SAAS,QAAQ,KAAK,IAAI;AAC7C;;;ACnGA,OAAOC,SAAQ;AACf,OAAOC,YAAU;AAIV,SAAS,sBAAsB,MAAsB;AAC1D,SAAO,KAAK,YAAY;AAC1B;AAEO,IAAM,uBAAuB;AAAA,EAClC,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,EACN,SAAS,EAAE,MAAM,OAAO;AAAA,EACxB,SAAS;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,KAAK;AAAA,IACL,SAAS;AAAA,IACT,WAAW;AAAA,EACb;AAAA,EACA,cAAc,CAAC;AAAA,EACf,iBAAiB;AAAA,IACf,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,YAAY;AAAA,EACd;AACF;AAEO,IAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAQjC,IAAM,qBAAqB,CAAC,aAAa,QAAQ,SAAS;AAG1D,IAAM,sBAAsB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,kBAA0C;AAAA,EAC9C,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,YAAY;AACd;AAEA,SAAS,QAAQ,KAAa,MAAoB;AAChD,EAAAC,IAAG,UAAU,MAAM,EAAE,WAAW,KAAK,CAAC;AACtC,aAAW,SAASA,IAAG,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC,GAAG;AAChE,QAAI,MAAM,SAAS,OAAO,MAAM,SAAS,KAAM;AAC/C,QACE,MAAM,SAAS,kBACf,MAAM,SAAS,UACf,MAAM,SAAS,UACf,MAAM,KAAK,WAAW,OAAO,GAC7B;AACA;AAAA,IACF;AACA,UAAM,OAAOC,OAAK,KAAK,KAAK,MAAM,IAAI;AACtC,UAAM,KAAKA,OAAK,KAAK,MAAM,MAAM,IAAI;AACrC,QAAI,MAAM,YAAY,EAAG,SAAQ,MAAM,EAAE;AAAA,QACpC,CAAAD,IAAG,aAAa,MAAM,EAAE;AAAA,EAC/B;AACF;AAEA,SAAS,mBAAmB,MAAc,IAAqB;AAC7D,MAAI,CAACA,IAAG,WAAW,IAAI,KAAKA,IAAG,WAAW,EAAE,EAAG,QAAO;AACtD,QAAM,KAAKA,IAAG,SAAS,IAAI;AAC3B,MAAI,GAAG,YAAY,EAAG,SAAQ,MAAM,EAAE;AAAA,OACjC;AACH,IAAAA,IAAG,UAAUC,OAAK,QAAQ,EAAE,GAAG,EAAE,WAAW,KAAK,CAAC;AAClD,IAAAD,IAAG,aAAa,MAAM,EAAE;AAAA,EAC1B;AACA,SAAO;AACT;AAMO,SAAS,gBAAgB,MAAuB;AACrD,QAAM,aAAaC,OAAK,KAAK,MAAM,WAAW;AAC9C,MAAID,IAAG,WAAW,UAAU,EAAG,QAAO;AAEtC,QAAM,QAAQC,OAAK,KAAK,cAAc,GAAG,OAAO;AAChD,MAAI,SAAS;AACb,aAAW,QAAQ,oBAAoB;AACrC,QAAI,mBAAmBA,OAAK,KAAK,OAAO,IAAI,GAAGA,OAAK,KAAK,MAAM,IAAI,CAAC,GAAG;AACrE,eAAS;AAAA,IACX;AAAA,EACF;AACA,SAAO;AACT;AAQO,SAAS,oBAAoB,MAAuB;AACzD,QAAM,QAAQA,OAAK,KAAK,cAAc,GAAG,OAAO;AAChD,MAAI,UAAU;AAEd,aAAW,QAAQ,qBAAqB;AACtC,QAAI,mBAAmBA,OAAK,KAAK,OAAO,IAAI,GAAGA,OAAK,KAAK,MAAM,IAAI,CAAC,GAAG;AACrE,gBAAU;AAAA,IACZ;AAAA,EACF;AAGA,QAAM,YAAYA,OAAK,KAAK,OAAO,SAAS,uBAAuB;AACnE,QAAM,UAAUA,OAAK,KAAK,MAAM,SAAS,uBAAuB;AAChE,MAAI,mBAAmB,WAAW,OAAO,EAAG,WAAU;AAEtD,QAAM,kBAAkBA,OAAK,KAAK,OAAO,SAAS,4BAA4B;AAC9E,QAAM,gBAAgBA,OAAK,KAAK,MAAM,SAAS,4BAA4B;AAC3E,MAAI,mBAAmB,iBAAiB,aAAa,EAAG,WAAU;AAGlE,MAAI,mBAAmBA,OAAK,KAAK,OAAO,WAAW,GAAGA,OAAK,KAAK,MAAM,WAAW,CAAC,GAAG;AACnF,cAAU;AAAA,EACZ;AACA,MAAI,mBAAmBA,OAAK,KAAK,OAAO,YAAY,GAAGA,OAAK,KAAK,MAAM,YAAY,CAAC,GAAG;AACrF,cAAU;AAAA,EACZ;AAEA,QAAM,UAAUA,OAAK,KAAK,MAAM,cAAc;AAC9C,MAAID,IAAG,WAAW,OAAO,GAAG;AAC1B,UAAM,MAAM,KAAK,MAAMA,IAAG,aAAa,SAAS,MAAM,CAAC;AAIvD,UAAM,UACJ,IAAI,WAAW,OAAO,IAAI,YAAY,WACjC,EAAE,GAAI,IAAI,QAAmC,IAI9C,CAAC;AACP,QAAI,CAAC,QAAQ,WAAW;AACtB,cAAQ,YAAY;AACpB,UAAI,UAAU;AACd,gBAAU;AAAA,IACZ;AACA,UAAM,UACJ,IAAI,mBAAmB,OAAO,IAAI,oBAAoB,WACjD,EAAE,GAAI,IAAI,gBAA2C,IAItD,CAAC;AACP,eAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,eAAe,GAAG;AAC7D,UAAI,CAAC,QAAQ,IAAI,GAAG;AAClB,gBAAQ,IAAI,IAAI;AAChB,kBAAU;AAAA,MACZ;AAAA,IACF;AACA,QAAI,kBAAkB;AACtB,IAAAA,IAAG,cAAc,SAAS,GAAG,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAAA,EACvE;AAEA,SAAO;AACT;AAMO,SAAS,kBAAkB,MAAc,YAA0B;AACxE,QAAM,UAAU,sBAAsB,UAAU;AAChD,QAAM,UAAUC,OAAK,KAAK,MAAM,cAAc;AAE9C,MAAID,IAAG,WAAW,OAAO,GAAG;AAC1B,UAAM,MAAM,KAAK,MAAMA,IAAG,aAAa,SAAS,MAAM,CAAC;AAIvD,QAAI,OAAO;AACX,QAAI,CAAC,IAAI,WAAW,OAAO,IAAI,YAAY,UAAU;AACnD,UAAI,UAAU,EAAE,GAAG,qBAAqB,QAAQ;AAAA,IAClD;AACA,UAAM,UAAU,IAAI;AACpB,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,qBAAqB,OAAO,GAAG;AACvE,UAAI,CAAC,QAAQ,GAAG,EAAG,SAAQ,GAAG,IAAI;AAAA,IACpC;AACA,UAAM,UACJ,IAAI,mBAAmB,OAAO,IAAI,oBAAoB,WACjD,IAAI,kBACL,CAAC;AACP,eAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,eAAe,GAAG;AAC7D,UAAI,CAAC,QAAQ,IAAI,EAAG,SAAQ,IAAI,IAAI;AAAA,IACtC;AACA,QAAI,kBAAkB;AACtB,IAAAA,IAAG,cAAc,SAAS,GAAG,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAAA,EACvE,OAAO;AACL,IAAAA,IAAG;AAAA,MACD;AAAA,MACA,GAAG,KAAK,UAAU,EAAE,GAAG,sBAAsB,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC;AAAA;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAgBC,OAAK,KAAK,MAAM,YAAY;AAClD,MAAI,CAACD,IAAG,WAAW,aAAa,GAAG;AACjC,IAAAA,IAAG,cAAc,eAAe,mBAAmB,MAAM;AAAA,EAC3D,OAAO;AACL,UAAM,WAAWA,IAAG,aAAa,eAAe,MAAM;AACtD,UAAM,SAAmB,CAAC;AAC1B,QACE,CAAC,0BAA0B,KAAK,QAAQ,KACxC,CAAC,SAAS,SAAS,cAAc,GACjC;AACA,aAAO,KAAK,eAAe;AAAA,IAC7B;AACA,QAAI,CAAC,kBAAkB,KAAK,QAAQ,KAAK,CAAC,SAAS,SAAS,OAAO,GAAG;AACpE,aAAO,KAAK,OAAO;AAAA,IACrB;AACA,QAAI,OAAO,SAAS,GAAG;AACrB,YAAM,MAAM,SAAS,SAAS,IAAI,IAAI,KAAK;AAC3C,MAAAA,IAAG;AAAA,QACD;AAAA,QACA,GAAG,QAAQ,GAAG,GAAG,GAAG,OAAO,KAAK,IAAI,CAAC;AAAA;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AC5OA,OAAOE,SAAQ;AACf,OAAOC,YAAU;AAgBV,SAAS,6BACd,QACwB;AACxB,QAAM,MAA8B,CAAC;AAErC,aAAW,QAAQ,CAAC,UAAU,SAAS,GAAY;AACjD,UAAM,OAAOA,OAAK,KAAK,QAAQ,MAAM,YAAY;AACjD,QAAI,CAACD,IAAG,WAAW,IAAI,EAAG;AAG1B,UAAM,OAAO,oBAAI,IAAoB;AACrC,eAAW,OAAOA,IAAG,YAAY,MAAM,EAAE,eAAe,KAAK,CAAC,GAAG;AAC/D,UAAI,IAAI,KAAK,WAAW,GAAG,EAAG;AAC9B,UAAI,IAAI,YAAY,GAAG;AACrB,aAAK,IAAI,IAAI,MAAMC,OAAK,KAAK,MAAM,IAAI,IAAI,CAAC;AAAA,MAC9C;AAAA,IACF;AACA,eAAW,OAAOD,IAAG,YAAY,MAAM,EAAE,eAAe,KAAK,CAAC,GAAG;AAC/D,UAAI,IAAI,KAAK,WAAW,GAAG,KAAK,CAAC,IAAI,OAAO,EAAG;AAC/C,YAAM,IAAI,yBAAyB,KAAK,IAAI,IAAI;AAChD,UAAI,CAAC,EAAG;AACR,YAAM,KAAK,EAAE,CAAC;AACd,UAAI,KAAK,IAAI,EAAE,EAAG;AAClB,WAAK,IAAI,IAAIC,OAAK,KAAK,MAAM,IAAI,IAAI,CAAC;AAAA,IACxC;AACA,UAAM,UAAU,CAAC,GAAG,KAAK,QAAQ,CAAC,EAC/B,IAAI,CAAC,CAAC,IAAI,SAAS,OAAO,EAAE,IAAI,UAAU,EAAE,EAC5C,KAAK,CAAC,GAAG,MAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC;AAE1C,eAAW,EAAE,IAAI,MAAM,UAAU,KAAK,SAAS;AAC7C,YAAM,QAAQD,IAAG,SAAS,SAAS,EAAE,YAAY;AACjD,YAAM,WAAW,QACbC,OAAK,KAAK,WAAW,gBAAgB,IACrC,UAAU,SAAS,OAAO,IACxB,YACA;AACN,YAAM,UAAU,QACZA,OAAK,KAAK,WAAW,eAAe,IACpC,UAAU,SAAS,MAAM,IACvB,YACA;AACN,YAAM,UAAU,QACZA,OAAK,KAAK,WAAW,eAAe,IACpC,UAAU,SAAS,MAAM,IACvB,YACA;AACN,YAAM,QAAQ,WAAWD,IAAG,WAAW,OAAO,IAC1C,UACA,WAAWA,IAAG,WAAW,OAAO,IAC9B,UACA;AAEN,UAAI,OAAgC,CAAC;AACrC,UAAI,YAAYA,IAAG,WAAW,QAAQ,GAAG;AACvC,eAAO,KAAK,MAAMA,IAAG,aAAa,UAAU,MAAM,CAAC;AAAA,MAIrD;AAEA,UAAI,OAAO,OAAO,KAAK,MAAM,MAAM,WAAW,KAAK,MAAM,IAAI;AAC7D,UAAI,OAAO;AACT,cAAM,SAASA,IAAG,aAAa,OAAO,MAAM;AAE5C,eAAO;AACP,cAAM,YAAY,OAAO;AAAA,UACvB;AAAA,QACF;AACA,YAAI,YAAY,CAAC,GAAG;AAClB,cAAI;AAEF,mBAAO,EAAE,GAAG,MAAM,GAAI,IAAI,SAAS,WAAW,UAAU,CAAC,CAAC,GAAG,EAAE,EAAa;AAAA,UAC9E,QAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AACA,UAAI,CAAC,KAAK,KAAK,KAAK,EAAE,YAAYA,IAAG,WAAW,QAAQ,GAAI;AAC5D,UAAI,CAAC,KAAK,KAAK,EAAG;AAElB,YAAM,YACH,OAAO,KAAK,WAAW,MAAM,YAAY,KAAK,WAAW,KACzD,OAAO,KAAK,IAAI,MAAM,YAAY,KAAK,IAAI,KAC5C;AAEF,UAAI,KAAK,EAAE,WAAW,MAAM,KAAK,WAAW,MAAM,KAAK,CAAC;AAAA,IAC1D;AAAA,EACF;AAEA,QAAM,OAAO,oBAAI,IAAY;AAC7B,SAAO,IAAI,OAAO,CAAC,MAAM;AACvB,QAAI,KAAK,IAAI,EAAE,SAAS,EAAG,QAAO;AAClC,SAAK,IAAI,EAAE,SAAS;AACpB,WAAO;AAAA,EACT,CAAC;AACH;AAEO,SAAS,wBACd,MACA,aACS;AACT,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAE9C,QAAM,OAAO,CAAC,SAA2B;AACvC,QAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAC9C,QAAI,MAAM,QAAQ,IAAI,EAAG,QAAO,KAAK,IAAI,IAAI;AAE7C,UAAM,MAAM;AACZ,SACG,IAAI,MAAM,MAAM,YAAY,CAAC,IAAI,MAAM,MACxC,OAAO,IAAI,MAAM,MAAM,YACvB,YAAY,IAAI,IAAI,MAAM,EAAE,KAAK,CAAC,GAClC;AACA,YAAM,QAAQ,YAAY,IAAI,IAAI,MAAM,EAAE,KAAK,CAAC;AAChD,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,QACb,aAAa;AAAA,QACb,GAAG;AAAA,MACL,IAAI;AACJ,aAAO,KAAK,EAAE,GAAG,MAAM,MAAM,aAAa,MAAM,CAAC;AAAA,IACnD;AAEA,UAAM,MAA+B,CAAC;AACtC,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,GAAG;AACxC,UAAI,CAAC,IAAI,KAAK,CAAC;AAAA,IACjB;AACA,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,IAAI;AAClB;AAEO,SAAS,cACd,MACyB;AACzB,QAAM,QAAQ,gBAAgB,IAAI;AAClC,SAAO,MAAM,MAAM;AACnB,SAAO;AACT;AAEO,SAAS,gBACd,SACA,gBAAgB,MACA;AAChB,QAAM,aAAaC,OAAK,KAAK,SAAS,SAAS;AAC/C,MAAI,CAACD,IAAG,WAAW,UAAU,EAAG,QAAO,CAAC;AAExC,SAAOA,IACJ,YAAY,UAAU,EACtB,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO,CAAC,EACjC,IAAI,CAAC,MAAM;AACV,UAAM,SAASC,OAAK,SAAS,GAAG,OAAO;AACvC,UAAM,WAAW,KAAK;AAAA,MACpBD,IAAG,aAAaC,OAAK,KAAK,YAAY,CAAC,GAAG,MAAM;AAAA,IAClD;AACA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,WAAW,WAAW;AAAA,IACxB;AAAA,EACF,CAAC;AACL;AAeA,IAAM,gBAAgB;AACtB,IAAM,iBAAiB;AAEhB,SAAS,sBAAsB,MAA4B;AAChE,QAAM,MAAM,oBAAI,IAAY;AAE5B,QAAM,WAAW,CACf,MACA,UACS;AACT,QAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,QAAQ,cAAe;AAChE,QAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,iBAAW,QAAQ,KAAM,UAAS,MAAM,KAAK;AAC7C;AAAA,IACF;AACA,UAAM,MAAM;AACZ,QAAI,IAAI,MAAM,MAAM,aAAa;AAC/B,YAAM,MAAM,IAAI,OAAO,KAAK,IAAI,QAAQ;AACxC,UAAI,OAAO,QAAQ,YAAY,IAAI,KAAK,EAAG,KAAI,IAAI,IAAI,KAAK,CAAC;AAAA,IAC/D;AACA,QAAI,MAAM,QAAQ,IAAI,UAAU,CAAC,GAAG;AAClC,iBAAW,MAAM,IAAI,UAAU,EAAG,UAAS,IAAI,QAAQ,CAAC;AAAA,IAC1D;AACA,QAAI,IAAI,OAAO,KAAK,OAAO,IAAI,OAAO,MAAM,UAAU;AACpD,iBAAW,OAAO,OAAO,OAAO,IAAI,OAAO,CAA4B,GAAG;AACxE,YAAI,CAAC,MAAM,QAAQ,GAAG,EAAG;AACzB,mBAAW,MAAM,IAAK,UAAS,IAAI,QAAQ,CAAC;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAS,MAAqD;AACpE,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,aAAW,QAAQ,OAAO,OAAO,KAAK,GAAG;AACvC,UAAM,WAAY,MAAiD;AACnE,QAAI,CAAC,SAAU;AACf,eAAW,WAAW,OAAO,OAAO,QAAQ,GAAG;AAC7C,YAAM,QAAS,SAAwC;AACvD,UAAI,CAAC,MAAM,QAAQ,KAAK,EAAG;AAC3B,iBAAW,KAAK,MAAO,UAAS,GAAG,CAAC;AAAA,IACtC;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,UACP,MACA,UACyB;AACzB,MAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;AAC5E,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO,EAAE,GAAG,SAAS;AAC5D,QAAM,MAA+B,EAAE,GAAG,KAAK;AAC/C,aAAW,OAAO,OAAO,KAAK,QAAQ,GAAG;AACvC,UAAM,KAAK,SAAS,GAAG;AACvB,UAAM,KAAK,KAAK,GAAG;AACnB,QACE,OAAO,QACP,OAAO,OAAO,YACd,CAAC,MAAM,QAAQ,EAAE,KACjB,OAAO,QACP,OAAO,OAAO,YACd,CAAC,MAAM,QAAQ,EAAE,GACjB;AACA,UAAI,GAAG,IAAI;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF,OAAO;AACL,UAAI,GAAG,IAAI;AAAA,IACb;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,WACP,MACA,UACkC;AAClC,QAAM,UAAU,CAAC,EAAE,QAAQ,OAAO,KAAK,IAAI,EAAE,SAAS;AACtD,QAAM,cAAc,CAAC,EAAE,YAAY,OAAO,KAAK,QAAQ,EAAE,SAAS;AAClE,MAAI,CAAC,WAAW,CAAC,YAAa,QAAO;AACrC,QAAM,MAAiC,CAAC;AACxC,MAAI,SAAS;AACX,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAK,GAAG;AAC1C,UAAI,CAAC,IAAI,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AAAA,IACxC;AAAA,EACF;AACA,MAAI,aAAa;AACf,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,QAAS,GAAG;AAC9C,UAAI,MAAM,QAAQ,CAAC,EAAG,KAAI,CAAC,IAAI;AAAA,IACjC;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,gBACP,MACA,UACA,OACgC;AAChC,MAAI,CAAC,QAAQ,QAAQ,cAAe,QAAO,QAAQ;AAEnD,MAAI,MAAM,QAAQ,KAAK,UAAU,CAAC,GAAG;AACnC,UAAM,OAAkC,CAAC;AACzC,eAAW,SAAS,KAAK,UAAU,GAAgB;AACjD,YAAM,YAAY;AAAA,QAChB;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV;AACA,UAAI,UAAW,MAAK,KAAK,SAAS;AAAA,IACpC;AACA,SAAK,UAAU,IAAI;AAAA,EACrB;AAEA,MAAI,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,UAAU;AACtD,UAAM,QAAQ,KAAK,OAAO;AAC1B,eAAW,CAAC,SAAS,GAAG,KAAK,OAAO,QAAQ,KAAK,GAAG;AAClD,UAAI,CAAC,MAAM,QAAQ,GAAG,EAAG;AACzB,YAAM,OAAkC,CAAC;AACzC,iBAAW,SAAS,KAAK;AACvB,cAAM,YAAY;AAAA,UAChB;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,QACV;AACA,YAAI,UAAW,MAAK,KAAK,SAAS;AAAA,MACpC;AACA,YAAM,OAAO,IAAI;AAAA,IACnB;AAAA,EACF;AAEA,MAAI,KAAK,MAAM,MAAM,YAAa,QAAO;AAEzC,QAAM,QAAQ,KAAK,OAAO,KAAK,KAAK,QAAQ;AAC5C,MAAI,OAAO,UAAU,YAAY,CAAC,MAAM,KAAK,EAAG,QAAO;AACvD,QAAM,QAAQ,SAAS,MAAM,KAAK,CAAC;AACnC,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,cAAc;AAAA,IAClB,MAAM,gBAAgB,CAAC;AAAA,IACtB,KAAK,OAAO,KAA6C,CAAC;AAAA,EAC7D;AACA,QAAM,cAAc;AAAA,IAClB,MAAM;AAAA,IACN,KAAK,OAAO;AAAA,EACd;AAEA,QAAM,eAAwC;AAAA,IAC5C,GAAG;AAAA,IACH,MAAM;AAAA,IACN,MAAM,MAAM;AAAA,IACZ,aAAa,MAAM,eAAe,CAAC;AAAA,IACnC,aAAa,MAAM,eAAe,CAAC;AAAA,IACnC,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AACA,MAAI,MAAM,eAAe,QAAQ,aAAa,aAAa,KAAK,MAAM;AACpE,iBAAa,aAAa,IAAI,MAAM;AAAA,EACtC;AACA,SAAO,aAAa,OAAO;AAC3B,SAAO,aAAa,QAAQ;AAC5B,SAAO,aAAa,YAAY;AAChC,SAAO;AACT;AAMO,SAAS,gCACd,MACA,UACM;AACN,QAAM,QAAQ,KAAK,OAAO;AAC1B,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU;AAEzC,aAAW,QAAQ,OAAO,OAAO,KAAgC,GAAG;AAClE,QAAI,CAAC,QAAQ,OAAO,SAAS,SAAU;AACvC,UAAM,WAAY,KAAiC,UAAU;AAC7D,QAAI,CAAC,YAAY,OAAO,aAAa,SAAU;AAC/C,eAAW,WAAW,OAAO,OAAO,QAAmC,GAAG;AACxE,UAAI,CAAC,WAAW,OAAO,YAAY,SAAU;AAC7C,YAAM,QAAS,QAAoC,YAAY;AAC/D,UAAI,CAAC,MAAM,QAAQ,KAAK,EAAG;AAC3B,YAAM,OAAkC,CAAC;AACzC,iBAAW,KAAK,OAAO;AACrB,cAAM,YAAY;AAAA,UAChB;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,YAAI,UAAW,MAAK,KAAK,SAAS;AAAA,MACpC;AACA,MAAC,QAAoC,YAAY,IAAI;AAAA,IACvD;AAAA,EACF;AACF;AAeA,eAAsB,8BAA8B,MAIC;AACnD,QAAM,UAAgD,CAAC;AACvD,QAAM,aAAa,oBAAI,IAAY;AACnC,MAAI,gBAAgB;AAEpB,WAAS,QAAQ,GAAG,QAAQ,gBAAgB,SAAS;AACnD,UAAM,MAAM,CAAC,GAAG,sBAAsB,KAAK,IAAI,CAAC,EAAE;AAAA,MAChD,CAAC,OAAO,EAAE,MAAM;AAAA,IAClB;AACA,QAAI,IAAI,WAAW,EAAG;AAEtB,UAAM,MAAM,MAAM,KAAK,QAAQ;AAAA,MAC7B,SAAS,KAAK;AAAA,MACd;AAAA,IACF,CAAC;AACD,UAAM,QAAQ,IAAI,YAAY,CAAC;AAC/B,eAAW,CAAC,IAAI,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC/C,cAAQ,EAAE,IAAI;AACd,uBAAiB;AAAA,IACnB;AACA,eAAW,MAAM,IAAI,WAAW,CAAC,EAAG,YAAW,IAAI,EAAE;AAErD,oCAAgC,KAAK,MAAM,OAAO;AAClD,QAAI,OAAO,KAAK,KAAK,EAAE,WAAW,EAAG;AAAA,EACvC;AAEA,QAAM,WAAW,CAAC,GAAG,sBAAsB,KAAK,IAAI,CAAC;AACrD,aAAW,MAAM,SAAU,YAAW,IAAI,EAAE;AAE5C,SAAO;AAAA,IACL,UAAU;AAAA,IACV,SAAS,CAAC,GAAG,UAAU;AAAA,EACzB;AACF;;;AHnaA,IAAM,YAAY;AAClB,IAAM,YAAY;AAClB,IAAM,SAAS;AACf,IAAM,eAAe;AAErB,SAASC,SAAQ,KAAa,MAAoB;AAChD,EAAAC,KAAG,UAAU,MAAM,EAAE,WAAW,KAAK,CAAC;AACtC,aAAW,SAASA,KAAG,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC,GAAG;AAChE,QAAI,MAAM,SAAS,OAAO,MAAM,SAAS,KAAM;AAC/C,QACE,MAAM,SAAS,kBACf,MAAM,SAAS,UACf,MAAM,SAAS,UACf,MAAM,KAAK,WAAW,OAAO,GAC7B;AACA;AAAA,IACF;AACA,UAAM,OAAOC,OAAK,KAAK,KAAK,MAAM,IAAI;AACtC,UAAM,KAAKA,OAAK,KAAK,MAAM,MAAM,IAAI;AACrC,QAAI,MAAM,YAAY,EAAG,CAAAF,SAAQ,MAAM,EAAE;AAAA,QACpC,CAAAC,KAAG,aAAa,MAAM,EAAE;AAAA,EAC/B;AACF;AAEA,SAAS,mBAAmB,GAA2C;AACrE,MAAI,CAAC,KAAK,CAAC,iBAAiB,KAAK,CAAC,GAAG;AACnC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,KAAkC;AAC7D,QAAM,QAAQ,IAAI,SAAS,IAAI;AAC/B,MAAI,IAAI,SAAU,QAAO,GAAG,KAAK,SAAM,IAAI,QAAQ;AACnD,SAAO;AACT;AAEA,SAAS,iBACP,MACA,UACQ;AACR,QAAM,aAAaC,OAAK,KAAK,MAAM,SAAS;AAC5C,EAAAD,KAAG,UAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAC5C,MAAI,QAAQ;AACZ,aAAW,CAAC,QAAQ,IAAI,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACrD,IAAAA,KAAG;AAAA,MACDC,OAAK,KAAK,YAAY,GAAG,MAAM,OAAO;AAAA,MACtC,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA;AAAA,MAChC;AAAA,IACF;AACA,aAAS;AAAA,EACX;AACA,SAAO;AACT;AAEA,SAAS,UACP,MACA,OACM;AACN,QAAM,WAAWA,OAAK,KAAK,MAAM,qBAAqB;AACtD,MAAI,CAACD,KAAG,WAAW,QAAQ,EAAG;AAC9B,QAAM,OAAO,KAAK,MAAMA,KAAG,aAAa,UAAU,MAAM,CAAC;AAIzD,SAAO,OAAO,MAAM,KAAK;AACzB,EAAAA,KAAG,cAAc,UAAU,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AACzE;AAKA,eAAsB,8BACpB,IACA,eAAe,IACe;AAC9B,MAAI,OAAO;AACX,MAAI,QAAQ,aAAa,KAAK;AAC9B,QAAM,cAAqC,CAAC;AAC5C,MAAI;AACJ,MAAI,gBAAgB;AAEpB,QAAM,YAAY,MAAY;AAC5B,WAAO;AACP,gBAAY,SAAS;AACrB,YAAQ;AACR,oBAAgB;AAAA,EAClB;AAEA,QAAM,YAAY,YAA2B;AAC3C,UAAM,IAAIE,SAAQ;AAClB,UAAM,QACJ,SAAS,IACL,QACE,wCAAmC,KAAK,iBACxC,mCACF,sBAAsB,IAAI;AAChC,MAAE,MAAM,KAAK;AACb,UAAM,MAAM,MAAM,GAAG,eAAe,KAAK;AAAA,MACvC;AAAA,MACA,OAAO;AAAA,MACP,QAAQ,wBAAwB;AAAA,MAChC,GAAI,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC;AAAA,IAC9B,CAAC;AACD,MAAE,KAAK,SAAS,IAAI,qBAAqB,uBAAuB;AAChE,QAAI,OAAO,IAAI,UAAU,SAAU,SAAQ,IAAI;AAC/C,UAAM,QAAQ,IAAI,QAAQ,CAAC;AAC3B,oBAAgB,MAAM;AACtB,gBAAY,KAAK,GAAG,KAAK;AAAA,EAC3B;AAEA,aAAS;AACP,QAAI,YAAY,WAAW,GAAG;AAC5B,YAAM,UAAU;AAAA,IAClB;AAEA,QAAI,YAAY,WAAW,GAAG;AAC5B,YAAM,QAAQ,MAAMC,QAAO;AAAA,QACzB,SAAS,QACL,qCAAgC,KAAK,WACrC;AAAA,QACJ,SAAS;AAAA,UACP,EAAE,OAAO,QAAQ,OAAO,qBAAgB;AAAA,UACxC,GAAI,QACA,CAAC,EAAE,OAAO,cAAc,OAAO,0BAA0B,CAAC,IAC1D,CAAC;AAAA,QACP;AAAA,MACF,CAAC;AACD,UAAI,UAAU,cAAc;AAC1B,gBAAQ;AACR,kBAAU;AACV;AAAA,MACF;AACA,eACE,MAAMC,MAAK;AAAA,QACT,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC,GACD,KAAK;AACP,gBAAU;AACV;AAAA,IACF;AAEA,UAAM,UACJ,iBAAiB,cAChB,SAAS,QAAQ,YAAY,SAAS;AAEzC,UAAM,UAA6D;AAAA,MACjE,GAAG,YAAY,IAAI,CAAC,SAAS;AAAA,QAC3B,OAAO,IAAI;AAAA,QACX,OAAO,oBAAoB,GAAG;AAAA,QAC9B,MAAM,IAAI;AAAA,MACZ,EAAE;AAAA,MACF;AAAA,QACE,OAAO;AAAA,QACP,OAAO,GAAG,GAAG,IAAI,QAAG,CAAC;AAAA,QACrB,MAAM,QAAQ,YAAY,KAAK,KAAK;AAAA,MACtC;AAAA,IACF;AAEA,QAAI,OAAO;AACT,cAAQ,KAAK;AAAA,QACX,OAAO;AAAA,QACP,OAAO,GAAG,GAAG,IAAI,MAAG,CAAC;AAAA,QACrB,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,QAAI,SAAS;AACX,YAAM,OACJ,SAAS,OACL,GAAG,YAAY,MAAM,OAAO,KAAK,KACjC,UAAU,YAAY,MAAM;AAClC,cAAQ,KAAK;AAAA,QACX,OAAO;AAAA,QACP,OAAO,GAAG,GAAG,IAAI,QAAG,CAAC;AAAA,QACrB;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,SAAS,MAAMD,QAAO;AAAA,MAC1B,SAAS,QACL,mCAAmC,KAAK,MACxC;AAAA,MACJ;AAAA,IACF,CAAC;AAED,QAAI,WAAW,QAAQ;AACrB,eACE,MAAMC,MAAK;AAAA,QACT,SAAS;AAAA,QACT,aAAa;AAAA,QACb,cAAc;AAAA,MAChB,CAAC,GACD,KAAK;AACP,gBAAU;AACV;AAAA,IACF;AAEA,QAAI,WAAW,cAAc;AAC3B,cAAQ;AACR,gBAAU;AACV;AAAA,IACF;AAEA,QAAI,WAAW,WAAW;AACxB,cAAQ;AACR,YAAM,UAAU;AAChB,UAAI,kBAAkB,GAAG;AACvB,aAAK,mBAAmB;AACxB,gBAAQ,YAAY;AAAA,MACtB;AACA;AAAA,IACF;AAEA,UAAM,SAAS,YAAY,KAAK,CAAC,QAAQ,IAAI,OAAO,MAAM;AAC1D,QAAI,CAAC,OAAQ,MAAK,6BAA6B;AAC/C,WAAO;AAAA,EACT;AACF;AAEA,eAAe,cACb,MACA,MACA,OAA4B,CAAC,GACyB;AACtD,QAAM,QAAQH,OAAK,KAAK,cAAc,GAAG,OAAO;AAChD,QAAM,SAAS,KAAK,UAAU,sBAAsB;AAEpD,MAAI;AACJ,MAAI,QAAQ;AACV,UAAM,IAAIC,SAAQ;AAClB,MAAE,MAAM,oBAAoB,MAAM,QAAG;AACrC,QAAI;AACF,eAAS,gBAAgB,EAAE,KAAK,QAAQ,KAAK,CAAC;AAC9C,QAAE,KAAK,YAAY;AAAA,IACrB,SAAS,GAAG;AACV,QAAE,KAAK,8DAAyD;AAChE;AAAA,QACE,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AAAA,MAC3C;AACA,UAAIF,KAAG,WAAW,IAAI,GAAG;AACvB,QAAAA,KAAG,OAAO,MAAM,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MAClD;AACA,UAAI,CAACA,KAAG,WAAW,KAAK,GAAG;AACzB,aAAK,uBAAuB,KAAK,EAAE;AAAA,MACrC;AACA,eAAS,iBAAiB,EAAE,KAAK,OAAO,MAAM,SAAAD,SAAQ,CAAC;AAAA,IACzD;AAAA,EACF,OAAO;AACL,QAAI,CAACC,KAAG,WAAW,KAAK,GAAG;AACzB,WAAK,uBAAuB,KAAK,EAAE;AAAA,IACrC;AACA,aAAS,iBAAiB,EAAE,KAAK,OAAO,MAAM,SAAAD,SAAQ,CAAC;AAAA,EACzD;AAEA,YAAU,MAAM,EAAE,KAAK,CAAC;AACxB,oBAAkB,MAAM,IAAI;AAC5B,kBAAgB,IAAI;AACpB,sBAAoB,IAAI;AACxB,SAAO;AACT;AAEA,eAAe,uBACb,MACA,MACA,YACA,IACiD;AACjD,QAAM,WAAWG,SAAQ;AACzB,WAAS,MAAM,4BAAuB;AACtC,QAAM,OAAO,MAAM,GAAG,eAAe,KAAK,EAAE,IAAI,WAAW,CAAC;AAC5D,WAAS,KAAK,qBAAqB;AAEnC,QAAM,OAAO,KAAK;AAClB,MAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,EAAE,WAAW,OAAO;AAC3D,SAAK,wDAAmD;AAAA,EAC1D;AAMA,QAAM,gBAAgB,gBAAgB,IAAI;AAC1C,MAAI,KAAK,SAAS;AAChB,UAAM,UAAUA,SAAQ;AACxB,YAAQ,MAAM,mCAA8B;AAC5C,QAAI;AACF,YAAM,MAAM,MAAM,8BAA8B;AAAA,QAC9C,MAAM;AAAA,QACN,eAAe,KAAK;AAAA,QACpB,SAAS,CAAC,SAAS,GAAG,QAAQ,kBAAkB,IAAI;AAAA,MACtD,CAAC;AACD,UAAI,IAAI,QAAQ,SAAS,GAAG;AAC1B,gBAAQ;AAAA,UACN,WAAW,IAAI,QAAQ,0BAA0B,IAAI,QAAQ,MAAM;AAAA,QACrE;AACA;AAAA,UACE,wBAAwB,IAAI,QAAQ,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG,IAAI,QAAQ,SAAS,IAAI,WAAM,EAAE;AAAA,QAChG;AAAA,MACF,OAAO;AACL,gBAAQ;AAAA,UACN,IAAI,WAAW,IACX,WAAW,IAAI,QAAQ,0BACvB;AAAA,QACN;AAAA,MACF;AAAA,IACF,SAAS,GAAG;AACV,cAAQ,KAAK,qCAAqC;AAClD,WAAK,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,IACjD;AAAA,EACF,OAAO;AACL,SAAK,kEAA6D;AAAA,EACpE;AAEA,QAAM,SAASF,KAAG,YAAYC,OAAK,KAAKI,IAAG,OAAO,GAAG,aAAa,CAAC;AACnE,QAAM,WAAWJ,OAAK,KAAK,QAAQ,WAAW;AAC9C,MAAI;AACF,IAAAD,KAAG;AAAA,MACD;AAAA,MACA,GAAG,KAAK,UAAU,eAAe,MAAM,CAAC,CAAC;AAAA;AAAA,MACzC;AAAA,IACF;AACA,UAAM,EAAE,eAAe,IAAI,MAAM,WAAW;AAC5C,UAAM,aAAaE,SAAQ;AAC3B,eAAW,MAAM,gCAA2B;AAC5C,UAAM,QAAQ,eAAe;AAAA,MAC3B,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,OAAO;AAAA,IACT,CAAC;AACD,eAAW;AAAA,MACT,YAAY,MAAM,KAAK,YAAY,MAAM,UAAU,gBAAgB,MAAM,KAAK;AAAA,IAChF;AAAA,EACF,UAAE;AACA,IAAAF,KAAG,OAAO,QAAQ,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EACpD;AAEA,MAAI,cAAc;AAClB,MAAI;AAEJ,MAAI;AACF,UAAM,aAAaE,SAAQ;AAC3B,eAAW,MAAM,wBAAmB;AACpC,UAAM,UAAU,MAAM,GAAG,eAAe,YAAY,UAAU;AAC9D,eAAW,KAAK,gBAAgB;AAChC,oBAAgB,QAAQ;AACxB,QAAI,QAAQ,YAAY,OAAO,KAAK,QAAQ,QAAQ,EAAE,SAAS,GAAG;AAChE,oBAAc,iBAAiB,MAAM,QAAQ,QAAQ;AAAA,IACvD;AAAA,EACF,QAAQ;AACN,UAAM,WAAY,KAAmG;AACrH,QAAI,UAAU,UAAU;AACtB,oBAAc,iBAAiB,MAAM,SAAS,QAAQ;AACtD,sBAAgB,SAAS;AAAA,IAC3B;AAAA,EACF;AAEA,YAAU,MAAM;AAAA,IACd;AAAA,IACA,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;AAAA,IACzC,kBAAkB;AAAA,IAClB,aAAa,KAAK;AAAA,EACpB,CAAC;AAED,oBAAkB,MAAM,IAAI;AAC5B,kBAAgB,IAAI;AACpB,sBAAoB,IAAI;AACxB,gBAAc,MAAM,EAAE,WAAW,CAAC;AAElC,QAAM,aAAaD,OAAK,KAAK,MAAM,WAAW;AAC9C,MAAI,CAACD,KAAG,WAAW,UAAU,GAAG;AAC9B,IAAAA,KAAG;AAAA,MACD;AAAA,MACA;AAAA,QACE,KAAK,IAAI;AAAA,QACT;AAAA,QACA,iCAAiC,KAAK,KAAK,SAAS,UAAU;AAAA,QAC9D;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,MACX;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,KAAK,OAAO,YAAY;AAC1C;AAEA,eAAsB,gBACpB,SACA,OAMI,CAAC,GACU;AACf,EAAAM,OAAM,qBAAqB;AAC3B,MAAI;AACF,QAAI,SAAqC,KAAK,QAC1C,UACA,KAAK,OACH,WACA,KAAK,MACH,QACA,MAAMH,QAAO;AAAA,MACX,SAAS;AAAA,MACT,SAAS;AAAA,QACP;AAAA,UACE,OAAO;AAAA,UACP,OAAO;AAAA,UACP,MAAM,sBAAsB,IACxB,sCACA;AAAA,QACN;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,OAAO;AAAA,UACP,MAAM;AAAA,QACR;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,OAAO;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF,CAAC;AAET,UAAM,OACJ,WACC,MAAMC,MAAK;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,MACb,UAAU;AAAA,IACZ,CAAC;AAEH,UAAM,OAAOH,OAAK,QAAQ,QAAQ,IAAI,GAAG,IAAI;AAC7C,QAAID,KAAG,WAAW,IAAI,KAAKA,KAAG,YAAY,IAAI,EAAE,SAAS,GAAG;AAC1D,WAAK,wBAAwB,IAAI,EAAE;AAAA,IACrC;AAEA,QAAI,WAAW,WAAW,WAAW,OAAO;AAC1C,UAAI,SAAS,KAAK;AAClB,UAAI,WAAW,SAAS,CAAC,QAAQ;AAC/B,kBACE,MAAMI,MAAK;AAAA,UACT,SAAS;AAAA,UACT,aAAa;AAAA,UACb,UAAU,CAAC,MAAO,CAAC,GAAG,KAAK,IAAI,iBAAiB;AAAA,QAClD,CAAC,GACD,KAAK;AAAA,MACT;AACA,YAAM,MAAM,MAAM,cAAc,MAAM,MAAM;AAAA,QAC1C,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,MAC7B,CAAC;AACD,SAAG,WAAW,IAAI,KAAK,IAAI,MAAM,KAAK,IAAI,MAAM,GAAG;AACnD;AAAA,QACE,iBACE,OACA;AAAA,MACJ;AACA,MAAAG,OAAM,yBAAyB;AAC/B;AAAA,IACF;AAEA,UAAM,EAAE,GAAG,IAAI,aAAa,EAAE,aAAa,MAAM,CAAC;AAClD,QAAI,aAAa,KAAK;AAEtB,QAAI,CAAC,YAAY;AACf,YAAM,SAAS,MAAM,8BAA8B,IAAI,KAAK,UAAU,EAAE;AACxE,mBAAa,OAAO;AACpB,WAAK,YAAY,oBAAoB,MAAM,CAAC,EAAE;AAAA,IAChD;AAEA,UAAM,SAAS,MAAM,uBAAuB,MAAM,MAAM,YAAY,EAAE;AACtE,OAAG,WAAW,IAAI,eAAU,OAAO,KAAK,QAAG;AAC3C,QAAI,OAAO,cAAc,GAAG;AAC1B,WAAK,SAAS,OAAO,WAAW,iBAAiB;AAAA,IACnD;AACA;AAAA,MACE,iBACE,OACA;AAAA,IACJ;AACA,IAAAA,OAAM,2BAA2B;AAAA,EACnC,SAAS,GAAG;AACV,SAAK,CAAC;AAAA,EACR;AACF;;;AI1gBA,OAAOC,UAAQ;AACf,OAAOC,YAAU;AACjB,SAAS,iBAAAC,sBAAqB;;;ACoB9B,IAAMC,aAAY;AAClB,IAAMC,aAAY;AAElB,SAAS,iBAAiB,OAAyB;AACjD,QAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM;AAChD,MAAI,MAAM,QAAQ,MAAM,QAAQ,MAAM,SAAS,MAAM,MAAM;AACzD,WAAO,GAAG,MAAM,IAAI,KAAK,MAAM,IAAI;AAAA,EACrC;AACA,SAAO;AACT;AAMA,eAAsB,qBAAqB,IAA8B;AACvE,QAAM,KAAK,MAAM,GAAG,MAAM,GAAG;AAC7B,QAAM,SAAS,GAAG,MAAM;AACxB,MAAI,CAAC,QAAQ;AACX,SAAK,yDAAyD;AAAA,EAChE;AAEA,MAAI,OAAO;AACX,QAAM,cAA0B,CAAC;AACjC,MAAI;AAEJ,aAAS;AACP,UAAM,IAAIC,SAAQ;AAClB,MAAE,MAAM,SAAS,IAAI,8BAAyB,sBAAsB,IAAI,SAAI;AAC5E,UAAM,MAAM,MAAM,GAAG,OAAO,KAAK;AAAA,MAC/B;AAAA,MACA,OAAOF;AAAA,MACP;AAAA,IACF,CAAC;AACD,MAAE,KAAK,SAAS,IAAI,kBAAkB,oBAAoB;AAE1D,UAAM,QAAS,IAAI,QAAQ,CAAC;AAC5B,QAAI,OAAO,IAAI,UAAU,SAAU,SAAQ,IAAI;AAC/C,gBAAY,KAAK,GAAG,KAAK;AAEzB,QAAI,YAAY,WAAW,GAAG;AAC5B,WAAK,2BAA2B;AAAA,IAClC;AAEA,UAAM,UACJ,MAAM,UAAUA,eACf,SAAS,QAAQ,YAAY,SAAS;AAGzC,QAAI,YAAY,WAAW,KAAK,CAAC,SAAS;AACxC,aAAO,YAAY,CAAC;AAAA,IACtB;AAEA,UAAM,UAA6D;AAAA,MACjE,GAAG,YAAY,IAAI,CAAC,QAAQ;AAAA,QAC1B,OAAO,GAAG;AAAA,QACV,OAAO,iBAAiB,EAAE;AAAA,QAC1B,MAAM,GAAG;AAAA,MACX,EAAE;AAAA,IACJ;AAEA,QAAI,SAAS;AACX,YAAM,OACJ,SAAS,OACL,GAAG,YAAY,MAAM,OAAO,KAAK,KACjC,UAAU,YAAY,MAAM;AAClC,cAAQ,KAAK;AAAA,QACX,OAAOC;AAAA,QACP,OAAO,GAAG,GAAG,IAAI,QAAG,CAAC;AAAA,QACrB;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,SAAS,MAAME,QAAO;AAAA,MAC1B,SAAS;AAAA,MACT;AAAA,IACF,CAAC;AAED,QAAI,WAAWF,YAAW;AACxB,cAAQ;AACR;AAAA,IACF;AAEA,UAAM,SAAS,YAAY,KAAK,CAAC,OAAO,GAAG,OAAO,MAAM;AACxD,QAAI,CAAC,OAAQ,MAAK,0BAA0B;AAC5C,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,OACpB,UACA,MACe;AACf,EAAAG,OAAM,WAAW;AACjB,MAAI;AACF,UAAM,YAAY,cAAc,QAAQ,IAAI,CAAC;AAC7C,QAAI,CAAC,WAAW;AACd;AAAA,QACE;AAAA,MACF;AAAA,IACF;AAEA,UAAM,EAAE,GAAG,IAAI,aAAa;AAC5B,QAAI;AACJ,QAAI;AAEJ,QAAI,CAAC,UAAU;AACb,YAAM,SAAS,MAAM,qBAAqB,EAAE;AAC5C,gBAAU,OAAO;AACjB,aAAO,OAAO;AACd,UAAI,QAAQ,OAAO,MAAM;AACvB,aAAK,YAAY,iBAAiB,MAAM,CAAC,EAAE;AAAA,MAC7C;AAAA,IACF,OAAO;AACL,UAAI;AACF,cAAM,SAAS,MAAM,GAAG,OAAO,KAAK,EAAE,IAAI,UAAU,IAAI,OAAO,CAAC;AAChE,kBAAU,OAAO;AACjB,eAAO,OAAO;AAAA,MAChB,QAAQ;AACN,cAAM,OAAO,MAAM,GAAG,OAAO,KAAK,EAAE,IAAI,SAAS,CAAC;AAClD,kBAAU,KAAK;AACf,eAAO,KAAK;AAAA,MACd;AAAA,IACF;AAEA,UAAM,QAIF,EAAE,OAAO,QAAQ;AACrB,QAAI,KAAM,OAAM,OAAO;AACvB,QAAI,KAAK,OAAQ,OAAM,SAAS,KAAK;AAErC,UAAM,EAAE,OAAO,IAAI,cAAc,WAAW,KAAK;AACjD,eAAW,EAAE,gBAAgB,QAAQ,CAAC;AAEtC,OAAG,gCAA2B,QAAQ,OAAO,EAAE;AAC/C,SAAK,MAAM;AACX,IAAAC,OAAM,sCAAsC;AAAA,EAC9C,SAAS,GAAG;AACV,SAAK,CAAC;AAAA,EACR;AACF;AAEA,eAAsB,SACpB,MACA,OACkB;AAClB,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,UAAU,MAAO,QAAO;AAC5B,SAAOC,SAAQ;AAAA,IACb,SAAS,4BAA4B,IAAI;AAAA,IACzC,cAAc;AAAA,EAChB,CAAC;AACH;;;ADjJA,IAAM,oBAAoB;AAY1B,eAAsB,mBACpB,QACA,MACe;AACf,EAAAC,OAAM,wBAAwB;AAC9B,MAAI;AACF,UAAM,EAAE,IAAI,MAAAC,OAAM,IAAI,IAAI,aAAa;AACvC,UAAM,SAAS,gBAAgB,MAAM;AACrC,UAAM,OAAO,iBAAiB,MAAM;AACpC,UAAM,KAAK,cAAc,MAAM;AAE/B,UAAM,SAAS,KAAK,SAChB,WACA,KAAK,WACH,aACA;AAEN,QAAI,UAAU,0BAA0B;AAAA,MACtC,WAAW;AAAA,MACX,WAAW;AAAA,MACX,GAAI,KAAK,QAAQ,EAAE,WAAW,KAAK,MAAM,IAAI,CAAC;AAAA,IAChD,CAAC;AAED,QAAI,CAAC,SAAS;AACZ,YAAM,SAAS,MAAM,GAAG,OAAO,KAAK,EAAE,OAAO,GAAG,CAAC;AACjD,YAAM,SAAS,OAAO,QAAQ,CAAC;AAC/B,UAAI,OAAO,WAAW,EAAG,MAAK,2BAA2B;AACzD,UAAI,OAAO,WAAW,KAAK,KAAK,KAAK;AACnC,kBAAU,OAAO,CAAC,EAAG;AAAA,MACvB,OAAO;AACL,aAAK,gDAAgD;AAAA,MACvD;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM,GAAG,OAAO,KAAK,EAAE,IAAI,QAAS,CAAC;AACnD,UAAM,QACJ,KAAK,SAAS,GAAG,SAAS,KAAK,QAAQC,OAAK,SAAS,MAAM;AAE7D,SAAK,aAAa,MAAM,EAAE;AAC1B,SAAK,UAAU,MAAM,QAAQ,OAAO,KAAK,MAAM,GAAG;AAElD,UAAM,UAAUA,OAAK,KAAK,QAAQ,QAAQ,WAAW;AACrD,UAAM,IAAIC,SAAQ;AAClB,MAAE,MAAM,gBAAW;AACnB,UAAM,EAAE,cAAc,IAAI,MAAM,UAAU;AAC1C,UAAM,QAAQ,cAAc,EAAE,QAAQ,SAAS,OAAO,KAAK,CAAC;AAC5D,eAAW,KAAK,MAAM,YAAY,CAAC,GAAG;AACpC,WAAK,IAAI,EAAE,IAAI,KAAK,EAAE,OAAO,EAAE;AAAA,IACjC;AACA,MAAE,KAAK,UAAU,MAAM,eAAe,CAAC,WAAW;AAElD,UAAM,UAAU,KAAK,MAAMC,KAAG,aAAa,SAAS,MAAM,CAAC;AAI3D,UAAM,OAAO,QAAQ,MAAM;AAG3B,UAAM,gBACJ,MAAM,kBACL,OAAO,KAAK,kBAAkB,WAAW,KAAK,gBAAgB;AAEjE,UAAM,iBAAiBF,OAAK,KAAK,QAAQ,QAAQ,aAAa;AAC9D,QAAI;AACJ,QAAIE,KAAG,WAAW,cAAc,GAAG;AACjC,eAAS,KAAK,MAAMA,KAAG,aAAa,gBAAgB,MAAM,CAAC;AAAA,IAI7D,OAAO;AAEL,YAAM,EAAE,oBAAoB,IAAI,MAAM,OACpCC;AAAA,QACEH,OAAK,KAAK,QAAQ,GAAG,0CAA0C;AAAA,MACjE,EAAE;AAEJ,YAAM,EAAE,QAAQ,OAAO,IAAI,oBAAoB;AAAA,QAC7C;AAAA,QACA,YAAYE,KAAG,WAAWF,OAAK,KAAK,QAAQ,QAAQ,qBAAqB,CAAC,IACrE,KAAK;AAAA,UACJE,KAAG;AAAA,YACDF,OAAK,KAAK,QAAQ,QAAQ,qBAAqB;AAAA,YAC/C;AAAA,UACF;AAAA,QACF,IACA,EAAE,YAAY,CAAC,EAAE;AAAA,MACvB,CAAC;AACD,eAAS;AAAA,IACX;AAGA,UAAM,cAAcA,OAAK,KAAK,QAAQ,QAAQ,qBAAqB;AACnE,QAAIE,KAAG,WAAW,WAAW,KAAK,OAAO,SAAS,KAAK,MAAM;AAC3D,YAAM,SAAS,KAAK,MAAMA,KAAG,aAAa,aAAa,MAAM,CAAC;AAI9D,eAAS;AAAA,QACP,GAAG;AAAA,QACH,SAAS,OAAO,WAAW,OAAO,cAAc;AAAA,MAClD;AAAA,IACF;AAEA,QAAI,OAAO,OAAO,MAAM,MAAM,YAAY,CAAC,OAAO,MAAM,GAAG;AACzD,eAAS,EAAE,GAAG,QAAQ,MAAM,MAAM;AAAA,IACpC;AAEA,MAAE,MAAM,sCAAiC;AACzC,UAAM,eAAe,6BAA6B,MAAM;AACxD,UAAM,cAAc,oBAAI,IAAoB;AAC5C,UAAM,mBAAmB,oBAAI,IAAoB;AAEjD,UAAM,eAAe,MAAM,GAAG,mBAAmB,KAAK;AAAA,MACpD;AAAA,MACA,OAAO;AAAA,IACT,CAAC;AACD,UAAM,mBAAmB,oBAAI,IAG3B;AACF,eAAW,OAAO,aAAa,QAAQ,CAAC,GAAG;AACzC,YAAM,OAAO,IAAI,QAAQ,CAAC,GAAG;AAAA,QAAK,CAAC,MACjC,OAAO,CAAC,EAAE,WAAW,iBAAiB;AAAA,MACxC;AACA,UAAI,KAAK;AACP,yBAAiB;AAAA,UACf,OAAO,GAAG,EAAE,MAAM,kBAAkB,MAAM;AAAA,UAC1C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,eAAW,QAAQ,cAAc;AAC/B,YAAM,OAAO;AAAA,QACX,GAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,CAAC,IAC9B,KAAK,KAAK,MAAM,IACjB,CAAC;AAAA,QACL,GAAG,iBAAiB,GAAG,KAAK,SAAS;AAAA,QACrC,cAAc,KAAK,IAAI;AAAA,MACzB;AACA,YAAM,UAAU;AAAA,QACd;AAAA,QACA,OAAQ,KAAK,KAAK,OAAO,KAAgB,KAAK;AAAA,QAC9C,UAAW,KAAK,KAAK,UAAU,KAAuB;AAAA,QACtD,UAAW,KAAK,KAAK,UAAU,KAAgB,KAAK;AAAA,QACpD;AAAA,QACA,UAAW,KAAK,KAAK,UAAU,KAAuB;AAAA,QACtD,MAAM,KAAK;AAAA,QACX,aAAc,KAAK,KAAK,aAAa,KAAiC,CAAC;AAAA,QACvE,aAAc,KAAK,KAAK,aAAa,KAAwC;AAAA,QAC7E,cACG,KAAK,KAAK,OAAO,KACjB,KAAK,KAAK,cAAc,KACzB,CAAC;AAAA,QACH,cAAe,KAAK,KAAK,cAAc,KAAwC;AAAA,QAC/E,aAAc,KAAK,KAAK,aAAa,KAAwC;AAAA,QAC7E;AAAA,QACA,OAAO;AAAA,MACT;AAEA,YAAM,WAAW,iBAAiB,IAAI,KAAK,SAAS;AACpD,UAAI;AACJ,UAAI,UAAU;AACZ,cAAM,MAAM,GAAG,mBAAmB,OAAO;AAAA,UACvC,IAAI,SAAS;AAAA,UACb,MAAM;AAAA,YACJ,OAAO,QAAQ;AAAA,YACf,UAAU,QAAQ;AAAA,YAClB,UAAU,QAAQ;AAAA,YAClB,MAAM,QAAQ;AAAA,YACd,UAAU,QAAQ;AAAA,YAClB,MAAM,QAAQ;AAAA,YACd,aAAa,QAAQ;AAAA,YACrB,aAAa,QAAQ;AAAA,YACrB,cAAc,QAAQ;AAAA,YACtB,cAAc,QAAQ;AAAA,YACtB,aAAa,QAAQ;AAAA,YACrB,QAAQ,QAAQ;AAAA,UAClB;AAAA,QACF,CAAC;AAAA,MACH,OAAO;AACL,cAAM,MAAM,GAAG,mBAAmB,OAAO,OAAgB;AAAA,MAC3D;AACA,kBAAY,IAAI,KAAK,KAAK,KAAK,GAAG,IAAI,EAAE;AACxC,uBAAiB,IAAI,KAAK,WAAW,IAAI,EAAE;AAAA,IAC7C;AACA,MAAE,KAAK,GAAG,aAAa,MAAM,aAAa;AAE1C,QAAI,OAAO,wBAAwB,SAAS,WAAW;AAIvD,WAAO,cAAc,IAAI;AAEzB,QAAI,MAAM,QAAQ,OAAO,SAAS,CAAC,GAAG;AACpC,aAAO,SAAS,IAAK,OAAO,SAAS,EAAgC;AAAA,QACnE,CAAC,UAAU;AACT,gBAAM,MAAO,MAAM,WAAW,KAAK,MAAM,IAAI;AAC7C,cAAI,OAAO,iBAAiB,IAAI,GAAG,GAAG;AACpC,mBAAO,EAAE,GAAG,OAAO,OAAO,iBAAiB,IAAI,GAAG,EAAE;AAAA,UACtD;AACA,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,MAAE,MAAM,kCAA6B;AACrC,QAAI,aACF,GAAG,cAAc,IAAI,2BAA2B;AAClD,QAAI,cAAsD;AAE1D,QAAI,YAAY;AACd,UAAI;AACF,sBAAc,MAAM,GAAG,eAAe,KAAK,EAAE,IAAI,WAAW,CAAC;AAC7D,YAAI,eAAe,YAAY,YAAY,SAAS;AAClD,wBAAc;AACd,uBAAa;AAAA,QACf;AAAA,MACF,QAAQ;AACN,sBAAc;AACd,qBAAa;AAAA,MACf;AAAA,IACF;AAEA,QAAI,CAAC,aAAa;AAChB,YAAM,SAAS,MAAM,GAAG,eAAe,KAAK;AAAA,QAC1C;AAAA,QACA,OAAO;AAAA,QACP,GAAG;AAAA,MACL,CAAC;AACD,qBACG,OAAO,QAAQ,CAAC,GAAG;AAAA,QAClB,CAAC,MACC,EAAE,YAAY,WAAW,EAAE,UAAU;AAAA,MACzC,KAAK;AACP,mBAAa,aAAa;AAAA,IAC5B;AAEA,QAAI,aAAa;AACf,oBAAc,MAAM,GAAG,eAAe,OAAO;AAAA,QAC3C,IAAI,YAAY;AAAA,QAChB,MAAM,EAAE,OAAO,QAAQ,MAAM,OAAwB;AAAA,MACvD,CAAC;AACD,QAAE,KAAK,WAAW,YAAY,EAAE,EAAE;AAAA,IACpC,OAAO;AACL,oBAAc,MAAM,GAAG,eAAe,OAAO;AAAA,QAC3C;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO;AAAA,MACT,CAAU;AACV,QAAE,KAAK,WAAW,YAAY,EAAE,EAAE;AAAA,IACpC;AAEA,iBAAa,YAAY;AACzB,eAAW;AAAA,MACT,gBAAgB;AAAA,MAChB,yBAAyB;AAAA,IAC3B,CAAC;AACD,kBAAc,QAAQ;AAAA,MACpB,OAAO;AAAA,MACP,MAAM,MAAM;AAAA,MACZ;AAAA,MACA;AAAA,IACF,CAAC;AAED,UAAM,UAAU,gBAAgBF,OAAK,KAAK,QAAQ,MAAM,GAAG,aAAa;AACxE,QAAI,QAAQ,QAAQ;AAClB,QAAE,MAAM,aAAa,QAAQ,MAAM,gBAAW;AAC9C,UAAI,OAAO,GAAG,eAAe,mBAAmB,YAAY;AAC1D,cAAM,GAAG,eAAe,eAAe,YAAY,OAAO;AAAA,MAC5D,OAAO;AACL,cAAMD,MAAK,IAAI,oBAAoB,UAAU,YAAY,EAAE,QAAQ,CAAC;AAAA,MACtE;AACA,QAAE,KAAK,YAAY,QAAQ,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,IAC9D;AAEA,UAAM,cACJ,KAAK,OAAO,KAAK,UAAU,QACvB,OACA,MAAM,SAAS,MAAM,QAAQ,SAAU,KAAK,KAAK;AAEvD,QAAI,aAAa;AACf,QAAE,MAAM,2BAAsB;AAC9B,YAAM,GAAG,eAAe,QAAQ;AAAA,QAC9B,QAAQ;AAAA,QACR;AAAA,MACF,CAAC;AACD,QAAE,KAAK,WAAW;AAClB,YAAM,UAAU,WAAW,MAAM,IAAI;AACrC,SAAG,WAAW,GAAG,KAAK,OAAO,CAAC,EAAE;AAChC,MAAAK,OAAM,OAAO;AAAA,IACf,OAAO;AACL,SAAG,eAAe,UAAU,EAAE;AAC9B,MAAAA,OAAM,yCAAyC;AAAA,IACjD;AAAA,EACF,SAAS,GAAG;AACV,SAAK,CAAC;AAAA,EACR;AACF;;;AExVA,OAAOC,YAAU;AASjB,eAAsB,iBACpB,QACA,OAA8B,CAAC,GAChB;AACf,EAAAC,OAAM,sBAAsB;AAC5B,MAAI;AACF,UAAM,SAAS,gBAAgB,MAAM;AACrC,UAAM,IAAIC,SAAQ;AAClB,MAAE;AAAA,MACA,KAAK,UACD,oDACA;AAAA,IACN;AAEA,UAAM,EAAE,WAAW,IAAI,MAAM,UAAU;AACvC,UAAM,SAAS,MAAM,WAAW;AAAA,MAC9B;AAAA,MACA,OAAO,CAAC,KAAK;AAAA,IACf,CAAC;AAED,MAAE;AAAA,MACA,UAAU,OAAO,KAAK,oBAAoB,OAAO,UAAU,IAAI,KAAK,GAAG;AAAA,IACzE;AAEA,eAAW,KAAK,OAAO,QAAQ;AAC7B,YAAM,QACJ,EAAE,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,KAAK,OAAO;AAC1D,WAAK,UAAK,KAAK,EAAE;AACjB,cAAQ,MAAM,GAAG,IAAI,KAAK,EAAE,MAAM,OAAO,EAAE,CAAC;AAAA,IAC9C;AAEA,QAAI,OAAO,OAAO,QAAQ;AACxB;AAAA,QACE,IAAI;AAAA,UACF,uBAAkB,OAAO,OAAO,MAAM,IAAI,OAAO,KAAK;AAAA,QACxD;AAAA,MACF;AACA;AAAA,IACF;AAEA;AAAA,MACE,OAAO,OAAO,MAAM,oBAAoB,OAAO,WAAW,IAAI,KAAK,GAAG;AAAA,IACxE;AACA,IAAAC,OAAMC,OAAK,SAAS,QAAQ,IAAI,GAAG,MAAM,KAAK,MAAM;AAAA,EACtD,SAAS,GAAG;AACV,SAAK,CAAC;AAAA,EACR;AACF;;;ACxDA,OAAOC,YAAU;AAKjB,eAAsB,sBACpB,QACA,OAAwC,CAAC,GAC1B;AACf,EAAAC,OAAM,4BAA4B;AAClC,MAAI;AACF,QAAI,CAAC,QAAQ,KAAK,GAAG;AACnB,WAAK,4CAA4C;AAAA,IACnD;AACA,UAAM,YAAY,gBAAgB,KAAK,GAAG;AAC1C,QAAI,CAAC,KAAK,KAAK;AACb,YAAM,KAAK,MAAMC,SAAQ;AAAA,QACvB,SAAS,gBAAgB,MAAM;AAAA,QAC/B,cAAc;AAAA,MAChB,CAAC;AACD,UAAI,CAAC,IAAI;AACP,QAAAC,OAAM,WAAW;AACjB;AAAA,MACF;AAAA,IACF;AACA,UAAM,EAAE,QAAQ,IAAI,YAAY,IAAI,WAAW,WAAW,MAAO;AACjE,OAAG,WAAWC,OAAK,SAAS,WAAW,WAAW,CAAC,EAAE;AACrD,IAAAD,OAAM,SAAS,EAAE,WAAW;AAAA,EAC9B,SAAS,KAAK;AACZ,SAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,EACvD;AACF;AAEA,eAAsB,2BACpB,QACA,aACA,OAA0D,CAAC,GAC5C;AACf,EAAAF,OAAM,iCAAiC;AACvC,MAAI;AACF,QAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,aAAa,KAAK,GAAG;AAC3C,WAAK,+DAA+D;AAAA,IACtE;AACA,UAAM,YAAY,gBAAgB,KAAK,GAAG;AAC1C,QAAI,CAAC,KAAK,KAAK;AACb,YAAM,KAAK,MAAMC,SAAQ;AAAA,QACvB,SAAS,oBAAoB,MAAM,IAAI,WAAW;AAAA,QAClD,cAAc;AAAA,MAChB,CAAC;AACD,UAAI,CAAC,IAAI;AACP,QAAAC,OAAM,WAAW;AACjB;AAAA,MACF;AAAA,IACF;AACA,UAAM,EAAE,YAAY,IAAI,gBAAgB,WAAW,QAAS,aAAc;AAAA,MACxE,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,IAClD,CAAC;AACD,OAAG,WAAWC,OAAK,SAAS,WAAW,WAAW,CAAC,EAAE;AACrD,IAAAD,OAAM,MAAM;AAAA,EACd,SAAS,KAAK;AACZ,SAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,EACvD;AACF;;;AC9DA,SAAS,SAAAE,cAAa;AACtB,OAAOC,YAAU;AAKjB,eAAsB,iBAAiB,QAAgC;AACrE,EAAAC,OAAM,sBAAsB;AAC5B,MAAI;AACF,UAAM,SAAS,gBAAgB,MAAM;AACrC,UAAM,UAAUC,OAAK,KAAK,QAAQ,QAAQ,WAAW;AAErD,UAAM,IAAIC,SAAQ;AAClB,MAAE,MAAM,qBAAgB;AACxB,UAAM,EAAE,cAAc,IAAI,MAAM,UAAU;AAC1C,kBAAc,EAAE,QAAQ,SAAS,OAAO,KAAK,CAAC;AAC9C,MAAE,KAAK,YAAY,MAAM,EAAE;AAE3B,SAAK,iBAAY,OAAO,EAAE;AAC1B,SAAK,gBAAgB;AAErB,UAAM,QAAQC;AAAA,MACZ,QAAQ;AAAA,MACR,CAAC,OAAO,GAAG,SAAS,QAAQ,MAAM,OAAO;AAAA,MACzC,EAAE,OAAO,UAAU;AAAA,IACrB;AAEA,UAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,YAAM,GAAG,QAAQ,CAAC,SAAS;AACzB,YAAI,QAAQ,SAAS,EAAG,QAAO,IAAI,MAAM,gBAAgB,IAAI,EAAE,CAAC;AAAA,YAC3D,SAAQ;AAAA,MACf,CAAC;AAAA,IACH,CAAC;AAED,IAAAC,OAAM,SAAS;AAAA,EACjB,SAAS,GAAG;AACV,SAAK,CAAC;AAAA,EACR;AACF;;;AvBbO,SAAS,gBAAyB;AACvC,QAAM,UAAU,IAAI,QAAQ;AAE5B,UACG,KAAK,OAAO,EACZ,YAAY,kEAA6D,EACzE,QAAQ,OAAO,EACf,KAAK,aAAa,CAAC,gBAAgB;AAElC,QAAI,YAAY,KAAK,WAAW,EAAG;AACnC,WAAO;AAAA,EACT,CAAC;AAEH,UACG,QAAQ,QAAQ,EAChB,YAAY,gDAAgD,EAC5D,OAAO,uBAAuB,+BAA+B,EAC7D;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,mBAAmB,cAAc,EACxC,OAAO,OAAO,SAAS;AACtB,UAAM,UAAU;AAAA,MACd,OAAO,KAAK;AAAA,MACZ,QAAQ,KAAK;AAAA,MACb,cAAc,KAAK;AAAA,IACrB,CAAC;AAAA,EACH,CAAC;AAEH,UACG,QAAQ,QAAQ,EAChB,YAAY,yBAAyB,EACrC,OAAO,YAAY;AAClB,UAAM,UAAU;AAAA,EAClB,CAAC;AAEH,UACG,QAAQ,SAAS,EACjB,YAAY,mBAAmB,EAC/B,OAAO,MAAM;AACZ,eAAW;AAAA,EACb,CAAC;AAEH,QAAM,SAAS,QACZ,QAAQ,QAAQ,EAChB,YAAY,0CAA0C;AAEzD,SACG,QAAQ,QAAQ,EAAE,WAAW,KAAK,CAAC,EACnC,YAAY,yBAAyB,EACrC,OAAO,MAAM;AACZ,kBAAc;AAAA,EAChB,CAAC;AAEH,SACG,QAAQ,KAAK,EACb,YAAY,kBAAkB,EAC9B,SAAS,SAAS,6DAAwD,EAC1E,SAAS,WAAW,OAAO,EAC3B,OAAO,CAAC,KAAa,UAAkB;AACtC,iBAAa,KAAK,KAAK;AAAA,EACzB,CAAC;AAEH,UACG,QAAQ,KAAK,EACb;AAAA,IACC;AAAA,EACF,EACC,SAAS,WAAW,uDAAkD,EACtE,OAAO,mBAAmB,gCAAgC,EAC1D,OAAO,OAAO,OAAO,SAAS;AAC7B,UAAM,OAAO,OAAO,IAAI;AAAA,EAC1B,CAAC;AAGH,UACG,QAAQ,SAAS,EACjB,YAAY,8DAA8D,EAC1E,SAAS,SAAS,oBAAoB,EACtC,OAAO,YAAY,iCAAiC,EACpD,OAAO,cAAc,iBAAiB,EACtC,OAAO,gBAAgB,gBAAgB,EACvC,OAAO,mBAAmB,mBAAmB,EAC7C,OAAO,SAAS,cAAc,EAC9B,OAAO,WAAW,wBAAwB,EAC1C,OAAO,cAAc,gBAAgB,EACrC,OAAO,OAAO,KAAK,SAAS;AAC3B,UAAM,mBAAmB,KAAK,IAAI;AAAA,EACpC,CAAC;AAEH,QAAM,WAAW,QACd,QAAQ,UAAU,EAClB;AAAA,IACC;AAAA,EACF;AAEF,WACG,QAAQ,MAAM,EACd;AAAA,IACC;AAAA,EACF,EACC,SAAS,UAAU,aAAa,EAChC,OAAO,WAAW,sCAAsC,EACxD,OAAO,uBAAuB,+BAA+B,EAC7D,OAAO,eAAe,kDAAkD,EACxE,OAAO,wBAAwB,6BAA6B,EAC5D,OAAO,OAAO,MAAM,SAAS;AAC5B,UAAM,gBAAgB,MAAM;AAAA,MAC1B,OAAO,KAAK;AAAA,MACZ,MAAM,KAAK;AAAA,MACX,QAAQ,KAAK;AAAA,MACb,KAAK,KAAK;AAAA,IACZ,CAAC;AAAA,EACH,CAAC;AAEH,QAAM,cAAc,SACjB,QAAQ,KAAK,EACb,YAAY,iDAAiD;AAEhE,cACG,QAAQ,MAAM,EACd,YAAY,gEAAgE,EAC5E,SAAS,YAAY,0CAA0C,EAC/D,OAAO,gBAAgB,oBAAoB,EAC3C,OAAO,OAAO,QAAQ,SAAS;AAC9B,UAAM,mBAAmB,QAAQ,EAAE,KAAK,KAAK,IAAI,CAAC;AAAA,EACpD,CAAC;AAEH,cACG,QAAQ,WAAW,EACnB;AAAA,IACC;AAAA,EACF,EACC,SAAS,YAAY,SAAS,EAC9B,SAAS,iBAAiB,+BAA+B,EACzD,OAAO,mBAAmB,wCAAwC,EAClE;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,gBAAgB,oBAAoB,EAC3C,OAAO,OAAO,QAAQ,aAAa,SAAS;AAC3C,UAAM,wBAAwB,QAAQ,aAAa;AAAA,MACjD,KAAK,KAAK;AAAA,MACV,OAAO,KAAK;AAAA,MACZ,SAAS,KAAK;AAAA,IAChB,CAAC;AAAA,EACH,CAAC;AAEH,QAAM,iBAAiB,SACpB,QAAQ,QAAQ,EAChB,YAAY,sDAAsD;AAErE,iBACG,QAAQ,MAAM,EACd,YAAY,6DAA6D,EACzE,SAAS,YAAY,SAAS,EAC9B,OAAO,aAAa,mBAAmB,EACvC,OAAO,gBAAgB,oBAAoB,EAC3C,OAAO,OAAO,QAAQ,SAAS;AAC9B,UAAM,sBAAsB,QAAQ,EAAE,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,CAAC;AAAA,EACtE,CAAC;AAEH,iBACG,QAAQ,WAAW,EACnB,YAAY,6CAA6C,EACzD,SAAS,YAAY,SAAS,EAC9B,SAAS,iBAAiB,cAAc,EACxC,OAAO,kBAAkB,+CAA+C,EACxE,OAAO,aAAa,mBAAmB,EACvC,OAAO,gBAAgB,oBAAoB,EAC3C,OAAO,OAAO,QAAQ,aAAa,SAAS;AAC3C,UAAM,2BAA2B,QAAQ,aAAa;AAAA,MACpD,KAAK,KAAK;AAAA,MACV,SAAS,KAAK;AAAA,MACd,KAAK,KAAK;AAAA,IACZ,CAAC;AAAA,EACH,CAAC;AAEH,WACG,QAAQ,OAAO,EACf,YAAY,wCAAmC,EAC/C,SAAS,SAAS,oBAAoB,EACtC,OAAO,OAAO,QAAQ;AACrB,UAAM,iBAAiB,GAAG;AAAA,EAC5B,CAAC;AAEH,WACG,QAAQ,OAAO,EACf,YAAY,wCAAwC,EACpD,SAAS,SAAS,oBAAoB,EACtC,OAAO,OAAO,QAAQ;AACrB,UAAM,iBAAiB,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACjD,CAAC;AAEH,WACG,QAAQ,OAAO,EACf;AAAA,IACC;AAAA,EACF,EACC,SAAS,SAAS,oBAAoB,EACtC,OAAO,cAAc,kCAAkC,EACvD,OAAO,OAAO,KAAK,SAAS;AAC3B,UAAM,iBAAiB,KAAK,EAAE,SAAS,QAAQ,KAAK,OAAO,EAAE,CAAC;AAAA,EAChE,CAAC;AAEH,WACG,QAAQ,OAAO,EACf,YAAY,yBAAyB,EACrC,SAAS,SAAS,oBAAoB,EACtC,OAAO,OAAO,QAAQ;AACrB,UAAM,iBAAiB,GAAG;AAAA,EAC5B,CAAC;AAEH,WACG,QAAQ,KAAK,EACb;AAAA,IACC;AAAA,EACF,EACC,SAAS,SAAS,oBAAoB,EACtC,OAAO,qBAAqB,qCAAqC,EACjE,OAAO,uBAAuB,2CAA2C,EACzE;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,OAAO,KAAK,SAAS;AAC3B,UAAM,eAAe,KAAK,IAAI;AAAA,EAChC,CAAC;AAEH,WACG,QAAQ,SAAS,EACjB,YAAY,iEAAiE,EAC7E,SAAS,SAAS,oBAAoB,EACtC,OAAO,YAAY,iCAAiC,EACpD,OAAO,cAAc,iBAAiB,EACtC,OAAO,gBAAgB,gBAAgB,EACvC,OAAO,mBAAmB,mBAAmB,EAC7C,OAAO,SAAS,cAAc,EAC9B,OAAO,WAAW,wBAAwB,EAC1C,OAAO,cAAc,gBAAgB,EACrC,OAAO,OAAO,KAAK,SAAS;AAC3B,UAAM,mBAAmB,KAAK,IAAI;AAAA,EACpC,CAAC;AAGH,QAAM,QAAQ,QACX,QAAQ,OAAO,EACf,YAAY,wDAAmD;AAElE,QACG,QAAQ,OAAO,EACf,YAAY,6BAA6B,EACzC,OAAO,MAAM;AACZ,YAAQ,IAAI,GAAG,IAAI,oDAAoD,CAAC;AAAA,EAC1E,CAAC;AAEH,QACG,QAAQ,KAAK,EACb,YAAY,oCAAoC,EAChD,OAAO,MAAM;AACZ,YAAQ,IAAI,GAAG,IAAI,sBAAsB,CAAC;AAAA,EAC5C,CAAC;AAEH,QACG,QAAQ,KAAK,EACb,YAAY,2BAA2B,EACvC,OAAO,MAAM;AACZ,YAAQ,IAAI,GAAG,IAAI,sBAAsB,CAAC;AAAA,EAC5C,CAAC;AAEH,SAAO;AACT;AAEA,eAAsB,OAAO,OAAO,QAAQ,MAAqB;AAC/D,QAAM,UAAU,cAAc;AAC9B,QAAM,QAAQ,WAAW,IAAI;AAC/B;","names":["http","axios","FeeeF","axios","FeeeF","intro","outro","note","cancel","text","password","confirm","select","spinner","intro","s","spinner","note","outro","text","password","path","fs","path","fs","path","path","fs","p","intro","outro","path","path","fs","path","intro","path","spinner","outro","fs","path","fs","path","fs","path","http","http","path","spinner","fs","note","outro","intro","fs","os","path","fs","path","path","fs","path","fs","fs","path","fs","path","fs","path","copyDir","fs","path","spinner","select","text","os","intro","outro","fs","path","pathToFileURL","PAGE_SIZE","LOAD_MORE","spinner","select","intro","outro","confirm","intro","http","path","spinner","fs","pathToFileURL","outro","path","intro","spinner","outro","path","path","intro","confirm","outro","path","spawn","path","intro","path","spinner","spawn","outro"]}