@chainstream-io/cli 0.0.10 → 0.0.11
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 +21 -0
- package/dist/index.js.map +1 -1
- package/package.json +5 -1
package/dist/index.js
CHANGED
|
@@ -1396,6 +1396,27 @@ function registerAuthCommands(program2) {
|
|
|
1396
1396
|
exitOnError(err);
|
|
1397
1397
|
}
|
|
1398
1398
|
});
|
|
1399
|
+
program2.command("bind-email-verify").description("Complete email binding (second step, non-interactive)").requiredOption("--otp-id <id>", "OTP ID from bind-email step").requiredOption("--code <code>", "Verification code from email").requiredOption("--email <email>", "Email being bound").action(async (opts) => {
|
|
1400
|
+
try {
|
|
1401
|
+
const config = loadConfig();
|
|
1402
|
+
if (!config.turnkey?.organizationId) {
|
|
1403
|
+
throw new Error("No wallet found. Run 'chainstream login' first.");
|
|
1404
|
+
}
|
|
1405
|
+
process.stderr.write("Verifying...\n");
|
|
1406
|
+
const { verificationToken } = await callOtpVerify(
|
|
1407
|
+
opts.otpId,
|
|
1408
|
+
opts.code.trim(),
|
|
1409
|
+
config.turnkey.publicKeyHex
|
|
1410
|
+
);
|
|
1411
|
+
process.stderr.write("Binding email to wallet...\n");
|
|
1412
|
+
await updateTurnkeyUserEmail(opts.email, verificationToken, config.turnkey);
|
|
1413
|
+
process.stdout.write(`Email ${opts.email} bound successfully.
|
|
1414
|
+
`);
|
|
1415
|
+
process.stdout.write("You can now use 'chainstream login --email' with this email.\n");
|
|
1416
|
+
} catch (err) {
|
|
1417
|
+
exitOnError(err);
|
|
1418
|
+
}
|
|
1419
|
+
});
|
|
1399
1420
|
}
|
|
1400
1421
|
function signTimestamp(timestampMs, privateKeyDerBase64) {
|
|
1401
1422
|
const signer = createSign2("SHA256");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/constants.ts","../src/lib/config.ts","../src/wallet/types.ts","../src/wallet/raw-wallet.ts","../src/lib/turnkey.ts","../src/wallet/turnkey-wallet.ts","../src/wallet/index.ts","../src/lib/x402.ts","../src/index.ts","../src/lib/client.ts","../src/lib/validate.ts","../src/lib/output.ts","../src/commands/token.ts","../src/commands/market.ts","../src/commands/wallet.ts","../src/commands/kyt.ts","../src/commands/dex.ts","../src/commands/job.ts","../src/commands/auth.ts","../src/lib/keystore.ts","../src/commands/config-cmd.ts"],"sourcesContent":["/**\n * Public constants for the ChainStream CLI.\n *\n * All values can be overridden via environment variables for local development.\n * Production defaults are used when no env var is set.\n */\n\n/** ChainStream API base URL. */\nexport const CHAINSTREAM_API_URL =\n process.env.CHAINSTREAM_API_URL ?? \"https://api.chainstream.io\";\n\n/** ChainStream Auth Service base URL (same domain as API, routed via APISIX). */\nexport const CHAINSTREAM_AUTH_URL =\n process.env.CHAINSTREAM_AUTH_URL ?? \"https://api.chainstream.io\";\n\n/** Solana RPC endpoint. */\nexport const SOLANA_RPC_URL =\n process.env.SOLANA_RPC_URL ?? \"https://api.mainnet-beta.solana.com\";\n\n/** Base (EVM) RPC endpoint. */\nexport const BASE_RPC_URL =\n process.env.BASE_RPC_URL ?? \"https://mainnet.base.org\";\n\n/** Base chain ID (8453 = mainnet). */\nexport const BASE_CHAIN_ID = Number(process.env.BASE_CHAIN_ID ?? \"8453\");\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport { CHAINSTREAM_API_URL } from \"./constants.js\";\n\nconst CONFIG_DIR = join(homedir(), \".config\", \"chainstream\");\nconst CONFIG_FILE = join(CONFIG_DIR, \"config.json\");\n\n/** Payment chain: the specific L1/L2 for x402 USDC payment and SIWX auth. */\nexport type PaymentChain = \"base\" | \"sol\";\n\nexport function isEvmChain(chain: PaymentChain): boolean { return chain === \"base\"; }\nexport function isSolanaChain(chain: PaymentChain): boolean { return chain === \"sol\"; }\n\nexport interface TurnkeyCredentials {\n publicKeyHex: string;\n uncompressedPublicKeyHex?: string;\n privateKeyDer: string;\n organizationId: string;\n sessionToken: string;\n sessionExpiry: number;\n evmAddress?: string;\n solanaAddress?: string;\n}\n\nexport interface RawWalletConfig {\n key: string;\n chain: PaymentChain;\n}\n\nexport interface Config {\n apiKey?: string;\n baseUrl: string;\n authUrl?: string;\n /** Preferred chain for Turnkey SIWX auth + x402 payment */\n walletChain?: PaymentChain;\n /** x402 plan preference (e.g., \"nano\", \"starter\"). If unset, TTY prompts; non-TTY uses server default. */\n plan?: string;\n turnkey?: TurnkeyCredentials;\n rawWallet?: RawWalletConfig;\n}\n\nexport type WalletMode = \"turnkey\" | \"raw\" | undefined;\n\nexport function getConfigDir(): string {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true });\n }\n return CONFIG_DIR;\n}\n\nexport function loadConfig(): Config {\n const defaults: Config = {\n baseUrl: CHAINSTREAM_API_URL,\n };\n\n if (!existsSync(CONFIG_FILE)) return defaults;\n\n try {\n const raw = readFileSync(CONFIG_FILE, \"utf-8\");\n const parsed = JSON.parse(raw) as Partial<Config>;\n return { ...defaults, ...parsed };\n } catch {\n return defaults;\n }\n}\n\nexport function saveConfig(config: Config): void {\n getConfigDir();\n writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport function updateConfig(patch: Partial<Config>): void {\n const current = loadConfig();\n saveConfig({ ...current, ...patch });\n}\n\nexport function getWalletMode(config: Config): WalletMode {\n if (config.turnkey?.organizationId) return \"turnkey\";\n if (config.rawWallet?.key) return \"raw\";\n return undefined;\n}\n","import type { PaymentChain } from \"../lib/config.js\";\n\n/**\n * Wallet interface extending SDK's WalletSigner with transaction signing.\n *\n * `chain` returns SDK-compatible name (\"evm\"/\"solana\") for SIWX auth.\n * `paymentChain` returns our specific chain (\"base\"/\"sol\") for x402/config.\n */\nexport interface Wallet {\n /** SDK-compatible chain name for SIWX: \"evm\" or \"solana\" */\n chain: \"evm\" | \"solana\";\n /** Specific payment chain: \"base\", \"sol\", etc. */\n paymentChain: PaymentChain;\n address: string;\n signMessage(message: string): Promise<string>;\n signTransaction(serializedTx: string): Promise<string>;\n}\n\n/** Map PaymentChain to SDK-compatible chain name */\nexport function toSdkChain(chain: PaymentChain): \"evm\" | \"solana\" {\n return chain === \"sol\" ? \"solana\" : \"evm\";\n}\n","import { privateKeyToAccount } from \"viem/accounts\";\nimport type { Hex } from \"viem\";\nimport { Keypair, VersionedTransaction } from \"@solana/web3.js\";\nimport { sign as ed25519Sign } from \"node:crypto\";\nimport type { Wallet } from \"./types.js\";\nimport { toSdkChain } from \"./types.js\";\nimport { type PaymentChain, isEvmChain } from \"../lib/config.js\";\n\nfunction bs58Decode(str: string): Uint8Array {\n const ALPHABET = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\n const BASE = 58;\n const result: number[] = [0];\n for (const char of str) {\n let carry = ALPHABET.indexOf(char);\n if (carry < 0) throw new Error(`Invalid base58 character: ${char}`);\n for (let j = 0; j < result.length; j++) {\n carry += result[j] * BASE;\n result[j] = carry & 0xff;\n carry >>= 8;\n }\n while (carry > 0) {\n result.push(carry & 0xff);\n carry >>= 8;\n }\n }\n for (const char of str) {\n if (char !== \"1\") break;\n result.push(0);\n }\n return new Uint8Array(result.reverse());\n}\n\nexport class RawKeyWallet implements Wallet {\n chain: \"evm\" | \"solana\";\n paymentChain: PaymentChain;\n address: string;\n private privateKey: string;\n\n constructor(key: string, chain: PaymentChain) {\n this.paymentChain = chain;\n this.chain = toSdkChain(chain);\n this.privateKey = key;\n\n if (isEvmChain(this.paymentChain)) {\n const hex = (key.startsWith(\"0x\") ? key : `0x${key}`) as Hex;\n const account = privateKeyToAccount(hex);\n this.address = account.address;\n } else {\n const decoded = bs58Decode(key);\n const keypair = Keypair.fromSecretKey(decoded);\n this.address = keypair.publicKey.toBase58();\n }\n }\n\n async signMessage(message: string): Promise<string> {\n if (isEvmChain(this.paymentChain)) {\n const hex = (this.privateKey.startsWith(\"0x\") ? this.privateKey : `0x${this.privateKey}`) as Hex;\n const account = privateKeyToAccount(hex);\n return account.signMessage({ message });\n }\n\n const decoded = bs58Decode(this.privateKey);\n const secretKeyRaw = decoded.slice(0, 32);\n const pkcs8Prefix = Buffer.from(\"302e020100300506032b657004220420\", \"hex\");\n const pkcs8Der = Buffer.concat([pkcs8Prefix, Buffer.from(secretKeyRaw)]);\n const msgBytes = Buffer.from(message, \"utf-8\");\n const sig = ed25519Sign(null, msgBytes, { key: pkcs8Der, format: \"der\", type: \"pkcs8\" });\n return sig.toString(\"hex\");\n }\n\n async signTransaction(serializedTx: string): Promise<string> {\n const txBytes = Buffer.from(serializedTx, \"base64\");\n\n if (!isEvmChain(this.paymentChain)) {\n const tx = VersionedTransaction.deserialize(new Uint8Array(txBytes));\n const decoded = bs58Decode(this.privateKey);\n const keypair = Keypair.fromSecretKey(decoded);\n tx.sign([keypair]);\n return Buffer.from(tx.serialize()).toString(\"base64\");\n }\n\n const hex = (this.privateKey.startsWith(\"0x\") ? this.privateKey : `0x${this.privateKey}`) as Hex;\n const account = privateKeyToAccount(hex);\n const signedHex = await account.signTransaction({ type: \"legacy\" } as never);\n return Buffer.from(signedHex.slice(2), \"hex\").toString(\"base64\");\n }\n}\n","/**\n * Turnkey Coordinator API client.\n *\n * Handles P-256 key generation, API stamping, session refresh,\n * email binding, and wallet discovery via the Turnkey REST API.\n * Sub-org creation is handled server-side by auth-svc.\n */\n\nimport { createSign, generateKeyPairSync } from \"node:crypto\";\nimport type { TurnkeyCredentials } from \"./config.js\";\n\nexport const TURNKEY_API_BASE = \"https://api.turnkey.com\";\n\n// ── P-256 Key Pair ───────────────────────────────────────────────\n\nexport interface P256KeyPair {\n publicKeyHex: string;\n uncompressedPublicKeyHex: string;\n privateKeyDer: string;\n}\n\nexport function generateP256KeyPair(): P256KeyPair {\n const { publicKey, privateKey } = generateKeyPairSync(\"ec\", {\n namedCurve: \"prime256v1\",\n publicKeyEncoding: { type: \"spki\", format: \"der\" },\n privateKeyEncoding: { type: \"pkcs8\", format: \"der\" },\n });\n\n const pubBuf = Buffer.from(publicKey);\n const uncompressedBytes = pubBuf.subarray(26);\n const x = uncompressedBytes.subarray(1, 33);\n const y = uncompressedBytes.subarray(33, 65);\n const prefix = y[31]! % 2 === 0 ? 0x02 : 0x03;\n const compressedHex = Buffer.concat([Buffer.from([prefix]), x]).toString(\"hex\");\n const uncompressedHex = Buffer.from(uncompressedBytes).toString(\"hex\");\n\n return {\n publicKeyHex: compressedHex,\n uncompressedPublicKeyHex: uncompressedHex,\n privateKeyDer: Buffer.from(privateKey).toString(\"base64\"),\n };\n}\n\n// ── JWT Decode ───────────────────────────────────────────────────\n\ninterface JwtPayload {\n id: string;\n exp: number;\n contact: string;\n public_key?: string;\n verification_type: string;\n organization_id?: string;\n}\n\nfunction decodeJwtPayload(jwt: string): JwtPayload {\n const parts = jwt.split(\".\");\n if (parts.length !== 3) throw new Error(\"Invalid JWT\");\n const payloadB64 = parts[1]!.replace(/-/g, \"+\").replace(/_/g, \"/\");\n return JSON.parse(Buffer.from(payloadB64, \"base64\").toString(\"utf-8\"));\n}\n\n// ── Turnkey Coordinator API ──────────────────────────────────────\n\nexport function createApiStamp(body: string, publicKeyHex: string, privateKeyDerBase64: string): string {\n const signer = createSign(\"SHA256\");\n signer.update(body);\n signer.end();\n\n const signature = signer.sign({\n key: Buffer.from(privateKeyDerBase64, \"base64\"),\n format: \"der\",\n type: \"pkcs8\",\n });\n\n const stamp = JSON.stringify({\n publicKey: publicKeyHex,\n scheme: \"SIGNATURE_SCHEME_TK_API_P256\",\n signature: signature.toString(\"hex\"),\n });\n\n return Buffer.from(stamp).toString(\"base64\").replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\nexport async function turnkeyRequest<T>(\n path: string, body: Record<string, unknown>, creds: TurnkeyCredentials,\n): Promise<T> {\n const bodyStr = JSON.stringify(body);\n const stamp = createApiStamp(bodyStr, creds.publicKeyHex, creds.privateKeyDer);\n\n const res = await fetch(`${TURNKEY_API_BASE}${path}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"X-Stamp\": stamp },\n body: bodyStr,\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Turnkey API error (${res.status}): ${text}`);\n }\n\n return res.json() as Promise<T>;\n}\n\nexport async function refreshTurnkeySession(\n publicKeyHex: string, privateKeyDer: string, organizationId: string, expirationSeconds = 900,\n): Promise<{ session: string; expiry: number }> {\n const newKeyPair = generateP256KeyPair();\n\n const body = JSON.stringify({\n type: \"ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V2\",\n timestampMs: Date.now().toString(),\n organizationId,\n parameters: {\n targetPublicKey: newKeyPair.uncompressedPublicKeyHex,\n expirationSeconds: String(expirationSeconds),\n },\n });\n\n const stampHeader = createApiStamp(body, publicKeyHex, privateKeyDer);\n\n const res = await fetch(`${TURNKEY_API_BASE}/public/v1/submit/create_read_write_session`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"X-Stamp\": stampHeader },\n body,\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Turnkey session refresh failed (${res.status}): ${text}`);\n }\n\n const data = await res.json() as {\n activity: { result?: { createReadWriteSessionResultV2?: { session?: string } } };\n };\n\n const session = data.activity?.result?.createReadWriteSessionResultV2?.session;\n if (!session) throw new Error(\"Turnkey session refresh: no session in response\");\n\n const payload = decodeJwtPayload(session);\n return { session, expiry: payload.exp };\n}\n\n// ── Email Binding ────────────────────────────────────────────────\n\n/**\n * Bind an email to the Turnkey sub-org user.\n * Requires a verificationToken from OTP verify to prove email ownership.\n * Must be called with the sub-org user's own API key (not parent org).\n */\nexport async function updateTurnkeyUserEmail(\n email: string, verificationToken: string, creds: TurnkeyCredentials,\n): Promise<void> {\n const usersData = await turnkeyRequest<{\n users: Array<{ userId: string }>;\n }>(\"/public/v1/query/list_users\", {\n organizationId: creds.organizationId,\n }, creds);\n\n const userId = usersData.users?.[0]?.userId;\n if (!userId) throw new Error(\"Cannot find Turnkey user in sub-org\");\n\n await turnkeyRequest(\"/public/v1/submit/update_user_email\", {\n type: \"ACTIVITY_TYPE_UPDATE_USER_EMAIL\",\n timestampMs: Date.now().toString(),\n organizationId: creds.organizationId,\n parameters: { userId, userEmail: email, verificationToken },\n }, creds);\n}\n\n// ── Wallet Discovery ─────────────────────────────────────────────\n\ninterface TurnkeyWalletAccount {\n address: string;\n addressFormat: string;\n}\n\nexport async function listWalletAccounts(creds: TurnkeyCredentials): Promise<TurnkeyWalletAccount[]> {\n const walletsData = await turnkeyRequest<{ wallets: Array<{ walletId: string }> }>(\n \"/public/v1/query/list_wallets\",\n { organizationId: creds.organizationId },\n creds,\n );\n\n const allAccounts: TurnkeyWalletAccount[] = [];\n for (const wallet of walletsData.wallets ?? []) {\n const accountsData = await turnkeyRequest<{ accounts: TurnkeyWalletAccount[] }>(\n \"/public/v1/query/list_wallet_accounts\",\n { organizationId: creds.organizationId, walletId: wallet.walletId, paginationOptions: { limit: \"100\" } },\n creds,\n );\n for (const acct of accountsData.accounts ?? []) {\n allAccounts.push(acct);\n }\n }\n return allAccounts;\n}\n\nexport async function getEvmAddress(creds: TurnkeyCredentials): Promise<string> {\n const accounts = await listWalletAccounts(creds);\n const evm = accounts.find(a => a.addressFormat === \"ADDRESS_FORMAT_ETHEREUM\");\n if (!evm) throw new Error(\"No EVM wallet found in Turnkey.\");\n return evm.address;\n}\n\nexport async function getSolanaAddress(creds: TurnkeyCredentials): Promise<string> {\n const accounts = await listWalletAccounts(creds);\n const sol = accounts.find(a => a.addressFormat === \"ADDRESS_FORMAT_SOLANA\");\n if (!sol) throw new Error(\"No Solana wallet found in Turnkey.\");\n return sol.address;\n}\n","import type { Wallet } from \"./types.js\";\nimport { toSdkChain } from \"./types.js\";\nimport { type PaymentChain, type TurnkeyCredentials, isEvmChain } from \"../lib/config.js\";\nimport { turnkeyRequest, getEvmAddress, getSolanaAddress } from \"../lib/turnkey.js\";\n\n/**\n * Turnkey TEE wallet — signs via Turnkey Coordinator API.\n * Private keys never leave the AWS Nitro Enclave.\n */\nexport class TurnkeyWallet implements Wallet {\n chain: \"evm\" | \"solana\";\n paymentChain: PaymentChain;\n address: string;\n private creds: TurnkeyCredentials;\n\n constructor(creds: TurnkeyCredentials, chain: PaymentChain, address: string) {\n this.creds = creds;\n this.paymentChain = chain;\n this.chain = toSdkChain(chain);\n this.address = address;\n }\n\n static async create(creds: TurnkeyCredentials): Promise<{ base: TurnkeyWallet; sol: TurnkeyWallet }> {\n const [evmAddr, solAddr] = await Promise.all([\n getEvmAddress(creds),\n getSolanaAddress(creds),\n ]);\n return {\n base: new TurnkeyWallet(creds, \"base\", evmAddr),\n sol: new TurnkeyWallet(creds, \"sol\", solAddr),\n };\n }\n\n async signMessage(message: string): Promise<string> {\n let payloadHex: string;\n let hashFunction: string;\n\n if (isEvmChain(this.paymentChain)) {\n const prefix = `\\x19Ethereum Signed Message:\\n${message.length}`;\n const prefixed = Buffer.concat([Buffer.from(prefix, \"utf-8\"), Buffer.from(message, \"utf-8\")]);\n payloadHex = prefixed.toString(\"hex\");\n hashFunction = \"HASH_FUNCTION_KECCAK256\";\n } else {\n payloadHex = Buffer.from(message, \"utf-8\").toString(\"hex\");\n hashFunction = \"HASH_FUNCTION_NOT_APPLICABLE\";\n }\n\n const result = await turnkeyRequest<{\n activity: { result?: { signRawPayloadResult?: { r: string; s: string; v: string } } };\n }>(\n \"/public/v1/submit/sign_raw_payload\",\n {\n type: \"ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2\",\n timestampMs: Date.now().toString(),\n organizationId: this.creds.organizationId,\n parameters: {\n signWith: this.address,\n payload: payloadHex,\n encoding: \"PAYLOAD_ENCODING_HEXADECIMAL\",\n hashFunction,\n },\n },\n this.creds,\n );\n\n const sigResult = result.activity?.result?.signRawPayloadResult;\n if (!sigResult) throw new Error(\"Turnkey signMessage: no signature in response\");\n\n if (isEvmChain(this.paymentChain)) {\n const v = sigResult.v === \"00\" ? \"1b\" : \"1c\";\n return `0x${sigResult.r}${sigResult.s}${v}`;\n }\n return `${sigResult.r}${sigResult.s}`;\n }\n\n async signTransaction(serializedTx: string): Promise<string> {\n const txBytes = Buffer.from(serializedTx, \"base64\");\n const unsignedHex = txBytes.toString(\"hex\");\n\n const txType = isEvmChain(this.paymentChain)\n ? \"TRANSACTION_TYPE_ETHEREUM\"\n : \"TRANSACTION_TYPE_SOLANA\";\n\n const result = await turnkeyRequest<{\n activity: { result?: { signTransactionResult?: { signedTransaction: string } } };\n }>(\n \"/public/v1/submit/sign_transaction\",\n {\n type: \"ACTIVITY_TYPE_SIGN_TRANSACTION_V2\",\n timestampMs: Date.now().toString(),\n organizationId: this.creds.organizationId,\n parameters: {\n signWith: this.address,\n unsignedTransaction: unsignedHex,\n type: txType,\n },\n },\n this.creds,\n );\n\n const signedHex = result.activity?.result?.signTransactionResult?.signedTransaction;\n if (!signedHex) throw new Error(\"Turnkey signTransaction: no signed tx in response\");\n\n return Buffer.from(signedHex, \"hex\").toString(\"base64\");\n }\n}\n","import type { Config, WalletMode } from \"../lib/config.js\";\nimport { isEvmChain, isSolanaChain } from \"../lib/config.js\";\nimport type { Wallet } from \"./types.js\";\nimport { RawKeyWallet } from \"./raw-wallet.js\";\nimport { TurnkeyWallet } from \"./turnkey-wallet.js\";\n\nexport function createWallet(config: Config, mode: WalletMode): Wallet {\n if (mode === \"raw\" && config.rawWallet) {\n return new RawKeyWallet(config.rawWallet.key, config.rawWallet.chain);\n }\n\n if (mode === \"turnkey\" && config.turnkey) {\n const chain = config.walletChain ?? \"base\";\n const address = isEvmChain(chain) ? config.turnkey.evmAddress : config.turnkey.solanaAddress;\n if (!address) {\n throw new Error(\n `Turnkey ${chain} address not found in config.\\n` +\n \"Please re-login to resolve addresses: chainstream login\",\n );\n }\n return new TurnkeyWallet(config.turnkey, chain, address);\n }\n\n throw new Error(\n \"No wallet configured. Run:\\n\" +\n \" chainstream login # Create Turnkey wallet\\n\" +\n \" chainstream wallet set-raw # Use raw private key (dev)\",\n );\n}\n\n/**\n * Create wallet with resolved addresses (async, used when address is needed immediately).\n */\nexport async function createWalletWithAddresses(config: Config, mode: WalletMode): Promise<{\n base?: Wallet;\n sol?: Wallet;\n}> {\n if (mode === \"raw\" && config.rawWallet) {\n const w = new RawKeyWallet(config.rawWallet.key, config.rawWallet.chain);\n return isEvmChain(config.rawWallet.chain) ? { base: w } : { sol: w };\n }\n\n if (mode === \"turnkey\" && config.turnkey) {\n const wallets = await TurnkeyWallet.create(config.turnkey);\n return { base: wallets.base, sol: wallets.sol };\n }\n\n throw new Error(\"No wallet configured.\");\n}\n\nexport type { Wallet } from \"./types.js\";\n","/**\n * x402 transparent payment — auto-handles 402 responses.\n *\n * Industry standard (Coinbase, QuickNode, x402-agent-pay):\n * - Agent calls API -> gets 402 -> @x402/fetch auto-pays -> retries -> success\n * - Agent never sees the 402 — payment is completely transparent\n */\n\nimport { x402Client } from \"@x402/core/client\";\nimport { wrapFetchWithPayment } from \"@x402/fetch\";\nimport { ExactEvmScheme } from \"@x402/evm/exact/client\";\nimport { ExactSvmScheme } from \"@x402/svm/exact/client\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { hashTypedData, type Hex, type Address } from \"viem\";\nimport { createKeyPairSignerFromBytes } from \"@solana/kit\";\nimport { type Config, type TurnkeyCredentials, isEvmChain, isSolanaChain } from \"./config.js\";\nimport { turnkeyRequest } from \"./turnkey.js\";\nimport * as readline from \"node:readline/promises\";\n\nlet _x402Fetch: typeof fetch | null = null;\n\n// ── Turnkey EVM (Base) payment signer ────────────────────────────\n\nfunction createTurnkeyPaymentAccount(creds: TurnkeyCredentials) {\n const address = creds.evmAddress! as Address;\n return {\n address,\n type: \"local\" as const,\n source: \"custom\" as const,\n publicKey: \"0x\" as Hex,\n async signTypedData(args: { domain: Record<string, unknown>; types: Record<string, unknown[]>; primaryType: string; message: Record<string, unknown> }): Promise<Hex> {\n const digest = hashTypedData(args as Parameters<typeof hashTypedData>[0]);\n const result = await turnkeyRequest<{\n activity: { result?: { signRawPayloadResult?: { r: string; s: string; v: string } } };\n }>(\n \"/public/v1/submit/sign_raw_payload\",\n {\n type: \"ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2\",\n timestampMs: Date.now().toString(),\n organizationId: creds.organizationId,\n parameters: {\n signWith: address,\n payload: digest.slice(2),\n encoding: \"PAYLOAD_ENCODING_HEXADECIMAL\",\n hashFunction: \"HASH_FUNCTION_NO_OP\",\n },\n },\n creds,\n );\n const sig = result.activity?.result?.signRawPayloadResult;\n if (!sig) throw new Error(\"Turnkey signTypedData: no signature\");\n const v = sig.v === \"00\" ? \"1b\" : \"1c\";\n return `0x${sig.r}${sig.s}${v}` as Hex;\n },\n };\n}\n\n// ── Turnkey Solana payment signer ────────────────────────────────\n\nasync function turnkeySolanaSign(creds: TurnkeyCredentials, payload: Uint8Array): Promise<Uint8Array> {\n const payloadHex = Buffer.from(payload).toString(\"hex\");\n const result = await turnkeyRequest<{\n activity: { result?: { signRawPayloadResult?: { r: string; s: string } } };\n }>(\n \"/public/v1/submit/sign_raw_payload\",\n {\n type: \"ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2\",\n timestampMs: Date.now().toString(),\n organizationId: creds.organizationId,\n parameters: {\n signWith: creds.solanaAddress!,\n payload: payloadHex,\n encoding: \"PAYLOAD_ENCODING_HEXADECIMAL\",\n hashFunction: \"HASH_FUNCTION_NOT_APPLICABLE\",\n },\n },\n creds,\n );\n const sig = result.activity?.result?.signRawPayloadResult;\n if (!sig) throw new Error(\"Turnkey Solana sign: no signature\");\n return new Uint8Array(Buffer.from(sig.r + sig.s, \"hex\"));\n}\n\nasync function createTurnkeySolanaSigner(creds: TurnkeyCredentials) {\n const { createNoopSigner, address: solAddress } = await import(\"@solana/kit\");\n return createNoopSigner(solAddress(creds.solanaAddress!));\n}\n\nfunction createTurnkeySvmScheme(creds: TurnkeyCredentials, noopSigner: unknown) {\n const inner = new ExactSvmScheme(noopSigner as never, { rpcUrl: \"https://api.mainnet-beta.solana.com\" });\n return {\n scheme: \"exact\" as const,\n async createPaymentPayload(x402Version: number, paymentRequirements: unknown): Promise<unknown> {\n const payload = await inner.createPaymentPayload(x402Version, paymentRequirements as never);\n const wrapped = payload as unknown as { payload: { transaction: string } };\n const txB64 = wrapped.payload.transaction;\n const txBytes = new Uint8Array(Buffer.from(txB64, \"base64\"));\n const sigCount = txBytes[0]!;\n const messageStart = 1 + sigCount * 64;\n const messageBytes = txBytes.slice(messageStart);\n const sig = await turnkeySolanaSign(creds, messageBytes);\n txBytes.set(sig, 1 + 64);\n wrapped.payload.transaction = Buffer.from(txBytes).toString(\"base64\");\n return payload;\n },\n };\n}\n\n// ── Base58 decode ────────────────────────────────────────────────\n\nfunction bs58Decode(str: string): Uint8Array {\n const ALPHABET = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\n const BASE = 58;\n const result: number[] = [0];\n for (const char of str) {\n let carry = ALPHABET.indexOf(char);\n if (carry < 0) throw new Error(`Invalid base58 character: ${char}`);\n for (let j = 0; j < result.length; j++) {\n carry += result[j]! * BASE;\n result[j] = carry & 0xff;\n carry >>= 8;\n }\n while (carry > 0) {\n result.push(carry & 0xff);\n carry >>= 8;\n }\n }\n for (const char of str) {\n if (char !== \"1\") break;\n result.push(0);\n }\n return new Uint8Array(result.reverse());\n}\n\n// ── x402 Fetch factory ──────────────────────────────────────────\n\nexport async function getX402Fetch(config: Config): Promise<typeof fetch> {\n if (_x402Fetch) return _x402Fetch;\n\n const client = new x402Client();\n\n if (config.rawWallet) {\n if (isEvmChain(config.rawWallet.chain)) {\n const hex = (config.rawWallet.key.startsWith(\"0x\") ? config.rawWallet.key : `0x${config.rawWallet.key}`) as Hex;\n const account = privateKeyToAccount(hex);\n client.register(\"eip155:8453\", new ExactEvmScheme(account));\n } else if (isSolanaChain(config.rawWallet.chain)) {\n const decoded = bs58Decode(config.rawWallet.key);\n const signer = await createKeyPairSignerFromBytes(new Uint8Array(decoded) as never);\n client.register(\"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\", new ExactSvmScheme(signer, { rpcUrl: \"https://api.mainnet-beta.solana.com\" }));\n }\n } else if (config.turnkey?.organizationId) {\n const preferredChain = config.walletChain ?? \"base\";\n if (isEvmChain(preferredChain) && config.turnkey.evmAddress) {\n const account = createTurnkeyPaymentAccount(config.turnkey);\n client.register(\"eip155:8453\", new ExactEvmScheme(account as never));\n } else if (isSolanaChain(preferredChain) && config.turnkey.solanaAddress) {\n const noopSigner = await createTurnkeySolanaSigner(config.turnkey);\n const scheme = createTurnkeySvmScheme(config.turnkey, noopSigner);\n client.register(\"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\", scheme as never);\n }\n }\n\n _x402Fetch = wrapFetchWithPayment(fetch, client);\n return _x402Fetch;\n}\n\n// ── Pricing & plan selection ────────────────────────────────────\n\ninterface PricingPlan {\n id: number;\n name: string;\n price_usd: number;\n quota_total: number;\n duration_days: number;\n}\n\ninterface PricingResponse {\n plans: PricingPlan[];\n}\n\nexport async function getPricing(baseUrl: string): Promise<PricingResponse> {\n const resp = await fetch(`${baseUrl}/x402/pricing`);\n if (!resp.ok) throw new Error(`Failed to get pricing (${resp.status})`);\n return resp.json() as Promise<PricingResponse>;\n}\n\n/**\n * Interactive plan selection for TTY mode.\n * Fetches pricing, displays table, prompts user to choose.\n */\nexport async function selectPlanInteractive(baseUrl: string): Promise<string> {\n const pricing = await getPricing(baseUrl);\n const plans = pricing.plans.sort((a, b) => a.price_usd - b.price_usd);\n\n process.stderr.write(\"\\n[chainstream] No active subscription. Available plans:\\n\\n\");\n process.stderr.write(\" # Plan Price Quota Duration\\n\");\n process.stderr.write(\" ── ────────── ──────── ──────────────── ────────\\n\");\n\n for (let i = 0; i < plans.length; i++) {\n const p = plans[i]!;\n const num = String(i + 1).padStart(2);\n const name = p.name.padEnd(10);\n const price = `$${p.price_usd}`.padEnd(8);\n const quota = p.quota_total.toLocaleString().padStart(14) + \" CU\";\n const days = `${p.duration_days} days`;\n process.stderr.write(` ${num} ${name} ${price} ${quota} ${days}\\n`);\n }\n\n process.stderr.write(\"\\n\");\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n const answer = await rl.question(`Select plan (1-${plans.length}): `);\n rl.close();\n\n const idx = parseInt(answer.trim(), 10) - 1;\n if (idx < 0 || idx >= plans.length || Number.isNaN(idx)) {\n throw new Error(\"Invalid plan selection. Aborting purchase.\");\n }\n\n return plans[idx]!.name;\n}\n","import { Command } from \"commander\";\nimport { registerTokenCommands } from \"./commands/token.js\";\nimport { registerMarketCommands } from \"./commands/market.js\";\nimport { registerWalletCommands } from \"./commands/wallet.js\";\nimport { registerKytCommands } from \"./commands/kyt.js\";\nimport { registerDexCommands } from \"./commands/dex.js\";\nimport { registerJobCommands } from \"./commands/job.js\";\nimport { registerAuthCommands } from \"./commands/auth.js\";\nimport { registerConfigCommands } from \"./commands/config-cmd.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"chainstream\")\n .version(\"0.1.0\")\n .description(\"ChainStream CLI — on-chain data and DeFi execution for AI agents\");\n\nregisterTokenCommands(program);\nregisterMarketCommands(program);\nregisterWalletCommands(program);\nregisterKytCommands(program);\nregisterDexCommands(program);\nregisterJobCommands(program);\nregisterAuthCommands(program);\nregisterConfigCommands(program);\n\nprogram.parseAsync().catch((err: Error) => {\n process.stderr.write(`[chainstream] ${err.message}\\n`);\n process.exit(1);\n});\n","import { ChainStreamClient } from \"@chainstream-io/sdk\";\nimport { loadConfig, getWalletMode } from \"./config.js\";\nimport { createWallet } from \"../wallet/index.js\";\nimport { getX402Fetch, selectPlanInteractive } from \"./x402.js\";\nimport type { Wallet } from \"../wallet/types.js\";\n\nlet _client: ChainStreamClient | null = null;\nlet _wallet: Wallet | null = null;\n\nexport function createClient(): ChainStreamClient {\n if (_client) return _client;\n\n const config = loadConfig();\n const walletMode = getWalletMode(config);\n\n if (walletMode) {\n _wallet = createWallet(config, walletMode);\n _client = new ChainStreamClient(\"\", {\n serverUrl: config.baseUrl,\n walletSigner: _wallet,\n } as never);\n return _client;\n }\n\n if (config.apiKey) {\n _client = new ChainStreamClient(\"\", {\n serverUrl: config.baseUrl,\n apiKey: config.apiKey,\n });\n return _client;\n }\n\n throw new Error(\n \"Not authenticated. Run one of:\\n\" +\n \" chainstream login # Create Turnkey wallet (no email)\\n\" +\n \" chainstream login --email # Email OTP login\\n\" +\n \" chainstream wallet set-raw # Import private key (dev)\\n\" +\n \" chainstream config set --key apiKey --value <key> # API key only\",\n );\n}\n\nexport function requireWallet(): ChainStreamClient {\n const config = loadConfig();\n const walletMode = getWalletMode(config);\n if (!walletMode) {\n throw new Error(\n \"Wallet required for this operation. Run:\\n\" +\n \" chainstream login # Create Turnkey wallet\\n\" +\n \" chainstream wallet set-raw # Dev: use raw private key\",\n );\n }\n return createClient();\n}\n\n/**\n * Execute an SDK call with automatic x402 payment.\n *\n * Plan selection logic:\n * 1. config.plan is set → use that plan\n * 2. TTY + no config.plan → show plans interactively, let user choose\n * 3. non-TTY + no config.plan → use server's default (from 402 resource URL)\n */\nexport async function callWithAutoPayment<T>(\n fn: () => Promise<T>,\n retried = false,\n): Promise<T> {\n try {\n return await fn();\n } catch (err: unknown) {\n const paymentInfo = extractPaymentInfo(err);\n\n if (paymentInfo && !retried && _wallet) {\n const config = loadConfig();\n let purchaseUrl = resolvePurchaseUrl(config.baseUrl, paymentInfo);\n\n // Plan selection: config > interactive > server default\n if (config.plan) {\n purchaseUrl = replacePlanInUrl(purchaseUrl, config.plan);\n process.stderr.write(`[chainstream] No active subscription. Purchasing ${config.plan} plan...\\n`);\n } else if (process.stdin.isTTY) {\n const chosenPlan = await selectPlanInteractive(config.baseUrl);\n purchaseUrl = replacePlanInUrl(purchaseUrl, chosenPlan);\n process.stderr.write(`[chainstream] Purchasing ${chosenPlan} plan...\\n`);\n } else {\n process.stderr.write(`[chainstream] No active subscription. Purchasing via x402...\\n`);\n process.stderr.write(`[chainstream] Resource: ${purchaseUrl}\\n`);\n }\n\n const x402Fetch = await getX402Fetch(config);\n const resp = await x402Fetch(purchaseUrl);\n\n if (resp.ok) {\n const result = await resp.json() as Record<string, unknown>;\n process.stderr.write(`[chainstream] Subscription activated: ${result.plan} (expires: ${result.expires_at})\\n`);\n _client = null;\n createClient();\n return callWithAutoPayment(fn, true);\n }\n\n const text = await resp.text().catch(() => \"\");\n process.stderr.write(`[chainstream] Purchase failed (${resp.status}): ${text}\\n`);\n }\n\n throw err;\n }\n}\n\nfunction extractPaymentInfo(err: unknown): { resourceUrl?: string } | null {\n if (!err || typeof err !== \"object\") return null;\n\n const axiosErr = err as {\n response?: { status?: number; headers?: Record<string, string>; data?: unknown };\n status?: number;\n message?: string;\n };\n\n const status = axiosErr.response?.status ?? axiosErr.status;\n const message = axiosErr.message ?? \"\";\n\n if (status === 402) {\n const header = axiosErr.response?.headers?.[\"payment-required\"]\n ?? axiosErr.response?.headers?.[\"x-payment-required\"];\n if (header) {\n try {\n const decoded = JSON.parse(Buffer.from(header, \"base64\").toString());\n return { resourceUrl: decoded.resource?.url };\n } catch { /* ignore parse errors */ }\n }\n return {};\n }\n\n if (message.includes(\"402\") || message.includes(\"PAYMENT_REQUIRED\") || message.includes(\"no active x402 subscription\")) {\n return {};\n }\n\n return null;\n}\n\nfunction resolvePurchaseUrl(baseUrl: string, info: { resourceUrl?: string }): string {\n if (info.resourceUrl) {\n if (info.resourceUrl.startsWith(\"http\")) return info.resourceUrl;\n return `${baseUrl}${info.resourceUrl}`;\n }\n return `${baseUrl}/x402/purchase?plan=nano`;\n}\n\nfunction replacePlanInUrl(url: string, plan: string): string {\n try {\n const u = new URL(url);\n u.searchParams.set(\"plan\", plan);\n return u.toString();\n } catch {\n return url.replace(/plan=[^&]+/, `plan=${encodeURIComponent(plan)}`);\n }\n}\n","const VALID_CHAINS = new Set([\"sol\", \"bsc\", \"eth\"]);\nconst SOL_ADDRESS_RE = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/;\nconst EVM_ADDRESS_RE = /^0x[0-9a-fA-F]{40}$/;\n\nconst CURRENCY_MAP: Record<string, Record<string, string>> = {\n sol: {\n SOL: \"So11111111111111111111111111111111111111112\",\n USDC: \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n },\n bsc: {\n BNB: \"0x0000000000000000000000000000000000000000\",\n USDC: \"0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d\",\n },\n eth: {\n ETH: \"0x0000000000000000000000000000000000000000\",\n USDC: \"0xA0b86991c6218b36c1d19d4a2e9eb0ce3606eB48\",\n },\n};\n\nexport function validateChain(chain: string): asserts chain is string {\n if (!VALID_CHAINS.has(chain)) {\n throw new Error(`Invalid chain \"${chain}\". Must be one of: ${[...VALID_CHAINS].join(\", \")}`);\n }\n}\n\nexport function validateAddress(address: string, chain: string): void {\n const isEvm = chain === \"bsc\" || chain === \"eth\";\n const valid = isEvm ? EVM_ADDRESS_RE.test(address) : SOL_ADDRESS_RE.test(address);\n if (!valid) {\n throw new Error(`Invalid address for chain \"${chain}\": \"${address}\"`);\n }\n}\n\nexport function validatePositiveNumber(value: string, label: string): void {\n const n = Number(value);\n if (!Number.isFinite(n) || n <= 0) {\n throw new Error(`Invalid ${label}: \"${value}\". Must be a positive number.`);\n }\n}\n\nexport function validateSlippage(value: number): void {\n if (value < 0.001 || value > 0.5) {\n throw new Error(`Invalid slippage: ${value}. Must be between 0.001 (0.1%) and 0.5 (50%).`);\n }\n}\n\nexport function resolveCurrency(nameOrAddress: string, chain: string): string {\n const upper = nameOrAddress.toUpperCase();\n const resolved = CURRENCY_MAP[chain]?.[upper];\n if (resolved) return resolved;\n return nameOrAddress;\n}\n","const EXPLORERS: Record<string, string> = {\n sol: \"https://solscan.io/tx/\",\n bsc: \"https://bscscan.com/tx/\",\n eth: \"https://etherscan.io/tx/\",\n};\n\nexport function printResult(data: unknown, raw?: boolean): void {\n if (raw) {\n process.stdout.write(JSON.stringify(data) + \"\\n\");\n } else {\n process.stdout.write(JSON.stringify(data, null, 2) + \"\\n\");\n }\n}\n\nexport function printError(message: string): void {\n process.stderr.write(`[chainstream] Error: ${message}\\n`);\n}\n\nexport function exitOnError(err: unknown): never {\n const message = err instanceof Error ? err.message : String(err);\n printError(message);\n if (process.env.CHAINSTREAM_DEBUG && err instanceof Error && err.stack) {\n process.stderr.write(err.stack + \"\\n\");\n }\n process.exit(1);\n}\n\nexport function explorerUrl(chain: string, txHash: string): string {\n const base = EXPLORERS[chain] ?? EXPLORERS[\"eth\"];\n return `${base}${txHash}`;\n}\n","import { Command } from \"commander\";\nimport { createClient, callWithAutoPayment } from \"../lib/client.js\";\nimport { validateChain, validateAddress } from \"../lib/validate.js\";\nimport { printResult, exitOnError } from \"../lib/output.js\";\n\nexport function registerTokenCommands(program: Command): void {\n const token = program.command(\"token\").description(\"Token information and analytics\");\n\n token\n .command(\"search\")\n .description(\"Search tokens by keyword\")\n .requiredOption(\"--keyword <keyword>\", \"Search keyword (name, symbol, or address)\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .option(\"--limit <n>\", \"Max results\", \"20\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.token.search({ q: opts.keyword, chains: [opts.chain], limit: Number(opts.limit) }),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n token\n .command(\"info\")\n .description(\"Get full token detail\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Token contract address\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.token.getToken(opts.chain, opts.address),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n token\n .command(\"security\")\n .description(\"Check token security (honeypot, mint auth, freeze auth)\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Token contract address\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.token.getSecurity(opts.chain, opts.address),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n token\n .command(\"holders\")\n .description(\"Get top token holders\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Token contract address\")\n .option(\"--limit <n>\", \"Max results\", \"20\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.token.getTopHolders(opts.chain, opts.address, { limit: Number(opts.limit) } as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n token\n .command(\"candles\")\n .description(\"Get OHLCV candlestick data\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Token contract address\")\n .requiredOption(\"--resolution <res>\", \"Resolution: 1m/5m/15m/1h/4h/1d\")\n .option(\"--from <timestamp>\", \"Start time (Unix seconds)\")\n .option(\"--to <timestamp>\", \"End time (Unix seconds)\")\n .option(\"--limit <n>\", \"Max candles\", \"100\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const params: Record<string, unknown> = {\n resolution: opts.resolution,\n limit: Number(opts.limit),\n };\n if (opts.from) params.from = Number(opts.from);\n if (opts.to) params.to = Number(opts.to);\n const result = await callWithAutoPayment(() =>\n client.token.getCandles(opts.chain, opts.address, params as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n token\n .command(\"pools\")\n .description(\"Get liquidity pools for a token\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Token contract address\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.token.getPools(opts.chain, opts.address),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { createClient, callWithAutoPayment } from \"../lib/client.js\";\nimport { validateChain } from \"../lib/validate.js\";\nimport { printResult, exitOnError } from \"../lib/output.js\";\n\nexport function registerMarketCommands(program: Command): void {\n const market = program.command(\"market\").description(\"Market data and trending tokens\");\n\n market\n .command(\"trending\")\n .description(\"Get hot/trending tokens\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--duration <dur>\", \"Duration: 1h/6h/24h\")\n .option(\"--limit <n>\", \"Max results\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n const client = createClient();\n const params: Record<string, unknown> = {};\n if (opts.limit) params.limit = Number(opts.limit);\n const result = await callWithAutoPayment(() =>\n client.ranking.getHotTokens(opts.chain, opts.duration, params as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n market\n .command(\"new\")\n .description(\"Get newly created tokens\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .option(\"--limit <n>\", \"Max results\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n const client = createClient();\n const params: Record<string, unknown> = {};\n if (opts.limit) params.limit = Number(opts.limit);\n const result = await callWithAutoPayment(() =>\n client.ranking.getNewTokens(opts.chain, params as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n market\n .command(\"trades\")\n .description(\"Get recent trades\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .option(\"--token <address>\", \"Filter by token address\")\n .option(\"--limit <n>\", \"Max results\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n const client = createClient();\n const params: Record<string, unknown> = {};\n if (opts.token) params.tokenAddress = opts.token;\n if (opts.limit) params.limit = Number(opts.limit);\n const result = await callWithAutoPayment(() =>\n client.trade.getTrades(opts.chain, params as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { createClient, callWithAutoPayment } from \"../lib/client.js\";\nimport { validateChain, validateAddress } from \"../lib/validate.js\";\nimport { printResult, exitOnError } from \"../lib/output.js\";\nimport { loadConfig, updateConfig } from \"../lib/config.js\";\nimport * as readline from \"node:readline/promises\";\n\nexport function registerWalletCommands(program: Command): void {\n const wallet = program.command(\"wallet\").description(\"Wallet analytics and management\");\n\n wallet\n .command(\"profile\")\n .description(\"Wallet profile: PnL + net worth + top holdings\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Wallet address\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const [pnl, netWorth, balance] = await callWithAutoPayment(() =>\n Promise.all([\n client.wallet.getPnl(opts.chain, opts.address),\n client.wallet.getNetWorth(opts.chain, opts.address),\n client.wallet.getTokensBalance(opts.chain, opts.address),\n ]),\n );\n printResult({ pnl, netWorth, balance }, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n wallet\n .command(\"pnl\")\n .description(\"Get wallet PnL details\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Wallet address\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.wallet.getPnl(opts.chain, opts.address),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n wallet\n .command(\"holdings\")\n .description(\"Get wallet token balances\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Wallet address\")\n .option(\"--limit <n>\", \"Max results\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const params: Record<string, unknown> = {};\n if (opts.limit) params.limit = Number(opts.limit);\n const result = await callWithAutoPayment(() =>\n client.wallet.getTokensBalance(opts.chain, opts.address, params as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n wallet\n .command(\"activity\")\n .description(\"Get wallet transfer history\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Wallet address\")\n .option(\"--limit <n>\", \"Max results\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const params: Record<string, unknown> = {};\n if (opts.limit) params.limit = Number(opts.limit);\n const result = await callWithAutoPayment(() =>\n client.wallet.getWalletTransfers(opts.chain, opts.address, params as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n wallet\n .command(\"address\")\n .description(\"Show current wallet addresses\")\n .action(async () => {\n try {\n const config = loadConfig();\n const walletMode = (await import(\"../lib/config.js\")).getWalletMode(config);\n if (walletMode === \"turnkey\" && config.turnkey) {\n if (config.turnkey.evmAddress || config.turnkey.solanaAddress) {\n if (config.turnkey.evmAddress) process.stdout.write(`Base: ${config.turnkey.evmAddress}\\n`);\n if (config.turnkey.solanaAddress) process.stdout.write(`Solana: ${config.turnkey.solanaAddress}\\n`);\n } else {\n const { createWalletWithAddresses } = await import(\"../wallet/index.js\");\n const wallets = await createWalletWithAddresses(config, \"turnkey\");\n if (wallets.base) process.stdout.write(`Base: ${wallets.base.address}\\n`);\n if (wallets.sol) process.stdout.write(`Solana: ${wallets.sol.address}\\n`);\n }\n } else if (config.rawWallet) {\n const { createWallet } = await import(\"../wallet/index.js\");\n const w = createWallet(config, \"raw\");\n process.stdout.write(`${w.paymentChain.toUpperCase()}: ${w.address}\\n`);\n } else {\n process.stdout.write(\"No wallet configured. Run: chainstream login\\n\");\n }\n } catch (err) { exitOnError(err); }\n });\n\n wallet\n .command(\"balance\")\n .description(\"Show current wallet balance\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n const config = loadConfig();\n const { getWalletMode } = await import(\"../lib/config.js\");\n const walletMode = getWalletMode(config);\n\n let address: string | undefined;\n if (walletMode === \"raw\" && config.rawWallet) {\n const { createWallet } = await import(\"../wallet/index.js\");\n address = createWallet(config, \"raw\").address;\n } else if (walletMode === \"turnkey\" && config.turnkey) {\n address = config.turnkey.evmAddress;\n if (!address) {\n const { getEvmAddress } = await import(\"../lib/turnkey.js\");\n address = await getEvmAddress(config.turnkey);\n }\n }\n if (!address) throw new Error(\"No wallet configured. Run: chainstream login\");\n\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.wallet.getTokensBalance(opts.chain, address),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n wallet\n .command(\"set-raw\")\n .description(\"Set raw private key (dev/testing only)\")\n .requiredOption(\"--chain <chain>\", \"Chain: base/sol\")\n .action(async (opts) => {\n try {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n process.stdout.write(\"⚠ WARNING: Raw private key will be stored in plaintext.\\n\");\n process.stdout.write(\" Use Turnkey (chainstream login) for production.\\n\\n\");\n const key = await rl.question(\"Enter private key: \");\n rl.close();\n\n if (!key.trim()) throw new Error(\"Empty key provided.\");\n\n updateConfig({\n rawWallet: { key: key.trim(), chain: opts.chain },\n });\n process.stdout.write(`Raw wallet set (${opts.chain}). Run 'chainstream wallet address' to verify.\\n`);\n } catch (err) { exitOnError(err); }\n });\n\n wallet\n .command(\"pricing\")\n .description(\"Show available x402 quota plans\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n const config = loadConfig();\n const { getPricing } = await import(\"../lib/x402.js\");\n const plans = await getPricing(config.baseUrl);\n printResult(plans, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { createClient, callWithAutoPayment } from \"../lib/client.js\";\nimport { validateChain, validateAddress } from \"../lib/validate.js\";\nimport { printResult, exitOnError } from \"../lib/output.js\";\n\nexport function registerKytCommands(program: Command): void {\n const kyt = program.command(\"kyt\").description(\"KYT address risk assessment\");\n\n kyt\n .command(\"risk\")\n .description(\"Assess address risk score\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Address to assess\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.kyt.getAddressRisk(opts.address),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { createClient, requireWallet, callWithAutoPayment } from \"../lib/client.js\";\nimport { validateChain, validateAddress, validateSlippage, resolveCurrency } from \"../lib/validate.js\";\nimport { printResult, exitOnError, explorerUrl } from \"../lib/output.js\";\nimport * as readline from \"node:readline/promises\";\n\nexport function registerDexCommands(program: Command): void {\n const dex = program.command(\"dex\").description(\"DEX swap, quote, and token creation\");\n\n dex\n .command(\"quote\")\n .description(\"Get swap quote (read-only)\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--input-token <addr>\", \"Input token (address or SOL/ETH/BNB/USDC)\")\n .requiredOption(\"--output-token <addr>\", \"Output token (address or SOL/ETH/BNB/USDC)\")\n .requiredOption(\"--amount <amount>\", \"Input amount (smallest unit)\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n const inputToken = resolveCurrency(opts.inputToken, opts.chain);\n const outputToken = resolveCurrency(opts.outputToken, opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.dex.quote(opts.chain, {\n inputMint: inputToken,\n outputMint: outputToken,\n amount: opts.amount,\n } as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n dex\n .command(\"swap\")\n .description(\"[FINANCIAL] Execute token swap (irreversible)\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--from <address>\", \"Sender wallet address\")\n .requiredOption(\"--input-token <addr>\", \"Input token (address or SOL/ETH/BNB/USDC)\")\n .requiredOption(\"--output-token <addr>\", \"Output token (address or SOL/ETH/BNB/USDC)\")\n .requiredOption(\"--amount <amount>\", \"Input amount (smallest unit)\")\n .option(\"--slippage <n>\", \"Slippage tolerance (e.g. 0.01 = 1%)\", \"0.01\")\n .option(\"--raw\", \"Single-line JSON output\")\n .option(\"--yes\", \"Skip confirmation prompt\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.from, opts.chain);\n if (opts.slippage) validateSlippage(Number(opts.slippage));\n\n const inputToken = resolveCurrency(opts.inputToken, opts.chain);\n const outputToken = resolveCurrency(opts.outputToken, opts.chain);\n const client = requireWallet();\n\n // Phase 1: Quote\n process.stderr.write(\"Fetching quote...\\n\");\n const quote = await callWithAutoPayment(() =>\n client.dex.quote(opts.chain, {\n inputMint: inputToken,\n outputMint: outputToken,\n amount: opts.amount,\n } as never),\n );\n\n // Phase 2: Confirm\n process.stderr.write(\"\\n--- Swap Summary ---\\n\");\n process.stderr.write(`Chain: ${opts.chain}\\n`);\n process.stderr.write(`Input: ${inputToken}\\n`);\n process.stderr.write(`Output: ${outputToken}\\n`);\n process.stderr.write(`Amount: ${opts.amount}\\n`);\n process.stderr.write(`Slippage: ${opts.slippage}\\n`);\n process.stderr.write(`Quote: ${JSON.stringify(quote)}\\n`);\n process.stderr.write(\"--------------------\\n\\n\");\n\n if (!opts.yes) {\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n const answer = await rl.question(\"Confirm swap? (y/N): \");\n rl.close();\n if (answer.toLowerCase() !== \"y\") {\n process.stderr.write(\"Swap cancelled.\\n\");\n return;\n }\n }\n\n // Phase 3: Build + Sign\n process.stderr.write(\"Building transaction...\\n\");\n const swapResult = await callWithAutoPayment(() =>\n client.dex.swap(opts.chain, {\n userAddress: opts.from,\n inputMint: inputToken,\n outputMint: outputToken,\n amount: opts.amount,\n slippage: Number(opts.slippage),\n } as never),\n ) as { serializedTx: string };\n\n const { createWallet } = await import(\"../wallet/index.js\");\n const { loadConfig, getWalletMode } = await import(\"../lib/config.js\");\n const config = loadConfig();\n const walletMode = getWalletMode(config);\n if (!walletMode) throw new Error(\"Wallet required for swap.\");\n\n const wallet = createWallet(config, walletMode);\n process.stderr.write(\"Signing transaction...\\n\");\n const signedTx = await wallet.signTransaction(swapResult.serializedTx);\n\n // Phase 4: Broadcast + Poll\n process.stderr.write(\"Broadcasting transaction...\\n\");\n const sendResult = await client.transaction.send(opts.chain as never, {\n signedTx,\n } as never) as { signature?: string; jobId?: string };\n\n if (sendResult.jobId) {\n process.stderr.write(`Job ${sendResult.jobId} submitted. Waiting for confirmation...\\n`);\n const jobResult = await client.waitForJob(sendResult.jobId);\n const result = {\n ...jobResult as Record<string, unknown>,\n explorer: explorerUrl(opts.chain, (sendResult.signature ?? (jobResult as Record<string, unknown>).hash as string) || \"\"),\n };\n printResult(result, opts.raw);\n } else {\n const result = {\n ...sendResult,\n explorer: explorerUrl(opts.chain, sendResult.signature ?? \"\"),\n };\n printResult(result, opts.raw);\n }\n } catch (err) { exitOnError(err); }\n });\n\n dex\n .command(\"create\")\n .description(\"[FINANCIAL] Create token on launchpad\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--name <name>\", \"Token name\")\n .requiredOption(\"--symbol <symbol>\", \"Token symbol\")\n .requiredOption(\"--uri <uri>\", \"Metadata URI (IPFS/HTTP)\")\n .option(\"--platform <platform>\", \"Launchpad: pumpfun/raydium\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n const client = requireWallet();\n const result = await callWithAutoPayment(() =>\n client.dex.createToken(opts.chain, {\n name: opts.name,\n symbol: opts.symbol,\n uri: opts.uri,\n platform: opts.platform,\n } as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { createClient, callWithAutoPayment } from \"../lib/client.js\";\nimport { printResult, exitOnError } from \"../lib/output.js\";\n\nexport function registerJobCommands(program: Command): void {\n const job = program.command(\"job\").description(\"Job status polling\");\n\n job\n .command(\"status\")\n .description(\"Check job status\")\n .requiredOption(\"--id <jobId>\", \"Job ID\")\n .option(\"--wait\", \"Wait for job completion via SSE\")\n .option(\"--timeout <ms>\", \"Wait timeout in milliseconds\", \"60000\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n const client = createClient();\n if (opts.wait) {\n process.stderr.write(`Waiting for job ${opts.id}...\\n`);\n const result = await callWithAutoPayment(() =>\n client.waitForJob(opts.id, Number(opts.timeout)),\n );\n printResult(result, opts.raw);\n } else {\n const result = await callWithAutoPayment(() =>\n client.job.get(opts.id),\n );\n printResult(result, opts.raw);\n }\n } catch (err) { exitOnError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { createSign } from \"node:crypto\";\nimport { loadConfig, updateConfig, type TurnkeyCredentials } from \"../lib/config.js\";\nimport { loadKey, saveKey, hasKey } from \"../lib/keystore.js\";\nimport {\n generateP256KeyPair, refreshTurnkeySession,\n getEvmAddress, getSolanaAddress, updateTurnkeyUserEmail,\n} from \"../lib/turnkey.js\";\nimport { CHAINSTREAM_AUTH_URL } from \"../lib/constants.js\";\nimport { exitOnError } from \"../lib/output.js\";\nimport * as readline from \"node:readline/promises\";\n\nasync function resolveAndStoreAddresses(turnkeyCreds: TurnkeyCredentials): Promise<void> {\n process.stderr.write(\"Resolving wallet addresses...\\n\");\n const [evmAddress, solanaAddress] = await Promise.all([\n getEvmAddress(turnkeyCreds),\n getSolanaAddress(turnkeyCreds),\n ]);\n updateConfig({\n turnkey: { ...turnkeyCreds, evmAddress, solanaAddress },\n });\n}\n\nexport function registerAuthCommands(program: Command): void {\n program\n .command(\"login\")\n .description(\"Create wallet (default: --key) or login via email OTP\")\n .argument(\"[email]\", \"Email address for OTP login\")\n .option(\"--key\", \"Key-based login — no email required (default)\")\n .option(\"--email\", \"Email OTP login\")\n .action(async (emailArg: string | undefined, opts: { key?: boolean; email?: boolean }) => {\n try {\n if (opts.email || emailArg) {\n await doEmailLogin(emailArg);\n } else {\n await doKeyLogin();\n }\n } catch (err) { exitOnError(err); }\n });\n\n program\n .command(\"verify\")\n .description(\"Verify email OTP (second step of login)\")\n .requiredOption(\"--otp-id <id>\", \"OTP ID from login step\")\n .requiredOption(\"--code <code>\", \"OTP code from email\")\n .requiredOption(\"--email <email>\", \"Email used in login step\")\n .action(async (opts: { otpId: string; code: string; email: string }) => {\n try {\n await completeEmailLogin(opts.otpId, opts.code, opts.email);\n } catch (err) { exitOnError(err); }\n });\n\n program\n .command(\"logout\")\n .description(\"Clear session (P-256 keys preserved)\")\n .action(() => {\n const config = loadConfig();\n if (config.turnkey) {\n updateConfig({ turnkey: undefined });\n process.stdout.write(\"Logged out. P-256 keys preserved in ~/.config/chainstream/keys/\\n\");\n process.stdout.write(\"Run 'chainstream login' to re-authenticate.\\n\");\n } else {\n process.stdout.write(\"Not logged in via Turnkey.\\n\");\n }\n });\n\n program\n .command(\"bind-email\")\n .description(\"Bind an email to your wallet (for account recovery)\")\n .argument(\"[email]\", \"Email address to bind\")\n .action(async (emailArg?: string) => {\n try {\n await doBindEmail(emailArg);\n } catch (err) { exitOnError(err); }\n });\n}\n\n// ── Key-based login (default, no email required) ─────────────────\n\nfunction signTimestamp(timestampMs: string, privateKeyDerBase64: string): string {\n const signer = createSign(\"SHA256\");\n signer.update(timestampMs);\n signer.end();\n const sig = signer.sign({\n key: Buffer.from(privateKeyDerBase64, \"base64\"),\n format: \"der\",\n type: \"pkcs8\",\n });\n return sig.toString(\"hex\");\n}\n\ninterface KeyAuthResponse {\n orgId: string;\n evmAddress: string;\n solanaAddress: string;\n isNewUser: boolean;\n}\n\nasync function authServiceRequest<T>(path: string, body: Record<string, unknown>): Promise<T> {\n const authUrl = loadConfig().authUrl ?? CHAINSTREAM_AUTH_URL;\n\n const res = await fetch(`${authUrl}${path}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n let detail = text;\n try { detail = JSON.parse(text).message ?? text; } catch { /* ignore */ }\n throw new Error(`Auth service error (${res.status}): ${detail}`);\n }\n\n return res.json() as Promise<T>;\n}\n\nasync function callKeyAuth(\n publicKeyHex: string,\n uncompressedPublicKeyHex: string,\n timestampMs: string,\n signature: string,\n): Promise<KeyAuthResponse> {\n return authServiceRequest(\"/api/auth/key\", { publicKeyHex, uncompressedPublicKeyHex, timestampMs, signature });\n}\n\nasync function callOtpInit(email: string, organizationId?: string): Promise<{ otpId: string }> {\n return authServiceRequest(\"/api/auth/otp-init\", { email, ...(organizationId && { organizationId }) });\n}\n\nasync function callOtpVerify(\n otpId: string, otpCode: string, targetPublicKey: string, organizationId?: string,\n): Promise<{ verificationToken: string }> {\n return authServiceRequest(\"/api/auth/otp-verify\", { otpId, otpCode, targetPublicKey, ...(organizationId && { organizationId }) });\n}\n\nasync function doKeyLogin(): Promise<void> {\n // If user already has credentials with an orgId, just refresh the session\n const existingKey = loadKey();\n if (existingKey?.organizationId) {\n process.stderr.write(\"Refreshing session with existing P-256 key...\\n\");\n const { session, expiry } = await refreshTurnkeySession(\n existingKey.publicKeyHex,\n existingKey.privateKeyDer,\n existingKey.organizationId,\n );\n\n const turnkeyCreds: TurnkeyCredentials = {\n publicKeyHex: existingKey.publicKeyHex,\n privateKeyDer: existingKey.privateKeyDer,\n organizationId: existingKey.organizationId,\n sessionToken: session,\n sessionExpiry: expiry,\n };\n updateConfig({ turnkey: turnkeyCreds });\n\n const config = loadConfig();\n if (!config.turnkey?.evmAddress) {\n await resolveAndStoreAddresses(config.turnkey!);\n }\n\n process.stdout.write(\"Logged in (session refresh).\\n\");\n const updated = loadConfig();\n process.stdout.write(` EVM: ${updated.turnkey?.evmAddress}\\n`);\n process.stdout.write(` Solana: ${updated.turnkey?.solanaAddress}\\n`);\n return;\n }\n\n // Generate or load P-256 key pair\n let keyPair: ReturnType<typeof generateP256KeyPair>;\n const storedKey = loadKey();\n\n if (storedKey?.publicKeyHex && storedKey.privateKeyDer && storedKey.uncompressedPublicKeyHex) {\n keyPair = {\n publicKeyHex: storedKey.publicKeyHex,\n uncompressedPublicKeyHex: storedKey.uncompressedPublicKeyHex,\n privateKeyDer: storedKey.privateKeyDer,\n };\n process.stderr.write(`Using existing key (${keyPair.publicKeyHex.slice(0, 16)}...)\\n`);\n } else {\n keyPair = generateP256KeyPair();\n saveKey({\n publicKeyHex: keyPair.publicKeyHex,\n uncompressedPublicKeyHex: keyPair.uncompressedPublicKeyHex,\n privateKeyDer: keyPair.privateKeyDer,\n });\n process.stderr.write(`Generated new P-256 key pair\\n`);\n }\n\n // Sign timestamp and call auth service\n const timestampMs = Date.now().toString();\n const signature = signTimestamp(timestampMs, keyPair.privateKeyDer);\n\n process.stderr.write(\"Registering with ChainStream...\\n\");\n const result = await callKeyAuth(\n keyPair.publicKeyHex,\n keyPair.uncompressedPublicKeyHex,\n timestampMs,\n signature,\n );\n\n // Save org ID to keystore metadata\n saveKey({\n publicKeyHex: keyPair.publicKeyHex,\n uncompressedPublicKeyHex: keyPair.uncompressedPublicKeyHex,\n privateKeyDer: keyPair.privateKeyDer,\n organizationId: result.orgId,\n });\n\n // Save credentials + addresses to config\n updateConfig({\n turnkey: {\n publicKeyHex: keyPair.publicKeyHex,\n privateKeyDer: keyPair.privateKeyDer,\n organizationId: result.orgId,\n sessionToken: \"\",\n sessionExpiry: 0,\n evmAddress: result.evmAddress,\n solanaAddress: result.solanaAddress,\n },\n });\n\n if (result.isNewUser) {\n process.stdout.write(\"Welcome! Your ChainStream wallet has been created.\\n\");\n } else {\n process.stdout.write(\"Logged in successfully.\\n\");\n }\n process.stdout.write(` EVM: ${result.evmAddress}\\n`);\n process.stdout.write(` Solana: ${result.solanaAddress}\\n`);\n}\n\n// ── Email OTP login (optional, --email flag) ─────────────────────\n\nasync function doEmailLogin(email?: string): Promise<void> {\n if (!email) {\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n email = await rl.question(\"Enter your email: \");\n rl.close();\n if (!email?.trim()) throw new Error(\"Email required.\");\n email = email.trim();\n }\n\n // Step 1: Send OTP via auth-svc (ChainStream branding)\n process.stderr.write(`Sending OTP to ${email}...\\n`);\n const { otpId } = await callOtpInit(email);\n\n // Step 2: Get OTP code\n if (!process.stdin.isTTY) {\n process.stdout.write(JSON.stringify({ otpId, email }) + \"\\n\");\n process.stderr.write(\"Non-interactive mode: complete login with:\\n\");\n process.stderr.write(` chainstream verify --otp-id ${otpId} --code <code> --email ${email}\\n`);\n return;\n }\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n const code = await rl.question(\"Enter OTP code: \");\n rl.close();\n if (!code?.trim()) throw new Error(\"OTP code required.\");\n\n await completeEmailLogin(otpId, code.trim(), email);\n}\n\nasync function completeEmailLogin(otpId: string, code: string, email: string): Promise<void> {\n // Generate P-256 key pair for this device\n const keyPair = generateP256KeyPair();\n\n // Call auth-svc email-login: verifies OTP + finds/creates sub-org\n process.stderr.write(\"Verifying...\\n\");\n const result = await authServiceRequest<{\n orgId: string; evmAddress: string; solanaAddress: string; isNewUser: boolean;\n }>(\"/api/auth/email-login\", {\n otpId, otpCode: code, email,\n publicKeyHex: keyPair.publicKeyHex,\n uncompressedPublicKeyHex: keyPair.uncompressedPublicKeyHex,\n });\n\n // Save key + config\n saveKey({\n publicKeyHex: keyPair.publicKeyHex,\n uncompressedPublicKeyHex: keyPair.uncompressedPublicKeyHex,\n privateKeyDer: keyPair.privateKeyDer,\n organizationId: result.orgId,\n });\n\n updateConfig({\n turnkey: {\n publicKeyHex: keyPair.publicKeyHex,\n privateKeyDer: keyPair.privateKeyDer,\n organizationId: result.orgId,\n sessionToken: \"\",\n sessionExpiry: 0,\n evmAddress: result.evmAddress,\n solanaAddress: result.solanaAddress,\n },\n });\n\n if (result.isNewUser) {\n process.stdout.write(\"Welcome! Your ChainStream wallet has been created.\\n\");\n } else {\n process.stdout.write(\"Logged in successfully.\\n\");\n }\n process.stdout.write(` EVM: ${result.evmAddress}\\n`);\n process.stdout.write(` Solana: ${result.solanaAddress}\\n`);\n}\n\n// ── Bind email (optional, for account recovery) ──────────────────\n\nasync function doBindEmail(email?: string): Promise<void> {\n const config = loadConfig();\n if (!config.turnkey?.organizationId) {\n throw new Error(\"No wallet found. Run 'chainstream login' first.\");\n }\n\n if (!email) {\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n email = await rl.question(\"Enter email to bind: \");\n rl.close();\n if (!email?.trim()) throw new Error(\"Email required.\");\n email = email.trim();\n }\n\n // Step 1: Send OTP to email\n process.stderr.write(`Sending verification code to ${email}...\\n`);\n const { otpId } = await callOtpInit(email);\n\n // Step 2: Get OTP code\n if (!process.stdin.isTTY) {\n process.stdout.write(JSON.stringify({ otpId, email, step: \"verify\" }) + \"\\n\");\n process.stderr.write(\"Non-interactive mode. Complete with:\\n\");\n process.stderr.write(` chainstream bind-email-verify --otp-id ${otpId} --code <code> --email ${email}\\n`);\n return;\n }\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n const code = await rl.question(\"Enter verification code: \");\n rl.close();\n if (!code?.trim()) throw new Error(\"Verification code required.\");\n\n // Step 3: Verify OTP → get verificationToken\n process.stderr.write(\"Verifying...\\n\");\n const { verificationToken } = await callOtpVerify(\n otpId, code.trim(), config.turnkey.publicKeyHex,\n );\n\n // Step 4: Bind email directly via Turnkey (sub-org's own P-256 key)\n process.stderr.write(\"Binding email to wallet...\\n\");\n await updateTurnkeyUserEmail(email, verificationToken, config.turnkey);\n\n process.stdout.write(`Email ${email} bound successfully.\\n`);\n process.stdout.write(\"You can now use 'chainstream login --email' with this email.\\n\");\n}\n","/**\n * P-256 Key Store — persistent key pair storage in ~/.config/chainstream/keys/.\n *\n * Keys are stored independently from config.json so that `logout`\n * (which clears config.turnkey) does not destroy the user's identity.\n *\n * Adapted from openant-cli/src/lib/keystore.ts.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, unlinkSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getConfigDir } from \"./config.js\";\n\nconst KEYS_DIR = join(getConfigDir(), \"keys\");\nconst DEFAULT_PROFILE = \"default\";\n\nfunction ensureKeysDir(): void {\n if (!existsSync(KEYS_DIR)) {\n mkdirSync(KEYS_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\nfunction privatePath(profile: string): string { return join(KEYS_DIR, `${profile}.private`); }\nfunction publicPath(profile: string): string { return join(KEYS_DIR, `${profile}.public`); }\nfunction metaPath(profile: string): string { return join(KEYS_DIR, `${profile}.json`); }\n\nexport interface StoredKeyPair {\n publicKeyHex: string;\n uncompressedPublicKeyHex: string;\n privateKeyDer: string;\n organizationId?: string;\n}\n\nexport function hasKey(profile = DEFAULT_PROFILE): boolean {\n return existsSync(privatePath(profile)) && existsSync(publicPath(profile));\n}\n\nexport function loadKey(profile = DEFAULT_PROFILE): StoredKeyPair | undefined {\n if (!hasKey(profile)) return undefined;\n\n try {\n const privateKeyDer = readFileSync(privatePath(profile), \"utf-8\").trim();\n const publicKeyHex = readFileSync(publicPath(profile), \"utf-8\").trim();\n\n let uncompressedPublicKeyHex = \"\";\n let organizationId: string | undefined;\n\n if (existsSync(metaPath(profile))) {\n const meta = JSON.parse(readFileSync(metaPath(profile), \"utf-8\"));\n uncompressedPublicKeyHex = meta.uncompressedPublicKeyHex ?? \"\";\n organizationId = meta.organizationId;\n }\n\n return { publicKeyHex, uncompressedPublicKeyHex, privateKeyDer, organizationId };\n } catch {\n return undefined;\n }\n}\n\nexport function saveKey(keyPair: StoredKeyPair, profile = DEFAULT_PROFILE): void {\n ensureKeysDir();\n writeFileSync(privatePath(profile), keyPair.privateKeyDer, { mode: 0o600 });\n writeFileSync(publicPath(profile), keyPair.publicKeyHex, { mode: 0o600 });\n writeFileSync(\n metaPath(profile),\n JSON.stringify({\n uncompressedPublicKeyHex: keyPair.uncompressedPublicKeyHex,\n ...(keyPair.organizationId ? { organizationId: keyPair.organizationId } : {}),\n }, null, 2),\n { mode: 0o600 },\n );\n}\n\nexport function updateKeyMeta(organizationId: string, profile = DEFAULT_PROFILE): void {\n if (!existsSync(metaPath(profile))) return;\n try {\n const meta = JSON.parse(readFileSync(metaPath(profile), \"utf-8\"));\n meta.organizationId = organizationId;\n writeFileSync(metaPath(profile), JSON.stringify(meta, null, 2), { mode: 0o600 });\n } catch { /* ignore */ }\n}\n\nexport function deleteKey(profile = DEFAULT_PROFILE): boolean {\n let deleted = false;\n for (const p of [privatePath(profile), publicPath(profile), metaPath(profile)]) {\n if (existsSync(p)) { unlinkSync(p); deleted = true; }\n }\n return deleted;\n}\n\nexport function listProfiles(): string[] {\n if (!existsSync(KEYS_DIR)) return [];\n return readdirSync(KEYS_DIR)\n .filter((f) => f.endsWith(\".private\"))\n .map((f) => f.replace(/\\.private$/, \"\"));\n}\n","import { Command } from \"commander\";\nimport { loadConfig, updateConfig, getWalletMode } from \"../lib/config.js\";\nimport { exitOnError } from \"../lib/output.js\";\n\nexport function registerConfigCommands(program: Command): void {\n const config = program.command(\"config\").description(\"Configuration management\");\n\n config\n .command(\"set\")\n .description(\"Set a configuration value\")\n .requiredOption(\"--key <key>\", \"Config key (apiKey, baseUrl)\")\n .requiredOption(\"--value <value>\", \"Config value\")\n .action((opts) => {\n try {\n const allowedKeys = [\"apiKey\", \"baseUrl\", \"walletChain\", \"plan\"];\n if (!allowedKeys.includes(opts.key)) {\n throw new Error(`Invalid key \"${opts.key}\". Allowed: ${allowedKeys.join(\", \")}`);\n }\n updateConfig({ [opts.key]: opts.value });\n process.stdout.write(`Set ${opts.key} = ${opts.key === \"apiKey\" ? \"***\" : opts.value}\\n`);\n } catch (err) { exitOnError(err); }\n });\n\n config\n .command(\"get\")\n .description(\"Show configuration\")\n .option(\"--key <key>\", \"Specific key to show\")\n .action((opts) => {\n try {\n const cfg = loadConfig();\n if (opts.key) {\n const value = (cfg as unknown as Record<string, unknown>)[opts.key];\n if (value === undefined) {\n process.stdout.write(`${opts.key}: (not set)\\n`);\n } else if (opts.key === \"apiKey\" && typeof value === \"string\") {\n process.stdout.write(`${opts.key}: ${value.slice(0, 8)}...${value.slice(-4)}\\n`);\n } else {\n process.stdout.write(`${opts.key}: ${JSON.stringify(value)}\\n`);\n }\n } else {\n const display = {\n apiKey: cfg.apiKey ? `${cfg.apiKey.slice(0, 8)}...` : undefined,\n baseUrl: cfg.baseUrl,\n walletMode: getWalletMode(cfg),\n turnkey: cfg.turnkey ? { organizationId: cfg.turnkey.organizationId } : undefined,\n rawWallet: cfg.rawWallet ? { chain: cfg.rawWallet.chain } : undefined,\n };\n process.stdout.write(JSON.stringify(display, null, 2) + \"\\n\");\n }\n } catch (err) { exitOnError(err); }\n });\n\n config\n .command(\"auth\")\n .description(\"Show current authentication status\")\n .action(() => {\n try {\n const cfg = loadConfig();\n const mode = getWalletMode(cfg);\n\n if (mode === \"turnkey\") {\n process.stdout.write(`Auth: Turnkey (org: ${cfg.turnkey!.organizationId})\\n`);\n const expiry = new Date(cfg.turnkey!.sessionExpiry * 1000);\n const expired = Date.now() > cfg.turnkey!.sessionExpiry * 1000;\n process.stdout.write(`Session: ${expired ? \"expired\" : \"active\"} (expires: ${expiry.toISOString()})\\n`);\n } else if (mode === \"raw\") {\n process.stdout.write(`Auth: Raw Key (${cfg.rawWallet!.chain})\\n`);\n } else if (cfg.apiKey) {\n process.stdout.write(`Auth: API Key (${cfg.apiKey.slice(0, 8)}...)\\n`);\n } else {\n process.stdout.write(\"Auth: Not configured\\n\");\n process.stdout.write(\" Run: chainstream login # Turnkey wallet\\n\");\n process.stdout.write(\" Run: chainstream config set --key apiKey --value <key> # API key\\n\");\n }\n } catch (err) { exitOnError(err); }\n });\n}\n"],"mappings":";;;;;;;;;;;;AAAA,IAQa,qBAIA,sBAIA,gBAIA,cAIA;AAxBb;AAAA;AAAA;AAQO,IAAM,sBACX,QAAQ,IAAI,uBAAuB;AAG9B,IAAM,uBACX,QAAQ,IAAI,wBAAwB;AAG/B,IAAM,iBACX,QAAQ,IAAI,kBAAkB;AAGzB,IAAM,eACX,QAAQ,IAAI,gBAAgB;AAGvB,IAAM,gBAAgB,OAAO,QAAQ,IAAI,iBAAiB,MAAM;AAAA;AAAA;;;ACxBvE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,YAAY,WAAW,cAAc,qBAAqB;AACnE,SAAS,eAAe;AACxB,SAAS,YAAY;AASd,SAAS,WAAW,OAA8B;AAAE,SAAO,UAAU;AAAQ;AAC7E,SAAS,cAAc,OAA8B;AAAE,SAAO,UAAU;AAAO;AAgC/E,SAAS,eAAuB;AACrC,MAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,cAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,EAC3C;AACA,SAAO;AACT;AAEO,SAAS,aAAqB;AACnC,QAAM,WAAmB;AAAA,IACvB,SAAS;AAAA,EACX;AAEA,MAAI,CAAC,WAAW,WAAW,EAAG,QAAO;AAErC,MAAI;AACF,UAAM,MAAM,aAAa,aAAa,OAAO;AAC7C,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAO,EAAE,GAAG,UAAU,GAAG,OAAO;AAAA,EAClC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,WAAW,QAAsB;AAC/C,eAAa;AACb,gBAAc,aAAa,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,MAAM,OAAO;AAC5E;AAEO,SAAS,aAAa,OAA8B;AACzD,QAAM,UAAU,WAAW;AAC3B,aAAW,EAAE,GAAG,SAAS,GAAG,MAAM,CAAC;AACrC;AAEO,SAAS,cAAc,QAA4B;AACxD,MAAI,OAAO,SAAS,eAAgB,QAAO;AAC3C,MAAI,OAAO,WAAW,IAAK,QAAO;AAClC,SAAO;AACT;AAjFA,IAKM,YACA;AANN;AAAA;AAAA;AAGA;AAEA,IAAM,aAAa,KAAK,QAAQ,GAAG,WAAW,aAAa;AAC3D,IAAM,cAAc,KAAK,YAAY,aAAa;AAAA;AAAA;;;ACa3C,SAAS,WAAW,OAAuC;AAChE,SAAO,UAAU,QAAQ,WAAW;AACtC;AArBA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,2BAA2B;AAEpC,SAAS,SAAS,4BAA4B;AAC9C,SAAS,QAAQ,mBAAmB;AAKpC,SAAS,WAAW,KAAyB;AAC3C,QAAM,WAAW;AACjB,QAAM,OAAO;AACb,QAAM,SAAmB,CAAC,CAAC;AAC3B,aAAW,QAAQ,KAAK;AACtB,QAAI,QAAQ,SAAS,QAAQ,IAAI;AACjC,QAAI,QAAQ,EAAG,OAAM,IAAI,MAAM,6BAA6B,IAAI,EAAE;AAClE,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,eAAS,OAAO,CAAC,IAAI;AACrB,aAAO,CAAC,IAAI,QAAQ;AACpB,gBAAU;AAAA,IACZ;AACA,WAAO,QAAQ,GAAG;AAChB,aAAO,KAAK,QAAQ,GAAI;AACxB,gBAAU;AAAA,IACZ;AAAA,EACF;AACA,aAAW,QAAQ,KAAK;AACtB,QAAI,SAAS,IAAK;AAClB,WAAO,KAAK,CAAC;AAAA,EACf;AACA,SAAO,IAAI,WAAW,OAAO,QAAQ,CAAC;AACxC;AA9BA,IAgCa;AAhCb;AAAA;AAAA;AAKA;AACA;AA0BO,IAAM,eAAN,MAAqC;AAAA,MAC1C;AAAA,MACA;AAAA,MACA;AAAA,MACQ;AAAA,MAER,YAAY,KAAa,OAAqB;AAC5C,aAAK,eAAe;AACpB,aAAK,QAAQ,WAAW,KAAK;AAC7B,aAAK,aAAa;AAElB,YAAI,WAAW,KAAK,YAAY,GAAG;AACjC,gBAAM,MAAO,IAAI,WAAW,IAAI,IAAI,MAAM,KAAK,GAAG;AAClD,gBAAM,UAAU,oBAAoB,GAAG;AACvC,eAAK,UAAU,QAAQ;AAAA,QACzB,OAAO;AACL,gBAAM,UAAU,WAAW,GAAG;AAC9B,gBAAM,UAAU,QAAQ,cAAc,OAAO;AAC7C,eAAK,UAAU,QAAQ,UAAU,SAAS;AAAA,QAC5C;AAAA,MACF;AAAA,MAEA,MAAM,YAAY,SAAkC;AAClD,YAAI,WAAW,KAAK,YAAY,GAAG;AACjC,gBAAM,MAAO,KAAK,WAAW,WAAW,IAAI,IAAI,KAAK,aAAa,KAAK,KAAK,UAAU;AACtF,gBAAM,UAAU,oBAAoB,GAAG;AACvC,iBAAO,QAAQ,YAAY,EAAE,QAAQ,CAAC;AAAA,QACxC;AAEA,cAAM,UAAU,WAAW,KAAK,UAAU;AAC1C,cAAM,eAAe,QAAQ,MAAM,GAAG,EAAE;AACxC,cAAM,cAAc,OAAO,KAAK,oCAAoC,KAAK;AACzE,cAAM,WAAW,OAAO,OAAO,CAAC,aAAa,OAAO,KAAK,YAAY,CAAC,CAAC;AACvE,cAAM,WAAW,OAAO,KAAK,SAAS,OAAO;AAC7C,cAAM,MAAM,YAAY,MAAM,UAAU,EAAE,KAAK,UAAU,QAAQ,OAAO,MAAM,QAAQ,CAAC;AACvF,eAAO,IAAI,SAAS,KAAK;AAAA,MAC3B;AAAA,MAEA,MAAM,gBAAgB,cAAuC;AAC3D,cAAM,UAAU,OAAO,KAAK,cAAc,QAAQ;AAElD,YAAI,CAAC,WAAW,KAAK,YAAY,GAAG;AAClC,gBAAM,KAAK,qBAAqB,YAAY,IAAI,WAAW,OAAO,CAAC;AACnE,gBAAM,UAAU,WAAW,KAAK,UAAU;AAC1C,gBAAM,UAAU,QAAQ,cAAc,OAAO;AAC7C,aAAG,KAAK,CAAC,OAAO,CAAC;AACjB,iBAAO,OAAO,KAAK,GAAG,UAAU,CAAC,EAAE,SAAS,QAAQ;AAAA,QACtD;AAEA,cAAM,MAAO,KAAK,WAAW,WAAW,IAAI,IAAI,KAAK,aAAa,KAAK,KAAK,UAAU;AACtF,cAAM,UAAU,oBAAoB,GAAG;AACvC,cAAM,YAAY,MAAM,QAAQ,gBAAgB,EAAE,MAAM,SAAS,CAAU;AAC3E,eAAO,OAAO,KAAK,UAAU,MAAM,CAAC,GAAG,KAAK,EAAE,SAAS,QAAQ;AAAA,MACjE;AAAA,IACF;AAAA;AAAA;;;ACtFA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,SAAS,YAAY,2BAA2B;AAazC,SAAS,sBAAmC;AACjD,QAAM,EAAE,WAAW,WAAW,IAAI,oBAAoB,MAAM;AAAA,IAC1D,YAAY;AAAA,IACZ,mBAAmB,EAAE,MAAM,QAAQ,QAAQ,MAAM;AAAA,IACjD,oBAAoB,EAAE,MAAM,SAAS,QAAQ,MAAM;AAAA,EACrD,CAAC;AAED,QAAM,SAAS,OAAO,KAAK,SAAS;AACpC,QAAM,oBAAoB,OAAO,SAAS,EAAE;AAC5C,QAAM,IAAI,kBAAkB,SAAS,GAAG,EAAE;AAC1C,QAAM,IAAI,kBAAkB,SAAS,IAAI,EAAE;AAC3C,QAAM,SAAS,EAAE,EAAE,IAAK,MAAM,IAAI,IAAO;AACzC,QAAM,gBAAgB,OAAO,OAAO,CAAC,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,KAAK;AAC9E,QAAM,kBAAkB,OAAO,KAAK,iBAAiB,EAAE,SAAS,KAAK;AAErE,SAAO;AAAA,IACL,cAAc;AAAA,IACd,0BAA0B;AAAA,IAC1B,eAAe,OAAO,KAAK,UAAU,EAAE,SAAS,QAAQ;AAAA,EAC1D;AACF;AAaA,SAAS,iBAAiB,KAAyB;AACjD,QAAM,QAAQ,IAAI,MAAM,GAAG;AAC3B,MAAI,MAAM,WAAW,EAAG,OAAM,IAAI,MAAM,aAAa;AACrD,QAAM,aAAa,MAAM,CAAC,EAAG,QAAQ,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG;AACjE,SAAO,KAAK,MAAM,OAAO,KAAK,YAAY,QAAQ,EAAE,SAAS,OAAO,CAAC;AACvE;AAIO,SAAS,eAAe,MAAc,cAAsB,qBAAqC;AACtG,QAAM,SAAS,WAAW,QAAQ;AAClC,SAAO,OAAO,IAAI;AAClB,SAAO,IAAI;AAEX,QAAM,YAAY,OAAO,KAAK;AAAA,IAC5B,KAAK,OAAO,KAAK,qBAAqB,QAAQ;AAAA,IAC9C,QAAQ;AAAA,IACR,MAAM;AAAA,EACR,CAAC;AAED,QAAM,QAAQ,KAAK,UAAU;AAAA,IAC3B,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,WAAW,UAAU,SAAS,KAAK;AAAA,EACrC,CAAC;AAED,SAAO,OAAO,KAAK,KAAK,EAAE,SAAS,QAAQ,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,EAAE;AACxG;AAEA,eAAsB,eACpB,MAAc,MAA+B,OACjC;AACZ,QAAM,UAAU,KAAK,UAAU,IAAI;AACnC,QAAM,QAAQ,eAAe,SAAS,MAAM,cAAc,MAAM,aAAa;AAE7E,QAAM,MAAM,MAAM,MAAM,GAAG,gBAAgB,GAAG,IAAI,IAAI;AAAA,IACpD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,oBAAoB,WAAW,MAAM;AAAA,IAChE,MAAM;AAAA,EACR,CAAC;AAED,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,UAAM,IAAI,MAAM,sBAAsB,IAAI,MAAM,MAAM,IAAI,EAAE;AAAA,EAC9D;AAEA,SAAO,IAAI,KAAK;AAClB;AAEA,eAAsB,sBACpB,cAAsB,eAAuB,gBAAwB,oBAAoB,KAC3C;AAC9C,QAAM,aAAa,oBAAoB;AAEvC,QAAM,OAAO,KAAK,UAAU;AAAA,IAC1B,MAAM;AAAA,IACN,aAAa,KAAK,IAAI,EAAE,SAAS;AAAA,IACjC;AAAA,IACA,YAAY;AAAA,MACV,iBAAiB,WAAW;AAAA,MAC5B,mBAAmB,OAAO,iBAAiB;AAAA,IAC7C;AAAA,EACF,CAAC;AAED,QAAM,cAAc,eAAe,MAAM,cAAc,aAAa;AAEpE,QAAM,MAAM,MAAM,MAAM,GAAG,gBAAgB,+CAA+C;AAAA,IACxF,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,oBAAoB,WAAW,YAAY;AAAA,IACtE;AAAA,EACF,CAAC;AAED,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,UAAM,IAAI,MAAM,mCAAmC,IAAI,MAAM,MAAM,IAAI,EAAE;AAAA,EAC3E;AAEA,QAAM,OAAO,MAAM,IAAI,KAAK;AAI5B,QAAM,UAAU,KAAK,UAAU,QAAQ,gCAAgC;AACvE,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,iDAAiD;AAE/E,QAAM,UAAU,iBAAiB,OAAO;AACxC,SAAO,EAAE,SAAS,QAAQ,QAAQ,IAAI;AACxC;AASA,eAAsB,uBACpB,OAAe,mBAA2B,OAC3B;AACf,QAAM,YAAY,MAAM,eAErB,+BAA+B;AAAA,IAChC,gBAAgB,MAAM;AAAA,EACxB,GAAG,KAAK;AAER,QAAM,SAAS,UAAU,QAAQ,CAAC,GAAG;AACrC,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,qCAAqC;AAElE,QAAM,eAAe,uCAAuC;AAAA,IAC1D,MAAM;AAAA,IACN,aAAa,KAAK,IAAI,EAAE,SAAS;AAAA,IACjC,gBAAgB,MAAM;AAAA,IACtB,YAAY,EAAE,QAAQ,WAAW,OAAO,kBAAkB;AAAA,EAC5D,GAAG,KAAK;AACV;AASA,eAAsB,mBAAmB,OAA4D;AACnG,QAAM,cAAc,MAAM;AAAA,IACxB;AAAA,IACA,EAAE,gBAAgB,MAAM,eAAe;AAAA,IACvC;AAAA,EACF;AAEA,QAAM,cAAsC,CAAC;AAC7C,aAAW,UAAU,YAAY,WAAW,CAAC,GAAG;AAC9C,UAAM,eAAe,MAAM;AAAA,MACzB;AAAA,MACA,EAAE,gBAAgB,MAAM,gBAAgB,UAAU,OAAO,UAAU,mBAAmB,EAAE,OAAO,MAAM,EAAE;AAAA,MACvG;AAAA,IACF;AACA,eAAW,QAAQ,aAAa,YAAY,CAAC,GAAG;AAC9C,kBAAY,KAAK,IAAI;AAAA,IACvB;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,cAAc,OAA4C;AAC9E,QAAM,WAAW,MAAM,mBAAmB,KAAK;AAC/C,QAAM,MAAM,SAAS,KAAK,OAAK,EAAE,kBAAkB,yBAAyB;AAC5E,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,iCAAiC;AAC3D,SAAO,IAAI;AACb;AAEA,eAAsB,iBAAiB,OAA4C;AACjF,QAAM,WAAW,MAAM,mBAAmB,KAAK;AAC/C,QAAM,MAAM,SAAS,KAAK,OAAK,EAAE,kBAAkB,uBAAuB;AAC1E,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,oCAAoC;AAC9D,SAAO,IAAI;AACb;AAjNA,IAWa;AAXb;AAAA;AAAA;AAWO,IAAM,mBAAmB;AAAA;AAAA;;;ACXhC,IASa;AATb;AAAA;AAAA;AACA;AACA;AACA;AAMO,IAAM,gBAAN,MAAM,eAAgC;AAAA,MAC3C;AAAA,MACA;AAAA,MACA;AAAA,MACQ;AAAA,MAER,YAAY,OAA2B,OAAqB,SAAiB;AAC3E,aAAK,QAAQ;AACb,aAAK,eAAe;AACpB,aAAK,QAAQ,WAAW,KAAK;AAC7B,aAAK,UAAU;AAAA,MACjB;AAAA,MAEA,aAAa,OAAO,OAAiF;AACnG,cAAM,CAAC,SAAS,OAAO,IAAI,MAAM,QAAQ,IAAI;AAAA,UAC3C,cAAc,KAAK;AAAA,UACnB,iBAAiB,KAAK;AAAA,QACxB,CAAC;AACD,eAAO;AAAA,UACL,MAAM,IAAI,eAAc,OAAO,QAAQ,OAAO;AAAA,UAC9C,KAAK,IAAI,eAAc,OAAO,OAAO,OAAO;AAAA,QAC9C;AAAA,MACF;AAAA,MAEA,MAAM,YAAY,SAAkC;AAClD,YAAI;AACJ,YAAI;AAEJ,YAAI,WAAW,KAAK,YAAY,GAAG;AACjC,gBAAM,SAAS;AAAA,EAAiC,QAAQ,MAAM;AAC9D,gBAAM,WAAW,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,OAAO,GAAG,OAAO,KAAK,SAAS,OAAO,CAAC,CAAC;AAC5F,uBAAa,SAAS,SAAS,KAAK;AACpC,yBAAe;AAAA,QACjB,OAAO;AACL,uBAAa,OAAO,KAAK,SAAS,OAAO,EAAE,SAAS,KAAK;AACzD,yBAAe;AAAA,QACjB;AAEA,cAAM,SAAS,MAAM;AAAA,UAGnB;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,aAAa,KAAK,IAAI,EAAE,SAAS;AAAA,YACjC,gBAAgB,KAAK,MAAM;AAAA,YAC3B,YAAY;AAAA,cACV,UAAU,KAAK;AAAA,cACf,SAAS;AAAA,cACT,UAAU;AAAA,cACV;AAAA,YACF;AAAA,UACF;AAAA,UACA,KAAK;AAAA,QACP;AAEA,cAAM,YAAY,OAAO,UAAU,QAAQ;AAC3C,YAAI,CAAC,UAAW,OAAM,IAAI,MAAM,+CAA+C;AAE/E,YAAI,WAAW,KAAK,YAAY,GAAG;AACjC,gBAAM,IAAI,UAAU,MAAM,OAAO,OAAO;AACxC,iBAAO,KAAK,UAAU,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC;AAAA,QAC3C;AACA,eAAO,GAAG,UAAU,CAAC,GAAG,UAAU,CAAC;AAAA,MACrC;AAAA,MAEA,MAAM,gBAAgB,cAAuC;AAC3D,cAAM,UAAU,OAAO,KAAK,cAAc,QAAQ;AAClD,cAAM,cAAc,QAAQ,SAAS,KAAK;AAE1C,cAAM,SAAS,WAAW,KAAK,YAAY,IACvC,8BACA;AAEJ,cAAM,SAAS,MAAM;AAAA,UAGnB;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,aAAa,KAAK,IAAI,EAAE,SAAS;AAAA,YACjC,gBAAgB,KAAK,MAAM;AAAA,YAC3B,YAAY;AAAA,cACV,UAAU,KAAK;AAAA,cACf,qBAAqB;AAAA,cACrB,MAAM;AAAA,YACR;AAAA,UACF;AAAA,UACA,KAAK;AAAA,QACP;AAEA,cAAM,YAAY,OAAO,UAAU,QAAQ,uBAAuB;AAClE,YAAI,CAAC,UAAW,OAAM,IAAI,MAAM,mDAAmD;AAEnF,eAAO,OAAO,KAAK,WAAW,KAAK,EAAE,SAAS,QAAQ;AAAA,MACxD;AAAA,IACF;AAAA;AAAA;;;ACzGA;AAAA;AAAA;AAAA;AAAA;AAMO,SAAS,aAAa,QAAgB,MAA0B;AACrE,MAAI,SAAS,SAAS,OAAO,WAAW;AACtC,WAAO,IAAI,aAAa,OAAO,UAAU,KAAK,OAAO,UAAU,KAAK;AAAA,EACtE;AAEA,MAAI,SAAS,aAAa,OAAO,SAAS;AACxC,UAAM,QAAQ,OAAO,eAAe;AACpC,UAAM,UAAU,WAAW,KAAK,IAAI,OAAO,QAAQ,aAAa,OAAO,QAAQ;AAC/E,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI;AAAA,QACR,WAAW,KAAK;AAAA;AAAA,MAElB;AAAA,IACF;AACA,WAAO,IAAI,cAAc,OAAO,SAAS,OAAO,OAAO;AAAA,EACzD;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,EAGF;AACF;AAKA,eAAsB,0BAA0B,QAAgB,MAG7D;AACD,MAAI,SAAS,SAAS,OAAO,WAAW;AACtC,UAAM,IAAI,IAAI,aAAa,OAAO,UAAU,KAAK,OAAO,UAAU,KAAK;AACvE,WAAO,WAAW,OAAO,UAAU,KAAK,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE;AAAA,EACrE;AAEA,MAAI,SAAS,aAAa,OAAO,SAAS;AACxC,UAAM,UAAU,MAAM,cAAc,OAAO,OAAO,OAAO;AACzD,WAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,QAAQ,IAAI;AAAA,EAChD;AAEA,QAAM,IAAI,MAAM,uBAAuB;AACzC;AAhDA;AAAA;AAAA;AACA;AAEA;AACA;AAAA;AAAA;;;ACJA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,SAAS,kBAAkB;AAC3B,SAAS,4BAA4B;AACrC,SAAS,sBAAsB;AAC/B,SAAS,sBAAsB;AAC/B,SAAS,uBAAAA,4BAA2B;AACpC,SAAS,qBAA6C;AACtD,SAAS,oCAAoC;AAG7C,YAAY,cAAc;AAM1B,SAAS,4BAA4B,OAA2B;AAC9D,QAAM,UAAU,MAAM;AACtB,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,MAAM,cAAc,MAAkJ;AACpK,YAAM,SAAS,cAAc,IAA2C;AACxE,YAAM,SAAS,MAAM;AAAA,QAGnB;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,aAAa,KAAK,IAAI,EAAE,SAAS;AAAA,UACjC,gBAAgB,MAAM;AAAA,UACtB,YAAY;AAAA,YACV,UAAU;AAAA,YACV,SAAS,OAAO,MAAM,CAAC;AAAA,YACvB,UAAU;AAAA,YACV,cAAc;AAAA,UAChB;AAAA,QACF;AAAA,QACA;AAAA,MACF;AACA,YAAM,MAAM,OAAO,UAAU,QAAQ;AACrC,UAAI,CAAC,IAAK,OAAM,IAAI,MAAM,qCAAqC;AAC/D,YAAM,IAAI,IAAI,MAAM,OAAO,OAAO;AAClC,aAAO,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;AAAA,IAC/B;AAAA,EACF;AACF;AAIA,eAAe,kBAAkB,OAA2B,SAA0C;AACpG,QAAM,aAAa,OAAO,KAAK,OAAO,EAAE,SAAS,KAAK;AACtD,QAAM,SAAS,MAAM;AAAA,IAGnB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa,KAAK,IAAI,EAAE,SAAS;AAAA,MACjC,gBAAgB,MAAM;AAAA,MACtB,YAAY;AAAA,QACV,UAAU,MAAM;AAAA,QAChB,SAAS;AAAA,QACT,UAAU;AAAA,QACV,cAAc;AAAA,MAChB;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACA,QAAM,MAAM,OAAO,UAAU,QAAQ;AACrC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,mCAAmC;AAC7D,SAAO,IAAI,WAAW,OAAO,KAAK,IAAI,IAAI,IAAI,GAAG,KAAK,CAAC;AACzD;AAEA,eAAe,0BAA0B,OAA2B;AAClE,QAAM,EAAE,kBAAkB,SAAS,WAAW,IAAI,MAAM,OAAO,aAAa;AAC5E,SAAO,iBAAiB,WAAW,MAAM,aAAc,CAAC;AAC1D;AAEA,SAAS,uBAAuB,OAA2B,YAAqB;AAC9E,QAAM,QAAQ,IAAI,eAAe,YAAqB,EAAE,QAAQ,sCAAsC,CAAC;AACvG,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,MAAM,qBAAqB,aAAqB,qBAAgD;AAC9F,YAAM,UAAU,MAAM,MAAM,qBAAqB,aAAa,mBAA4B;AAC1F,YAAM,UAAU;AAChB,YAAM,QAAQ,QAAQ,QAAQ;AAC9B,YAAM,UAAU,IAAI,WAAW,OAAO,KAAK,OAAO,QAAQ,CAAC;AAC3D,YAAM,WAAW,QAAQ,CAAC;AAC1B,YAAM,eAAe,IAAI,WAAW;AACpC,YAAM,eAAe,QAAQ,MAAM,YAAY;AAC/C,YAAM,MAAM,MAAM,kBAAkB,OAAO,YAAY;AACvD,cAAQ,IAAI,KAAK,IAAI,EAAE;AACvB,cAAQ,QAAQ,cAAc,OAAO,KAAK,OAAO,EAAE,SAAS,QAAQ;AACpE,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAIA,SAASC,YAAW,KAAyB;AAC3C,QAAM,WAAW;AACjB,QAAM,OAAO;AACb,QAAM,SAAmB,CAAC,CAAC;AAC3B,aAAW,QAAQ,KAAK;AACtB,QAAI,QAAQ,SAAS,QAAQ,IAAI;AACjC,QAAI,QAAQ,EAAG,OAAM,IAAI,MAAM,6BAA6B,IAAI,EAAE;AAClE,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,eAAS,OAAO,CAAC,IAAK;AACtB,aAAO,CAAC,IAAI,QAAQ;AACpB,gBAAU;AAAA,IACZ;AACA,WAAO,QAAQ,GAAG;AAChB,aAAO,KAAK,QAAQ,GAAI;AACxB,gBAAU;AAAA,IACZ;AAAA,EACF;AACA,aAAW,QAAQ,KAAK;AACtB,QAAI,SAAS,IAAK;AAClB,WAAO,KAAK,CAAC;AAAA,EACf;AACA,SAAO,IAAI,WAAW,OAAO,QAAQ,CAAC;AACxC;AAIA,eAAsB,aAAa,QAAuC;AACxE,MAAI,WAAY,QAAO;AAEvB,QAAM,SAAS,IAAI,WAAW;AAE9B,MAAI,OAAO,WAAW;AACpB,QAAI,WAAW,OAAO,UAAU,KAAK,GAAG;AACtC,YAAM,MAAO,OAAO,UAAU,IAAI,WAAW,IAAI,IAAI,OAAO,UAAU,MAAM,KAAK,OAAO,UAAU,GAAG;AACrG,YAAM,UAAUD,qBAAoB,GAAG;AACvC,aAAO,SAAS,eAAe,IAAI,eAAe,OAAO,CAAC;AAAA,IAC5D,WAAW,cAAc,OAAO,UAAU,KAAK,GAAG;AAChD,YAAM,UAAUC,YAAW,OAAO,UAAU,GAAG;AAC/C,YAAM,SAAS,MAAM,6BAA6B,IAAI,WAAW,OAAO,CAAU;AAClF,aAAO,SAAS,2CAA2C,IAAI,eAAe,QAAQ,EAAE,QAAQ,sCAAsC,CAAC,CAAC;AAAA,IAC1I;AAAA,EACF,WAAW,OAAO,SAAS,gBAAgB;AACzC,UAAM,iBAAiB,OAAO,eAAe;AAC7C,QAAI,WAAW,cAAc,KAAK,OAAO,QAAQ,YAAY;AAC3D,YAAM,UAAU,4BAA4B,OAAO,OAAO;AAC1D,aAAO,SAAS,eAAe,IAAI,eAAe,OAAgB,CAAC;AAAA,IACrE,WAAW,cAAc,cAAc,KAAK,OAAO,QAAQ,eAAe;AACxE,YAAM,aAAa,MAAM,0BAA0B,OAAO,OAAO;AACjE,YAAM,SAAS,uBAAuB,OAAO,SAAS,UAAU;AAChE,aAAO,SAAS,2CAA2C,MAAe;AAAA,IAC5E;AAAA,EACF;AAEA,eAAa,qBAAqB,OAAO,MAAM;AAC/C,SAAO;AACT;AAgBA,eAAsB,WAAW,SAA2C;AAC1E,QAAM,OAAO,MAAM,MAAM,GAAG,OAAO,eAAe;AAClD,MAAI,CAAC,KAAK,GAAI,OAAM,IAAI,MAAM,0BAA0B,KAAK,MAAM,GAAG;AACtE,SAAO,KAAK,KAAK;AACnB;AAMA,eAAsB,sBAAsB,SAAkC;AAC5E,QAAM,UAAU,MAAM,WAAW,OAAO;AACxC,QAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AAEpE,UAAQ,OAAO,MAAM,8DAA8D;AACnF,UAAQ,OAAO,MAAM,sDAAsD;AAC3E,UAAQ,OAAO,MAAM,kRAAsD;AAE3E,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,IAAI,MAAM,CAAC;AACjB,UAAM,MAAM,OAAO,IAAI,CAAC,EAAE,SAAS,CAAC;AACpC,UAAM,OAAO,EAAE,KAAK,OAAO,EAAE;AAC7B,UAAM,QAAQ,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;AACxC,UAAM,QAAQ,EAAE,YAAY,eAAe,EAAE,SAAS,EAAE,IAAI;AAC5D,UAAM,OAAO,GAAG,EAAE,aAAa;AAC/B,YAAQ,OAAO,MAAM,KAAK,GAAG,IAAI,IAAI,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI;AAAA,CAAI;AAAA,EACtE;AAEA,UAAQ,OAAO,MAAM,IAAI;AACzB,QAAM,KAAc,yBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,QAAM,SAAS,MAAM,GAAG,SAAS,kBAAkB,MAAM,MAAM,KAAK;AACpE,KAAG,MAAM;AAET,QAAM,MAAM,SAAS,OAAO,KAAK,GAAG,EAAE,IAAI;AAC1C,MAAI,MAAM,KAAK,OAAO,MAAM,UAAU,OAAO,MAAM,GAAG,GAAG;AACvD,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AAEA,SAAO,MAAM,GAAG,EAAG;AACrB;AA5NA,IAmBI;AAnBJ;AAAA;AAAA;AAeA;AACA;AAGA,IAAI,aAAkC;AAAA;AAAA;;;ACnBtC,SAAS,eAAe;;;ACCxB;AACA;AACA;AAHA,SAAS,yBAAyB;AAMlC,IAAI,UAAoC;AACxC,IAAI,UAAyB;AAEtB,SAAS,eAAkC;AAChD,MAAI,QAAS,QAAO;AAEpB,QAAM,SAAS,WAAW;AAC1B,QAAM,aAAa,cAAc,MAAM;AAEvC,MAAI,YAAY;AACd,cAAU,aAAa,QAAQ,UAAU;AACzC,cAAU,IAAI,kBAAkB,IAAI;AAAA,MAClC,WAAW,OAAO;AAAA,MAClB,cAAc;AAAA,IAChB,CAAU;AACV,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,QAAQ;AACjB,cAAU,IAAI,kBAAkB,IAAI;AAAA,MAClC,WAAW,OAAO;AAAA,MAClB,QAAQ,OAAO;AAAA,IACjB,CAAC;AACD,WAAO;AAAA,EACT;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,EAKF;AACF;AAEO,SAAS,gBAAmC;AACjD,QAAM,SAAS,WAAW;AAC1B,QAAM,aAAa,cAAc,MAAM;AACvC,MAAI,CAAC,YAAY;AACf,UAAM,IAAI;AAAA,MACR;AAAA,IAGF;AAAA,EACF;AACA,SAAO,aAAa;AACtB;AAUA,eAAsB,oBACpB,IACA,UAAU,OACE;AACZ,MAAI;AACF,WAAO,MAAM,GAAG;AAAA,EAClB,SAAS,KAAc;AACrB,UAAM,cAAc,mBAAmB,GAAG;AAE1C,QAAI,eAAe,CAAC,WAAW,SAAS;AACtC,YAAM,SAAS,WAAW;AAC1B,UAAI,cAAc,mBAAmB,OAAO,SAAS,WAAW;AAGhE,UAAI,OAAO,MAAM;AACf,sBAAc,iBAAiB,aAAa,OAAO,IAAI;AACvD,gBAAQ,OAAO,MAAM,oDAAoD,OAAO,IAAI;AAAA,CAAY;AAAA,MAClG,WAAW,QAAQ,MAAM,OAAO;AAC9B,cAAM,aAAa,MAAM,sBAAsB,OAAO,OAAO;AAC7D,sBAAc,iBAAiB,aAAa,UAAU;AACtD,gBAAQ,OAAO,MAAM,4BAA4B,UAAU;AAAA,CAAY;AAAA,MACzE,OAAO;AACL,gBAAQ,OAAO,MAAM;AAAA,CAAgE;AACrF,gBAAQ,OAAO,MAAM,2BAA2B,WAAW;AAAA,CAAI;AAAA,MACjE;AAEA,YAAM,YAAY,MAAM,aAAa,MAAM;AAC3C,YAAM,OAAO,MAAM,UAAU,WAAW;AAExC,UAAI,KAAK,IAAI;AACX,cAAM,SAAS,MAAM,KAAK,KAAK;AAC/B,gBAAQ,OAAO,MAAM,yCAAyC,OAAO,IAAI,cAAc,OAAO,UAAU;AAAA,CAAK;AAC7G,kBAAU;AACV,qBAAa;AACb,eAAO,oBAAoB,IAAI,IAAI;AAAA,MACrC;AAEA,YAAM,OAAO,MAAM,KAAK,KAAK,EAAE,MAAM,MAAM,EAAE;AAC7C,cAAQ,OAAO,MAAM,kCAAkC,KAAK,MAAM,MAAM,IAAI;AAAA,CAAI;AAAA,IAClF;AAEA,UAAM;AAAA,EACR;AACF;AAEA,SAAS,mBAAmB,KAA+C;AACzE,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAE5C,QAAM,WAAW;AAMjB,QAAM,SAAS,SAAS,UAAU,UAAU,SAAS;AACrD,QAAM,UAAU,SAAS,WAAW;AAEpC,MAAI,WAAW,KAAK;AAClB,UAAM,SAAS,SAAS,UAAU,UAAU,kBAAkB,KACzD,SAAS,UAAU,UAAU,oBAAoB;AACtD,QAAI,QAAQ;AACV,UAAI;AACF,cAAM,UAAU,KAAK,MAAM,OAAO,KAAK,QAAQ,QAAQ,EAAE,SAAS,CAAC;AACnE,eAAO,EAAE,aAAa,QAAQ,UAAU,IAAI;AAAA,MAC9C,QAAQ;AAAA,MAA4B;AAAA,IACtC;AACA,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,QAAQ,SAAS,KAAK,KAAK,QAAQ,SAAS,kBAAkB,KAAK,QAAQ,SAAS,6BAA6B,GAAG;AACtH,WAAO,CAAC;AAAA,EACV;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,SAAiB,MAAwC;AACnF,MAAI,KAAK,aAAa;AACpB,QAAI,KAAK,YAAY,WAAW,MAAM,EAAG,QAAO,KAAK;AACrD,WAAO,GAAG,OAAO,GAAG,KAAK,WAAW;AAAA,EACtC;AACA,SAAO,GAAG,OAAO;AACnB;AAEA,SAAS,iBAAiB,KAAa,MAAsB;AAC3D,MAAI;AACF,UAAM,IAAI,IAAI,IAAI,GAAG;AACrB,MAAE,aAAa,IAAI,QAAQ,IAAI;AAC/B,WAAO,EAAE,SAAS;AAAA,EACpB,QAAQ;AACN,WAAO,IAAI,QAAQ,cAAc,QAAQ,mBAAmB,IAAI,CAAC,EAAE;AAAA,EACrE;AACF;;;AC1JA,IAAM,eAAe,oBAAI,IAAI,CAAC,OAAO,OAAO,KAAK,CAAC;AAClD,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AAEvB,IAAM,eAAuD;AAAA,EAC3D,KAAK;AAAA,IACH,KAAK;AAAA,IACL,MAAM;AAAA,EACR;AAAA,EACA,KAAK;AAAA,IACH,KAAK;AAAA,IACL,MAAM;AAAA,EACR;AAAA,EACA,KAAK;AAAA,IACH,KAAK;AAAA,IACL,MAAM;AAAA,EACR;AACF;AAEO,SAAS,cAAc,OAAwC;AACpE,MAAI,CAAC,aAAa,IAAI,KAAK,GAAG;AAC5B,UAAM,IAAI,MAAM,kBAAkB,KAAK,sBAAsB,CAAC,GAAG,YAAY,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,EAC7F;AACF;AAEO,SAAS,gBAAgB,SAAiB,OAAqB;AACpE,QAAM,QAAQ,UAAU,SAAS,UAAU;AAC3C,QAAM,QAAQ,QAAQ,eAAe,KAAK,OAAO,IAAI,eAAe,KAAK,OAAO;AAChF,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,8BAA8B,KAAK,OAAO,OAAO,GAAG;AAAA,EACtE;AACF;AASO,SAAS,iBAAiB,OAAqB;AACpD,MAAI,QAAQ,QAAS,QAAQ,KAAK;AAChC,UAAM,IAAI,MAAM,qBAAqB,KAAK,+CAA+C;AAAA,EAC3F;AACF;AAEO,SAAS,gBAAgB,eAAuB,OAAuB;AAC5E,QAAM,QAAQ,cAAc,YAAY;AACxC,QAAM,WAAW,aAAa,KAAK,IAAI,KAAK;AAC5C,MAAI,SAAU,QAAO;AACrB,SAAO;AACT;;;ACnDA,IAAM,YAAoC;AAAA,EACxC,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP;AAEO,SAAS,YAAY,MAAe,KAAqB;AAC9D,MAAI,KAAK;AACP,YAAQ,OAAO,MAAM,KAAK,UAAU,IAAI,IAAI,IAAI;AAAA,EAClD,OAAO;AACL,YAAQ,OAAO,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,IAAI;AAAA,EAC3D;AACF;AAEO,SAAS,WAAW,SAAuB;AAChD,UAAQ,OAAO,MAAM,wBAAwB,OAAO;AAAA,CAAI;AAC1D;AAEO,SAAS,YAAY,KAAqB;AAC/C,QAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,aAAW,OAAO;AAClB,MAAI,QAAQ,IAAI,qBAAqB,eAAe,SAAS,IAAI,OAAO;AACtE,YAAQ,OAAO,MAAM,IAAI,QAAQ,IAAI;AAAA,EACvC;AACA,UAAQ,KAAK,CAAC;AAChB;AAEO,SAAS,YAAY,OAAe,QAAwB;AACjE,QAAM,OAAO,UAAU,KAAK,KAAK,UAAU,KAAK;AAChD,SAAO,GAAG,IAAI,GAAG,MAAM;AACzB;;;ACzBO,SAAS,sBAAsBC,UAAwB;AAC5D,QAAM,QAAQA,SAAQ,QAAQ,OAAO,EAAE,YAAY,iCAAiC;AAEpF,QACG,QAAQ,QAAQ,EAChB,YAAY,0BAA0B,EACtC,eAAe,uBAAuB,2CAA2C,EACjF,eAAe,mBAAmB,oBAAoB,EACtD,OAAO,eAAe,eAAe,IAAI,EACzC,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,YAAM,SAAS,aAAa;AAC5B,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,MAAM,OAAO,EAAE,GAAG,KAAK,SAAS,QAAQ,CAAC,KAAK,KAAK,GAAG,OAAO,OAAO,KAAK,KAAK,EAAE,CAAC;AAAA,MAC1F;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,uBAAuB,EACnC,eAAe,mBAAmB,oBAAoB,EACtD,eAAe,uBAAuB,wBAAwB,EAC9D,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,sBAAgB,KAAK,SAAS,KAAK,KAAK;AACxC,YAAM,SAAS,aAAa;AAC5B,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,MAAM,SAAS,KAAK,OAAO,KAAK,OAAO;AAAA,MAChD;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,QACG,QAAQ,UAAU,EAClB,YAAY,yDAAyD,EACrE,eAAe,mBAAmB,oBAAoB,EACtD,eAAe,uBAAuB,wBAAwB,EAC9D,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,sBAAgB,KAAK,SAAS,KAAK,KAAK;AACxC,YAAM,SAAS,aAAa;AAC5B,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,MAAM,YAAY,KAAK,OAAO,KAAK,OAAO;AAAA,MACnD;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,QACG,QAAQ,SAAS,EACjB,YAAY,uBAAuB,EACnC,eAAe,mBAAmB,oBAAoB,EACtD,eAAe,uBAAuB,wBAAwB,EAC9D,OAAO,eAAe,eAAe,IAAI,EACzC,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,sBAAgB,KAAK,SAAS,KAAK,KAAK;AACxC,YAAM,SAAS,aAAa;AAC5B,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,MAAM,cAAc,KAAK,OAAO,KAAK,SAAS,EAAE,OAAO,OAAO,KAAK,KAAK,EAAE,CAAU;AAAA,MAC7F;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,QACG,QAAQ,SAAS,EACjB,YAAY,4BAA4B,EACxC,eAAe,mBAAmB,oBAAoB,EACtD,eAAe,uBAAuB,wBAAwB,EAC9D,eAAe,sBAAsB,gCAAgC,EACrE,OAAO,sBAAsB,2BAA2B,EACxD,OAAO,oBAAoB,yBAAyB,EACpD,OAAO,eAAe,eAAe,KAAK,EAC1C,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,sBAAgB,KAAK,SAAS,KAAK,KAAK;AACxC,YAAM,SAAS,aAAa;AAC5B,YAAM,SAAkC;AAAA,QACtC,YAAY,KAAK;AAAA,QACjB,OAAO,OAAO,KAAK,KAAK;AAAA,MAC1B;AACA,UAAI,KAAK,KAAM,QAAO,OAAO,OAAO,KAAK,IAAI;AAC7C,UAAI,KAAK,GAAI,QAAO,KAAK,OAAO,KAAK,EAAE;AACvC,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,MAAM,WAAW,KAAK,OAAO,KAAK,SAAS,MAAe;AAAA,MACnE;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,QACG,QAAQ,OAAO,EACf,YAAY,iCAAiC,EAC7C,eAAe,mBAAmB,oBAAoB,EACtD,eAAe,uBAAuB,wBAAwB,EAC9D,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,sBAAgB,KAAK,SAAS,KAAK,KAAK;AACxC,YAAM,SAAS,aAAa;AAC5B,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,MAAM,SAAS,KAAK,OAAO,KAAK,OAAO;AAAA,MAChD;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AACL;;;ACzHO,SAAS,uBAAuBC,UAAwB;AAC7D,QAAM,SAASA,SAAQ,QAAQ,QAAQ,EAAE,YAAY,iCAAiC;AAEtF,SACG,QAAQ,UAAU,EAClB,YAAY,yBAAyB,EACrC,eAAe,mBAAmB,oBAAoB,EACtD,eAAe,oBAAoB,qBAAqB,EACxD,OAAO,eAAe,aAAa,EACnC,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,YAAM,SAAS,aAAa;AAC5B,YAAM,SAAkC,CAAC;AACzC,UAAI,KAAK,MAAO,QAAO,QAAQ,OAAO,KAAK,KAAK;AAChD,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,QAAQ,aAAa,KAAK,OAAO,KAAK,UAAU,MAAe;AAAA,MACxE;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,SACG,QAAQ,KAAK,EACb,YAAY,0BAA0B,EACtC,eAAe,mBAAmB,oBAAoB,EACtD,OAAO,eAAe,aAAa,EACnC,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,YAAM,SAAS,aAAa;AAC5B,YAAM,SAAkC,CAAC;AACzC,UAAI,KAAK,MAAO,QAAO,QAAQ,OAAO,KAAK,KAAK;AAChD,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,QAAQ,aAAa,KAAK,OAAO,MAAe;AAAA,MACzD;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,SACG,QAAQ,QAAQ,EAChB,YAAY,mBAAmB,EAC/B,eAAe,mBAAmB,oBAAoB,EACtD,OAAO,qBAAqB,yBAAyB,EACrD,OAAO,eAAe,aAAa,EACnC,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,YAAM,SAAS,aAAa;AAC5B,YAAM,SAAkC,CAAC;AACzC,UAAI,KAAK,MAAO,QAAO,eAAe,KAAK;AAC3C,UAAI,KAAK,MAAO,QAAO,QAAQ,OAAO,KAAK,KAAK;AAChD,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,MAAM,UAAU,KAAK,OAAO,MAAe;AAAA,MACpD;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AACL;;;AC/DA;AACA,YAAYC,eAAc;AAEnB,SAAS,uBAAuBC,UAAwB;AAC7D,QAAM,SAASA,SAAQ,QAAQ,QAAQ,EAAE,YAAY,iCAAiC;AAEtF,SACG,QAAQ,SAAS,EACjB,YAAY,gDAAgD,EAC5D,eAAe,mBAAmB,oBAAoB,EACtD,eAAe,uBAAuB,gBAAgB,EACtD,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,sBAAgB,KAAK,SAAS,KAAK,KAAK;AACxC,YAAM,SAAS,aAAa;AAC5B,YAAM,CAAC,KAAK,UAAU,OAAO,IAAI,MAAM;AAAA,QAAoB,MACzD,QAAQ,IAAI;AAAA,UACV,OAAO,OAAO,OAAO,KAAK,OAAO,KAAK,OAAO;AAAA,UAC7C,OAAO,OAAO,YAAY,KAAK,OAAO,KAAK,OAAO;AAAA,UAClD,OAAO,OAAO,iBAAiB,KAAK,OAAO,KAAK,OAAO;AAAA,QACzD,CAAC;AAAA,MACH;AACA,kBAAY,EAAE,KAAK,UAAU,QAAQ,GAAG,KAAK,GAAG;AAAA,IAClD,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,SACG,QAAQ,KAAK,EACb,YAAY,wBAAwB,EACpC,eAAe,mBAAmB,oBAAoB,EACtD,eAAe,uBAAuB,gBAAgB,EACtD,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,sBAAgB,KAAK,SAAS,KAAK,KAAK;AACxC,YAAM,SAAS,aAAa;AAC5B,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,OAAO,OAAO,KAAK,OAAO,KAAK,OAAO;AAAA,MAC/C;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,SACG,QAAQ,UAAU,EAClB,YAAY,2BAA2B,EACvC,eAAe,mBAAmB,oBAAoB,EACtD,eAAe,uBAAuB,gBAAgB,EACtD,OAAO,eAAe,aAAa,EACnC,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,sBAAgB,KAAK,SAAS,KAAK,KAAK;AACxC,YAAM,SAAS,aAAa;AAC5B,YAAM,SAAkC,CAAC;AACzC,UAAI,KAAK,MAAO,QAAO,QAAQ,OAAO,KAAK,KAAK;AAChD,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,OAAO,iBAAiB,KAAK,OAAO,KAAK,SAAS,MAAe;AAAA,MAC1E;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,SACG,QAAQ,UAAU,EAClB,YAAY,6BAA6B,EACzC,eAAe,mBAAmB,oBAAoB,EACtD,eAAe,uBAAuB,gBAAgB,EACtD,OAAO,eAAe,aAAa,EACnC,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,sBAAgB,KAAK,SAAS,KAAK,KAAK;AACxC,YAAM,SAAS,aAAa;AAC5B,YAAM,SAAkC,CAAC;AACzC,UAAI,KAAK,MAAO,QAAO,QAAQ,OAAO,KAAK,KAAK;AAChD,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,OAAO,mBAAmB,KAAK,OAAO,KAAK,SAAS,MAAe;AAAA,MAC5E;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,SACG,QAAQ,SAAS,EACjB,YAAY,+BAA+B,EAC3C,OAAO,YAAY;AAClB,QAAI;AACF,YAAM,SAAS,WAAW;AAC1B,YAAM,cAAc,MAAM,+DAA4B,cAAc,MAAM;AAC1E,UAAI,eAAe,aAAa,OAAO,SAAS;AAC9C,YAAI,OAAO,QAAQ,cAAc,OAAO,QAAQ,eAAe;AAC7D,cAAI,OAAO,QAAQ,WAAY,SAAQ,OAAO,MAAM,WAAW,OAAO,QAAQ,UAAU;AAAA,CAAI;AAC5F,cAAI,OAAO,QAAQ,cAAe,SAAQ,OAAO,MAAM,WAAW,OAAO,QAAQ,aAAa;AAAA,CAAI;AAAA,QACpG,OAAO;AACL,gBAAM,EAAE,2BAAAC,2BAA0B,IAAI,MAAM;AAC5C,gBAAM,UAAU,MAAMA,2BAA0B,QAAQ,SAAS;AACjE,cAAI,QAAQ,KAAM,SAAQ,OAAO,MAAM,WAAW,QAAQ,KAAK,OAAO;AAAA,CAAI;AAC1E,cAAI,QAAQ,IAAK,SAAQ,OAAO,MAAM,WAAW,QAAQ,IAAI,OAAO;AAAA,CAAI;AAAA,QAC1E;AAAA,MACF,WAAW,OAAO,WAAW;AAC3B,cAAM,EAAE,cAAAC,cAAa,IAAI,MAAM;AAC/B,cAAM,IAAIA,cAAa,QAAQ,KAAK;AACpC,gBAAQ,OAAO,MAAM,GAAG,EAAE,aAAa,YAAY,CAAC,KAAK,EAAE,OAAO;AAAA,CAAI;AAAA,MACxE,OAAO;AACL,gBAAQ,OAAO,MAAM,gDAAgD;AAAA,MACvE;AAAA,IACF,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,SACG,QAAQ,SAAS,EACjB,YAAY,6BAA6B,EACzC,eAAe,mBAAmB,oBAAoB,EACtD,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,YAAM,SAAS,WAAW;AAC1B,YAAM,EAAE,eAAAC,eAAc,IAAI,MAAM;AAChC,YAAM,aAAaA,eAAc,MAAM;AAEvC,UAAI;AACJ,UAAI,eAAe,SAAS,OAAO,WAAW;AAC5C,cAAM,EAAE,cAAAD,cAAa,IAAI,MAAM;AAC/B,kBAAUA,cAAa,QAAQ,KAAK,EAAE;AAAA,MACxC,WAAW,eAAe,aAAa,OAAO,SAAS;AACrD,kBAAU,OAAO,QAAQ;AACzB,YAAI,CAAC,SAAS;AACZ,gBAAM,EAAE,eAAAE,eAAc,IAAI,MAAM;AAChC,oBAAU,MAAMA,eAAc,OAAO,OAAO;AAAA,QAC9C;AAAA,MACF;AACA,UAAI,CAAC,QAAS,OAAM,IAAI,MAAM,8CAA8C;AAE5E,YAAM,SAAS,aAAa;AAC5B,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,OAAO,iBAAiB,KAAK,OAAO,OAAO;AAAA,MACpD;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,SACG,QAAQ,SAAS,EACjB,YAAY,wCAAwC,EACpD,eAAe,mBAAmB,iBAAiB,EACnD,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,YAAM,KAAc,0BAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,cAAQ,OAAO,MAAM,gEAA2D;AAChF,cAAQ,OAAO,MAAM,uDAAuD;AAC5E,YAAM,MAAM,MAAM,GAAG,SAAS,qBAAqB;AACnD,SAAG,MAAM;AAET,UAAI,CAAC,IAAI,KAAK,EAAG,OAAM,IAAI,MAAM,qBAAqB;AAEtD,mBAAa;AAAA,QACX,WAAW,EAAE,KAAK,IAAI,KAAK,GAAG,OAAO,KAAK,MAAM;AAAA,MAClD,CAAC;AACD,cAAQ,OAAO,MAAM,mBAAmB,KAAK,KAAK;AAAA,CAAkD;AAAA,IACtG,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,SACG,QAAQ,SAAS,EACjB,YAAY,iCAAiC,EAC7C,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,YAAM,SAAS,WAAW;AAC1B,YAAM,EAAE,YAAAC,YAAW,IAAI,MAAM;AAC7B,YAAM,QAAQ,MAAMA,YAAW,OAAO,OAAO;AAC7C,kBAAY,OAAO,KAAK,GAAG;AAAA,IAC7B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AACL;;;ACpLO,SAAS,oBAAoBC,UAAwB;AAC1D,QAAM,MAAMA,SAAQ,QAAQ,KAAK,EAAE,YAAY,6BAA6B;AAE5E,MACG,QAAQ,MAAM,EACd,YAAY,2BAA2B,EACvC,eAAe,mBAAmB,oBAAoB,EACtD,eAAe,uBAAuB,mBAAmB,EACzD,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,sBAAgB,KAAK,SAAS,KAAK,KAAK;AACxC,YAAM,SAAS,aAAa;AAC5B,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,IAAI,eAAe,KAAK,OAAO;AAAA,MACxC;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AACL;;;ACrBA,YAAYC,eAAc;AAEnB,SAAS,oBAAoBC,UAAwB;AAC1D,QAAM,MAAMA,SAAQ,QAAQ,KAAK,EAAE,YAAY,qCAAqC;AAEpF,MACG,QAAQ,OAAO,EACf,YAAY,4BAA4B,EACxC,eAAe,mBAAmB,oBAAoB,EACtD,eAAe,wBAAwB,2CAA2C,EAClF,eAAe,yBAAyB,4CAA4C,EACpF,eAAe,qBAAqB,8BAA8B,EAClE,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,YAAM,aAAa,gBAAgB,KAAK,YAAY,KAAK,KAAK;AAC9D,YAAM,cAAc,gBAAgB,KAAK,aAAa,KAAK,KAAK;AAChE,YAAM,SAAS,aAAa;AAC5B,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,IAAI,MAAM,KAAK,OAAO;AAAA,UAC3B,WAAW;AAAA,UACX,YAAY;AAAA,UACZ,QAAQ,KAAK;AAAA,QACf,CAAU;AAAA,MACZ;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,MACG,QAAQ,MAAM,EACd,YAAY,+CAA+C,EAC3D,eAAe,mBAAmB,oBAAoB,EACtD,eAAe,oBAAoB,uBAAuB,EAC1D,eAAe,wBAAwB,2CAA2C,EAClF,eAAe,yBAAyB,4CAA4C,EACpF,eAAe,qBAAqB,8BAA8B,EAClE,OAAO,kBAAkB,uCAAuC,MAAM,EACtE,OAAO,SAAS,yBAAyB,EACzC,OAAO,SAAS,0BAA0B,EAC1C,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,sBAAgB,KAAK,MAAM,KAAK,KAAK;AACrC,UAAI,KAAK,SAAU,kBAAiB,OAAO,KAAK,QAAQ,CAAC;AAEzD,YAAM,aAAa,gBAAgB,KAAK,YAAY,KAAK,KAAK;AAC9D,YAAM,cAAc,gBAAgB,KAAK,aAAa,KAAK,KAAK;AAChE,YAAM,SAAS,cAAc;AAG7B,cAAQ,OAAO,MAAM,qBAAqB;AAC1C,YAAM,QAAQ,MAAM;AAAA,QAAoB,MACtC,OAAO,IAAI,MAAM,KAAK,OAAO;AAAA,UAC3B,WAAW;AAAA,UACX,YAAY;AAAA,UACZ,QAAQ,KAAK;AAAA,QACf,CAAU;AAAA,MACZ;AAGA,cAAQ,OAAO,MAAM,0BAA0B;AAC/C,cAAQ,OAAO,MAAM,iBAAiB,KAAK,KAAK;AAAA,CAAI;AACpD,cAAQ,OAAO,MAAM,iBAAiB,UAAU;AAAA,CAAI;AACpD,cAAQ,OAAO,MAAM,iBAAiB,WAAW;AAAA,CAAI;AACrD,cAAQ,OAAO,MAAM,iBAAiB,KAAK,MAAM;AAAA,CAAI;AACrD,cAAQ,OAAO,MAAM,iBAAiB,KAAK,QAAQ;AAAA,CAAI;AACvD,cAAQ,OAAO,MAAM,iBAAiB,KAAK,UAAU,KAAK,CAAC;AAAA,CAAI;AAC/D,cAAQ,OAAO,MAAM,0BAA0B;AAE/C,UAAI,CAAC,KAAK,KAAK;AACb,cAAM,KAAc,0BAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,cAAM,SAAS,MAAM,GAAG,SAAS,uBAAuB;AACxD,WAAG,MAAM;AACT,YAAI,OAAO,YAAY,MAAM,KAAK;AAChC,kBAAQ,OAAO,MAAM,mBAAmB;AACxC;AAAA,QACF;AAAA,MACF;AAGA,cAAQ,OAAO,MAAM,2BAA2B;AAChD,YAAM,aAAa,MAAM;AAAA,QAAoB,MAC3C,OAAO,IAAI,KAAK,KAAK,OAAO;AAAA,UAC1B,aAAa,KAAK;AAAA,UAClB,WAAW;AAAA,UACX,YAAY;AAAA,UACZ,QAAQ,KAAK;AAAA,UACb,UAAU,OAAO,KAAK,QAAQ;AAAA,QAChC,CAAU;AAAA,MACZ;AAEA,YAAM,EAAE,cAAAC,cAAa,IAAI,MAAM;AAC/B,YAAM,EAAE,YAAAC,aAAY,eAAAC,eAAc,IAAI,MAAM;AAC5C,YAAM,SAASD,YAAW;AAC1B,YAAM,aAAaC,eAAc,MAAM;AACvC,UAAI,CAAC,WAAY,OAAM,IAAI,MAAM,2BAA2B;AAE5D,YAAM,SAASF,cAAa,QAAQ,UAAU;AAC9C,cAAQ,OAAO,MAAM,0BAA0B;AAC/C,YAAM,WAAW,MAAM,OAAO,gBAAgB,WAAW,YAAY;AAGrE,cAAQ,OAAO,MAAM,+BAA+B;AACpD,YAAM,aAAa,MAAM,OAAO,YAAY,KAAK,KAAK,OAAgB;AAAA,QACpE;AAAA,MACF,CAAU;AAEV,UAAI,WAAW,OAAO;AACpB,gBAAQ,OAAO,MAAM,OAAO,WAAW,KAAK;AAAA,CAA2C;AACvF,cAAM,YAAY,MAAM,OAAO,WAAW,WAAW,KAAK;AAC1D,cAAM,SAAS;AAAA,UACb,GAAG;AAAA,UACH,UAAU,YAAY,KAAK,QAAQ,WAAW,aAAc,UAAsC,SAAmB,EAAE;AAAA,QACzH;AACA,oBAAY,QAAQ,KAAK,GAAG;AAAA,MAC9B,OAAO;AACL,cAAM,SAAS;AAAA,UACb,GAAG;AAAA,UACH,UAAU,YAAY,KAAK,OAAO,WAAW,aAAa,EAAE;AAAA,QAC9D;AACA,oBAAY,QAAQ,KAAK,GAAG;AAAA,MAC9B;AAAA,IACF,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,MACG,QAAQ,QAAQ,EAChB,YAAY,uCAAuC,EACnD,eAAe,mBAAmB,oBAAoB,EACtD,eAAe,iBAAiB,YAAY,EAC5C,eAAe,qBAAqB,cAAc,EAClD,eAAe,eAAe,0BAA0B,EACxD,OAAO,yBAAyB,4BAA4B,EAC5D,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,YAAM,SAAS,cAAc;AAC7B,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,IAAI,YAAY,KAAK,OAAO;AAAA,UACjC,MAAM,KAAK;AAAA,UACX,QAAQ,KAAK;AAAA,UACb,KAAK,KAAK;AAAA,UACV,UAAU,KAAK;AAAA,QACjB,CAAU;AAAA,MACZ;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AACL;;;ACvJO,SAAS,oBAAoBG,UAAwB;AAC1D,QAAM,MAAMA,SAAQ,QAAQ,KAAK,EAAE,YAAY,oBAAoB;AAEnE,MACG,QAAQ,QAAQ,EAChB,YAAY,kBAAkB,EAC9B,eAAe,gBAAgB,QAAQ,EACvC,OAAO,UAAU,iCAAiC,EAClD,OAAO,kBAAkB,gCAAgC,OAAO,EAChE,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,YAAM,SAAS,aAAa;AAC5B,UAAI,KAAK,MAAM;AACb,gBAAQ,OAAO,MAAM,mBAAmB,KAAK,EAAE;AAAA,CAAO;AACtD,cAAM,SAAS,MAAM;AAAA,UAAoB,MACvC,OAAO,WAAW,KAAK,IAAI,OAAO,KAAK,OAAO,CAAC;AAAA,QACjD;AACA,oBAAY,QAAQ,KAAK,GAAG;AAAA,MAC9B,OAAO;AACL,cAAM,SAAS,MAAM;AAAA,UAAoB,MACvC,OAAO,IAAI,IAAI,KAAK,EAAE;AAAA,QACxB;AACA,oBAAY,QAAQ,KAAK,GAAG;AAAA,MAC9B;AAAA,IACF,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AACL;;;AC7BA;AADA,SAAS,cAAAC,mBAAkB;;;ACU3B;AAFA,SAAS,cAAAC,aAAY,aAAAC,YAAW,gBAAAC,eAAc,iBAAAC,gBAAe,aAAa,kBAAkB;AAC5F,SAAS,QAAAC,aAAY;AAGrB,IAAM,WAAWA,MAAK,aAAa,GAAG,MAAM;AAC5C,IAAM,kBAAkB;AAExB,SAAS,gBAAsB;AAC7B,MAAI,CAACJ,YAAW,QAAQ,GAAG;AACzB,IAAAC,WAAU,UAAU,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AAAA,EACtD;AACF;AAEA,SAAS,YAAY,SAAyB;AAAE,SAAOG,MAAK,UAAU,GAAG,OAAO,UAAU;AAAG;AAC7F,SAAS,WAAW,SAAyB;AAAE,SAAOA,MAAK,UAAU,GAAG,OAAO,SAAS;AAAG;AAC3F,SAAS,SAAS,SAAyB;AAAE,SAAOA,MAAK,UAAU,GAAG,OAAO,OAAO;AAAG;AAShF,SAAS,OAAO,UAAU,iBAA0B;AACzD,SAAOJ,YAAW,YAAY,OAAO,CAAC,KAAKA,YAAW,WAAW,OAAO,CAAC;AAC3E;AAEO,SAAS,QAAQ,UAAU,iBAA4C;AAC5E,MAAI,CAAC,OAAO,OAAO,EAAG,QAAO;AAE7B,MAAI;AACF,UAAM,gBAAgBE,cAAa,YAAY,OAAO,GAAG,OAAO,EAAE,KAAK;AACvE,UAAM,eAAeA,cAAa,WAAW,OAAO,GAAG,OAAO,EAAE,KAAK;AAErE,QAAI,2BAA2B;AAC/B,QAAI;AAEJ,QAAIF,YAAW,SAAS,OAAO,CAAC,GAAG;AACjC,YAAM,OAAO,KAAK,MAAME,cAAa,SAAS,OAAO,GAAG,OAAO,CAAC;AAChE,iCAA2B,KAAK,4BAA4B;AAC5D,uBAAiB,KAAK;AAAA,IACxB;AAEA,WAAO,EAAE,cAAc,0BAA0B,eAAe,eAAe;AAAA,EACjF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,QAAQ,SAAwB,UAAU,iBAAuB;AAC/E,gBAAc;AACd,EAAAC,eAAc,YAAY,OAAO,GAAG,QAAQ,eAAe,EAAE,MAAM,IAAM,CAAC;AAC1E,EAAAA,eAAc,WAAW,OAAO,GAAG,QAAQ,cAAc,EAAE,MAAM,IAAM,CAAC;AACxE,EAAAA;AAAA,IACE,SAAS,OAAO;AAAA,IAChB,KAAK,UAAU;AAAA,MACb,0BAA0B,QAAQ;AAAA,MAClC,GAAI,QAAQ,iBAAiB,EAAE,gBAAgB,QAAQ,eAAe,IAAI,CAAC;AAAA,IAC7E,GAAG,MAAM,CAAC;AAAA,IACV,EAAE,MAAM,IAAM;AAAA,EAChB;AACF;;;ADnEA;AAIA;AAEA,YAAYE,eAAc;AAE1B,eAAe,yBAAyB,cAAiD;AACvF,UAAQ,OAAO,MAAM,iCAAiC;AACtD,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,QAAQ,IAAI;AAAA,IACpD,cAAc,YAAY;AAAA,IAC1B,iBAAiB,YAAY;AAAA,EAC/B,CAAC;AACD,eAAa;AAAA,IACX,SAAS,EAAE,GAAG,cAAc,YAAY,cAAc;AAAA,EACxD,CAAC;AACH;AAEO,SAAS,qBAAqBC,UAAwB;AAC3D,EAAAA,SACG,QAAQ,OAAO,EACf,YAAY,uDAAuD,EACnE,SAAS,WAAW,6BAA6B,EACjD,OAAO,SAAS,oDAA+C,EAC/D,OAAO,WAAW,iBAAiB,EACnC,OAAO,OAAO,UAA8B,SAA6C;AACxF,QAAI;AACF,UAAI,KAAK,SAAS,UAAU;AAC1B,cAAM,aAAa,QAAQ;AAAA,MAC7B,OAAO;AACL,cAAM,WAAW;AAAA,MACnB;AAAA,IACF,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,EAAAA,SACG,QAAQ,QAAQ,EAChB,YAAY,yCAAyC,EACrD,eAAe,iBAAiB,wBAAwB,EACxD,eAAe,iBAAiB,qBAAqB,EACrD,eAAe,mBAAmB,0BAA0B,EAC5D,OAAO,OAAO,SAAyD;AACtE,QAAI;AACF,YAAM,mBAAmB,KAAK,OAAO,KAAK,MAAM,KAAK,KAAK;AAAA,IAC5D,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,EAAAA,SACG,QAAQ,QAAQ,EAChB,YAAY,sCAAsC,EAClD,OAAO,MAAM;AACZ,UAAM,SAAS,WAAW;AAC1B,QAAI,OAAO,SAAS;AAClB,mBAAa,EAAE,SAAS,OAAU,CAAC;AACnC,cAAQ,OAAO,MAAM,mEAAmE;AACxF,cAAQ,OAAO,MAAM,+CAA+C;AAAA,IACtE,OAAO;AACL,cAAQ,OAAO,MAAM,8BAA8B;AAAA,IACrD;AAAA,EACF,CAAC;AAEH,EAAAA,SACG,QAAQ,YAAY,EACpB,YAAY,qDAAqD,EACjE,SAAS,WAAW,uBAAuB,EAC3C,OAAO,OAAO,aAAsB;AACnC,QAAI;AACF,YAAM,YAAY,QAAQ;AAAA,IAC5B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AACL;AAIA,SAAS,cAAc,aAAqB,qBAAqC;AAC/E,QAAM,SAASC,YAAW,QAAQ;AAClC,SAAO,OAAO,WAAW;AACzB,SAAO,IAAI;AACX,QAAM,MAAM,OAAO,KAAK;AAAA,IACtB,KAAK,OAAO,KAAK,qBAAqB,QAAQ;AAAA,IAC9C,QAAQ;AAAA,IACR,MAAM;AAAA,EACR,CAAC;AACD,SAAO,IAAI,SAAS,KAAK;AAC3B;AASA,eAAe,mBAAsB,MAAc,MAA2C;AAC5F,QAAM,UAAU,WAAW,EAAE,WAAW;AAExC,QAAM,MAAM,MAAM,MAAM,GAAG,OAAO,GAAG,IAAI,IAAI;AAAA,IAC3C,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,IAAI;AAAA,EAC3B,CAAC;AAED,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,QAAI,SAAS;AACb,QAAI;AAAE,eAAS,KAAK,MAAM,IAAI,EAAE,WAAW;AAAA,IAAM,QAAQ;AAAA,IAAe;AACxE,UAAM,IAAI,MAAM,uBAAuB,IAAI,MAAM,MAAM,MAAM,EAAE;AAAA,EACjE;AAEA,SAAO,IAAI,KAAK;AAClB;AAEA,eAAe,YACb,cACA,0BACA,aACA,WAC0B;AAC1B,SAAO,mBAAmB,iBAAiB,EAAE,cAAc,0BAA0B,aAAa,UAAU,CAAC;AAC/G;AAEA,eAAe,YAAY,OAAe,gBAAqD;AAC7F,SAAO,mBAAmB,sBAAsB,EAAE,OAAO,GAAI,kBAAkB,EAAE,eAAe,EAAG,CAAC;AACtG;AAEA,eAAe,cACb,OAAe,SAAiB,iBAAyB,gBACjB;AACxC,SAAO,mBAAmB,wBAAwB,EAAE,OAAO,SAAS,iBAAiB,GAAI,kBAAkB,EAAE,eAAe,EAAG,CAAC;AAClI;AAEA,eAAe,aAA4B;AAEzC,QAAM,cAAc,QAAQ;AAC5B,MAAI,aAAa,gBAAgB;AAC/B,YAAQ,OAAO,MAAM,iDAAiD;AACtE,UAAM,EAAE,SAAS,OAAO,IAAI,MAAM;AAAA,MAChC,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,IACd;AAEA,UAAM,eAAmC;AAAA,MACvC,cAAc,YAAY;AAAA,MAC1B,eAAe,YAAY;AAAA,MAC3B,gBAAgB,YAAY;AAAA,MAC5B,cAAc;AAAA,MACd,eAAe;AAAA,IACjB;AACA,iBAAa,EAAE,SAAS,aAAa,CAAC;AAEtC,UAAM,SAAS,WAAW;AAC1B,QAAI,CAAC,OAAO,SAAS,YAAY;AAC/B,YAAM,yBAAyB,OAAO,OAAQ;AAAA,IAChD;AAEA,YAAQ,OAAO,MAAM,gCAAgC;AACrD,UAAM,UAAU,WAAW;AAC3B,YAAQ,OAAO,MAAM,aAAa,QAAQ,SAAS,UAAU;AAAA,CAAI;AACjE,YAAQ,OAAO,MAAM,aAAa,QAAQ,SAAS,aAAa;AAAA,CAAI;AACpE;AAAA,EACF;AAGA,MAAI;AACJ,QAAM,YAAY,QAAQ;AAE1B,MAAI,WAAW,gBAAgB,UAAU,iBAAiB,UAAU,0BAA0B;AAC5F,cAAU;AAAA,MACR,cAAc,UAAU;AAAA,MACxB,0BAA0B,UAAU;AAAA,MACpC,eAAe,UAAU;AAAA,IAC3B;AACA,YAAQ,OAAO,MAAM,uBAAuB,QAAQ,aAAa,MAAM,GAAG,EAAE,CAAC;AAAA,CAAQ;AAAA,EACvF,OAAO;AACL,cAAU,oBAAoB;AAC9B,YAAQ;AAAA,MACN,cAAc,QAAQ;AAAA,MACtB,0BAA0B,QAAQ;AAAA,MAClC,eAAe,QAAQ;AAAA,IACzB,CAAC;AACD,YAAQ,OAAO,MAAM;AAAA,CAAgC;AAAA,EACvD;AAGA,QAAM,cAAc,KAAK,IAAI,EAAE,SAAS;AACxC,QAAM,YAAY,cAAc,aAAa,QAAQ,aAAa;AAElE,UAAQ,OAAO,MAAM,mCAAmC;AACxD,QAAM,SAAS,MAAM;AAAA,IACnB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF;AAGA,UAAQ;AAAA,IACN,cAAc,QAAQ;AAAA,IACtB,0BAA0B,QAAQ;AAAA,IAClC,eAAe,QAAQ;AAAA,IACvB,gBAAgB,OAAO;AAAA,EACzB,CAAC;AAGD,eAAa;AAAA,IACX,SAAS;AAAA,MACP,cAAc,QAAQ;AAAA,MACtB,eAAe,QAAQ;AAAA,MACvB,gBAAgB,OAAO;AAAA,MACvB,cAAc;AAAA,MACd,eAAe;AAAA,MACf,YAAY,OAAO;AAAA,MACnB,eAAe,OAAO;AAAA,IACxB;AAAA,EACF,CAAC;AAED,MAAI,OAAO,WAAW;AACpB,YAAQ,OAAO,MAAM,sDAAsD;AAAA,EAC7E,OAAO;AACL,YAAQ,OAAO,MAAM,2BAA2B;AAAA,EAClD;AACA,UAAQ,OAAO,MAAM,aAAa,OAAO,UAAU;AAAA,CAAI;AACvD,UAAQ,OAAO,MAAM,aAAa,OAAO,aAAa;AAAA,CAAI;AAC5D;AAIA,eAAe,aAAa,OAA+B;AACzD,MAAI,CAAC,OAAO;AACV,UAAMC,MAAc,0BAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,YAAQ,MAAMA,IAAG,SAAS,oBAAoB;AAC9C,IAAAA,IAAG,MAAM;AACT,QAAI,CAAC,OAAO,KAAK,EAAG,OAAM,IAAI,MAAM,iBAAiB;AACrD,YAAQ,MAAM,KAAK;AAAA,EACrB;AAGA,UAAQ,OAAO,MAAM,kBAAkB,KAAK;AAAA,CAAO;AACnD,QAAM,EAAE,MAAM,IAAI,MAAM,YAAY,KAAK;AAGzC,MAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,YAAQ,OAAO,MAAM,KAAK,UAAU,EAAE,OAAO,MAAM,CAAC,IAAI,IAAI;AAC5D,YAAQ,OAAO,MAAM,8CAA8C;AACnE,YAAQ,OAAO,MAAM,iCAAiC,KAAK,0BAA0B,KAAK;AAAA,CAAI;AAC9F;AAAA,EACF;AAEA,QAAM,KAAc,0BAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,QAAM,OAAO,MAAM,GAAG,SAAS,kBAAkB;AACjD,KAAG,MAAM;AACT,MAAI,CAAC,MAAM,KAAK,EAAG,OAAM,IAAI,MAAM,oBAAoB;AAEvD,QAAM,mBAAmB,OAAO,KAAK,KAAK,GAAG,KAAK;AACpD;AAEA,eAAe,mBAAmB,OAAe,MAAc,OAA8B;AAE3F,QAAM,UAAU,oBAAoB;AAGpC,UAAQ,OAAO,MAAM,gBAAgB;AACrC,QAAM,SAAS,MAAM,mBAElB,yBAAyB;AAAA,IAC1B;AAAA,IAAO,SAAS;AAAA,IAAM;AAAA,IACtB,cAAc,QAAQ;AAAA,IACtB,0BAA0B,QAAQ;AAAA,EACpC,CAAC;AAGD,UAAQ;AAAA,IACN,cAAc,QAAQ;AAAA,IACtB,0BAA0B,QAAQ;AAAA,IAClC,eAAe,QAAQ;AAAA,IACvB,gBAAgB,OAAO;AAAA,EACzB,CAAC;AAED,eAAa;AAAA,IACX,SAAS;AAAA,MACP,cAAc,QAAQ;AAAA,MACtB,eAAe,QAAQ;AAAA,MACvB,gBAAgB,OAAO;AAAA,MACvB,cAAc;AAAA,MACd,eAAe;AAAA,MACf,YAAY,OAAO;AAAA,MACnB,eAAe,OAAO;AAAA,IACxB;AAAA,EACF,CAAC;AAED,MAAI,OAAO,WAAW;AACpB,YAAQ,OAAO,MAAM,sDAAsD;AAAA,EAC7E,OAAO;AACL,YAAQ,OAAO,MAAM,2BAA2B;AAAA,EAClD;AACA,UAAQ,OAAO,MAAM,aAAa,OAAO,UAAU;AAAA,CAAI;AACvD,UAAQ,OAAO,MAAM,aAAa,OAAO,aAAa;AAAA,CAAI;AAC5D;AAIA,eAAe,YAAY,OAA+B;AACxD,QAAM,SAAS,WAAW;AAC1B,MAAI,CAAC,OAAO,SAAS,gBAAgB;AACnC,UAAM,IAAI,MAAM,iDAAiD;AAAA,EACnE;AAEA,MAAI,CAAC,OAAO;AACV,UAAMA,MAAc,0BAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,YAAQ,MAAMA,IAAG,SAAS,uBAAuB;AACjD,IAAAA,IAAG,MAAM;AACT,QAAI,CAAC,OAAO,KAAK,EAAG,OAAM,IAAI,MAAM,iBAAiB;AACrD,YAAQ,MAAM,KAAK;AAAA,EACrB;AAGA,UAAQ,OAAO,MAAM,gCAAgC,KAAK;AAAA,CAAO;AACjE,QAAM,EAAE,MAAM,IAAI,MAAM,YAAY,KAAK;AAGzC,MAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,YAAQ,OAAO,MAAM,KAAK,UAAU,EAAE,OAAO,OAAO,MAAM,SAAS,CAAC,IAAI,IAAI;AAC5E,YAAQ,OAAO,MAAM,wCAAwC;AAC7D,YAAQ,OAAO,MAAM,4CAA4C,KAAK,0BAA0B,KAAK;AAAA,CAAI;AACzG;AAAA,EACF;AAEA,QAAM,KAAc,0BAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,QAAM,OAAO,MAAM,GAAG,SAAS,2BAA2B;AAC1D,KAAG,MAAM;AACT,MAAI,CAAC,MAAM,KAAK,EAAG,OAAM,IAAI,MAAM,6BAA6B;AAGhE,UAAQ,OAAO,MAAM,gBAAgB;AACrC,QAAM,EAAE,kBAAkB,IAAI,MAAM;AAAA,IAClC;AAAA,IAAO,KAAK,KAAK;AAAA,IAAG,OAAO,QAAQ;AAAA,EACrC;AAGA,UAAQ,OAAO,MAAM,8BAA8B;AACnD,QAAM,uBAAuB,OAAO,mBAAmB,OAAO,OAAO;AAErE,UAAQ,OAAO,MAAM,SAAS,KAAK;AAAA,CAAwB;AAC3D,UAAQ,OAAO,MAAM,gEAAgE;AACvF;;;AE7VA;AAGO,SAAS,uBAAuBC,UAAwB;AAC7D,QAAM,SAASA,SAAQ,QAAQ,QAAQ,EAAE,YAAY,0BAA0B;AAE/E,SACG,QAAQ,KAAK,EACb,YAAY,2BAA2B,EACvC,eAAe,eAAe,8BAA8B,EAC5D,eAAe,mBAAmB,cAAc,EAChD,OAAO,CAAC,SAAS;AAChB,QAAI;AACF,YAAM,cAAc,CAAC,UAAU,WAAW,eAAe,MAAM;AAC/D,UAAI,CAAC,YAAY,SAAS,KAAK,GAAG,GAAG;AACnC,cAAM,IAAI,MAAM,gBAAgB,KAAK,GAAG,eAAe,YAAY,KAAK,IAAI,CAAC,EAAE;AAAA,MACjF;AACA,mBAAa,EAAE,CAAC,KAAK,GAAG,GAAG,KAAK,MAAM,CAAC;AACvC,cAAQ,OAAO,MAAM,OAAO,KAAK,GAAG,MAAM,KAAK,QAAQ,WAAW,QAAQ,KAAK,KAAK;AAAA,CAAI;AAAA,IAC1F,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,SACG,QAAQ,KAAK,EACb,YAAY,oBAAoB,EAChC,OAAO,eAAe,sBAAsB,EAC5C,OAAO,CAAC,SAAS;AAChB,QAAI;AACF,YAAM,MAAM,WAAW;AACvB,UAAI,KAAK,KAAK;AACZ,cAAM,QAAS,IAA2C,KAAK,GAAG;AAClE,YAAI,UAAU,QAAW;AACvB,kBAAQ,OAAO,MAAM,GAAG,KAAK,GAAG;AAAA,CAAe;AAAA,QACjD,WAAW,KAAK,QAAQ,YAAY,OAAO,UAAU,UAAU;AAC7D,kBAAQ,OAAO,MAAM,GAAG,KAAK,GAAG,KAAK,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,MAAM,MAAM,EAAE,CAAC;AAAA,CAAI;AAAA,QACjF,OAAO;AACL,kBAAQ,OAAO,MAAM,GAAG,KAAK,GAAG,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,CAAI;AAAA,QAChE;AAAA,MACF,OAAO;AACL,cAAM,UAAU;AAAA,UACd,QAAQ,IAAI,SAAS,GAAG,IAAI,OAAO,MAAM,GAAG,CAAC,CAAC,QAAQ;AAAA,UACtD,SAAS,IAAI;AAAA,UACb,YAAY,cAAc,GAAG;AAAA,UAC7B,SAAS,IAAI,UAAU,EAAE,gBAAgB,IAAI,QAAQ,eAAe,IAAI;AAAA,UACxE,WAAW,IAAI,YAAY,EAAE,OAAO,IAAI,UAAU,MAAM,IAAI;AAAA,QAC9D;AACA,gBAAQ,OAAO,MAAM,KAAK,UAAU,SAAS,MAAM,CAAC,IAAI,IAAI;AAAA,MAC9D;AAAA,IACF,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,SACG,QAAQ,MAAM,EACd,YAAY,oCAAoC,EAChD,OAAO,MAAM;AACZ,QAAI;AACF,YAAM,MAAM,WAAW;AACvB,YAAM,OAAO,cAAc,GAAG;AAE9B,UAAI,SAAS,WAAW;AACtB,gBAAQ,OAAO,MAAM,uBAAuB,IAAI,QAAS,cAAc;AAAA,CAAK;AAC5E,cAAM,SAAS,IAAI,KAAK,IAAI,QAAS,gBAAgB,GAAI;AACzD,cAAM,UAAU,KAAK,IAAI,IAAI,IAAI,QAAS,gBAAgB;AAC1D,gBAAQ,OAAO,MAAM,YAAY,UAAU,YAAY,QAAQ,cAAc,OAAO,YAAY,CAAC;AAAA,CAAK;AAAA,MACxG,WAAW,SAAS,OAAO;AACzB,gBAAQ,OAAO,MAAM,kBAAkB,IAAI,UAAW,KAAK;AAAA,CAAK;AAAA,MAClE,WAAW,IAAI,QAAQ;AACrB,gBAAQ,OAAO,MAAM,kBAAkB,IAAI,OAAO,MAAM,GAAG,CAAC,CAAC;AAAA,CAAQ;AAAA,MACvE,OAAO;AACL,gBAAQ,OAAO,MAAM,wBAAwB;AAC7C,gBAAQ,OAAO,MAAM,uDAAuD;AAC5E,gBAAQ,OAAO,MAAM,uEAAuE;AAAA,MAC9F;AAAA,IACF,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AACL;;;AZlEA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,aAAa,EAClB,QAAQ,OAAO,EACf,YAAY,uEAAkE;AAEjF,sBAAsB,OAAO;AAC7B,uBAAuB,OAAO;AAC9B,uBAAuB,OAAO;AAC9B,oBAAoB,OAAO;AAC3B,oBAAoB,OAAO;AAC3B,oBAAoB,OAAO;AAC3B,qBAAqB,OAAO;AAC5B,uBAAuB,OAAO;AAE9B,QAAQ,WAAW,EAAE,MAAM,CAAC,QAAe;AACzC,UAAQ,OAAO,MAAM,iBAAiB,IAAI,OAAO;AAAA,CAAI;AACrD,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["privateKeyToAccount","bs58Decode","program","program","readline","program","createWalletWithAddresses","createWallet","getWalletMode","getEvmAddress","getPricing","program","readline","program","createWallet","loadConfig","getWalletMode","program","createSign","existsSync","mkdirSync","readFileSync","writeFileSync","join","readline","program","createSign","rl","program"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/constants.ts","../src/lib/config.ts","../src/wallet/types.ts","../src/wallet/raw-wallet.ts","../src/lib/turnkey.ts","../src/wallet/turnkey-wallet.ts","../src/wallet/index.ts","../src/lib/x402.ts","../src/index.ts","../src/lib/client.ts","../src/lib/validate.ts","../src/lib/output.ts","../src/commands/token.ts","../src/commands/market.ts","../src/commands/wallet.ts","../src/commands/kyt.ts","../src/commands/dex.ts","../src/commands/job.ts","../src/commands/auth.ts","../src/lib/keystore.ts","../src/commands/config-cmd.ts"],"sourcesContent":["/**\n * Public constants for the ChainStream CLI.\n *\n * All values can be overridden via environment variables for local development.\n * Production defaults are used when no env var is set.\n */\n\n/** ChainStream API base URL. */\nexport const CHAINSTREAM_API_URL =\n process.env.CHAINSTREAM_API_URL ?? \"https://api.chainstream.io\";\n\n/** ChainStream Auth Service base URL (same domain as API, routed via APISIX). */\nexport const CHAINSTREAM_AUTH_URL =\n process.env.CHAINSTREAM_AUTH_URL ?? \"https://api.chainstream.io\";\n\n/** Solana RPC endpoint. */\nexport const SOLANA_RPC_URL =\n process.env.SOLANA_RPC_URL ?? \"https://api.mainnet-beta.solana.com\";\n\n/** Base (EVM) RPC endpoint. */\nexport const BASE_RPC_URL =\n process.env.BASE_RPC_URL ?? \"https://mainnet.base.org\";\n\n/** Base chain ID (8453 = mainnet). */\nexport const BASE_CHAIN_ID = Number(process.env.BASE_CHAIN_ID ?? \"8453\");\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport { CHAINSTREAM_API_URL } from \"./constants.js\";\n\nconst CONFIG_DIR = join(homedir(), \".config\", \"chainstream\");\nconst CONFIG_FILE = join(CONFIG_DIR, \"config.json\");\n\n/** Payment chain: the specific L1/L2 for x402 USDC payment and SIWX auth. */\nexport type PaymentChain = \"base\" | \"sol\";\n\nexport function isEvmChain(chain: PaymentChain): boolean { return chain === \"base\"; }\nexport function isSolanaChain(chain: PaymentChain): boolean { return chain === \"sol\"; }\n\nexport interface TurnkeyCredentials {\n publicKeyHex: string;\n uncompressedPublicKeyHex?: string;\n privateKeyDer: string;\n organizationId: string;\n sessionToken: string;\n sessionExpiry: number;\n evmAddress?: string;\n solanaAddress?: string;\n}\n\nexport interface RawWalletConfig {\n key: string;\n chain: PaymentChain;\n}\n\nexport interface Config {\n apiKey?: string;\n baseUrl: string;\n authUrl?: string;\n /** Preferred chain for Turnkey SIWX auth + x402 payment */\n walletChain?: PaymentChain;\n /** x402 plan preference (e.g., \"nano\", \"starter\"). If unset, TTY prompts; non-TTY uses server default. */\n plan?: string;\n turnkey?: TurnkeyCredentials;\n rawWallet?: RawWalletConfig;\n}\n\nexport type WalletMode = \"turnkey\" | \"raw\" | undefined;\n\nexport function getConfigDir(): string {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true });\n }\n return CONFIG_DIR;\n}\n\nexport function loadConfig(): Config {\n const defaults: Config = {\n baseUrl: CHAINSTREAM_API_URL,\n };\n\n if (!existsSync(CONFIG_FILE)) return defaults;\n\n try {\n const raw = readFileSync(CONFIG_FILE, \"utf-8\");\n const parsed = JSON.parse(raw) as Partial<Config>;\n return { ...defaults, ...parsed };\n } catch {\n return defaults;\n }\n}\n\nexport function saveConfig(config: Config): void {\n getConfigDir();\n writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport function updateConfig(patch: Partial<Config>): void {\n const current = loadConfig();\n saveConfig({ ...current, ...patch });\n}\n\nexport function getWalletMode(config: Config): WalletMode {\n if (config.turnkey?.organizationId) return \"turnkey\";\n if (config.rawWallet?.key) return \"raw\";\n return undefined;\n}\n","import type { PaymentChain } from \"../lib/config.js\";\n\n/**\n * Wallet interface extending SDK's WalletSigner with transaction signing.\n *\n * `chain` returns SDK-compatible name (\"evm\"/\"solana\") for SIWX auth.\n * `paymentChain` returns our specific chain (\"base\"/\"sol\") for x402/config.\n */\nexport interface Wallet {\n /** SDK-compatible chain name for SIWX: \"evm\" or \"solana\" */\n chain: \"evm\" | \"solana\";\n /** Specific payment chain: \"base\", \"sol\", etc. */\n paymentChain: PaymentChain;\n address: string;\n signMessage(message: string): Promise<string>;\n signTransaction(serializedTx: string): Promise<string>;\n}\n\n/** Map PaymentChain to SDK-compatible chain name */\nexport function toSdkChain(chain: PaymentChain): \"evm\" | \"solana\" {\n return chain === \"sol\" ? \"solana\" : \"evm\";\n}\n","import { privateKeyToAccount } from \"viem/accounts\";\nimport type { Hex } from \"viem\";\nimport { Keypair, VersionedTransaction } from \"@solana/web3.js\";\nimport { sign as ed25519Sign } from \"node:crypto\";\nimport type { Wallet } from \"./types.js\";\nimport { toSdkChain } from \"./types.js\";\nimport { type PaymentChain, isEvmChain } from \"../lib/config.js\";\n\nfunction bs58Decode(str: string): Uint8Array {\n const ALPHABET = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\n const BASE = 58;\n const result: number[] = [0];\n for (const char of str) {\n let carry = ALPHABET.indexOf(char);\n if (carry < 0) throw new Error(`Invalid base58 character: ${char}`);\n for (let j = 0; j < result.length; j++) {\n carry += result[j] * BASE;\n result[j] = carry & 0xff;\n carry >>= 8;\n }\n while (carry > 0) {\n result.push(carry & 0xff);\n carry >>= 8;\n }\n }\n for (const char of str) {\n if (char !== \"1\") break;\n result.push(0);\n }\n return new Uint8Array(result.reverse());\n}\n\nexport class RawKeyWallet implements Wallet {\n chain: \"evm\" | \"solana\";\n paymentChain: PaymentChain;\n address: string;\n private privateKey: string;\n\n constructor(key: string, chain: PaymentChain) {\n this.paymentChain = chain;\n this.chain = toSdkChain(chain);\n this.privateKey = key;\n\n if (isEvmChain(this.paymentChain)) {\n const hex = (key.startsWith(\"0x\") ? key : `0x${key}`) as Hex;\n const account = privateKeyToAccount(hex);\n this.address = account.address;\n } else {\n const decoded = bs58Decode(key);\n const keypair = Keypair.fromSecretKey(decoded);\n this.address = keypair.publicKey.toBase58();\n }\n }\n\n async signMessage(message: string): Promise<string> {\n if (isEvmChain(this.paymentChain)) {\n const hex = (this.privateKey.startsWith(\"0x\") ? this.privateKey : `0x${this.privateKey}`) as Hex;\n const account = privateKeyToAccount(hex);\n return account.signMessage({ message });\n }\n\n const decoded = bs58Decode(this.privateKey);\n const secretKeyRaw = decoded.slice(0, 32);\n const pkcs8Prefix = Buffer.from(\"302e020100300506032b657004220420\", \"hex\");\n const pkcs8Der = Buffer.concat([pkcs8Prefix, Buffer.from(secretKeyRaw)]);\n const msgBytes = Buffer.from(message, \"utf-8\");\n const sig = ed25519Sign(null, msgBytes, { key: pkcs8Der, format: \"der\", type: \"pkcs8\" });\n return sig.toString(\"hex\");\n }\n\n async signTransaction(serializedTx: string): Promise<string> {\n const txBytes = Buffer.from(serializedTx, \"base64\");\n\n if (!isEvmChain(this.paymentChain)) {\n const tx = VersionedTransaction.deserialize(new Uint8Array(txBytes));\n const decoded = bs58Decode(this.privateKey);\n const keypair = Keypair.fromSecretKey(decoded);\n tx.sign([keypair]);\n return Buffer.from(tx.serialize()).toString(\"base64\");\n }\n\n const hex = (this.privateKey.startsWith(\"0x\") ? this.privateKey : `0x${this.privateKey}`) as Hex;\n const account = privateKeyToAccount(hex);\n const signedHex = await account.signTransaction({ type: \"legacy\" } as never);\n return Buffer.from(signedHex.slice(2), \"hex\").toString(\"base64\");\n }\n}\n","/**\n * Turnkey Coordinator API client.\n *\n * Handles P-256 key generation, API stamping, session refresh,\n * email binding, and wallet discovery via the Turnkey REST API.\n * Sub-org creation is handled server-side by auth-svc.\n */\n\nimport { createSign, generateKeyPairSync } from \"node:crypto\";\nimport type { TurnkeyCredentials } from \"./config.js\";\n\nexport const TURNKEY_API_BASE = \"https://api.turnkey.com\";\n\n// ── P-256 Key Pair ───────────────────────────────────────────────\n\nexport interface P256KeyPair {\n publicKeyHex: string;\n uncompressedPublicKeyHex: string;\n privateKeyDer: string;\n}\n\nexport function generateP256KeyPair(): P256KeyPair {\n const { publicKey, privateKey } = generateKeyPairSync(\"ec\", {\n namedCurve: \"prime256v1\",\n publicKeyEncoding: { type: \"spki\", format: \"der\" },\n privateKeyEncoding: { type: \"pkcs8\", format: \"der\" },\n });\n\n const pubBuf = Buffer.from(publicKey);\n const uncompressedBytes = pubBuf.subarray(26);\n const x = uncompressedBytes.subarray(1, 33);\n const y = uncompressedBytes.subarray(33, 65);\n const prefix = y[31]! % 2 === 0 ? 0x02 : 0x03;\n const compressedHex = Buffer.concat([Buffer.from([prefix]), x]).toString(\"hex\");\n const uncompressedHex = Buffer.from(uncompressedBytes).toString(\"hex\");\n\n return {\n publicKeyHex: compressedHex,\n uncompressedPublicKeyHex: uncompressedHex,\n privateKeyDer: Buffer.from(privateKey).toString(\"base64\"),\n };\n}\n\n// ── JWT Decode ───────────────────────────────────────────────────\n\ninterface JwtPayload {\n id: string;\n exp: number;\n contact: string;\n public_key?: string;\n verification_type: string;\n organization_id?: string;\n}\n\nfunction decodeJwtPayload(jwt: string): JwtPayload {\n const parts = jwt.split(\".\");\n if (parts.length !== 3) throw new Error(\"Invalid JWT\");\n const payloadB64 = parts[1]!.replace(/-/g, \"+\").replace(/_/g, \"/\");\n return JSON.parse(Buffer.from(payloadB64, \"base64\").toString(\"utf-8\"));\n}\n\n// ── Turnkey Coordinator API ──────────────────────────────────────\n\nexport function createApiStamp(body: string, publicKeyHex: string, privateKeyDerBase64: string): string {\n const signer = createSign(\"SHA256\");\n signer.update(body);\n signer.end();\n\n const signature = signer.sign({\n key: Buffer.from(privateKeyDerBase64, \"base64\"),\n format: \"der\",\n type: \"pkcs8\",\n });\n\n const stamp = JSON.stringify({\n publicKey: publicKeyHex,\n scheme: \"SIGNATURE_SCHEME_TK_API_P256\",\n signature: signature.toString(\"hex\"),\n });\n\n return Buffer.from(stamp).toString(\"base64\").replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\nexport async function turnkeyRequest<T>(\n path: string, body: Record<string, unknown>, creds: TurnkeyCredentials,\n): Promise<T> {\n const bodyStr = JSON.stringify(body);\n const stamp = createApiStamp(bodyStr, creds.publicKeyHex, creds.privateKeyDer);\n\n const res = await fetch(`${TURNKEY_API_BASE}${path}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"X-Stamp\": stamp },\n body: bodyStr,\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Turnkey API error (${res.status}): ${text}`);\n }\n\n return res.json() as Promise<T>;\n}\n\nexport async function refreshTurnkeySession(\n publicKeyHex: string, privateKeyDer: string, organizationId: string, expirationSeconds = 900,\n): Promise<{ session: string; expiry: number }> {\n const newKeyPair = generateP256KeyPair();\n\n const body = JSON.stringify({\n type: \"ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V2\",\n timestampMs: Date.now().toString(),\n organizationId,\n parameters: {\n targetPublicKey: newKeyPair.uncompressedPublicKeyHex,\n expirationSeconds: String(expirationSeconds),\n },\n });\n\n const stampHeader = createApiStamp(body, publicKeyHex, privateKeyDer);\n\n const res = await fetch(`${TURNKEY_API_BASE}/public/v1/submit/create_read_write_session`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"X-Stamp\": stampHeader },\n body,\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Turnkey session refresh failed (${res.status}): ${text}`);\n }\n\n const data = await res.json() as {\n activity: { result?: { createReadWriteSessionResultV2?: { session?: string } } };\n };\n\n const session = data.activity?.result?.createReadWriteSessionResultV2?.session;\n if (!session) throw new Error(\"Turnkey session refresh: no session in response\");\n\n const payload = decodeJwtPayload(session);\n return { session, expiry: payload.exp };\n}\n\n// ── Email Binding ────────────────────────────────────────────────\n\n/**\n * Bind an email to the Turnkey sub-org user.\n * Requires a verificationToken from OTP verify to prove email ownership.\n * Must be called with the sub-org user's own API key (not parent org).\n */\nexport async function updateTurnkeyUserEmail(\n email: string, verificationToken: string, creds: TurnkeyCredentials,\n): Promise<void> {\n const usersData = await turnkeyRequest<{\n users: Array<{ userId: string }>;\n }>(\"/public/v1/query/list_users\", {\n organizationId: creds.organizationId,\n }, creds);\n\n const userId = usersData.users?.[0]?.userId;\n if (!userId) throw new Error(\"Cannot find Turnkey user in sub-org\");\n\n await turnkeyRequest(\"/public/v1/submit/update_user_email\", {\n type: \"ACTIVITY_TYPE_UPDATE_USER_EMAIL\",\n timestampMs: Date.now().toString(),\n organizationId: creds.organizationId,\n parameters: { userId, userEmail: email, verificationToken },\n }, creds);\n}\n\n// ── Wallet Discovery ─────────────────────────────────────────────\n\ninterface TurnkeyWalletAccount {\n address: string;\n addressFormat: string;\n}\n\nexport async function listWalletAccounts(creds: TurnkeyCredentials): Promise<TurnkeyWalletAccount[]> {\n const walletsData = await turnkeyRequest<{ wallets: Array<{ walletId: string }> }>(\n \"/public/v1/query/list_wallets\",\n { organizationId: creds.organizationId },\n creds,\n );\n\n const allAccounts: TurnkeyWalletAccount[] = [];\n for (const wallet of walletsData.wallets ?? []) {\n const accountsData = await turnkeyRequest<{ accounts: TurnkeyWalletAccount[] }>(\n \"/public/v1/query/list_wallet_accounts\",\n { organizationId: creds.organizationId, walletId: wallet.walletId, paginationOptions: { limit: \"100\" } },\n creds,\n );\n for (const acct of accountsData.accounts ?? []) {\n allAccounts.push(acct);\n }\n }\n return allAccounts;\n}\n\nexport async function getEvmAddress(creds: TurnkeyCredentials): Promise<string> {\n const accounts = await listWalletAccounts(creds);\n const evm = accounts.find(a => a.addressFormat === \"ADDRESS_FORMAT_ETHEREUM\");\n if (!evm) throw new Error(\"No EVM wallet found in Turnkey.\");\n return evm.address;\n}\n\nexport async function getSolanaAddress(creds: TurnkeyCredentials): Promise<string> {\n const accounts = await listWalletAccounts(creds);\n const sol = accounts.find(a => a.addressFormat === \"ADDRESS_FORMAT_SOLANA\");\n if (!sol) throw new Error(\"No Solana wallet found in Turnkey.\");\n return sol.address;\n}\n","import type { Wallet } from \"./types.js\";\nimport { toSdkChain } from \"./types.js\";\nimport { type PaymentChain, type TurnkeyCredentials, isEvmChain } from \"../lib/config.js\";\nimport { turnkeyRequest, getEvmAddress, getSolanaAddress } from \"../lib/turnkey.js\";\n\n/**\n * Turnkey TEE wallet — signs via Turnkey Coordinator API.\n * Private keys never leave the AWS Nitro Enclave.\n */\nexport class TurnkeyWallet implements Wallet {\n chain: \"evm\" | \"solana\";\n paymentChain: PaymentChain;\n address: string;\n private creds: TurnkeyCredentials;\n\n constructor(creds: TurnkeyCredentials, chain: PaymentChain, address: string) {\n this.creds = creds;\n this.paymentChain = chain;\n this.chain = toSdkChain(chain);\n this.address = address;\n }\n\n static async create(creds: TurnkeyCredentials): Promise<{ base: TurnkeyWallet; sol: TurnkeyWallet }> {\n const [evmAddr, solAddr] = await Promise.all([\n getEvmAddress(creds),\n getSolanaAddress(creds),\n ]);\n return {\n base: new TurnkeyWallet(creds, \"base\", evmAddr),\n sol: new TurnkeyWallet(creds, \"sol\", solAddr),\n };\n }\n\n async signMessage(message: string): Promise<string> {\n let payloadHex: string;\n let hashFunction: string;\n\n if (isEvmChain(this.paymentChain)) {\n const prefix = `\\x19Ethereum Signed Message:\\n${message.length}`;\n const prefixed = Buffer.concat([Buffer.from(prefix, \"utf-8\"), Buffer.from(message, \"utf-8\")]);\n payloadHex = prefixed.toString(\"hex\");\n hashFunction = \"HASH_FUNCTION_KECCAK256\";\n } else {\n payloadHex = Buffer.from(message, \"utf-8\").toString(\"hex\");\n hashFunction = \"HASH_FUNCTION_NOT_APPLICABLE\";\n }\n\n const result = await turnkeyRequest<{\n activity: { result?: { signRawPayloadResult?: { r: string; s: string; v: string } } };\n }>(\n \"/public/v1/submit/sign_raw_payload\",\n {\n type: \"ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2\",\n timestampMs: Date.now().toString(),\n organizationId: this.creds.organizationId,\n parameters: {\n signWith: this.address,\n payload: payloadHex,\n encoding: \"PAYLOAD_ENCODING_HEXADECIMAL\",\n hashFunction,\n },\n },\n this.creds,\n );\n\n const sigResult = result.activity?.result?.signRawPayloadResult;\n if (!sigResult) throw new Error(\"Turnkey signMessage: no signature in response\");\n\n if (isEvmChain(this.paymentChain)) {\n const v = sigResult.v === \"00\" ? \"1b\" : \"1c\";\n return `0x${sigResult.r}${sigResult.s}${v}`;\n }\n return `${sigResult.r}${sigResult.s}`;\n }\n\n async signTransaction(serializedTx: string): Promise<string> {\n const txBytes = Buffer.from(serializedTx, \"base64\");\n const unsignedHex = txBytes.toString(\"hex\");\n\n const txType = isEvmChain(this.paymentChain)\n ? \"TRANSACTION_TYPE_ETHEREUM\"\n : \"TRANSACTION_TYPE_SOLANA\";\n\n const result = await turnkeyRequest<{\n activity: { result?: { signTransactionResult?: { signedTransaction: string } } };\n }>(\n \"/public/v1/submit/sign_transaction\",\n {\n type: \"ACTIVITY_TYPE_SIGN_TRANSACTION_V2\",\n timestampMs: Date.now().toString(),\n organizationId: this.creds.organizationId,\n parameters: {\n signWith: this.address,\n unsignedTransaction: unsignedHex,\n type: txType,\n },\n },\n this.creds,\n );\n\n const signedHex = result.activity?.result?.signTransactionResult?.signedTransaction;\n if (!signedHex) throw new Error(\"Turnkey signTransaction: no signed tx in response\");\n\n return Buffer.from(signedHex, \"hex\").toString(\"base64\");\n }\n}\n","import type { Config, WalletMode } from \"../lib/config.js\";\nimport { isEvmChain, isSolanaChain } from \"../lib/config.js\";\nimport type { Wallet } from \"./types.js\";\nimport { RawKeyWallet } from \"./raw-wallet.js\";\nimport { TurnkeyWallet } from \"./turnkey-wallet.js\";\n\nexport function createWallet(config: Config, mode: WalletMode): Wallet {\n if (mode === \"raw\" && config.rawWallet) {\n return new RawKeyWallet(config.rawWallet.key, config.rawWallet.chain);\n }\n\n if (mode === \"turnkey\" && config.turnkey) {\n const chain = config.walletChain ?? \"base\";\n const address = isEvmChain(chain) ? config.turnkey.evmAddress : config.turnkey.solanaAddress;\n if (!address) {\n throw new Error(\n `Turnkey ${chain} address not found in config.\\n` +\n \"Please re-login to resolve addresses: chainstream login\",\n );\n }\n return new TurnkeyWallet(config.turnkey, chain, address);\n }\n\n throw new Error(\n \"No wallet configured. Run:\\n\" +\n \" chainstream login # Create Turnkey wallet\\n\" +\n \" chainstream wallet set-raw # Use raw private key (dev)\",\n );\n}\n\n/**\n * Create wallet with resolved addresses (async, used when address is needed immediately).\n */\nexport async function createWalletWithAddresses(config: Config, mode: WalletMode): Promise<{\n base?: Wallet;\n sol?: Wallet;\n}> {\n if (mode === \"raw\" && config.rawWallet) {\n const w = new RawKeyWallet(config.rawWallet.key, config.rawWallet.chain);\n return isEvmChain(config.rawWallet.chain) ? { base: w } : { sol: w };\n }\n\n if (mode === \"turnkey\" && config.turnkey) {\n const wallets = await TurnkeyWallet.create(config.turnkey);\n return { base: wallets.base, sol: wallets.sol };\n }\n\n throw new Error(\"No wallet configured.\");\n}\n\nexport type { Wallet } from \"./types.js\";\n","/**\n * x402 transparent payment — auto-handles 402 responses.\n *\n * Industry standard (Coinbase, QuickNode, x402-agent-pay):\n * - Agent calls API -> gets 402 -> @x402/fetch auto-pays -> retries -> success\n * - Agent never sees the 402 — payment is completely transparent\n */\n\nimport { x402Client } from \"@x402/core/client\";\nimport { wrapFetchWithPayment } from \"@x402/fetch\";\nimport { ExactEvmScheme } from \"@x402/evm/exact/client\";\nimport { ExactSvmScheme } from \"@x402/svm/exact/client\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { hashTypedData, type Hex, type Address } from \"viem\";\nimport { createKeyPairSignerFromBytes } from \"@solana/kit\";\nimport { type Config, type TurnkeyCredentials, isEvmChain, isSolanaChain } from \"./config.js\";\nimport { turnkeyRequest } from \"./turnkey.js\";\nimport * as readline from \"node:readline/promises\";\n\nlet _x402Fetch: typeof fetch | null = null;\n\n// ── Turnkey EVM (Base) payment signer ────────────────────────────\n\nfunction createTurnkeyPaymentAccount(creds: TurnkeyCredentials) {\n const address = creds.evmAddress! as Address;\n return {\n address,\n type: \"local\" as const,\n source: \"custom\" as const,\n publicKey: \"0x\" as Hex,\n async signTypedData(args: { domain: Record<string, unknown>; types: Record<string, unknown[]>; primaryType: string; message: Record<string, unknown> }): Promise<Hex> {\n const digest = hashTypedData(args as Parameters<typeof hashTypedData>[0]);\n const result = await turnkeyRequest<{\n activity: { result?: { signRawPayloadResult?: { r: string; s: string; v: string } } };\n }>(\n \"/public/v1/submit/sign_raw_payload\",\n {\n type: \"ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2\",\n timestampMs: Date.now().toString(),\n organizationId: creds.organizationId,\n parameters: {\n signWith: address,\n payload: digest.slice(2),\n encoding: \"PAYLOAD_ENCODING_HEXADECIMAL\",\n hashFunction: \"HASH_FUNCTION_NO_OP\",\n },\n },\n creds,\n );\n const sig = result.activity?.result?.signRawPayloadResult;\n if (!sig) throw new Error(\"Turnkey signTypedData: no signature\");\n const v = sig.v === \"00\" ? \"1b\" : \"1c\";\n return `0x${sig.r}${sig.s}${v}` as Hex;\n },\n };\n}\n\n// ── Turnkey Solana payment signer ────────────────────────────────\n\nasync function turnkeySolanaSign(creds: TurnkeyCredentials, payload: Uint8Array): Promise<Uint8Array> {\n const payloadHex = Buffer.from(payload).toString(\"hex\");\n const result = await turnkeyRequest<{\n activity: { result?: { signRawPayloadResult?: { r: string; s: string } } };\n }>(\n \"/public/v1/submit/sign_raw_payload\",\n {\n type: \"ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2\",\n timestampMs: Date.now().toString(),\n organizationId: creds.organizationId,\n parameters: {\n signWith: creds.solanaAddress!,\n payload: payloadHex,\n encoding: \"PAYLOAD_ENCODING_HEXADECIMAL\",\n hashFunction: \"HASH_FUNCTION_NOT_APPLICABLE\",\n },\n },\n creds,\n );\n const sig = result.activity?.result?.signRawPayloadResult;\n if (!sig) throw new Error(\"Turnkey Solana sign: no signature\");\n return new Uint8Array(Buffer.from(sig.r + sig.s, \"hex\"));\n}\n\nasync function createTurnkeySolanaSigner(creds: TurnkeyCredentials) {\n const { createNoopSigner, address: solAddress } = await import(\"@solana/kit\");\n return createNoopSigner(solAddress(creds.solanaAddress!));\n}\n\nfunction createTurnkeySvmScheme(creds: TurnkeyCredentials, noopSigner: unknown) {\n const inner = new ExactSvmScheme(noopSigner as never, { rpcUrl: \"https://api.mainnet-beta.solana.com\" });\n return {\n scheme: \"exact\" as const,\n async createPaymentPayload(x402Version: number, paymentRequirements: unknown): Promise<unknown> {\n const payload = await inner.createPaymentPayload(x402Version, paymentRequirements as never);\n const wrapped = payload as unknown as { payload: { transaction: string } };\n const txB64 = wrapped.payload.transaction;\n const txBytes = new Uint8Array(Buffer.from(txB64, \"base64\"));\n const sigCount = txBytes[0]!;\n const messageStart = 1 + sigCount * 64;\n const messageBytes = txBytes.slice(messageStart);\n const sig = await turnkeySolanaSign(creds, messageBytes);\n txBytes.set(sig, 1 + 64);\n wrapped.payload.transaction = Buffer.from(txBytes).toString(\"base64\");\n return payload;\n },\n };\n}\n\n// ── Base58 decode ────────────────────────────────────────────────\n\nfunction bs58Decode(str: string): Uint8Array {\n const ALPHABET = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\n const BASE = 58;\n const result: number[] = [0];\n for (const char of str) {\n let carry = ALPHABET.indexOf(char);\n if (carry < 0) throw new Error(`Invalid base58 character: ${char}`);\n for (let j = 0; j < result.length; j++) {\n carry += result[j]! * BASE;\n result[j] = carry & 0xff;\n carry >>= 8;\n }\n while (carry > 0) {\n result.push(carry & 0xff);\n carry >>= 8;\n }\n }\n for (const char of str) {\n if (char !== \"1\") break;\n result.push(0);\n }\n return new Uint8Array(result.reverse());\n}\n\n// ── x402 Fetch factory ──────────────────────────────────────────\n\nexport async function getX402Fetch(config: Config): Promise<typeof fetch> {\n if (_x402Fetch) return _x402Fetch;\n\n const client = new x402Client();\n\n if (config.rawWallet) {\n if (isEvmChain(config.rawWallet.chain)) {\n const hex = (config.rawWallet.key.startsWith(\"0x\") ? config.rawWallet.key : `0x${config.rawWallet.key}`) as Hex;\n const account = privateKeyToAccount(hex);\n client.register(\"eip155:8453\", new ExactEvmScheme(account));\n } else if (isSolanaChain(config.rawWallet.chain)) {\n const decoded = bs58Decode(config.rawWallet.key);\n const signer = await createKeyPairSignerFromBytes(new Uint8Array(decoded) as never);\n client.register(\"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\", new ExactSvmScheme(signer, { rpcUrl: \"https://api.mainnet-beta.solana.com\" }));\n }\n } else if (config.turnkey?.organizationId) {\n const preferredChain = config.walletChain ?? \"base\";\n if (isEvmChain(preferredChain) && config.turnkey.evmAddress) {\n const account = createTurnkeyPaymentAccount(config.turnkey);\n client.register(\"eip155:8453\", new ExactEvmScheme(account as never));\n } else if (isSolanaChain(preferredChain) && config.turnkey.solanaAddress) {\n const noopSigner = await createTurnkeySolanaSigner(config.turnkey);\n const scheme = createTurnkeySvmScheme(config.turnkey, noopSigner);\n client.register(\"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\", scheme as never);\n }\n }\n\n _x402Fetch = wrapFetchWithPayment(fetch, client);\n return _x402Fetch;\n}\n\n// ── Pricing & plan selection ────────────────────────────────────\n\ninterface PricingPlan {\n id: number;\n name: string;\n price_usd: number;\n quota_total: number;\n duration_days: number;\n}\n\ninterface PricingResponse {\n plans: PricingPlan[];\n}\n\nexport async function getPricing(baseUrl: string): Promise<PricingResponse> {\n const resp = await fetch(`${baseUrl}/x402/pricing`);\n if (!resp.ok) throw new Error(`Failed to get pricing (${resp.status})`);\n return resp.json() as Promise<PricingResponse>;\n}\n\n/**\n * Interactive plan selection for TTY mode.\n * Fetches pricing, displays table, prompts user to choose.\n */\nexport async function selectPlanInteractive(baseUrl: string): Promise<string> {\n const pricing = await getPricing(baseUrl);\n const plans = pricing.plans.sort((a, b) => a.price_usd - b.price_usd);\n\n process.stderr.write(\"\\n[chainstream] No active subscription. Available plans:\\n\\n\");\n process.stderr.write(\" # Plan Price Quota Duration\\n\");\n process.stderr.write(\" ── ────────── ──────── ──────────────── ────────\\n\");\n\n for (let i = 0; i < plans.length; i++) {\n const p = plans[i]!;\n const num = String(i + 1).padStart(2);\n const name = p.name.padEnd(10);\n const price = `$${p.price_usd}`.padEnd(8);\n const quota = p.quota_total.toLocaleString().padStart(14) + \" CU\";\n const days = `${p.duration_days} days`;\n process.stderr.write(` ${num} ${name} ${price} ${quota} ${days}\\n`);\n }\n\n process.stderr.write(\"\\n\");\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n const answer = await rl.question(`Select plan (1-${plans.length}): `);\n rl.close();\n\n const idx = parseInt(answer.trim(), 10) - 1;\n if (idx < 0 || idx >= plans.length || Number.isNaN(idx)) {\n throw new Error(\"Invalid plan selection. Aborting purchase.\");\n }\n\n return plans[idx]!.name;\n}\n","import { Command } from \"commander\";\nimport { registerTokenCommands } from \"./commands/token.js\";\nimport { registerMarketCommands } from \"./commands/market.js\";\nimport { registerWalletCommands } from \"./commands/wallet.js\";\nimport { registerKytCommands } from \"./commands/kyt.js\";\nimport { registerDexCommands } from \"./commands/dex.js\";\nimport { registerJobCommands } from \"./commands/job.js\";\nimport { registerAuthCommands } from \"./commands/auth.js\";\nimport { registerConfigCommands } from \"./commands/config-cmd.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"chainstream\")\n .version(\"0.1.0\")\n .description(\"ChainStream CLI — on-chain data and DeFi execution for AI agents\");\n\nregisterTokenCommands(program);\nregisterMarketCommands(program);\nregisterWalletCommands(program);\nregisterKytCommands(program);\nregisterDexCommands(program);\nregisterJobCommands(program);\nregisterAuthCommands(program);\nregisterConfigCommands(program);\n\nprogram.parseAsync().catch((err: Error) => {\n process.stderr.write(`[chainstream] ${err.message}\\n`);\n process.exit(1);\n});\n","import { ChainStreamClient } from \"@chainstream-io/sdk\";\nimport { loadConfig, getWalletMode } from \"./config.js\";\nimport { createWallet } from \"../wallet/index.js\";\nimport { getX402Fetch, selectPlanInteractive } from \"./x402.js\";\nimport type { Wallet } from \"../wallet/types.js\";\n\nlet _client: ChainStreamClient | null = null;\nlet _wallet: Wallet | null = null;\n\nexport function createClient(): ChainStreamClient {\n if (_client) return _client;\n\n const config = loadConfig();\n const walletMode = getWalletMode(config);\n\n if (walletMode) {\n _wallet = createWallet(config, walletMode);\n _client = new ChainStreamClient(\"\", {\n serverUrl: config.baseUrl,\n walletSigner: _wallet,\n } as never);\n return _client;\n }\n\n if (config.apiKey) {\n _client = new ChainStreamClient(\"\", {\n serverUrl: config.baseUrl,\n apiKey: config.apiKey,\n });\n return _client;\n }\n\n throw new Error(\n \"Not authenticated. Run one of:\\n\" +\n \" chainstream login # Create Turnkey wallet (no email)\\n\" +\n \" chainstream login --email # Email OTP login\\n\" +\n \" chainstream wallet set-raw # Import private key (dev)\\n\" +\n \" chainstream config set --key apiKey --value <key> # API key only\",\n );\n}\n\nexport function requireWallet(): ChainStreamClient {\n const config = loadConfig();\n const walletMode = getWalletMode(config);\n if (!walletMode) {\n throw new Error(\n \"Wallet required for this operation. Run:\\n\" +\n \" chainstream login # Create Turnkey wallet\\n\" +\n \" chainstream wallet set-raw # Dev: use raw private key\",\n );\n }\n return createClient();\n}\n\n/**\n * Execute an SDK call with automatic x402 payment.\n *\n * Plan selection logic:\n * 1. config.plan is set → use that plan\n * 2. TTY + no config.plan → show plans interactively, let user choose\n * 3. non-TTY + no config.plan → use server's default (from 402 resource URL)\n */\nexport async function callWithAutoPayment<T>(\n fn: () => Promise<T>,\n retried = false,\n): Promise<T> {\n try {\n return await fn();\n } catch (err: unknown) {\n const paymentInfo = extractPaymentInfo(err);\n\n if (paymentInfo && !retried && _wallet) {\n const config = loadConfig();\n let purchaseUrl = resolvePurchaseUrl(config.baseUrl, paymentInfo);\n\n // Plan selection: config > interactive > server default\n if (config.plan) {\n purchaseUrl = replacePlanInUrl(purchaseUrl, config.plan);\n process.stderr.write(`[chainstream] No active subscription. Purchasing ${config.plan} plan...\\n`);\n } else if (process.stdin.isTTY) {\n const chosenPlan = await selectPlanInteractive(config.baseUrl);\n purchaseUrl = replacePlanInUrl(purchaseUrl, chosenPlan);\n process.stderr.write(`[chainstream] Purchasing ${chosenPlan} plan...\\n`);\n } else {\n process.stderr.write(`[chainstream] No active subscription. Purchasing via x402...\\n`);\n process.stderr.write(`[chainstream] Resource: ${purchaseUrl}\\n`);\n }\n\n const x402Fetch = await getX402Fetch(config);\n const resp = await x402Fetch(purchaseUrl);\n\n if (resp.ok) {\n const result = await resp.json() as Record<string, unknown>;\n process.stderr.write(`[chainstream] Subscription activated: ${result.plan} (expires: ${result.expires_at})\\n`);\n _client = null;\n createClient();\n return callWithAutoPayment(fn, true);\n }\n\n const text = await resp.text().catch(() => \"\");\n process.stderr.write(`[chainstream] Purchase failed (${resp.status}): ${text}\\n`);\n }\n\n throw err;\n }\n}\n\nfunction extractPaymentInfo(err: unknown): { resourceUrl?: string } | null {\n if (!err || typeof err !== \"object\") return null;\n\n const axiosErr = err as {\n response?: { status?: number; headers?: Record<string, string>; data?: unknown };\n status?: number;\n message?: string;\n };\n\n const status = axiosErr.response?.status ?? axiosErr.status;\n const message = axiosErr.message ?? \"\";\n\n if (status === 402) {\n const header = axiosErr.response?.headers?.[\"payment-required\"]\n ?? axiosErr.response?.headers?.[\"x-payment-required\"];\n if (header) {\n try {\n const decoded = JSON.parse(Buffer.from(header, \"base64\").toString());\n return { resourceUrl: decoded.resource?.url };\n } catch { /* ignore parse errors */ }\n }\n return {};\n }\n\n if (message.includes(\"402\") || message.includes(\"PAYMENT_REQUIRED\") || message.includes(\"no active x402 subscription\")) {\n return {};\n }\n\n return null;\n}\n\nfunction resolvePurchaseUrl(baseUrl: string, info: { resourceUrl?: string }): string {\n if (info.resourceUrl) {\n if (info.resourceUrl.startsWith(\"http\")) return info.resourceUrl;\n return `${baseUrl}${info.resourceUrl}`;\n }\n return `${baseUrl}/x402/purchase?plan=nano`;\n}\n\nfunction replacePlanInUrl(url: string, plan: string): string {\n try {\n const u = new URL(url);\n u.searchParams.set(\"plan\", plan);\n return u.toString();\n } catch {\n return url.replace(/plan=[^&]+/, `plan=${encodeURIComponent(plan)}`);\n }\n}\n","const VALID_CHAINS = new Set([\"sol\", \"bsc\", \"eth\"]);\nconst SOL_ADDRESS_RE = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/;\nconst EVM_ADDRESS_RE = /^0x[0-9a-fA-F]{40}$/;\n\nconst CURRENCY_MAP: Record<string, Record<string, string>> = {\n sol: {\n SOL: \"So11111111111111111111111111111111111111112\",\n USDC: \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n },\n bsc: {\n BNB: \"0x0000000000000000000000000000000000000000\",\n USDC: \"0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d\",\n },\n eth: {\n ETH: \"0x0000000000000000000000000000000000000000\",\n USDC: \"0xA0b86991c6218b36c1d19d4a2e9eb0ce3606eB48\",\n },\n};\n\nexport function validateChain(chain: string): asserts chain is string {\n if (!VALID_CHAINS.has(chain)) {\n throw new Error(`Invalid chain \"${chain}\". Must be one of: ${[...VALID_CHAINS].join(\", \")}`);\n }\n}\n\nexport function validateAddress(address: string, chain: string): void {\n const isEvm = chain === \"bsc\" || chain === \"eth\";\n const valid = isEvm ? EVM_ADDRESS_RE.test(address) : SOL_ADDRESS_RE.test(address);\n if (!valid) {\n throw new Error(`Invalid address for chain \"${chain}\": \"${address}\"`);\n }\n}\n\nexport function validatePositiveNumber(value: string, label: string): void {\n const n = Number(value);\n if (!Number.isFinite(n) || n <= 0) {\n throw new Error(`Invalid ${label}: \"${value}\". Must be a positive number.`);\n }\n}\n\nexport function validateSlippage(value: number): void {\n if (value < 0.001 || value > 0.5) {\n throw new Error(`Invalid slippage: ${value}. Must be between 0.001 (0.1%) and 0.5 (50%).`);\n }\n}\n\nexport function resolveCurrency(nameOrAddress: string, chain: string): string {\n const upper = nameOrAddress.toUpperCase();\n const resolved = CURRENCY_MAP[chain]?.[upper];\n if (resolved) return resolved;\n return nameOrAddress;\n}\n","const EXPLORERS: Record<string, string> = {\n sol: \"https://solscan.io/tx/\",\n bsc: \"https://bscscan.com/tx/\",\n eth: \"https://etherscan.io/tx/\",\n};\n\nexport function printResult(data: unknown, raw?: boolean): void {\n if (raw) {\n process.stdout.write(JSON.stringify(data) + \"\\n\");\n } else {\n process.stdout.write(JSON.stringify(data, null, 2) + \"\\n\");\n }\n}\n\nexport function printError(message: string): void {\n process.stderr.write(`[chainstream] Error: ${message}\\n`);\n}\n\nexport function exitOnError(err: unknown): never {\n const message = err instanceof Error ? err.message : String(err);\n printError(message);\n if (process.env.CHAINSTREAM_DEBUG && err instanceof Error && err.stack) {\n process.stderr.write(err.stack + \"\\n\");\n }\n process.exit(1);\n}\n\nexport function explorerUrl(chain: string, txHash: string): string {\n const base = EXPLORERS[chain] ?? EXPLORERS[\"eth\"];\n return `${base}${txHash}`;\n}\n","import { Command } from \"commander\";\nimport { createClient, callWithAutoPayment } from \"../lib/client.js\";\nimport { validateChain, validateAddress } from \"../lib/validate.js\";\nimport { printResult, exitOnError } from \"../lib/output.js\";\n\nexport function registerTokenCommands(program: Command): void {\n const token = program.command(\"token\").description(\"Token information and analytics\");\n\n token\n .command(\"search\")\n .description(\"Search tokens by keyword\")\n .requiredOption(\"--keyword <keyword>\", \"Search keyword (name, symbol, or address)\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .option(\"--limit <n>\", \"Max results\", \"20\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.token.search({ q: opts.keyword, chains: [opts.chain], limit: Number(opts.limit) }),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n token\n .command(\"info\")\n .description(\"Get full token detail\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Token contract address\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.token.getToken(opts.chain, opts.address),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n token\n .command(\"security\")\n .description(\"Check token security (honeypot, mint auth, freeze auth)\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Token contract address\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.token.getSecurity(opts.chain, opts.address),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n token\n .command(\"holders\")\n .description(\"Get top token holders\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Token contract address\")\n .option(\"--limit <n>\", \"Max results\", \"20\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.token.getTopHolders(opts.chain, opts.address, { limit: Number(opts.limit) } as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n token\n .command(\"candles\")\n .description(\"Get OHLCV candlestick data\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Token contract address\")\n .requiredOption(\"--resolution <res>\", \"Resolution: 1m/5m/15m/1h/4h/1d\")\n .option(\"--from <timestamp>\", \"Start time (Unix seconds)\")\n .option(\"--to <timestamp>\", \"End time (Unix seconds)\")\n .option(\"--limit <n>\", \"Max candles\", \"100\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const params: Record<string, unknown> = {\n resolution: opts.resolution,\n limit: Number(opts.limit),\n };\n if (opts.from) params.from = Number(opts.from);\n if (opts.to) params.to = Number(opts.to);\n const result = await callWithAutoPayment(() =>\n client.token.getCandles(opts.chain, opts.address, params as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n token\n .command(\"pools\")\n .description(\"Get liquidity pools for a token\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Token contract address\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.token.getPools(opts.chain, opts.address),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { createClient, callWithAutoPayment } from \"../lib/client.js\";\nimport { validateChain } from \"../lib/validate.js\";\nimport { printResult, exitOnError } from \"../lib/output.js\";\n\nexport function registerMarketCommands(program: Command): void {\n const market = program.command(\"market\").description(\"Market data and trending tokens\");\n\n market\n .command(\"trending\")\n .description(\"Get hot/trending tokens\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--duration <dur>\", \"Duration: 1h/6h/24h\")\n .option(\"--limit <n>\", \"Max results\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n const client = createClient();\n const params: Record<string, unknown> = {};\n if (opts.limit) params.limit = Number(opts.limit);\n const result = await callWithAutoPayment(() =>\n client.ranking.getHotTokens(opts.chain, opts.duration, params as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n market\n .command(\"new\")\n .description(\"Get newly created tokens\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .option(\"--limit <n>\", \"Max results\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n const client = createClient();\n const params: Record<string, unknown> = {};\n if (opts.limit) params.limit = Number(opts.limit);\n const result = await callWithAutoPayment(() =>\n client.ranking.getNewTokens(opts.chain, params as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n market\n .command(\"trades\")\n .description(\"Get recent trades\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .option(\"--token <address>\", \"Filter by token address\")\n .option(\"--limit <n>\", \"Max results\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n const client = createClient();\n const params: Record<string, unknown> = {};\n if (opts.token) params.tokenAddress = opts.token;\n if (opts.limit) params.limit = Number(opts.limit);\n const result = await callWithAutoPayment(() =>\n client.trade.getTrades(opts.chain, params as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { createClient, callWithAutoPayment } from \"../lib/client.js\";\nimport { validateChain, validateAddress } from \"../lib/validate.js\";\nimport { printResult, exitOnError } from \"../lib/output.js\";\nimport { loadConfig, updateConfig } from \"../lib/config.js\";\nimport * as readline from \"node:readline/promises\";\n\nexport function registerWalletCommands(program: Command): void {\n const wallet = program.command(\"wallet\").description(\"Wallet analytics and management\");\n\n wallet\n .command(\"profile\")\n .description(\"Wallet profile: PnL + net worth + top holdings\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Wallet address\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const [pnl, netWorth, balance] = await callWithAutoPayment(() =>\n Promise.all([\n client.wallet.getPnl(opts.chain, opts.address),\n client.wallet.getNetWorth(opts.chain, opts.address),\n client.wallet.getTokensBalance(opts.chain, opts.address),\n ]),\n );\n printResult({ pnl, netWorth, balance }, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n wallet\n .command(\"pnl\")\n .description(\"Get wallet PnL details\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Wallet address\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.wallet.getPnl(opts.chain, opts.address),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n wallet\n .command(\"holdings\")\n .description(\"Get wallet token balances\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Wallet address\")\n .option(\"--limit <n>\", \"Max results\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const params: Record<string, unknown> = {};\n if (opts.limit) params.limit = Number(opts.limit);\n const result = await callWithAutoPayment(() =>\n client.wallet.getTokensBalance(opts.chain, opts.address, params as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n wallet\n .command(\"activity\")\n .description(\"Get wallet transfer history\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Wallet address\")\n .option(\"--limit <n>\", \"Max results\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const params: Record<string, unknown> = {};\n if (opts.limit) params.limit = Number(opts.limit);\n const result = await callWithAutoPayment(() =>\n client.wallet.getWalletTransfers(opts.chain, opts.address, params as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n wallet\n .command(\"address\")\n .description(\"Show current wallet addresses\")\n .action(async () => {\n try {\n const config = loadConfig();\n const walletMode = (await import(\"../lib/config.js\")).getWalletMode(config);\n if (walletMode === \"turnkey\" && config.turnkey) {\n if (config.turnkey.evmAddress || config.turnkey.solanaAddress) {\n if (config.turnkey.evmAddress) process.stdout.write(`Base: ${config.turnkey.evmAddress}\\n`);\n if (config.turnkey.solanaAddress) process.stdout.write(`Solana: ${config.turnkey.solanaAddress}\\n`);\n } else {\n const { createWalletWithAddresses } = await import(\"../wallet/index.js\");\n const wallets = await createWalletWithAddresses(config, \"turnkey\");\n if (wallets.base) process.stdout.write(`Base: ${wallets.base.address}\\n`);\n if (wallets.sol) process.stdout.write(`Solana: ${wallets.sol.address}\\n`);\n }\n } else if (config.rawWallet) {\n const { createWallet } = await import(\"../wallet/index.js\");\n const w = createWallet(config, \"raw\");\n process.stdout.write(`${w.paymentChain.toUpperCase()}: ${w.address}\\n`);\n } else {\n process.stdout.write(\"No wallet configured. Run: chainstream login\\n\");\n }\n } catch (err) { exitOnError(err); }\n });\n\n wallet\n .command(\"balance\")\n .description(\"Show current wallet balance\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n const config = loadConfig();\n const { getWalletMode } = await import(\"../lib/config.js\");\n const walletMode = getWalletMode(config);\n\n let address: string | undefined;\n if (walletMode === \"raw\" && config.rawWallet) {\n const { createWallet } = await import(\"../wallet/index.js\");\n address = createWallet(config, \"raw\").address;\n } else if (walletMode === \"turnkey\" && config.turnkey) {\n address = config.turnkey.evmAddress;\n if (!address) {\n const { getEvmAddress } = await import(\"../lib/turnkey.js\");\n address = await getEvmAddress(config.turnkey);\n }\n }\n if (!address) throw new Error(\"No wallet configured. Run: chainstream login\");\n\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.wallet.getTokensBalance(opts.chain, address),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n wallet\n .command(\"set-raw\")\n .description(\"Set raw private key (dev/testing only)\")\n .requiredOption(\"--chain <chain>\", \"Chain: base/sol\")\n .action(async (opts) => {\n try {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n process.stdout.write(\"⚠ WARNING: Raw private key will be stored in plaintext.\\n\");\n process.stdout.write(\" Use Turnkey (chainstream login) for production.\\n\\n\");\n const key = await rl.question(\"Enter private key: \");\n rl.close();\n\n if (!key.trim()) throw new Error(\"Empty key provided.\");\n\n updateConfig({\n rawWallet: { key: key.trim(), chain: opts.chain },\n });\n process.stdout.write(`Raw wallet set (${opts.chain}). Run 'chainstream wallet address' to verify.\\n`);\n } catch (err) { exitOnError(err); }\n });\n\n wallet\n .command(\"pricing\")\n .description(\"Show available x402 quota plans\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n const config = loadConfig();\n const { getPricing } = await import(\"../lib/x402.js\");\n const plans = await getPricing(config.baseUrl);\n printResult(plans, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { createClient, callWithAutoPayment } from \"../lib/client.js\";\nimport { validateChain, validateAddress } from \"../lib/validate.js\";\nimport { printResult, exitOnError } from \"../lib/output.js\";\n\nexport function registerKytCommands(program: Command): void {\n const kyt = program.command(\"kyt\").description(\"KYT address risk assessment\");\n\n kyt\n .command(\"risk\")\n .description(\"Assess address risk score\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Address to assess\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.kyt.getAddressRisk(opts.address),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { createClient, requireWallet, callWithAutoPayment } from \"../lib/client.js\";\nimport { validateChain, validateAddress, validateSlippage, resolveCurrency } from \"../lib/validate.js\";\nimport { printResult, exitOnError, explorerUrl } from \"../lib/output.js\";\nimport * as readline from \"node:readline/promises\";\n\nexport function registerDexCommands(program: Command): void {\n const dex = program.command(\"dex\").description(\"DEX swap, quote, and token creation\");\n\n dex\n .command(\"quote\")\n .description(\"Get swap quote (read-only)\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--input-token <addr>\", \"Input token (address or SOL/ETH/BNB/USDC)\")\n .requiredOption(\"--output-token <addr>\", \"Output token (address or SOL/ETH/BNB/USDC)\")\n .requiredOption(\"--amount <amount>\", \"Input amount (smallest unit)\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n const inputToken = resolveCurrency(opts.inputToken, opts.chain);\n const outputToken = resolveCurrency(opts.outputToken, opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.dex.quote(opts.chain, {\n inputMint: inputToken,\n outputMint: outputToken,\n amount: opts.amount,\n } as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n dex\n .command(\"swap\")\n .description(\"[FINANCIAL] Execute token swap (irreversible)\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--from <address>\", \"Sender wallet address\")\n .requiredOption(\"--input-token <addr>\", \"Input token (address or SOL/ETH/BNB/USDC)\")\n .requiredOption(\"--output-token <addr>\", \"Output token (address or SOL/ETH/BNB/USDC)\")\n .requiredOption(\"--amount <amount>\", \"Input amount (smallest unit)\")\n .option(\"--slippage <n>\", \"Slippage tolerance (e.g. 0.01 = 1%)\", \"0.01\")\n .option(\"--raw\", \"Single-line JSON output\")\n .option(\"--yes\", \"Skip confirmation prompt\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.from, opts.chain);\n if (opts.slippage) validateSlippage(Number(opts.slippage));\n\n const inputToken = resolveCurrency(opts.inputToken, opts.chain);\n const outputToken = resolveCurrency(opts.outputToken, opts.chain);\n const client = requireWallet();\n\n // Phase 1: Quote\n process.stderr.write(\"Fetching quote...\\n\");\n const quote = await callWithAutoPayment(() =>\n client.dex.quote(opts.chain, {\n inputMint: inputToken,\n outputMint: outputToken,\n amount: opts.amount,\n } as never),\n );\n\n // Phase 2: Confirm\n process.stderr.write(\"\\n--- Swap Summary ---\\n\");\n process.stderr.write(`Chain: ${opts.chain}\\n`);\n process.stderr.write(`Input: ${inputToken}\\n`);\n process.stderr.write(`Output: ${outputToken}\\n`);\n process.stderr.write(`Amount: ${opts.amount}\\n`);\n process.stderr.write(`Slippage: ${opts.slippage}\\n`);\n process.stderr.write(`Quote: ${JSON.stringify(quote)}\\n`);\n process.stderr.write(\"--------------------\\n\\n\");\n\n if (!opts.yes) {\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n const answer = await rl.question(\"Confirm swap? (y/N): \");\n rl.close();\n if (answer.toLowerCase() !== \"y\") {\n process.stderr.write(\"Swap cancelled.\\n\");\n return;\n }\n }\n\n // Phase 3: Build + Sign\n process.stderr.write(\"Building transaction...\\n\");\n const swapResult = await callWithAutoPayment(() =>\n client.dex.swap(opts.chain, {\n userAddress: opts.from,\n inputMint: inputToken,\n outputMint: outputToken,\n amount: opts.amount,\n slippage: Number(opts.slippage),\n } as never),\n ) as { serializedTx: string };\n\n const { createWallet } = await import(\"../wallet/index.js\");\n const { loadConfig, getWalletMode } = await import(\"../lib/config.js\");\n const config = loadConfig();\n const walletMode = getWalletMode(config);\n if (!walletMode) throw new Error(\"Wallet required for swap.\");\n\n const wallet = createWallet(config, walletMode);\n process.stderr.write(\"Signing transaction...\\n\");\n const signedTx = await wallet.signTransaction(swapResult.serializedTx);\n\n // Phase 4: Broadcast + Poll\n process.stderr.write(\"Broadcasting transaction...\\n\");\n const sendResult = await client.transaction.send(opts.chain as never, {\n signedTx,\n } as never) as { signature?: string; jobId?: string };\n\n if (sendResult.jobId) {\n process.stderr.write(`Job ${sendResult.jobId} submitted. Waiting for confirmation...\\n`);\n const jobResult = await client.waitForJob(sendResult.jobId);\n const result = {\n ...jobResult as Record<string, unknown>,\n explorer: explorerUrl(opts.chain, (sendResult.signature ?? (jobResult as Record<string, unknown>).hash as string) || \"\"),\n };\n printResult(result, opts.raw);\n } else {\n const result = {\n ...sendResult,\n explorer: explorerUrl(opts.chain, sendResult.signature ?? \"\"),\n };\n printResult(result, opts.raw);\n }\n } catch (err) { exitOnError(err); }\n });\n\n dex\n .command(\"create\")\n .description(\"[FINANCIAL] Create token on launchpad\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--name <name>\", \"Token name\")\n .requiredOption(\"--symbol <symbol>\", \"Token symbol\")\n .requiredOption(\"--uri <uri>\", \"Metadata URI (IPFS/HTTP)\")\n .option(\"--platform <platform>\", \"Launchpad: pumpfun/raydium\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n const client = requireWallet();\n const result = await callWithAutoPayment(() =>\n client.dex.createToken(opts.chain, {\n name: opts.name,\n symbol: opts.symbol,\n uri: opts.uri,\n platform: opts.platform,\n } as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { createClient, callWithAutoPayment } from \"../lib/client.js\";\nimport { printResult, exitOnError } from \"../lib/output.js\";\n\nexport function registerJobCommands(program: Command): void {\n const job = program.command(\"job\").description(\"Job status polling\");\n\n job\n .command(\"status\")\n .description(\"Check job status\")\n .requiredOption(\"--id <jobId>\", \"Job ID\")\n .option(\"--wait\", \"Wait for job completion via SSE\")\n .option(\"--timeout <ms>\", \"Wait timeout in milliseconds\", \"60000\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n const client = createClient();\n if (opts.wait) {\n process.stderr.write(`Waiting for job ${opts.id}...\\n`);\n const result = await callWithAutoPayment(() =>\n client.waitForJob(opts.id, Number(opts.timeout)),\n );\n printResult(result, opts.raw);\n } else {\n const result = await callWithAutoPayment(() =>\n client.job.get(opts.id),\n );\n printResult(result, opts.raw);\n }\n } catch (err) { exitOnError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { createSign } from \"node:crypto\";\nimport { loadConfig, updateConfig, type TurnkeyCredentials } from \"../lib/config.js\";\nimport { loadKey, saveKey, hasKey } from \"../lib/keystore.js\";\nimport {\n generateP256KeyPair, refreshTurnkeySession,\n getEvmAddress, getSolanaAddress, updateTurnkeyUserEmail,\n} from \"../lib/turnkey.js\";\nimport { CHAINSTREAM_AUTH_URL } from \"../lib/constants.js\";\nimport { exitOnError } from \"../lib/output.js\";\nimport * as readline from \"node:readline/promises\";\n\nasync function resolveAndStoreAddresses(turnkeyCreds: TurnkeyCredentials): Promise<void> {\n process.stderr.write(\"Resolving wallet addresses...\\n\");\n const [evmAddress, solanaAddress] = await Promise.all([\n getEvmAddress(turnkeyCreds),\n getSolanaAddress(turnkeyCreds),\n ]);\n updateConfig({\n turnkey: { ...turnkeyCreds, evmAddress, solanaAddress },\n });\n}\n\nexport function registerAuthCommands(program: Command): void {\n program\n .command(\"login\")\n .description(\"Create wallet (default: --key) or login via email OTP\")\n .argument(\"[email]\", \"Email address for OTP login\")\n .option(\"--key\", \"Key-based login — no email required (default)\")\n .option(\"--email\", \"Email OTP login\")\n .action(async (emailArg: string | undefined, opts: { key?: boolean; email?: boolean }) => {\n try {\n if (opts.email || emailArg) {\n await doEmailLogin(emailArg);\n } else {\n await doKeyLogin();\n }\n } catch (err) { exitOnError(err); }\n });\n\n program\n .command(\"verify\")\n .description(\"Verify email OTP (second step of login)\")\n .requiredOption(\"--otp-id <id>\", \"OTP ID from login step\")\n .requiredOption(\"--code <code>\", \"OTP code from email\")\n .requiredOption(\"--email <email>\", \"Email used in login step\")\n .action(async (opts: { otpId: string; code: string; email: string }) => {\n try {\n await completeEmailLogin(opts.otpId, opts.code, opts.email);\n } catch (err) { exitOnError(err); }\n });\n\n program\n .command(\"logout\")\n .description(\"Clear session (P-256 keys preserved)\")\n .action(() => {\n const config = loadConfig();\n if (config.turnkey) {\n updateConfig({ turnkey: undefined });\n process.stdout.write(\"Logged out. P-256 keys preserved in ~/.config/chainstream/keys/\\n\");\n process.stdout.write(\"Run 'chainstream login' to re-authenticate.\\n\");\n } else {\n process.stdout.write(\"Not logged in via Turnkey.\\n\");\n }\n });\n\n program\n .command(\"bind-email\")\n .description(\"Bind an email to your wallet (for account recovery)\")\n .argument(\"[email]\", \"Email address to bind\")\n .action(async (emailArg?: string) => {\n try {\n await doBindEmail(emailArg);\n } catch (err) { exitOnError(err); }\n });\n\n program\n .command(\"bind-email-verify\")\n .description(\"Complete email binding (second step, non-interactive)\")\n .requiredOption(\"--otp-id <id>\", \"OTP ID from bind-email step\")\n .requiredOption(\"--code <code>\", \"Verification code from email\")\n .requiredOption(\"--email <email>\", \"Email being bound\")\n .action(async (opts: { otpId: string; code: string; email: string }) => {\n try {\n const config = loadConfig();\n if (!config.turnkey?.organizationId) {\n throw new Error(\"No wallet found. Run 'chainstream login' first.\");\n }\n\n process.stderr.write(\"Verifying...\\n\");\n const { verificationToken } = await callOtpVerify(\n opts.otpId, opts.code.trim(), config.turnkey.publicKeyHex,\n );\n\n process.stderr.write(\"Binding email to wallet...\\n\");\n await updateTurnkeyUserEmail(opts.email, verificationToken, config.turnkey);\n\n process.stdout.write(`Email ${opts.email} bound successfully.\\n`);\n process.stdout.write(\"You can now use 'chainstream login --email' with this email.\\n\");\n } catch (err) { exitOnError(err); }\n });\n}\n\n// ── Key-based login (default, no email required) ─────────────────\n\nfunction signTimestamp(timestampMs: string, privateKeyDerBase64: string): string {\n const signer = createSign(\"SHA256\");\n signer.update(timestampMs);\n signer.end();\n const sig = signer.sign({\n key: Buffer.from(privateKeyDerBase64, \"base64\"),\n format: \"der\",\n type: \"pkcs8\",\n });\n return sig.toString(\"hex\");\n}\n\ninterface KeyAuthResponse {\n orgId: string;\n evmAddress: string;\n solanaAddress: string;\n isNewUser: boolean;\n}\n\nasync function authServiceRequest<T>(path: string, body: Record<string, unknown>): Promise<T> {\n const authUrl = loadConfig().authUrl ?? CHAINSTREAM_AUTH_URL;\n\n const res = await fetch(`${authUrl}${path}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n let detail = text;\n try { detail = JSON.parse(text).message ?? text; } catch { /* ignore */ }\n throw new Error(`Auth service error (${res.status}): ${detail}`);\n }\n\n return res.json() as Promise<T>;\n}\n\nasync function callKeyAuth(\n publicKeyHex: string,\n uncompressedPublicKeyHex: string,\n timestampMs: string,\n signature: string,\n): Promise<KeyAuthResponse> {\n return authServiceRequest(\"/api/auth/key\", { publicKeyHex, uncompressedPublicKeyHex, timestampMs, signature });\n}\n\nasync function callOtpInit(email: string, organizationId?: string): Promise<{ otpId: string }> {\n return authServiceRequest(\"/api/auth/otp-init\", { email, ...(organizationId && { organizationId }) });\n}\n\nasync function callOtpVerify(\n otpId: string, otpCode: string, targetPublicKey: string, organizationId?: string,\n): Promise<{ verificationToken: string }> {\n return authServiceRequest(\"/api/auth/otp-verify\", { otpId, otpCode, targetPublicKey, ...(organizationId && { organizationId }) });\n}\n\nasync function doKeyLogin(): Promise<void> {\n // If user already has credentials with an orgId, just refresh the session\n const existingKey = loadKey();\n if (existingKey?.organizationId) {\n process.stderr.write(\"Refreshing session with existing P-256 key...\\n\");\n const { session, expiry } = await refreshTurnkeySession(\n existingKey.publicKeyHex,\n existingKey.privateKeyDer,\n existingKey.organizationId,\n );\n\n const turnkeyCreds: TurnkeyCredentials = {\n publicKeyHex: existingKey.publicKeyHex,\n privateKeyDer: existingKey.privateKeyDer,\n organizationId: existingKey.organizationId,\n sessionToken: session,\n sessionExpiry: expiry,\n };\n updateConfig({ turnkey: turnkeyCreds });\n\n const config = loadConfig();\n if (!config.turnkey?.evmAddress) {\n await resolveAndStoreAddresses(config.turnkey!);\n }\n\n process.stdout.write(\"Logged in (session refresh).\\n\");\n const updated = loadConfig();\n process.stdout.write(` EVM: ${updated.turnkey?.evmAddress}\\n`);\n process.stdout.write(` Solana: ${updated.turnkey?.solanaAddress}\\n`);\n return;\n }\n\n // Generate or load P-256 key pair\n let keyPair: ReturnType<typeof generateP256KeyPair>;\n const storedKey = loadKey();\n\n if (storedKey?.publicKeyHex && storedKey.privateKeyDer && storedKey.uncompressedPublicKeyHex) {\n keyPair = {\n publicKeyHex: storedKey.publicKeyHex,\n uncompressedPublicKeyHex: storedKey.uncompressedPublicKeyHex,\n privateKeyDer: storedKey.privateKeyDer,\n };\n process.stderr.write(`Using existing key (${keyPair.publicKeyHex.slice(0, 16)}...)\\n`);\n } else {\n keyPair = generateP256KeyPair();\n saveKey({\n publicKeyHex: keyPair.publicKeyHex,\n uncompressedPublicKeyHex: keyPair.uncompressedPublicKeyHex,\n privateKeyDer: keyPair.privateKeyDer,\n });\n process.stderr.write(`Generated new P-256 key pair\\n`);\n }\n\n // Sign timestamp and call auth service\n const timestampMs = Date.now().toString();\n const signature = signTimestamp(timestampMs, keyPair.privateKeyDer);\n\n process.stderr.write(\"Registering with ChainStream...\\n\");\n const result = await callKeyAuth(\n keyPair.publicKeyHex,\n keyPair.uncompressedPublicKeyHex,\n timestampMs,\n signature,\n );\n\n // Save org ID to keystore metadata\n saveKey({\n publicKeyHex: keyPair.publicKeyHex,\n uncompressedPublicKeyHex: keyPair.uncompressedPublicKeyHex,\n privateKeyDer: keyPair.privateKeyDer,\n organizationId: result.orgId,\n });\n\n // Save credentials + addresses to config\n updateConfig({\n turnkey: {\n publicKeyHex: keyPair.publicKeyHex,\n privateKeyDer: keyPair.privateKeyDer,\n organizationId: result.orgId,\n sessionToken: \"\",\n sessionExpiry: 0,\n evmAddress: result.evmAddress,\n solanaAddress: result.solanaAddress,\n },\n });\n\n if (result.isNewUser) {\n process.stdout.write(\"Welcome! Your ChainStream wallet has been created.\\n\");\n } else {\n process.stdout.write(\"Logged in successfully.\\n\");\n }\n process.stdout.write(` EVM: ${result.evmAddress}\\n`);\n process.stdout.write(` Solana: ${result.solanaAddress}\\n`);\n}\n\n// ── Email OTP login (optional, --email flag) ─────────────────────\n\nasync function doEmailLogin(email?: string): Promise<void> {\n if (!email) {\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n email = await rl.question(\"Enter your email: \");\n rl.close();\n if (!email?.trim()) throw new Error(\"Email required.\");\n email = email.trim();\n }\n\n // Step 1: Send OTP via auth-svc (ChainStream branding)\n process.stderr.write(`Sending OTP to ${email}...\\n`);\n const { otpId } = await callOtpInit(email);\n\n // Step 2: Get OTP code\n if (!process.stdin.isTTY) {\n process.stdout.write(JSON.stringify({ otpId, email }) + \"\\n\");\n process.stderr.write(\"Non-interactive mode: complete login with:\\n\");\n process.stderr.write(` chainstream verify --otp-id ${otpId} --code <code> --email ${email}\\n`);\n return;\n }\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n const code = await rl.question(\"Enter OTP code: \");\n rl.close();\n if (!code?.trim()) throw new Error(\"OTP code required.\");\n\n await completeEmailLogin(otpId, code.trim(), email);\n}\n\nasync function completeEmailLogin(otpId: string, code: string, email: string): Promise<void> {\n // Generate P-256 key pair for this device\n const keyPair = generateP256KeyPair();\n\n // Call auth-svc email-login: verifies OTP + finds/creates sub-org\n process.stderr.write(\"Verifying...\\n\");\n const result = await authServiceRequest<{\n orgId: string; evmAddress: string; solanaAddress: string; isNewUser: boolean;\n }>(\"/api/auth/email-login\", {\n otpId, otpCode: code, email,\n publicKeyHex: keyPair.publicKeyHex,\n uncompressedPublicKeyHex: keyPair.uncompressedPublicKeyHex,\n });\n\n // Save key + config\n saveKey({\n publicKeyHex: keyPair.publicKeyHex,\n uncompressedPublicKeyHex: keyPair.uncompressedPublicKeyHex,\n privateKeyDer: keyPair.privateKeyDer,\n organizationId: result.orgId,\n });\n\n updateConfig({\n turnkey: {\n publicKeyHex: keyPair.publicKeyHex,\n privateKeyDer: keyPair.privateKeyDer,\n organizationId: result.orgId,\n sessionToken: \"\",\n sessionExpiry: 0,\n evmAddress: result.evmAddress,\n solanaAddress: result.solanaAddress,\n },\n });\n\n if (result.isNewUser) {\n process.stdout.write(\"Welcome! Your ChainStream wallet has been created.\\n\");\n } else {\n process.stdout.write(\"Logged in successfully.\\n\");\n }\n process.stdout.write(` EVM: ${result.evmAddress}\\n`);\n process.stdout.write(` Solana: ${result.solanaAddress}\\n`);\n}\n\n// ── Bind email (optional, for account recovery) ──────────────────\n\nasync function doBindEmail(email?: string): Promise<void> {\n const config = loadConfig();\n if (!config.turnkey?.organizationId) {\n throw new Error(\"No wallet found. Run 'chainstream login' first.\");\n }\n\n if (!email) {\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n email = await rl.question(\"Enter email to bind: \");\n rl.close();\n if (!email?.trim()) throw new Error(\"Email required.\");\n email = email.trim();\n }\n\n // Step 1: Send OTP to email\n process.stderr.write(`Sending verification code to ${email}...\\n`);\n const { otpId } = await callOtpInit(email);\n\n // Step 2: Get OTP code\n if (!process.stdin.isTTY) {\n process.stdout.write(JSON.stringify({ otpId, email, step: \"verify\" }) + \"\\n\");\n process.stderr.write(\"Non-interactive mode. Complete with:\\n\");\n process.stderr.write(` chainstream bind-email-verify --otp-id ${otpId} --code <code> --email ${email}\\n`);\n return;\n }\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n const code = await rl.question(\"Enter verification code: \");\n rl.close();\n if (!code?.trim()) throw new Error(\"Verification code required.\");\n\n // Step 3: Verify OTP → get verificationToken\n process.stderr.write(\"Verifying...\\n\");\n const { verificationToken } = await callOtpVerify(\n otpId, code.trim(), config.turnkey.publicKeyHex,\n );\n\n // Step 4: Bind email directly via Turnkey (sub-org's own P-256 key)\n process.stderr.write(\"Binding email to wallet...\\n\");\n await updateTurnkeyUserEmail(email, verificationToken, config.turnkey);\n\n process.stdout.write(`Email ${email} bound successfully.\\n`);\n process.stdout.write(\"You can now use 'chainstream login --email' with this email.\\n\");\n}\n","/**\n * P-256 Key Store — persistent key pair storage in ~/.config/chainstream/keys/.\n *\n * Keys are stored independently from config.json so that `logout`\n * (which clears config.turnkey) does not destroy the user's identity.\n *\n * Adapted from openant-cli/src/lib/keystore.ts.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, unlinkSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getConfigDir } from \"./config.js\";\n\nconst KEYS_DIR = join(getConfigDir(), \"keys\");\nconst DEFAULT_PROFILE = \"default\";\n\nfunction ensureKeysDir(): void {\n if (!existsSync(KEYS_DIR)) {\n mkdirSync(KEYS_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\nfunction privatePath(profile: string): string { return join(KEYS_DIR, `${profile}.private`); }\nfunction publicPath(profile: string): string { return join(KEYS_DIR, `${profile}.public`); }\nfunction metaPath(profile: string): string { return join(KEYS_DIR, `${profile}.json`); }\n\nexport interface StoredKeyPair {\n publicKeyHex: string;\n uncompressedPublicKeyHex: string;\n privateKeyDer: string;\n organizationId?: string;\n}\n\nexport function hasKey(profile = DEFAULT_PROFILE): boolean {\n return existsSync(privatePath(profile)) && existsSync(publicPath(profile));\n}\n\nexport function loadKey(profile = DEFAULT_PROFILE): StoredKeyPair | undefined {\n if (!hasKey(profile)) return undefined;\n\n try {\n const privateKeyDer = readFileSync(privatePath(profile), \"utf-8\").trim();\n const publicKeyHex = readFileSync(publicPath(profile), \"utf-8\").trim();\n\n let uncompressedPublicKeyHex = \"\";\n let organizationId: string | undefined;\n\n if (existsSync(metaPath(profile))) {\n const meta = JSON.parse(readFileSync(metaPath(profile), \"utf-8\"));\n uncompressedPublicKeyHex = meta.uncompressedPublicKeyHex ?? \"\";\n organizationId = meta.organizationId;\n }\n\n return { publicKeyHex, uncompressedPublicKeyHex, privateKeyDer, organizationId };\n } catch {\n return undefined;\n }\n}\n\nexport function saveKey(keyPair: StoredKeyPair, profile = DEFAULT_PROFILE): void {\n ensureKeysDir();\n writeFileSync(privatePath(profile), keyPair.privateKeyDer, { mode: 0o600 });\n writeFileSync(publicPath(profile), keyPair.publicKeyHex, { mode: 0o600 });\n writeFileSync(\n metaPath(profile),\n JSON.stringify({\n uncompressedPublicKeyHex: keyPair.uncompressedPublicKeyHex,\n ...(keyPair.organizationId ? { organizationId: keyPair.organizationId } : {}),\n }, null, 2),\n { mode: 0o600 },\n );\n}\n\nexport function updateKeyMeta(organizationId: string, profile = DEFAULT_PROFILE): void {\n if (!existsSync(metaPath(profile))) return;\n try {\n const meta = JSON.parse(readFileSync(metaPath(profile), \"utf-8\"));\n meta.organizationId = organizationId;\n writeFileSync(metaPath(profile), JSON.stringify(meta, null, 2), { mode: 0o600 });\n } catch { /* ignore */ }\n}\n\nexport function deleteKey(profile = DEFAULT_PROFILE): boolean {\n let deleted = false;\n for (const p of [privatePath(profile), publicPath(profile), metaPath(profile)]) {\n if (existsSync(p)) { unlinkSync(p); deleted = true; }\n }\n return deleted;\n}\n\nexport function listProfiles(): string[] {\n if (!existsSync(KEYS_DIR)) return [];\n return readdirSync(KEYS_DIR)\n .filter((f) => f.endsWith(\".private\"))\n .map((f) => f.replace(/\\.private$/, \"\"));\n}\n","import { Command } from \"commander\";\nimport { loadConfig, updateConfig, getWalletMode } from \"../lib/config.js\";\nimport { exitOnError } from \"../lib/output.js\";\n\nexport function registerConfigCommands(program: Command): void {\n const config = program.command(\"config\").description(\"Configuration management\");\n\n config\n .command(\"set\")\n .description(\"Set a configuration value\")\n .requiredOption(\"--key <key>\", \"Config key (apiKey, baseUrl)\")\n .requiredOption(\"--value <value>\", \"Config value\")\n .action((opts) => {\n try {\n const allowedKeys = [\"apiKey\", \"baseUrl\", \"walletChain\", \"plan\"];\n if (!allowedKeys.includes(opts.key)) {\n throw new Error(`Invalid key \"${opts.key}\". Allowed: ${allowedKeys.join(\", \")}`);\n }\n updateConfig({ [opts.key]: opts.value });\n process.stdout.write(`Set ${opts.key} = ${opts.key === \"apiKey\" ? \"***\" : opts.value}\\n`);\n } catch (err) { exitOnError(err); }\n });\n\n config\n .command(\"get\")\n .description(\"Show configuration\")\n .option(\"--key <key>\", \"Specific key to show\")\n .action((opts) => {\n try {\n const cfg = loadConfig();\n if (opts.key) {\n const value = (cfg as unknown as Record<string, unknown>)[opts.key];\n if (value === undefined) {\n process.stdout.write(`${opts.key}: (not set)\\n`);\n } else if (opts.key === \"apiKey\" && typeof value === \"string\") {\n process.stdout.write(`${opts.key}: ${value.slice(0, 8)}...${value.slice(-4)}\\n`);\n } else {\n process.stdout.write(`${opts.key}: ${JSON.stringify(value)}\\n`);\n }\n } else {\n const display = {\n apiKey: cfg.apiKey ? `${cfg.apiKey.slice(0, 8)}...` : undefined,\n baseUrl: cfg.baseUrl,\n walletMode: getWalletMode(cfg),\n turnkey: cfg.turnkey ? { organizationId: cfg.turnkey.organizationId } : undefined,\n rawWallet: cfg.rawWallet ? { chain: cfg.rawWallet.chain } : undefined,\n };\n process.stdout.write(JSON.stringify(display, null, 2) + \"\\n\");\n }\n } catch (err) { exitOnError(err); }\n });\n\n config\n .command(\"auth\")\n .description(\"Show current authentication status\")\n .action(() => {\n try {\n const cfg = loadConfig();\n const mode = getWalletMode(cfg);\n\n if (mode === \"turnkey\") {\n process.stdout.write(`Auth: Turnkey (org: ${cfg.turnkey!.organizationId})\\n`);\n const expiry = new Date(cfg.turnkey!.sessionExpiry * 1000);\n const expired = Date.now() > cfg.turnkey!.sessionExpiry * 1000;\n process.stdout.write(`Session: ${expired ? \"expired\" : \"active\"} (expires: ${expiry.toISOString()})\\n`);\n } else if (mode === \"raw\") {\n process.stdout.write(`Auth: Raw Key (${cfg.rawWallet!.chain})\\n`);\n } else if (cfg.apiKey) {\n process.stdout.write(`Auth: API Key (${cfg.apiKey.slice(0, 8)}...)\\n`);\n } else {\n process.stdout.write(\"Auth: Not configured\\n\");\n process.stdout.write(\" Run: chainstream login # Turnkey wallet\\n\");\n process.stdout.write(\" Run: chainstream config set --key apiKey --value <key> # API key\\n\");\n }\n } catch (err) { exitOnError(err); }\n });\n}\n"],"mappings":";;;;;;;;;;;;AAAA,IAQa,qBAIA,sBAIA,gBAIA,cAIA;AAxBb;AAAA;AAAA;AAQO,IAAM,sBACX,QAAQ,IAAI,uBAAuB;AAG9B,IAAM,uBACX,QAAQ,IAAI,wBAAwB;AAG/B,IAAM,iBACX,QAAQ,IAAI,kBAAkB;AAGzB,IAAM,eACX,QAAQ,IAAI,gBAAgB;AAGvB,IAAM,gBAAgB,OAAO,QAAQ,IAAI,iBAAiB,MAAM;AAAA;AAAA;;;ACxBvE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,YAAY,WAAW,cAAc,qBAAqB;AACnE,SAAS,eAAe;AACxB,SAAS,YAAY;AASd,SAAS,WAAW,OAA8B;AAAE,SAAO,UAAU;AAAQ;AAC7E,SAAS,cAAc,OAA8B;AAAE,SAAO,UAAU;AAAO;AAgC/E,SAAS,eAAuB;AACrC,MAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,cAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,EAC3C;AACA,SAAO;AACT;AAEO,SAAS,aAAqB;AACnC,QAAM,WAAmB;AAAA,IACvB,SAAS;AAAA,EACX;AAEA,MAAI,CAAC,WAAW,WAAW,EAAG,QAAO;AAErC,MAAI;AACF,UAAM,MAAM,aAAa,aAAa,OAAO;AAC7C,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAO,EAAE,GAAG,UAAU,GAAG,OAAO;AAAA,EAClC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,WAAW,QAAsB;AAC/C,eAAa;AACb,gBAAc,aAAa,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,MAAM,OAAO;AAC5E;AAEO,SAAS,aAAa,OAA8B;AACzD,QAAM,UAAU,WAAW;AAC3B,aAAW,EAAE,GAAG,SAAS,GAAG,MAAM,CAAC;AACrC;AAEO,SAAS,cAAc,QAA4B;AACxD,MAAI,OAAO,SAAS,eAAgB,QAAO;AAC3C,MAAI,OAAO,WAAW,IAAK,QAAO;AAClC,SAAO;AACT;AAjFA,IAKM,YACA;AANN;AAAA;AAAA;AAGA;AAEA,IAAM,aAAa,KAAK,QAAQ,GAAG,WAAW,aAAa;AAC3D,IAAM,cAAc,KAAK,YAAY,aAAa;AAAA;AAAA;;;ACa3C,SAAS,WAAW,OAAuC;AAChE,SAAO,UAAU,QAAQ,WAAW;AACtC;AArBA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,2BAA2B;AAEpC,SAAS,SAAS,4BAA4B;AAC9C,SAAS,QAAQ,mBAAmB;AAKpC,SAAS,WAAW,KAAyB;AAC3C,QAAM,WAAW;AACjB,QAAM,OAAO;AACb,QAAM,SAAmB,CAAC,CAAC;AAC3B,aAAW,QAAQ,KAAK;AACtB,QAAI,QAAQ,SAAS,QAAQ,IAAI;AACjC,QAAI,QAAQ,EAAG,OAAM,IAAI,MAAM,6BAA6B,IAAI,EAAE;AAClE,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,eAAS,OAAO,CAAC,IAAI;AACrB,aAAO,CAAC,IAAI,QAAQ;AACpB,gBAAU;AAAA,IACZ;AACA,WAAO,QAAQ,GAAG;AAChB,aAAO,KAAK,QAAQ,GAAI;AACxB,gBAAU;AAAA,IACZ;AAAA,EACF;AACA,aAAW,QAAQ,KAAK;AACtB,QAAI,SAAS,IAAK;AAClB,WAAO,KAAK,CAAC;AAAA,EACf;AACA,SAAO,IAAI,WAAW,OAAO,QAAQ,CAAC;AACxC;AA9BA,IAgCa;AAhCb;AAAA;AAAA;AAKA;AACA;AA0BO,IAAM,eAAN,MAAqC;AAAA,MAC1C;AAAA,MACA;AAAA,MACA;AAAA,MACQ;AAAA,MAER,YAAY,KAAa,OAAqB;AAC5C,aAAK,eAAe;AACpB,aAAK,QAAQ,WAAW,KAAK;AAC7B,aAAK,aAAa;AAElB,YAAI,WAAW,KAAK,YAAY,GAAG;AACjC,gBAAM,MAAO,IAAI,WAAW,IAAI,IAAI,MAAM,KAAK,GAAG;AAClD,gBAAM,UAAU,oBAAoB,GAAG;AACvC,eAAK,UAAU,QAAQ;AAAA,QACzB,OAAO;AACL,gBAAM,UAAU,WAAW,GAAG;AAC9B,gBAAM,UAAU,QAAQ,cAAc,OAAO;AAC7C,eAAK,UAAU,QAAQ,UAAU,SAAS;AAAA,QAC5C;AAAA,MACF;AAAA,MAEA,MAAM,YAAY,SAAkC;AAClD,YAAI,WAAW,KAAK,YAAY,GAAG;AACjC,gBAAM,MAAO,KAAK,WAAW,WAAW,IAAI,IAAI,KAAK,aAAa,KAAK,KAAK,UAAU;AACtF,gBAAM,UAAU,oBAAoB,GAAG;AACvC,iBAAO,QAAQ,YAAY,EAAE,QAAQ,CAAC;AAAA,QACxC;AAEA,cAAM,UAAU,WAAW,KAAK,UAAU;AAC1C,cAAM,eAAe,QAAQ,MAAM,GAAG,EAAE;AACxC,cAAM,cAAc,OAAO,KAAK,oCAAoC,KAAK;AACzE,cAAM,WAAW,OAAO,OAAO,CAAC,aAAa,OAAO,KAAK,YAAY,CAAC,CAAC;AACvE,cAAM,WAAW,OAAO,KAAK,SAAS,OAAO;AAC7C,cAAM,MAAM,YAAY,MAAM,UAAU,EAAE,KAAK,UAAU,QAAQ,OAAO,MAAM,QAAQ,CAAC;AACvF,eAAO,IAAI,SAAS,KAAK;AAAA,MAC3B;AAAA,MAEA,MAAM,gBAAgB,cAAuC;AAC3D,cAAM,UAAU,OAAO,KAAK,cAAc,QAAQ;AAElD,YAAI,CAAC,WAAW,KAAK,YAAY,GAAG;AAClC,gBAAM,KAAK,qBAAqB,YAAY,IAAI,WAAW,OAAO,CAAC;AACnE,gBAAM,UAAU,WAAW,KAAK,UAAU;AAC1C,gBAAM,UAAU,QAAQ,cAAc,OAAO;AAC7C,aAAG,KAAK,CAAC,OAAO,CAAC;AACjB,iBAAO,OAAO,KAAK,GAAG,UAAU,CAAC,EAAE,SAAS,QAAQ;AAAA,QACtD;AAEA,cAAM,MAAO,KAAK,WAAW,WAAW,IAAI,IAAI,KAAK,aAAa,KAAK,KAAK,UAAU;AACtF,cAAM,UAAU,oBAAoB,GAAG;AACvC,cAAM,YAAY,MAAM,QAAQ,gBAAgB,EAAE,MAAM,SAAS,CAAU;AAC3E,eAAO,OAAO,KAAK,UAAU,MAAM,CAAC,GAAG,KAAK,EAAE,SAAS,QAAQ;AAAA,MACjE;AAAA,IACF;AAAA;AAAA;;;ACtFA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,SAAS,YAAY,2BAA2B;AAazC,SAAS,sBAAmC;AACjD,QAAM,EAAE,WAAW,WAAW,IAAI,oBAAoB,MAAM;AAAA,IAC1D,YAAY;AAAA,IACZ,mBAAmB,EAAE,MAAM,QAAQ,QAAQ,MAAM;AAAA,IACjD,oBAAoB,EAAE,MAAM,SAAS,QAAQ,MAAM;AAAA,EACrD,CAAC;AAED,QAAM,SAAS,OAAO,KAAK,SAAS;AACpC,QAAM,oBAAoB,OAAO,SAAS,EAAE;AAC5C,QAAM,IAAI,kBAAkB,SAAS,GAAG,EAAE;AAC1C,QAAM,IAAI,kBAAkB,SAAS,IAAI,EAAE;AAC3C,QAAM,SAAS,EAAE,EAAE,IAAK,MAAM,IAAI,IAAO;AACzC,QAAM,gBAAgB,OAAO,OAAO,CAAC,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,KAAK;AAC9E,QAAM,kBAAkB,OAAO,KAAK,iBAAiB,EAAE,SAAS,KAAK;AAErE,SAAO;AAAA,IACL,cAAc;AAAA,IACd,0BAA0B;AAAA,IAC1B,eAAe,OAAO,KAAK,UAAU,EAAE,SAAS,QAAQ;AAAA,EAC1D;AACF;AAaA,SAAS,iBAAiB,KAAyB;AACjD,QAAM,QAAQ,IAAI,MAAM,GAAG;AAC3B,MAAI,MAAM,WAAW,EAAG,OAAM,IAAI,MAAM,aAAa;AACrD,QAAM,aAAa,MAAM,CAAC,EAAG,QAAQ,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG;AACjE,SAAO,KAAK,MAAM,OAAO,KAAK,YAAY,QAAQ,EAAE,SAAS,OAAO,CAAC;AACvE;AAIO,SAAS,eAAe,MAAc,cAAsB,qBAAqC;AACtG,QAAM,SAAS,WAAW,QAAQ;AAClC,SAAO,OAAO,IAAI;AAClB,SAAO,IAAI;AAEX,QAAM,YAAY,OAAO,KAAK;AAAA,IAC5B,KAAK,OAAO,KAAK,qBAAqB,QAAQ;AAAA,IAC9C,QAAQ;AAAA,IACR,MAAM;AAAA,EACR,CAAC;AAED,QAAM,QAAQ,KAAK,UAAU;AAAA,IAC3B,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,WAAW,UAAU,SAAS,KAAK;AAAA,EACrC,CAAC;AAED,SAAO,OAAO,KAAK,KAAK,EAAE,SAAS,QAAQ,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,EAAE;AACxG;AAEA,eAAsB,eACpB,MAAc,MAA+B,OACjC;AACZ,QAAM,UAAU,KAAK,UAAU,IAAI;AACnC,QAAM,QAAQ,eAAe,SAAS,MAAM,cAAc,MAAM,aAAa;AAE7E,QAAM,MAAM,MAAM,MAAM,GAAG,gBAAgB,GAAG,IAAI,IAAI;AAAA,IACpD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,oBAAoB,WAAW,MAAM;AAAA,IAChE,MAAM;AAAA,EACR,CAAC;AAED,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,UAAM,IAAI,MAAM,sBAAsB,IAAI,MAAM,MAAM,IAAI,EAAE;AAAA,EAC9D;AAEA,SAAO,IAAI,KAAK;AAClB;AAEA,eAAsB,sBACpB,cAAsB,eAAuB,gBAAwB,oBAAoB,KAC3C;AAC9C,QAAM,aAAa,oBAAoB;AAEvC,QAAM,OAAO,KAAK,UAAU;AAAA,IAC1B,MAAM;AAAA,IACN,aAAa,KAAK,IAAI,EAAE,SAAS;AAAA,IACjC;AAAA,IACA,YAAY;AAAA,MACV,iBAAiB,WAAW;AAAA,MAC5B,mBAAmB,OAAO,iBAAiB;AAAA,IAC7C;AAAA,EACF,CAAC;AAED,QAAM,cAAc,eAAe,MAAM,cAAc,aAAa;AAEpE,QAAM,MAAM,MAAM,MAAM,GAAG,gBAAgB,+CAA+C;AAAA,IACxF,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,oBAAoB,WAAW,YAAY;AAAA,IACtE;AAAA,EACF,CAAC;AAED,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,UAAM,IAAI,MAAM,mCAAmC,IAAI,MAAM,MAAM,IAAI,EAAE;AAAA,EAC3E;AAEA,QAAM,OAAO,MAAM,IAAI,KAAK;AAI5B,QAAM,UAAU,KAAK,UAAU,QAAQ,gCAAgC;AACvE,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,iDAAiD;AAE/E,QAAM,UAAU,iBAAiB,OAAO;AACxC,SAAO,EAAE,SAAS,QAAQ,QAAQ,IAAI;AACxC;AASA,eAAsB,uBACpB,OAAe,mBAA2B,OAC3B;AACf,QAAM,YAAY,MAAM,eAErB,+BAA+B;AAAA,IAChC,gBAAgB,MAAM;AAAA,EACxB,GAAG,KAAK;AAER,QAAM,SAAS,UAAU,QAAQ,CAAC,GAAG;AACrC,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,qCAAqC;AAElE,QAAM,eAAe,uCAAuC;AAAA,IAC1D,MAAM;AAAA,IACN,aAAa,KAAK,IAAI,EAAE,SAAS;AAAA,IACjC,gBAAgB,MAAM;AAAA,IACtB,YAAY,EAAE,QAAQ,WAAW,OAAO,kBAAkB;AAAA,EAC5D,GAAG,KAAK;AACV;AASA,eAAsB,mBAAmB,OAA4D;AACnG,QAAM,cAAc,MAAM;AAAA,IACxB;AAAA,IACA,EAAE,gBAAgB,MAAM,eAAe;AAAA,IACvC;AAAA,EACF;AAEA,QAAM,cAAsC,CAAC;AAC7C,aAAW,UAAU,YAAY,WAAW,CAAC,GAAG;AAC9C,UAAM,eAAe,MAAM;AAAA,MACzB;AAAA,MACA,EAAE,gBAAgB,MAAM,gBAAgB,UAAU,OAAO,UAAU,mBAAmB,EAAE,OAAO,MAAM,EAAE;AAAA,MACvG;AAAA,IACF;AACA,eAAW,QAAQ,aAAa,YAAY,CAAC,GAAG;AAC9C,kBAAY,KAAK,IAAI;AAAA,IACvB;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,cAAc,OAA4C;AAC9E,QAAM,WAAW,MAAM,mBAAmB,KAAK;AAC/C,QAAM,MAAM,SAAS,KAAK,OAAK,EAAE,kBAAkB,yBAAyB;AAC5E,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,iCAAiC;AAC3D,SAAO,IAAI;AACb;AAEA,eAAsB,iBAAiB,OAA4C;AACjF,QAAM,WAAW,MAAM,mBAAmB,KAAK;AAC/C,QAAM,MAAM,SAAS,KAAK,OAAK,EAAE,kBAAkB,uBAAuB;AAC1E,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,oCAAoC;AAC9D,SAAO,IAAI;AACb;AAjNA,IAWa;AAXb;AAAA;AAAA;AAWO,IAAM,mBAAmB;AAAA;AAAA;;;ACXhC,IASa;AATb;AAAA;AAAA;AACA;AACA;AACA;AAMO,IAAM,gBAAN,MAAM,eAAgC;AAAA,MAC3C;AAAA,MACA;AAAA,MACA;AAAA,MACQ;AAAA,MAER,YAAY,OAA2B,OAAqB,SAAiB;AAC3E,aAAK,QAAQ;AACb,aAAK,eAAe;AACpB,aAAK,QAAQ,WAAW,KAAK;AAC7B,aAAK,UAAU;AAAA,MACjB;AAAA,MAEA,aAAa,OAAO,OAAiF;AACnG,cAAM,CAAC,SAAS,OAAO,IAAI,MAAM,QAAQ,IAAI;AAAA,UAC3C,cAAc,KAAK;AAAA,UACnB,iBAAiB,KAAK;AAAA,QACxB,CAAC;AACD,eAAO;AAAA,UACL,MAAM,IAAI,eAAc,OAAO,QAAQ,OAAO;AAAA,UAC9C,KAAK,IAAI,eAAc,OAAO,OAAO,OAAO;AAAA,QAC9C;AAAA,MACF;AAAA,MAEA,MAAM,YAAY,SAAkC;AAClD,YAAI;AACJ,YAAI;AAEJ,YAAI,WAAW,KAAK,YAAY,GAAG;AACjC,gBAAM,SAAS;AAAA,EAAiC,QAAQ,MAAM;AAC9D,gBAAM,WAAW,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,OAAO,GAAG,OAAO,KAAK,SAAS,OAAO,CAAC,CAAC;AAC5F,uBAAa,SAAS,SAAS,KAAK;AACpC,yBAAe;AAAA,QACjB,OAAO;AACL,uBAAa,OAAO,KAAK,SAAS,OAAO,EAAE,SAAS,KAAK;AACzD,yBAAe;AAAA,QACjB;AAEA,cAAM,SAAS,MAAM;AAAA,UAGnB;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,aAAa,KAAK,IAAI,EAAE,SAAS;AAAA,YACjC,gBAAgB,KAAK,MAAM;AAAA,YAC3B,YAAY;AAAA,cACV,UAAU,KAAK;AAAA,cACf,SAAS;AAAA,cACT,UAAU;AAAA,cACV;AAAA,YACF;AAAA,UACF;AAAA,UACA,KAAK;AAAA,QACP;AAEA,cAAM,YAAY,OAAO,UAAU,QAAQ;AAC3C,YAAI,CAAC,UAAW,OAAM,IAAI,MAAM,+CAA+C;AAE/E,YAAI,WAAW,KAAK,YAAY,GAAG;AACjC,gBAAM,IAAI,UAAU,MAAM,OAAO,OAAO;AACxC,iBAAO,KAAK,UAAU,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC;AAAA,QAC3C;AACA,eAAO,GAAG,UAAU,CAAC,GAAG,UAAU,CAAC;AAAA,MACrC;AAAA,MAEA,MAAM,gBAAgB,cAAuC;AAC3D,cAAM,UAAU,OAAO,KAAK,cAAc,QAAQ;AAClD,cAAM,cAAc,QAAQ,SAAS,KAAK;AAE1C,cAAM,SAAS,WAAW,KAAK,YAAY,IACvC,8BACA;AAEJ,cAAM,SAAS,MAAM;AAAA,UAGnB;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,aAAa,KAAK,IAAI,EAAE,SAAS;AAAA,YACjC,gBAAgB,KAAK,MAAM;AAAA,YAC3B,YAAY;AAAA,cACV,UAAU,KAAK;AAAA,cACf,qBAAqB;AAAA,cACrB,MAAM;AAAA,YACR;AAAA,UACF;AAAA,UACA,KAAK;AAAA,QACP;AAEA,cAAM,YAAY,OAAO,UAAU,QAAQ,uBAAuB;AAClE,YAAI,CAAC,UAAW,OAAM,IAAI,MAAM,mDAAmD;AAEnF,eAAO,OAAO,KAAK,WAAW,KAAK,EAAE,SAAS,QAAQ;AAAA,MACxD;AAAA,IACF;AAAA;AAAA;;;ACzGA;AAAA;AAAA;AAAA;AAAA;AAMO,SAAS,aAAa,QAAgB,MAA0B;AACrE,MAAI,SAAS,SAAS,OAAO,WAAW;AACtC,WAAO,IAAI,aAAa,OAAO,UAAU,KAAK,OAAO,UAAU,KAAK;AAAA,EACtE;AAEA,MAAI,SAAS,aAAa,OAAO,SAAS;AACxC,UAAM,QAAQ,OAAO,eAAe;AACpC,UAAM,UAAU,WAAW,KAAK,IAAI,OAAO,QAAQ,aAAa,OAAO,QAAQ;AAC/E,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI;AAAA,QACR,WAAW,KAAK;AAAA;AAAA,MAElB;AAAA,IACF;AACA,WAAO,IAAI,cAAc,OAAO,SAAS,OAAO,OAAO;AAAA,EACzD;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,EAGF;AACF;AAKA,eAAsB,0BAA0B,QAAgB,MAG7D;AACD,MAAI,SAAS,SAAS,OAAO,WAAW;AACtC,UAAM,IAAI,IAAI,aAAa,OAAO,UAAU,KAAK,OAAO,UAAU,KAAK;AACvE,WAAO,WAAW,OAAO,UAAU,KAAK,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE;AAAA,EACrE;AAEA,MAAI,SAAS,aAAa,OAAO,SAAS;AACxC,UAAM,UAAU,MAAM,cAAc,OAAO,OAAO,OAAO;AACzD,WAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,QAAQ,IAAI;AAAA,EAChD;AAEA,QAAM,IAAI,MAAM,uBAAuB;AACzC;AAhDA;AAAA;AAAA;AACA;AAEA;AACA;AAAA;AAAA;;;ACJA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,SAAS,kBAAkB;AAC3B,SAAS,4BAA4B;AACrC,SAAS,sBAAsB;AAC/B,SAAS,sBAAsB;AAC/B,SAAS,uBAAAA,4BAA2B;AACpC,SAAS,qBAA6C;AACtD,SAAS,oCAAoC;AAG7C,YAAY,cAAc;AAM1B,SAAS,4BAA4B,OAA2B;AAC9D,QAAM,UAAU,MAAM;AACtB,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,MAAM,cAAc,MAAkJ;AACpK,YAAM,SAAS,cAAc,IAA2C;AACxE,YAAM,SAAS,MAAM;AAAA,QAGnB;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,aAAa,KAAK,IAAI,EAAE,SAAS;AAAA,UACjC,gBAAgB,MAAM;AAAA,UACtB,YAAY;AAAA,YACV,UAAU;AAAA,YACV,SAAS,OAAO,MAAM,CAAC;AAAA,YACvB,UAAU;AAAA,YACV,cAAc;AAAA,UAChB;AAAA,QACF;AAAA,QACA;AAAA,MACF;AACA,YAAM,MAAM,OAAO,UAAU,QAAQ;AACrC,UAAI,CAAC,IAAK,OAAM,IAAI,MAAM,qCAAqC;AAC/D,YAAM,IAAI,IAAI,MAAM,OAAO,OAAO;AAClC,aAAO,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;AAAA,IAC/B;AAAA,EACF;AACF;AAIA,eAAe,kBAAkB,OAA2B,SAA0C;AACpG,QAAM,aAAa,OAAO,KAAK,OAAO,EAAE,SAAS,KAAK;AACtD,QAAM,SAAS,MAAM;AAAA,IAGnB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa,KAAK,IAAI,EAAE,SAAS;AAAA,MACjC,gBAAgB,MAAM;AAAA,MACtB,YAAY;AAAA,QACV,UAAU,MAAM;AAAA,QAChB,SAAS;AAAA,QACT,UAAU;AAAA,QACV,cAAc;AAAA,MAChB;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACA,QAAM,MAAM,OAAO,UAAU,QAAQ;AACrC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,mCAAmC;AAC7D,SAAO,IAAI,WAAW,OAAO,KAAK,IAAI,IAAI,IAAI,GAAG,KAAK,CAAC;AACzD;AAEA,eAAe,0BAA0B,OAA2B;AAClE,QAAM,EAAE,kBAAkB,SAAS,WAAW,IAAI,MAAM,OAAO,aAAa;AAC5E,SAAO,iBAAiB,WAAW,MAAM,aAAc,CAAC;AAC1D;AAEA,SAAS,uBAAuB,OAA2B,YAAqB;AAC9E,QAAM,QAAQ,IAAI,eAAe,YAAqB,EAAE,QAAQ,sCAAsC,CAAC;AACvG,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,MAAM,qBAAqB,aAAqB,qBAAgD;AAC9F,YAAM,UAAU,MAAM,MAAM,qBAAqB,aAAa,mBAA4B;AAC1F,YAAM,UAAU;AAChB,YAAM,QAAQ,QAAQ,QAAQ;AAC9B,YAAM,UAAU,IAAI,WAAW,OAAO,KAAK,OAAO,QAAQ,CAAC;AAC3D,YAAM,WAAW,QAAQ,CAAC;AAC1B,YAAM,eAAe,IAAI,WAAW;AACpC,YAAM,eAAe,QAAQ,MAAM,YAAY;AAC/C,YAAM,MAAM,MAAM,kBAAkB,OAAO,YAAY;AACvD,cAAQ,IAAI,KAAK,IAAI,EAAE;AACvB,cAAQ,QAAQ,cAAc,OAAO,KAAK,OAAO,EAAE,SAAS,QAAQ;AACpE,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAIA,SAASC,YAAW,KAAyB;AAC3C,QAAM,WAAW;AACjB,QAAM,OAAO;AACb,QAAM,SAAmB,CAAC,CAAC;AAC3B,aAAW,QAAQ,KAAK;AACtB,QAAI,QAAQ,SAAS,QAAQ,IAAI;AACjC,QAAI,QAAQ,EAAG,OAAM,IAAI,MAAM,6BAA6B,IAAI,EAAE;AAClE,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,eAAS,OAAO,CAAC,IAAK;AACtB,aAAO,CAAC,IAAI,QAAQ;AACpB,gBAAU;AAAA,IACZ;AACA,WAAO,QAAQ,GAAG;AAChB,aAAO,KAAK,QAAQ,GAAI;AACxB,gBAAU;AAAA,IACZ;AAAA,EACF;AACA,aAAW,QAAQ,KAAK;AACtB,QAAI,SAAS,IAAK;AAClB,WAAO,KAAK,CAAC;AAAA,EACf;AACA,SAAO,IAAI,WAAW,OAAO,QAAQ,CAAC;AACxC;AAIA,eAAsB,aAAa,QAAuC;AACxE,MAAI,WAAY,QAAO;AAEvB,QAAM,SAAS,IAAI,WAAW;AAE9B,MAAI,OAAO,WAAW;AACpB,QAAI,WAAW,OAAO,UAAU,KAAK,GAAG;AACtC,YAAM,MAAO,OAAO,UAAU,IAAI,WAAW,IAAI,IAAI,OAAO,UAAU,MAAM,KAAK,OAAO,UAAU,GAAG;AACrG,YAAM,UAAUD,qBAAoB,GAAG;AACvC,aAAO,SAAS,eAAe,IAAI,eAAe,OAAO,CAAC;AAAA,IAC5D,WAAW,cAAc,OAAO,UAAU,KAAK,GAAG;AAChD,YAAM,UAAUC,YAAW,OAAO,UAAU,GAAG;AAC/C,YAAM,SAAS,MAAM,6BAA6B,IAAI,WAAW,OAAO,CAAU;AAClF,aAAO,SAAS,2CAA2C,IAAI,eAAe,QAAQ,EAAE,QAAQ,sCAAsC,CAAC,CAAC;AAAA,IAC1I;AAAA,EACF,WAAW,OAAO,SAAS,gBAAgB;AACzC,UAAM,iBAAiB,OAAO,eAAe;AAC7C,QAAI,WAAW,cAAc,KAAK,OAAO,QAAQ,YAAY;AAC3D,YAAM,UAAU,4BAA4B,OAAO,OAAO;AAC1D,aAAO,SAAS,eAAe,IAAI,eAAe,OAAgB,CAAC;AAAA,IACrE,WAAW,cAAc,cAAc,KAAK,OAAO,QAAQ,eAAe;AACxE,YAAM,aAAa,MAAM,0BAA0B,OAAO,OAAO;AACjE,YAAM,SAAS,uBAAuB,OAAO,SAAS,UAAU;AAChE,aAAO,SAAS,2CAA2C,MAAe;AAAA,IAC5E;AAAA,EACF;AAEA,eAAa,qBAAqB,OAAO,MAAM;AAC/C,SAAO;AACT;AAgBA,eAAsB,WAAW,SAA2C;AAC1E,QAAM,OAAO,MAAM,MAAM,GAAG,OAAO,eAAe;AAClD,MAAI,CAAC,KAAK,GAAI,OAAM,IAAI,MAAM,0BAA0B,KAAK,MAAM,GAAG;AACtE,SAAO,KAAK,KAAK;AACnB;AAMA,eAAsB,sBAAsB,SAAkC;AAC5E,QAAM,UAAU,MAAM,WAAW,OAAO;AACxC,QAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AAEpE,UAAQ,OAAO,MAAM,8DAA8D;AACnF,UAAQ,OAAO,MAAM,sDAAsD;AAC3E,UAAQ,OAAO,MAAM,kRAAsD;AAE3E,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,IAAI,MAAM,CAAC;AACjB,UAAM,MAAM,OAAO,IAAI,CAAC,EAAE,SAAS,CAAC;AACpC,UAAM,OAAO,EAAE,KAAK,OAAO,EAAE;AAC7B,UAAM,QAAQ,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;AACxC,UAAM,QAAQ,EAAE,YAAY,eAAe,EAAE,SAAS,EAAE,IAAI;AAC5D,UAAM,OAAO,GAAG,EAAE,aAAa;AAC/B,YAAQ,OAAO,MAAM,KAAK,GAAG,IAAI,IAAI,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI;AAAA,CAAI;AAAA,EACtE;AAEA,UAAQ,OAAO,MAAM,IAAI;AACzB,QAAM,KAAc,yBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,QAAM,SAAS,MAAM,GAAG,SAAS,kBAAkB,MAAM,MAAM,KAAK;AACpE,KAAG,MAAM;AAET,QAAM,MAAM,SAAS,OAAO,KAAK,GAAG,EAAE,IAAI;AAC1C,MAAI,MAAM,KAAK,OAAO,MAAM,UAAU,OAAO,MAAM,GAAG,GAAG;AACvD,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AAEA,SAAO,MAAM,GAAG,EAAG;AACrB;AA5NA,IAmBI;AAnBJ;AAAA;AAAA;AAeA;AACA;AAGA,IAAI,aAAkC;AAAA;AAAA;;;ACnBtC,SAAS,eAAe;;;ACCxB;AACA;AACA;AAHA,SAAS,yBAAyB;AAMlC,IAAI,UAAoC;AACxC,IAAI,UAAyB;AAEtB,SAAS,eAAkC;AAChD,MAAI,QAAS,QAAO;AAEpB,QAAM,SAAS,WAAW;AAC1B,QAAM,aAAa,cAAc,MAAM;AAEvC,MAAI,YAAY;AACd,cAAU,aAAa,QAAQ,UAAU;AACzC,cAAU,IAAI,kBAAkB,IAAI;AAAA,MAClC,WAAW,OAAO;AAAA,MAClB,cAAc;AAAA,IAChB,CAAU;AACV,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,QAAQ;AACjB,cAAU,IAAI,kBAAkB,IAAI;AAAA,MAClC,WAAW,OAAO;AAAA,MAClB,QAAQ,OAAO;AAAA,IACjB,CAAC;AACD,WAAO;AAAA,EACT;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,EAKF;AACF;AAEO,SAAS,gBAAmC;AACjD,QAAM,SAAS,WAAW;AAC1B,QAAM,aAAa,cAAc,MAAM;AACvC,MAAI,CAAC,YAAY;AACf,UAAM,IAAI;AAAA,MACR;AAAA,IAGF;AAAA,EACF;AACA,SAAO,aAAa;AACtB;AAUA,eAAsB,oBACpB,IACA,UAAU,OACE;AACZ,MAAI;AACF,WAAO,MAAM,GAAG;AAAA,EAClB,SAAS,KAAc;AACrB,UAAM,cAAc,mBAAmB,GAAG;AAE1C,QAAI,eAAe,CAAC,WAAW,SAAS;AACtC,YAAM,SAAS,WAAW;AAC1B,UAAI,cAAc,mBAAmB,OAAO,SAAS,WAAW;AAGhE,UAAI,OAAO,MAAM;AACf,sBAAc,iBAAiB,aAAa,OAAO,IAAI;AACvD,gBAAQ,OAAO,MAAM,oDAAoD,OAAO,IAAI;AAAA,CAAY;AAAA,MAClG,WAAW,QAAQ,MAAM,OAAO;AAC9B,cAAM,aAAa,MAAM,sBAAsB,OAAO,OAAO;AAC7D,sBAAc,iBAAiB,aAAa,UAAU;AACtD,gBAAQ,OAAO,MAAM,4BAA4B,UAAU;AAAA,CAAY;AAAA,MACzE,OAAO;AACL,gBAAQ,OAAO,MAAM;AAAA,CAAgE;AACrF,gBAAQ,OAAO,MAAM,2BAA2B,WAAW;AAAA,CAAI;AAAA,MACjE;AAEA,YAAM,YAAY,MAAM,aAAa,MAAM;AAC3C,YAAM,OAAO,MAAM,UAAU,WAAW;AAExC,UAAI,KAAK,IAAI;AACX,cAAM,SAAS,MAAM,KAAK,KAAK;AAC/B,gBAAQ,OAAO,MAAM,yCAAyC,OAAO,IAAI,cAAc,OAAO,UAAU;AAAA,CAAK;AAC7G,kBAAU;AACV,qBAAa;AACb,eAAO,oBAAoB,IAAI,IAAI;AAAA,MACrC;AAEA,YAAM,OAAO,MAAM,KAAK,KAAK,EAAE,MAAM,MAAM,EAAE;AAC7C,cAAQ,OAAO,MAAM,kCAAkC,KAAK,MAAM,MAAM,IAAI;AAAA,CAAI;AAAA,IAClF;AAEA,UAAM;AAAA,EACR;AACF;AAEA,SAAS,mBAAmB,KAA+C;AACzE,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAE5C,QAAM,WAAW;AAMjB,QAAM,SAAS,SAAS,UAAU,UAAU,SAAS;AACrD,QAAM,UAAU,SAAS,WAAW;AAEpC,MAAI,WAAW,KAAK;AAClB,UAAM,SAAS,SAAS,UAAU,UAAU,kBAAkB,KACzD,SAAS,UAAU,UAAU,oBAAoB;AACtD,QAAI,QAAQ;AACV,UAAI;AACF,cAAM,UAAU,KAAK,MAAM,OAAO,KAAK,QAAQ,QAAQ,EAAE,SAAS,CAAC;AACnE,eAAO,EAAE,aAAa,QAAQ,UAAU,IAAI;AAAA,MAC9C,QAAQ;AAAA,MAA4B;AAAA,IACtC;AACA,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,QAAQ,SAAS,KAAK,KAAK,QAAQ,SAAS,kBAAkB,KAAK,QAAQ,SAAS,6BAA6B,GAAG;AACtH,WAAO,CAAC;AAAA,EACV;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,SAAiB,MAAwC;AACnF,MAAI,KAAK,aAAa;AACpB,QAAI,KAAK,YAAY,WAAW,MAAM,EAAG,QAAO,KAAK;AACrD,WAAO,GAAG,OAAO,GAAG,KAAK,WAAW;AAAA,EACtC;AACA,SAAO,GAAG,OAAO;AACnB;AAEA,SAAS,iBAAiB,KAAa,MAAsB;AAC3D,MAAI;AACF,UAAM,IAAI,IAAI,IAAI,GAAG;AACrB,MAAE,aAAa,IAAI,QAAQ,IAAI;AAC/B,WAAO,EAAE,SAAS;AAAA,EACpB,QAAQ;AACN,WAAO,IAAI,QAAQ,cAAc,QAAQ,mBAAmB,IAAI,CAAC,EAAE;AAAA,EACrE;AACF;;;AC1JA,IAAM,eAAe,oBAAI,IAAI,CAAC,OAAO,OAAO,KAAK,CAAC;AAClD,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AAEvB,IAAM,eAAuD;AAAA,EAC3D,KAAK;AAAA,IACH,KAAK;AAAA,IACL,MAAM;AAAA,EACR;AAAA,EACA,KAAK;AAAA,IACH,KAAK;AAAA,IACL,MAAM;AAAA,EACR;AAAA,EACA,KAAK;AAAA,IACH,KAAK;AAAA,IACL,MAAM;AAAA,EACR;AACF;AAEO,SAAS,cAAc,OAAwC;AACpE,MAAI,CAAC,aAAa,IAAI,KAAK,GAAG;AAC5B,UAAM,IAAI,MAAM,kBAAkB,KAAK,sBAAsB,CAAC,GAAG,YAAY,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,EAC7F;AACF;AAEO,SAAS,gBAAgB,SAAiB,OAAqB;AACpE,QAAM,QAAQ,UAAU,SAAS,UAAU;AAC3C,QAAM,QAAQ,QAAQ,eAAe,KAAK,OAAO,IAAI,eAAe,KAAK,OAAO;AAChF,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,8BAA8B,KAAK,OAAO,OAAO,GAAG;AAAA,EACtE;AACF;AASO,SAAS,iBAAiB,OAAqB;AACpD,MAAI,QAAQ,QAAS,QAAQ,KAAK;AAChC,UAAM,IAAI,MAAM,qBAAqB,KAAK,+CAA+C;AAAA,EAC3F;AACF;AAEO,SAAS,gBAAgB,eAAuB,OAAuB;AAC5E,QAAM,QAAQ,cAAc,YAAY;AACxC,QAAM,WAAW,aAAa,KAAK,IAAI,KAAK;AAC5C,MAAI,SAAU,QAAO;AACrB,SAAO;AACT;;;ACnDA,IAAM,YAAoC;AAAA,EACxC,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP;AAEO,SAAS,YAAY,MAAe,KAAqB;AAC9D,MAAI,KAAK;AACP,YAAQ,OAAO,MAAM,KAAK,UAAU,IAAI,IAAI,IAAI;AAAA,EAClD,OAAO;AACL,YAAQ,OAAO,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,IAAI;AAAA,EAC3D;AACF;AAEO,SAAS,WAAW,SAAuB;AAChD,UAAQ,OAAO,MAAM,wBAAwB,OAAO;AAAA,CAAI;AAC1D;AAEO,SAAS,YAAY,KAAqB;AAC/C,QAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,aAAW,OAAO;AAClB,MAAI,QAAQ,IAAI,qBAAqB,eAAe,SAAS,IAAI,OAAO;AACtE,YAAQ,OAAO,MAAM,IAAI,QAAQ,IAAI;AAAA,EACvC;AACA,UAAQ,KAAK,CAAC;AAChB;AAEO,SAAS,YAAY,OAAe,QAAwB;AACjE,QAAM,OAAO,UAAU,KAAK,KAAK,UAAU,KAAK;AAChD,SAAO,GAAG,IAAI,GAAG,MAAM;AACzB;;;ACzBO,SAAS,sBAAsBC,UAAwB;AAC5D,QAAM,QAAQA,SAAQ,QAAQ,OAAO,EAAE,YAAY,iCAAiC;AAEpF,QACG,QAAQ,QAAQ,EAChB,YAAY,0BAA0B,EACtC,eAAe,uBAAuB,2CAA2C,EACjF,eAAe,mBAAmB,oBAAoB,EACtD,OAAO,eAAe,eAAe,IAAI,EACzC,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,YAAM,SAAS,aAAa;AAC5B,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,MAAM,OAAO,EAAE,GAAG,KAAK,SAAS,QAAQ,CAAC,KAAK,KAAK,GAAG,OAAO,OAAO,KAAK,KAAK,EAAE,CAAC;AAAA,MAC1F;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,uBAAuB,EACnC,eAAe,mBAAmB,oBAAoB,EACtD,eAAe,uBAAuB,wBAAwB,EAC9D,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,sBAAgB,KAAK,SAAS,KAAK,KAAK;AACxC,YAAM,SAAS,aAAa;AAC5B,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,MAAM,SAAS,KAAK,OAAO,KAAK,OAAO;AAAA,MAChD;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,QACG,QAAQ,UAAU,EAClB,YAAY,yDAAyD,EACrE,eAAe,mBAAmB,oBAAoB,EACtD,eAAe,uBAAuB,wBAAwB,EAC9D,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,sBAAgB,KAAK,SAAS,KAAK,KAAK;AACxC,YAAM,SAAS,aAAa;AAC5B,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,MAAM,YAAY,KAAK,OAAO,KAAK,OAAO;AAAA,MACnD;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,QACG,QAAQ,SAAS,EACjB,YAAY,uBAAuB,EACnC,eAAe,mBAAmB,oBAAoB,EACtD,eAAe,uBAAuB,wBAAwB,EAC9D,OAAO,eAAe,eAAe,IAAI,EACzC,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,sBAAgB,KAAK,SAAS,KAAK,KAAK;AACxC,YAAM,SAAS,aAAa;AAC5B,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,MAAM,cAAc,KAAK,OAAO,KAAK,SAAS,EAAE,OAAO,OAAO,KAAK,KAAK,EAAE,CAAU;AAAA,MAC7F;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,QACG,QAAQ,SAAS,EACjB,YAAY,4BAA4B,EACxC,eAAe,mBAAmB,oBAAoB,EACtD,eAAe,uBAAuB,wBAAwB,EAC9D,eAAe,sBAAsB,gCAAgC,EACrE,OAAO,sBAAsB,2BAA2B,EACxD,OAAO,oBAAoB,yBAAyB,EACpD,OAAO,eAAe,eAAe,KAAK,EAC1C,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,sBAAgB,KAAK,SAAS,KAAK,KAAK;AACxC,YAAM,SAAS,aAAa;AAC5B,YAAM,SAAkC;AAAA,QACtC,YAAY,KAAK;AAAA,QACjB,OAAO,OAAO,KAAK,KAAK;AAAA,MAC1B;AACA,UAAI,KAAK,KAAM,QAAO,OAAO,OAAO,KAAK,IAAI;AAC7C,UAAI,KAAK,GAAI,QAAO,KAAK,OAAO,KAAK,EAAE;AACvC,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,MAAM,WAAW,KAAK,OAAO,KAAK,SAAS,MAAe;AAAA,MACnE;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,QACG,QAAQ,OAAO,EACf,YAAY,iCAAiC,EAC7C,eAAe,mBAAmB,oBAAoB,EACtD,eAAe,uBAAuB,wBAAwB,EAC9D,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,sBAAgB,KAAK,SAAS,KAAK,KAAK;AACxC,YAAM,SAAS,aAAa;AAC5B,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,MAAM,SAAS,KAAK,OAAO,KAAK,OAAO;AAAA,MAChD;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AACL;;;ACzHO,SAAS,uBAAuBC,UAAwB;AAC7D,QAAM,SAASA,SAAQ,QAAQ,QAAQ,EAAE,YAAY,iCAAiC;AAEtF,SACG,QAAQ,UAAU,EAClB,YAAY,yBAAyB,EACrC,eAAe,mBAAmB,oBAAoB,EACtD,eAAe,oBAAoB,qBAAqB,EACxD,OAAO,eAAe,aAAa,EACnC,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,YAAM,SAAS,aAAa;AAC5B,YAAM,SAAkC,CAAC;AACzC,UAAI,KAAK,MAAO,QAAO,QAAQ,OAAO,KAAK,KAAK;AAChD,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,QAAQ,aAAa,KAAK,OAAO,KAAK,UAAU,MAAe;AAAA,MACxE;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,SACG,QAAQ,KAAK,EACb,YAAY,0BAA0B,EACtC,eAAe,mBAAmB,oBAAoB,EACtD,OAAO,eAAe,aAAa,EACnC,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,YAAM,SAAS,aAAa;AAC5B,YAAM,SAAkC,CAAC;AACzC,UAAI,KAAK,MAAO,QAAO,QAAQ,OAAO,KAAK,KAAK;AAChD,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,QAAQ,aAAa,KAAK,OAAO,MAAe;AAAA,MACzD;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,SACG,QAAQ,QAAQ,EAChB,YAAY,mBAAmB,EAC/B,eAAe,mBAAmB,oBAAoB,EACtD,OAAO,qBAAqB,yBAAyB,EACrD,OAAO,eAAe,aAAa,EACnC,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,YAAM,SAAS,aAAa;AAC5B,YAAM,SAAkC,CAAC;AACzC,UAAI,KAAK,MAAO,QAAO,eAAe,KAAK;AAC3C,UAAI,KAAK,MAAO,QAAO,QAAQ,OAAO,KAAK,KAAK;AAChD,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,MAAM,UAAU,KAAK,OAAO,MAAe;AAAA,MACpD;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AACL;;;AC/DA;AACA,YAAYC,eAAc;AAEnB,SAAS,uBAAuBC,UAAwB;AAC7D,QAAM,SAASA,SAAQ,QAAQ,QAAQ,EAAE,YAAY,iCAAiC;AAEtF,SACG,QAAQ,SAAS,EACjB,YAAY,gDAAgD,EAC5D,eAAe,mBAAmB,oBAAoB,EACtD,eAAe,uBAAuB,gBAAgB,EACtD,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,sBAAgB,KAAK,SAAS,KAAK,KAAK;AACxC,YAAM,SAAS,aAAa;AAC5B,YAAM,CAAC,KAAK,UAAU,OAAO,IAAI,MAAM;AAAA,QAAoB,MACzD,QAAQ,IAAI;AAAA,UACV,OAAO,OAAO,OAAO,KAAK,OAAO,KAAK,OAAO;AAAA,UAC7C,OAAO,OAAO,YAAY,KAAK,OAAO,KAAK,OAAO;AAAA,UAClD,OAAO,OAAO,iBAAiB,KAAK,OAAO,KAAK,OAAO;AAAA,QACzD,CAAC;AAAA,MACH;AACA,kBAAY,EAAE,KAAK,UAAU,QAAQ,GAAG,KAAK,GAAG;AAAA,IAClD,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,SACG,QAAQ,KAAK,EACb,YAAY,wBAAwB,EACpC,eAAe,mBAAmB,oBAAoB,EACtD,eAAe,uBAAuB,gBAAgB,EACtD,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,sBAAgB,KAAK,SAAS,KAAK,KAAK;AACxC,YAAM,SAAS,aAAa;AAC5B,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,OAAO,OAAO,KAAK,OAAO,KAAK,OAAO;AAAA,MAC/C;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,SACG,QAAQ,UAAU,EAClB,YAAY,2BAA2B,EACvC,eAAe,mBAAmB,oBAAoB,EACtD,eAAe,uBAAuB,gBAAgB,EACtD,OAAO,eAAe,aAAa,EACnC,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,sBAAgB,KAAK,SAAS,KAAK,KAAK;AACxC,YAAM,SAAS,aAAa;AAC5B,YAAM,SAAkC,CAAC;AACzC,UAAI,KAAK,MAAO,QAAO,QAAQ,OAAO,KAAK,KAAK;AAChD,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,OAAO,iBAAiB,KAAK,OAAO,KAAK,SAAS,MAAe;AAAA,MAC1E;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,SACG,QAAQ,UAAU,EAClB,YAAY,6BAA6B,EACzC,eAAe,mBAAmB,oBAAoB,EACtD,eAAe,uBAAuB,gBAAgB,EACtD,OAAO,eAAe,aAAa,EACnC,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,sBAAgB,KAAK,SAAS,KAAK,KAAK;AACxC,YAAM,SAAS,aAAa;AAC5B,YAAM,SAAkC,CAAC;AACzC,UAAI,KAAK,MAAO,QAAO,QAAQ,OAAO,KAAK,KAAK;AAChD,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,OAAO,mBAAmB,KAAK,OAAO,KAAK,SAAS,MAAe;AAAA,MAC5E;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,SACG,QAAQ,SAAS,EACjB,YAAY,+BAA+B,EAC3C,OAAO,YAAY;AAClB,QAAI;AACF,YAAM,SAAS,WAAW;AAC1B,YAAM,cAAc,MAAM,+DAA4B,cAAc,MAAM;AAC1E,UAAI,eAAe,aAAa,OAAO,SAAS;AAC9C,YAAI,OAAO,QAAQ,cAAc,OAAO,QAAQ,eAAe;AAC7D,cAAI,OAAO,QAAQ,WAAY,SAAQ,OAAO,MAAM,WAAW,OAAO,QAAQ,UAAU;AAAA,CAAI;AAC5F,cAAI,OAAO,QAAQ,cAAe,SAAQ,OAAO,MAAM,WAAW,OAAO,QAAQ,aAAa;AAAA,CAAI;AAAA,QACpG,OAAO;AACL,gBAAM,EAAE,2BAAAC,2BAA0B,IAAI,MAAM;AAC5C,gBAAM,UAAU,MAAMA,2BAA0B,QAAQ,SAAS;AACjE,cAAI,QAAQ,KAAM,SAAQ,OAAO,MAAM,WAAW,QAAQ,KAAK,OAAO;AAAA,CAAI;AAC1E,cAAI,QAAQ,IAAK,SAAQ,OAAO,MAAM,WAAW,QAAQ,IAAI,OAAO;AAAA,CAAI;AAAA,QAC1E;AAAA,MACF,WAAW,OAAO,WAAW;AAC3B,cAAM,EAAE,cAAAC,cAAa,IAAI,MAAM;AAC/B,cAAM,IAAIA,cAAa,QAAQ,KAAK;AACpC,gBAAQ,OAAO,MAAM,GAAG,EAAE,aAAa,YAAY,CAAC,KAAK,EAAE,OAAO;AAAA,CAAI;AAAA,MACxE,OAAO;AACL,gBAAQ,OAAO,MAAM,gDAAgD;AAAA,MACvE;AAAA,IACF,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,SACG,QAAQ,SAAS,EACjB,YAAY,6BAA6B,EACzC,eAAe,mBAAmB,oBAAoB,EACtD,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,YAAM,SAAS,WAAW;AAC1B,YAAM,EAAE,eAAAC,eAAc,IAAI,MAAM;AAChC,YAAM,aAAaA,eAAc,MAAM;AAEvC,UAAI;AACJ,UAAI,eAAe,SAAS,OAAO,WAAW;AAC5C,cAAM,EAAE,cAAAD,cAAa,IAAI,MAAM;AAC/B,kBAAUA,cAAa,QAAQ,KAAK,EAAE;AAAA,MACxC,WAAW,eAAe,aAAa,OAAO,SAAS;AACrD,kBAAU,OAAO,QAAQ;AACzB,YAAI,CAAC,SAAS;AACZ,gBAAM,EAAE,eAAAE,eAAc,IAAI,MAAM;AAChC,oBAAU,MAAMA,eAAc,OAAO,OAAO;AAAA,QAC9C;AAAA,MACF;AACA,UAAI,CAAC,QAAS,OAAM,IAAI,MAAM,8CAA8C;AAE5E,YAAM,SAAS,aAAa;AAC5B,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,OAAO,iBAAiB,KAAK,OAAO,OAAO;AAAA,MACpD;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,SACG,QAAQ,SAAS,EACjB,YAAY,wCAAwC,EACpD,eAAe,mBAAmB,iBAAiB,EACnD,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,YAAM,KAAc,0BAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,cAAQ,OAAO,MAAM,gEAA2D;AAChF,cAAQ,OAAO,MAAM,uDAAuD;AAC5E,YAAM,MAAM,MAAM,GAAG,SAAS,qBAAqB;AACnD,SAAG,MAAM;AAET,UAAI,CAAC,IAAI,KAAK,EAAG,OAAM,IAAI,MAAM,qBAAqB;AAEtD,mBAAa;AAAA,QACX,WAAW,EAAE,KAAK,IAAI,KAAK,GAAG,OAAO,KAAK,MAAM;AAAA,MAClD,CAAC;AACD,cAAQ,OAAO,MAAM,mBAAmB,KAAK,KAAK;AAAA,CAAkD;AAAA,IACtG,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,SACG,QAAQ,SAAS,EACjB,YAAY,iCAAiC,EAC7C,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,YAAM,SAAS,WAAW;AAC1B,YAAM,EAAE,YAAAC,YAAW,IAAI,MAAM;AAC7B,YAAM,QAAQ,MAAMA,YAAW,OAAO,OAAO;AAC7C,kBAAY,OAAO,KAAK,GAAG;AAAA,IAC7B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AACL;;;ACpLO,SAAS,oBAAoBC,UAAwB;AAC1D,QAAM,MAAMA,SAAQ,QAAQ,KAAK,EAAE,YAAY,6BAA6B;AAE5E,MACG,QAAQ,MAAM,EACd,YAAY,2BAA2B,EACvC,eAAe,mBAAmB,oBAAoB,EACtD,eAAe,uBAAuB,mBAAmB,EACzD,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,sBAAgB,KAAK,SAAS,KAAK,KAAK;AACxC,YAAM,SAAS,aAAa;AAC5B,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,IAAI,eAAe,KAAK,OAAO;AAAA,MACxC;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AACL;;;ACrBA,YAAYC,eAAc;AAEnB,SAAS,oBAAoBC,UAAwB;AAC1D,QAAM,MAAMA,SAAQ,QAAQ,KAAK,EAAE,YAAY,qCAAqC;AAEpF,MACG,QAAQ,OAAO,EACf,YAAY,4BAA4B,EACxC,eAAe,mBAAmB,oBAAoB,EACtD,eAAe,wBAAwB,2CAA2C,EAClF,eAAe,yBAAyB,4CAA4C,EACpF,eAAe,qBAAqB,8BAA8B,EAClE,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,YAAM,aAAa,gBAAgB,KAAK,YAAY,KAAK,KAAK;AAC9D,YAAM,cAAc,gBAAgB,KAAK,aAAa,KAAK,KAAK;AAChE,YAAM,SAAS,aAAa;AAC5B,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,IAAI,MAAM,KAAK,OAAO;AAAA,UAC3B,WAAW;AAAA,UACX,YAAY;AAAA,UACZ,QAAQ,KAAK;AAAA,QACf,CAAU;AAAA,MACZ;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,MACG,QAAQ,MAAM,EACd,YAAY,+CAA+C,EAC3D,eAAe,mBAAmB,oBAAoB,EACtD,eAAe,oBAAoB,uBAAuB,EAC1D,eAAe,wBAAwB,2CAA2C,EAClF,eAAe,yBAAyB,4CAA4C,EACpF,eAAe,qBAAqB,8BAA8B,EAClE,OAAO,kBAAkB,uCAAuC,MAAM,EACtE,OAAO,SAAS,yBAAyB,EACzC,OAAO,SAAS,0BAA0B,EAC1C,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,sBAAgB,KAAK,MAAM,KAAK,KAAK;AACrC,UAAI,KAAK,SAAU,kBAAiB,OAAO,KAAK,QAAQ,CAAC;AAEzD,YAAM,aAAa,gBAAgB,KAAK,YAAY,KAAK,KAAK;AAC9D,YAAM,cAAc,gBAAgB,KAAK,aAAa,KAAK,KAAK;AAChE,YAAM,SAAS,cAAc;AAG7B,cAAQ,OAAO,MAAM,qBAAqB;AAC1C,YAAM,QAAQ,MAAM;AAAA,QAAoB,MACtC,OAAO,IAAI,MAAM,KAAK,OAAO;AAAA,UAC3B,WAAW;AAAA,UACX,YAAY;AAAA,UACZ,QAAQ,KAAK;AAAA,QACf,CAAU;AAAA,MACZ;AAGA,cAAQ,OAAO,MAAM,0BAA0B;AAC/C,cAAQ,OAAO,MAAM,iBAAiB,KAAK,KAAK;AAAA,CAAI;AACpD,cAAQ,OAAO,MAAM,iBAAiB,UAAU;AAAA,CAAI;AACpD,cAAQ,OAAO,MAAM,iBAAiB,WAAW;AAAA,CAAI;AACrD,cAAQ,OAAO,MAAM,iBAAiB,KAAK,MAAM;AAAA,CAAI;AACrD,cAAQ,OAAO,MAAM,iBAAiB,KAAK,QAAQ;AAAA,CAAI;AACvD,cAAQ,OAAO,MAAM,iBAAiB,KAAK,UAAU,KAAK,CAAC;AAAA,CAAI;AAC/D,cAAQ,OAAO,MAAM,0BAA0B;AAE/C,UAAI,CAAC,KAAK,KAAK;AACb,cAAM,KAAc,0BAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,cAAM,SAAS,MAAM,GAAG,SAAS,uBAAuB;AACxD,WAAG,MAAM;AACT,YAAI,OAAO,YAAY,MAAM,KAAK;AAChC,kBAAQ,OAAO,MAAM,mBAAmB;AACxC;AAAA,QACF;AAAA,MACF;AAGA,cAAQ,OAAO,MAAM,2BAA2B;AAChD,YAAM,aAAa,MAAM;AAAA,QAAoB,MAC3C,OAAO,IAAI,KAAK,KAAK,OAAO;AAAA,UAC1B,aAAa,KAAK;AAAA,UAClB,WAAW;AAAA,UACX,YAAY;AAAA,UACZ,QAAQ,KAAK;AAAA,UACb,UAAU,OAAO,KAAK,QAAQ;AAAA,QAChC,CAAU;AAAA,MACZ;AAEA,YAAM,EAAE,cAAAC,cAAa,IAAI,MAAM;AAC/B,YAAM,EAAE,YAAAC,aAAY,eAAAC,eAAc,IAAI,MAAM;AAC5C,YAAM,SAASD,YAAW;AAC1B,YAAM,aAAaC,eAAc,MAAM;AACvC,UAAI,CAAC,WAAY,OAAM,IAAI,MAAM,2BAA2B;AAE5D,YAAM,SAASF,cAAa,QAAQ,UAAU;AAC9C,cAAQ,OAAO,MAAM,0BAA0B;AAC/C,YAAM,WAAW,MAAM,OAAO,gBAAgB,WAAW,YAAY;AAGrE,cAAQ,OAAO,MAAM,+BAA+B;AACpD,YAAM,aAAa,MAAM,OAAO,YAAY,KAAK,KAAK,OAAgB;AAAA,QACpE;AAAA,MACF,CAAU;AAEV,UAAI,WAAW,OAAO;AACpB,gBAAQ,OAAO,MAAM,OAAO,WAAW,KAAK;AAAA,CAA2C;AACvF,cAAM,YAAY,MAAM,OAAO,WAAW,WAAW,KAAK;AAC1D,cAAM,SAAS;AAAA,UACb,GAAG;AAAA,UACH,UAAU,YAAY,KAAK,QAAQ,WAAW,aAAc,UAAsC,SAAmB,EAAE;AAAA,QACzH;AACA,oBAAY,QAAQ,KAAK,GAAG;AAAA,MAC9B,OAAO;AACL,cAAM,SAAS;AAAA,UACb,GAAG;AAAA,UACH,UAAU,YAAY,KAAK,OAAO,WAAW,aAAa,EAAE;AAAA,QAC9D;AACA,oBAAY,QAAQ,KAAK,GAAG;AAAA,MAC9B;AAAA,IACF,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,MACG,QAAQ,QAAQ,EAChB,YAAY,uCAAuC,EACnD,eAAe,mBAAmB,oBAAoB,EACtD,eAAe,iBAAiB,YAAY,EAC5C,eAAe,qBAAqB,cAAc,EAClD,eAAe,eAAe,0BAA0B,EACxD,OAAO,yBAAyB,4BAA4B,EAC5D,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,oBAAc,KAAK,KAAK;AACxB,YAAM,SAAS,cAAc;AAC7B,YAAM,SAAS,MAAM;AAAA,QAAoB,MACvC,OAAO,IAAI,YAAY,KAAK,OAAO;AAAA,UACjC,MAAM,KAAK;AAAA,UACX,QAAQ,KAAK;AAAA,UACb,KAAK,KAAK;AAAA,UACV,UAAU,KAAK;AAAA,QACjB,CAAU;AAAA,MACZ;AACA,kBAAY,QAAQ,KAAK,GAAG;AAAA,IAC9B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AACL;;;ACvJO,SAAS,oBAAoBG,UAAwB;AAC1D,QAAM,MAAMA,SAAQ,QAAQ,KAAK,EAAE,YAAY,oBAAoB;AAEnE,MACG,QAAQ,QAAQ,EAChB,YAAY,kBAAkB,EAC9B,eAAe,gBAAgB,QAAQ,EACvC,OAAO,UAAU,iCAAiC,EAClD,OAAO,kBAAkB,gCAAgC,OAAO,EAChE,OAAO,SAAS,yBAAyB,EACzC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,YAAM,SAAS,aAAa;AAC5B,UAAI,KAAK,MAAM;AACb,gBAAQ,OAAO,MAAM,mBAAmB,KAAK,EAAE;AAAA,CAAO;AACtD,cAAM,SAAS,MAAM;AAAA,UAAoB,MACvC,OAAO,WAAW,KAAK,IAAI,OAAO,KAAK,OAAO,CAAC;AAAA,QACjD;AACA,oBAAY,QAAQ,KAAK,GAAG;AAAA,MAC9B,OAAO;AACL,cAAM,SAAS,MAAM;AAAA,UAAoB,MACvC,OAAO,IAAI,IAAI,KAAK,EAAE;AAAA,QACxB;AACA,oBAAY,QAAQ,KAAK,GAAG;AAAA,MAC9B;AAAA,IACF,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AACL;;;AC7BA;AADA,SAAS,cAAAC,mBAAkB;;;ACU3B;AAFA,SAAS,cAAAC,aAAY,aAAAC,YAAW,gBAAAC,eAAc,iBAAAC,gBAAe,aAAa,kBAAkB;AAC5F,SAAS,QAAAC,aAAY;AAGrB,IAAM,WAAWA,MAAK,aAAa,GAAG,MAAM;AAC5C,IAAM,kBAAkB;AAExB,SAAS,gBAAsB;AAC7B,MAAI,CAACJ,YAAW,QAAQ,GAAG;AACzB,IAAAC,WAAU,UAAU,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AAAA,EACtD;AACF;AAEA,SAAS,YAAY,SAAyB;AAAE,SAAOG,MAAK,UAAU,GAAG,OAAO,UAAU;AAAG;AAC7F,SAAS,WAAW,SAAyB;AAAE,SAAOA,MAAK,UAAU,GAAG,OAAO,SAAS;AAAG;AAC3F,SAAS,SAAS,SAAyB;AAAE,SAAOA,MAAK,UAAU,GAAG,OAAO,OAAO;AAAG;AAShF,SAAS,OAAO,UAAU,iBAA0B;AACzD,SAAOJ,YAAW,YAAY,OAAO,CAAC,KAAKA,YAAW,WAAW,OAAO,CAAC;AAC3E;AAEO,SAAS,QAAQ,UAAU,iBAA4C;AAC5E,MAAI,CAAC,OAAO,OAAO,EAAG,QAAO;AAE7B,MAAI;AACF,UAAM,gBAAgBE,cAAa,YAAY,OAAO,GAAG,OAAO,EAAE,KAAK;AACvE,UAAM,eAAeA,cAAa,WAAW,OAAO,GAAG,OAAO,EAAE,KAAK;AAErE,QAAI,2BAA2B;AAC/B,QAAI;AAEJ,QAAIF,YAAW,SAAS,OAAO,CAAC,GAAG;AACjC,YAAM,OAAO,KAAK,MAAME,cAAa,SAAS,OAAO,GAAG,OAAO,CAAC;AAChE,iCAA2B,KAAK,4BAA4B;AAC5D,uBAAiB,KAAK;AAAA,IACxB;AAEA,WAAO,EAAE,cAAc,0BAA0B,eAAe,eAAe;AAAA,EACjF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,QAAQ,SAAwB,UAAU,iBAAuB;AAC/E,gBAAc;AACd,EAAAC,eAAc,YAAY,OAAO,GAAG,QAAQ,eAAe,EAAE,MAAM,IAAM,CAAC;AAC1E,EAAAA,eAAc,WAAW,OAAO,GAAG,QAAQ,cAAc,EAAE,MAAM,IAAM,CAAC;AACxE,EAAAA;AAAA,IACE,SAAS,OAAO;AAAA,IAChB,KAAK,UAAU;AAAA,MACb,0BAA0B,QAAQ;AAAA,MAClC,GAAI,QAAQ,iBAAiB,EAAE,gBAAgB,QAAQ,eAAe,IAAI,CAAC;AAAA,IAC7E,GAAG,MAAM,CAAC;AAAA,IACV,EAAE,MAAM,IAAM;AAAA,EAChB;AACF;;;ADnEA;AAIA;AAEA,YAAYE,eAAc;AAE1B,eAAe,yBAAyB,cAAiD;AACvF,UAAQ,OAAO,MAAM,iCAAiC;AACtD,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,QAAQ,IAAI;AAAA,IACpD,cAAc,YAAY;AAAA,IAC1B,iBAAiB,YAAY;AAAA,EAC/B,CAAC;AACD,eAAa;AAAA,IACX,SAAS,EAAE,GAAG,cAAc,YAAY,cAAc;AAAA,EACxD,CAAC;AACH;AAEO,SAAS,qBAAqBC,UAAwB;AAC3D,EAAAA,SACG,QAAQ,OAAO,EACf,YAAY,uDAAuD,EACnE,SAAS,WAAW,6BAA6B,EACjD,OAAO,SAAS,oDAA+C,EAC/D,OAAO,WAAW,iBAAiB,EACnC,OAAO,OAAO,UAA8B,SAA6C;AACxF,QAAI;AACF,UAAI,KAAK,SAAS,UAAU;AAC1B,cAAM,aAAa,QAAQ;AAAA,MAC7B,OAAO;AACL,cAAM,WAAW;AAAA,MACnB;AAAA,IACF,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,EAAAA,SACG,QAAQ,QAAQ,EAChB,YAAY,yCAAyC,EACrD,eAAe,iBAAiB,wBAAwB,EACxD,eAAe,iBAAiB,qBAAqB,EACrD,eAAe,mBAAmB,0BAA0B,EAC5D,OAAO,OAAO,SAAyD;AACtE,QAAI;AACF,YAAM,mBAAmB,KAAK,OAAO,KAAK,MAAM,KAAK,KAAK;AAAA,IAC5D,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,EAAAA,SACG,QAAQ,QAAQ,EAChB,YAAY,sCAAsC,EAClD,OAAO,MAAM;AACZ,UAAM,SAAS,WAAW;AAC1B,QAAI,OAAO,SAAS;AAClB,mBAAa,EAAE,SAAS,OAAU,CAAC;AACnC,cAAQ,OAAO,MAAM,mEAAmE;AACxF,cAAQ,OAAO,MAAM,+CAA+C;AAAA,IACtE,OAAO;AACL,cAAQ,OAAO,MAAM,8BAA8B;AAAA,IACrD;AAAA,EACF,CAAC;AAEH,EAAAA,SACG,QAAQ,YAAY,EACpB,YAAY,qDAAqD,EACjE,SAAS,WAAW,uBAAuB,EAC3C,OAAO,OAAO,aAAsB;AACnC,QAAI;AACF,YAAM,YAAY,QAAQ;AAAA,IAC5B,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,EAAAA,SACG,QAAQ,mBAAmB,EAC3B,YAAY,uDAAuD,EACnE,eAAe,iBAAiB,6BAA6B,EAC7D,eAAe,iBAAiB,8BAA8B,EAC9D,eAAe,mBAAmB,mBAAmB,EACrD,OAAO,OAAO,SAAyD;AACtE,QAAI;AACF,YAAM,SAAS,WAAW;AAC1B,UAAI,CAAC,OAAO,SAAS,gBAAgB;AACnC,cAAM,IAAI,MAAM,iDAAiD;AAAA,MACnE;AAEA,cAAQ,OAAO,MAAM,gBAAgB;AACrC,YAAM,EAAE,kBAAkB,IAAI,MAAM;AAAA,QAClC,KAAK;AAAA,QAAO,KAAK,KAAK,KAAK;AAAA,QAAG,OAAO,QAAQ;AAAA,MAC/C;AAEA,cAAQ,OAAO,MAAM,8BAA8B;AACnD,YAAM,uBAAuB,KAAK,OAAO,mBAAmB,OAAO,OAAO;AAE1E,cAAQ,OAAO,MAAM,SAAS,KAAK,KAAK;AAAA,CAAwB;AAChE,cAAQ,OAAO,MAAM,gEAAgE;AAAA,IACvF,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AACL;AAIA,SAAS,cAAc,aAAqB,qBAAqC;AAC/E,QAAM,SAASC,YAAW,QAAQ;AAClC,SAAO,OAAO,WAAW;AACzB,SAAO,IAAI;AACX,QAAM,MAAM,OAAO,KAAK;AAAA,IACtB,KAAK,OAAO,KAAK,qBAAqB,QAAQ;AAAA,IAC9C,QAAQ;AAAA,IACR,MAAM;AAAA,EACR,CAAC;AACD,SAAO,IAAI,SAAS,KAAK;AAC3B;AASA,eAAe,mBAAsB,MAAc,MAA2C;AAC5F,QAAM,UAAU,WAAW,EAAE,WAAW;AAExC,QAAM,MAAM,MAAM,MAAM,GAAG,OAAO,GAAG,IAAI,IAAI;AAAA,IAC3C,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,IAAI;AAAA,EAC3B,CAAC;AAED,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,QAAI,SAAS;AACb,QAAI;AAAE,eAAS,KAAK,MAAM,IAAI,EAAE,WAAW;AAAA,IAAM,QAAQ;AAAA,IAAe;AACxE,UAAM,IAAI,MAAM,uBAAuB,IAAI,MAAM,MAAM,MAAM,EAAE;AAAA,EACjE;AAEA,SAAO,IAAI,KAAK;AAClB;AAEA,eAAe,YACb,cACA,0BACA,aACA,WAC0B;AAC1B,SAAO,mBAAmB,iBAAiB,EAAE,cAAc,0BAA0B,aAAa,UAAU,CAAC;AAC/G;AAEA,eAAe,YAAY,OAAe,gBAAqD;AAC7F,SAAO,mBAAmB,sBAAsB,EAAE,OAAO,GAAI,kBAAkB,EAAE,eAAe,EAAG,CAAC;AACtG;AAEA,eAAe,cACb,OAAe,SAAiB,iBAAyB,gBACjB;AACxC,SAAO,mBAAmB,wBAAwB,EAAE,OAAO,SAAS,iBAAiB,GAAI,kBAAkB,EAAE,eAAe,EAAG,CAAC;AAClI;AAEA,eAAe,aAA4B;AAEzC,QAAM,cAAc,QAAQ;AAC5B,MAAI,aAAa,gBAAgB;AAC/B,YAAQ,OAAO,MAAM,iDAAiD;AACtE,UAAM,EAAE,SAAS,OAAO,IAAI,MAAM;AAAA,MAChC,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,IACd;AAEA,UAAM,eAAmC;AAAA,MACvC,cAAc,YAAY;AAAA,MAC1B,eAAe,YAAY;AAAA,MAC3B,gBAAgB,YAAY;AAAA,MAC5B,cAAc;AAAA,MACd,eAAe;AAAA,IACjB;AACA,iBAAa,EAAE,SAAS,aAAa,CAAC;AAEtC,UAAM,SAAS,WAAW;AAC1B,QAAI,CAAC,OAAO,SAAS,YAAY;AAC/B,YAAM,yBAAyB,OAAO,OAAQ;AAAA,IAChD;AAEA,YAAQ,OAAO,MAAM,gCAAgC;AACrD,UAAM,UAAU,WAAW;AAC3B,YAAQ,OAAO,MAAM,aAAa,QAAQ,SAAS,UAAU;AAAA,CAAI;AACjE,YAAQ,OAAO,MAAM,aAAa,QAAQ,SAAS,aAAa;AAAA,CAAI;AACpE;AAAA,EACF;AAGA,MAAI;AACJ,QAAM,YAAY,QAAQ;AAE1B,MAAI,WAAW,gBAAgB,UAAU,iBAAiB,UAAU,0BAA0B;AAC5F,cAAU;AAAA,MACR,cAAc,UAAU;AAAA,MACxB,0BAA0B,UAAU;AAAA,MACpC,eAAe,UAAU;AAAA,IAC3B;AACA,YAAQ,OAAO,MAAM,uBAAuB,QAAQ,aAAa,MAAM,GAAG,EAAE,CAAC;AAAA,CAAQ;AAAA,EACvF,OAAO;AACL,cAAU,oBAAoB;AAC9B,YAAQ;AAAA,MACN,cAAc,QAAQ;AAAA,MACtB,0BAA0B,QAAQ;AAAA,MAClC,eAAe,QAAQ;AAAA,IACzB,CAAC;AACD,YAAQ,OAAO,MAAM;AAAA,CAAgC;AAAA,EACvD;AAGA,QAAM,cAAc,KAAK,IAAI,EAAE,SAAS;AACxC,QAAM,YAAY,cAAc,aAAa,QAAQ,aAAa;AAElE,UAAQ,OAAO,MAAM,mCAAmC;AACxD,QAAM,SAAS,MAAM;AAAA,IACnB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF;AAGA,UAAQ;AAAA,IACN,cAAc,QAAQ;AAAA,IACtB,0BAA0B,QAAQ;AAAA,IAClC,eAAe,QAAQ;AAAA,IACvB,gBAAgB,OAAO;AAAA,EACzB,CAAC;AAGD,eAAa;AAAA,IACX,SAAS;AAAA,MACP,cAAc,QAAQ;AAAA,MACtB,eAAe,QAAQ;AAAA,MACvB,gBAAgB,OAAO;AAAA,MACvB,cAAc;AAAA,MACd,eAAe;AAAA,MACf,YAAY,OAAO;AAAA,MACnB,eAAe,OAAO;AAAA,IACxB;AAAA,EACF,CAAC;AAED,MAAI,OAAO,WAAW;AACpB,YAAQ,OAAO,MAAM,sDAAsD;AAAA,EAC7E,OAAO;AACL,YAAQ,OAAO,MAAM,2BAA2B;AAAA,EAClD;AACA,UAAQ,OAAO,MAAM,aAAa,OAAO,UAAU;AAAA,CAAI;AACvD,UAAQ,OAAO,MAAM,aAAa,OAAO,aAAa;AAAA,CAAI;AAC5D;AAIA,eAAe,aAAa,OAA+B;AACzD,MAAI,CAAC,OAAO;AACV,UAAMC,MAAc,0BAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,YAAQ,MAAMA,IAAG,SAAS,oBAAoB;AAC9C,IAAAA,IAAG,MAAM;AACT,QAAI,CAAC,OAAO,KAAK,EAAG,OAAM,IAAI,MAAM,iBAAiB;AACrD,YAAQ,MAAM,KAAK;AAAA,EACrB;AAGA,UAAQ,OAAO,MAAM,kBAAkB,KAAK;AAAA,CAAO;AACnD,QAAM,EAAE,MAAM,IAAI,MAAM,YAAY,KAAK;AAGzC,MAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,YAAQ,OAAO,MAAM,KAAK,UAAU,EAAE,OAAO,MAAM,CAAC,IAAI,IAAI;AAC5D,YAAQ,OAAO,MAAM,8CAA8C;AACnE,YAAQ,OAAO,MAAM,iCAAiC,KAAK,0BAA0B,KAAK;AAAA,CAAI;AAC9F;AAAA,EACF;AAEA,QAAM,KAAc,0BAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,QAAM,OAAO,MAAM,GAAG,SAAS,kBAAkB;AACjD,KAAG,MAAM;AACT,MAAI,CAAC,MAAM,KAAK,EAAG,OAAM,IAAI,MAAM,oBAAoB;AAEvD,QAAM,mBAAmB,OAAO,KAAK,KAAK,GAAG,KAAK;AACpD;AAEA,eAAe,mBAAmB,OAAe,MAAc,OAA8B;AAE3F,QAAM,UAAU,oBAAoB;AAGpC,UAAQ,OAAO,MAAM,gBAAgB;AACrC,QAAM,SAAS,MAAM,mBAElB,yBAAyB;AAAA,IAC1B;AAAA,IAAO,SAAS;AAAA,IAAM;AAAA,IACtB,cAAc,QAAQ;AAAA,IACtB,0BAA0B,QAAQ;AAAA,EACpC,CAAC;AAGD,UAAQ;AAAA,IACN,cAAc,QAAQ;AAAA,IACtB,0BAA0B,QAAQ;AAAA,IAClC,eAAe,QAAQ;AAAA,IACvB,gBAAgB,OAAO;AAAA,EACzB,CAAC;AAED,eAAa;AAAA,IACX,SAAS;AAAA,MACP,cAAc,QAAQ;AAAA,MACtB,eAAe,QAAQ;AAAA,MACvB,gBAAgB,OAAO;AAAA,MACvB,cAAc;AAAA,MACd,eAAe;AAAA,MACf,YAAY,OAAO;AAAA,MACnB,eAAe,OAAO;AAAA,IACxB;AAAA,EACF,CAAC;AAED,MAAI,OAAO,WAAW;AACpB,YAAQ,OAAO,MAAM,sDAAsD;AAAA,EAC7E,OAAO;AACL,YAAQ,OAAO,MAAM,2BAA2B;AAAA,EAClD;AACA,UAAQ,OAAO,MAAM,aAAa,OAAO,UAAU;AAAA,CAAI;AACvD,UAAQ,OAAO,MAAM,aAAa,OAAO,aAAa;AAAA,CAAI;AAC5D;AAIA,eAAe,YAAY,OAA+B;AACxD,QAAM,SAAS,WAAW;AAC1B,MAAI,CAAC,OAAO,SAAS,gBAAgB;AACnC,UAAM,IAAI,MAAM,iDAAiD;AAAA,EACnE;AAEA,MAAI,CAAC,OAAO;AACV,UAAMA,MAAc,0BAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,YAAQ,MAAMA,IAAG,SAAS,uBAAuB;AACjD,IAAAA,IAAG,MAAM;AACT,QAAI,CAAC,OAAO,KAAK,EAAG,OAAM,IAAI,MAAM,iBAAiB;AACrD,YAAQ,MAAM,KAAK;AAAA,EACrB;AAGA,UAAQ,OAAO,MAAM,gCAAgC,KAAK;AAAA,CAAO;AACjE,QAAM,EAAE,MAAM,IAAI,MAAM,YAAY,KAAK;AAGzC,MAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,YAAQ,OAAO,MAAM,KAAK,UAAU,EAAE,OAAO,OAAO,MAAM,SAAS,CAAC,IAAI,IAAI;AAC5E,YAAQ,OAAO,MAAM,wCAAwC;AAC7D,YAAQ,OAAO,MAAM,4CAA4C,KAAK,0BAA0B,KAAK;AAAA,CAAI;AACzG;AAAA,EACF;AAEA,QAAM,KAAc,0BAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,QAAM,OAAO,MAAM,GAAG,SAAS,2BAA2B;AAC1D,KAAG,MAAM;AACT,MAAI,CAAC,MAAM,KAAK,EAAG,OAAM,IAAI,MAAM,6BAA6B;AAGhE,UAAQ,OAAO,MAAM,gBAAgB;AACrC,QAAM,EAAE,kBAAkB,IAAI,MAAM;AAAA,IAClC;AAAA,IAAO,KAAK,KAAK;AAAA,IAAG,OAAO,QAAQ;AAAA,EACrC;AAGA,UAAQ,OAAO,MAAM,8BAA8B;AACnD,QAAM,uBAAuB,OAAO,mBAAmB,OAAO,OAAO;AAErE,UAAQ,OAAO,MAAM,SAAS,KAAK;AAAA,CAAwB;AAC3D,UAAQ,OAAO,MAAM,gEAAgE;AACvF;;;AEvXA;AAGO,SAAS,uBAAuBC,UAAwB;AAC7D,QAAM,SAASA,SAAQ,QAAQ,QAAQ,EAAE,YAAY,0BAA0B;AAE/E,SACG,QAAQ,KAAK,EACb,YAAY,2BAA2B,EACvC,eAAe,eAAe,8BAA8B,EAC5D,eAAe,mBAAmB,cAAc,EAChD,OAAO,CAAC,SAAS;AAChB,QAAI;AACF,YAAM,cAAc,CAAC,UAAU,WAAW,eAAe,MAAM;AAC/D,UAAI,CAAC,YAAY,SAAS,KAAK,GAAG,GAAG;AACnC,cAAM,IAAI,MAAM,gBAAgB,KAAK,GAAG,eAAe,YAAY,KAAK,IAAI,CAAC,EAAE;AAAA,MACjF;AACA,mBAAa,EAAE,CAAC,KAAK,GAAG,GAAG,KAAK,MAAM,CAAC;AACvC,cAAQ,OAAO,MAAM,OAAO,KAAK,GAAG,MAAM,KAAK,QAAQ,WAAW,QAAQ,KAAK,KAAK;AAAA,CAAI;AAAA,IAC1F,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,SACG,QAAQ,KAAK,EACb,YAAY,oBAAoB,EAChC,OAAO,eAAe,sBAAsB,EAC5C,OAAO,CAAC,SAAS;AAChB,QAAI;AACF,YAAM,MAAM,WAAW;AACvB,UAAI,KAAK,KAAK;AACZ,cAAM,QAAS,IAA2C,KAAK,GAAG;AAClE,YAAI,UAAU,QAAW;AACvB,kBAAQ,OAAO,MAAM,GAAG,KAAK,GAAG;AAAA,CAAe;AAAA,QACjD,WAAW,KAAK,QAAQ,YAAY,OAAO,UAAU,UAAU;AAC7D,kBAAQ,OAAO,MAAM,GAAG,KAAK,GAAG,KAAK,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,MAAM,MAAM,EAAE,CAAC;AAAA,CAAI;AAAA,QACjF,OAAO;AACL,kBAAQ,OAAO,MAAM,GAAG,KAAK,GAAG,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,CAAI;AAAA,QAChE;AAAA,MACF,OAAO;AACL,cAAM,UAAU;AAAA,UACd,QAAQ,IAAI,SAAS,GAAG,IAAI,OAAO,MAAM,GAAG,CAAC,CAAC,QAAQ;AAAA,UACtD,SAAS,IAAI;AAAA,UACb,YAAY,cAAc,GAAG;AAAA,UAC7B,SAAS,IAAI,UAAU,EAAE,gBAAgB,IAAI,QAAQ,eAAe,IAAI;AAAA,UACxE,WAAW,IAAI,YAAY,EAAE,OAAO,IAAI,UAAU,MAAM,IAAI;AAAA,QAC9D;AACA,gBAAQ,OAAO,MAAM,KAAK,UAAU,SAAS,MAAM,CAAC,IAAI,IAAI;AAAA,MAC9D;AAAA,IACF,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AAEH,SACG,QAAQ,MAAM,EACd,YAAY,oCAAoC,EAChD,OAAO,MAAM;AACZ,QAAI;AACF,YAAM,MAAM,WAAW;AACvB,YAAM,OAAO,cAAc,GAAG;AAE9B,UAAI,SAAS,WAAW;AACtB,gBAAQ,OAAO,MAAM,uBAAuB,IAAI,QAAS,cAAc;AAAA,CAAK;AAC5E,cAAM,SAAS,IAAI,KAAK,IAAI,QAAS,gBAAgB,GAAI;AACzD,cAAM,UAAU,KAAK,IAAI,IAAI,IAAI,QAAS,gBAAgB;AAC1D,gBAAQ,OAAO,MAAM,YAAY,UAAU,YAAY,QAAQ,cAAc,OAAO,YAAY,CAAC;AAAA,CAAK;AAAA,MACxG,WAAW,SAAS,OAAO;AACzB,gBAAQ,OAAO,MAAM,kBAAkB,IAAI,UAAW,KAAK;AAAA,CAAK;AAAA,MAClE,WAAW,IAAI,QAAQ;AACrB,gBAAQ,OAAO,MAAM,kBAAkB,IAAI,OAAO,MAAM,GAAG,CAAC,CAAC;AAAA,CAAQ;AAAA,MACvE,OAAO;AACL,gBAAQ,OAAO,MAAM,wBAAwB;AAC7C,gBAAQ,OAAO,MAAM,uDAAuD;AAC5E,gBAAQ,OAAO,MAAM,uEAAuE;AAAA,MAC9F;AAAA,IACF,SAAS,KAAK;AAAE,kBAAY,GAAG;AAAA,IAAG;AAAA,EACpC,CAAC;AACL;;;AZlEA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,aAAa,EAClB,QAAQ,OAAO,EACf,YAAY,uEAAkE;AAEjF,sBAAsB,OAAO;AAC7B,uBAAuB,OAAO;AAC9B,uBAAuB,OAAO;AAC9B,oBAAoB,OAAO;AAC3B,oBAAoB,OAAO;AAC3B,oBAAoB,OAAO;AAC3B,qBAAqB,OAAO;AAC5B,uBAAuB,OAAO;AAE9B,QAAQ,WAAW,EAAE,MAAM,CAAC,QAAe;AACzC,UAAQ,OAAO,MAAM,iBAAiB,IAAI,OAAO;AAAA,CAAI;AACrD,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["privateKeyToAccount","bs58Decode","program","program","readline","program","createWalletWithAddresses","createWallet","getWalletMode","getEvmAddress","getPricing","program","readline","program","createWallet","loadConfig","getWalletMode","program","createSign","existsSync","mkdirSync","readFileSync","writeFileSync","join","readline","program","createSign","rl","program"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chainstream-io/cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.11",
|
|
4
4
|
"description": "ChainStream CLI — on-chain data and DeFi execution for AI agents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -54,7 +54,11 @@
|
|
|
54
54
|
"viem": "^2.46.3"
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
|
57
|
+
"@commitlint/cli": "^20.5.0",
|
|
58
|
+
"@commitlint/config-conventional": "^20.5.0",
|
|
57
59
|
"@types/node": "^22.0.0",
|
|
60
|
+
"commitizen": "^4.3.1",
|
|
61
|
+
"cz-conventional-changelog": "^3.3.0",
|
|
58
62
|
"tsup": "^8.4.0",
|
|
59
63
|
"tsx": "^4.19.0",
|
|
60
64
|
"typescript": "^5.7.0"
|