@liberfi.io/ui-trade 0.1.21 → 0.1.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/states/instant-trade-amount.ts","../src/hooks/useInstantTradeAmount.ts","../src/types.ts","../src/components/instant-trade/chain-features.ts","../src/states/preset.ts","../src/hooks/usePresetValues.ts","../src/hooks/useSwap.ts","../src/hooks/useSwapRoutePolling.ts","../src/hooks/useTxConfirmation.ts","../src/components/swap/swap.script.ts","../src/components/swap/swap-preview-modal.tsx","../src/components/swap/swap.ui.tsx","../src/components/swap/swap.widget.tsx","../src/components/instant-trade/instant-trade.context.tsx","../src/components/instant-trade/instant-trade.script.ts","../src/components/instant-trade/preset-form.ui.tsx","../src/components/instant-trade/instant-trade.ui.tsx","../src/components/instant-trade/instant-trade.widget.tsx","../src/components/instant-trade/amount-preset-input.script.ts","../src/components/instant-trade/amount-preset-input.ui.tsx","../src/components/instant-trade/amount-preset-input.widget.tsx","../src/components/instant-trade/preset-form.script.ts","../src/components/instant-trade/preset-form.widget.tsx","../src/components/instant-trade/multi-preset-form.script.ts","../src/components/instant-trade/multi-preset-form.widget.tsx","../src/components/instant-trade/preset-form.modal.tsx","../src/components/instant-trade/instant-trade-utils.ts","../src/components/instant-trade/instant-trade-button.script.ts","../src/components/instant-trade/instant-trade-button.widget.tsx","../src/components/instant-trade/instant-trade-swap.context.tsx","../src/components/instant-trade/instant-trade-list-button.script.ts","../src/components/instant-trade/instant-trade-list-button.widget.tsx","../src/version.ts"],"names":["DEFAULT_PREFIX","DEFAULT_STATE","storageKey","prefix","id","chain","tokenAddress","parseKey","key","sep","rest","instantTradeAmountKey","instantTradeAmountAtomFamily","atomFamily","atomWithStorage","useInstantTradeAmount","storageKeyPrefix","useAtomValue","DEFAULT_SOL_TRADE_PRESET","DEFAULT_EVM_TRADE_PRESET","DEFAULT_BSC_TRADE_PRESET","DEFAULT_BUY_AMOUNTS_MAP","DEFAULT_BUY_AMOUNTS_FALLBACK","getDefaultBuyAmounts","symbol","DEFAULT_SELL_PERCENTAGES","getChainPresetFeatures","nativeToken","getNativeToken","nativeSymbol","isSolanaChain","isBinanceChain","getDefaultPresetForChain","direction","index","presetKey","presetAtomFamily","usePresetValues","presetIndex","base64ToUint8Array","base64","binary","bytes","i","uint8ArrayToBase64","useSwap","options","client","useDexClient","isSwapping","setIsSwapping","useState","optionsRef","useRef","swap","useCallback","input","wallet","route","API","e","err","signedBytes","unsignedBytes","sendResult","signedBase64","result","useMemo","DEFAULT_INTERVAL","useSwapRoutePolling","params","interval","paused","enabled","query","useSwapRouteQuery","useEffect","DEFAULT_TIMEOUT","useTxConfirmation","transactions","setTransactions","updateTx","txHash","status","prev","existing","next","track","timeout","success","clear","clearAll","SOLANA_CHAINS","Chain","chainNamespace","ChainNamespace","TOKEN_POLL_MS","BALANCE_POLL_MS","formatOutputAmount","plans","decimals","raw","padded","intPart","trimmed","useSwapScript","wallets","useWallets","ns","w","walletAddress","fromTokenAddress","setFromTokenAddress","toTokenAddress","setToTokenAddress","fromRef","toRef","tokenAddresses","tokensQuery","useTokensQuery","fromToken","t","toToken","balancesQuery","useWalletPortfoliosByTokensQuery","fromBalance","p","toBalance","amount","setAmount","amountInDecimals","parts","amountInUsd","price","value","setHalfAmount","bal","half","setMaxAmount","routeParams","isSwappingRef","isRouting","routeError","outputAmount","outputAmountInUsd","rawSwap","onCompleteRef","latestTxStatus","entries","isLoading","SwapPreviewModal","isOpen","onOpenChange","inputAmount","inputAmountInUsd","onConfirm","useTranslation","expanded","setExpanded","toggleExpanded","plan","jsx","Modal","jsxs","ModalContent","ModalHeader","ModalBody","Avatar","WalletBalanceIcon","formatNumber","formatUsd","truncateAddress","formatSmallAmount","TradeIcon","Button","ChevronUpIcon","ChevronDownIcon","ModalFooter","n","addr","SwapUI","onAmountChange","onHalfAmount","onMaxAmount","onFromTokenSelect","onToTokenSelect","onPreview","className","cn","Input","SwapWidget","from","to","onComplete","script","onOpen","onClose","useDisclosure","handleConfirm","Fragment","buildDefaultSettings","preset","DEFAULT_INSTANT_TRADE_SETTINGS","readStoredSettings","fallback","writeStoredSettings","settings","InstantTradeContext","createContext","useInstantTrade","ctx","useContext","InstantTradeProvider","controlledSettings","onSettingsChange","children","isControlled","chainDefaults","localSettings","setLocalSettings","setSettings","updateBuySettings","buy","updateSellSettings","sell","setDirection","buyPreset","setBuyPreset","sellPreset","setSellPreset","defaultPreset","currentPresetValues","idx","useInstantTradeScript","onSwapSubmitted","onSwapError","wrappedToken","getWrappedToken","chainToNamespace","addrs","tokenInfo","nativeAddr","nativeBalance","tokenBalance","showSettings","setShowSettings","lastClickedPreset","handlePresetClick","last","onSubmittedRef","onErrorRef","phase","nativeDecimals","inputAddress","isBuy","BigNumber","chainDefault","slippage","isAntiMev","solanaFields","submitText","dir","insufficientSuffix","nativePrice","tk","usd","formatAmountUSD","isDisabled","PresetFormUI","onChange","disableAnimation","update","patch","features","feeKey","SlippageRow","v","FeeRow","TipFeeRow","AutoFeeRow","MaxAutoFeeRow","AntiMEVRow","CustomRPCRow","label","StyledNumberInput","feeType","tooltip","StyledTooltip","InfoIcon","StyledSwitch","icons","ShieldOffIcon","ShieldIcon","ShieldPlusIcon","tooltips","StyledBorderedTabs","opt","Icon","tip","Tab","StyledInput","InstantTradeUI","onDirectionChange","customAmounts","customPercentages","onQuickAmountClick","onQuickPercentageClick","onCustomAmountsEdit","onCustomPercentagesEdit","tokenSymbol","amountConversion","onPresetChange","presetValues","onPresetSettingsChange","onPresetClick","onSubmit","headerExtra","Tabs","BuyAmountSection","SellAmountSection","PresetOverview","amountLabel","handleChange","NumberInput","QuickButtons","values","onSelect","onEdit","suffix","isEditing","setIsEditing","tempValues","setTempValues","handleStartEdit","handleSave","_","val","CheckIcon","EditIcon","antiMevKey","Tooltip","SlippageIcon","formatPercent","ZapFastIcon","formatPrice","CoinsIcon","InstantTradeWidget","InstantTradeWidgetInner","handleQuickAmountClick","handleQuickPercentageClick","pct","handleCustomAmountsEdit","amounts","handleCustomPercentagesEdit","pcts","handlePresetSettingsChange","presets","handlePresetChange","currentPreset","useAmountPresetInputScript","token","state","setState","useAtom","p0","p1","p2","handleAmountChange","AmountPresetInputUI","radius","size","handleSelectionChange","LightningIcon","TokenIcon","StyledLightTabs","PresetTooltip","AmountPresetInputWidget","scriptParams","usePresetFormScript","defaultDirection","setValue","PresetFormWidget","StyledSolidTabs","PRESET_COUNT","useMultiPresetFormScript","defaultPresetIndex","setPresetIndex","MultiPresetFormWidget","presetCount","DEFAULT_MODAL_ID","PresetFormModal","AsyncModal","modalProps","PresetFormModalContent","chains","defaultChain","setChain","StyledModal","ChainSelectMobileUI","ScrollShadow","buildSwapParams","output","amountStr","priorityFee","tipFee","useInstantTradeButtonScript","useConnectedWallet","handleSwap","useAuthCallback","InstantTradeButtonWidget","color","InstantTradeSwapContext","InstantTradeSwapProvider","walletRef","swapRef","chainRef","stableSwap","authSwap","useInstantTradeSwap","useInstantTradeListButtonScript","tokenRef","presetValuesRef","InstantTradeListButtonWidget","memo","version_default"],"mappings":"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","file":"index.js","sourcesContent":["\"use client\";\n\nimport { atomFamily } from \"jotai-family\";\nimport { atomWithStorage } from \"jotai/utils\";\nimport type { Chain } from \"@liberfi.io/types\";\n\nexport interface AmountPresetState {\n amount: number | undefined;\n preset: number;\n}\n\nconst DEFAULT_PREFIX = \"liberfi.\";\n\nconst DEFAULT_STATE: AmountPresetState = { amount: undefined, preset: 0 };\n\nfunction storageKey(\n prefix: string,\n id: string,\n chain: string,\n tokenAddress: string,\n): string {\n return `${prefix}instant-trade.${id}.${chain}.${tokenAddress}`;\n}\n\nfunction parseKey(key: string): {\n prefix: string;\n id: string;\n chain: Chain;\n tokenAddress: string;\n} {\n const sep = key.lastIndexOf(\":\");\n const prefix = key.slice(0, sep + 1);\n const rest = key.slice(sep + 1);\n const [id, chain, tokenAddress] = rest.split(\".\");\n return {\n prefix,\n id,\n chain: chain as Chain,\n tokenAddress,\n };\n}\n\n/**\n * Construct an atomFamily key for instant-trade amount + preset state.\n *\n * @param id - Business identifier (e.g. `\"token-detail\"`).\n * @param chain - Target chain.\n * @param tokenAddress - Payment token address.\n * @param prefix - Storage key prefix. Defaults to `\"liberfi.\"`.\n */\nexport function instantTradeAmountKey(\n id: string,\n chain: Chain,\n tokenAddress: string,\n prefix: string = DEFAULT_PREFIX,\n): string {\n return `${prefix}:${id}.${chain}.${tokenAddress}`;\n}\n\n/**\n * Atom family for instant-trade amount and preset index, persisted via `atomWithStorage`.\n *\n * Each atom is keyed by a string built with {@link instantTradeAmountKey}.\n * The storage key includes `id`, `chain`, and `tokenAddress` so the same token\n * on different chains (e.g. USDC on Solana vs Ethereum) has separate persisted values.\n */\nexport const instantTradeAmountAtomFamily = atomFamily((key: string) => {\n const { prefix, id, chain, tokenAddress } = parseKey(key);\n return atomWithStorage<AmountPresetState>(\n storageKey(prefix, id, String(chain), tokenAddress),\n DEFAULT_STATE,\n undefined,\n { getOnInit: true },\n );\n});\n","import { useAtomValue } from \"jotai\";\nimport type { Chain } from \"@liberfi.io/types\";\nimport {\n instantTradeAmountAtomFamily,\n instantTradeAmountKey,\n type AmountPresetState,\n} from \"../states/instant-trade-amount\";\n\nexport interface UseInstantTradeAmountParams {\n /** Business identifier (e.g. `\"token-detail\"`). */\n id: string;\n /** Target chain. */\n chain: Chain;\n /** Payment token address. */\n tokenAddress: string;\n /** Storage key prefix. Must match the prefix used by the corresponding AmountPresetInputWidget. Defaults to `\"liberfi.\"`. */\n storageKeyPrefix?: string;\n}\n\n/**\n * Read the persisted instant-trade amount and preset index for a given id / chain / token.\n *\n * The value is sourced from the same `atomWithStorage` atom family that\n * {@link AmountPresetInputWidget} writes to, so it stays in sync automatically.\n */\nexport function useInstantTradeAmount({\n id,\n chain,\n tokenAddress,\n storageKeyPrefix,\n}: UseInstantTradeAmountParams): AmountPresetState {\n return useAtomValue(\n instantTradeAmountAtomFamily(\n instantTradeAmountKey(id, chain, tokenAddress, storageKeyPrefix),\n ),\n );\n}\n","import { Chain, API } from \"@liberfi.io/types\";\nimport type { WalletAdapter } from \"@liberfi.io/wallet-connector\";\n\n/**\n * Input parameters for the `swap()` function returned by {@link useSwap}.\n *\n * The caller provides chain, wallet, token addresses, amount and optional\n * chain-specific settings. The hook handles route fetching, signing and\n * transaction submission internally.\n */\nexport interface SwapInput {\n /** Target chain */\n chain: Chain;\n /** Wallet adapter used to sign the transaction */\n wallet: WalletAdapter;\n /** Input token address */\n input: string;\n /** Output token address */\n output: string;\n /** Amount in smallest unit (lamports for Solana, wei for EVM) */\n amount: string;\n /** Swap mode, defaults to EXACT_IN */\n mode?: API.SwapMode;\n /** Slippage tolerance, 0-100, defaults to 1 */\n slippage?: number;\n\n // -- Solana-specific --\n /** Priority fee in microLamports (Solana only) */\n priorityFee?: string;\n /** Jito/0solt tip fee in lamports (Solana only) */\n tipFee?: string;\n /** Enable anti-MEV via Jito/0solt (Solana only) */\n isAntiMev?: boolean;\n\n // -- EVM-specific --\n /** EIP-2612 permit data, alternative to on-chain approve (EVM only) */\n permit?: string;\n /** Transaction deadline timestamp in ms (EVM only) */\n deadline?: number;\n}\n\n/** Result returned after a swap transaction is successfully submitted. */\nexport interface SwapResult {\n /** Transaction hash / signature */\n txHash: string;\n /** Extra data from the API (e.g. jobId for confirmation polling) */\n extra?: Record<string, unknown>;\n}\n\n/** Phase of the swap flow, used in error callbacks. */\nexport type SwapPhase = \"route\" | \"sign\" | \"send\";\n\n/** Options for the {@link useSwap} hook. */\nexport interface UseSwapOptions {\n /** Called when the transaction is successfully submitted on-chain. */\n onSubmitted?: (result: SwapResult) => void;\n /** Called when an error occurs at any phase of the swap flow. */\n onError?: (error: Error, phase: SwapPhase) => void;\n}\n\n/** Options for the {@link useSwapRoutePolling} hook. */\nexport interface UseSwapRoutePollingOptions {\n /** Polling interval in ms. Defaults to 12000 (12s). */\n interval?: number;\n /** Pause polling (e.g. during swap execution). */\n paused?: boolean;\n /** Called when a route fetch fails. */\n onError?: (error: Error) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Instant Trade Preset\n// ---------------------------------------------------------------------------\n\n/** Configuration values for a single trade preset (slippage, fees, MEV). */\nexport interface TradePresetValues {\n /** Slippage tolerance, 0-100 (percent). `null` = use default. */\n slippage: number | null;\n\n // -- Solana-specific --\n /** Priority fee in SOL. `null` = use default. (Solana only) */\n priorityFee: number | null;\n /** Whether automatic fee estimation is enabled. (Solana only) */\n autoFee: boolean;\n /** Maximum fee cap when auto-fee is on, in SOL. (Solana only) */\n maxAutoFee: number | null;\n\n // -- EVM-specific --\n /** Gas fee in Gwei. `null` = use default. (EVM only) */\n gasFee: number | null;\n\n // -- Shared (chain-dependent visibility) --\n /** Tip/bribe fee in native token units. `null` = not applicable. (Solana, BSC) */\n tipFee: number | null;\n /** Anti-MEV protection level. */\n antiMev: \"off\" | \"reduced\" | \"secure\";\n /** Custom RPC endpoint URL. `null` = use default. */\n customRPC: string | null;\n}\n\n/** Default preset values matching Solana-typical settings. */\nexport const DEFAULT_SOL_TRADE_PRESET: TradePresetValues = {\n slippage: 20,\n priorityFee: 0.001,\n autoFee: false,\n maxAutoFee: 0.1,\n gasFee: null,\n tipFee: 0.001,\n antiMev: \"reduced\",\n customRPC: null,\n};\n\n/** Default preset values for EVM chains (gas fee in Gwei). */\nexport const DEFAULT_EVM_TRADE_PRESET: TradePresetValues = {\n slippage: 20,\n priorityFee: null,\n autoFee: false,\n maxAutoFee: null,\n gasFee: 2,\n tipFee: null,\n antiMev: \"off\",\n customRPC: null,\n};\n\n/** Default preset values for BSC (gas in Gwei + tip in BNB). */\nexport const DEFAULT_BSC_TRADE_PRESET: TradePresetValues = {\n slippage: 30,\n priorityFee: null,\n autoFee: false,\n maxAutoFee: null,\n gasFee: 2,\n tipFee: 0,\n antiMev: \"off\",\n customRPC: null,\n};\n\n/** Default quick-buy amounts keyed by token symbol. */\nconst DEFAULT_BUY_AMOUNTS_MAP: Record<string, number[]> = {\n SOL: [0.01, 0.1, 1, 10],\n ETH: [0.01, 0.02, 0.5, 1],\n BNB: [0.025, 0.05, 0.1, 0.25],\n USDC: [25, 50, 100, 200],\n USDT: [25, 50, 100, 200],\n};\n\nconst DEFAULT_BUY_AMOUNTS_FALLBACK: number[] = [1, 10, 25, 50];\n\n/** Returns default quick-buy amounts for the given token symbol. */\nexport function getDefaultBuyAmounts(symbol: string): number[] {\n return DEFAULT_BUY_AMOUNTS_MAP[symbol] ?? DEFAULT_BUY_AMOUNTS_FALLBACK;\n}\n\n/** Default quick-sell percentages. */\nexport const DEFAULT_SELL_PERCENTAGES: number[] = [10, 25, 50, 100];\n\n/** Confirmation status of a tracked transaction. */\nexport type TxConfirmationStatus = \"idle\" | \"pending\" | \"confirmed\" | \"failed\";\n\n/** Options for the {@link useTxConfirmation} hook. */\nexport interface UseTxConfirmationOptions {\n /** Called when the transaction is confirmed on-chain. */\n onConfirmed?: (txHash: string) => void;\n /** Called when the transaction fails or confirmation times out. */\n onFailed?: (txHash: string, error: Error) => void;\n /** SSE timeout in milliseconds. Defaults to 60000 (60s). */\n timeout?: number;\n}\n","import { Chain } from \"@liberfi.io/types\";\nimport {\n getNativeToken,\n isSolanaChain,\n isBinanceChain,\n} from \"@liberfi.io/utils\";\nimport {\n DEFAULT_SOL_TRADE_PRESET,\n DEFAULT_EVM_TRADE_PRESET,\n DEFAULT_BSC_TRADE_PRESET,\n type TradePresetValues,\n} from \"../../types\";\n\nexport type AntiMevOption = \"off\" | \"reduced\" | \"secure\";\n\nexport type FeeType = \"priorityFee\" | \"gasFee\";\n\nexport interface ChainPresetFeatures {\n /** Native token symbol (e.g. \"SOL\", \"ETH\", \"BNB\") */\n nativeSymbol: string;\n /** Semantic fee type — UI maps this to a translated label via i18n key. */\n feeType: FeeType;\n /** Unit displayed for the fee input (e.g. \"SOL\", \"Gwei\") */\n feeUnit: string;\n /** Decimal places for the fee input */\n feeDecimals: number;\n /** Whether this chain supports a separate tip/bribe fee */\n showTipFee: boolean;\n /** Unit for tip fee (e.g. \"SOL\", \"BNB\"). Empty when hidden. */\n tipFeeUnit: string;\n /** Decimal places for the tip fee input */\n tipFeeDecimals: number;\n /** Whether this chain supports automatic fee estimation */\n showAutoFee: boolean;\n /** Whether this chain supports custom RPC endpoint */\n showCustomRPC: boolean;\n /**\n * Available anti-MEV protection levels for this chain.\n * - Solana: [\"off\", \"reduced\", \"secure\"]\n * - ETH / BSC: [\"off\", \"secure\"]\n */\n antiMevOptions: AntiMevOption[];\n}\n\n/**\n * Returns the set of preset form features applicable to a given chain.\n *\n * - Solana: priority fee (SOL), tip fee (SOL/Jito), anti-MEV\n * - Ethereum: gas fee (Gwei) only\n * - BSC: gas fee (Gwei) + tip fee (BNB)\n * - Other EVM: gas fee (Gwei), same as Ethereum by default\n */\nexport function getChainPresetFeatures(chain: Chain): ChainPresetFeatures {\n const nativeToken = getNativeToken(chain);\n if (!nativeToken) {\n throw new Error(`No native token defined for chain \"${chain}\"`);\n }\n const nativeSymbol = nativeToken.symbol;\n\n if (isSolanaChain(chain)) {\n return {\n nativeSymbol,\n feeType: \"priorityFee\",\n feeUnit: nativeSymbol,\n feeDecimals: 9,\n showTipFee: true,\n tipFeeUnit: nativeSymbol,\n tipFeeDecimals: 9,\n showAutoFee: true,\n showCustomRPC: true,\n antiMevOptions: [\"off\", \"reduced\", \"secure\"],\n };\n }\n\n if (isBinanceChain(chain)) {\n return {\n nativeSymbol,\n feeType: \"gasFee\",\n feeUnit: \"Gwei\",\n feeDecimals: 2,\n showTipFee: true,\n tipFeeUnit: nativeSymbol,\n tipFeeDecimals: 9,\n showAutoFee: false,\n showCustomRPC: false,\n antiMevOptions: [\"off\", \"secure\"],\n };\n }\n\n return {\n nativeSymbol,\n feeType: \"gasFee\",\n feeUnit: \"Gwei\",\n feeDecimals: 2,\n showTipFee: false,\n tipFeeUnit: nativeSymbol,\n tipFeeDecimals: 9,\n showAutoFee: false,\n showCustomRPC: false,\n antiMevOptions: [\"off\", \"secure\"],\n };\n}\n\n/** Returns chain-appropriate default preset values. */\nexport function getDefaultPresetForChain(chain: Chain): TradePresetValues {\n if (isSolanaChain(chain)) return DEFAULT_SOL_TRADE_PRESET;\n if (isBinanceChain(chain)) return DEFAULT_BSC_TRADE_PRESET;\n return DEFAULT_EVM_TRADE_PRESET;\n}\n","\"use client\";\n\nimport { atomFamily } from \"jotai-family\";\nimport { atomWithStorage } from \"jotai/utils\";\nimport type { Chain } from \"@liberfi.io/types\";\nimport { getDefaultPresetForChain } from \"../components/instant-trade/chain-features\";\nimport type { TradePresetValues } from \"../types\";\n\nexport type PresetDirection = \"buy\" | \"sell\";\n\nconst DEFAULT_PREFIX = \"liberfi.\";\n\nfunction storageKey(\n prefix: string,\n chain: string,\n direction: PresetDirection,\n index: number,\n): string {\n return `${prefix}preset.${chain}.${direction}.${index}`;\n}\n\nfunction parseKey(key: string): {\n prefix: string;\n chain: Chain;\n direction: PresetDirection;\n index: number;\n} {\n const sep = key.lastIndexOf(\":\");\n const prefix = key.slice(0, sep + 1);\n const rest = key.slice(sep + 1);\n const [chain, direction, index] = rest.split(\".\");\n return {\n prefix,\n chain: chain as Chain,\n direction: direction as PresetDirection,\n index: Number(index),\n };\n}\n\n/**\n * Construct an atomFamily key from chain, direction, preset index and prefix.\n *\n * @param chain - Target chain.\n * @param direction - Trade direction: `\"buy\"` or `\"sell\"`.\n * @param index - Preset index (0, 1, or 2).\n * @param prefix - Storage key prefix. Defaults to `\"liberfi.\"`.\n */\nexport function presetKey(\n chain: Chain,\n direction: PresetDirection,\n index: number,\n prefix: string = DEFAULT_PREFIX,\n): string {\n return `${prefix}:${chain}.${direction}.${index}`;\n}\n\n/**\n * Atom family for trade preset values, persisted via `atomWithStorage`.\n *\n * Each atom is keyed by a string built with {@link presetKey}.\n * Default values are chain-specific via `getDefaultPresetForChain`.\n */\nexport const presetAtomFamily = atomFamily((key: string) => {\n const { prefix, chain, direction, index } = parseKey(key);\n return atomWithStorage<TradePresetValues>(\n storageKey(prefix, String(chain), direction, index),\n getDefaultPresetForChain(chain),\n undefined,\n { getOnInit: true },\n );\n});\n","import { useAtomValue } from \"jotai\";\nimport type { Chain } from \"@liberfi.io/types\";\nimport {\n presetAtomFamily,\n presetKey,\n type PresetDirection,\n} from \"../states/preset\";\nimport type { TradePresetValues } from \"../types\";\n\nexport interface UsePresetValuesParams {\n /** Target chain. */\n chain: Chain;\n /** Trade direction. */\n direction: PresetDirection;\n /** Preset index (0, 1, or 2). Defaults to 0. */\n presetIndex?: number;\n /** Storage key prefix. Must match the prefix used by the corresponding PresetFormWidget. Defaults to `\"liberfi.\"`. */\n storageKeyPrefix?: string;\n}\n\n/**\n * Read the current {@link TradePresetValues} for a given chain / direction / preset index.\n *\n * The value is sourced from the same `atomWithStorage` atom family that\n * {@link PresetFormWidget} writes to, so it stays in sync automatically.\n */\nexport function usePresetValues({\n chain,\n direction,\n presetIndex = 0,\n storageKeyPrefix,\n}: UsePresetValuesParams): TradePresetValues {\n return useAtomValue(\n presetAtomFamily(\n presetKey(chain, direction, presetIndex, storageKeyPrefix),\n ),\n );\n}\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { useDexClient } from \"@liberfi.io/react\";\nimport { API } from \"@liberfi.io/types\";\nimport type { SwapInput, SwapResult, UseSwapOptions } from \"../types\";\n\nfunction base64ToUint8Array(base64: string): Uint8Array {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\nfunction uint8ArrayToBase64(bytes: Uint8Array): string {\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\n/**\n * Hook that orchestrates the full swap flow: route -> sign -> send.\n *\n * Designed for IoC: no toast, no i18n, no UI side-effects.\n * The caller controls feedback via `onSubmitted` / `onError` callbacks.\n *\n * Works across Solana and EVM chains — chain-specific differences\n * (dex selection, tx format) are handled by the underlying client\n * and wallet adapter abstractions.\n */\nexport function useSwap(options?: UseSwapOptions) {\n const { client } = useDexClient();\n const [isSwapping, setIsSwapping] = useState(false);\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const swap = useCallback(\n async (input: SwapInput): Promise<SwapResult> => {\n const { wallet, chain, ...rest } = input;\n\n setIsSwapping(true);\n try {\n // 1. Fetch route — returns unsigned tx as base64\n let route: API.SwapRoute;\n try {\n route = await client.swapRoute({\n chain,\n userAddress: wallet.address,\n input: rest.input,\n output: rest.output,\n mode: rest.mode ?? API.SwapMode.EXACT_IN,\n amount: rest.amount,\n slippage: rest.slippage,\n priorityFee: rest.priorityFee,\n tipFee: rest.tipFee,\n isAntiMev: rest.isAntiMev,\n permit: rest.permit,\n deadline: rest.deadline,\n });\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n optionsRef.current?.onError?.(err, \"route\");\n throw err;\n }\n\n // 2. Sign the transaction via wallet adapter\n let signedBytes: Uint8Array;\n try {\n const unsignedBytes = base64ToUint8Array(route.serializedTx);\n signedBytes = await wallet.signTransaction(unsignedBytes);\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n optionsRef.current?.onError?.(err, \"sign\");\n throw err;\n }\n\n // 3. Submit the signed transaction\n let sendResult: API.SendTxResult;\n try {\n const signedBase64 = uint8ArrayToBase64(signedBytes);\n sendResult = await client.sendTx({\n chain,\n serializedTx: signedBase64,\n });\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n optionsRef.current?.onError?.(err, \"send\");\n throw err;\n }\n\n const result: SwapResult = {\n txHash: sendResult.txHash,\n extra: sendResult.extra,\n };\n\n optionsRef.current?.onSubmitted?.(result);\n return result;\n } finally {\n setIsSwapping(false);\n }\n },\n [client],\n );\n\n return useMemo(() => ({ swap, isSwapping }), [swap, isSwapping]);\n}\n","import { useEffect, useMemo, useRef } from \"react\";\nimport { useSwapRouteQuery } from \"@liberfi.io/react\";\nimport { API } from \"@liberfi.io/types\";\nimport type { UseSwapRoutePollingOptions } from \"../types\";\n\nconst DEFAULT_INTERVAL = 12_000;\n\n/**\n * Hook that polls for swap route quotes at a configurable interval.\n *\n * Built on top of `useSwapRouteQuery` (TanStack Query) — automatically\n * deduplicates requests, caches results, and invalidates when params change.\n *\n * Polling pauses when `paused` is true (e.g. during swap execution) or\n * when required params are missing.\n */\nexport function useSwapRoutePolling(\n params: Partial<API.SwapParams>,\n options?: UseSwapRoutePollingOptions,\n) {\n const interval = options?.interval ?? DEFAULT_INTERVAL;\n const paused = options?.paused ?? false;\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const hasRequiredParams =\n !!params.chain &&\n !!params.userAddress &&\n !!params.input &&\n !!params.output &&\n !!params.amount;\n\n const enabled = hasRequiredParams && !paused;\n\n const query = useSwapRouteQuery(params as API.SwapParams, {\n enabled,\n refetchInterval: enabled ? interval : false,\n retry: false,\n });\n\n useEffect(() => {\n if (query.error) {\n optionsRef.current?.onError?.(query.error);\n }\n }, [query.error]);\n\n return useMemo(\n () => ({\n route: query.data,\n isRouting: query.isFetching,\n error: query.error,\n }),\n [query.data, query.isFetching, query.error],\n );\n}\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { useDexClient } from \"@liberfi.io/react\";\nimport { Chain } from \"@liberfi.io/types\";\nimport type { TxConfirmationStatus, UseTxConfirmationOptions } from \"../types\";\n\ninterface TrackedTx {\n chain: Chain;\n txHash: string;\n status: TxConfirmationStatus;\n}\n\nconst DEFAULT_TIMEOUT = 60_000;\n\n/**\n * Hook that tracks transaction confirmation via backend SSE (Server-Sent Events).\n *\n * Designed to be composed with `useSwap` — call `track()` inside `onSubmitted`\n * to start monitoring. Supports tracking multiple concurrent transactions.\n *\n * @example\n * ```tsx\n * const { swap } = useSwap({ onSubmitted: (r) => track(chain, r.txHash) });\n * const { track, transactions } = useTxConfirmation({\n * onConfirmed: (txHash) => toast.success(`Confirmed: ${txHash}`),\n * onFailed: (txHash) => toast.error(`Failed: ${txHash}`),\n * });\n * ```\n */\nexport function useTxConfirmation(options?: UseTxConfirmationOptions) {\n const { client } = useDexClient();\n const [transactions, setTransactions] = useState<Map<string, TrackedTx>>(\n () => new Map(),\n );\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const updateTx = useCallback(\n (txHash: string, status: TxConfirmationStatus) => {\n setTransactions((prev) => {\n const existing = prev.get(txHash);\n if (!existing) return prev;\n if (existing.status === status) return prev;\n const next = new Map(prev);\n next.set(txHash, { ...existing, status });\n return next;\n });\n },\n [],\n );\n\n const track = useCallback(\n (chain: Chain, txHash: string) => {\n setTransactions((prev) => {\n if (prev.has(txHash)) return prev;\n const next = new Map(prev);\n next.set(txHash, { chain, txHash, status: \"pending\" });\n return next;\n });\n\n const timeout = optionsRef.current?.timeout ?? DEFAULT_TIMEOUT;\n\n client\n .checkTxSuccess(chain, txHash, timeout)\n .then((success) => {\n if (success) {\n updateTx(txHash, \"confirmed\");\n optionsRef.current?.onConfirmed?.(txHash);\n } else {\n const err = new Error(\"Transaction failed on-chain\");\n updateTx(txHash, \"failed\");\n optionsRef.current?.onFailed?.(txHash, err);\n }\n })\n .catch((e) => {\n const err = e instanceof Error ? e : new Error(String(e));\n updateTx(txHash, \"failed\");\n optionsRef.current?.onFailed?.(txHash, err);\n });\n },\n [client, updateTx],\n );\n\n const clear = useCallback((txHash: string) => {\n setTransactions((prev) => {\n if (!prev.has(txHash)) return prev;\n const next = new Map(prev);\n next.delete(txHash);\n return next;\n });\n }, []);\n\n const clearAll = useCallback(() => {\n setTransactions((prev) => (prev.size === 0 ? prev : new Map()));\n }, []);\n\n return useMemo(\n () => ({ track, clear, clearAll, transactions }),\n [track, clear, clearAll, transactions],\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useTokensQuery,\n useWalletPortfoliosByTokensQuery,\n} from \"@liberfi.io/react\";\nimport { API, Chain, ChainNamespace } from \"@liberfi.io/types\";\nimport { useWallets } from \"@liberfi.io/wallet-connector\";\nimport { useSwap } from \"../../hooks/useSwap\";\nimport { useSwapRoutePolling } from \"../../hooks/useSwapRoutePolling\";\nimport { useTxConfirmation } from \"../../hooks/useTxConfirmation\";\nimport type { UseSwapScriptParams, UseSwapScriptResult } from \"./types\";\n\nconst SOLANA_CHAINS: ReadonlySet<Chain> = new Set([\n Chain.SOLANA,\n Chain.SOLANA_TESTNET,\n Chain.SOLANA_DEVNET,\n]);\n\nfunction chainNamespace(chain: Chain): ChainNamespace {\n return SOLANA_CHAINS.has(chain) ? ChainNamespace.SOLANA : ChainNamespace.EVM;\n}\n\nconst TOKEN_POLL_MS = 10_000;\nconst BALANCE_POLL_MS = 15_000;\n\n/**\n * Computes the total output amount from route plans.\n * Each plan has an outputAmount in smallest units — we take the last plan's\n * output (the final token) and shift by decimals.\n */\nfunction formatOutputAmount(\n plans: Array<{ outputAmount: string }>,\n decimals: number,\n): string | undefined {\n if (plans.length === 0) return undefined;\n const lastPlan = plans[plans.length - 1]!;\n const raw = lastPlan.outputAmount;\n if (!raw || raw === \"0\") return \"0\";\n\n const padded = raw.padStart(decimals + 1, \"0\");\n const intPart = padded.slice(0, padded.length - decimals) || \"0\";\n const fracPart = padded.slice(padded.length - decimals);\n const trimmed = fracPart.replace(/0+$/, \"\");\n return trimmed ? `${intPart}.${trimmed}` : intPart;\n}\n\n/**\n * Script hook that encapsulates all data fetching and state management\n * for the swap form.\n *\n * Pure TypeScript — no JSX, no UI imports.\n */\nexport function useSwapScript(\n params: UseSwapScriptParams,\n): UseSwapScriptResult {\n const { chain } = params;\n\n // ── Wallet ────────────────────────────────────────────────────────────────\n\n const wallets = useWallets();\n const ns = chainNamespace(chain);\n const wallet = useMemo(\n () => wallets.find((w) => w.chainNamespace === ns && w.isConnected),\n [wallets, ns],\n );\n const walletAddress = wallet?.address ?? \"\";\n\n // ── Token selection state ─────────────────────────────────────────────────\n\n const [fromTokenAddress, setFromTokenAddress] = useState(params.from ?? \"\");\n const [toTokenAddress, setToTokenAddress] = useState(params.to ?? \"\");\n\n const fromRef = useRef(params.from);\n const toRef = useRef(params.to);\n useEffect(() => {\n if (params.from !== fromRef.current) {\n fromRef.current = params.from;\n if (params.from) setFromTokenAddress(params.from);\n }\n }, [params.from]);\n useEffect(() => {\n if (params.to !== toRef.current) {\n toRef.current = params.to;\n if (params.to) setToTokenAddress(params.to);\n }\n }, [params.to]);\n\n // ── Token metadata ────────────────────────────────────────────────────────\n\n const tokenAddresses = useMemo(\n () => [fromTokenAddress, toTokenAddress].filter(Boolean),\n [fromTokenAddress, toTokenAddress],\n );\n\n const tokensQuery = useTokensQuery(\n { chain, addresses: tokenAddresses },\n { enabled: tokenAddresses.length > 0, refetchInterval: TOKEN_POLL_MS },\n );\n\n const fromToken = useMemo(\n () => tokensQuery.data?.find((t) => t.address === fromTokenAddress) ?? null,\n [tokensQuery.data, fromTokenAddress],\n );\n const toToken = useMemo(\n () => tokensQuery.data?.find((t) => t.address === toTokenAddress) ?? null,\n [tokensQuery.data, toTokenAddress],\n );\n\n // ── Balances ──────────────────────────────────────────────────────────────\n\n const balancesQuery = useWalletPortfoliosByTokensQuery(\n { chain, address: walletAddress, tokenAddresses },\n {\n enabled: !!walletAddress && tokenAddresses.length > 0,\n refetchInterval: BALANCE_POLL_MS,\n },\n );\n\n const fromBalance = useMemo(\n () =>\n balancesQuery.data?.find((p) => p.address === fromTokenAddress) ?? null,\n [balancesQuery.data, fromTokenAddress],\n );\n const toBalance = useMemo(\n () => balancesQuery.data?.find((p) => p.address === toTokenAddress) ?? null,\n [balancesQuery.data, toTokenAddress],\n );\n\n // ── Amount ────────────────────────────────────────────────────────────────\n\n const [amount, setAmount] = useState<string | undefined>(undefined);\n\n const amountInDecimals = useMemo(() => {\n if (!amount || fromToken?.decimals == null) return undefined;\n const parts = amount.split(\".\");\n const intPart = parts[0] ?? \"0\";\n const fracPart = (parts[1] ?? \"\").slice(0, fromToken.decimals);\n const padded = fracPart.padEnd(fromToken.decimals, \"0\");\n const raw = intPart + padded;\n return raw.replace(/^0+/, \"\") || \"0\";\n }, [amount, fromToken?.decimals]);\n\n const amountInUsd = useMemo(() => {\n if (!amount || !fromToken?.marketData?.priceInUsd) return undefined;\n const price = Number(fromToken.marketData.priceInUsd);\n const value = Number(amount) * price;\n return Number.isFinite(value) ? value.toString() : undefined;\n }, [amount, fromToken?.marketData?.priceInUsd]);\n\n // ── Half / Max helpers ────────────────────────────────────────────────────\n\n const setHalfAmount = useCallback(() => {\n if (!fromBalance) return;\n const bal = Number(fromBalance.amount);\n if (!Number.isFinite(bal) || bal <= 0) return;\n const half = bal / 2;\n const decimals = fromToken?.decimals ?? 9;\n setAmount(\n half.toLocaleString(\"en-US\", {\n useGrouping: false,\n maximumFractionDigits: decimals,\n }),\n );\n }, [fromBalance, fromToken?.decimals]);\n\n const setMaxAmount = useCallback(() => {\n if (!fromBalance) return;\n const bal = Number(fromBalance.amount);\n if (!Number.isFinite(bal) || bal <= 0) return;\n const decimals = fromToken?.decimals ?? 9;\n setAmount(\n bal.toLocaleString(\"en-US\", {\n useGrouping: false,\n maximumFractionDigits: decimals,\n }),\n );\n }, [fromBalance, fromToken?.decimals]);\n\n // ── Route polling ─────────────────────────────────────────────────────────\n\n const routeParams = useMemo<Partial<API.SwapParams>>(\n () => ({\n chain,\n userAddress: walletAddress || undefined,\n input: fromTokenAddress || undefined,\n output: toTokenAddress || undefined,\n mode: API.SwapMode.EXACT_IN,\n amount: amountInDecimals,\n }),\n [chain, walletAddress, fromTokenAddress, toTokenAddress, amountInDecimals],\n );\n\n const isSwappingRef = useRef(false);\n\n const {\n route,\n isRouting,\n error: routeError,\n } = useSwapRoutePolling(routeParams, { paused: isSwappingRef.current });\n\n // ── Output amount ─────────────────────────────────────────────────────────\n\n const outputAmount = useMemo(\n () =>\n route && toToken\n ? formatOutputAmount(route.plans, toToken.decimals)\n : undefined,\n [route, toToken],\n );\n\n const outputAmountInUsd = useMemo(() => {\n if (!outputAmount || !toToken?.marketData?.priceInUsd) return undefined;\n const price = Number(toToken.marketData.priceInUsd);\n const value = Number(outputAmount) * price;\n return Number.isFinite(value) ? value.toString() : undefined;\n }, [outputAmount, toToken?.marketData?.priceInUsd]);\n\n // ── Swap execution ────────────────────────────────────────────────────────\n\n const { swap: rawSwap, isSwapping } = useSwap();\n isSwappingRef.current = isSwapping;\n\n const onCompleteRef = useRef(params.onComplete);\n onCompleteRef.current = params.onComplete;\n\n const { track, transactions } = useTxConfirmation({\n onConfirmed: (txHash) => {\n onCompleteRef.current?.({ success: true, txHash });\n },\n onFailed: (txHash) => {\n onCompleteRef.current?.({ success: false, txHash });\n },\n });\n\n const latestTxStatus = useMemo(() => {\n if (transactions.size === 0) return \"idle\" as const;\n const entries = Array.from(transactions.values());\n return entries[entries.length - 1]!.status;\n }, [transactions]);\n\n const swap = useCallback(async () => {\n if (\n !wallet ||\n !route ||\n !fromTokenAddress ||\n !toTokenAddress ||\n !amountInDecimals\n ) {\n return;\n }\n\n try {\n const result = await rawSwap({\n chain,\n wallet,\n input: fromTokenAddress,\n output: toTokenAddress,\n amount: amountInDecimals,\n mode: API.SwapMode.EXACT_IN,\n });\n track(chain, result.txHash);\n } catch {\n // Error is already reported via useSwap's onError callback\n }\n }, [\n wallet,\n route,\n chain,\n fromTokenAddress,\n toTokenAddress,\n amountInDecimals,\n rawSwap,\n track,\n ]);\n\n // ── Loading state ─────────────────────────────────────────────────────────\n\n const isLoading = tokensQuery.isPending || balancesQuery.isPending;\n\n // ── Return ────────────────────────────────────────────────────────────────\n\n return useMemo(\n () => ({\n fromTokenAddress,\n toTokenAddress,\n setFromTokenAddress,\n setToTokenAddress,\n\n fromToken,\n toToken,\n\n fromBalance,\n toBalance,\n\n amount,\n setAmount,\n setHalfAmount,\n setMaxAmount,\n amountInDecimals,\n amountInUsd,\n\n outputAmount,\n outputAmountInUsd,\n\n route,\n isRouting,\n routeError,\n\n swap,\n isSwapping,\n\n txStatus: latestTxStatus,\n\n isLoading,\n }),\n [\n fromTokenAddress,\n toTokenAddress,\n fromToken,\n toToken,\n fromBalance,\n toBalance,\n amount,\n setHalfAmount,\n setMaxAmount,\n amountInDecimals,\n amountInUsd,\n outputAmount,\n outputAmountInUsd,\n route,\n isRouting,\n routeError,\n swap,\n isSwapping,\n latestTxStatus,\n isLoading,\n ],\n );\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Avatar,\n Button,\n ChevronDownIcon,\n ChevronUpIcon,\n cn,\n Modal,\n ModalBody,\n ModalContent,\n ModalFooter,\n ModalHeader,\n TradeIcon,\n} from \"@liberfi.io/ui\";\nimport type { SwapPreviewModalProps } from \"./types\";\n\n/**\n * Modal that previews swap details before confirmation.\n *\n * Pure presentational — all data and callbacks received via props.\n * Shows from/to token cards, expandable route plan details,\n * and a confirm button.\n */\nexport function SwapPreviewModal({\n isOpen,\n onOpenChange,\n fromToken,\n toToken,\n fromBalance,\n inputAmount,\n inputAmountInUsd,\n outputAmount,\n outputAmountInUsd,\n route,\n isRouting,\n routeError,\n onConfirm,\n isSwapping,\n}: SwapPreviewModalProps) {\n const { t } = useTranslation();\n const [expanded, setExpanded] = useState(false);\n const toggleExpanded = useCallback(() => setExpanded((prev) => !prev), []);\n\n const plans = useMemo(() => {\n if (!route) return [];\n return route.plans.map((plan, i) => ({\n key: `plan-${i}`,\n name: plan.name,\n input: plan.input,\n inputAmount: plan.inputAmount,\n output: plan.output,\n outputAmount: plan.outputAmount,\n feeQuote: plan.feeQuote,\n feeAmount: plan.feeAmount,\n }));\n }, [route]);\n\n return (\n <Modal\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n hideCloseButton\n scrollBehavior=\"inside\"\n backdrop=\"blur\"\n >\n <ModalContent className=\"bg-content2 rounded-lg\">\n <ModalHeader>{t(\"trade.swap.preview\")}</ModalHeader>\n <ModalBody>\n <div className=\"flex w-full max-h-[70vh] flex-1 flex-col overflow-y-auto py-2\">\n {/* ── From preview ─────────────────────────────────────────── */}\n <div className=\"mb-5\">\n <div className=\"text-neutral flex items-center justify-between text-xs font-medium\">\n {t(\"trade.swap.from\")}\n </div>\n <div className=\"bg-content3 mt-3 flex w-full items-center gap-3 rounded-lg px-4 py-3\">\n <div className=\"flex flex-1 items-center gap-3\">\n {fromToken?.image && (\n <Avatar\n size=\"sm\"\n src={fromToken.image}\n name={fromToken.symbol}\n className=\"h-6 w-6\"\n />\n )}\n <div className=\"flex flex-col items-start justify-center gap-0.5\">\n <div className=\"text-foreground text-xs\">\n {fromToken?.symbol ?? \"—\"}\n </div>\n {fromBalance && (\n <div className=\"text-neutral flex items-center gap-1 text-[10px]\">\n <WalletBalanceIcon />\n <span>\n {formatNumber(fromBalance.amount)} {fromToken?.symbol}\n </span>\n </div>\n )}\n </div>\n </div>\n <div className=\"flex-0 flex flex-col items-end justify-center gap-0.5\">\n <div className=\"text-foreground text-xs\">\n {formatNumber(inputAmount)}\n </div>\n <div className=\"text-neutral text-[10px]\">\n ${formatUsd(inputAmountInUsd)}\n </div>\n </div>\n </div>\n </div>\n\n {/* ── To preview ───────────────────────────────────────────── */}\n <div className=\"mb-5\">\n <div className=\"text-neutral flex items-center justify-between text-xs font-medium\">\n {t(\"trade.swap.estimatedReceive\")}\n </div>\n <div className=\"bg-content3 mt-3 flex w-full items-center gap-3 rounded-lg px-4 py-3\">\n <div className=\"flex flex-1 items-center gap-3\">\n {toToken?.image && (\n <Avatar\n size=\"sm\"\n src={toToken.image}\n name={toToken.symbol}\n className=\"h-6 w-6\"\n />\n )}\n <div className=\"flex flex-col items-start justify-center gap-0.5\">\n <div className=\"text-foreground text-xs\">\n {toToken?.symbol ?? \"—\"}\n </div>\n <div className=\"text-neutral text-[10px]\">\n {truncateAddress(toToken?.address)}\n </div>\n </div>\n </div>\n <div className=\"flex-0 flex flex-col items-end justify-center gap-0.5\">\n <div className=\"text-foreground text-xs\">\n {formatNumber(outputAmount)}\n </div>\n <div className=\"text-neutral text-[10px]\">\n ${formatUsd(outputAmountInUsd)}\n </div>\n </div>\n </div>\n </div>\n\n {/* ── Route plan details ───────────────────────────────────── */}\n {expanded && plans.length > 0 && (\n <div className=\"my-3\">\n <div className=\"text-neutral flex items-center justify-between text-xs font-medium\">\n {t(\"trade.swap.routeDetails\")}\n </div>\n <div className=\"mt-3 flex flex-col gap-3\">\n {plans.map((plan) => (\n <div\n key={plan.key}\n className=\"bg-content3 flex w-full flex-col items-center gap-2 rounded-lg px-4 py-3\"\n >\n <div className=\"flex w-full items-center justify-between\">\n <div className=\"text-neutral text-xs\">\n {t(\"trade.swap.dex\")}\n </div>\n <div className=\"text-foreground text-xs\">\n {plan.name}\n </div>\n </div>\n <div className=\"flex w-full items-center justify-between\">\n <div className=\"text-neutral text-xs\">\n {t(\"trade.swap.swap\")}\n </div>\n <div className=\"text-foreground flex items-center gap-2 text-xs\">\n <span>\n {formatSmallAmount(plan.inputAmount)}{\" \"}\n {truncateAddress(plan.input)}\n </span>\n <TradeIcon\n width={12}\n height={12}\n className=\"text-foreground\"\n />\n <span>\n {formatSmallAmount(plan.outputAmount)}{\" \"}\n {truncateAddress(plan.output)}\n </span>\n </div>\n </div>\n {plan.feeAmount && (\n <div className=\"flex w-full items-center justify-between\">\n <div className=\"text-neutral text-xs\">\n {t(\"trade.swap.fee\")}\n </div>\n <div className=\"text-foreground text-xs\">\n {formatSmallAmount(plan.feeAmount)}{\" \"}\n {truncateAddress(plan.feeQuote)}\n </div>\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* ── Expand / collapse toggle ─────────────────────────────── */}\n {plans.length > 0 && (\n <div className=\"flex justify-center\">\n <Button\n size=\"sm\"\n className=\"text-neutral flex bg-transparent text-xs\"\n endContent={\n expanded ? (\n <ChevronUpIcon width={12} height={12} />\n ) : (\n <ChevronDownIcon width={12} height={12} />\n )\n }\n disableRipple\n onPress={toggleExpanded}\n >\n {expanded\n ? t(\"trade.swap.showLess\")\n : t(\"trade.swap.showMore\")}\n </Button>\n </div>\n )}\n </div>\n </ModalBody>\n <ModalFooter>\n <Button\n fullWidth\n color=\"primary\"\n className=\"flex rounded-lg\"\n disableRipple\n isDisabled={!route || !!routeError}\n isLoading={(!route && isRouting) || isSwapping}\n onPress={onConfirm}\n >\n {t(\"common.confirm\")}\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n );\n}\n\nfunction WalletBalanceIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={12}\n height={12}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"text-neutral\"\n >\n <path d=\"M21 12V7H5a2 2 0 0 1 0-4h14v4\" />\n <path d=\"M3 5v14a2 2 0 0 0 2 2h16v-5\" />\n <path d=\"M18 12a2 2 0 0 0 0 4h4v-4Z\" />\n </svg>\n );\n}\n\nfunction formatUsd(value: string | undefined): string {\n if (!value) return \"0.00\";\n const n = Number(value);\n if (!Number.isFinite(n)) return \"0.00\";\n return n.toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n}\n\nfunction formatNumber(value: string | undefined): string {\n if (!value) return \"0\";\n const n = Number(value);\n if (!Number.isFinite(n)) return \"0\";\n if (n >= 1_000_000)\n return (\n (n / 1_000_000).toLocaleString(\"en-US\", {\n maximumFractionDigits: 2,\n }) + \"M\"\n );\n if (n >= 1_000)\n return (\n (n / 1_000).toLocaleString(\"en-US\", { maximumFractionDigits: 2 }) + \"K\"\n );\n return n.toLocaleString(\"en-US\", { maximumFractionDigits: 6 });\n}\n\n/** Render raw smallest-unit amounts in abbreviated form. */\nfunction formatSmallAmount(value: string | undefined): string {\n if (!value || value === \"0\") return \"0\";\n const n = Number(value);\n if (!Number.isFinite(n)) return value;\n if (n >= 1e12) return (n / 1e12).toFixed(2) + \"T\";\n if (n >= 1e9) return (n / 1e9).toFixed(2) + \"B\";\n if (n >= 1e6) return (n / 1e6).toFixed(2) + \"M\";\n if (n >= 1e3) return (n / 1e3).toFixed(2) + \"K\";\n return value;\n}\n\nfunction truncateAddress(addr: string | undefined): string {\n if (!addr) return \"—\";\n if (addr.length <= 10) return addr;\n return `${addr.slice(0, 4)}...${addr.slice(-4)}`;\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { Avatar, Button, ChevronDownIcon, cn, Input } from \"@liberfi.io/ui\";\nimport type { SwapUIProps } from \"./types\";\n\n/**\n * Pure presentational component for the swap form.\n *\n * Receives all data and callbacks via props — no API calls, no subscriptions.\n * Consumers can replace this component entirely while reusing `useSwapScript`.\n */\nexport function SwapUI({\n fromToken,\n toToken,\n fromBalance,\n toBalance,\n amount,\n amountInUsd,\n onAmountChange,\n onHalfAmount,\n onMaxAmount,\n outputAmount,\n outputAmountInUsd,\n onFromTokenSelect,\n onToTokenSelect,\n route,\n isRouting,\n routeError,\n onPreview,\n isSwapping,\n className,\n}: SwapUIProps) {\n const { t } = useTranslation();\n\n return (\n <div className={cn(\"px-4 pb-4 lg:pb-8\", className)}>\n {/* ── From token section ─────────────────────────────────────────── */}\n <div className=\"space-y-3\">\n <p className=\"text-neutral text-sm font-medium\">\n {t(\"trade.swap.from\")}\n </p>\n <div className=\"bg-content1 flex flex-col rounded-lg px-3.5 pb-2.5 pt-2\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex-1\">\n <Input\n type=\"number\"\n value={amount ?? \"\"}\n onChange={(e) => onAmountChange(e.target.value || undefined)}\n placeholder=\"0\"\n classNames={{\n inputWrapper: cn(\n \"h-10 p-0 bg-transparent\",\n \"data-[hover=true]:bg-transparent group-data-[focus=true]:bg-transparent\",\n \"group-data-[focus-visible=true]:ring-offset-transparent group-data-[focus-visible=true]:ring-transparent\",\n ),\n input: cn(\n \"w-full h-full caret-primary text-3xl font-medium\",\n \"placeholder:text-placeholder placeholder:text-3xl placeholder:font-medium\",\n \"scrollbar-hide overflow-hidden text-ellipsis whitespace-nowrap\",\n ),\n }}\n />\n </div>\n <div className=\"flex-0 flex h-full items-center justify-center\">\n <Button\n className={cn(\n \"flex min-w-0 h-8 min-h-8 pl-3 pr-2 bg-content3 rounded-full\",\n fromToken ? \"text-foreground\" : \"text-neutral\",\n )}\n disableRipple\n startContent={\n fromToken?.image ? (\n <Avatar\n size=\"sm\"\n src={fromToken.image}\n name={fromToken.symbol}\n className=\"h-6 w-6\"\n />\n ) : null\n }\n endContent={\n <ChevronDownIcon\n width={16}\n height={16}\n className=\"text-neutral\"\n />\n }\n onPress={() => onFromTokenSelect(\"\")}\n >\n {fromToken ? fromToken.symbol : t(\"trade.swap.selectToken\")}\n </Button>\n </div>\n </div>\n\n <div className=\"mt-3 flex items-center justify-between gap-4\">\n <div className=\"text-neutral flex-1 text-xs\">\n ≈ ${formatUsd(amountInUsd)}\n </div>\n {fromBalance && (\n <div className=\"flex-0 flex items-center gap-2 pr-3 text-xs\">\n <WalletBalanceIcon />\n <span className=\"text-neutral\">\n {formatNumber(fromBalance.amount)} {fromBalance.symbol}\n </span>\n {onHalfAmount && (\n <span\n className=\"text-primary cursor-pointer\"\n onClick={onHalfAmount}\n >\n {t(\"trade.swap.half\")}\n </span>\n )}\n {onMaxAmount && (\n <span\n className=\"text-primary cursor-pointer\"\n onClick={onMaxAmount}\n >\n {t(\"common.max\")}\n </span>\n )}\n </div>\n )}\n </div>\n\n {routeError && (\n <p className=\"mt-1 break-words text-xs text-danger-500\">\n {routeError.message}\n </p>\n )}\n </div>\n </div>\n\n {/* ── To token section ───────────────────────────────────────────── */}\n <div className=\"mt-4 space-y-3\">\n <p className=\"text-neutral text-sm font-medium\">{t(\"trade.swap.to\")}</p>\n <div className=\"bg-content1 flex flex-col rounded-lg px-3.5 pb-2.5 pt-2\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex-1\">\n <Input\n type=\"number\"\n value={outputAmount ?? \"\"}\n disabled\n placeholder=\"0\"\n classNames={{\n inputWrapper: cn(\n \"h-10 p-0 bg-transparent\",\n \"data-[hover=true]:bg-transparent group-data-[focus=true]:bg-transparent\",\n \"group-data-[focus-visible=true]:ring-offset-transparent group-data-[focus-visible=true]:ring-transparent\",\n ),\n input: cn(\n \"w-full h-full caret-primary text-3xl font-medium\",\n \"placeholder:text-placeholder placeholder:text-3xl placeholder:font-medium\",\n \"scrollbar-hide overflow-hidden text-ellipsis whitespace-nowrap\",\n ),\n }}\n />\n </div>\n <div className=\"flex-0 flex h-full items-center justify-center\">\n <Button\n className={cn(\n \"flex min-w-0 h-8 min-h-8 pl-3 pr-2 bg-content3 rounded-full\",\n toToken ? \"text-foreground\" : \"text-neutral\",\n )}\n disableRipple\n startContent={\n toToken?.image ? (\n <Avatar\n size=\"sm\"\n src={toToken.image}\n name={toToken.symbol}\n className=\"h-6 w-6\"\n />\n ) : null\n }\n endContent={\n <ChevronDownIcon\n width={16}\n height={16}\n className=\"text-neutral\"\n />\n }\n onPress={() => onToTokenSelect(\"\")}\n >\n {toToken ? toToken.symbol : t(\"trade.swap.selectToken\")}\n </Button>\n </div>\n </div>\n\n <div className=\"mt-3 flex items-center justify-between gap-4\">\n <div className=\"text-neutral flex-1 text-xs\">\n ≈ ${formatUsd(outputAmountInUsd)}\n </div>\n {toBalance && (\n <div className=\"flex-0 flex items-center gap-2 pr-3 text-xs\">\n <WalletBalanceIcon />\n <span className=\"text-neutral\">\n {formatNumber(toBalance.amount)} {toBalance.symbol}\n </span>\n </div>\n )}\n </div>\n </div>\n </div>\n\n {/* ── Submit button ──────────────────────────────────────────────── */}\n <Button\n fullWidth\n color=\"primary\"\n className=\"mt-8 flex rounded-lg\"\n disableRipple\n isDisabled={!route}\n isLoading={!route && isRouting}\n onPress={onPreview}\n >\n {isSwapping\n ? t(\"trade.swap.swapping\")\n : isRouting\n ? t(\"trade.swap.findingRoute\")\n : t(\"trade.swap.swap\")}\n </Button>\n </div>\n );\n}\n\nfunction WalletBalanceIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={12}\n height={12}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"text-neutral\"\n >\n <path d=\"M21 12V7H5a2 2 0 0 1 0-4h14v4\" />\n <path d=\"M3 5v14a2 2 0 0 0 2 2h16v-5\" />\n <path d=\"M18 12a2 2 0 0 0 0 4h4v-4Z\" />\n </svg>\n );\n}\n\nfunction formatUsd(value: string | undefined): string {\n if (!value) return \"0.00\";\n const n = Number(value);\n if (!Number.isFinite(n)) return \"0.00\";\n return n.toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n}\n\nfunction formatNumber(value: string | undefined): string {\n if (!value) return \"0\";\n const n = Number(value);\n if (!Number.isFinite(n)) return \"0\";\n if (n >= 1_000_000)\n return (\n (n / 1_000_000).toLocaleString(\"en-US\", { maximumFractionDigits: 2 }) +\n \"M\"\n );\n if (n >= 1_000)\n return (\n (n / 1_000).toLocaleString(\"en-US\", { maximumFractionDigits: 2 }) + \"K\"\n );\n return n.toLocaleString(\"en-US\", { maximumFractionDigits: 6 });\n}\n","import { useCallback } from \"react\";\nimport { useDisclosure } from \"@liberfi.io/ui\";\nimport { SwapPreviewModal } from \"./swap-preview-modal\";\nimport { useSwapScript } from \"./swap.script\";\nimport { SwapUI } from \"./swap.ui\";\nimport type { SwapWidgetProps } from \"./types\";\n\n/**\n * Swap widget — thin orchestration layer.\n *\n * Calls `useSwapScript` to fetch all data, renders `SwapUI` for the form\n * and `SwapPreviewModal` for pre-swap confirmation.\n *\n * For custom UIs, use `useSwapScript` directly with your own presentation.\n */\nexport function SwapWidget({\n chain,\n from,\n to,\n onComplete,\n className,\n}: SwapWidgetProps) {\n const script = useSwapScript({ chain, from, to, onComplete });\n const { isOpen, onOpen, onOpenChange, onClose } = useDisclosure();\n\n const handleConfirm = useCallback(async () => {\n await script.swap();\n onClose();\n }, [script, onClose]);\n\n return (\n <>\n <SwapUI\n fromToken={script.fromToken}\n toToken={script.toToken}\n fromBalance={script.fromBalance}\n toBalance={script.toBalance}\n amount={script.amount}\n amountInUsd={script.amountInUsd}\n onAmountChange={script.setAmount}\n onHalfAmount={script.setHalfAmount}\n onMaxAmount={script.setMaxAmount}\n outputAmount={script.outputAmount}\n outputAmountInUsd={script.outputAmountInUsd}\n onFromTokenSelect={script.setFromTokenAddress}\n onToTokenSelect={script.setToTokenAddress}\n route={script.route}\n isRouting={script.isRouting}\n routeError={script.routeError}\n onPreview={onOpen}\n isSwapping={script.isSwapping}\n className={className}\n />\n <SwapPreviewModal\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n fromToken={script.fromToken}\n toToken={script.toToken}\n fromBalance={script.fromBalance}\n inputAmount={script.amount}\n inputAmountInUsd={script.amountInUsd}\n outputAmount={script.outputAmount}\n outputAmountInUsd={script.outputAmountInUsd}\n route={script.route}\n isRouting={script.isRouting}\n routeError={script.routeError}\n onConfirm={handleConfirm}\n isSwapping={script.isSwapping}\n />\n </>\n );\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState,\n} from \"react\";\nimport type { Chain } from \"@liberfi.io/types\";\nimport { getNativeToken } from \"@liberfi.io/utils\";\nimport { getDefaultBuyAmounts, DEFAULT_SELL_PERCENTAGES } from \"../../types\";\nimport { getDefaultPresetForChain } from \"./chain-features\";\nimport type {\n BuySettings,\n SellSettings,\n InstantTradeSettings,\n InstantTradeContextValue,\n InstantTradeProviderProps,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Defaults\n// ---------------------------------------------------------------------------\n\nfunction buildDefaultSettings(chain: Chain): InstantTradeSettings {\n const preset = getDefaultPresetForChain(chain);\n const nativeSymbol = getNativeToken(chain)?.symbol ?? \"ETH\";\n return {\n buy: {\n customAmounts: getDefaultBuyAmounts(nativeSymbol),\n presets: [{ ...preset }, { ...preset }, { ...preset }],\n },\n sell: {\n customPercentages: [...DEFAULT_SELL_PERCENTAGES],\n presets: [{ ...preset }, { ...preset }, { ...preset }],\n },\n };\n}\n\nexport const DEFAULT_INSTANT_TRADE_SETTINGS: InstantTradeSettings =\n buildDefaultSettings(\"900900900\" as Chain);\n\n// ---------------------------------------------------------------------------\n// localStorage helpers\n// ---------------------------------------------------------------------------\n\nfunction storageKey(chain: string) {\n return `liberfi.instant-trade.settings.${chain}`;\n}\n\nfunction readStoredSettings(\n chain: Chain,\n fallback: InstantTradeSettings,\n): InstantTradeSettings {\n try {\n const raw = localStorage.getItem(storageKey(String(chain)));\n if (raw) return JSON.parse(raw) as InstantTradeSettings;\n } catch {\n /* ignore */\n }\n return fallback;\n}\n\nfunction writeStoredSettings(chain: string, settings: InstantTradeSettings) {\n try {\n localStorage.setItem(storageKey(chain), JSON.stringify(settings));\n } catch {\n /* ignore */\n }\n}\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\nconst InstantTradeContext = createContext<InstantTradeContextValue | null>(\n null,\n);\n\n/** Access the nearest {@link InstantTradeProvider}. Throws if none found. */\nexport function useInstantTrade(): InstantTradeContextValue {\n const ctx = useContext(InstantTradeContext);\n if (!ctx) {\n throw new Error(\n \"useInstantTrade must be used within an InstantTradeProvider\",\n );\n }\n return ctx;\n}\n\n// ---------------------------------------------------------------------------\n// Provider\n// ---------------------------------------------------------------------------\n\n/**\n * Provides instant-trade state to descendant components.\n *\n * Settings follow a controlled / uncontrolled pattern:\n * - **Controlled**: pass `settings` + `onSettingsChange` props.\n * - **Uncontrolled** (default): settings auto-persist to localStorage keyed by chain.\n */\nexport function InstantTradeProvider({\n chain,\n tokenAddress,\n settings: controlledSettings,\n onSettingsChange,\n children,\n}: InstantTradeProviderProps) {\n const nativeToken = useMemo(() => getNativeToken(chain), [chain]);\n const isControlled = controlledSettings !== undefined;\n const chainDefaults = useMemo(() => buildDefaultSettings(chain), [chain]);\n\n // -- Uncontrolled settings state (only used when no controlled prop) --\n const [localSettings, setLocalSettings] = useState<InstantTradeSettings>(\n () =>\n isControlled ? chainDefaults : readStoredSettings(chain, chainDefaults),\n );\n\n const settings = isControlled ? controlledSettings : localSettings;\n\n const setSettings = useCallback(\n (next: InstantTradeSettings) => {\n if (isControlled) {\n onSettingsChange?.(next);\n } else {\n setLocalSettings(next);\n writeStoredSettings(String(chain), next);\n }\n },\n [isControlled, onSettingsChange, chain],\n );\n\n const updateBuySettings = useCallback(\n (buy: BuySettings) => setSettings({ ...settings, buy }),\n [settings, setSettings],\n );\n\n const updateSellSettings = useCallback(\n (sell: SellSettings) => setSettings({ ...settings, sell }),\n [settings, setSettings],\n );\n\n // -- UI state --\n const [direction, setDirection] = useState<\"buy\" | \"sell\">(\"buy\");\n const [amount, setAmount] = useState<number | undefined>();\n const [buyPreset, setBuyPreset] = useState(0);\n const [sellPreset, setSellPreset] = useState(0);\n\n const defaultPreset = useMemo(() => getDefaultPresetForChain(chain), [chain]);\n\n const currentPresetValues = useMemo(() => {\n const idx = direction === \"buy\" ? buyPreset : sellPreset;\n const presets =\n direction === \"buy\" ? settings.buy.presets : settings.sell.presets;\n return presets[idx] ?? defaultPreset;\n }, [direction, buyPreset, sellPreset, settings, defaultPreset]);\n\n const value = useMemo<InstantTradeContextValue>(\n () => ({\n chain,\n tokenAddress,\n nativeToken,\n direction,\n setDirection,\n amount,\n setAmount,\n buyPreset,\n setBuyPreset,\n sellPreset,\n setSellPreset,\n settings,\n updateBuySettings,\n updateSellSettings,\n currentPresetValues,\n }),\n [\n chain,\n tokenAddress,\n nativeToken,\n direction,\n amount,\n buyPreset,\n sellPreset,\n settings,\n updateBuySettings,\n updateSellSettings,\n currentPresetValues,\n ],\n );\n\n return (\n <InstantTradeContext.Provider value={value}>\n {children}\n </InstantTradeContext.Provider>\n );\n}\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport BigNumber from \"bignumber.js\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n useTokensQuery,\n useWalletPortfoliosByTokensQuery,\n} from \"@liberfi.io/react\";\nimport { ChainNamespace, Chain } from \"@liberfi.io/types\";\nimport {\n chainToNamespace,\n getNativeToken,\n getWrappedToken,\n isSolanaChain,\n formatAmountUSD,\n} from \"@liberfi.io/utils\";\nimport { useWallets } from \"@liberfi.io/wallet-connector\";\nimport { useSwap } from \"../../hooks/useSwap\";\nimport { getDefaultPresetForChain } from \"./chain-features\";\nimport { useInstantTrade } from \"./instant-trade.context\";\nimport type {\n UseInstantTradeScriptParams,\n UseInstantTradeScriptResult,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst BALANCE_POLL_MS = 15_000;\nconst TOKEN_POLL_MS = 10_000;\n\n// ---------------------------------------------------------------------------\n// Script hook\n// ---------------------------------------------------------------------------\n\n/**\n * Script hook that encapsulates all data and state for the instant trade form.\n *\n * Must be used inside an {@link InstantTradeProvider}.\n * Pure TypeScript — no JSX, no UI imports.\n */\nexport function useInstantTradeScript(\n params: UseInstantTradeScriptParams,\n): UseInstantTradeScriptResult {\n const { chain, tokenAddress, onSwapSubmitted, onSwapError } = params;\n const { t } = useTranslation();\n\n const ctx = useInstantTrade();\n\n const nativeToken = useMemo(() => getNativeToken(chain), [chain]);\n const wrappedToken = useMemo(() => getWrappedToken(chain), [chain]);\n\n // -- Wallet --\n const wallets = useWallets();\n const ns = chainToNamespace(chain);\n const wallet = useMemo(\n () => wallets.find((w) => w.chainNamespace === ns && w.isConnected),\n [wallets, ns],\n );\n const walletAddress = wallet?.address ?? \"\";\n\n // -- Token metadata --\n const tokenAddresses = useMemo(() => {\n const addrs = [tokenAddress];\n if (nativeToken) addrs.push(nativeToken.address);\n if (wrappedToken) addrs.push(wrappedToken.address);\n return addrs.filter(Boolean);\n }, [tokenAddress, nativeToken, wrappedToken]);\n\n const tokensQuery = useTokensQuery(\n { chain, addresses: tokenAddresses },\n { enabled: tokenAddresses.length > 0, refetchInterval: TOKEN_POLL_MS },\n );\n\n const tokenInfo = useMemo(\n () => tokensQuery.data?.find((t) => t.address === tokenAddress) ?? null,\n [tokensQuery.data, tokenAddress],\n );\n\n // -- Balances --\n const balancesQuery = useWalletPortfoliosByTokensQuery(\n { chain, address: walletAddress, tokenAddresses },\n {\n enabled: !!walletAddress && tokenAddresses.length > 0,\n refetchInterval: BALANCE_POLL_MS,\n },\n );\n\n const nativeAddr = nativeToken?.address ?? wrappedToken?.address ?? \"\";\n const nativeBalance = useMemo(\n () => balancesQuery.data?.find((p) => p.address === nativeAddr) ?? null,\n [balancesQuery.data, nativeAddr],\n );\n const tokenBalance = useMemo(\n () => balancesQuery.data?.find((p) => p.address === tokenAddress) ?? null,\n [balancesQuery.data, tokenAddress],\n );\n\n // -- Settings form visibility --\n const [showSettings, setShowSettings] = useState(false);\n const lastClickedPreset = useRef<number | null>(null);\n\n const handlePresetClick = useCallback((preset: number) => {\n const last = lastClickedPreset.current;\n lastClickedPreset.current = preset;\n setShowSettings((prev) =>\n last === null || last !== preset ? true : !prev,\n );\n }, []);\n\n // -- Swap execution --\n const onSubmittedRef = useRef(onSwapSubmitted);\n onSubmittedRef.current = onSwapSubmitted;\n const onErrorRef = useRef(onSwapError);\n onErrorRef.current = onSwapError;\n\n const { swap: rawSwap, isSwapping } = useSwap({\n onSubmitted: (result) => onSubmittedRef.current?.(result),\n onError: (err, phase) => onErrorRef.current?.(err, phase),\n });\n\n const swap = useCallback(async () => {\n if (!ctx.amount || !wallet || !tokenAddress) return;\n\n const nativeDecimals = nativeToken?.decimals ?? 9;\n const inputAddress = wrappedToken?.address ?? nativeToken?.address ?? \"\";\n\n const isBuy = ctx.direction === \"buy\";\n const from = isBuy ? inputAddress : tokenAddress;\n const to = isBuy ? tokenAddress : inputAddress;\n\n const decimals = isBuy ? nativeDecimals : (tokenInfo?.decimals ?? 9);\n const amountInDecimals = new BigNumber(ctx.amount)\n .shiftedBy(decimals)\n .decimalPlaces(0)\n .toString();\n\n const preset = ctx.currentPresetValues;\n const chainDefault = getDefaultPresetForChain(chain);\n const slippage = preset.slippage ?? chainDefault.slippage ?? 1;\n const isAntiMev = preset.antiMev !== \"off\";\n\n const solanaFields = isSolanaChain(chain)\n ? {\n priorityFee: new BigNumber(\n preset.priorityFee ?? chainDefault.priorityFee ?? 0,\n )\n .shiftedBy(nativeDecimals)\n .decimalPlaces(0)\n .toString(),\n tipFee: new BigNumber(preset.tipFee ?? chainDefault.tipFee ?? 0)\n .shiftedBy(nativeDecimals)\n .decimalPlaces(0)\n .toString(),\n isAntiMev,\n }\n : {};\n\n try {\n await rawSwap({\n chain,\n wallet,\n input: from,\n output: to,\n amount: amountInDecimals,\n slippage,\n ...solanaFields,\n });\n ctx.setAmount(undefined);\n } catch {\n /* error already reported via callback */\n }\n }, [\n ctx,\n wallet,\n tokenAddress,\n nativeToken,\n wrappedToken,\n tokenInfo,\n chain,\n rawSwap,\n ]);\n\n // -- Submit text --\n const submitText = useMemo(() => {\n const dir = t(ctx.direction === \"buy\" ? \"common.buy\" : \"common.sell\");\n if (!ctx.amount) return dir;\n\n const insufficientSuffix = ` (${t(\"trade.insufficientBalance\")})`;\n\n if (ctx.direction === \"buy\") {\n const bal = nativeBalance?.amount;\n if (bal && new BigNumber(bal).lt(ctx.amount))\n return `${dir}${insufficientSuffix}`;\n\n const symbol = nativeToken?.symbol ?? \"\";\n const nativePrice = tokensQuery.data?.find(\n (tk) => tk.address === nativeAddr,\n )?.marketData?.priceInUsd;\n if (nativePrice) {\n const usd = formatAmountUSD(\n new BigNumber(ctx.amount).times(Number(nativePrice)),\n );\n return t(\"trade.submitBuyAmount\", {\n amount: ctx.amount,\n symbol,\n usd,\n });\n }\n return t(\"trade.submitBuyAmountNoUsd\", {\n amount: ctx.amount,\n symbol,\n });\n }\n\n // sell\n const bal = tokenBalance?.amount;\n if (bal && new BigNumber(bal).lt(ctx.amount))\n return `${dir}${insufficientSuffix}`;\n return dir;\n }, [\n t,\n ctx.direction,\n ctx.amount,\n nativeBalance,\n tokenBalance,\n nativeToken,\n tokensQuery.data,\n nativeAddr,\n ]);\n\n const isDisabled = !ctx.amount || !wallet || !tokenAddress;\n const isLoading = tokensQuery.isPending || balancesQuery.isPending;\n\n return useMemo<UseInstantTradeScriptResult>(\n () => ({\n chain,\n tokenAddress,\n nativeToken,\n tokenInfo,\n nativeBalance,\n tokenBalance,\n direction: ctx.direction,\n setDirection: ctx.setDirection,\n amount: ctx.amount,\n setAmount: ctx.setAmount,\n buyPreset: ctx.buyPreset,\n setBuyPreset: ctx.setBuyPreset,\n sellPreset: ctx.sellPreset,\n setSellPreset: ctx.setSellPreset,\n currentPresetValues: ctx.currentPresetValues,\n settings: ctx.settings,\n updateBuySettings: ctx.updateBuySettings,\n updateSellSettings: ctx.updateSellSettings,\n showSettings,\n handlePresetClick,\n swap,\n isSwapping,\n submitText,\n isDisabled,\n isLoading,\n }),\n [\n chain,\n tokenAddress,\n nativeToken,\n tokenInfo,\n nativeBalance,\n tokenBalance,\n ctx,\n showSettings,\n handlePresetClick,\n swap,\n isSwapping,\n submitText,\n isDisabled,\n isLoading,\n ],\n );\n}\n","import { Key, useCallback, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n cn,\n InfoIcon,\n ShieldIcon,\n ShieldOffIcon,\n ShieldPlusIcon,\n Tab,\n StyledTooltip,\n StyledNumberInput,\n StyledInput,\n StyledSwitch,\n StyledBorderedTabs,\n} from \"@liberfi.io/ui\";\nimport type { TradePresetValues } from \"../../types\";\nimport { getChainPresetFeatures, type FeeType } from \"./chain-features\";\nimport type { PresetFormUIProps } from \"./types\";\n\n/**\n * Pure presentational preset-settings form.\n *\n * Renders inputs for slippage, priority fee, tip fee, auto fee,\n * max auto fee, anti-MEV and custom RPC.\n *\n * The `chain` prop controls which fields are visible:\n * - Solana: priority fee (SOL), tip fee (SOL), anti-MEV\n * - Ethereum: gas fee (Gwei) only\n * - BSC: gas fee (Gwei) + tip fee (BNB)\n */\nexport function PresetFormUI({\n value,\n onChange,\n chain,\n disableAnimation,\n className,\n}: PresetFormUIProps) {\n const update = useCallback(\n (patch: Partial<TradePresetValues>) => onChange({ ...value, ...patch }),\n [value, onChange],\n );\n\n const features = useMemo(() => getChainPresetFeatures(chain), [chain]);\n\n const feeKey =\n features.feeType === \"gasFee\"\n ? (\"gasFee\" as const)\n : (\"priorityFee\" as const);\n\n return (\n <div className={cn(\"space-y-4\", className)}>\n <SlippageRow\n value={value.slippage}\n onChange={(v) => update({ slippage: v })}\n />\n <FeeRow\n value={value[feeKey]}\n onChange={(v) => update({ [feeKey]: v })}\n feeType={features.feeType}\n symbol={features.feeUnit}\n decimals={features.feeDecimals}\n />\n {features.showTipFee && (\n <TipFeeRow\n value={value.tipFee}\n onChange={(v) => update({ tipFee: v })}\n symbol={features.tipFeeUnit}\n decimals={features.tipFeeDecimals}\n />\n )}\n {features.showAutoFee && (\n <>\n <AutoFeeRow\n value={value.autoFee}\n onChange={(v) => update({ autoFee: v })}\n disableAnimation={disableAnimation}\n />\n {value.autoFee && (\n <MaxAutoFeeRow\n value={value.maxAutoFee}\n onChange={(v) => update({ maxAutoFee: v })}\n symbol={features.nativeSymbol}\n />\n )}\n </>\n )}\n <AntiMEVRow\n value={value.antiMev}\n onChange={(v) => update({ antiMev: v })}\n options={features.antiMevOptions}\n disableAnimation={disableAnimation}\n />\n {features.showCustomRPC && (\n <CustomRPCRow\n value={value.customRPC}\n onChange={(v) => update({ customRPC: v })}\n />\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Internal row components\n// ---------------------------------------------------------------------------\n\n// -- Slippage --\n\nfunction SlippageRow({\n value,\n onChange,\n}: {\n value: number | null;\n onChange: (v: number | null) => void;\n}) {\n const { t } = useTranslation();\n const label = t(\"trade.preset.slippage\");\n return (\n <div className=\"w-full grid grid-cols-2 gap-2 items-center\">\n <div className=\"text-sm text-neutral\">{label}</div>\n <StyledNumberInput\n fullWidth\n variant=\"flat\"\n value={value === null ? undefined : value}\n onValueChange={(v) => onChange(isNaN(v) ? null : v)}\n hideStepper\n minValue={0}\n maxValue={100}\n step={1}\n endContent={<span className=\"text-sm text-neutral\">%</span>}\n aria-label={label}\n />\n </div>\n );\n}\n\n// -- Fee (priority fee for Solana, gas fee for EVM) --\n\nfunction FeeRow({\n value,\n onChange,\n feeType,\n symbol,\n decimals,\n}: {\n value: number | null;\n onChange: (v: number | null) => void;\n feeType: FeeType;\n symbol: string;\n decimals: number;\n}) {\n const { t } = useTranslation();\n const label = t(`trade.preset.${feeType}`);\n const tooltip = t(`trade.preset.${feeType}.tooltip`);\n return (\n <div className=\"w-full grid grid-cols-2 gap-2 items-center\">\n <div className=\"text-sm text-neutral flex items-center gap-1\">\n {label}\n <StyledTooltip content={tooltip}>\n <Button\n isIconOnly\n className=\"bg-transparent min-w-0 w-4 min-h-0 h-4 p-0\"\n disableRipple\n >\n <InfoIcon width={13} height={13} className=\"text-neutral\" />\n </Button>\n </StyledTooltip>\n </div>\n <StyledNumberInput\n fullWidth\n variant=\"flat\"\n value={value === null ? undefined : value}\n onValueChange={(v) => onChange(isNaN(v) ? null : v)}\n hideStepper\n minValue={0}\n formatOptions={{ maximumFractionDigits: decimals }}\n endContent={<span className=\"text-sm text-neutral\">{symbol}</span>}\n aria-label={label}\n />\n </div>\n );\n}\n\n// -- Tip Fee --\n\nfunction TipFeeRow({\n value,\n onChange,\n symbol,\n decimals,\n}: {\n value: number | null;\n onChange: (v: number | null) => void;\n symbol: string;\n decimals: number;\n}) {\n const { t } = useTranslation();\n const label = t(\"trade.preset.tipFee\");\n return (\n <div className=\"w-full grid grid-cols-2 gap-2 items-center\">\n <div className=\"text-sm text-neutral flex items-center gap-1\">\n {label}\n <StyledTooltip content={t(\"trade.preset.tipFee.tooltip\")}>\n <Button\n isIconOnly\n className=\"bg-transparent min-w-0 w-4 min-h-0 h-4 p-0\"\n disableRipple\n >\n <InfoIcon width={13} height={13} className=\"text-neutral\" />\n </Button>\n </StyledTooltip>\n </div>\n <StyledNumberInput\n fullWidth\n variant=\"flat\"\n value={value === null ? undefined : value}\n onValueChange={(v) => onChange(isNaN(v) ? null : v)}\n hideStepper\n minValue={0}\n formatOptions={{ maximumFractionDigits: decimals }}\n endContent={<span className=\"text-sm text-neutral\">{symbol}</span>}\n aria-label={label}\n />\n </div>\n );\n}\n\n// -- Auto Fee --\n\nfunction AutoFeeRow({\n value,\n onChange,\n disableAnimation,\n}: {\n value: boolean;\n onChange: (v: boolean) => void;\n disableAnimation?: boolean;\n}) {\n const { t } = useTranslation();\n const label = t(\"trade.preset.autoFee\");\n return (\n <div className=\"w-full grid grid-cols-2 gap-2 items-center\">\n <div className=\"text-sm text-neutral flex items-center gap-1\">\n {label}\n <StyledTooltip content={t(\"trade.preset.autoFee.tooltip\")}>\n <Button\n isIconOnly\n className=\"bg-transparent min-w-0 w-4 min-h-0 h-4 p-0\"\n disableRipple\n >\n <InfoIcon width={13} height={13} className=\"text-neutral\" />\n </Button>\n </StyledTooltip>\n </div>\n <div className=\"flex justify-end\">\n <StyledSwitch\n isSelected={value}\n onValueChange={onChange}\n color=\"primary\"\n aria-label={label}\n disableAnimation={disableAnimation}\n />\n </div>\n </div>\n );\n}\n\n// -- Max Auto Fee --\n\nfunction MaxAutoFeeRow({\n value,\n onChange,\n symbol,\n}: {\n value: number | null;\n onChange: (v: number | null) => void;\n symbol: string;\n}) {\n const { t } = useTranslation();\n const label = t(\"trade.preset.maxAutoFee\");\n return (\n <div className=\"w-full grid grid-cols-2 gap-2 items-center\">\n <div className=\"text-sm text-neutral\">{label}</div>\n <StyledNumberInput\n fullWidth\n variant=\"flat\"\n value={value === null ? undefined : value}\n onValueChange={(v) => onChange(isNaN(v) ? null : v)}\n hideStepper\n minValue={0}\n endContent={<span className=\"text-sm text-neutral\">{symbol}</span>}\n aria-label={label}\n />\n </div>\n );\n}\n\n// -- Anti-MEV --\n\nfunction AntiMEVRow({\n value,\n onChange,\n options,\n disableAnimation,\n}: {\n value: \"off\" | \"reduced\" | \"secure\";\n onChange: (v: \"off\" | \"reduced\" | \"secure\") => void;\n options: readonly (\"off\" | \"reduced\" | \"secure\")[];\n disableAnimation?: boolean;\n}) {\n const { t } = useTranslation();\n const label = t(\"trade.preset.antiMev\");\n const icons = useMemo(\n () =>\n ({\n off: ShieldOffIcon,\n reduced: ShieldIcon,\n secure: ShieldPlusIcon,\n }) as const,\n [],\n );\n const tooltips = useMemo(\n () => ({\n off: {\n title: t(\"trade.preset.antiMev.off\"),\n desc: t(\"trade.preset.antiMev.off.desc\"),\n },\n reduced: {\n title: t(\"trade.preset.antiMev.reduced\"),\n desc: t(\"trade.preset.antiMev.reduced.desc\"),\n },\n secure: {\n title: t(\"trade.preset.antiMev.secure\"),\n desc: t(\"trade.preset.antiMev.secure.desc\"),\n },\n }),\n [t],\n );\n return (\n <div className=\"w-full grid grid-cols-2 gap-2 items-center\">\n <div className=\"text-sm text-neutral flex items-center gap-1\">\n {label}\n <StyledTooltip content={t(\"trade.preset.antiMev.tooltip\")}>\n <Button\n isIconOnly\n className=\"bg-transparent min-w-0 w-4 min-h-0 h-4 p-0\"\n disableRipple\n >\n <InfoIcon width={13} height={13} className=\"text-neutral\" />\n </Button>\n </StyledTooltip>\n </div>\n <div className=\"flex justify-end\">\n <StyledBorderedTabs\n color=\"primary\"\n radius=\"lg\"\n classNames={{ tabList: \"gap-0\", tab: \"w-8 min-w-0 px-0\" }}\n selectedKey={value}\n onSelectionChange={onChange as (key: Key) => void}\n disableAnimation={disableAnimation}\n aria-label={label}\n >\n {options.map((opt) => {\n const Icon = icons[opt];\n const tip = tooltips[opt];\n return (\n <Tab\n key={opt}\n title={\n <StyledTooltip\n content={\n <div className=\"text-xs\">\n <div className=\"font-medium text-foreground\">\n {tip.title}\n </div>\n <div className=\"mt-0.5\">{tip.desc}</div>\n </div>\n }\n >\n <span className=\"flex items-center justify-center\">\n <Icon width={18} height={18} />\n </span>\n </StyledTooltip>\n }\n />\n );\n })}\n </StyledBorderedTabs>\n </div>\n </div>\n );\n}\n\n// -- Custom RPC --\n\nfunction CustomRPCRow({\n value,\n onChange,\n}: {\n value: string | null;\n onChange: (v: string | null) => void;\n}) {\n const { t } = useTranslation();\n const label = t(\"trade.preset.customRpc\");\n return (\n <div className=\"w-full flex gap-4 items-center\">\n <div className=\"flex-none text-sm text-neutral\">{label}</div>\n <div className=\"flex-auto\">\n <StyledInput\n fullWidth\n variant=\"flat\"\n value={value ?? \"\"}\n onValueChange={(v) => onChange(v || null)}\n placeholder=\"https://...\"\n aria-label={label}\n />\n </div>\n </div>\n );\n}\n","import { ChangeEvent, Key, useCallback, useMemo, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { Chain } from \"@liberfi.io/types\";\nimport {\n Button,\n CheckIcon,\n cn,\n CoinsIcon,\n EditIcon,\n NumberInput,\n ShieldIcon,\n ShieldOffIcon,\n ShieldPlusIcon,\n SlippageIcon,\n Tab,\n Tabs,\n Tooltip,\n ZapFastIcon,\n} from \"@liberfi.io/ui\";\nimport { formatPercent, formatPrice, getNativeToken } from \"@liberfi.io/utils\";\nimport type { TradePresetValues } from \"../../types\";\nimport { getChainPresetFeatures } from \"./chain-features\";\nimport { PresetFormUI } from \"./preset-form.ui\";\nimport type { InstantTradeUIProps } from \"./types\";\n\n/**\n * Pure presentational component for the instant trade form.\n *\n * Receives all data and callbacks via props — no API calls, no context access.\n * Consumers can replace this component while reusing `useInstantTradeScript`.\n */\nexport function InstantTradeUI({\n chain,\n direction,\n onDirectionChange,\n amount,\n onAmountChange,\n customAmounts,\n customPercentages,\n onQuickAmountClick,\n onQuickPercentageClick,\n onCustomAmountsEdit,\n onCustomPercentagesEdit,\n tokenSymbol,\n nativeBalance,\n tokenBalance,\n amountConversion,\n preset,\n onPresetChange,\n presetValues,\n onPresetSettingsChange,\n showSettings,\n onPresetClick,\n submitText,\n isDisabled,\n isLoading,\n onSubmit,\n className,\n headerExtra,\n}: InstantTradeUIProps) {\n const { t } = useTranslation();\n const nativeToken = useMemo(() => getNativeToken(chain), [chain]);\n const nativeSymbol = nativeToken?.symbol;\n const nativeDecimals = nativeToken?.decimals ?? 9;\n\n return (\n <div\n className={cn(\"flex-none sm:px-3 py-3 bg-content1 rounded-lg\", className)}\n >\n {/* ── Direction tabs ──────────────────────────────────────────────── */}\n <Tabs\n fullWidth\n size=\"sm\"\n selectedKey={direction}\n onSelectionChange={onDirectionChange as (key: Key) => void}\n classNames={{\n tabList: \"bg-content2\",\n tab: \"data-[selected=true]:bg-content3 h-6\",\n }}\n disableAnimation\n >\n <Tab key=\"buy\" title={t(\"common.buy\")} />\n <Tab key=\"sell\" title={t(\"common.sell\")} />\n </Tabs>\n\n {/* ── Trade type + extra ──────────────────────────────────────────── */}\n <div className=\"mt-2.5 h-8 flex items-center justify-between\">\n <Tabs\n size=\"sm\"\n variant=\"underlined\"\n classNames={{ tabList: \"gap-0\", tab: \"px-1.5\" }}\n selectedKey=\"market\"\n disableAnimation\n >\n <Tab key=\"market\" title={t(\"trade.market\")} />\n </Tabs>\n {headerExtra}\n </div>\n\n {/* ── Amount input ────────────────────────────────────────────────── */}\n <div className=\"mt-2.5\">\n {direction === \"buy\" ? (\n <BuyAmountSection\n amount={amount}\n onAmountChange={onAmountChange}\n customAmounts={customAmounts}\n onQuickAmountClick={onQuickAmountClick}\n onCustomAmountsEdit={onCustomAmountsEdit}\n nativeSymbol={nativeSymbol}\n nativeDecimals={nativeDecimals}\n amountLabel={t(\"trade.amount\")}\n />\n ) : (\n <SellAmountSection\n amount={amount}\n onAmountChange={onAmountChange}\n customPercentages={customPercentages}\n onQuickPercentageClick={onQuickPercentageClick}\n onCustomPercentagesEdit={onCustomPercentagesEdit}\n tokenSymbol={tokenSymbol}\n amountLabel={t(\"trade.amount\")}\n />\n )}\n </div>\n\n {/* ── Balance & conversion ─────────────────────────────────────── */}\n <div className=\"mt-2 flex items-center justify-between\">\n <div className=\"text-xs text-neutral space-x-1\">\n <span>{t(\"trade.balance\")}</span>\n <span>\n {direction === \"buy\"\n ? nativeBalance\n ? `${nativeBalance} ${nativeSymbol ?? \"\"}`\n : \"--\"\n : tokenBalance\n ? `${tokenBalance} ${tokenSymbol ?? \"\"}`\n : \"--\"}\n </span>\n </div>\n {amountConversion && (\n <div className=\"text-xs text-neutral\">{amountConversion}</div>\n )}\n </div>\n\n {/* ── Preset overview ──────────────────────────────────────────── */}\n <div className=\"mt-4\">\n <PresetOverview values={presetValues} chain={chain} />\n </div>\n\n {/* ── Preset switcher ──────────────────────────────────────────── */}\n <div className=\"mt-2\">\n <Tabs\n variant=\"bordered\"\n size=\"sm\"\n fullWidth\n classNames={{\n tabList: \"border-content3 border-1 gap-0 p-0.5\",\n tab: \"min-h-0 h-6 px-2 py-1 text-xs data-[selected=true]:bg-content3\",\n tabContent: \"text-neutral\",\n }}\n selectedKey={`${preset}`}\n onSelectionChange={(key: Key) => onPresetChange(Number(key))}\n disableAnimation\n aria-label={t(\"trade.preset.presets\")}\n >\n <Tab\n key={0}\n title={t(\"trade.preset.label\", { n: 1 })}\n onClick={() => onPresetClick(0)}\n />\n <Tab\n key={1}\n title={t(\"trade.preset.label\", { n: 2 })}\n onClick={() => onPresetClick(1)}\n />\n <Tab\n key={2}\n title={t(\"trade.preset.label\", { n: 3 })}\n onClick={() => onPresetClick(2)}\n />\n </Tabs>\n </div>\n\n {/* ── Settings form (conditional) ──────────────────────────────── */}\n {showSettings && (\n <div className=\"mt-2.5\">\n <PresetFormUI\n value={presetValues}\n onChange={onPresetSettingsChange}\n chain={chain}\n />\n </div>\n )}\n\n {/* ── Submit ───────────────────────────────────────────────────── */}\n <Button\n fullWidth\n size=\"sm\"\n color={direction === \"buy\" ? \"primary\" : \"secondary\"}\n className=\"mt-2 rounded-lg\"\n disableRipple\n isDisabled={isDisabled}\n isLoading={isLoading}\n onPress={onSubmit}\n >\n {submitText}\n </Button>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Buy amount section with quick-input buttons\n// ---------------------------------------------------------------------------\n\nfunction BuyAmountSection({\n amount,\n onAmountChange,\n customAmounts,\n onQuickAmountClick,\n onCustomAmountsEdit,\n nativeSymbol,\n nativeDecimals,\n amountLabel,\n}: {\n amount: number | undefined;\n onAmountChange: (v: number | undefined) => void;\n customAmounts: (number | null)[];\n onQuickAmountClick: (v: number) => void;\n onCustomAmountsEdit: (a: (number | null)[]) => void;\n nativeSymbol: string | undefined;\n nativeDecimals: number;\n amountLabel: string;\n}) {\n const handleChange = useCallback(\n (v: number | ChangeEvent<HTMLInputElement>) => {\n if (typeof v === \"number\") {\n onAmountChange(isNaN(v) ? undefined : v);\n }\n },\n [onAmountChange],\n );\n\n return (\n <div className=\"space-y-0.5\">\n <NumberInput\n min={0}\n value={amount}\n onChange={handleChange}\n fullWidth\n hideStepper\n startContent={\n <span className=\"flex-none text-xs text-neutral\">{amountLabel}</span>\n }\n endContent={\n <span className=\"flex-none text-xs text-neutral\">\n {nativeSymbol ?? \"\"}\n </span>\n }\n formatOptions={{\n maximumFractionDigits: nativeDecimals,\n }}\n classNames={{\n inputWrapper: cn(\n \"h-8 min-h-0 py-0 rounded-lg rounded-b-none shadow-none\",\n \"bg-content2 data-[hover=true]:bg-content3 group-data-[focus=true]:bg-content3\",\n ),\n input: \"text-xs\",\n }}\n />\n <QuickButtons\n values={customAmounts}\n onSelect={onQuickAmountClick}\n onEdit={onCustomAmountsEdit}\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Sell amount section with percentage quick-input buttons\n// ---------------------------------------------------------------------------\n\nfunction SellAmountSection({\n amount,\n onAmountChange,\n customPercentages,\n onQuickPercentageClick,\n onCustomPercentagesEdit,\n tokenSymbol,\n amountLabel,\n}: {\n amount: number | undefined;\n onAmountChange: (v: number | undefined) => void;\n customPercentages: (number | null)[];\n onQuickPercentageClick: (pct: number) => void;\n onCustomPercentagesEdit: (p: (number | null)[]) => void;\n tokenSymbol?: string;\n amountLabel: string;\n}) {\n const handleChange = useCallback(\n (v: number | ChangeEvent<HTMLInputElement>) => {\n if (typeof v === \"number\") {\n onAmountChange(isNaN(v) ? undefined : v);\n }\n },\n [onAmountChange],\n );\n\n return (\n <div className=\"space-y-0.5\">\n <NumberInput\n min={0}\n value={amount}\n onChange={handleChange}\n fullWidth\n hideStepper\n startContent={\n <span className=\"flex-none text-xs text-neutral\">{amountLabel}</span>\n }\n endContent={\n <span className=\"flex-none text-xs text-neutral\">\n {tokenSymbol ?? \"\"}\n </span>\n }\n classNames={{\n inputWrapper: cn(\n \"h-8 min-h-0 py-0 rounded-lg rounded-b-none shadow-none\",\n \"bg-content2 data-[hover=true]:bg-content3 group-data-[focus=true]:bg-content3\",\n ),\n input: \"text-xs\",\n }}\n />\n <QuickButtons\n values={customPercentages}\n onSelect={onQuickPercentageClick}\n onEdit={onCustomPercentagesEdit}\n suffix=\"%\"\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Reusable quick-input buttons (editable)\n// ---------------------------------------------------------------------------\n\nfunction QuickButtons({\n values,\n onSelect,\n onEdit,\n suffix,\n}: {\n values: (number | null)[];\n onSelect: (v: number) => void;\n onEdit: (v: (number | null)[]) => void;\n suffix?: string;\n}) {\n const [isEditing, setIsEditing] = useState(false);\n const [tempValues, setTempValues] = useState<(number | null)[]>([]);\n\n const handleStartEdit = useCallback(() => {\n setTempValues([...values]);\n setIsEditing(true);\n }, [values]);\n\n const handleSave = useCallback(() => {\n setIsEditing(false);\n onEdit(tempValues);\n }, [onEdit, tempValues]);\n\n return (\n <div className=\"flex gap-0.5\">\n <div className=\"flex-auto grid grid-cols-4 gap-0.5\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div\n key={i}\n className={cn(\n \"h-6 bg-content2 flex items-center justify-center\",\n i === 0 && \"rounded-bl-lg\",\n )}\n >\n {isEditing ? (\n <NumberInput\n fullWidth\n value={\n tempValues[i] === null || tempValues[i] === undefined\n ? undefined\n : tempValues[i]\n }\n onChange={(v: number | ChangeEvent<HTMLInputElement>) => {\n if (typeof v === \"number\") {\n const val = isNaN(v) ? null : v;\n setTempValues((prev) => {\n const next = [...prev];\n next[i] = val;\n return next;\n });\n }\n }}\n min={0}\n hideStepper\n classNames={{\n inputWrapper: cn(\n \"p-0 h-6 min-h-0 rounded-none flex shadow-none\",\n \"bg-content2 data-[hover=true]:bg-content3 group-data-[focus=true]:bg-content3\",\n i === 0 && \"rounded-bl-lg\",\n ),\n innerWrapper: \"pb-0\",\n input: \"text-xs text-center\",\n }}\n />\n ) : (\n <Button\n className=\"min-w-0 w-full min-h-0 h-full p-0 bg-transparent text-xs\"\n size=\"sm\"\n disableRipple\n onPress={() => values[i] != null && onSelect(values[i]!)}\n endContent={\n suffix ? (\n <span className=\"text-xs text-neutral\">{suffix}</span>\n ) : null\n }\n >\n {values[i] ?? \"\"}\n </Button>\n )}\n </div>\n ))}\n </div>\n <div className=\"flex-none bg-content2 rounded-br-lg overflow-hidden\">\n {isEditing ? (\n <Button\n size=\"sm\"\n isIconOnly\n className=\"bg-transparent h-6 min-h-6 p-0\"\n disableRipple\n onPress={handleSave}\n >\n <CheckIcon width={12} height={12} />\n </Button>\n ) : (\n <Button\n size=\"sm\"\n isIconOnly\n className=\"bg-transparent h-6 min-h-6 p-0\"\n disableRipple\n onPress={handleStartEdit}\n >\n <EditIcon width={12} height={12} />\n </Button>\n )}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Preset overview row (icons + values)\n// ---------------------------------------------------------------------------\n\nfunction PresetOverview({\n values,\n chain,\n}: {\n values: TradePresetValues;\n chain: Chain;\n}) {\n const { t } = useTranslation();\n const features = useMemo(() => getChainPresetFeatures(chain), [chain]);\n\n const antiMevKey =\n values.antiMev && values.antiMev !== \"off\" ? values.antiMev : \"off\";\n\n return (\n <div className=\"flex items-center gap-2\">\n <Tooltip\n content={t(\"trade.preset.slippage\")}\n classNames={{ content: \"text-xs text-neutral py-2 px-4 max-w-xs\" }}\n >\n <Button\n size=\"sm\"\n className=\"bg-transparent p-0 h-5 min-h-0 w-auto min-w-0 gap-0.5 text-xs text-neutral\"\n disableRipple\n startContent={<SlippageIcon width={14} height={14} />}\n >\n {formatPercent((values.slippage ?? 0) / 100)}\n </Button>\n </Tooltip>\n\n <Tooltip\n content={t(`trade.preset.${features.feeType}`)}\n classNames={{ content: \"text-xs text-neutral py-2 px-4 max-w-xs\" }}\n >\n <Button\n size=\"sm\"\n className=\"bg-transparent p-0 h-5 min-h-0 w-auto min-w-0 gap-0.5 text-xs text-neutral\"\n disableRipple\n startContent={<ZapFastIcon width={14} height={14} />}\n >\n {formatPrice(values.priorityFee ?? 0)}\n </Button>\n </Tooltip>\n\n {features.showTipFee && (\n <Tooltip\n content={t(\"trade.preset.tipFee\")}\n classNames={{ content: \"text-xs text-neutral py-2 px-4 max-w-xs\" }}\n >\n <Button\n size=\"sm\"\n className=\"bg-transparent p-0 h-5 min-h-0 w-auto min-w-0 gap-0.5 text-xs text-neutral\"\n disableRipple\n startContent={<CoinsIcon width={14} height={14} />}\n >\n {formatPrice(values.tipFee ?? 0)}\n </Button>\n </Tooltip>\n )}\n\n <Tooltip\n content={t(\"trade.preset.antiMev\")}\n classNames={{ content: \"text-xs text-neutral py-2 px-4 max-w-xs\" }}\n >\n <Button\n size=\"sm\"\n className=\"bg-transparent p-0 h-5 min-h-0 w-auto min-w-0 gap-0.5 text-xs text-neutral\"\n disableRipple\n startContent={\n <>\n {antiMevKey === \"off\" && (\n <ShieldOffIcon\n width={14}\n height={14}\n className=\"text-neutral\"\n />\n )}\n {antiMevKey === \"reduced\" && (\n <ShieldIcon width={14} height={14} className=\"text-neutral\" />\n )}\n {antiMevKey === \"secure\" && (\n <ShieldPlusIcon\n width={14}\n height={14}\n className=\"text-neutral\"\n />\n )}\n </>\n }\n >\n {t(`trade.preset.antiMev.${antiMevKey}`)}\n </Button>\n </Tooltip>\n </div>\n );\n}\n","import { useCallback } from \"react\";\nimport BigNumber from \"bignumber.js\";\nimport { InstantTradeProvider } from \"./instant-trade.context\";\nimport { useInstantTradeScript } from \"./instant-trade.script\";\nimport { InstantTradeUI } from \"./instant-trade.ui\";\nimport type {\n InstantTradeWidgetProps,\n BuySettings,\n SellSettings,\n} from \"./types\";\n\n/**\n * Full instant-trade widget — thin orchestration layer.\n *\n * Wraps `InstantTradeProvider`, calls `useInstantTradeScript` to get all data,\n * and renders `InstantTradeUI` as the presentational layer.\n *\n * For custom UIs, use `useInstantTradeScript` directly inside an\n * `InstantTradeProvider` with your own presentation.\n */\nexport function InstantTradeWidget({\n chain,\n tokenAddress,\n onSwapSubmitted,\n onSwapError,\n settings,\n onSettingsChange,\n headerExtra,\n className,\n}: InstantTradeWidgetProps) {\n return (\n <InstantTradeProvider\n chain={chain}\n tokenAddress={tokenAddress}\n settings={settings}\n onSettingsChange={onSettingsChange}\n >\n <InstantTradeWidgetInner\n chain={chain}\n tokenAddress={tokenAddress}\n onSwapSubmitted={onSwapSubmitted}\n onSwapError={onSwapError}\n headerExtra={headerExtra}\n className={className}\n />\n </InstantTradeProvider>\n );\n}\n\nfunction InstantTradeWidgetInner({\n chain,\n tokenAddress,\n onSwapSubmitted,\n onSwapError,\n headerExtra,\n className,\n}: Omit<InstantTradeWidgetProps, \"settings\" | \"onSettingsChange\">) {\n const script = useInstantTradeScript({\n chain,\n tokenAddress,\n onSwapSubmitted,\n onSwapError,\n });\n\n // -- Quick amount click (buy: set amount directly, sell: compute from balance) --\n const handleQuickAmountClick = useCallback(\n (v: number) => script.setAmount(v),\n [script],\n );\n\n const handleQuickPercentageClick = useCallback(\n (pct: number) => {\n const bal = script.tokenBalance?.amount;\n if (!bal) return;\n const amount = new BigNumber(bal).times(pct).div(100).toNumber();\n script.setAmount(amount);\n },\n [script],\n );\n\n // -- Custom amounts/percentages editing --\n const handleCustomAmountsEdit = useCallback(\n (amounts: (number | null)[]) => {\n script.updateBuySettings({\n ...script.settings.buy,\n customAmounts: amounts,\n });\n },\n [script],\n );\n\n const handleCustomPercentagesEdit = useCallback(\n (pcts: (number | null)[]) => {\n script.updateSellSettings({\n ...script.settings.sell,\n customPercentages: pcts,\n });\n },\n [script],\n );\n\n // -- Preset settings change --\n const handlePresetSettingsChange = useCallback(\n (values: import(\"../../types\").TradePresetValues) => {\n const isBuy = script.direction === \"buy\";\n const idx = isBuy ? script.buyPreset : script.sellPreset;\n\n if (isBuy) {\n const prev = script.settings.buy;\n const presets = [...prev.presets];\n presets[idx] = values;\n script.updateBuySettings({ ...prev, presets });\n } else {\n const prev = script.settings.sell;\n const presets = [...prev.presets];\n presets[idx] = values;\n script.updateSellSettings({ ...prev, presets });\n }\n },\n [script],\n );\n\n // -- Preset change (select preset index) --\n const handlePresetChange = useCallback(\n (p: number) => {\n if (script.direction === \"buy\") {\n script.setBuyPreset(p);\n } else {\n script.setSellPreset(p);\n }\n },\n [script],\n );\n\n const currentPreset =\n script.direction === \"buy\" ? script.buyPreset : script.sellPreset;\n\n return (\n <InstantTradeUI\n chain={chain}\n direction={script.direction}\n onDirectionChange={script.setDirection}\n amount={script.amount}\n onAmountChange={script.setAmount}\n customAmounts={script.settings.buy.customAmounts}\n customPercentages={script.settings.sell.customPercentages}\n onQuickAmountClick={handleQuickAmountClick}\n onQuickPercentageClick={handleQuickPercentageClick}\n onCustomAmountsEdit={handleCustomAmountsEdit}\n onCustomPercentagesEdit={handleCustomPercentagesEdit}\n tokenSymbol={script.tokenInfo?.symbol}\n nativeBalance={script.nativeBalance?.amount}\n tokenBalance={script.tokenBalance?.amount}\n amountConversion={undefined}\n preset={currentPreset}\n onPresetChange={handlePresetChange}\n presetValues={script.currentPresetValues}\n onPresetSettingsChange={handlePresetSettingsChange}\n showSettings={script.showSettings}\n onPresetClick={script.handlePresetClick}\n submitText={script.submitText}\n isDisabled={script.isDisabled}\n isLoading={script.isSwapping}\n onSubmit={script.swap}\n className={className}\n headerExtra={headerExtra}\n />\n );\n}\n","import { useCallback, useMemo } from \"react\";\nimport { useAtom, useAtomValue } from \"jotai\";\nimport {\n instantTradeAmountAtomFamily,\n instantTradeAmountKey,\n} from \"../../states/instant-trade-amount\";\nimport { presetAtomFamily, presetKey } from \"../../states/preset\";\nimport type {\n UseAmountPresetInputScriptParams,\n UseAmountPresetInputScriptResult,\n} from \"./types\";\n\n/**\n * Script hook for the amount + preset input.\n *\n * Subscribes to atom-backed `{ amount, preset }` state (keyed by\n * `id + chain + token.address`) and reads preset values from\n * {@link presetAtomFamily} for tooltip display.\n *\n * Use the companion {@link AmountPresetInputWidget} for the default UI,\n * or call this hook directly to build a custom amount + preset input.\n */\nexport function useAmountPresetInputScript(\n params: UseAmountPresetInputScriptParams,\n): UseAmountPresetInputScriptResult {\n const {\n id,\n chain,\n token,\n storageKeyPrefix,\n onAmountChange,\n onPresetChange,\n onPresetClick,\n } = params;\n\n const [state, setState] = useAtom(\n instantTradeAmountAtomFamily(\n instantTradeAmountKey(id, chain, token.address, storageKeyPrefix),\n ),\n );\n\n const p0 = useAtomValue(\n presetAtomFamily(presetKey(chain, \"buy\", 0, storageKeyPrefix)),\n );\n const p1 = useAtomValue(\n presetAtomFamily(presetKey(chain, \"buy\", 1, storageKeyPrefix)),\n );\n const p2 = useAtomValue(\n presetAtomFamily(presetKey(chain, \"buy\", 2, storageKeyPrefix)),\n );\n const presetValues = useMemo(() => [p0, p1, p2], [p0, p1, p2]);\n\n const handleAmountChange = useCallback(\n (amount: number | undefined) => {\n setState((prev) => ({ ...prev, amount }));\n onAmountChange?.(amount);\n },\n [setState, onAmountChange],\n );\n\n const handlePresetChange = useCallback(\n (preset: number) => {\n setState((prev) => ({ ...prev, preset }));\n onPresetChange?.(preset);\n },\n [setState, onPresetChange],\n );\n\n return {\n token,\n chain,\n amount: state.amount,\n handleAmountChange,\n preset: state.preset,\n handlePresetChange,\n onPresetClick,\n presetValues,\n };\n}\n","import { Key, useCallback, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { Chain } from \"@liberfi.io/types\";\nimport {\n cn,\n CoinsIcon,\n LightningIcon,\n ShieldIcon,\n ShieldOffIcon,\n ShieldPlusIcon,\n SlippageIcon,\n StyledLightTabs,\n StyledNumberInput,\n StyledTooltip,\n Tab,\n TokenIcon,\n ZapFastIcon,\n} from \"@liberfi.io/ui\";\nimport { formatPercent, formatPrice } from \"@liberfi.io/utils\";\nimport type { TradePresetValues } from \"../../types\";\nimport {\n getChainPresetFeatures,\n getDefaultPresetForChain,\n} from \"./chain-features\";\nimport type { AmountPresetInputUIProps } from \"./types\";\n\n/**\n * Compact amount input with preset selector buttons (presentational).\n *\n * Designed for inline/header usage (e.g. token detail page).\n * Receives all data via props — no context dependency.\n */\nexport function AmountPresetInputUI({\n token,\n chain,\n amount,\n onAmountChange,\n preset = 0,\n onPresetChange,\n onPresetClick,\n presetValues,\n radius = \"full\",\n size = \"md\",\n className,\n}: AmountPresetInputUIProps) {\n const { t } = useTranslation();\n const defaultPreset = useMemo(() => getDefaultPresetForChain(chain), [chain]);\n\n const handleSelectionChange = useCallback(\n (key: Key) => {\n onPresetChange?.(Number(key));\n },\n [onPresetChange],\n );\n\n return (\n <div\n className={cn(\n \"flex items-center border-2 border-border\",\n radius === \"full\" && \"rounded-full\",\n radius === \"lg\" && \"rounded-lg\",\n radius === \"md\" && \"rounded-md\",\n radius === \"sm\" && \"rounded-sm\",\n size === \"sm\" && \"h-8 pr-2\",\n size === \"md\" && \"h-10 pr-2.5\",\n size === \"lg\" && \"h-12 pr-3\",\n className,\n )}\n >\n <StyledNumberInput\n key={`${chain}-${token.address}`}\n className=\"flex-auto min-w-0 h-full\"\n fullWidth\n variant=\"flat\"\n value={amount}\n onValueChange={(v) => onAmountChange(isNaN(v) ? undefined : v)}\n hideStepper\n minValue={0}\n formatOptions={{\n maximumFractionDigits: token.decimals,\n }}\n size={size}\n startContent={\n <LightningIcon\n width={size === \"sm\" ? 12 : size === \"md\" ? 16 : 20}\n height={size === \"sm\" ? 12 : size === \"md\" ? 16 : 20}\n className=\"text-primary flex-none\"\n />\n }\n endContent={\n <TokenIcon\n symbol={token.symbol}\n size={size === \"sm\" ? 16 : size === \"md\" ? 20 : 28}\n className=\"flex-none\"\n />\n }\n placeholder=\"0.0\"\n aria-label={t(\"trade.instantTradeAmount\")}\n classNames={{\n base: \"h-full\",\n mainWrapper: \"h-full\",\n inputWrapper:\n \"!bg-transparent !shadow-none !border-0 !rounded-none h-full !min-h-0\",\n }}\n />\n\n <div className=\"w-px bg-border self-stretch my-1.5 mx-1.5 flex-none\" />\n\n <StyledLightTabs\n color=\"primary\"\n size={size}\n selectedKey={String(preset)}\n onSelectionChange={handleSelectionChange}\n classNames={{\n base: \"flex-none h-full\",\n tabList: cn(\n \"bg-transparent h-full\",\n size === \"sm\" && \"p-1 gap-1\",\n size === \"md\" && \"p-1 gap-0\",\n size === \"lg\" && \"p-1.5 gap-0\",\n ),\n tab: cn(\n \"h-full\",\n size === \"sm\" && \"text-xs px-1\",\n size === \"md\" && \"text-sm px-2.5\",\n size === \"lg\" && \"text-sm px-3\",\n ),\n cursor: \"rounded-sm\",\n }}\n >\n {Array.from({ length: 3 }).map((_, index) => (\n <Tab\n key={String(index)}\n title={\n <StyledTooltip\n content={\n <PresetTooltip\n values={presetValues?.[index] ?? defaultPreset}\n chain={chain}\n />\n }\n classNames={{\n content: \"w-fit bg-content2 p-4\",\n }}\n offset={12}\n >\n <span\n onClick={() => preset === index && onPresetClick?.(index)}\n >\n {t(\"trade.preset.short\", { n: index + 1 })}\n </span>\n </StyledTooltip>\n }\n />\n ))}\n </StyledLightTabs>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Preset tooltip content\n// ---------------------------------------------------------------------------\n\nfunction PresetTooltip({\n values,\n chain,\n}: {\n values: TradePresetValues;\n chain: Chain;\n}) {\n const { t } = useTranslation();\n const features = useMemo(() => getChainPresetFeatures(chain), [chain]);\n\n const antiMevKey =\n values.antiMev && values.antiMev !== \"off\" ? values.antiMev : \"off\";\n\n return (\n <div className=\"w-full flex flex-col gap-2 text-xs text-neutral\">\n <div className=\"w-full flex items-center justify-between gap-4 h-6\">\n <span className=\"flex gap-1 items-center\">\n <SlippageIcon width={18} height={18} />\n <span className=\"font-medium\">{t(\"trade.preset.slippage\")}</span>\n </span>\n <span className=\"text-foreground\">\n {formatPercent((values.slippage ?? 0) / 100)}\n </span>\n </div>\n <div className=\"w-full flex items-center justify-between gap-4 h-6\">\n <span className=\"flex gap-1 items-center\">\n <ZapFastIcon width={18} height={18} />\n <span className=\"font-medium\">\n {t(`trade.preset.${features.feeType}`)}\n </span>\n </span>\n <span className=\"text-foreground\">\n {formatPrice(values.priorityFee ?? 0)} {features.feeUnit}\n </span>\n </div>\n {features.showTipFee && (\n <div className=\"w-full flex items-center justify-between gap-4 h-6\">\n <span className=\"flex gap-1 items-center\">\n <CoinsIcon width={18} height={18} />\n <span className=\"font-medium\">{t(\"trade.preset.tipFee\")}</span>\n </span>\n <span className=\"text-foreground\">\n {formatPrice(values.tipFee ?? 0)} {features.tipFeeUnit}\n </span>\n </div>\n )}\n <div className=\"w-full flex items-center justify-between gap-4 h-6\">\n <span className=\"flex gap-1 items-center\">\n {antiMevKey === \"off\" && <ShieldOffIcon width={18} height={18} />}\n {antiMevKey === \"reduced\" && <ShieldIcon width={18} height={18} />}\n {antiMevKey === \"secure\" && <ShieldPlusIcon width={18} height={18} />}\n <span className=\"font-medium\">{t(\"trade.preset.antiMev\")}</span>\n </span>\n <span className=\"text-foreground\">\n {t(`trade.preset.antiMev.${antiMevKey}`)}\n </span>\n </div>\n </div>\n );\n}\n","import { useAmountPresetInputScript } from \"./amount-preset-input.script\";\nimport { AmountPresetInputUI } from \"./amount-preset-input.ui\";\nimport type { AmountPresetInputWidgetProps } from \"./types\";\n\n/**\n * Amount + preset input widget — atom-backed orchestration layer.\n *\n * Wires {@link useAmountPresetInputScript} to {@link AmountPresetInputUI}.\n * State is persisted via `atomWithStorage` (keyed by `id + chain + token.address`).\n *\n * For a pure presentational input without persistence, use {@link AmountPresetInputUI}.\n * For custom UI with the same state logic, use the hook directly.\n */\nexport function AmountPresetInputWidget({\n size,\n radius,\n className,\n ...scriptParams\n}: AmountPresetInputWidgetProps) {\n const {\n token,\n chain,\n amount,\n handleAmountChange,\n preset,\n handlePresetChange,\n onPresetClick,\n presetValues,\n } = useAmountPresetInputScript(scriptParams);\n\n return (\n <AmountPresetInputUI\n token={token}\n chain={chain}\n amount={amount}\n onAmountChange={handleAmountChange}\n preset={preset}\n onPresetChange={handlePresetChange}\n onPresetClick={onPresetClick}\n presetValues={presetValues}\n size={size}\n radius={radius}\n className={className}\n />\n );\n}\n","import { useCallback, useState } from \"react\";\nimport { useAtom } from \"jotai\";\nimport { presetAtomFamily, presetKey } from \"../../states/preset\";\nimport type { TradePresetValues } from \"../../types\";\nimport type {\n UsePresetFormScriptParams,\n UsePresetFormScriptResult,\n} from \"./types\";\n\n/**\n * Script hook for the preset form.\n *\n * Manages buy/sell direction state and subscribes to the atom-backed preset\n * values identified by `chain`, `presetIndex`, and `storageKeyPrefix`.\n *\n * Use the companion {@link PresetFormWidget} for the default UI,\n * or call this hook directly to build a custom preset form.\n */\nexport function usePresetFormScript(\n params: UsePresetFormScriptParams,\n): UsePresetFormScriptResult {\n const {\n chain,\n presetIndex = 0,\n defaultDirection = \"buy\",\n storageKeyPrefix,\n onChange,\n } = params;\n\n const [direction, setDirection] = useState<\"buy\" | \"sell\">(defaultDirection);\n\n const [value, setValue] = useAtom(\n presetAtomFamily(\n presetKey(chain, direction, presetIndex, storageKeyPrefix),\n ),\n );\n\n const handleChange = useCallback(\n (next: TradePresetValues) => {\n setValue(next);\n onChange?.(direction, next);\n },\n [setValue, onChange, direction],\n );\n\n return {\n direction,\n setDirection,\n value,\n handleChange,\n };\n}\n","import type { Key } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, StyledSolidTabs, Tab } from \"@liberfi.io/ui\";\nimport { usePresetFormScript } from \"./preset-form.script\";\nimport { PresetFormUI } from \"./preset-form.ui\";\nimport type { PresetFormWidgetProps } from \"./types\";\n\n/**\n * Preset form widget — atom-backed orchestration layer with Buy/Sell tabs.\n *\n * State is persisted via `atomWithStorage` (keyed by prefix + chain + direction + preset index).\n * Pass `storageKeyPrefix` to customize the storage key prefix.\n *\n * For a pure presentational form without persistence, use {@link PresetFormUI}.\n */\nexport function PresetFormWidget({\n disableAnimation,\n className,\n ...scriptParams\n}: PresetFormWidgetProps) {\n const { t } = useTranslation();\n const { direction, setDirection, value, handleChange } =\n usePresetFormScript(scriptParams);\n\n return (\n <div className={cn(\"space-y-3\", className)}>\n <StyledSolidTabs\n radius=\"lg\"\n color=\"default\"\n fullWidth\n selectedKey={direction}\n onSelectionChange={(key: Key) => setDirection(key as \"buy\" | \"sell\")}\n aria-label=\"Buy / Sell\"\n >\n <Tab key=\"buy\" title={t(\"common.buy\")} />\n <Tab key=\"sell\" title={t(\"common.sell\")} />\n </StyledSolidTabs>\n <PresetFormUI\n value={value}\n onChange={handleChange}\n chain={scriptParams.chain}\n disableAnimation={disableAnimation}\n />\n </div>\n );\n}\n","import { useCallback, useState } from \"react\";\nimport type { PresetDirection } from \"../../states/preset\";\nimport type { TradePresetValues } from \"../../types\";\nimport type {\n UseMultiPresetFormScriptParams,\n UseMultiPresetFormScriptResult,\n} from \"./types\";\n\nconst PRESET_COUNT = 3;\n\n/**\n * Script hook for the multi-preset form.\n *\n * Manages preset index selection and forwards value changes\n * tagged with the current index to the caller.\n *\n * Use the companion {@link MultiPresetFormWidget} for the default UI,\n * or call this hook directly to build a custom multi-preset form.\n */\nexport function useMultiPresetFormScript(\n params: UseMultiPresetFormScriptParams,\n): UseMultiPresetFormScriptResult {\n const { defaultPresetIndex = 0, onChange } = params;\n\n const [presetIndex, setPresetIndex] = useState(defaultPresetIndex);\n\n const handlePresetChange = useCallback(\n (direction: PresetDirection, value: TradePresetValues) => {\n onChange?.(presetIndex, direction, value);\n },\n [onChange, presetIndex],\n );\n\n return {\n presetCount: PRESET_COUNT,\n presetIndex,\n setPresetIndex,\n handlePresetChange,\n };\n}\n","import type { Key } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, StyledSolidTabs, Tab } from \"@liberfi.io/ui\";\nimport { useMultiPresetFormScript } from \"./multi-preset-form.script\";\nimport { PresetFormWidget } from \"./preset-form.widget\";\nimport type { MultiPresetFormWidgetProps } from \"./types\";\n\n/**\n * Multi preset form widget.\n *\n * Combines preset index tabs,\n * and a persisted {@link PresetFormWidget} into a single self-contained editor.\n */\nexport function MultiPresetFormWidget({\n defaultDirection,\n disableAnimation,\n className,\n ...scriptParams\n}: MultiPresetFormWidgetProps) {\n const { t } = useTranslation();\n const { presetCount, presetIndex, setPresetIndex, handlePresetChange } =\n useMultiPresetFormScript(scriptParams);\n\n return (\n <div className={cn(\"space-y-3\", className)}>\n <StyledSolidTabs\n radius=\"lg\"\n fullWidth\n color=\"default\"\n selectedKey={String(presetIndex)}\n onSelectionChange={(key: Key) => setPresetIndex(Number(key))}\n disableAnimation={disableAnimation}\n aria-label={t(\"trade.preset.presets\")}\n >\n {Array.from({ length: presetCount }, (_, i) => (\n <Tab key={String(i)} title={t(\"trade.preset.label\", { n: i + 1 })} />\n ))}\n </StyledSolidTabs>\n <PresetFormWidget\n chain={scriptParams.chain}\n presetIndex={presetIndex}\n defaultDirection={defaultDirection}\n storageKeyPrefix={scriptParams.storageKeyPrefix}\n onChange={handlePresetChange}\n disableAnimation={disableAnimation}\n />\n </div>\n );\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Chain } from \"@liberfi.io/types\";\nimport {\n ModalBody,\n ModalContent,\n ModalHeader,\n ScrollShadow,\n StyledModal,\n} from \"@liberfi.io/ui\";\nimport { ChainSelectMobileUI } from \"@liberfi.io/ui-chain-select\";\nimport {\n AsyncModal,\n type RenderAsyncModalProps,\n} from \"@liberfi.io/ui-scaffold\";\nimport type { PresetDirection } from \"../../states/preset\";\nimport type { TradePresetValues } from \"../../types\";\nimport { MultiPresetFormWidget } from \"./multi-preset-form.widget\";\nimport type { PresetFormModalParams } from \"./types\";\n\nconst DEFAULT_MODAL_ID = \"preset\";\n\n/**\n * Async-modal wrapper for multi-chain preset editing.\n *\n * Place this component once in the tree (e.g. layout). Open it from anywhere\n * via `useAsyncModal(\"preset\").onOpen({ params: { chains, defaultChain, storageKeyPrefix, onChange } })`.\n *\n * Header: title + chain switcher.\n * Body: multi-preset form.\n */\nexport function PresetFormModal({ id = DEFAULT_MODAL_ID }: { id?: string }) {\n return (\n <AsyncModal<PresetFormModalParams> id={id}>\n {(modalProps) => <PresetFormModalContent {...modalProps} />}\n </AsyncModal>\n );\n}\n\nfunction PresetFormModalContent({\n params = { chains: [Chain.SOLANA, Chain.ETHEREUM, Chain.BINANCE] },\n isOpen,\n onOpenChange,\n}: RenderAsyncModalProps<PresetFormModalParams>) {\n const { t } = useTranslation();\n\n const {\n chains,\n defaultChain,\n defaultDirection,\n defaultPresetIndex,\n storageKeyPrefix,\n onChange,\n } = params;\n\n const [chain, setChain] = useState<Chain>(defaultChain ?? chains[0]);\n\n useEffect(() => {\n setChain(defaultChain ?? chains[0]);\n }, [defaultChain, chains]);\n\n const handlePresetChange = useCallback(\n (\n presetIndex: number,\n direction: PresetDirection,\n value: TradePresetValues,\n ) => {\n onChange?.(chain, presetIndex, direction, value);\n },\n [onChange, chain],\n );\n\n return (\n <StyledModal isOpen={isOpen} onOpenChange={onOpenChange} size=\"md\">\n <ModalContent>\n <ModalHeader>\n <div className=\"flex w-full items-center justify-between gap-4\">\n <span className=\"flex-auto min-w-0 overflow-hidden text-ellipsis line-clamp-1 whitespace-nowrap\">\n {t(\"trade.preset.instantTradeSettings\")}\n </span>\n <ChainSelectMobileUI\n candidates={chains}\n chain={chain}\n onSelectChain={setChain}\n />\n </div>\n </ModalHeader>\n <ModalBody>\n <ScrollShadow>\n <MultiPresetFormWidget\n chain={chain}\n defaultDirection={defaultDirection}\n defaultPresetIndex={defaultPresetIndex}\n storageKeyPrefix={storageKeyPrefix}\n onChange={handlePresetChange}\n />\n </ScrollShadow>\n </ModalBody>\n </ModalContent>\n </StyledModal>\n );\n}\n","import BigNumber from \"bignumber.js\";\nimport type { Chain } from \"@liberfi.io/types\";\nimport type { PredefinedToken } from \"@liberfi.io/utils\";\nimport type { SwapInput, TradePresetValues } from \"../../types\";\nimport { getDefaultPresetForChain } from \"./chain-features\";\n\n/**\n * Builds the swap input parameters from user-facing values.\n *\n * Converts amount and fees from human-readable token units to the\n * smallest on-chain unit (e.g. lamports, wei) and applies chain-specific\n * defaults for any unset preset fields.\n *\n * Pure function — no React, no hooks, independently testable.\n */\nexport function buildSwapParams(\n amount: number,\n token: PredefinedToken,\n output: string,\n presetValues: TradePresetValues,\n chain: Chain,\n): Omit<SwapInput, \"wallet\" | \"chain\"> {\n const chainDefault = getDefaultPresetForChain(chain);\n\n const amountStr = new BigNumber(amount)\n .shiftedBy(token.decimals)\n .decimalPlaces(0)\n .toString();\n\n const priorityFee = new BigNumber(\n presetValues.priorityFee ?? chainDefault.priorityFee ?? 0,\n )\n .shiftedBy(token.decimals)\n .decimalPlaces(0)\n .toString();\n\n const tipFee = new BigNumber(presetValues.tipFee ?? chainDefault.tipFee ?? 0)\n .shiftedBy(token.decimals)\n .decimalPlaces(0)\n .toString();\n\n return {\n input: token.address,\n output,\n amount: amountStr,\n slippage: presetValues.slippage ?? chainDefault.slippage ?? 1,\n priorityFee,\n tipFee,\n isAntiMev: presetValues.antiMev !== \"off\",\n };\n}\n","import { useMemo } from \"react\";\nimport { useAtomValue } from \"jotai\";\nimport {\n useConnectedWallet,\n useAuthCallback,\n} from \"@liberfi.io/wallet-connector\";\nimport { useSwap } from \"../../hooks/useSwap\";\nimport {\n instantTradeAmountAtomFamily,\n instantTradeAmountKey,\n} from \"../../states/instant-trade-amount\";\nimport { presetAtomFamily, presetKey } from \"../../states/preset\";\nimport { buildSwapParams } from \"./instant-trade-utils\";\nimport type {\n UseInstantTradeButtonParams,\n UseInstantTradeButtonResult,\n} from \"./types\";\n\n/**\n * Script hook for the instant-trade button.\n *\n * Subscribes to the amount / preset atoms identified by `id`, resolves\n * preset values, and returns an auth-guarded swap handler plus all\n * derived state needed to render a trade button.\n *\n * Use the companion {@link InstantTradeButton} widget for the default UI,\n * or call this hook directly to render a fully custom button.\n */\nexport function useInstantTradeButtonScript(\n params: UseInstantTradeButtonParams,\n): UseInstantTradeButtonResult {\n const {\n id,\n chain,\n token,\n output,\n storageKeyPrefix,\n onSwapSubmitted,\n onSwapError,\n } = params;\n\n const { amount, preset } = useAtomValue(\n instantTradeAmountAtomFamily(\n instantTradeAmountKey(id, chain, token.address, storageKeyPrefix),\n ),\n );\n\n const presetValues = useAtomValue(\n presetAtomFamily(presetKey(chain, \"buy\", preset, storageKeyPrefix)),\n );\n\n const wallet = useConnectedWallet(chain);\n\n const { swap, isSwapping } = useSwap({\n onSubmitted: onSwapSubmitted,\n onError: onSwapError,\n });\n\n const isDisabled = !amount || !output;\n\n const handleSwap = useAuthCallback(async () => {\n if (!amount || !wallet || !output) return;\n\n const params = buildSwapParams(amount, token, output, presetValues, chain);\n\n try {\n await swap({ ...params, chain, wallet });\n } catch {\n /* errors reported via onSwapError callback */\n }\n }, [wallet, amount, output, chain, token, presetValues, swap]);\n\n return useMemo(\n () => ({\n amount,\n token,\n isDisabled,\n isSwapping,\n handleSwap,\n }),\n [amount, token, isDisabled, isSwapping, handleSwap],\n );\n}\n","import { LightningIcon, Button } from \"@liberfi.io/ui\";\nimport { useInstantTradeButtonScript } from \"./instant-trade-button.script\";\nimport type { InstantTradeButtonWidgetProps } from \"./types\";\n\n/**\n * Default instant-trade button widget.\n *\n * Wires {@link useInstantTradeButton} to a {@link Button} with a\n * lightning icon and `\"amount symbol\"` label. For a fully custom button,\n * use the hook directly.\n */\nexport function InstantTradeButtonWidget({\n size = \"sm\",\n radius,\n color = \"primary\",\n className,\n ...scriptParams\n}: InstantTradeButtonWidgetProps) {\n const { amount, token, isDisabled, isSwapping, handleSwap } =\n useInstantTradeButtonScript(scriptParams);\n\n return (\n <Button\n fullWidth\n size={size}\n radius={radius}\n color={color}\n className={className}\n disableRipple\n startContent={<LightningIcon />}\n isDisabled={isDisabled}\n isLoading={isSwapping}\n onPress={handleSwap}\n >\n {amount != null ? `${amount} ${token.symbol}` : token.symbol}\n </Button>\n );\n}\n","\"use client\";\n\nimport { createContext, useCallback, useContext, useRef } from \"react\";\nimport {\n useConnectedWallet,\n useAuthCallback,\n} from \"@liberfi.io/wallet-connector\";\nimport { useSwap } from \"../../hooks/useSwap\";\nimport type { SwapInput, SwapResult } from \"../../types\";\nimport type {\n InstantTradeSwapFn,\n InstantTradeSwapProviderProps,\n} from \"./types\";\n\nconst InstantTradeSwapContext = createContext<InstantTradeSwapFn | null>(null);\n\n/**\n * Provides a single auth-guarded swap function to all descendant\n * {@link InstantTradeListButtonWidget} components.\n *\n * Calls `useSwap`, `useConnectedWallet`, and `useAuthCallback` **once**\n * so that N list buttons share one set of context subscriptions instead\n * of each creating their own.\n *\n * The context value is a **stable function reference** (backed by refs)\n * that will not cause consumer re-renders.\n */\nexport function InstantTradeSwapProvider({\n chain,\n onSwapSubmitted,\n onSwapError,\n children,\n}: InstantTradeSwapProviderProps) {\n const wallet = useConnectedWallet(chain);\n const { swap } = useSwap({\n onSubmitted: onSwapSubmitted,\n onError: onSwapError,\n });\n\n const walletRef = useRef(wallet);\n walletRef.current = wallet;\n const swapRef = useRef(swap);\n swapRef.current = swap;\n const chainRef = useRef(chain);\n chainRef.current = chain;\n\n const stableSwap = useCallback(\n async (\n input: Omit<SwapInput, \"wallet\" | \"chain\">,\n ): Promise<SwapResult | undefined> => {\n const w = walletRef.current;\n if (!w) return undefined;\n return swapRef.current({ ...input, wallet: w, chain: chainRef.current });\n },\n [],\n );\n\n const authSwap = useAuthCallback(stableSwap, []);\n\n return (\n <InstantTradeSwapContext.Provider value={authSwap}>\n {children}\n </InstantTradeSwapContext.Provider>\n );\n}\n\n/**\n * Returns the auth-guarded swap function from the nearest\n * {@link InstantTradeSwapProvider}.\n *\n * @throws If called outside an `InstantTradeSwapProvider`.\n */\nexport function useInstantTradeSwap(): InstantTradeSwapFn {\n const ctx = useContext(InstantTradeSwapContext);\n if (ctx === null) {\n throw new Error(\n \"useInstantTradeSwap must be used within an InstantTradeSwapProvider\",\n );\n }\n return ctx;\n}\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { useAtomValue } from \"jotai\";\nimport {\n instantTradeAmountAtomFamily,\n instantTradeAmountKey,\n} from \"../../states/instant-trade-amount\";\nimport { presetAtomFamily, presetKey } from \"../../states/preset\";\nimport { useInstantTradeSwap } from \"./instant-trade-swap.context\";\nimport { buildSwapParams } from \"./instant-trade-utils\";\nimport type {\n UseInstantTradeListButtonParams,\n UseInstantTradeListButtonResult,\n} from \"./types\";\n\n/**\n * Lightweight script hook for the instant-trade button in list scenarios.\n *\n * Unlike {@link useInstantTradeButtonScript}, this hook does **not** call\n * `useSwap`, `useConnectedWallet`, or `useAuthCallback`. Instead it reads\n * the swap function from {@link InstantTradeSwapProvider} via context,\n * eliminating per-button context subscriptions that cause unnecessary\n * re-renders in large lists.\n *\n * Must be used inside an {@link InstantTradeSwapProvider}.\n */\nexport function useInstantTradeListButtonScript(\n params: UseInstantTradeListButtonParams,\n): UseInstantTradeListButtonResult {\n const { id, chain, token, output, storageKeyPrefix } = params;\n\n const { amount, preset } = useAtomValue(\n instantTradeAmountAtomFamily(\n instantTradeAmountKey(id, chain, token.address, storageKeyPrefix),\n ),\n );\n\n const presetValues = useAtomValue(\n presetAtomFamily(presetKey(chain, \"buy\", preset, storageKeyPrefix)),\n );\n\n const swap = useInstantTradeSwap();\n\n const [isSwapping, setIsSwapping] = useState(false);\n\n const isDisabled = !amount || !output;\n\n // Store frequently-changing or object-typed values in refs so that\n // handleSwap's dependency list stays minimal (only amount, output, swap).\n const tokenRef = useRef(token);\n tokenRef.current = token;\n const presetValuesRef = useRef(presetValues);\n presetValuesRef.current = presetValues;\n const chainRef = useRef(chain);\n chainRef.current = chain;\n\n const handleSwap = useCallback(async () => {\n if (!amount || !output) return;\n\n const params = buildSwapParams(\n amount,\n tokenRef.current,\n output,\n presetValuesRef.current,\n chainRef.current,\n );\n\n setIsSwapping(true);\n try {\n await swap(params);\n } catch {\n /* errors reported via Provider's onSwapError callback */\n } finally {\n setIsSwapping(false);\n }\n }, [amount, output, swap]);\n\n return useMemo(\n () => ({\n amount,\n token,\n isDisabled,\n isSwapping,\n handleSwap,\n }),\n [amount, token, isDisabled, isSwapping, handleSwap],\n );\n}\n","import { memo } from \"react\";\nimport { LightningIcon, Button } from \"@liberfi.io/ui\";\nimport { useInstantTradeListButtonScript } from \"./instant-trade-list-button.script\";\nimport type { InstantTradeListButtonWidgetProps } from \"./types\";\n\n/**\n * Memoized instant-trade button optimised for list rendering.\n *\n * Visually identical to {@link InstantTradeButtonWidget}, but internally\n * reads the swap function from {@link InstantTradeSwapProvider} instead\n * of calling `useSwap` / `useConnectedWallet` / `useAuthCallback` per\n * instance. This eliminates N redundant context subscriptions in a list\n * of N tokens.\n *\n * Must be used inside an {@link InstantTradeSwapProvider}.\n */\nexport const InstantTradeListButtonWidget = memo(\n function InstantTradeListButtonWidget({\n size = \"sm\",\n radius,\n color = \"primary\",\n className,\n ...scriptParams\n }: InstantTradeListButtonWidgetProps) {\n const { amount, token, isDisabled, isSwapping, handleSwap } =\n useInstantTradeListButtonScript(scriptParams);\n\n return (\n <Button\n variant=\"solid\"\n fullWidth\n size={size}\n radius={radius}\n color={color}\n className={className}\n disableRipple\n startContent={<LightningIcon className=\"flex-none\" />}\n isDisabled={isDisabled}\n isLoading={isSwapping}\n onPress={handleSwap}\n >\n {amount != null ? `${amount} ${token.symbol}` : token.symbol}\n </Button>\n );\n },\n);\n","declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/ui-trade\"] = \"0.1.21\";\n}\n\nexport default \"0.1.21\";\n"]}
1
+ {"version":3,"sources":["../src/states/instant-trade-amount.ts","../src/hooks/useInstantTradeAmount.ts","../src/types.ts","../src/components/instant-trade/chain-features.ts","../src/states/preset.ts","../src/hooks/usePresetValues.ts","../src/hooks/useSwap.ts","../src/hooks/useSwapRoutePolling.ts","../src/hooks/useTxConfirmation.ts","../src/components/swap/swap.script.ts","../src/components/swap/swap-preview-modal.tsx","../src/components/swap/swap.ui.tsx","../src/components/swap/swap.widget.tsx","../src/components/instant-trade/instant-trade.context.tsx","../src/components/instant-trade/instant-trade.script.ts","../src/components/instant-trade/preset-form.ui.tsx","../src/components/instant-trade/instant-trade.ui.tsx","../src/components/instant-trade/instant-trade.widget.tsx","../src/components/instant-trade/amount-preset-input.script.ts","../src/components/instant-trade/amount-preset-input.ui.tsx","../src/components/instant-trade/amount-preset-input.widget.tsx","../src/components/instant-trade/preset-form.script.ts","../src/components/instant-trade/preset-form.widget.tsx","../src/components/instant-trade/multi-preset-form.script.ts","../src/components/instant-trade/multi-preset-form.widget.tsx","../src/components/instant-trade/preset-form.modal.tsx","../src/components/instant-trade/instant-trade-utils.ts","../src/components/instant-trade/instant-trade-button.script.ts","../src/components/instant-trade/instant-trade-button.widget.tsx","../src/components/instant-trade/instant-trade-swap.context.tsx","../src/components/instant-trade/instant-trade-list-button.script.ts","../src/components/instant-trade/instant-trade-list-button.widget.tsx","../src/version.ts"],"names":["DEFAULT_PREFIX","DEFAULT_STATE","storageKey","prefix","id","chain","tokenAddress","parseKey","key","sep","rest","instantTradeAmountKey","instantTradeAmountAtomFamily","atomFamily","atomWithStorage","useInstantTradeAmount","storageKeyPrefix","useAtomValue","DEFAULT_SOL_TRADE_PRESET","DEFAULT_EVM_TRADE_PRESET","DEFAULT_BSC_TRADE_PRESET","DEFAULT_BUY_AMOUNTS_MAP","DEFAULT_BUY_AMOUNTS_FALLBACK","getDefaultBuyAmounts","symbol","DEFAULT_SELL_PERCENTAGES","getChainPresetFeatures","nativeToken","getNativeToken","nativeSymbol","isSolanaChain","isBinanceChain","getDefaultPresetForChain","direction","index","presetKey","presetAtomFamily","usePresetValues","presetIndex","base64ToUint8Array","base64","binary","bytes","i","uint8ArrayToBase64","useSwap","options","client","useDexClient","isSwapping","setIsSwapping","useState","optionsRef","useRef","swap","useCallback","input","wallet","route","API","e","err","signedBytes","unsignedBytes","sendResult","signedBase64","result","useMemo","DEFAULT_INTERVAL","useSwapRoutePolling","params","interval","paused","enabled","query","useSwapRouteQuery","useEffect","DEFAULT_TIMEOUT","useTxConfirmation","transactions","setTransactions","updateTx","txHash","status","prev","existing","next","track","timeout","success","clear","clearAll","SOLANA_CHAINS","Chain","chainNamespace","ChainNamespace","TOKEN_POLL_MS","BALANCE_POLL_MS","formatOutputAmount","plans","decimals","raw","padded","intPart","trimmed","useSwapScript","wallets","useWallets","ns","w","walletAddress","fromTokenAddress","setFromTokenAddress","toTokenAddress","setToTokenAddress","fromRef","toRef","tokenAddresses","tokensQuery","useTokensQuery","fromToken","t","toToken","balancesQuery","useWalletPortfoliosByTokensQuery","fromBalance","p","toBalance","amount","setAmount","amountInDecimals","parts","amountInUsd","price","value","setHalfAmount","bal","half","setMaxAmount","routeParams","isSwappingRef","isRouting","routeError","outputAmount","outputAmountInUsd","rawSwap","onCompleteRef","latestTxStatus","entries","isLoading","SwapPreviewModal","isOpen","onOpenChange","inputAmount","inputAmountInUsd","onConfirm","useTranslation","expanded","setExpanded","toggleExpanded","plan","jsx","Modal","jsxs","ModalContent","ModalHeader","ModalBody","Avatar","WalletBalanceIcon","formatNumber","formatUsd","truncateAddress","formatSmallAmount","TradeIcon","Button","ChevronUpIcon","ChevronDownIcon","ModalFooter","n","addr","SwapUI","onAmountChange","onHalfAmount","onMaxAmount","onFromTokenSelect","onToTokenSelect","onPreview","className","cn","Input","SwapWidget","from","to","onComplete","script","onOpen","onClose","useDisclosure","handleConfirm","Fragment","buildDefaultSettings","preset","DEFAULT_INSTANT_TRADE_SETTINGS","readStoredSettings","fallback","writeStoredSettings","settings","InstantTradeContext","createContext","useInstantTrade","ctx","useContext","InstantTradeProvider","controlledSettings","onSettingsChange","children","isControlled","chainDefaults","localSettings","setLocalSettings","setSettings","updateBuySettings","buy","updateSellSettings","sell","setDirection","buyPreset","setBuyPreset","sellPreset","setSellPreset","defaultPreset","currentPresetValues","idx","useInstantTradeScript","onSwapSubmitted","onSwapError","wrappedToken","getWrappedToken","chainToNamespace","addrs","tokenInfo","nativeAddr","nativeBalance","tokenBalance","showSettings","setShowSettings","lastClickedPreset","handlePresetClick","last","onSubmittedRef","onErrorRef","phase","nativeDecimals","inputAddress","isBuy","BigNumber","chainDefault","slippage","isAntiMev","solanaFields","submitText","dir","insufficientSuffix","nativePrice","tk","usd","formatAmountUSD","isDisabled","PresetFormUI","onChange","disableAnimation","update","patch","features","feeKey","SlippageRow","v","FeeRow","TipFeeRow","AutoFeeRow","MaxAutoFeeRow","AntiMEVRow","CustomRPCRow","label","StyledNumberInput","feeType","tooltip","StyledTooltip","InfoIcon","StyledSwitch","icons","ShieldOffIcon","ShieldIcon","ShieldPlusIcon","tooltips","StyledBorderedTabs","opt","Icon","tip","Tab","StyledInput","InstantTradeUI","onDirectionChange","customAmounts","customPercentages","onQuickAmountClick","onQuickPercentageClick","onCustomAmountsEdit","onCustomPercentagesEdit","tokenSymbol","amountConversion","onPresetChange","presetValues","onPresetSettingsChange","onPresetClick","onSubmit","headerExtra","Tabs","BuyAmountSection","SellAmountSection","PresetOverview","amountLabel","handleChange","NumberInput","QuickButtons","values","onSelect","onEdit","suffix","isEditing","setIsEditing","tempValues","setTempValues","handleStartEdit","handleSave","_","val","CheckIcon","EditIcon","antiMevKey","Tooltip","SlippageIcon","formatPercent","ZapFastIcon","formatPrice","CoinsIcon","InstantTradeWidget","InstantTradeWidgetInner","handleQuickAmountClick","handleQuickPercentageClick","pct","handleCustomAmountsEdit","amounts","handleCustomPercentagesEdit","pcts","handlePresetSettingsChange","presets","handlePresetChange","currentPreset","useAmountPresetInputScript","token","state","setState","useAtom","p0","p1","p2","handleAmountChange","AmountPresetInputUI","radius","size","handleSelectionChange","LightningIcon","TokenIcon","StyledLightTabs","PresetTooltip","AmountPresetInputWidget","scriptParams","usePresetFormScript","defaultDirection","setValue","PresetFormWidget","StyledSolidTabs","PRESET_COUNT","useMultiPresetFormScript","defaultPresetIndex","setPresetIndex","MultiPresetFormWidget","presetCount","DEFAULT_MODAL_ID","PresetFormModal","AsyncModal","modalProps","PresetFormModalContent","chains","defaultChain","setChain","StyledModal","ChainSelectMobileUI","ScrollShadow","buildSwapParams","output","amountStr","priorityFee","tipFee","useInstantTradeButtonScript","useConnectedWallet","handleSwap","useAuthCallback","InstantTradeButtonWidget","color","InstantTradeSwapContext","InstantTradeSwapProvider","walletRef","swapRef","chainRef","stableSwap","authSwap","useInstantTradeSwap","useInstantTradeListButtonScript","tokenRef","presetValuesRef","InstantTradeListButtonWidget","memo","version_default"],"mappings":"2nBAWA,IAAMA,EAAAA,CAAiB,WAEjBC,EAAAA,CAAmC,CAAE,MAAA,CAAQ,MAAA,CAAW,MAAA,CAAQ,CAAE,CAAA,CAExE,SAASC,GACPC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACQ,CACR,OAAO,CAAA,EAAGH,CAAM,CAAA,cAAA,EAAiBC,CAAE,CAAA,CAAA,EAAIC,CAAK,CAAA,CAAA,EAAIC,CAAY,CAAA,CAC9D,CAEA,SAASC,EAAAA,CAASC,EAKhB,CACA,IAAMC,CAAAA,CAAMD,CAAAA,CAAI,YAAY,GAAG,CAAA,CACzBL,CAAAA,CAASK,CAAAA,CAAI,MAAM,CAAA,CAAGC,CAAAA,CAAM,CAAC,CAAA,CAC7BC,CAAAA,CAAOF,CAAAA,CAAI,KAAA,CAAMC,CAAAA,CAAM,CAAC,CAAA,CACxB,CAACL,CAAAA,CAAIC,CAAAA,CAAOC,CAAY,CAAA,CAAII,CAAAA,CAAK,KAAA,CAAM,GAAG,EAChD,OAAO,CACL,MAAA,CAAAP,CAAAA,CACA,EAAA,CAAAC,CAAAA,CACA,KAAA,CAAOC,CAAAA,CACP,aAAAC,CACF,CACF,CAUO,SAASK,CAAAA,CACdP,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAH,EAAiBH,EAAAA,CACT,CACR,OAAO,CAAA,EAAGG,CAAM,CAAA,CAAA,EAAIC,CAAE,CAAA,CAAA,EAAIC,CAAK,CAAA,CAAA,EAAIC,CAAY,CAAA,CACjD,KASaM,CAAAA,CAA+BC,sBAAAA,CAAYL,CAAAA,EAAgB,CACtE,GAAM,CAAE,MAAA,CAAAL,CAAAA,CAAQ,EAAA,CAAAC,CAAAA,CAAI,KAAA,CAAAC,CAAAA,CAAO,YAAA,CAAAC,CAAa,CAAA,CAAIC,EAAAA,CAASC,CAAG,CAAA,CACxD,OAAOM,qBAAAA,CACLZ,EAAAA,CAAWC,CAAAA,CAAQC,CAAAA,CAAI,OAAOC,CAAK,CAAA,CAAGC,CAAY,CAAA,CAClDL,EAAAA,CACA,MAAA,CACA,CAAE,SAAA,CAAW,IAAK,CACpB,CACF,CAAC,ECjDM,SAASc,EAAAA,CAAsB,CACpC,EAAA,CAAAX,CAAAA,CACA,MAAAC,CAAAA,CACA,YAAA,CAAAC,CAAAA,CACA,gBAAA,CAAAU,CACF,CAAA,CAAmD,CACjD,OAAOC,mBACLL,CAAAA,CACED,CAAAA,CAAsBP,CAAAA,CAAIC,CAAAA,CAAOC,CAAAA,CAAcU,CAAgB,CACjE,CACF,CACF,CCiEO,IAAME,EAAAA,CAA8C,CACzD,QAAA,CAAU,EAAA,CACV,WAAA,CAAa,KACb,OAAA,CAAS,KAAA,CACT,UAAA,CAAY,EAAA,CACZ,OAAQ,IAAA,CACR,MAAA,CAAQ,IAAA,CACR,OAAA,CAAS,UACT,SAAA,CAAW,IACb,CAAA,CAGaC,EAAAA,CAA8C,CACzD,QAAA,CAAU,EAAA,CACV,WAAA,CAAa,KACb,OAAA,CAAS,KAAA,CACT,UAAA,CAAY,IAAA,CACZ,OAAQ,CAAA,CACR,MAAA,CAAQ,IAAA,CACR,OAAA,CAAS,MACT,SAAA,CAAW,IACb,CAAA,CAGaC,EAAAA,CAA8C,CACzD,QAAA,CAAU,EAAA,CACV,WAAA,CAAa,KACb,OAAA,CAAS,KAAA,CACT,UAAA,CAAY,IAAA,CACZ,OAAQ,CAAA,CACR,MAAA,CAAQ,CAAA,CACR,OAAA,CAAS,MACT,SAAA,CAAW,IACb,CAAA,CAGMC,EAAAA,CAAoD,CACxD,GAAA,CAAK,CAAC,GAAA,CAAM,GAAK,CAAA,CAAG,EAAE,CAAA,CACtB,GAAA,CAAK,CAAC,GAAA,CAAM,GAAA,CAAM,EAAA,CAAK,CAAC,EACxB,GAAA,CAAK,CAAC,IAAA,CAAO,GAAA,CAAM,EAAA,CAAK,GAAI,CAAA,CAC5B,IAAA,CAAM,CAAC,EAAA,CAAI,EAAA,CAAI,GAAA,CAAK,GAAG,EACvB,IAAA,CAAM,CAAC,EAAA,CAAI,EAAA,CAAI,IAAK,GAAG,CACzB,CAAA,CAEMC,EAAAA,CAAyC,CAAC,CAAA,CAAG,EAAA,CAAI,EAAA,CAAI,EAAE,EAGtD,SAASC,EAAAA,CAAqBC,CAAAA,CAA0B,CAC7D,OAAOH,EAAAA,CAAwBG,CAAM,CAAA,EAAKF,EAC5C,CAGO,IAAMG,EAAAA,CAAqC,CAAC,EAAA,CAAI,EAAA,CAAI,EAAA,CAAI,GAAG,ECrG3D,SAASC,EAAAA,CAAuBrB,CAAAA,CAAmC,CACxE,IAAMsB,CAAAA,CAAcC,sBAAAA,CAAevB,CAAK,EACxC,GAAI,CAACsB,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAsCtB,CAAK,GAAG,CAAA,CAEhE,IAAMwB,CAAAA,CAAeF,CAAAA,CAAY,OAEjC,OAAIG,qBAAAA,CAAczB,CAAK,CAAA,CACd,CACL,YAAA,CAAAwB,CAAAA,CACA,OAAA,CAAS,aAAA,CACT,OAAA,CAASA,CAAAA,CACT,WAAA,CAAa,CAAA,CACb,WAAY,IAAA,CACZ,UAAA,CAAYA,CAAAA,CACZ,cAAA,CAAgB,EAChB,WAAA,CAAa,IAAA,CACb,aAAA,CAAe,IAAA,CACf,eAAgB,CAAC,KAAA,CAAO,SAAA,CAAW,QAAQ,CAC7C,CAAA,CAGEE,sBAAAA,CAAe1B,CAAK,EACf,CACL,YAAA,CAAAwB,CAAAA,CACA,OAAA,CAAS,SACT,OAAA,CAAS,MAAA,CACT,WAAA,CAAa,CAAA,CACb,WAAY,IAAA,CACZ,UAAA,CAAYA,CAAAA,CACZ,cAAA,CAAgB,CAAA,CAChB,WAAA,CAAa,KAAA,CACb,aAAA,CAAe,MACf,cAAA,CAAgB,CAAC,KAAA,CAAO,QAAQ,CAClC,CAAA,CAGK,CACL,YAAA,CAAAA,EACA,OAAA,CAAS,QAAA,CACT,OAAA,CAAS,MAAA,CACT,WAAA,CAAa,CAAA,CACb,UAAA,CAAY,KAAA,CACZ,WAAYA,CAAAA,CACZ,cAAA,CAAgB,CAAA,CAChB,WAAA,CAAa,MACb,aAAA,CAAe,KAAA,CACf,cAAA,CAAgB,CAAC,MAAO,QAAQ,CAClC,CACF,CAGO,SAASG,CAAAA,CAAyB3B,CAAAA,CAAiC,CACxE,OAAIyB,qBAAAA,CAAczB,CAAK,CAAA,CAAUa,EAAAA,CAC7Ba,uBAAe1B,CAAK,CAAA,CAAUe,EAAAA,CAC3BD,EACT,CClGA,IAAMnB,EAAAA,CAAiB,UAAA,CAEvB,SAASE,EAAAA,CACPC,CAAAA,CACAE,CAAAA,CACA4B,CAAAA,CACAC,EACQ,CACR,OAAO,CAAA,EAAG/B,CAAM,UAAUE,CAAK,CAAA,CAAA,EAAI4B,CAAS,CAAA,CAAA,EAAIC,CAAK,CAAA,CACvD,CAEA,SAAS3B,EAAAA,CAASC,CAAAA,CAKhB,CACA,IAAMC,CAAAA,CAAMD,EAAI,WAAA,CAAY,GAAG,CAAA,CACzBL,CAAAA,CAASK,CAAAA,CAAI,KAAA,CAAM,CAAA,CAAGC,CAAAA,CAAM,CAAC,CAAA,CAC7BC,CAAAA,CAAOF,CAAAA,CAAI,KAAA,CAAMC,CAAAA,CAAM,CAAC,CAAA,CACxB,CAACJ,EAAO4B,CAAAA,CAAWC,CAAK,CAAA,CAAIxB,CAAAA,CAAK,MAAM,GAAG,CAAA,CAChD,OAAO,CACL,OAAAP,CAAAA,CACA,KAAA,CAAOE,CAAAA,CACP,SAAA,CAAW4B,CAAAA,CACX,KAAA,CAAO,MAAA,CAAOC,CAAK,CACrB,CACF,CAUO,SAASC,CAAAA,CACd9B,EACA4B,CAAAA,CACAC,CAAAA,CACA/B,CAAAA,CAAiBH,EAAAA,CACT,CACR,OAAO,CAAA,EAAGG,CAAM,CAAA,CAAA,EAAIE,CAAK,CAAA,CAAA,EAAI4B,CAAS,CAAA,CAAA,EAAIC,CAAK,CAAA,CACjD,CAQO,IAAME,CAAAA,CAAmBvB,uBAAYL,CAAAA,EAAgB,CAC1D,GAAM,CAAE,OAAAL,CAAAA,CAAQ,KAAA,CAAAE,CAAAA,CAAO,SAAA,CAAA4B,CAAAA,CAAW,KAAA,CAAAC,CAAM,CAAA,CAAI3B,GAASC,CAAG,CAAA,CACxD,OAAOM,qBAAAA,CACLZ,GAAWC,CAAAA,CAAQ,MAAA,CAAOE,CAAK,CAAA,CAAG4B,EAAWC,CAAK,CAAA,CAClDF,CAAAA,CAAyB3B,CAAK,CAAA,CAC9B,MAAA,CACA,CAAE,SAAA,CAAW,IAAK,CACpB,CACF,CAAC,EC5CM,SAASgC,EAAAA,CAAgB,CAC9B,KAAA,CAAAhC,CAAAA,CACA,UAAA4B,CAAAA,CACA,WAAA,CAAAK,CAAAA,CAAc,CAAA,CACd,gBAAA,CAAAtB,CACF,CAAA,CAA6C,CAC3C,OAAOC,kBAAAA,CACLmB,CAAAA,CACED,CAAAA,CAAU9B,CAAAA,CAAO4B,EAAWK,CAAAA,CAAatB,CAAgB,CAC3D,CACF,CACF,CChCA,SAASuB,EAAAA,CAAmBC,CAAAA,CAA4B,CACtD,IAAMC,CAAAA,CAAS,IAAA,CAAKD,CAAM,EACpBE,CAAAA,CAAQ,IAAI,UAAA,CAAWD,CAAAA,CAAO,MAAM,CAAA,CAC1C,IAAA,IAASE,CAAAA,CAAI,EAAGA,CAAAA,CAAIF,CAAAA,CAAO,MAAA,CAAQE,CAAAA,EAAAA,CACjCD,CAAAA,CAAMC,CAAC,CAAA,CAAIF,CAAAA,CAAO,WAAWE,CAAC,CAAA,CAEhC,OAAOD,CACT,CAEA,SAASE,EAAAA,CAAmBF,CAAAA,CAA2B,CACrD,IAAID,CAAAA,CAAS,EAAA,CACb,IAAA,IAASE,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAID,CAAAA,CAAM,MAAA,CAAQC,IAChCF,CAAAA,EAAU,MAAA,CAAO,YAAA,CAAaC,CAAAA,CAAMC,CAAC,CAAC,CAAA,CAExC,OAAO,IAAA,CAAKF,CAAM,CACpB,CAYO,SAASI,EAAAA,CAAQC,CAAAA,CAA0B,CAChD,GAAM,CAAE,OAAAC,CAAO,CAAA,CAAIC,oBAAAA,EAAa,CAC1B,CAACC,CAAAA,CAAYC,CAAa,CAAA,CAAIC,cAAAA,CAAS,KAAK,CAAA,CAC5CC,CAAAA,CAAaC,YAAAA,CAAOP,CAAO,CAAA,CACjCM,CAAAA,CAAW,OAAA,CAAUN,CAAAA,CAErB,IAAMQ,CAAAA,CAAOC,iBAAAA,CACX,MAAOC,CAAAA,EAA0C,CAC/C,GAAM,CAAE,MAAA,CAAAC,EAAQ,KAAA,CAAApD,CAAAA,CAAO,GAAGK,CAAK,CAAA,CAAI8C,CAAAA,CAEnCN,CAAAA,CAAc,IAAI,EAClB,GAAI,CAEF,IAAIQ,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAQ,MAAMX,CAAAA,CAAO,UAAU,CAC7B,KAAA,CAAA1C,CAAAA,CACA,WAAA,CAAaoD,CAAAA,CAAO,OAAA,CACpB,KAAA,CAAO/C,CAAAA,CAAK,MACZ,MAAA,CAAQA,CAAAA,CAAK,MAAA,CACb,IAAA,CAAMA,EAAK,IAAA,EAAQiD,SAAAA,CAAI,QAAA,CAAS,QAAA,CAChC,OAAQjD,CAAAA,CAAK,MAAA,CACb,QAAA,CAAUA,CAAAA,CAAK,QAAA,CACf,WAAA,CAAaA,CAAAA,CAAK,WAAA,CAClB,OAAQA,CAAAA,CAAK,MAAA,CACb,SAAA,CAAWA,CAAAA,CAAK,UAChB,MAAA,CAAQA,CAAAA,CAAK,MAAA,CACb,QAAA,CAAUA,EAAK,QACjB,CAAC,EACH,CAAA,MAASkD,CAAAA,CAAG,CACV,IAAMC,CAAAA,CAAMD,aAAa,KAAA,CAAQA,CAAAA,CAAI,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAC,CAAC,CAAA,CACxD,MAAAR,CAAAA,CAAW,OAAA,EAAS,OAAA,GAAUS,CAAAA,CAAK,OAAO,CAAA,CACpCA,CACR,CAGA,IAAIC,CAAAA,CACJ,GAAI,CACF,IAAMC,EAAgBxB,EAAAA,CAAmBmB,CAAAA,CAAM,YAAY,CAAA,CAC3DI,EAAc,MAAML,CAAAA,CAAO,eAAA,CAAgBM,CAAa,EAC1D,CAAA,MAASH,CAAAA,CAAG,CACV,IAAMC,CAAAA,CAAMD,CAAAA,YAAa,KAAA,CAAQA,CAAAA,CAAI,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAC,CAAC,EACxD,MAAAR,CAAAA,CAAW,OAAA,EAAS,OAAA,GAAUS,CAAAA,CAAK,MAAM,CAAA,CACnCA,CACR,CAGA,IAAIG,CAAAA,CACJ,GAAI,CACF,IAAMC,CAAAA,CAAerB,EAAAA,CAAmBkB,CAAW,CAAA,CACnDE,EAAa,MAAMjB,CAAAA,CAAO,MAAA,CAAO,CAC/B,KAAA,CAAA1C,CAAAA,CACA,YAAA,CAAc4D,CAChB,CAAC,EACH,CAAA,MAASL,CAAAA,CAAG,CACV,IAAMC,CAAAA,CAAMD,CAAAA,YAAa,KAAA,CAAQA,CAAAA,CAAI,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAC,CAAC,CAAA,CACxD,MAAAR,CAAAA,CAAW,OAAA,EAAS,UAAUS,CAAAA,CAAK,MAAM,CAAA,CACnCA,CACR,CAEA,IAAMK,CAAAA,CAAqB,CACzB,MAAA,CAAQF,EAAW,MAAA,CACnB,KAAA,CAAOA,CAAAA,CAAW,KACpB,CAAA,CAEA,OAAAZ,CAAAA,CAAW,OAAA,EAAS,cAAcc,CAAM,CAAA,CACjCA,CACT,CAAA,OAAE,CACAhB,CAAAA,CAAc,KAAK,EACrB,CACF,EACA,CAACH,CAAM,CACT,CAAA,CAEA,OAAOoB,aAAAA,CAAQ,KAAO,CAAE,KAAAb,CAAAA,CAAM,UAAA,CAAAL,CAAW,CAAA,CAAA,CAAI,CAACK,CAAAA,CAAML,CAAU,CAAC,CACjE,CCtGA,IAAMmB,EAAAA,CAAmB,IAAA,CAWlB,SAASC,EAAAA,CACdC,EACAxB,CAAAA,CACA,CACA,IAAMyB,CAAAA,CAAWzB,CAAAA,EAAS,QAAA,EAAYsB,EAAAA,CAChCI,CAAAA,CAAS1B,GAAS,MAAA,EAAU,KAAA,CAC5BM,CAAAA,CAAaC,YAAAA,CAAOP,CAAO,CAAA,CACjCM,CAAAA,CAAW,OAAA,CAAUN,CAAAA,CASrB,IAAM2B,CAAAA,CANJ,CAAC,CAACH,CAAAA,CAAO,KAAA,EACT,CAAC,CAACA,CAAAA,CAAO,aACT,CAAC,CAACA,CAAAA,CAAO,KAAA,EACT,CAAC,CAACA,CAAAA,CAAO,MAAA,EACT,CAAC,CAACA,CAAAA,CAAO,MAAA,EAE0B,CAACE,CAAAA,CAEhCE,CAAAA,CAAQC,yBAAAA,CAAkBL,CAAAA,CAA0B,CACxD,QAAAG,CAAAA,CACA,eAAA,CAAiBA,CAAAA,CAAUF,CAAAA,CAAW,MACtC,KAAA,CAAO,KACT,CAAC,CAAA,CAED,OAAAK,eAAAA,CAAU,IAAM,CACVF,CAAAA,CAAM,KAAA,EACRtB,CAAAA,CAAW,OAAA,EAAS,OAAA,GAAUsB,EAAM,KAAK,EAE7C,CAAA,CAAG,CAACA,EAAM,KAAK,CAAC,CAAA,CAETP,aAAAA,CACL,KAAO,CACL,KAAA,CAAOO,CAAAA,CAAM,IAAA,CACb,SAAA,CAAWA,CAAAA,CAAM,UAAA,CACjB,KAAA,CAAOA,EAAM,KACf,CAAA,CAAA,CACA,CAACA,CAAAA,CAAM,KAAMA,CAAAA,CAAM,UAAA,CAAYA,CAAAA,CAAM,KAAK,CAC5C,CACF,CC3CA,IAAMG,EAAAA,CAAkB,IAiBjB,SAASC,EAAAA,CAAkBhC,CAAAA,CAAoC,CACpE,GAAM,CAAE,MAAA,CAAAC,CAAO,EAAIC,oBAAAA,EAAa,CAC1B,CAAC+B,CAAAA,CAAcC,CAAe,CAAA,CAAI7B,cAAAA,CACtC,IAAM,IAAI,GACZ,CAAA,CACMC,CAAAA,CAAaC,YAAAA,CAAOP,CAAO,CAAA,CACjCM,CAAAA,CAAW,OAAA,CAAUN,CAAAA,CAErB,IAAMmC,CAAAA,CAAW1B,iBAAAA,CACf,CAAC2B,CAAAA,CAAgBC,CAAAA,GAAiC,CAChDH,CAAAA,CAAiBI,CAAAA,EAAS,CACxB,IAAMC,CAAAA,CAAWD,CAAAA,CAAK,GAAA,CAAIF,CAAM,CAAA,CAEhC,GADI,CAACG,GACDA,CAAAA,CAAS,MAAA,GAAWF,CAAAA,CAAQ,OAAOC,EACvC,IAAME,CAAAA,CAAO,IAAI,GAAA,CAAIF,CAAI,CAAA,CACzB,OAAAE,CAAAA,CAAK,GAAA,CAAIJ,CAAAA,CAAQ,CAAE,GAAGG,CAAAA,CAAU,OAAAF,CAAO,CAAC,CAAA,CACjCG,CACT,CAAC,EACH,CAAA,CACA,EACF,EAEMC,CAAAA,CAAQhC,iBAAAA,CACZ,CAAClD,CAAAA,CAAc6E,CAAAA,GAAmB,CAChCF,CAAAA,CAAiBI,CAAAA,EAAS,CACxB,GAAIA,CAAAA,CAAK,GAAA,CAAIF,CAAM,EAAG,OAAOE,CAAAA,CAC7B,IAAME,CAAAA,CAAO,IAAI,GAAA,CAAIF,CAAI,CAAA,CACzB,OAAAE,CAAAA,CAAK,GAAA,CAAIJ,CAAAA,CAAQ,CAAE,MAAA7E,CAAAA,CAAO,MAAA,CAAA6E,CAAAA,CAAQ,MAAA,CAAQ,SAAU,CAAC,CAAA,CAC9CI,CACT,CAAC,EAED,IAAME,CAAAA,CAAUpC,CAAAA,CAAW,OAAA,EAAS,OAAA,EAAWyB,EAAAA,CAE/C9B,CAAAA,CACG,cAAA,CAAe1C,EAAO6E,CAAAA,CAAQM,CAAO,CAAA,CACrC,IAAA,CAAMC,GAAY,CACjB,GAAIA,CAAAA,CACFR,CAAAA,CAASC,EAAQ,WAAW,CAAA,CAC5B9B,CAAAA,CAAW,OAAA,EAAS,WAAA,GAAc8B,CAAM,CAAA,CAAA,KACnC,CACL,IAAMrB,CAAAA,CAAM,IAAI,KAAA,CAAM,6BAA6B,EACnDoB,CAAAA,CAASC,CAAAA,CAAQ,QAAQ,CAAA,CACzB9B,EAAW,OAAA,EAAS,QAAA,GAAW8B,CAAAA,CAAQrB,CAAG,EAC5C,CACF,CAAC,CAAA,CACA,MAAOD,CAAAA,EAAM,CACZ,IAAMC,CAAAA,CAAMD,aAAa,KAAA,CAAQA,CAAAA,CAAI,IAAI,KAAA,CAAM,OAAOA,CAAC,CAAC,CAAA,CACxDqB,CAAAA,CAASC,CAAAA,CAAQ,QAAQ,CAAA,CACzB9B,CAAAA,CAAW,SAAS,QAAA,GAAW8B,CAAAA,CAAQrB,CAAG,EAC5C,CAAC,EACL,CAAA,CACA,CAACd,EAAQkC,CAAQ,CACnB,CAAA,CAEMS,CAAAA,CAAQnC,iBAAAA,CAAa2B,CAAAA,EAAmB,CAC5CF,CAAAA,CAAiBI,GAAS,CACxB,GAAI,CAACA,CAAAA,CAAK,IAAIF,CAAM,CAAA,CAAG,OAAOE,CAAAA,CAC9B,IAAME,CAAAA,CAAO,IAAI,GAAA,CAAIF,CAAI,CAAA,CACzB,OAAAE,CAAAA,CAAK,MAAA,CAAOJ,CAAM,CAAA,CACXI,CACT,CAAC,EACH,EAAG,EAAE,CAAA,CAECK,CAAAA,CAAWpC,kBAAY,IAAM,CACjCyB,CAAAA,CAAiBI,CAAAA,EAAUA,CAAAA,CAAK,IAAA,GAAS,CAAA,CAAIA,CAAAA,CAAO,IAAI,GAAM,EAChE,CAAA,CAAG,EAAE,CAAA,CAEL,OAAOjB,aAAAA,CACL,KAAO,CAAE,KAAA,CAAAoB,CAAAA,CAAO,KAAA,CAAAG,CAAAA,CAAO,QAAA,CAAAC,CAAAA,CAAU,YAAA,CAAAZ,CAAa,GAC9C,CAACQ,CAAAA,CAAOG,CAAAA,CAAOC,CAAAA,CAAUZ,CAAY,CACvC,CACF,CCvFA,IAAMa,EAAAA,CAAoC,IAAI,IAAI,CAChDC,WAAAA,CAAM,MAAA,CACNA,WAAAA,CAAM,eACNA,WAAAA,CAAM,aACR,CAAC,CAAA,CAED,SAASC,EAAAA,CAAezF,CAAAA,CAA8B,CACpD,OAAOuF,EAAAA,CAAc,GAAA,CAAIvF,CAAK,CAAA,CAAI0F,qBAAe,MAAA,CAASA,oBAAAA,CAAe,GAC3E,CAEA,IAAMC,EAAAA,CAAgB,GAAA,CAChBC,EAAAA,CAAkB,IAAA,CAOxB,SAASC,EAAAA,CACPC,CAAAA,CACAC,CAAAA,CACoB,CACpB,GAAID,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAG,OAExB,IAAME,CAAAA,CADWF,CAAAA,CAAMA,EAAM,MAAA,CAAS,CAAC,CAAA,CAClB,YAAA,CACrB,GAAI,CAACE,CAAAA,EAAOA,CAAAA,GAAQ,IAAK,OAAO,GAAA,CAEhC,IAAMC,CAAAA,CAASD,EAAI,QAAA,CAASD,CAAAA,CAAW,CAAA,CAAG,GAAG,EACvCG,CAAAA,CAAUD,CAAAA,CAAO,KAAA,CAAM,CAAA,CAAGA,CAAAA,CAAO,MAAA,CAASF,CAAQ,CAAA,EAAK,IAEvDI,CAAAA,CADWF,CAAAA,CAAO,KAAA,CAAMA,CAAAA,CAAO,OAASF,CAAQ,CAAA,CAC7B,OAAA,CAAQ,KAAA,CAAO,EAAE,CAAA,CAC1C,OAAOI,CAAAA,CAAU,CAAA,EAAGD,CAAO,CAAA,CAAA,EAAIC,CAAO,CAAA,CAAA,CAAKD,CAC7C,CAQO,SAASE,EAAAA,CACdnC,CAAAA,CACqB,CACrB,GAAM,CAAE,KAAA,CAAAjE,CAAM,EAAIiE,CAAAA,CAIZoC,CAAAA,CAAUC,0BAAAA,EAAW,CACrBC,CAAAA,CAAKd,EAAAA,CAAezF,CAAK,CAAA,CACzBoD,EAASU,aAAAA,CACb,IAAMuC,CAAAA,CAAQ,IAAA,CAAMG,GAAMA,CAAAA,CAAE,cAAA,GAAmBD,CAAAA,EAAMC,CAAAA,CAAE,WAAW,CAAA,CAClE,CAACH,CAAAA,CAASE,CAAE,CACd,CAAA,CACME,CAAAA,CAAgBrD,CAAAA,EAAQ,SAAW,EAAA,CAInC,CAACsD,CAAAA,CAAkBC,CAAmB,EAAI7D,cAAAA,CAASmB,CAAAA,CAAO,IAAA,EAAQ,EAAE,EACpE,CAAC2C,CAAAA,CAAgBC,CAAiB,CAAA,CAAI/D,cAAAA,CAASmB,CAAAA,CAAO,EAAA,EAAM,EAAE,EAE9D6C,CAAAA,CAAU9D,YAAAA,CAAOiB,CAAAA,CAAO,IAAI,EAC5B8C,CAAAA,CAAQ/D,YAAAA,CAAOiB,CAAAA,CAAO,EAAE,EAC9BM,eAAAA,CAAU,IAAM,CACVN,CAAAA,CAAO,IAAA,GAAS6C,CAAAA,CAAQ,OAAA,GAC1BA,CAAAA,CAAQ,QAAU7C,CAAAA,CAAO,IAAA,CACrBA,CAAAA,CAAO,IAAA,EAAM0C,EAAoB1C,CAAAA,CAAO,IAAI,CAAA,EAEpD,CAAA,CAAG,CAACA,CAAAA,CAAO,IAAI,CAAC,CAAA,CAChBM,eAAAA,CAAU,IAAM,CACVN,CAAAA,CAAO,KAAO8C,CAAAA,CAAM,OAAA,GACtBA,CAAAA,CAAM,OAAA,CAAU9C,CAAAA,CAAO,EAAA,CACnBA,CAAAA,CAAO,EAAA,EAAI4C,EAAkB5C,CAAAA,CAAO,EAAE,CAAA,EAE9C,CAAA,CAAG,CAACA,CAAAA,CAAO,EAAE,CAAC,EAId,IAAM+C,CAAAA,CAAiBlD,aAAAA,CACrB,IAAM,CAAC4C,CAAAA,CAAkBE,CAAc,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CACvD,CAACF,CAAAA,CAAkBE,CAAc,CACnC,CAAA,CAEMK,CAAAA,CAAcC,sBAAAA,CAClB,CAAE,KAAA,CAAAlH,CAAAA,CAAO,SAAA,CAAWgH,CAAe,EACnC,CAAE,OAAA,CAASA,CAAAA,CAAe,MAAA,CAAS,EAAG,eAAA,CAAiBrB,EAAc,CACvE,CAAA,CAEMwB,CAAAA,CAAYrD,aAAAA,CAChB,IAAMmD,CAAAA,CAAY,MAAM,IAAA,CAAMG,CAAAA,EAAMA,CAAAA,CAAE,OAAA,GAAYV,CAAgB,CAAA,EAAK,IAAA,CACvE,CAACO,CAAAA,CAAY,KAAMP,CAAgB,CACrC,CAAA,CACMW,CAAAA,CAAUvD,aAAAA,CACd,IAAMmD,CAAAA,CAAY,IAAA,EAAM,KAAMG,CAAAA,EAAMA,CAAAA,CAAE,OAAA,GAAYR,CAAc,GAAK,IAAA,CACrE,CAACK,CAAAA,CAAY,IAAA,CAAML,CAAc,CACnC,CAAA,CAIMU,CAAAA,CAAgBC,wCAAAA,CACpB,CAAE,KAAA,CAAAvH,CAAAA,CAAO,OAAA,CAASyG,EAAe,cAAA,CAAAO,CAAe,CAAA,CAChD,CACE,QAAS,CAAC,CAACP,CAAAA,EAAiBO,CAAAA,CAAe,OAAS,CAAA,CACpD,eAAA,CAAiBpB,EACnB,CACF,CAAA,CAEM4B,CAAAA,CAAc1D,aAAAA,CAClB,IACEwD,EAAc,IAAA,EAAM,IAAA,CAAMG,CAAAA,EAAMA,CAAAA,CAAE,UAAYf,CAAgB,CAAA,EAAK,IAAA,CACrE,CAACY,EAAc,IAAA,CAAMZ,CAAgB,CACvC,CAAA,CACMgB,CAAAA,CAAY5D,aAAAA,CAChB,IAAMwD,CAAAA,CAAc,MAAM,IAAA,CAAMG,CAAAA,EAAMA,CAAAA,CAAE,OAAA,GAAYb,CAAc,CAAA,EAAK,IAAA,CACvE,CAACU,CAAAA,CAAc,KAAMV,CAAc,CACrC,CAAA,CAIM,CAACe,CAAAA,CAAQC,CAAS,CAAA,CAAI9E,cAAAA,CAA6B,MAAS,CAAA,CAE5D+E,CAAAA,CAAmB/D,aAAAA,CAAQ,IAAM,CACrC,GAAI,CAAC6D,CAAAA,EAAUR,GAAW,QAAA,EAAY,IAAA,CAAM,OAC5C,IAAMW,CAAAA,CAAQH,CAAAA,CAAO,KAAA,CAAM,GAAG,EACxBzB,CAAAA,CAAU4B,CAAAA,CAAM,CAAC,CAAA,EAAK,IAEtB7B,EAAAA,CAAAA,CADY6B,CAAAA,CAAM,CAAC,CAAA,EAAK,IAAI,KAAA,CAAM,CAAA,CAAGX,CAAAA,CAAU,QAAQ,CAAA,CACrC,MAAA,CAAOA,CAAAA,CAAU,QAAA,CAAU,GAAG,CAAA,CAEtD,OAAA,CADYjB,CAAAA,CAAUD,EAAAA,EACX,QAAQ,KAAA,CAAO,EAAE,CAAA,EAAK,GACnC,EAAG,CAAC0B,CAAAA,CAAQR,CAAAA,EAAW,QAAQ,CAAC,CAAA,CAE1BY,CAAAA,CAAcjE,aAAAA,CAAQ,IAAM,CAChC,GAAI,CAAC6D,CAAAA,EAAU,CAACR,CAAAA,EAAW,UAAA,EAAY,UAAA,CAAY,OACnD,IAAMa,CAAAA,CAAQ,MAAA,CAAOb,CAAAA,CAAU,UAAA,CAAW,UAAU,CAAA,CAC9Cc,CAAAA,CAAQ,MAAA,CAAON,CAAM,CAAA,CAAIK,CAAAA,CAC/B,OAAO,MAAA,CAAO,SAASC,CAAK,CAAA,CAAIA,CAAAA,CAAM,QAAA,GAAa,MACrD,CAAA,CAAG,CAACN,CAAAA,CAAQR,CAAAA,EAAW,UAAA,EAAY,UAAU,CAAC,EAIxCe,CAAAA,CAAgBhF,iBAAAA,CAAY,IAAM,CACtC,GAAI,CAACsE,CAAAA,CAAa,OAClB,IAAMW,EAAM,MAAA,CAAOX,CAAAA,CAAY,MAAM,CAAA,CACrC,GAAI,CAAC,MAAA,CAAO,QAAA,CAASW,CAAG,CAAA,EAAKA,CAAAA,EAAO,CAAA,CAAG,OACvC,IAAMC,CAAAA,CAAOD,CAAAA,CAAM,CAAA,CACbpC,EAAAA,CAAWoB,GAAW,QAAA,EAAY,CAAA,CACxCS,CAAAA,CACEQ,CAAAA,CAAK,cAAA,CAAe,OAAA,CAAS,CAC3B,WAAA,CAAa,MACb,qBAAA,CAAuBrC,EACzB,CAAC,CACH,EACF,CAAA,CAAG,CAACyB,CAAAA,CAAaL,CAAAA,EAAW,QAAQ,CAAC,CAAA,CAE/BkB,CAAAA,CAAenF,iBAAAA,CAAY,IAAM,CACrC,GAAI,CAACsE,EAAa,OAClB,IAAMW,CAAAA,CAAM,MAAA,CAAOX,CAAAA,CAAY,MAAM,CAAA,CACrC,GAAI,CAAC,MAAA,CAAO,QAAA,CAASW,CAAG,CAAA,EAAKA,CAAAA,EAAO,CAAA,CAAG,OACvC,IAAMpC,EAAWoB,CAAAA,EAAW,QAAA,EAAY,CAAA,CACxCS,CAAAA,CACEO,EAAI,cAAA,CAAe,OAAA,CAAS,CAC1B,WAAA,CAAa,MACb,qBAAA,CAAuBpC,CACzB,CAAC,CACH,EACF,CAAA,CAAG,CAACyB,CAAAA,CAAaL,GAAW,QAAQ,CAAC,CAAA,CAI/BmB,CAAAA,CAAcxE,cAClB,KAAO,CACL,KAAA,CAAA9D,CAAAA,CACA,YAAayG,CAAAA,EAAiB,MAAA,CAC9B,KAAA,CAAOC,CAAAA,EAAoB,MAAA,CAC3B,MAAA,CAAQE,CAAAA,EAAkB,MAAA,CAC1B,KAAMtD,SAAAA,CAAI,QAAA,CAAS,QAAA,CACnB,MAAA,CAAQuE,CACV,CAAA,CAAA,CACA,CAAC7H,CAAAA,CAAOyG,CAAAA,CAAeC,EAAkBE,CAAAA,CAAgBiB,CAAgB,CAC3E,CAAA,CAEMU,CAAAA,CAAgBvF,YAAAA,CAAO,KAAK,CAAA,CAE5B,CACJ,KAAA,CAAAK,CAAAA,CACA,SAAA,CAAAmF,CAAAA,CACA,KAAA,CAAOC,CACT,CAAA,CAAIzE,EAAAA,CAAoBsE,EAAa,CAAE,MAAA,CAAQC,CAAAA,CAAc,OAAQ,CAAC,CAAA,CAIhEG,CAAAA,CAAe5E,aAAAA,CACnB,IACET,CAAAA,EAASgE,CAAAA,CACLxB,EAAAA,CAAmBxC,CAAAA,CAAM,MAAOgE,CAAAA,CAAQ,QAAQ,CAAA,CAChD,MAAA,CACN,CAAChE,CAAAA,CAAOgE,CAAO,CACjB,CAAA,CAEMsB,EAAAA,CAAoB7E,aAAAA,CAAQ,IAAM,CACtC,GAAI,CAAC4E,CAAAA,EAAgB,CAACrB,CAAAA,EAAS,YAAY,UAAA,CAAY,OACvD,IAAMW,CAAAA,CAAQ,OAAOX,CAAAA,CAAQ,UAAA,CAAW,UAAU,CAAA,CAC5CY,CAAAA,CAAQ,MAAA,CAAOS,CAAY,CAAA,CAAIV,EACrC,OAAO,MAAA,CAAO,QAAA,CAASC,CAAK,EAAIA,CAAAA,CAAM,QAAA,EAAS,CAAI,MACrD,EAAG,CAACS,CAAAA,CAAcrB,CAAAA,EAAS,UAAA,EAAY,UAAU,CAAC,CAAA,CAI5C,CAAE,KAAMuB,CAAAA,CAAS,UAAA,CAAAhG,CAAW,CAAA,CAAIJ,EAAAA,EAAQ,CAC9C+F,CAAAA,CAAc,OAAA,CAAU3F,EAExB,IAAMiG,CAAAA,CAAgB7F,YAAAA,CAAOiB,CAAAA,CAAO,UAAU,CAAA,CAC9C4E,CAAAA,CAAc,OAAA,CAAU5E,EAAO,UAAA,CAE/B,GAAM,CAAE,KAAA,CAAAiB,GAAO,YAAA,CAAAR,EAAa,CAAA,CAAID,EAAAA,CAAkB,CAChD,WAAA,CAAcI,CAAAA,EAAW,CACvBgE,CAAAA,CAAc,OAAA,GAAU,CAAE,OAAA,CAAS,IAAA,CAAM,OAAAhE,CAAO,CAAC,EACnD,CAAA,CACA,SAAWA,CAAAA,EAAW,CACpBgE,CAAAA,CAAc,OAAA,GAAU,CAAE,OAAA,CAAS,KAAA,CAAO,MAAA,CAAAhE,CAAO,CAAC,EACpD,CACF,CAAC,EAEKiE,EAAAA,CAAiBhF,aAAAA,CAAQ,IAAM,CACnC,GAAIY,EAAAA,CAAa,IAAA,GAAS,CAAA,CAAG,OAAO,OACpC,IAAMqE,CAAAA,CAAU,KAAA,CAAM,IAAA,CAAKrE,EAAAA,CAAa,MAAA,EAAQ,CAAA,CAChD,OAAOqE,CAAAA,CAAQA,CAAAA,CAAQ,MAAA,CAAS,CAAC,EAAG,MACtC,CAAA,CAAG,CAACrE,EAAY,CAAC,CAAA,CAEXzB,EAAAA,CAAOC,iBAAAA,CAAY,SAAY,CACnC,GACE,EAAA,CAACE,CAAAA,EACD,CAACC,CAAAA,EACD,CAACqD,CAAAA,EACD,CAACE,GACD,CAACiB,CAAAA,CAAAA,CAKH,GAAI,CACF,IAAMhE,CAAAA,CAAS,MAAM+E,CAAAA,CAAQ,CAC3B,KAAA,CAAA5I,CAAAA,CACA,MAAA,CAAAoD,CAAAA,CACA,MAAOsD,CAAAA,CACP,MAAA,CAAQE,CAAAA,CACR,MAAA,CAAQiB,EACR,IAAA,CAAMvE,SAAAA,CAAI,QAAA,CAAS,QACrB,CAAC,CAAA,CACD4B,EAAAA,CAAMlF,CAAAA,CAAO6D,CAAAA,CAAO,MAAM,EAC5B,CAAA,KAAQ,CAER,CACF,CAAA,CAAG,CACDT,CAAAA,CACAC,CAAAA,CACArD,EACA0G,CAAAA,CACAE,CAAAA,CACAiB,CAAAA,CACAe,CAAAA,CACA1D,EACF,CAAC,CAAA,CAIK8D,EAAAA,CAAY/B,CAAAA,CAAY,SAAA,EAAaK,CAAAA,CAAc,SAAA,CAIzD,OAAOxD,cACL,KAAO,CACL,gBAAA,CAAA4C,CAAAA,CACA,cAAA,CAAAE,CAAAA,CACA,mBAAA,CAAAD,CAAAA,CACA,kBAAAE,CAAAA,CAEA,SAAA,CAAAM,CAAAA,CACA,OAAA,CAAAE,CAAAA,CAEA,WAAA,CAAAG,CAAAA,CACA,SAAA,CAAAE,EAEA,MAAA,CAAAC,CAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,cAAAM,CAAAA,CACA,YAAA,CAAAG,CAAAA,CACA,gBAAA,CAAAR,EACA,WAAA,CAAAE,CAAAA,CAEA,YAAA,CAAAW,CAAAA,CACA,iBAAA,CAAAC,EAAAA,CAEA,KAAA,CAAAtF,CAAAA,CACA,UAAAmF,CAAAA,CACA,UAAA,CAAAC,CAAAA,CAEA,IAAA,CAAAxF,GACA,UAAA,CAAAL,CAAAA,CAEA,QAAA,CAAUkG,EAAAA,CAEV,UAAAE,EACF,CAAA,CAAA,CACA,CACEtC,CAAAA,CACAE,CAAAA,CACAO,CAAAA,CACAE,CAAAA,CACAG,CAAAA,CACAE,EACAC,CAAAA,CACAO,CAAAA,CACAG,CAAAA,CACAR,CAAAA,CACAE,EACAW,CAAAA,CACAC,EAAAA,CACAtF,CAAAA,CACAmF,CAAAA,CACAC,EACAxF,EAAAA,CACAL,CAAAA,CACAkG,EAAAA,CACAE,EACF,CACF,CACF,CC1TO,SAASC,EAAAA,CAAiB,CAC/B,MAAA,CAAAC,CAAAA,CACA,YAAA,CAAAC,CAAAA,CACA,SAAA,CAAAhC,CAAAA,CACA,OAAA,CAAAE,CAAAA,CACA,YAAAG,CAAAA,CACA,WAAA,CAAA4B,CAAAA,CACA,gBAAA,CAAAC,EACA,YAAA,CAAAX,CAAAA,CACA,iBAAA,CAAAC,CAAAA,CACA,MAAAtF,CAAAA,CACA,SAAA,CAAAmF,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,SAAA,CAAAa,CAAAA,CACA,UAAA,CAAA1G,CACF,CAAA,CAA0B,CACxB,GAAM,CAAE,CAAA,CAAAwE,CAAE,CAAA,CAAImC,mBAAAA,GACR,CAACC,CAAAA,CAAUC,CAAW,CAAA,CAAI3G,cAAAA,CAAS,KAAK,CAAA,CACxC4G,CAAAA,CAAiBxG,kBAAY,IAAMuG,CAAAA,CAAa1E,CAAAA,EAAS,CAACA,CAAI,CAAA,CAAG,EAAE,CAAA,CAEnEe,EAAQhC,aAAAA,CAAQ,IACfT,CAAAA,CACEA,CAAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAACsG,CAAAA,CAAMrH,KAAO,CACnC,GAAA,CAAK,CAAA,KAAA,EAAQA,CAAC,GACd,IAAA,CAAMqH,CAAAA,CAAK,IAAA,CACX,KAAA,CAAOA,EAAK,KAAA,CACZ,WAAA,CAAaA,CAAAA,CAAK,WAAA,CAClB,MAAA,CAAQA,CAAAA,CAAK,MAAA,CACb,YAAA,CAAcA,EAAK,YAAA,CACnB,QAAA,CAAUA,CAAAA,CAAK,QAAA,CACf,UAAWA,CAAAA,CAAK,SAClB,CAAA,CAAE,CAAA,CAViB,EAAC,CAWnB,CAACtG,CAAK,CAAC,CAAA,CAEV,OACEuG,cAAAA,CAACC,QAAAA,CAAA,CACC,MAAA,CAAQX,CAAAA,CACR,YAAA,CAAcC,CAAAA,CACd,gBAAe,IAAA,CACf,cAAA,CAAe,QAAA,CACf,QAAA,CAAS,OAET,QAAA,CAAAW,eAAAA,CAACC,eAAAA,CAAA,CAAa,SAAA,CAAU,wBAAA,CACtB,QAAA,CAAA,CAAAH,cAAAA,CAACI,eAAA,CAAa,QAAA,CAAA5C,CAAAA,CAAE,oBAAoB,EAAE,CAAA,CACtCwC,cAAAA,CAACK,YAAAA,CAAA,CACC,SAAAH,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+DAAA,CAEb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,OACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qEACZ,QAAA,CAAAxC,CAAAA,CAAE,iBAAiB,CAAA,CACtB,EACA0C,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sEAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iCACZ,QAAA,CAAA,CAAA3C,CAAAA,EAAW,KAAA,EACVyC,cAAAA,CAACM,UAAA,CACC,IAAA,CAAK,IAAA,CACL,GAAA,CAAK/C,EAAU,KAAA,CACf,IAAA,CAAMA,CAAAA,CAAU,MAAA,CAChB,SAAA,CAAU,SAAA,CACZ,CAAA,CAEF2C,eAAAA,CAAC,OAAI,SAAA,CAAU,kDAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACZ,QAAA,CAAAzC,GAAW,MAAA,EAAU,QAAA,CACxB,CAAA,CACCK,CAAAA,EACCsC,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kDAAA,CACb,UAAAF,cAAAA,CAACO,EAAAA,CAAA,EAAkB,CAAA,CACnBL,gBAAC,MAAA,CAAA,CACE,QAAA,CAAA,CAAAM,EAAAA,CAAa5C,CAAAA,CAAY,MAAM,CAAA,CAAE,GAAA,CAAEL,CAAAA,EAAW,MAAA,CAAA,CACjD,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CACA2C,gBAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uDAAA,CACb,QAAA,CAAA,CAAAF,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACZ,QAAA,CAAAQ,GAAahB,CAAW,CAAA,CAC3B,CAAA,CACAU,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0BAAA,CAA2B,QAAA,CAAA,CAAA,GAAA,CACtCO,GAAUhB,CAAgB,CAAA,CAAA,CAC9B,CAAA,CAAA,CACF,CAAA,CAAA,CACF,GACF,CAAA,CAGAS,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,OACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oEAAA,CACZ,QAAA,CAAAxC,CAAAA,CAAE,6BAA6B,EAClC,CAAA,CACA0C,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sEAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,gCAAA,CACZ,QAAA,CAAA,CAAAzC,CAAAA,EAAS,KAAA,EACRuC,cAAAA,CAACM,SAAAA,CAAA,CACC,IAAA,CAAK,KACL,GAAA,CAAK7C,CAAAA,CAAQ,KAAA,CACb,IAAA,CAAMA,EAAQ,MAAA,CACd,SAAA,CAAU,SAAA,CACZ,CAAA,CAEFyC,gBAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kDAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACZ,SAAAvC,CAAAA,EAAS,MAAA,EAAU,QAAA,CACtB,CAAA,CACAuC,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0BAAA,CACZ,QAAA,CAAAU,GAAgBjD,CAAAA,EAAS,OAAO,CAAA,CACnC,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACAyC,eAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,uDAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,yBAAA,CACZ,QAAA,CAAAQ,EAAAA,CAAa1B,CAAY,EAC5B,CAAA,CACAoB,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0BAAA,CAA2B,QAAA,CAAA,CAAA,GAAA,CACtCO,EAAAA,CAAU1B,CAAiB,GAC/B,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAGCa,CAAAA,EAAY1D,CAAAA,CAAM,MAAA,CAAS,CAAA,EAC1BgE,gBAAC,KAAA,CAAA,CAAI,SAAA,CAAU,MAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oEAAA,CACZ,SAAAxC,CAAAA,CAAE,yBAAyB,CAAA,CAC9B,CAAA,CACAwC,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0BAAA,CACZ,QAAA,CAAA9D,EAAM,GAAA,CAAK6D,CAAAA,EACVG,eAAAA,CAAC,KAAA,CAAA,CAEC,SAAA,CAAU,0EAAA,CAEV,QAAA,CAAA,CAAAA,eAAAA,CAAC,OAAI,SAAA,CAAU,0CAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,OAAI,SAAA,CAAU,sBAAA,CACZ,QAAA,CAAAxC,CAAAA,CAAE,gBAAgB,CAAA,CACrB,CAAA,CACAwC,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACZ,QAAA,CAAAD,CAAAA,CAAK,KACR,CAAA,CAAA,CACF,CAAA,CACAG,eAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,0CAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,sBAAA,CACZ,QAAA,CAAAxC,CAAAA,CAAE,iBAAiB,CAAA,CACtB,CAAA,CACA0C,eAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,iDAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,MAAA,CAAA,CACE,UAAAS,EAAAA,CAAkBZ,CAAAA,CAAK,WAAW,CAAA,CAAG,IACrCW,EAAAA,CAAgBX,CAAAA,CAAK,KAAK,CAAA,CAAA,CAC7B,CAAA,CACAC,cAAAA,CAACY,YAAAA,CAAA,CACC,MAAO,EAAA,CACP,MAAA,CAAQ,EAAA,CACR,SAAA,CAAU,kBACZ,CAAA,CACAV,eAAAA,CAAC,MAAA,CAAA,CACE,QAAA,CAAA,CAAAS,GAAkBZ,CAAAA,CAAK,YAAY,CAAA,CAAG,GAAA,CACtCW,EAAAA,CAAgBX,CAAAA,CAAK,MAAM,CAAA,CAAA,CAC9B,GACF,CAAA,CAAA,CACF,CAAA,CACCA,CAAAA,CAAK,SAAA,EACJG,gBAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0CAAA,CACb,QAAA,CAAA,CAAAF,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sBAAA,CACZ,QAAA,CAAAxC,CAAAA,CAAE,gBAAgB,CAAA,CACrB,CAAA,CACA0C,gBAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACZ,QAAA,CAAA,CAAAS,GAAkBZ,CAAAA,CAAK,SAAS,CAAA,CAAG,GAAA,CACnCW,GAAgBX,CAAAA,CAAK,QAAQ,CAAA,CAAA,CAChC,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,CAxCGA,CAAAA,CAAK,GA0CZ,CACD,EACH,CAAA,CAAA,CACF,CAAA,CAID7D,CAAAA,CAAM,MAAA,CAAS,CAAA,EACd8D,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sBACb,QAAA,CAAAA,cAAAA,CAACa,SAAAA,CAAA,CACC,IAAA,CAAK,IAAA,CACL,SAAA,CAAU,0CAAA,CACV,WACEjB,CAAAA,CACEI,cAAAA,CAACc,gBAAAA,CAAA,CAAc,MAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,CAAA,CAEtCd,eAACe,kBAAAA,CAAA,CAAgB,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,CAAA,CAG5C,aAAA,CAAa,KACb,OAAA,CAASjB,CAAAA,CAER,QAAA,CACGtC,CAAAA,CADHoC,EACK,qBAAA,CACA,qBADqB,CAAA,CAE7B,CAAA,CACF,GAEJ,CAAA,CACF,CAAA,CACAI,cAAAA,CAACgB,cAAAA,CAAA,CACC,QAAA,CAAAhB,cAAAA,CAACa,SAAAA,CAAA,CACC,SAAA,CAAS,IAAA,CACT,KAAA,CAAM,SAAA,CACN,UAAU,iBAAA,CACV,aAAA,CAAa,IAAA,CACb,UAAA,CAAY,CAACpH,CAAAA,EAAS,CAAC,CAACoF,CAAAA,CACxB,SAAA,CAAY,CAACpF,CAAAA,EAASmF,CAAAA,EAAc5F,EACpC,OAAA,CAAS0G,CAAAA,CAER,QAAA,CAAAlC,CAAAA,CAAE,gBAAgB,CAAA,CACrB,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,CAEA,SAAS+C,EAAAA,EAAoB,CAC3B,OACEL,eAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAM,6BACN,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,EAAA,CACR,QAAQ,WAAA,CACR,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,eACP,WAAA,CAAa,CAAA,CACb,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CACf,SAAA,CAAU,cAAA,CAEV,UAAAF,cAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,+BAAA,CAAgC,EACxCA,cAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,6BAAA,CAA8B,EACtCA,cAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,4BAAA,CAA6B,CAAA,CAAA,CACvC,CAEJ,CAEA,SAASS,GAAUpC,CAAAA,CAAmC,CACpD,GAAI,CAACA,EAAO,OAAO,MAAA,CACnB,IAAM4C,CAAAA,CAAI,OAAO5C,CAAK,CAAA,CACtB,OAAK,MAAA,CAAO,QAAA,CAAS4C,CAAC,CAAA,CACfA,CAAAA,CAAE,eAAe,OAAA,CAAS,CAC/B,qBAAA,CAAuB,CAAA,CACvB,qBAAA,CAAuB,CACzB,CAAC,CAAA,CAJ+B,MAKlC,CAEA,SAAST,EAAAA,CAAanC,CAAAA,CAAmC,CACvD,GAAI,CAACA,CAAAA,CAAO,OAAO,GAAA,CACnB,IAAM4C,CAAAA,CAAI,MAAA,CAAO5C,CAAK,CAAA,CACtB,OAAK,MAAA,CAAO,QAAA,CAAS4C,CAAC,CAAA,CAClBA,CAAAA,EAAK,GAAA,CAAA,CAEJA,CAAAA,CAAI,GAAA,EAAW,cAAA,CAAe,OAAA,CAAS,CACtC,sBAAuB,CACzB,CAAC,CAAA,CAAI,GAAA,CAELA,GAAK,GAAA,CAAA,CAEJA,CAAAA,CAAI,GAAA,EAAO,cAAA,CAAe,QAAS,CAAE,qBAAA,CAAuB,CAAE,CAAC,CAAA,CAAI,GAAA,CAEjEA,CAAAA,CAAE,cAAA,CAAe,QAAS,CAAE,qBAAA,CAAuB,CAAE,CAAC,EAX7B,GAYlC,CAGA,SAASN,EAAAA,CAAkBtC,EAAmC,CAC5D,GAAI,CAACA,CAAAA,EAASA,CAAAA,GAAU,GAAA,CAAK,OAAO,GAAA,CACpC,IAAM4C,CAAAA,CAAI,MAAA,CAAO5C,CAAK,CAAA,CACtB,OAAK,MAAA,CAAO,QAAA,CAAS4C,CAAC,CAAA,CAClBA,GAAK,IAAA,CAAA,CAAcA,CAAAA,CAAI,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAA,CAAI,GAAA,CAC1CA,CAAAA,EAAK,KAAaA,CAAAA,CAAI,GAAA,EAAK,OAAA,CAAQ,CAAC,EAAI,GAAA,CACxCA,CAAAA,EAAK,GAAA,CAAA,CAAaA,CAAAA,CAAI,KAAK,OAAA,CAAQ,CAAC,CAAA,CAAI,GAAA,CACxCA,CAAAA,EAAK,GAAA,CAAA,CAAaA,CAAAA,CAAI,GAAA,EAAK,QAAQ,CAAC,CAAA,CAAI,GAAA,CACrC5C,CAAAA,CALyBA,CAMlC,CAEA,SAASqC,EAAAA,CAAgBQ,CAAAA,CAAkC,CACzD,OAAKA,CAAAA,CACDA,CAAAA,CAAK,MAAA,EAAU,EAAA,CAAWA,CAAAA,CACvB,CAAA,EAAGA,CAAAA,CAAK,MAAM,CAAA,CAAG,CAAC,CAAC,CAAA,GAAA,EAAMA,EAAK,KAAA,CAAM,EAAE,CAAC,CAAA,CAAA,CAF5B,QAGpB,CC1SO,SAASC,EAAAA,CAAO,CACrB,SAAA,CAAA5D,EACA,OAAA,CAAAE,CAAAA,CACA,WAAA,CAAAG,CAAAA,CACA,UAAAE,CAAAA,CACA,MAAA,CAAAC,CAAAA,CACA,WAAA,CAAAI,EACA,cAAA,CAAAiD,CAAAA,CACA,YAAA,CAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,YAAA,CAAAxC,CAAAA,CACA,kBAAAC,CAAAA,CACA,iBAAA,CAAAwC,CAAAA,CACA,eAAA,CAAAC,EACA,KAAA,CAAA/H,CAAAA,CACA,SAAA,CAAAmF,CAAAA,CACA,WAAAC,CAAAA,CACA,SAAA,CAAA4C,CAAAA,CACA,UAAA,CAAAzI,CAAAA,CACA,SAAA,CAAA0I,CACF,CAAA,CAAgB,CACd,GAAM,CAAE,CAAA,CAAAlE,CAAE,EAAImC,mBAAAA,EAAe,CAE7B,OACEO,eAAAA,CAAC,OAAI,SAAA,CAAWyB,KAAAA,CAAG,mBAAA,CAAqBD,CAAS,CAAA,CAE/C,QAAA,CAAA,CAAAxB,eAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,WAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,kCAAA,CACV,QAAA,CAAAxC,CAAAA,CAAE,iBAAiB,CAAA,CACtB,CAAA,CACA0C,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yDAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,OAAI,SAAA,CAAU,yBAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,OAAI,SAAA,CAAU,QAAA,CACb,QAAA,CAAAA,cAAAA,CAAC4B,SAAA,CACC,IAAA,CAAK,QAAA,CACL,KAAA,CAAO7D,CAAAA,EAAU,EAAA,CACjB,QAAA,CAAWpE,CAAAA,EAAMyH,EAAezH,CAAAA,CAAE,MAAA,CAAO,KAAA,EAAS,MAAS,EAC3D,WAAA,CAAY,GAAA,CACZ,UAAA,CAAY,CACV,aAAcgI,KAAAA,CACZ,yBAAA,CACA,yEAAA,CACA,0GACF,CAAA,CACA,KAAA,CAAOA,KAAAA,CACL,kDAAA,CACA,4EACA,gEACF,CACF,CAAA,CACF,CAAA,CACF,EACA3B,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gDAAA,CACb,SAAAA,cAAAA,CAACa,SAAAA,CAAA,CACC,SAAA,CAAWc,KAAAA,CACT,6DAAA,CACApE,CAAAA,CAAY,iBAAA,CAAoB,cAClC,CAAA,CACA,aAAA,CAAa,IAAA,CACb,YAAA,CACEA,CAAAA,EAAW,KAAA,CACTyC,cAAAA,CAACM,SAAAA,CAAA,CACC,IAAA,CAAK,IAAA,CACL,GAAA,CAAK/C,CAAAA,CAAU,KAAA,CACf,IAAA,CAAMA,CAAAA,CAAU,MAAA,CAChB,UAAU,SAAA,CACZ,CAAA,CACE,IAAA,CAEN,UAAA,CACEyC,eAACe,kBAAAA,CAAA,CACC,KAAA,CAAO,EAAA,CACP,OAAQ,EAAA,CACR,SAAA,CAAU,cAAA,CACZ,CAAA,CAEF,OAAA,CAAS,IAAMQ,CAAAA,CAAkB,EAAE,EAElC,QAAA,CAAAhE,CAAAA,CAAYA,CAAAA,CAAU,MAAA,CAASC,EAAE,wBAAwB,CAAA,CAC5D,CAAA,CACF,CAAA,CAAA,CACF,EAEA0C,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8CAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8BAA8B,QAAA,CAAA,CAAA,UAAA,CACvCO,EAAAA,CAAUtC,CAAW,CAAA,CAAA,CAC3B,EACCP,CAAAA,EACCsC,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8CACb,QAAA,CAAA,CAAAF,cAAAA,CAACO,EAAAA,CAAA,EAAkB,CAAA,CACnBL,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,eACb,QAAA,CAAA,CAAAM,EAAAA,CAAa5C,CAAAA,CAAY,MAAM,EAAE,GAAA,CAAEA,CAAAA,CAAY,MAAA,CAAA,CAClD,CAAA,CACCyD,GACCrB,cAAAA,CAAC,MAAA,CAAA,CACC,SAAA,CAAU,6BAAA,CACV,OAAA,CAASqB,CAAAA,CAER,QAAA,CAAA7D,CAAAA,CAAE,iBAAiB,CAAA,CACtB,CAAA,CAED8D,CAAAA,EACCtB,cAAAA,CAAC,QACC,SAAA,CAAU,6BAAA,CACV,OAAA,CAASsB,CAAAA,CAER,SAAA9D,CAAAA,CAAE,YAAY,CAAA,CACjB,CAAA,CAAA,CAEJ,CAAA,CAAA,CAEJ,CAAA,CAECqB,CAAAA,EACCmB,cAAAA,CAAC,KAAE,SAAA,CAAU,0CAAA,CACV,QAAA,CAAAnB,CAAAA,CAAW,QACd,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CAGAqB,eAAAA,CAAC,OAAI,SAAA,CAAU,gBAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,kCAAA,CAAoC,QAAA,CAAAxC,EAAE,eAAe,CAAA,CAAE,CAAA,CACpE0C,eAAAA,CAAC,OAAI,SAAA,CAAU,yDAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,OAAI,SAAA,CAAU,yBAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,QAAA,CACb,QAAA,CAAAA,eAAC4B,QAAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,KAAA,CAAO9C,CAAAA,EAAgB,EAAA,CACvB,QAAA,CAAQ,KACR,WAAA,CAAY,GAAA,CACZ,UAAA,CAAY,CACV,YAAA,CAAc6C,KAAAA,CACZ,yBAAA,CACA,yEAAA,CACA,0GACF,CAAA,CACA,KAAA,CAAOA,KAAAA,CACL,kDAAA,CACA,4EACA,gEACF,CACF,CAAA,CACF,CAAA,CACF,EACA3B,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gDAAA,CACb,QAAA,CAAAA,cAAAA,CAACa,SAAAA,CAAA,CACC,UAAWc,KAAAA,CACT,6DAAA,CACAlE,CAAAA,CAAU,iBAAA,CAAoB,cAChC,CAAA,CACA,aAAA,CAAa,IAAA,CACb,YAAA,CACEA,GAAS,KAAA,CACPuC,cAAAA,CAACM,SAAAA,CAAA,CACC,IAAA,CAAK,IAAA,CACL,GAAA,CAAK7C,CAAAA,CAAQ,MACb,IAAA,CAAMA,CAAAA,CAAQ,MAAA,CACd,SAAA,CAAU,UACZ,CAAA,CACE,IAAA,CAEN,UAAA,CACEuC,cAAAA,CAACe,mBAAA,CACC,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,EAAA,CACR,SAAA,CAAU,cAAA,CACZ,CAAA,CAEF,QAAS,IAAMS,CAAAA,CAAgB,EAAE,CAAA,CAEhC,SAAA/D,CAAAA,CAAUA,CAAAA,CAAQ,MAAA,CAASD,CAAAA,CAAE,wBAAwB,CAAA,CACxD,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAEA0C,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8CAAA,CACb,UAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6BAAA,CAA8B,qBACvCO,EAAAA,CAAU1B,CAAiB,CAAA,CAAA,CACjC,CAAA,CACCjB,GACCoC,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6CAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAACO,EAAAA,CAAA,EAAkB,EACnBL,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,cAAA,CACb,UAAAM,EAAAA,CAAa1C,CAAAA,CAAU,MAAM,CAAA,CAAE,IAAEA,CAAAA,CAAU,MAAA,CAAA,CAC9C,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAGAkC,cAAAA,CAACa,UAAA,CACC,SAAA,CAAS,IAAA,CACT,KAAA,CAAM,UACN,SAAA,CAAU,sBAAA,CACV,aAAA,CAAa,IAAA,CACb,WAAY,CAACpH,CAAAA,CACb,SAAA,CAAW,CAACA,CAAAA,EAASmF,CAAAA,CACrB,OAAA,CAAS6C,CAAAA,CAER,SACGjE,CAAAA,CADHxE,CAAAA,CACK,qBAAA,CACF4F,CAAAA,CACI,yBAAA,CACA,iBAHmB,CAAA,CAI7B,CAAA,CAAA,CACF,CAEJ,CAEA,SAAS2B,EAAAA,EAAoB,CAC3B,OACEL,eAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAM,6BACN,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,EAAA,CACR,QAAQ,WAAA,CACR,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,eACP,WAAA,CAAa,CAAA,CACb,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CACf,SAAA,CAAU,cAAA,CAEV,UAAAF,cAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,+BAAA,CAAgC,EACxCA,cAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,6BAAA,CAA8B,EACtCA,cAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,4BAAA,CAA6B,CAAA,CAAA,CACvC,CAEJ,CAEA,SAASS,GAAUpC,CAAAA,CAAmC,CACpD,GAAI,CAACA,EAAO,OAAO,MAAA,CACnB,IAAM4C,CAAAA,CAAI,OAAO5C,CAAK,CAAA,CACtB,OAAK,MAAA,CAAO,QAAA,CAAS4C,CAAC,CAAA,CACfA,CAAAA,CAAE,eAAe,OAAA,CAAS,CAC/B,qBAAA,CAAuB,CAAA,CACvB,sBAAuB,CACzB,CAAC,CAAA,CAJ+B,MAKlC,CAEA,SAAST,EAAAA,CAAanC,CAAAA,CAAmC,CACvD,GAAI,CAACA,CAAAA,CAAO,OAAO,IACnB,IAAM4C,CAAAA,CAAI,MAAA,CAAO5C,CAAK,EACtB,OAAK,MAAA,CAAO,QAAA,CAAS4C,CAAC,EAClBA,CAAAA,EAAK,GAAA,CAAA,CAEJA,CAAAA,CAAI,GAAA,EAAW,cAAA,CAAe,OAAA,CAAS,CAAE,qBAAA,CAAuB,CAAE,CAAC,CAAA,CACpE,GAAA,CAEAA,CAAAA,EAAK,KAEJA,CAAAA,CAAI,GAAA,EAAO,cAAA,CAAe,OAAA,CAAS,CAAE,qBAAA,CAAuB,CAAE,CAAC,CAAA,CAAI,GAAA,CAEjEA,CAAAA,CAAE,cAAA,CAAe,OAAA,CAAS,CAAE,qBAAA,CAAuB,CAAE,CAAC,CAAA,CAV7B,GAWlC,CC7PO,SAASY,EAAAA,CAAW,CACzB,KAAA,CAAAzL,CAAAA,CACA,KAAA0L,CAAAA,CACA,EAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,SAAA,CAAAN,CACF,CAAA,CAAoB,CAClB,IAAMO,CAAAA,CAASzF,EAAAA,CAAc,CAAE,KAAA,CAAApG,CAAAA,CAAO,IAAA,CAAA0L,CAAAA,CAAM,GAAAC,CAAAA,CAAI,UAAA,CAAAC,CAAW,CAAC,EACtD,CAAE,MAAA,CAAA1C,CAAAA,CAAQ,MAAA,CAAA4C,EAAQ,YAAA,CAAA3C,CAAAA,CAAc,OAAA,CAAA4C,CAAQ,CAAA,CAAIC,gBAAAA,EAAc,CAE1DC,CAAAA,CAAgB/I,kBAAY,SAAY,CAC5C,MAAM2I,CAAAA,CAAO,MAAK,CAClBE,CAAAA,GACF,CAAA,CAAG,CAACF,CAAAA,CAAQE,CAAO,CAAC,CAAA,CAEpB,OACEjC,eAAAA,CAAAoC,mBAAAA,CAAA,CACE,UAAAtC,cAAAA,CAACmB,EAAAA,CAAA,CACC,SAAA,CAAWc,EAAO,SAAA,CAClB,OAAA,CAASA,CAAAA,CAAO,OAAA,CAChB,YAAaA,CAAAA,CAAO,WAAA,CACpB,SAAA,CAAWA,CAAAA,CAAO,SAAA,CAClB,MAAA,CAAQA,CAAAA,CAAO,MAAA,CACf,YAAaA,CAAAA,CAAO,WAAA,CACpB,cAAA,CAAgBA,CAAAA,CAAO,SAAA,CACvB,YAAA,CAAcA,CAAAA,CAAO,aAAA,CACrB,YAAaA,CAAAA,CAAO,YAAA,CACpB,YAAA,CAAcA,CAAAA,CAAO,YAAA,CACrB,iBAAA,CAAmBA,CAAAA,CAAO,iBAAA,CAC1B,kBAAmBA,CAAAA,CAAO,mBAAA,CAC1B,eAAA,CAAiBA,CAAAA,CAAO,kBACxB,KAAA,CAAOA,CAAAA,CAAO,KAAA,CACd,SAAA,CAAWA,EAAO,SAAA,CAClB,UAAA,CAAYA,CAAAA,CAAO,UAAA,CACnB,SAAA,CAAWC,CAAAA,CACX,UAAA,CAAYD,CAAAA,CAAO,WACnB,SAAA,CAAWP,CAAAA,CACb,CAAA,CACA1B,cAAAA,CAACX,GAAA,CACC,MAAA,CAAQC,CAAAA,CACR,YAAA,CAAcC,EACd,SAAA,CAAW0C,CAAAA,CAAO,SAAA,CAClB,OAAA,CAASA,CAAAA,CAAO,OAAA,CAChB,WAAA,CAAaA,CAAAA,CAAO,YACpB,WAAA,CAAaA,CAAAA,CAAO,MAAA,CACpB,gBAAA,CAAkBA,EAAO,WAAA,CACzB,YAAA,CAAcA,CAAAA,CAAO,YAAA,CACrB,kBAAmBA,CAAAA,CAAO,iBAAA,CAC1B,KAAA,CAAOA,CAAAA,CAAO,KAAA,CACd,SAAA,CAAWA,CAAAA,CAAO,SAAA,CAClB,WAAYA,CAAAA,CAAO,UAAA,CACnB,SAAA,CAAWI,CAAAA,CACX,UAAA,CAAYJ,CAAAA,CAAO,UAAA,CACrB,CAAA,CAAA,CACF,CAEJ,CChDA,SAASM,EAAAA,CAAqBnM,CAAAA,CAAoC,CAChE,IAAMoM,CAAAA,CAASzK,CAAAA,CAAyB3B,CAAK,CAAA,CACvCwB,CAAAA,CAAeD,sBAAAA,CAAevB,CAAK,GAAG,MAAA,EAAU,KAAA,CACtD,OAAO,CACL,IAAK,CACH,aAAA,CAAekB,EAAAA,CAAqBM,CAAY,CAAA,CAChD,OAAA,CAAS,CAAC,CAAE,GAAG4K,CAAO,CAAA,CAAG,CAAE,GAAGA,CAAO,CAAA,CAAG,CAAE,GAAGA,CAAO,CAAC,CACvD,CAAA,CACA,IAAA,CAAM,CACJ,iBAAA,CAAmB,CAAC,GAAGhL,EAAwB,EAC/C,OAAA,CAAS,CAAC,CAAE,GAAGgL,CAAO,CAAA,CAAG,CAAE,GAAGA,CAAO,EAAG,CAAE,GAAGA,CAAO,CAAC,CACvD,CACF,CACF,KAEaC,EAAAA,CACXF,EAAAA,CAAqB,WAAoB,EAM3C,SAAStM,EAAAA,CAAWG,CAAAA,CAAe,CACjC,OAAO,kCAAkCA,CAAK,CAAA,CAChD,CAEA,SAASsM,EAAAA,CACPtM,CAAAA,CACAuM,CAAAA,CACsB,CACtB,GAAI,CACF,IAAMvG,CAAAA,CAAM,YAAA,CAAa,QAAQnG,EAAAA,CAAW,MAAA,CAAOG,CAAK,CAAC,CAAC,CAAA,CAC1D,GAAIgG,CAAAA,CAAK,OAAO,IAAA,CAAK,KAAA,CAAMA,CAAG,CAChC,MAAQ,CAER,CACA,OAAOuG,CACT,CAEA,SAASC,EAAAA,CAAoBxM,CAAAA,CAAeyM,CAAAA,CAAgC,CAC1E,GAAI,CACF,YAAA,CAAa,OAAA,CAAQ5M,EAAAA,CAAWG,CAAK,CAAA,CAAG,IAAA,CAAK,UAAUyM,CAAQ,CAAC,EAClE,CAAA,KAAQ,CAER,CACF,CAMA,IAAMC,GAAsBC,mBAAAA,CAC1B,IACF,CAAA,CAGO,SAASC,EAAAA,EAA4C,CAC1D,IAAMC,CAAAA,CAAMC,iBAAWJ,EAAmB,CAAA,CAC1C,GAAI,CAACG,EACH,MAAM,IAAI,KAAA,CACR,6DACF,EAEF,OAAOA,CACT,CAaO,SAASE,EAAAA,CAAqB,CACnC,KAAA,CAAA/M,CAAAA,CACA,aAAAC,CAAAA,CACA,QAAA,CAAU+M,CAAAA,CACV,gBAAA,CAAAC,EACA,QAAA,CAAAC,CACF,CAAA,CAA8B,CAC5B,IAAM5L,CAAAA,CAAcwC,aAAAA,CAAQ,IAAMvC,sBAAAA,CAAevB,CAAK,CAAA,CAAG,CAACA,CAAK,CAAC,CAAA,CAC1DmN,CAAAA,CAAeH,CAAAA,GAAuB,MAAA,CACtCI,EAAgBtJ,aAAAA,CAAQ,IAAMqI,EAAAA,CAAqBnM,CAAK,EAAG,CAACA,CAAK,CAAC,CAAA,CAGlE,CAACqN,CAAAA,CAAeC,CAAgB,CAAA,CAAIxK,eACxC,IACEqK,CAAAA,CAAeC,CAAAA,CAAgBd,EAAAA,CAAmBtM,EAAOoN,CAAa,CAC1E,CAAA,CAEMX,CAAAA,CAAWU,EAAeH,CAAAA,CAAqBK,CAAAA,CAE/CE,CAAAA,CAAcrK,iBAAAA,CACjB+B,CAAAA,EAA+B,CAC1BkI,CAAAA,CACFF,CAAAA,GAAmBhI,CAAI,CAAA,EAEvBqI,CAAAA,CAAiBrI,CAAI,CAAA,CACrBuH,GAAoB,MAAA,CAAOxM,CAAK,CAAA,CAAGiF,CAAI,GAE3C,CAAA,CACA,CAACkI,CAAAA,CAAcF,CAAAA,CAAkBjN,CAAK,CACxC,CAAA,CAEMwN,CAAAA,CAAoBtK,kBACvBuK,CAAAA,EAAqBF,CAAAA,CAAY,CAAE,GAAGd,EAAU,GAAA,CAAAgB,CAAI,CAAC,CAAA,CACtD,CAAChB,CAAAA,CAAUc,CAAW,CACxB,CAAA,CAEMG,CAAAA,CAAqBxK,iBAAAA,CACxByK,CAAAA,EAAuBJ,CAAAA,CAAY,CAAE,GAAGd,CAAAA,CAAU,IAAA,CAAAkB,CAAK,CAAC,CAAA,CACzD,CAAClB,CAAAA,CAAUc,CAAW,CACxB,CAAA,CAGM,CAAC3L,CAAAA,CAAWgM,CAAY,CAAA,CAAI9K,cAAAA,CAAyB,KAAK,CAAA,CAC1D,CAAC6E,CAAAA,CAAQC,CAAS,CAAA,CAAI9E,cAAAA,EAA6B,CACnD,CAAC+K,CAAAA,CAAWC,CAAY,EAAIhL,cAAAA,CAAS,CAAC,CAAA,CACtC,CAACiL,CAAAA,CAAYC,CAAa,CAAA,CAAIlL,cAAAA,CAAS,CAAC,CAAA,CAExCmL,CAAAA,CAAgBnK,aAAAA,CAAQ,IAAMnC,EAAyB3B,CAAK,CAAA,CAAG,CAACA,CAAK,CAAC,CAAA,CAEtEkO,CAAAA,CAAsBpK,aAAAA,CAAQ,IAAM,CACxC,IAAMqK,CAAAA,CAAMvM,CAAAA,GAAc,MAAQiM,CAAAA,CAAYE,CAAAA,CAG9C,OAAA,CADEnM,CAAAA,GAAc,MAAQ6K,CAAAA,CAAS,GAAA,CAAI,OAAA,CAAUA,CAAAA,CAAS,KAAK,OAAA,EAC9C0B,CAAG,CAAA,EAAKF,CACzB,CAAA,CAAG,CAACrM,CAAAA,CAAWiM,CAAAA,CAAWE,EAAYtB,CAAAA,CAAUwB,CAAa,CAAC,CAAA,CAExDhG,EAAQnE,aAAAA,CACZ,KAAO,CACL,KAAA,CAAA9D,EACA,YAAA,CAAAC,CAAAA,CACA,WAAA,CAAAqB,CAAAA,CACA,SAAA,CAAAM,CAAAA,CACA,YAAA,CAAAgM,CAAAA,CACA,OAAAjG,CAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,SAAA,CAAAiG,EACA,YAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,cAAAC,CAAAA,CACA,QAAA,CAAAvB,CAAAA,CACA,iBAAA,CAAAe,CAAAA,CACA,kBAAA,CAAAE,CAAAA,CACA,mBAAA,CAAAQ,CACF,CAAA,CAAA,CACA,CACElO,CAAAA,CACAC,CAAAA,CACAqB,EACAM,CAAAA,CACA+F,CAAAA,CACAkG,CAAAA,CACAE,CAAAA,CACAtB,EACAe,CAAAA,CACAE,CAAAA,CACAQ,CACF,CACF,CAAA,CAEA,OACEtE,cAAAA,CAAC8C,EAAAA,CAAoB,SAApB,CAA6B,KAAA,CAAOzE,CAAAA,CAClC,QAAA,CAAAiF,EACH,CAEJ,CCtKA,IAAMtH,EAAAA,CAAkB,IAAA,CAClBD,EAAAA,CAAgB,GAAA,CAYf,SAASyI,EAAAA,CACdnK,CAAAA,CAC6B,CAC7B,GAAM,CAAE,KAAA,CAAAjE,CAAAA,CAAO,YAAA,CAAAC,EAAc,eAAA,CAAAoO,CAAAA,CAAiB,WAAA,CAAAC,CAAY,EAAIrK,CAAAA,CACxD,CAAE,CAAA,CAAAmD,CAAE,CAAA,CAAImC,mBAAAA,EAAe,CAEvBsD,CAAAA,CAAMD,IAAgB,CAEtBtL,CAAAA,CAAcwC,aAAAA,CAAQ,IAAMvC,uBAAevB,CAAK,CAAA,CAAG,CAACA,CAAK,CAAC,CAAA,CAC1DuO,CAAAA,CAAezK,aAAAA,CAAQ,IAAM0K,uBAAAA,CAAgBxO,CAAK,CAAA,CAAG,CAACA,CAAK,CAAC,CAAA,CAG5DqG,CAAAA,CAAUC,0BAAAA,GACVC,CAAAA,CAAKkI,wBAAAA,CAAiBzO,CAAK,CAAA,CAC3BoD,EAASU,aAAAA,CACb,IAAMuC,CAAAA,CAAQ,IAAA,CAAM,CAAA,EAAM,CAAA,CAAE,cAAA,GAAmBE,CAAAA,EAAM,EAAE,WAAW,CAAA,CAClE,CAACF,CAAAA,CAASE,CAAE,CACd,CAAA,CACME,CAAAA,CAAgBrD,GAAQ,OAAA,EAAW,EAAA,CAGnC4D,CAAAA,CAAiBlD,aAAAA,CAAQ,IAAM,CACnC,IAAM4K,CAAAA,CAAQ,CAACzO,CAAY,CAAA,CAC3B,OAAIqB,CAAAA,EAAaoN,EAAM,IAAA,CAAKpN,CAAAA,CAAY,OAAO,CAAA,CAC3CiN,GAAcG,CAAAA,CAAM,IAAA,CAAKH,CAAAA,CAAa,OAAO,CAAA,CAC1CG,CAAAA,CAAM,MAAA,CAAO,OAAO,CAC7B,CAAA,CAAG,CAACzO,CAAAA,CAAcqB,CAAAA,CAAaiN,CAAY,CAAC,CAAA,CAEtCtH,CAAAA,CAAcC,sBAAAA,CAClB,CAAE,KAAA,CAAAlH,CAAAA,CAAO,SAAA,CAAWgH,CAAe,CAAA,CACnC,CAAE,OAAA,CAASA,CAAAA,CAAe,OAAS,CAAA,CAAG,eAAA,CAAiBrB,EAAc,CACvE,EAEMgJ,CAAAA,CAAY7K,aAAAA,CAChB,IAAMmD,CAAAA,CAAY,MAAM,IAAA,CAAMG,CAAAA,EAAMA,CAAAA,CAAE,OAAA,GAAYnH,CAAY,CAAA,EAAK,IAAA,CACnE,CAACgH,EAAY,IAAA,CAAMhH,CAAY,CACjC,CAAA,CAGMqH,CAAAA,CAAgBC,wCAAAA,CACpB,CAAE,KAAA,CAAAvH,EAAO,OAAA,CAASyG,CAAAA,CAAe,cAAA,CAAAO,CAAe,CAAA,CAChD,CACE,OAAA,CAAS,CAAC,CAACP,CAAAA,EAAiBO,CAAAA,CAAe,MAAA,CAAS,CAAA,CACpD,gBAAiBpB,EACnB,CACF,CAAA,CAEMgJ,CAAAA,CAAatN,GAAa,OAAA,EAAWiN,CAAAA,EAAc,OAAA,EAAW,EAAA,CAC9DM,CAAAA,CAAgB/K,aAAAA,CACpB,IAAMwD,CAAAA,CAAc,MAAM,IAAA,CAAMG,CAAAA,EAAMA,CAAAA,CAAE,OAAA,GAAYmH,CAAU,CAAA,EAAK,IAAA,CACnE,CAACtH,CAAAA,CAAc,KAAMsH,CAAU,CACjC,CAAA,CACME,CAAAA,CAAehL,aAAAA,CACnB,IAAMwD,CAAAA,CAAc,IAAA,EAAM,KAAMG,CAAAA,EAAMA,CAAAA,CAAE,OAAA,GAAYxH,CAAY,GAAK,IAAA,CACrE,CAACqH,CAAAA,CAAc,IAAA,CAAMrH,CAAY,CACnC,CAAA,CAGM,CAAC8O,CAAAA,CAAcC,CAAe,CAAA,CAAIlM,cAAAA,CAAS,KAAK,EAChDmM,CAAAA,CAAoBjM,YAAAA,CAAsB,IAAI,CAAA,CAE9CkM,EAAoBhM,iBAAAA,CAAakJ,CAAAA,EAAmB,CACxD,IAAM+C,EAAOF,CAAAA,CAAkB,OAAA,CAC/BA,CAAAA,CAAkB,OAAA,CAAU7C,CAAAA,CAC5B4C,CAAAA,CAAiBjK,CAAAA,EACfoK,CAAAA,GAAS,MAAQA,CAAAA,GAAS/C,CAAAA,CAAS,IAAA,CAAO,CAACrH,CAC7C,EACF,CAAA,CAAG,EAAE,EAGCqK,CAAAA,CAAiBpM,YAAAA,CAAOqL,CAAe,CAAA,CAC7Ce,CAAAA,CAAe,OAAA,CAAUf,CAAAA,CACzB,IAAMgB,EAAarM,YAAAA,CAAOsL,CAAW,CAAA,CACrCe,CAAAA,CAAW,QAAUf,CAAAA,CAErB,GAAM,CAAE,IAAA,CAAM1F,EAAS,UAAA,CAAAhG,CAAW,CAAA,CAAIJ,EAAAA,CAAQ,CAC5C,WAAA,CAAcqB,CAAAA,EAAWuL,CAAAA,CAAe,UAAUvL,CAAM,CAAA,CACxD,OAAA,CAAS,CAACL,EAAK8L,CAAAA,GAAUD,CAAAA,CAAW,OAAA,GAAU7L,CAAAA,CAAK8L,CAAK,CAC1D,CAAC,CAAA,CAEKrM,CAAAA,CAAOC,iBAAAA,CAAY,SAAY,CACnC,GAAI,CAAC2J,CAAAA,CAAI,MAAA,EAAU,CAACzJ,CAAAA,EAAU,CAACnD,CAAAA,CAAc,OAE7C,IAAMsP,EAAiBjO,CAAAA,EAAa,QAAA,EAAY,CAAA,CAC1CkO,CAAAA,CAAejB,CAAAA,EAAc,OAAA,EAAWjN,CAAAA,EAAa,OAAA,EAAW,GAEhEmO,CAAAA,CAAQ5C,CAAAA,CAAI,SAAA,GAAc,KAAA,CAC1BnB,GAAO+D,CAAAA,CAAQD,CAAAA,CAAevP,CAAAA,CAC9B0L,EAAAA,CAAK8D,EAAQxP,CAAAA,CAAeuP,CAAAA,CAE5BzJ,EAAAA,CAAW0J,CAAAA,CAAQF,CAAAA,CAAkBZ,CAAAA,EAAW,QAAA,EAAY,CAAA,CAC5D9G,GAAmB,IAAI6H,mBAAAA,CAAU7C,CAAAA,CAAI,MAAM,EAC9C,SAAA,CAAU9G,EAAQ,CAAA,CAClB,aAAA,CAAc,CAAC,CAAA,CACf,QAAA,EAAS,CAENqG,EAAAA,CAASS,CAAAA,CAAI,mBAAA,CACb8C,CAAAA,CAAehO,CAAAA,CAAyB3B,CAAK,CAAA,CAC7C4P,CAAAA,CAAWxD,EAAAA,CAAO,QAAA,EAAYuD,EAAa,QAAA,EAAY,CAAA,CACvDE,EAAAA,CAAYzD,EAAAA,CAAO,UAAY,KAAA,CAE/B0D,EAAAA,CAAerO,qBAAAA,CAAczB,CAAK,CAAA,CACpC,CACE,WAAA,CAAa,IAAI0P,oBACftD,EAAAA,CAAO,WAAA,EAAeuD,CAAAA,CAAa,WAAA,EAAe,CACpD,CAAA,CACG,SAAA,CAAUJ,CAAc,CAAA,CACxB,cAAc,CAAC,CAAA,CACf,QAAA,EAAS,CACZ,MAAA,CAAQ,IAAIG,mBAAAA,CAAUtD,EAAAA,CAAO,QAAUuD,CAAAA,CAAa,MAAA,EAAU,CAAC,CAAA,CAC5D,UAAUJ,CAAc,CAAA,CACxB,aAAA,CAAc,CAAC,EACf,QAAA,EAAS,CACZ,SAAA,CAAAM,EACF,CAAA,CACA,EAAC,CAEL,GAAI,CACF,MAAMjH,CAAAA,CAAQ,CACZ,KAAA,CAAA5I,EACA,MAAA,CAAAoD,CAAAA,CACA,KAAA,CAAOsI,EAAAA,CACP,OAAQC,EAAAA,CACR,MAAA,CAAQ9D,EAAAA,CACR,QAAA,CAAA+H,CAAAA,CACA,GAAGE,EACL,CAAC,EACDjD,CAAAA,CAAI,SAAA,CAAU,KAAA,CAAS,EACzB,MAAQ,CAER,CACF,CAAA,CAAG,CACDA,EACAzJ,CAAAA,CACAnD,CAAAA,CACAqB,CAAAA,CACAiN,CAAAA,CACAI,CAAAA,CACA3O,CAAAA,CACA4I,CACF,CAAC,EAGKmH,CAAAA,CAAajM,aAAAA,CAAQ,IAAM,CAC/B,IAAMkM,CAAAA,CAAM5I,CAAAA,CAAEyF,CAAAA,CAAI,YAAc,KAAA,CAAQ,YAAA,CAAe,aAAa,CAAA,CACpE,GAAI,CAACA,CAAAA,CAAI,MAAA,CAAQ,OAAOmD,CAAAA,CAExB,IAAMC,CAAAA,CAAqB,CAAA,EAAA,EAAK7I,EAAE,2BAA2B,CAAC,CAAA,CAAA,CAAA,CAE9D,GAAIyF,EAAI,SAAA,GAAc,KAAA,CAAO,CAC3B,IAAM1E,EAAAA,CAAM0G,CAAAA,EAAe,MAAA,CAC3B,GAAI1G,IAAO,IAAIuH,mBAAAA,CAAUvH,EAAG,CAAA,CAAE,GAAG0E,CAAAA,CAAI,MAAM,CAAA,CACzC,OAAO,GAAGmD,CAAG,CAAA,EAAGC,CAAkB,CAAA,CAAA,CAEpC,IAAM9O,EAAAA,CAASG,CAAAA,EAAa,MAAA,EAAU,GAChC4O,EAAAA,CAAcjJ,CAAAA,CAAY,IAAA,EAAM,IAAA,CACnCkJ,IAAOA,EAAAA,CAAG,OAAA,GAAYvB,CACzB,CAAA,EAAG,YAAY,UAAA,CACf,GAAIsB,EAAAA,CAAa,CACf,IAAME,EAAAA,CAAMC,uBAAAA,CACV,IAAIX,oBAAU7C,CAAAA,CAAI,MAAM,CAAA,CAAE,KAAA,CAAM,OAAOqD,EAAW,CAAC,CACrD,CAAA,CACA,OAAO9I,CAAAA,CAAE,uBAAA,CAAyB,CAChC,MAAA,CAAQyF,CAAAA,CAAI,MAAA,CACZ,MAAA,CAAA1L,EAAAA,CACA,IAAAiP,EACF,CAAC,CACH,CACA,OAAOhJ,CAAAA,CAAE,4BAAA,CAA8B,CACrC,MAAA,CAAQyF,EAAI,MAAA,CACZ,MAAA,CAAA1L,EACF,CAAC,CACH,CAGA,IAAMgH,CAAAA,CAAM2G,GAAc,MAAA,CAC1B,OAAI3G,CAAAA,EAAO,IAAIuH,oBAAUvH,CAAG,CAAA,CAAE,EAAA,CAAG0E,CAAAA,CAAI,MAAM,CAAA,CAClC,CAAA,EAAGmD,CAAG,CAAA,EAAGC,CAAkB,CAAA,CAAA,CAC7BD,CACT,CAAA,CAAG,CACD5I,CAAAA,CACAyF,CAAAA,CAAI,SAAA,CACJA,CAAAA,CAAI,OACJgC,CAAAA,CACAC,CAAAA,CACAxN,CAAAA,CACA2F,CAAAA,CAAY,KACZ2H,CACF,CAAC,CAAA,CAEK0B,CAAAA,CAAa,CAACzD,CAAAA,CAAI,MAAA,EAAU,CAACzJ,GAAU,CAACnD,CAAAA,CACxC+I,EAAAA,CAAY/B,CAAAA,CAAY,SAAA,EAAaK,CAAAA,CAAc,SAAA,CAEzD,OAAOxD,cACL,KAAO,CACL,KAAA,CAAA9D,CAAAA,CACA,YAAA,CAAAC,CAAAA,CACA,WAAA,CAAAqB,CAAAA,CACA,UAAAqN,CAAAA,CACA,aAAA,CAAAE,CAAAA,CACA,YAAA,CAAAC,EACA,SAAA,CAAWjC,CAAAA,CAAI,SAAA,CACf,YAAA,CAAcA,EAAI,YAAA,CAClB,MAAA,CAAQA,CAAAA,CAAI,MAAA,CACZ,SAAA,CAAWA,CAAAA,CAAI,SAAA,CACf,SAAA,CAAWA,EAAI,SAAA,CACf,YAAA,CAAcA,CAAAA,CAAI,YAAA,CAClB,WAAYA,CAAAA,CAAI,UAAA,CAChB,aAAA,CAAeA,CAAAA,CAAI,cACnB,mBAAA,CAAqBA,CAAAA,CAAI,mBAAA,CACzB,QAAA,CAAUA,CAAAA,CAAI,QAAA,CACd,iBAAA,CAAmBA,CAAAA,CAAI,kBACvB,kBAAA,CAAoBA,CAAAA,CAAI,kBAAA,CACxB,YAAA,CAAAkC,EACA,iBAAA,CAAAG,CAAAA,CACA,IAAA,CAAAjM,CAAAA,CACA,WAAAL,CAAAA,CACA,UAAA,CAAAmN,CAAAA,CACA,UAAA,CAAAO,CAAAA,CACA,SAAA,CAAAtH,EACF,CAAA,CAAA,CACA,CACEhJ,CAAAA,CACAC,CAAAA,CACAqB,CAAAA,CACAqN,CAAAA,CACAE,CAAAA,CACAC,CAAAA,CACAjC,CAAAA,CACAkC,CAAAA,CACAG,EACAjM,CAAAA,CACAL,CAAAA,CACAmN,CAAAA,CACAO,CAAAA,CACAtH,EACF,CACF,CACF,CCxPO,SAASuH,EAAAA,CAAa,CAC3B,MAAAtI,CAAAA,CACA,QAAA,CAAAuI,CAAAA,CACA,KAAA,CAAAxQ,CAAAA,CACA,gBAAA,CAAAyQ,CAAAA,CACA,SAAA,CAAAnF,CACF,CAAA,CAAsB,CACpB,IAAMoF,CAAAA,CAASxN,kBACZyN,CAAAA,EAAsCH,CAAAA,CAAS,CAAE,GAAGvI,EAAO,GAAG0I,CAAM,CAAC,CAAA,CACtE,CAAC1I,CAAAA,CAAOuI,CAAQ,CAClB,EAEMI,CAAAA,CAAW9M,aAAAA,CAAQ,IAAMzC,EAAAA,CAAuBrB,CAAK,CAAA,CAAG,CAACA,CAAK,CAAC,EAE/D6Q,CAAAA,CACJD,CAAAA,CAAS,OAAA,GAAY,QAAA,CAChB,QAAA,CACA,aAAA,CAEP,OACE9G,eAAAA,CAAC,OAAI,SAAA,CAAWyB,KAAAA,CAAG,WAAA,CAAaD,CAAS,EACvC,QAAA,CAAA,CAAA1B,cAAAA,CAACkH,EAAAA,CAAA,CACC,MAAO7I,CAAAA,CAAM,QAAA,CACb,QAAA,CAAW8I,CAAAA,EAAML,CAAAA,CAAO,CAAE,QAAA,CAAUK,CAAE,CAAC,CAAA,CACzC,CAAA,CACAnH,cAAAA,CAACoH,EAAAA,CAAA,CACC,KAAA,CAAO/I,CAAAA,CAAM4I,CAAM,CAAA,CACnB,SAAWE,CAAAA,EAAML,CAAAA,CAAO,CAAE,CAACG,CAAM,EAAGE,CAAE,CAAC,EACvC,OAAA,CAASH,CAAAA,CAAS,OAAA,CAClB,MAAA,CAAQA,EAAS,OAAA,CACjB,QAAA,CAAUA,CAAAA,CAAS,WAAA,CACrB,EACCA,CAAAA,CAAS,UAAA,EACRhH,cAAAA,CAACqH,EAAAA,CAAA,CACC,KAAA,CAAOhJ,CAAAA,CAAM,MAAA,CACb,SAAW8I,CAAAA,EAAML,CAAAA,CAAO,CAAE,MAAA,CAAQK,CAAE,CAAC,CAAA,CACrC,MAAA,CAAQH,EAAS,UAAA,CACjB,QAAA,CAAUA,CAAAA,CAAS,cAAA,CACrB,CAAA,CAEDA,CAAAA,CAAS,WAAA,EACR9G,eAAAA,CAAAoC,oBAAA,CACE,QAAA,CAAA,CAAAtC,cAAAA,CAACsH,EAAAA,CAAA,CACC,KAAA,CAAOjJ,CAAAA,CAAM,OAAA,CACb,QAAA,CAAW8I,GAAML,CAAAA,CAAO,CAAE,OAAA,CAASK,CAAE,CAAC,CAAA,CACtC,gBAAA,CAAkBN,CAAAA,CACpB,EACCxI,CAAAA,CAAM,OAAA,EACL2B,cAAAA,CAACuH,EAAAA,CAAA,CACC,KAAA,CAAOlJ,CAAAA,CAAM,UAAA,CACb,QAAA,CAAW8I,GAAML,CAAAA,CAAO,CAAE,UAAA,CAAYK,CAAE,CAAC,CAAA,CACzC,MAAA,CAAQH,CAAAA,CAAS,aACnB,CAAA,CAAA,CAEJ,CAAA,CAEFhH,cAAAA,CAACwH,EAAAA,CAAA,CACC,KAAA,CAAOnJ,CAAAA,CAAM,OAAA,CACb,QAAA,CAAW8I,GAAML,CAAAA,CAAO,CAAE,OAAA,CAASK,CAAE,CAAC,CAAA,CACtC,OAAA,CAASH,CAAAA,CAAS,eAClB,gBAAA,CAAkBH,CAAAA,CACpB,CAAA,CACCG,CAAAA,CAAS,eACRhH,cAAAA,CAACyH,EAAAA,CAAA,CACC,KAAA,CAAOpJ,EAAM,SAAA,CACb,QAAA,CAAW8I,CAAAA,EAAML,CAAAA,CAAO,CAAE,SAAA,CAAWK,CAAE,CAAC,EAC1C,CAAA,CAAA,CAEJ,CAEJ,CAQA,SAASD,GAAY,CACnB,KAAA,CAAA7I,CAAAA,CACA,QAAA,CAAAuI,CACF,CAAA,CAGG,CACD,GAAM,CAAE,CAAA,CAAApJ,CAAE,CAAA,CAAImC,mBAAAA,GACR+H,CAAAA,CAAQlK,CAAAA,CAAE,uBAAuB,CAAA,CACvC,OACE0C,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4CAAA,CACb,UAAAF,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sBAAA,CAAwB,QAAA,CAAA0H,CAAAA,CAAM,CAAA,CAC7C1H,cAAAA,CAAC2H,qBAAA,CACC,SAAA,CAAS,IAAA,CACT,OAAA,CAAQ,OACR,KAAA,CAAOtJ,CAAAA,GAAU,IAAA,CAAO,MAAA,CAAYA,EACpC,aAAA,CAAgB8I,CAAAA,EAAMP,CAAAA,CAAS,KAAA,CAAMO,CAAC,CAAA,CAAI,IAAA,CAAOA,CAAC,EAClD,WAAA,CAAW,IAAA,CACX,QAAA,CAAU,CAAA,CACV,QAAA,CAAU,GAAA,CACV,IAAA,CAAM,CAAA,CACN,WAAYnH,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,sBAAA,CAAuB,QAAA,CAAA,GAAA,CAAC,CAAA,CACpD,YAAA,CAAY0H,CAAAA,CACd,GACF,CAEJ,CAIA,SAASN,EAAAA,CAAO,CACd,KAAA,CAAA/I,CAAAA,CACA,QAAA,CAAAuI,CAAAA,CACA,QAAAgB,CAAAA,CACA,MAAA,CAAArQ,CAAAA,CACA,QAAA,CAAA4E,CACF,CAAA,CAMG,CACD,GAAM,CAAE,CAAA,CAAAqB,CAAE,CAAA,CAAImC,mBAAAA,GACR+H,CAAAA,CAAQlK,CAAAA,CAAE,CAAA,aAAA,EAAgBoK,CAAO,EAAE,CAAA,CACnCC,CAAAA,CAAUrK,CAAAA,CAAE,CAAA,aAAA,EAAgBoK,CAAO,CAAA,QAAA,CAAU,CAAA,CACnD,OACE1H,gBAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4CAAA,CACb,QAAA,CAAA,CAAAA,gBAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8CAAA,CACZ,QAAA,CAAA,CAAAwH,EACD1H,cAAAA,CAAC8H,gBAAAA,CAAA,CAAc,OAAA,CAASD,CAAAA,CACtB,QAAA,CAAA7H,cAAAA,CAACa,SAAAA,CAAA,CACC,UAAA,CAAU,IAAA,CACV,SAAA,CAAU,4CAAA,CACV,cAAa,IAAA,CAEb,QAAA,CAAAb,cAAAA,CAAC+H,WAAAA,CAAA,CAAS,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,SAAA,CAAU,cAAA,CAAe,CAAA,CAC5D,CAAA,CACF,GACF,CAAA,CACA/H,cAAAA,CAAC2H,oBAAAA,CAAA,CACC,UAAS,IAAA,CACT,OAAA,CAAQ,MAAA,CACR,KAAA,CAAOtJ,IAAU,IAAA,CAAO,MAAA,CAAYA,CAAAA,CACpC,aAAA,CAAgB8I,CAAAA,EAAMP,CAAAA,CAAS,KAAA,CAAMO,CAAC,EAAI,IAAA,CAAOA,CAAC,CAAA,CAClD,WAAA,CAAW,KACX,QAAA,CAAU,CAAA,CACV,aAAA,CAAe,CAAE,sBAAuBhL,CAAS,CAAA,CACjD,UAAA,CAAY6D,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,sBAAA,CAAwB,QAAA,CAAAzI,EAAO,CAAA,CAC3D,YAAA,CAAYmQ,CAAAA,CACd,CAAA,CAAA,CACF,CAEJ,CAIA,SAASL,EAAAA,CAAU,CACjB,MAAAhJ,CAAAA,CACA,QAAA,CAAAuI,CAAAA,CACA,MAAA,CAAArP,CAAAA,CACA,QAAA,CAAA4E,CACF,CAAA,CAKG,CACD,GAAM,CAAE,CAAA,CAAAqB,CAAE,CAAA,CAAImC,mBAAAA,EAAe,CACvB+H,CAAAA,CAAQlK,EAAE,qBAAqB,CAAA,CACrC,OACE0C,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4CAAA,CACb,QAAA,CAAA,CAAAA,gBAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8CAAA,CACZ,QAAA,CAAA,CAAAwH,EACD1H,cAAAA,CAAC8H,gBAAAA,CAAA,CAAc,OAAA,CAAStK,EAAE,6BAA6B,CAAA,CACrD,QAAA,CAAAwC,cAAAA,CAACa,SAAAA,CAAA,CACC,UAAA,CAAU,IAAA,CACV,UAAU,4CAAA,CACV,aAAA,CAAa,IAAA,CAEb,QAAA,CAAAb,eAAC+H,WAAAA,CAAA,CAAS,KAAA,CAAO,EAAA,CAAI,OAAQ,EAAA,CAAI,SAAA,CAAU,cAAA,CAAe,CAAA,CAC5D,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACA/H,cAAAA,CAAC2H,qBAAA,CACC,SAAA,CAAS,IAAA,CACT,OAAA,CAAQ,OACR,KAAA,CAAOtJ,CAAAA,GAAU,IAAA,CAAO,MAAA,CAAYA,EACpC,aAAA,CAAgB8I,CAAAA,EAAMP,CAAAA,CAAS,KAAA,CAAMO,CAAC,CAAA,CAAI,IAAA,CAAOA,CAAC,EAClD,WAAA,CAAW,IAAA,CACX,QAAA,CAAU,CAAA,CACV,aAAA,CAAe,CAAE,qBAAA,CAAuBhL,CAAS,EACjD,UAAA,CAAY6D,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,sBAAA,CAAwB,QAAA,CAAAzI,CAAAA,CAAO,CAAA,CAC3D,aAAYmQ,CAAAA,CACd,CAAA,CAAA,CACF,CAEJ,CAIA,SAASJ,EAAAA,CAAW,CAClB,KAAA,CAAAjJ,CAAAA,CACA,SAAAuI,CAAAA,CACA,gBAAA,CAAAC,CACF,CAAA,CAIG,CACD,GAAM,CAAE,CAAA,CAAArJ,CAAE,CAAA,CAAImC,mBAAAA,EAAe,CACvB+H,CAAAA,CAAQlK,EAAE,sBAAsB,CAAA,CACtC,OACE0C,eAAAA,CAAC,OAAI,SAAA,CAAU,4CAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8CAAA,CACZ,QAAA,CAAA,CAAAwH,EACD1H,cAAAA,CAAC8H,gBAAAA,CAAA,CAAc,OAAA,CAAStK,EAAE,8BAA8B,CAAA,CACtD,QAAA,CAAAwC,cAAAA,CAACa,UAAA,CACC,UAAA,CAAU,IAAA,CACV,SAAA,CAAU,4CAAA,CACV,aAAA,CAAa,IAAA,CAEb,QAAA,CAAAb,eAAC+H,WAAAA,CAAA,CAAS,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,SAAA,CAAU,cAAA,CAAe,EAC5D,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACA/H,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kBAAA,CACb,QAAA,CAAAA,eAACgI,eAAAA,CAAA,CACC,UAAA,CAAY3J,CAAAA,CACZ,cAAeuI,CAAAA,CACf,KAAA,CAAM,SAAA,CACN,YAAA,CAAYc,EACZ,gBAAA,CAAkBb,CAAAA,CACpB,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CAIA,SAASU,EAAAA,CAAc,CACrB,KAAA,CAAAlJ,CAAAA,CACA,QAAA,CAAAuI,CAAAA,CACA,OAAArP,CACF,CAAA,CAIG,CACD,GAAM,CAAE,CAAA,CAAAiG,CAAE,CAAA,CAAImC,mBAAAA,EAAe,CACvB+H,CAAAA,CAAQlK,CAAAA,CAAE,yBAAyB,EACzC,OACE0C,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uBAAwB,QAAA,CAAA0H,CAAAA,CAAM,CAAA,CAC7C1H,cAAAA,CAAC2H,oBAAAA,CAAA,CACC,SAAA,CAAS,IAAA,CACT,QAAQ,MAAA,CACR,KAAA,CAAOtJ,CAAAA,GAAU,IAAA,CAAO,OAAYA,CAAAA,CACpC,aAAA,CAAgB8I,CAAAA,EAAMP,CAAAA,CAAS,MAAMO,CAAC,CAAA,CAAI,IAAA,CAAOA,CAAC,CAAA,CAClD,WAAA,CAAW,IAAA,CACX,QAAA,CAAU,EACV,UAAA,CAAYnH,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,uBAAwB,QAAA,CAAAzI,CAAAA,CAAO,CAAA,CAC3D,YAAA,CAAYmQ,EACd,CAAA,CAAA,CACF,CAEJ,CAIA,SAASF,EAAAA,CAAW,CAClB,KAAA,CAAAnJ,CAAAA,CACA,SAAAuI,CAAAA,CACA,OAAA,CAAA/N,CAAAA,CACA,gBAAA,CAAAgO,CACF,CAAA,CAKG,CACD,GAAM,CAAE,EAAArJ,CAAE,CAAA,CAAImC,mBAAAA,EAAe,CACvB+H,CAAAA,CAAQlK,CAAAA,CAAE,sBAAsB,CAAA,CAChCyK,EAAQ/N,aAAAA,CACZ,KACG,CACC,GAAA,CAAKgO,iBACL,OAAA,CAASC,aAAAA,CACT,MAAA,CAAQC,iBACV,GACF,EACF,CAAA,CACMC,CAAAA,CAAWnO,aAAAA,CACf,KAAO,CACL,GAAA,CAAK,CACH,KAAA,CAAOsD,CAAAA,CAAE,0BAA0B,CAAA,CACnC,IAAA,CAAMA,CAAAA,CAAE,+BAA+B,CACzC,EACA,OAAA,CAAS,CACP,KAAA,CAAOA,CAAAA,CAAE,8BAA8B,CAAA,CACvC,IAAA,CAAMA,CAAAA,CAAE,mCAAmC,CAC7C,CAAA,CACA,MAAA,CAAQ,CACN,MAAOA,CAAAA,CAAE,6BAA6B,CAAA,CACtC,IAAA,CAAMA,EAAE,kCAAkC,CAC5C,CACF,CAAA,CAAA,CACA,CAACA,CAAC,CACJ,CAAA,CACA,OACE0C,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4CAAA,CACb,UAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8CAAA,CACZ,UAAAwH,CAAAA,CACD1H,cAAAA,CAAC8H,gBAAAA,CAAA,CAAc,OAAA,CAAStK,CAAAA,CAAE,8BAA8B,CAAA,CACtD,SAAAwC,cAAAA,CAACa,SAAAA,CAAA,CACC,UAAA,CAAU,KACV,SAAA,CAAU,4CAAA,CACV,aAAA,CAAa,IAAA,CAEb,SAAAb,cAAAA,CAAC+H,WAAAA,CAAA,CAAS,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,SAAA,CAAU,eAAe,CAAA,CAC5D,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACA/H,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kBAAA,CACb,QAAA,CAAAA,eAACsI,qBAAAA,CAAA,CACC,KAAA,CAAM,SAAA,CACN,MAAA,CAAO,IAAA,CACP,UAAA,CAAY,CAAE,QAAS,OAAA,CAAS,GAAA,CAAK,kBAAmB,CAAA,CACxD,YAAajK,CAAAA,CACb,iBAAA,CAAmBuI,CAAAA,CACnB,gBAAA,CAAkBC,EAClB,YAAA,CAAYa,CAAAA,CAEX,QAAA,CAAA7O,CAAAA,CAAQ,GAAA,CAAK0P,CAAAA,EAAQ,CACpB,IAAMC,EAAOP,CAAAA,CAAMM,CAAG,CAAA,CAChBE,CAAAA,CAAMJ,EAASE,CAAG,CAAA,CACxB,OACEvI,cAAAA,CAAC0I,OAAA,CAEC,KAAA,CACE1I,cAAAA,CAAC8H,gBAAAA,CAAA,CACC,OAAA,CACE5H,eAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,SAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,6BAAA,CACZ,QAAA,CAAAyI,CAAAA,CAAI,KAAA,CACP,EACAzI,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,QAAA,CAAU,QAAA,CAAAyI,CAAAA,CAAI,IAAA,CAAK,CAAA,CAAA,CACpC,EAGF,QAAA,CAAAzI,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,kCAAA,CACd,QAAA,CAAAA,cAAAA,CAACwI,CAAAA,CAAA,CAAK,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,CAAA,CAC/B,CAAA,CACF,CAAA,CAAA,CAfGD,CAiBP,CAEJ,CAAC,CAAA,CACH,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CAIA,SAASd,EAAAA,CAAa,CACpB,MAAApJ,CAAAA,CACA,QAAA,CAAAuI,CACF,CAAA,CAGG,CACD,GAAM,CAAE,CAAA,CAAApJ,CAAE,CAAA,CAAImC,mBAAAA,EAAe,CACvB+H,CAAAA,CAAQlK,EAAE,wBAAwB,CAAA,CACxC,OACE0C,eAAAA,CAAC,OAAI,SAAA,CAAU,gCAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gCAAA,CAAkC,QAAA,CAAA0H,EAAM,CAAA,CACvD1H,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,YACb,QAAA,CAAAA,cAAAA,CAAC2I,cAAAA,CAAA,CACC,UAAS,IAAA,CACT,OAAA,CAAQ,MAAA,CACR,KAAA,CAAOtK,CAAAA,EAAS,EAAA,CAChB,aAAA,CAAgB8I,CAAAA,EAAMP,EAASO,CAAAA,EAAK,IAAI,CAAA,CACxC,WAAA,CAAY,cACZ,YAAA,CAAYO,CAAAA,CACd,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CCrYO,SAASkB,EAAAA,CAAe,CAC7B,KAAA,CAAAxS,EACA,SAAA,CAAA4B,CAAAA,CACA,iBAAA,CAAA6Q,CAAAA,CACA,OAAA9K,CAAAA,CACA,cAAA,CAAAqD,CAAAA,CACA,aAAA,CAAA0H,CAAAA,CACA,iBAAA,CAAAC,CAAAA,CACA,kBAAA,CAAAC,EACA,sBAAA,CAAAC,CAAAA,CACA,mBAAA,CAAAC,CAAAA,CACA,wBAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,aAAA,CAAAnE,EACA,YAAA,CAAAC,CAAAA,CACA,gBAAA,CAAAmE,CAAAA,CACA,MAAA,CAAA7G,CAAAA,CACA,cAAA,CAAA8G,CAAAA,CACA,aAAAC,CAAAA,CACA,sBAAA,CAAAC,CAAAA,CACA,YAAA,CAAArE,EACA,aAAA,CAAAsE,CAAAA,CACA,UAAA,CAAAtD,CAAAA,CACA,WAAAO,CAAAA,CACA,SAAA,CAAAtH,CAAAA,CACA,QAAA,CAAAsK,CAAAA,CACA,SAAA,CAAAhI,CAAAA,CACA,WAAA,CAAAiI,CACF,CAAA,CAAwB,CACtB,GAAM,CAAE,CAAA,CAAAnM,CAAE,CAAA,CAAImC,mBAAAA,GACRjI,CAAAA,CAAcwC,aAAAA,CAAQ,IAAMvC,sBAAAA,CAAevB,CAAK,CAAA,CAAG,CAACA,CAAK,CAAC,CAAA,CAC1DwB,CAAAA,CAAeF,CAAAA,EAAa,MAAA,CAC5BiO,EAAiBjO,CAAAA,EAAa,QAAA,EAAY,CAAA,CAEhD,OACEwI,gBAAC,KAAA,CAAA,CACC,SAAA,CAAWyB,KAAAA,CAAG,+CAAA,CAAiDD,CAAS,CAAA,CAGxE,QAAA,CAAA,CAAAxB,eAAAA,CAAC0J,QAAA,CACC,SAAA,CAAS,IAAA,CACT,IAAA,CAAK,KACL,WAAA,CAAa5R,CAAAA,CACb,iBAAA,CAAmB6Q,CAAAA,CACnB,WAAY,CACV,OAAA,CAAS,aAAA,CACT,GAAA,CAAK,sCACP,CAAA,CACA,gBAAA,CAAgB,IAAA,CAEhB,UAAA7I,cAAAA,CAAC0I,MAAAA,CAAA,CAAc,KAAA,CAAOlL,EAAE,YAAY,CAAA,CAAA,CAA3B,KAA8B,CAAA,CACvCwC,eAAC0I,MAAAA,CAAA,CAAe,KAAA,CAAOlL,CAAAA,CAAE,aAAa,CAAA,CAAA,CAA7B,MAAgC,CAAA,CAAA,CAC3C,EAGA0C,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8CAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC4J,OAAAA,CAAA,CACC,KAAK,IAAA,CACL,OAAA,CAAQ,YAAA,CACR,UAAA,CAAY,CAAE,OAAA,CAAS,OAAA,CAAS,GAAA,CAAK,QAAS,CAAA,CAC9C,WAAA,CAAY,QAAA,CACZ,gBAAA,CAAgB,KAEhB,QAAA,CAAA5J,cAAAA,CAAC0I,MAAAA,CAAA,CAAiB,MAAOlL,CAAAA,CAAE,cAAc,CAAA,CAAA,CAAhC,QAAmC,CAAA,CAC9C,CAAA,CACCmM,CAAAA,CAAAA,CACH,CAAA,CAGA3J,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,QAAA,CACZ,QAAA,CAAAhI,IAAc,KAAA,CACbgI,cAAAA,CAAC6J,EAAAA,CAAA,CACC,OAAQ9L,CAAAA,CACR,cAAA,CAAgBqD,CAAAA,CAChB,aAAA,CAAe0H,CAAAA,CACf,kBAAA,CAAoBE,CAAAA,CACpB,mBAAA,CAAqBE,EACrB,YAAA,CAActR,CAAAA,CACd,cAAA,CAAgB+N,CAAAA,CAChB,YAAanI,CAAAA,CAAE,cAAc,CAAA,CAC/B,CAAA,CAEAwC,eAAC8J,EAAAA,CAAA,CACC,MAAA,CAAQ/L,CAAAA,CACR,cAAA,CAAgBqD,CAAAA,CAChB,iBAAA,CAAmB2H,CAAAA,CACnB,uBAAwBE,CAAAA,CACxB,uBAAA,CAAyBE,CAAAA,CACzB,WAAA,CAAaC,CAAAA,CACb,WAAA,CAAa5L,CAAAA,CAAE,cAAc,EAC/B,CAAA,CAEJ,CAAA,CAGA0C,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wCAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,OAAI,SAAA,CAAU,gCAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,QAAM,QAAA,CAAAxC,CAAAA,CAAE,eAAe,CAAA,CAAE,EAC1BwC,cAAAA,CAAC,MAAA,CAAA,CACE,QAAA,CAAAhI,CAAAA,GAAc,KAAA,CACXiN,CAAAA,CACE,CAAA,EAAGA,CAAa,IAAIrN,CAAAA,EAAgB,EAAE,CAAA,CAAA,CACtC,IAAA,CACFsN,EACE,CAAA,EAAGA,CAAY,CAAA,CAAA,EAAIkE,CAAAA,EAAe,EAAE,CAAA,CAAA,CACpC,IAAA,CACR,CAAA,CAAA,CACF,CAAA,CACCC,CAAAA,EACCrJ,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uBAAwB,QAAA,CAAAqJ,CAAAA,CAAiB,CAAA,CAAA,CAE5D,CAAA,CAGArJ,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,MAAA,CACb,QAAA,CAAAA,eAAC+J,EAAAA,CAAA,CAAe,MAAA,CAAQR,CAAAA,CAAc,KAAA,CAAOnT,CAAAA,CAAO,CAAA,CACtD,CAAA,CAGA4J,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,MAAA,CACb,QAAA,CAAAE,gBAAC0J,OAAAA,CAAA,CACC,OAAA,CAAQ,UAAA,CACR,KAAK,IAAA,CACL,SAAA,CAAS,IAAA,CACT,UAAA,CAAY,CACV,OAAA,CAAS,sCAAA,CACT,GAAA,CAAK,iEACL,UAAA,CAAY,cACd,CAAA,CACA,WAAA,CAAa,GAAGpH,CAAM,CAAA,CAAA,CACtB,iBAAA,CAAoBjM,EAAAA,EAAa+S,EAAe,MAAA,CAAO/S,EAAG,CAAC,CAAA,CAC3D,gBAAA,CAAgB,IAAA,CAChB,YAAA,CAAYiH,CAAAA,CAAE,sBAAsB,CAAA,CAEpC,QAAA,CAAA,CAAAwC,cAAAA,CAAC0I,MAAAA,CAAA,CAEC,KAAA,CAAOlL,CAAAA,CAAE,oBAAA,CAAsB,CAAE,EAAG,CAAE,CAAC,CAAA,CACvC,OAAA,CAAS,IAAMiM,CAAAA,CAAc,CAAC,CAAA,CAAA,CAFzB,CAGP,CAAA,CACAzJ,cAAAA,CAAC0I,MAAAA,CAAA,CAEC,MAAOlL,CAAAA,CAAE,oBAAA,CAAsB,CAAE,CAAA,CAAG,CAAE,CAAC,CAAA,CACvC,OAAA,CAAS,IAAMiM,CAAAA,CAAc,CAAC,CAAA,CAAA,CAFzB,CAGP,EACAzJ,cAAAA,CAAC0I,MAAAA,CAAA,CAEC,KAAA,CAAOlL,CAAAA,CAAE,oBAAA,CAAsB,CAAE,CAAA,CAAG,CAAE,CAAC,CAAA,CACvC,OAAA,CAAS,IAAMiM,CAAAA,CAAc,CAAC,CAAA,CAAA,CAFzB,CAGP,GACF,CAAA,CACF,CAAA,CAGCtE,CAAAA,EACCnF,cAAAA,CAAC,OAAI,SAAA,CAAU,QAAA,CACb,QAAA,CAAAA,cAAAA,CAAC2G,GAAA,CACC,KAAA,CAAO4C,CAAAA,CACP,QAAA,CAAUC,CAAAA,CACV,KAAA,CAAOpT,CAAAA,CACT,CAAA,CACF,EAIF4J,cAAAA,CAACa,SAAAA,CAAA,CACC,SAAA,CAAS,KACT,IAAA,CAAK,IAAA,CACL,KAAA,CAAO7I,CAAAA,GAAc,MAAQ,SAAA,CAAY,WAAA,CACzC,SAAA,CAAU,iBAAA,CACV,aAAA,CAAa,IAAA,CACb,UAAA,CAAY0O,CAAAA,CACZ,UAAWtH,CAAAA,CACX,OAAA,CAASsK,CAAAA,CAER,QAAA,CAAAvD,EACH,CAAA,CAAA,CACF,CAEJ,CAMA,SAAS0D,GAAiB,CACxB,MAAA,CAAA9L,CAAAA,CACA,cAAA,CAAAqD,CAAAA,CACA,aAAA,CAAA0H,CAAAA,CACA,kBAAA,CAAAE,EACA,mBAAA,CAAAE,CAAAA,CACA,YAAA,CAAAtR,CAAAA,CACA,eAAA+N,CAAAA,CACA,WAAA,CAAAqE,CACF,CAAA,CASG,CACD,IAAMC,CAAAA,CAAe3Q,iBAAAA,CAClB6N,CAAAA,EAA8C,CACzC,OAAOA,CAAAA,EAAM,QAAA,EACf/F,EAAe,KAAA,CAAM+F,CAAC,CAAA,CAAI,MAAA,CAAYA,CAAC,EAE3C,CAAA,CACA,CAAC/F,CAAc,CACjB,CAAA,CAEA,OACElB,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,aAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAACkK,eAAA,CACC,GAAA,CAAK,CAAA,CACL,KAAA,CAAOnM,EACP,QAAA,CAAUkM,CAAAA,CACV,SAAA,CAAS,IAAA,CACT,YAAW,IAAA,CACX,YAAA,CACEjK,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gCAAA,CAAkC,QAAA,CAAAgK,CAAAA,CAAY,EAEhE,UAAA,CACEhK,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iCACb,QAAA,CAAApI,CAAAA,EAAgB,EAAA,CACnB,CAAA,CAEF,cAAe,CACb,qBAAA,CAAuB+N,CACzB,CAAA,CACA,UAAA,CAAY,CACV,YAAA,CAAchE,KAAAA,CACZ,yDACA,+EACF,CAAA,CACA,KAAA,CAAO,SACT,CAAA,CACF,CAAA,CACA3B,cAAAA,CAACmK,EAAAA,CAAA,CACC,MAAA,CAAQrB,CAAAA,CACR,QAAA,CAAUE,CAAAA,CACV,MAAA,CAAQE,CAAAA,CACV,CAAA,CAAA,CACF,CAEJ,CAMA,SAASY,EAAAA,CAAkB,CACzB,MAAA,CAAA/L,EACA,cAAA,CAAAqD,CAAAA,CACA,iBAAA,CAAA2H,CAAAA,CACA,uBAAAE,CAAAA,CACA,uBAAA,CAAAE,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,WAAA,CAAAY,CACF,CAAA,CAQG,CACD,IAAMC,CAAAA,CAAe3Q,iBAAAA,CAClB6N,CAAAA,EAA8C,CACzC,OAAOA,CAAAA,EAAM,QAAA,EACf/F,CAAAA,CAAe,MAAM+F,CAAC,CAAA,CAAI,MAAA,CAAYA,CAAC,EAE3C,CAAA,CACA,CAAC/F,CAAc,CACjB,CAAA,CAEA,OACElB,eAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,aAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAACkK,cAAAA,CAAA,CACC,GAAA,CAAK,CAAA,CACL,KAAA,CAAOnM,CAAAA,CACP,QAAA,CAAUkM,CAAAA,CACV,SAAA,CAAS,IAAA,CACT,YAAW,IAAA,CACX,YAAA,CACEjK,cAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,gCAAA,CAAkC,QAAA,CAAAgK,CAAAA,CAAY,CAAA,CAEhE,WACEhK,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gCAAA,CACb,QAAA,CAAAoJ,CAAAA,EAAe,EAAA,CAClB,CAAA,CAEF,WAAY,CACV,YAAA,CAAczH,KAAAA,CACZ,wDAAA,CACA,+EACF,CAAA,CACA,KAAA,CAAO,SACT,CAAA,CACF,EACA3B,cAAAA,CAACmK,EAAAA,CAAA,CACC,MAAA,CAAQpB,CAAAA,CACR,QAAA,CAAUE,CAAAA,CACV,MAAA,CAAQE,EACR,MAAA,CAAO,GAAA,CACT,CAAA,CAAA,CACF,CAEJ,CAMA,SAASgB,EAAAA,CAAa,CACpB,MAAA,CAAAC,EACA,QAAA,CAAAC,CAAAA,CACA,MAAA,CAAAC,CAAAA,CACA,MAAA,CAAAC,CACF,CAAA,CAKG,CACD,GAAM,CAACC,CAAAA,CAAWC,CAAY,CAAA,CAAIvR,eAAS,KAAK,CAAA,CAC1C,CAACwR,CAAAA,CAAYC,CAAa,CAAA,CAAIzR,cAAAA,CAA4B,EAAE,CAAA,CAE5D0R,CAAAA,CAAkBtR,iBAAAA,CAAY,IAAM,CACxCqR,CAAAA,CAAc,CAAC,GAAGP,CAAM,CAAC,CAAA,CACzBK,CAAAA,CAAa,IAAI,EACnB,CAAA,CAAG,CAACL,CAAM,CAAC,CAAA,CAELS,CAAAA,CAAavR,iBAAAA,CAAY,IAAM,CACnCmR,CAAAA,CAAa,KAAK,CAAA,CAClBH,CAAAA,CAAOI,CAAU,EACnB,CAAA,CAAG,CAACJ,CAAAA,CAAQI,CAAU,CAAC,CAAA,CAEvB,OACExK,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,cAAA,CACb,QAAA,CAAA,CAAAF,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oCAAA,CACZ,QAAA,CAAA,KAAA,CAAM,KAAK,CAAE,MAAA,CAAQ,CAAE,CAAC,EAAE,GAAA,CAAI,CAAC8K,CAAAA,CAAGpS,CAAAA,GACjCsH,cAAAA,CAAC,KAAA,CAAA,CAEC,SAAA,CAAW2B,KAAAA,CACT,mDACAjJ,CAAAA,GAAM,CAAA,EAAK,eACb,CAAA,CAEC,SAAA8R,CAAAA,CACCxK,cAAAA,CAACkK,cAAAA,CAAA,CACC,UAAS,IAAA,CACT,KAAA,CACEQ,CAAAA,CAAWhS,CAAC,CAAA,GAAM,IAAA,EAAQgS,CAAAA,CAAWhS,CAAC,IAAM,MAAA,CACxC,MAAA,CACAgS,CAAAA,CAAWhS,CAAC,CAAA,CAElB,QAAA,CAAWyO,CAAAA,EAA8C,CACvD,GAAI,OAAOA,CAAAA,EAAM,QAAA,CAAU,CACzB,IAAM4D,CAAAA,CAAM,KAAA,CAAM5D,CAAC,EAAI,IAAA,CAAOA,CAAAA,CAC9BwD,CAAAA,CAAexP,CAAAA,EAAS,CACtB,IAAME,CAAAA,CAAO,CAAC,GAAGF,CAAI,CAAA,CACrB,OAAAE,CAAAA,CAAK3C,CAAC,CAAA,CAAIqS,CAAAA,CACH1P,CACT,CAAC,EACH,CACF,CAAA,CACA,GAAA,CAAK,CAAA,CACL,YAAW,IAAA,CACX,UAAA,CAAY,CACV,YAAA,CAAcsG,MACZ,+CAAA,CACA,+EAAA,CACAjJ,CAAAA,GAAM,CAAA,EAAK,eACb,CAAA,CACA,YAAA,CAAc,MAAA,CACd,MAAO,qBACT,CAAA,CACF,CAAA,CAEAsH,cAAAA,CAACa,UAAA,CACC,SAAA,CAAU,0DAAA,CACV,IAAA,CAAK,KACL,aAAA,CAAa,IAAA,CACb,OAAA,CAAS,IAAMuJ,CAAAA,CAAO1R,CAAC,CAAA,EAAK,IAAA,EAAQ2R,EAASD,CAAAA,CAAO1R,CAAC,CAAE,CAAA,CACvD,UAAA,CACE6R,CAAAA,CACEvK,cAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,sBAAA,CAAwB,QAAA,CAAAuK,CAAAA,CAAO,CAAA,CAC7C,IAAA,CAGL,QAAA,CAAAH,CAAAA,CAAO1R,CAAC,GAAK,EAAA,CAChB,CAAA,CAAA,CAjDGA,CAmDP,CACD,EACH,CAAA,CACAsH,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sDACZ,QAAA,CAAAwK,CAAAA,CACCxK,cAAAA,CAACa,SAAAA,CAAA,CACC,IAAA,CAAK,IAAA,CACL,UAAA,CAAU,KACV,SAAA,CAAU,gCAAA,CACV,aAAA,CAAa,IAAA,CACb,QAASgK,CAAAA,CAET,QAAA,CAAA7K,cAAAA,CAACgL,YAAAA,CAAA,CAAU,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,CAAA,CACpC,CAAA,CAEAhL,cAAAA,CAACa,SAAAA,CAAA,CACC,IAAA,CAAK,IAAA,CACL,UAAA,CAAU,IAAA,CACV,UAAU,gCAAA,CACV,aAAA,CAAa,IAAA,CACb,OAAA,CAAS+J,EAET,QAAA,CAAA5K,cAAAA,CAACiL,WAAAA,CAAA,CAAS,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,EACnC,CAAA,CAEJ,CAAA,CAAA,CACF,CAEJ,CAMA,SAASlB,EAAAA,CAAe,CACtB,MAAA,CAAAK,CAAAA,CACA,MAAAhU,CACF,CAAA,CAGG,CACD,GAAM,CAAE,CAAA,CAAAoH,CAAE,CAAA,CAAImC,qBAAe,CACvBqH,CAAAA,CAAW9M,aAAAA,CAAQ,IAAMzC,GAAuBrB,CAAK,CAAA,CAAG,CAACA,CAAK,CAAC,CAAA,CAE/D8U,CAAAA,CACJd,CAAAA,CAAO,OAAA,EAAWA,CAAAA,CAAO,OAAA,GAAY,KAAA,CAAQA,CAAAA,CAAO,QAAU,KAAA,CAEhE,OACElK,eAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,yBAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAACmL,UAAAA,CAAA,CACC,OAAA,CAAS3N,CAAAA,CAAE,uBAAuB,CAAA,CAClC,UAAA,CAAY,CAAE,OAAA,CAAS,yCAA0C,EAEjE,QAAA,CAAAwC,cAAAA,CAACa,SAAAA,CAAA,CACC,KAAK,IAAA,CACL,SAAA,CAAU,4EAAA,CACV,aAAA,CAAa,KACb,YAAA,CAAcb,cAAAA,CAACoL,eAAAA,CAAA,CAAa,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,EAElD,QAAA,CAAAC,qBAAAA,CAAAA,CAAejB,CAAAA,CAAO,QAAA,EAAY,CAAA,EAAK,GAAG,CAAA,CAC7C,CAAA,CACF,EAEApK,cAAAA,CAACmL,UAAAA,CAAA,CACC,OAAA,CAAS3N,CAAAA,CAAE,CAAA,aAAA,EAAgBwJ,CAAAA,CAAS,OAAO,EAAE,CAAA,CAC7C,UAAA,CAAY,CAAE,OAAA,CAAS,yCAA0C,CAAA,CAEjE,QAAA,CAAAhH,cAAAA,CAACa,SAAAA,CAAA,CACC,IAAA,CAAK,IAAA,CACL,SAAA,CAAU,4EAAA,CACV,aAAA,CAAa,IAAA,CACb,YAAA,CAAcb,cAAAA,CAACsL,eAAA,CAAY,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,GAAI,CAAA,CAEjD,QAAA,CAAAC,mBAAAA,CAAYnB,CAAAA,CAAO,aAAe,CAAC,CAAA,CACtC,CAAA,CACF,CAAA,CAECpD,CAAAA,CAAS,UAAA,EACRhH,cAAAA,CAACmL,UAAAA,CAAA,CACC,OAAA,CAAS3N,CAAAA,CAAE,qBAAqB,CAAA,CAChC,WAAY,CAAE,OAAA,CAAS,yCAA0C,CAAA,CAEjE,SAAAwC,cAAAA,CAACa,SAAAA,CAAA,CACC,IAAA,CAAK,IAAA,CACL,SAAA,CAAU,4EAAA,CACV,aAAA,CAAa,KACb,YAAA,CAAcb,cAAAA,CAACwL,YAAAA,CAAA,CAAU,MAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,CAAA,CAE/C,SAAAD,mBAAAA,CAAYnB,CAAAA,CAAO,MAAA,EAAU,CAAC,CAAA,CACjC,CAAA,CACF,CAAA,CAGFpK,cAAAA,CAACmL,WAAA,CACC,OAAA,CAAS3N,CAAAA,CAAE,sBAAsB,EACjC,UAAA,CAAY,CAAE,OAAA,CAAS,yCAA0C,EAEjE,QAAA,CAAAwC,cAAAA,CAACa,SAAAA,CAAA,CACC,IAAA,CAAK,IAAA,CACL,SAAA,CAAU,4EAAA,CACV,cAAa,IAAA,CACb,YAAA,CACEX,eAAAA,CAAAoC,mBAAAA,CAAA,CACG,QAAA,CAAA,CAAA4I,CAAAA,GAAe,KAAA,EACdlL,cAAAA,CAACkI,iBAAA,CACC,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,EAAA,CACR,SAAA,CAAU,cAAA,CACZ,CAAA,CAEDgD,IAAe,SAAA,EACdlL,cAAAA,CAACmI,aAAAA,CAAA,CAAW,MAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,SAAA,CAAU,eAAe,CAAA,CAE7D+C,CAAAA,GAAe,QAAA,EACdlL,cAAAA,CAACoI,iBAAAA,CAAA,CACC,KAAA,CAAO,EAAA,CACP,OAAQ,EAAA,CACR,SAAA,CAAU,cAAA,CACZ,CAAA,CAAA,CAEJ,CAAA,CAGD,QAAA,CAAA5K,CAAAA,CAAE,CAAA,qBAAA,EAAwB0N,CAAU,CAAA,CAAE,CAAA,CACzC,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CCvhBO,SAASO,EAAAA,CAAmB,CACjC,KAAA,CAAArV,EACA,YAAA,CAAAC,CAAAA,CACA,eAAA,CAAAoO,CAAAA,CACA,YAAAC,CAAAA,CACA,QAAA,CAAA7B,CAAAA,CACA,gBAAA,CAAAQ,CAAAA,CACA,WAAA,CAAAsG,CAAAA,CACA,SAAA,CAAAjI,CACF,CAAA,CAA4B,CAC1B,OACE1B,cAAAA,CAACmD,GAAA,CACC,KAAA,CAAO/M,CAAAA,CACP,YAAA,CAAcC,EACd,QAAA,CAAUwM,CAAAA,CACV,gBAAA,CAAkBQ,CAAAA,CAElB,QAAA,CAAArD,cAAAA,CAAC0L,EAAAA,CAAA,CACC,MAAOtV,CAAAA,CACP,YAAA,CAAcC,CAAAA,CACd,eAAA,CAAiBoO,EACjB,WAAA,CAAaC,CAAAA,CACb,WAAA,CAAaiF,CAAAA,CACb,UAAWjI,CAAAA,CACb,CAAA,CACF,CAEJ,CAEA,SAASgK,EAAAA,CAAwB,CAC/B,KAAA,CAAAtV,EACA,YAAA,CAAAC,CAAAA,CACA,eAAA,CAAAoO,CAAAA,CACA,YAAAC,CAAAA,CACA,WAAA,CAAAiF,CAAAA,CACA,SAAA,CAAAjI,CACF,CAAA,CAAmE,CACjE,IAAMO,CAAAA,CAASuC,EAAAA,CAAsB,CACnC,KAAA,CAAApO,CAAAA,CACA,aAAAC,CAAAA,CACA,eAAA,CAAAoO,CAAAA,CACA,WAAA,CAAAC,CACF,CAAC,CAAA,CAGKiH,CAAAA,CAAyBrS,iBAAAA,CAC5B6N,GAAclF,CAAAA,CAAO,SAAA,CAAUkF,CAAC,CAAA,CACjC,CAAClF,CAAM,CACT,CAAA,CAEM2J,EAA6BtS,iBAAAA,CAChCuS,CAAAA,EAAgB,CACf,IAAMtN,EAAM0D,CAAAA,CAAO,YAAA,EAAc,MAAA,CACjC,GAAI,CAAC1D,CAAAA,CAAK,OACV,IAAMR,CAAAA,CAAS,IAAI+H,mBAAAA,CAAUvH,CAAG,CAAA,CAAE,MAAMsN,CAAG,CAAA,CAAE,GAAA,CAAI,GAAG,EAAE,QAAA,EAAS,CAC/D5J,CAAAA,CAAO,SAAA,CAAUlE,CAAM,EACzB,CAAA,CACA,CAACkE,CAAM,CACT,CAAA,CAGM6J,CAAAA,CAA0BxS,iBAAAA,CAC7ByS,GAA+B,CAC9B9J,CAAAA,CAAO,iBAAA,CAAkB,CACvB,GAAGA,CAAAA,CAAO,QAAA,CAAS,GAAA,CACnB,cAAe8J,CACjB,CAAC,EACH,CAAA,CACA,CAAC9J,CAAM,CACT,CAAA,CAEM+J,EAA8B1S,iBAAAA,CACjC2S,CAAAA,EAA4B,CAC3BhK,CAAAA,CAAO,mBAAmB,CACxB,GAAGA,CAAAA,CAAO,QAAA,CAAS,KACnB,iBAAA,CAAmBgK,CACrB,CAAC,EACH,CAAA,CACA,CAAChK,CAAM,CACT,EAGMiK,CAAAA,CAA6B5S,iBAAAA,CAChC8Q,CAAAA,EAAoD,CACnD,IAAMvE,CAAAA,CAAQ5D,CAAAA,CAAO,SAAA,GAAc,KAAA,CAC7BsC,EAAMsB,CAAAA,CAAQ5D,CAAAA,CAAO,SAAA,CAAYA,CAAAA,CAAO,UAAA,CAE9C,GAAI4D,CAAAA,CAAO,CACT,IAAM1K,CAAAA,CAAO8G,CAAAA,CAAO,QAAA,CAAS,GAAA,CACvBkK,EAAU,CAAC,GAAGhR,CAAAA,CAAK,OAAO,EAChCgR,CAAAA,CAAQ5H,CAAG,CAAA,CAAI6F,CAAAA,CACfnI,CAAAA,CAAO,iBAAA,CAAkB,CAAE,GAAG9G,EAAM,OAAA,CAAAgR,CAAQ,CAAC,EAC/C,CAAA,KAAO,CACL,IAAMhR,CAAAA,CAAO8G,EAAO,QAAA,CAAS,IAAA,CACvBkK,CAAAA,CAAU,CAAC,GAAGhR,CAAAA,CAAK,OAAO,CAAA,CAChCgR,EAAQ5H,CAAG,CAAA,CAAI6F,CAAAA,CACfnI,CAAAA,CAAO,mBAAmB,CAAE,GAAG9G,CAAAA,CAAM,OAAA,CAAAgR,CAAQ,CAAC,EAChD,CACF,CAAA,CACA,CAAClK,CAAM,CACT,CAAA,CAGMmK,EAAqB9S,iBAAAA,CACxBuE,CAAAA,EAAc,CACToE,CAAAA,CAAO,YAAc,KAAA,CACvBA,CAAAA,CAAO,YAAA,CAAapE,CAAC,EAErBoE,CAAAA,CAAO,aAAA,CAAcpE,CAAC,EAE1B,CAAA,CACA,CAACoE,CAAM,CACT,EAEMoK,CAAAA,CACJpK,CAAAA,CAAO,SAAA,GAAc,KAAA,CAAQA,EAAO,SAAA,CAAYA,CAAAA,CAAO,UAAA,CAEzD,OACEjC,eAAC4I,EAAAA,CAAA,CACC,KAAA,CAAOxS,CAAAA,CACP,SAAA,CAAW6L,CAAAA,CAAO,SAAA,CAClB,iBAAA,CAAmBA,EAAO,YAAA,CAC1B,MAAA,CAAQA,CAAAA,CAAO,MAAA,CACf,cAAA,CAAgBA,CAAAA,CAAO,SAAA,CACvB,aAAA,CAAeA,EAAO,QAAA,CAAS,GAAA,CAAI,aAAA,CACnC,iBAAA,CAAmBA,CAAAA,CAAO,QAAA,CAAS,IAAA,CAAK,iBAAA,CACxC,mBAAoB0J,CAAAA,CACpB,sBAAA,CAAwBC,CAAAA,CACxB,mBAAA,CAAqBE,EACrB,uBAAA,CAAyBE,CAAAA,CACzB,WAAA,CAAa/J,CAAAA,CAAO,WAAW,MAAA,CAC/B,aAAA,CAAeA,CAAAA,CAAO,aAAA,EAAe,MAAA,CACrC,YAAA,CAAcA,CAAAA,CAAO,YAAA,EAAc,OACnC,gBAAA,CAAkB,MAAA,CAClB,MAAA,CAAQoK,CAAAA,CACR,eAAgBD,CAAAA,CAChB,YAAA,CAAcnK,CAAAA,CAAO,mBAAA,CACrB,uBAAwBiK,CAAAA,CACxB,YAAA,CAAcjK,CAAAA,CAAO,YAAA,CACrB,aAAA,CAAeA,CAAAA,CAAO,iBAAA,CACtB,UAAA,CAAYA,EAAO,UAAA,CACnB,UAAA,CAAYA,CAAAA,CAAO,UAAA,CACnB,UAAWA,CAAAA,CAAO,UAAA,CAClB,QAAA,CAAUA,CAAAA,CAAO,KACjB,SAAA,CAAWP,CAAAA,CACX,WAAA,CAAaiI,CAAAA,CACf,CAEJ,CClJO,SAAS2C,EAAAA,CACdjS,CAAAA,CACkC,CAClC,GAAM,CACJ,EAAA,CAAAlE,CAAAA,CACA,KAAA,CAAAC,EACA,KAAA,CAAAmW,CAAAA,CACA,gBAAA,CAAAxV,CAAAA,CACA,eAAAqK,CAAAA,CACA,cAAA,CAAAkI,CAAAA,CACA,aAAA,CAAAG,CACF,CAAA,CAAIpP,CAAAA,CAEE,CAACmS,CAAAA,CAAOC,CAAQ,CAAA,CAAIC,aAAAA,CACxB/V,CAAAA,CACED,EAAsBP,CAAAA,CAAIC,CAAAA,CAAOmW,CAAAA,CAAM,OAAA,CAASxV,CAAgB,CAClE,CACF,CAAA,CAEM4V,CAAAA,CAAK3V,mBACTmB,CAAAA,CAAiBD,CAAAA,CAAU9B,CAAAA,CAAO,KAAA,CAAO,CAAA,CAAGW,CAAgB,CAAC,CAC/D,EACM6V,CAAAA,CAAK5V,kBAAAA,CACTmB,CAAAA,CAAiBD,CAAAA,CAAU9B,EAAO,KAAA,CAAO,CAAA,CAAGW,CAAgB,CAAC,CAC/D,CAAA,CACM8V,CAAAA,CAAK7V,kBAAAA,CACTmB,CAAAA,CAAiBD,CAAAA,CAAU9B,CAAAA,CAAO,KAAA,CAAO,CAAA,CAAGW,CAAgB,CAAC,CAC/D,CAAA,CACMwS,CAAAA,CAAerP,aAAAA,CAAQ,IAAM,CAACyS,CAAAA,CAAIC,EAAIC,CAAE,CAAA,CAAG,CAACF,CAAAA,CAAIC,CAAAA,CAAIC,CAAE,CAAC,CAAA,CAEvDC,EAAqBxT,iBAAAA,CACxByE,CAAAA,EAA+B,CAC9B0O,CAAAA,CAAUtR,IAAU,CAAE,GAAGA,CAAAA,CAAM,MAAA,CAAA4C,CAAO,CAAA,CAAE,CAAA,CACxCqD,CAAAA,GAAiBrD,CAAM,EACzB,CAAA,CACA,CAAC0O,CAAAA,CAAUrL,CAAc,CAC3B,CAAA,CAEMgL,CAAAA,CAAqB9S,iBAAAA,CACxBkJ,GAAmB,CAClBiK,CAAAA,CAAUtR,CAAAA,GAAU,CAAE,GAAGA,CAAAA,CAAM,MAAA,CAAAqH,CAAO,CAAA,CAAE,CAAA,CACxC8G,CAAAA,GAAiB9G,CAAM,EACzB,EACA,CAACiK,CAAAA,CAAUnD,CAAc,CAC3B,EAEA,OAAO,CACL,KAAA,CAAAiD,CAAAA,CACA,MAAAnW,CAAAA,CACA,MAAA,CAAQoW,CAAAA,CAAM,MAAA,CACd,kBAAA,CAAAM,CAAAA,CACA,MAAA,CAAQN,CAAAA,CAAM,OACd,kBAAA,CAAAJ,CAAAA,CACA,aAAA,CAAA3C,CAAAA,CACA,aAAAF,CACF,CACF,CC9CO,SAASwD,EAAAA,CAAoB,CAClC,MAAAR,CAAAA,CACA,KAAA,CAAAnW,CAAAA,CACA,MAAA,CAAA2H,EACA,cAAA,CAAAqD,CAAAA,CACA,MAAA,CAAAoB,CAAAA,CAAS,CAAA,CACT,cAAA,CAAA8G,CAAAA,CACA,aAAA,CAAAG,EACA,YAAA,CAAAF,CAAAA,CACA,MAAA,CAAAyD,CAAAA,CAAS,MAAA,CACT,IAAA,CAAAC,CAAAA,CAAO,IAAA,CACP,UAAAvL,CACF,CAAA,CAA6B,CAC3B,GAAM,CAAE,CAAA,CAAAlE,CAAE,CAAA,CAAImC,qBAAe,CACvB0E,CAAAA,CAAgBnK,aAAAA,CAAQ,IAAMnC,EAAyB3B,CAAK,CAAA,CAAG,CAACA,CAAK,CAAC,CAAA,CAEtE8W,CAAAA,CAAwB5T,iBAAAA,CAC3B/C,CAAAA,EAAa,CACZ+S,CAAAA,GAAiB,MAAA,CAAO/S,CAAG,CAAC,EAC9B,CAAA,CACA,CAAC+S,CAAc,CACjB,CAAA,CAEA,OACEpJ,eAAAA,CAAC,KAAA,CAAA,CACC,UAAWyB,KAAAA,CACT,0CAAA,CACAqL,CAAAA,GAAW,MAAA,EAAU,cAAA,CACrBA,CAAAA,GAAW,IAAA,EAAQ,YAAA,CACnBA,IAAW,IAAA,EAAQ,YAAA,CACnBA,CAAAA,GAAW,IAAA,EAAQ,aACnBC,CAAAA,GAAS,IAAA,EAAQ,UAAA,CACjBA,CAAAA,GAAS,MAAQ,aAAA,CACjBA,CAAAA,GAAS,IAAA,EAAQ,WAAA,CACjBvL,CACF,CAAA,CAEA,QAAA,CAAA,CAAA1B,cAAAA,CAAC2H,qBAAA,CAEC,SAAA,CAAU,0BAAA,CACV,SAAA,CAAS,KACT,OAAA,CAAQ,MAAA,CACR,KAAA,CAAO5J,CAAAA,CACP,cAAgBoJ,CAAAA,EAAM/F,CAAAA,CAAe,KAAA,CAAM+F,CAAC,CAAA,CAAI,MAAA,CAAYA,CAAC,CAAA,CAC7D,YAAW,IAAA,CACX,QAAA,CAAU,CAAA,CACV,aAAA,CAAe,CACb,qBAAA,CAAuBoF,CAAAA,CAAM,QAC/B,CAAA,CACA,KAAMU,CAAAA,CACN,YAAA,CACEjN,cAAAA,CAACmN,gBAAAA,CAAA,CACC,KAAA,CAAOF,CAAAA,GAAS,IAAA,CAAO,GAAKA,CAAAA,GAAS,IAAA,CAAO,EAAA,CAAK,EAAA,CACjD,OAAQA,CAAAA,GAAS,IAAA,CAAO,EAAA,CAAKA,CAAAA,GAAS,KAAO,EAAA,CAAK,EAAA,CAClD,SAAA,CAAU,wBAAA,CACZ,CAAA,CAEF,UAAA,CACEjN,cAAAA,CAACoN,YAAAA,CAAA,CACC,MAAA,CAAQb,CAAAA,CAAM,MAAA,CACd,IAAA,CAAMU,IAAS,IAAA,CAAO,EAAA,CAAKA,CAAAA,GAAS,IAAA,CAAO,GAAK,EAAA,CAChD,SAAA,CAAU,WAAA,CACZ,CAAA,CAEF,WAAA,CAAY,KAAA,CACZ,YAAA,CAAYzP,CAAAA,CAAE,0BAA0B,CAAA,CACxC,UAAA,CAAY,CACV,IAAA,CAAM,QAAA,CACN,WAAA,CAAa,QAAA,CACb,YAAA,CACE,sEACJ,CAAA,CAAA,CAjCK,CAAA,EAAGpH,CAAK,CAAA,CAAA,EAAImW,CAAAA,CAAM,OAAO,CAAA,CAkChC,CAAA,CAEAvM,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qDAAA,CAAsD,CAAA,CAErEA,eAACqN,kBAAAA,CAAA,CACC,KAAA,CAAM,SAAA,CACN,KAAMJ,CAAAA,CACN,WAAA,CAAa,MAAA,CAAOzK,CAAM,CAAA,CAC1B,iBAAA,CAAmB0K,CAAAA,CACnB,UAAA,CAAY,CACV,IAAA,CAAM,kBAAA,CACN,OAAA,CAASvL,KAAAA,CACP,wBACAsL,CAAAA,GAAS,IAAA,EAAQ,WAAA,CACjBA,CAAAA,GAAS,MAAQ,WAAA,CACjBA,CAAAA,GAAS,IAAA,EAAQ,aACnB,CAAA,CACA,GAAA,CAAKtL,KAAAA,CACH,QAAA,CACAsL,IAAS,IAAA,EAAQ,cAAA,CACjBA,CAAAA,GAAS,IAAA,EAAQ,iBACjBA,CAAAA,GAAS,IAAA,EAAQ,cACnB,CAAA,CACA,OAAQ,YACV,CAAA,CAEC,QAAA,CAAA,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQ,CAAE,CAAC,EAAE,GAAA,CAAI,CAACnC,CAAAA,CAAG7S,CAAAA,GACjC+H,cAAAA,CAAC0I,MAAAA,CAAA,CAEC,KAAA,CACE1I,eAAC8H,gBAAAA,CAAA,CACC,OAAA,CACE9H,cAAAA,CAACsN,EAAAA,CAAA,CACC,MAAA,CAAQ/D,CAAAA,GAAetR,CAAK,CAAA,EAAKoM,CAAAA,CACjC,KAAA,CAAOjO,CAAAA,CACT,EAEF,UAAA,CAAY,CACV,OAAA,CAAS,uBACX,EACA,MAAA,CAAQ,EAAA,CAER,QAAA,CAAA4J,cAAAA,CAAC,MAAA,CAAA,CACC,OAAA,CAAS,IAAMwC,CAAAA,GAAWvK,GAASwR,CAAAA,GAAgBxR,CAAK,CAAA,CAEvD,QAAA,CAAAuF,EAAE,oBAAA,CAAsB,CAAE,CAAA,CAAGvF,CAAAA,CAAQ,CAAE,CAAC,CAAA,CAC3C,CAAA,CACF,CAAA,CAAA,CAnBG,MAAA,CAAOA,CAAK,CAqBnB,CACD,EACH,CAAA,CAAA,CACF,CAEJ,CAMA,SAASqV,GAAc,CACrB,MAAA,CAAAlD,CAAAA,CACA,KAAA,CAAAhU,CACF,CAAA,CAGG,CACD,GAAM,CAAE,CAAA,CAAAoH,CAAE,CAAA,CAAImC,mBAAAA,GACRqH,CAAAA,CAAW9M,aAAAA,CAAQ,IAAMzC,EAAAA,CAAuBrB,CAAK,CAAA,CAAG,CAACA,CAAK,CAAC,CAAA,CAE/D8U,CAAAA,CACJd,CAAAA,CAAO,OAAA,EAAWA,CAAAA,CAAO,OAAA,GAAY,KAAA,CAAQA,CAAAA,CAAO,QAAU,KAAA,CAEhE,OACElK,eAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,iDAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,oDAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,yBAAA,CACd,QAAA,CAAA,CAAAF,cAAAA,CAACoL,gBAAA,CAAa,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,GAAI,CAAA,CACrCpL,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,cAAe,QAAA,CAAAxC,CAAAA,CAAE,uBAAuB,CAAA,CAAE,CAAA,CAAA,CAC5D,CAAA,CACAwC,cAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,iBAAA,CACb,QAAA,CAAAqL,qBAAAA,CAAAA,CAAejB,CAAAA,CAAO,UAAY,CAAA,EAAK,GAAG,CAAA,CAC7C,CAAA,CAAA,CACF,EACAlK,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oDAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,0BACd,QAAA,CAAA,CAAAF,cAAAA,CAACsL,cAAAA,CAAA,CAAY,MAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,CAAA,CACpCtL,eAAC,MAAA,CAAA,CAAK,SAAA,CAAU,aAAA,CACb,QAAA,CAAAxC,CAAAA,CAAE,CAAA,aAAA,EAAgBwJ,CAAAA,CAAS,OAAO,EAAE,CAAA,CACvC,CAAA,CAAA,CACF,CAAA,CACA9G,eAAAA,CAAC,QAAK,SAAA,CAAU,iBAAA,CACb,QAAA,CAAA,CAAAqL,mBAAAA,CAAYnB,EAAO,WAAA,EAAe,CAAC,CAAA,CAAE,GAAA,CAAEpD,CAAAA,CAAS,OAAA,CAAA,CACnD,CAAA,CAAA,CACF,CAAA,CACCA,EAAS,UAAA,EACR9G,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qDACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,0BACd,QAAA,CAAA,CAAAF,cAAAA,CAACwL,YAAAA,CAAA,CAAU,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,EAClCxL,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,aAAA,CAAe,SAAAxC,CAAAA,CAAE,qBAAqB,CAAA,CAAE,CAAA,CAAA,CAC1D,EACA0C,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iBAAA,CACb,QAAA,CAAA,CAAAqL,mBAAAA,CAAYnB,CAAAA,CAAO,MAAA,EAAU,CAAC,CAAA,CAAE,GAAA,CAAEpD,CAAAA,CAAS,UAAA,CAAA,CAC9C,CAAA,CAAA,CACF,CAAA,CAEF9G,eAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,oDAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,yBAAA,CACb,QAAA,CAAA,CAAAgL,CAAAA,GAAe,OAASlL,cAAAA,CAACkI,gBAAAA,CAAA,CAAc,KAAA,CAAO,GAAI,MAAA,CAAQ,EAAA,CAAI,CAAA,CAC9DgD,CAAAA,GAAe,WAAalL,cAAAA,CAACmI,aAAAA,CAAA,CAAW,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,CAAA,CAC/D+C,IAAe,QAAA,EAAYlL,cAAAA,CAACoI,iBAAAA,CAAA,CAAe,MAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,CAAA,CACnEpI,eAAC,MAAA,CAAA,CAAK,SAAA,CAAU,aAAA,CAAe,QAAA,CAAAxC,CAAAA,CAAE,sBAAsB,CAAA,CAAE,CAAA,CAAA,CAC3D,EACAwC,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iBAAA,CACb,SAAAxC,CAAAA,CAAE,CAAA,qBAAA,EAAwB0N,CAAU,CAAA,CAAE,EACzC,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CClNO,SAASqC,GAAwB,CACtC,IAAA,CAAAN,CAAAA,CACA,MAAA,CAAAD,EACA,SAAA,CAAAtL,CAAAA,CACA,GAAG8L,CACL,EAAiC,CAC/B,GAAM,CACJ,KAAA,CAAAjB,CAAAA,CACA,KAAA,CAAAnW,CAAAA,CACA,MAAA,CAAA2H,EACA,kBAAA,CAAA+O,CAAAA,CACA,MAAA,CAAAtK,CAAAA,CACA,mBAAA4J,CAAAA,CACA,aAAA,CAAA3C,CAAAA,CACA,YAAA,CAAAF,CACF,CAAA,CAAI+C,EAAAA,CAA2BkB,CAAY,CAAA,CAE3C,OACExN,cAAAA,CAAC+M,EAAAA,CAAA,CACC,MAAOR,CAAAA,CACP,KAAA,CAAOnW,CAAAA,CACP,MAAA,CAAQ2H,EACR,cAAA,CAAgB+O,CAAAA,CAChB,MAAA,CAAQtK,CAAAA,CACR,eAAgB4J,CAAAA,CAChB,aAAA,CAAe3C,CAAAA,CACf,YAAA,CAAcF,CAAAA,CACd,IAAA,CAAM0D,CAAAA,CACN,MAAA,CAAQD,EACR,SAAA,CAAWtL,CAAAA,CACb,CAEJ,CC3BO,SAAS+L,GACdpT,CAAAA,CAC2B,CAC3B,GAAM,CACJ,KAAA,CAAAjE,CAAAA,CACA,WAAA,CAAAiC,CAAAA,CAAc,EACd,gBAAA,CAAAqV,CAAAA,CAAmB,KAAA,CACnB,gBAAA,CAAA3W,EACA,QAAA,CAAA6P,CACF,CAAA,CAAIvM,CAAAA,CAEE,CAACrC,CAAAA,CAAWgM,CAAY,CAAA,CAAI9K,cAAAA,CAAyBwU,CAAgB,CAAA,CAErE,CAACrP,CAAAA,CAAOsP,CAAQ,CAAA,CAAIjB,aAAAA,CACxBvU,CAAAA,CACED,CAAAA,CAAU9B,EAAO4B,CAAAA,CAAWK,CAAAA,CAAatB,CAAgB,CAC3D,CACF,CAAA,CAEMkT,CAAAA,CAAe3Q,iBAAAA,CAClB+B,CAAAA,EAA4B,CAC3BsS,CAAAA,CAAStS,CAAI,CAAA,CACbuL,IAAW5O,CAAAA,CAAWqD,CAAI,EAC5B,CAAA,CACA,CAACsS,CAAAA,CAAU/G,CAAAA,CAAU5O,CAAS,CAChC,EAEA,OAAO,CACL,SAAA,CAAAA,CAAAA,CACA,YAAA,CAAAgM,CAAAA,CACA,KAAA,CAAA3F,CAAAA,CACA,aAAA4L,CACF,CACF,CCpCO,SAAS2D,EAAAA,CAAiB,CAC/B,gBAAA,CAAA/G,CAAAA,CACA,SAAA,CAAAnF,CAAAA,CACA,GAAG8L,CACL,EAA0B,CACxB,GAAM,CAAE,CAAA,CAAAhQ,CAAE,CAAA,CAAImC,mBAAAA,EAAe,CACvB,CAAE,UAAA3H,CAAAA,CAAW,YAAA,CAAAgM,CAAAA,CAAc,KAAA,CAAA3F,CAAAA,CAAO,YAAA,CAAA4L,CAAa,CAAA,CACnDwD,GAAoBD,CAAY,CAAA,CAElC,OACEtN,eAAAA,CAAC,OAAI,SAAA,CAAWyB,KAAAA,CAAG,WAAA,CAAaD,CAAS,EACvC,QAAA,CAAA,CAAAxB,eAAAA,CAAC2N,kBAAAA,CAAA,CACC,MAAA,CAAO,IAAA,CACP,KAAA,CAAM,SAAA,CACN,UAAS,IAAA,CACT,WAAA,CAAa7V,CAAAA,CACb,iBAAA,CAAoBzB,GAAayN,CAAAA,CAAazN,CAAqB,CAAA,CACnE,YAAA,CAAW,aAEX,QAAA,CAAA,CAAAyJ,cAAAA,CAAC0I,MAAAA,CAAA,CAAc,KAAA,CAAOlL,CAAAA,CAAE,YAAY,CAAA,CAAA,CAA3B,KAA8B,CAAA,CACvCwC,cAAAA,CAAC0I,MAAAA,CAAA,CAAe,KAAA,CAAOlL,CAAAA,CAAE,aAAa,CAAA,CAAA,CAA7B,MAAgC,CAAA,CAAA,CAC3C,CAAA,CACAwC,cAAAA,CAAC2G,EAAAA,CAAA,CACC,KAAA,CAAOtI,CAAAA,CACP,QAAA,CAAU4L,EACV,KAAA,CAAOuD,CAAAA,CAAa,KAAA,CACpB,gBAAA,CAAkB3G,EACpB,CAAA,CAAA,CACF,CAEJ,CCrCA,IAAMiH,EAAAA,CAAe,EAWd,SAASC,EAAAA,CACd1T,CAAAA,CACgC,CAChC,GAAM,CAAE,kBAAA,CAAA2T,CAAAA,CAAqB,EAAG,QAAA,CAAApH,CAAS,CAAA,CAAIvM,CAAAA,CAEvC,CAAChC,CAAAA,CAAa4V,CAAc,CAAA,CAAI/U,cAAAA,CAAS8U,CAAkB,CAAA,CAE3D5B,CAAAA,CAAqB9S,iBAAAA,CACzB,CAACtB,CAAAA,CAA4BqG,CAAAA,GAA6B,CACxDuI,CAAAA,GAAWvO,EAAaL,CAAAA,CAAWqG,CAAK,EAC1C,CAAA,CACA,CAACuI,CAAAA,CAAUvO,CAAW,CACxB,EAEA,OAAO,CACL,WAAA,CAAayV,EAAAA,CACb,WAAA,CAAAzV,CAAAA,CACA,cAAA,CAAA4V,CAAAA,CACA,mBAAA7B,CACF,CACF,CC1BO,SAAS8B,EAAAA,CAAsB,CACpC,gBAAA,CAAAR,CAAAA,CACA,gBAAA,CAAA7G,CAAAA,CACA,SAAA,CAAAnF,CAAAA,CACA,GAAG8L,CACL,CAAA,CAA+B,CAC7B,GAAM,CAAE,CAAA,CAAAhQ,CAAE,CAAA,CAAImC,mBAAAA,GACR,CAAE,WAAA,CAAAwO,CAAAA,CAAa,WAAA,CAAA9V,CAAAA,CAAa,cAAA,CAAA4V,CAAAA,CAAgB,kBAAA,CAAA7B,CAAmB,CAAA,CACnE2B,EAAAA,CAAyBP,CAAY,CAAA,CAEvC,OACEtN,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWyB,KAAAA,CAAG,YAAaD,CAAS,CAAA,CACvC,QAAA,CAAA,CAAA1B,cAAAA,CAAC6N,kBAAAA,CAAA,CACC,MAAA,CAAO,IAAA,CACP,UAAS,IAAA,CACT,KAAA,CAAM,SAAA,CACN,WAAA,CAAa,MAAA,CAAOxV,CAAW,CAAA,CAC/B,iBAAA,CAAoB9B,GAAa0X,CAAAA,CAAe,MAAA,CAAO1X,CAAG,CAAC,CAAA,CAC3D,gBAAA,CAAkBsQ,CAAAA,CAClB,YAAA,CAAYrJ,EAAE,sBAAsB,CAAA,CAEnC,QAAA,CAAA,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQ2Q,CAAY,CAAA,CAAG,CAACrD,EAAGpS,CAAAA,GACvCsH,cAAAA,CAAC0I,MAAAA,CAAA,CAAoB,KAAA,CAAOlL,CAAAA,CAAE,oBAAA,CAAsB,CAAE,EAAG9E,CAAAA,CAAI,CAAE,CAAC,CAAA,CAAA,CAAtD,OAAOA,CAAC,CAAiD,CACpE,CAAA,CACH,EACAsH,cAAAA,CAAC4N,EAAAA,CAAA,CACC,KAAA,CAAOJ,CAAAA,CAAa,KAAA,CACpB,WAAA,CAAanV,CAAAA,CACb,iBAAkBqV,CAAAA,CAClB,gBAAA,CAAkBF,CAAAA,CAAa,gBAAA,CAC/B,SAAUpB,CAAAA,CACV,gBAAA,CAAkBvF,CAAAA,CACpB,CAAA,CAAA,CACF,CAEJ,CC5BA,IAAMuH,EAAAA,CAAmB,QAAA,CAWlB,SAASC,GAAgB,CAAE,EAAA,CAAAlY,CAAAA,CAAKiY,EAAiB,EAAoB,CAC1E,OACEpO,cAAAA,CAACsO,qBAAAA,CAAA,CAAkC,EAAA,CAAInY,CAAAA,CACpC,QAAA,CAACoY,CAAAA,EAAevO,cAAAA,CAACwO,EAAAA,CAAA,CAAwB,GAAGD,EAAY,CAAA,CAC3D,CAEJ,CAEA,SAASC,GAAuB,CAC9B,MAAA,CAAAnU,CAAAA,CAAS,CAAE,OAAQ,CAACuB,WAAAA,CAAM,MAAA,CAAQA,WAAAA,CAAM,QAAA,CAAUA,WAAAA,CAAM,OAAO,CAAE,EACjE,MAAA,CAAA0D,CAAAA,CACA,YAAA,CAAAC,CACF,CAAA,CAAiD,CAC/C,GAAM,CAAE,EAAA/B,CAAE,CAAA,CAAImC,mBAAAA,EAAe,CAEvB,CACJ,MAAA,CAAA8O,CAAAA,CACA,YAAA,CAAAC,EACA,gBAAA,CAAAhB,CAAAA,CACA,kBAAA,CAAAM,CAAAA,CACA,iBAAAjX,CAAAA,CACA,QAAA,CAAA6P,CACF,CAAA,CAAIvM,EAEE,CAACjE,CAAAA,CAAOuY,CAAQ,CAAA,CAAIzV,cAAAA,CAAgBwV,CAAAA,EAAgBD,CAAAA,CAAO,CAAC,CAAC,CAAA,CAEnE9T,eAAAA,CAAU,IAAM,CACdgU,EAASD,CAAAA,EAAgBD,CAAAA,CAAO,CAAC,CAAC,EACpC,CAAA,CAAG,CAACC,CAAAA,CAAcD,CAAM,CAAC,CAAA,CAEzB,IAAMrC,CAAAA,CAAqB9S,kBACzB,CACEjB,CAAAA,CACAL,CAAAA,CACAqG,CAAAA,GACG,CACHuI,CAAAA,GAAWxQ,CAAAA,CAAOiC,CAAAA,CAAaL,CAAAA,CAAWqG,CAAK,EACjD,CAAA,CACA,CAACuI,CAAAA,CAAUxQ,CAAK,CAClB,CAAA,CAEA,OACE4J,eAAC4O,cAAAA,CAAA,CAAY,MAAA,CAAQtP,CAAAA,CAAQ,aAAcC,CAAAA,CAAc,IAAA,CAAK,IAAA,CAC5D,QAAA,CAAAW,gBAACC,eAAAA,CAAA,CACC,QAAA,CAAA,CAAAH,cAAAA,CAACI,cAAAA,CAAA,CACC,QAAA,CAAAF,eAAAA,CAAC,OAAI,SAAA,CAAU,gDAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,QAAK,SAAA,CAAU,gFAAA,CACb,QAAA,CAAAxC,CAAAA,CAAE,mCAAmC,CAAA,CACxC,CAAA,CACAwC,cAAAA,CAAC6O,iCAAAA,CAAA,CACC,UAAA,CAAYJ,CAAAA,CACZ,KAAA,CAAOrY,EACP,aAAA,CAAeuY,CAAAA,CACjB,CAAA,CAAA,CACF,CAAA,CACF,EACA3O,cAAAA,CAACK,YAAAA,CAAA,CACC,QAAA,CAAAL,eAAC8O,eAAAA,CAAA,CACC,QAAA,CAAA9O,cAAAA,CAACkO,EAAAA,CAAA,CACC,KAAA,CAAO9X,CAAAA,CACP,iBAAkBsX,CAAAA,CAClB,kBAAA,CAAoBM,CAAAA,CACpB,gBAAA,CAAkBjX,EAClB,QAAA,CAAUqV,CAAAA,CACZ,CAAA,CACF,CAAA,CACF,GACF,CAAA,CACF,CAEJ,CCtFO,SAAS2C,EAAAA,CACdhR,CAAAA,CACAwO,CAAAA,CACAyC,CAAAA,CACAzF,CAAAA,CACAnT,EACqC,CACrC,IAAM2P,CAAAA,CAAehO,CAAAA,CAAyB3B,CAAK,CAAA,CAE7C6Y,CAAAA,CAAY,IAAInJ,mBAAAA,CAAU/H,CAAM,CAAA,CACnC,SAAA,CAAUwO,CAAAA,CAAM,QAAQ,CAAA,CACxB,aAAA,CAAc,CAAC,CAAA,CACf,UAAS,CAEN2C,CAAAA,CAAc,IAAIpJ,mBAAAA,CACtByD,EAAa,WAAA,EAAexD,CAAAA,CAAa,WAAA,EAAe,CAC1D,EACG,SAAA,CAAUwG,CAAAA,CAAM,QAAQ,CAAA,CACxB,aAAA,CAAc,CAAC,CAAA,CACf,QAAA,GAEG4C,CAAAA,CAAS,IAAIrJ,mBAAAA,CAAUyD,CAAAA,CAAa,QAAUxD,CAAAA,CAAa,MAAA,EAAU,CAAC,CAAA,CACzE,UAAUwG,CAAAA,CAAM,QAAQ,CAAA,CACxB,aAAA,CAAc,CAAC,CAAA,CACf,QAAA,EAAS,CAEZ,OAAO,CACL,KAAA,CAAOA,CAAAA,CAAM,OAAA,CACb,OAAAyC,CAAAA,CACA,MAAA,CAAQC,CAAAA,CACR,QAAA,CAAU1F,EAAa,QAAA,EAAYxD,CAAAA,CAAa,QAAA,EAAY,CAAA,CAC5D,WAAA,CAAAmJ,CAAAA,CACA,MAAA,CAAAC,CAAAA,CACA,UAAW5F,CAAAA,CAAa,OAAA,GAAY,KACtC,CACF,CCtBO,SAAS6F,EAAAA,CACd/U,CAAAA,CAC6B,CAC7B,GAAM,CACJ,EAAA,CAAAlE,CAAAA,CACA,KAAA,CAAAC,CAAAA,CACA,KAAA,CAAAmW,CAAAA,CACA,MAAA,CAAAyC,EACA,gBAAA,CAAAjY,CAAAA,CACA,eAAA,CAAA0N,CAAAA,CACA,YAAAC,CACF,CAAA,CAAIrK,CAAAA,CAEE,CAAE,OAAA0D,CAAAA,CAAQ,MAAA,CAAAyE,CAAO,CAAA,CAAIxL,kBAAAA,CACzBL,CAAAA,CACED,CAAAA,CAAsBP,CAAAA,CAAIC,EAAOmW,CAAAA,CAAM,OAAA,CAASxV,CAAgB,CAClE,CACF,CAAA,CAEMwS,CAAAA,CAAevS,kBAAAA,CACnBmB,CAAAA,CAAiBD,EAAU9B,CAAAA,CAAO,KAAA,CAAOoM,CAAAA,CAAQzL,CAAgB,CAAC,CACpE,CAAA,CAEMyC,CAAAA,CAAS6V,mCAAmBjZ,CAAK,CAAA,CAEjC,CAAE,IAAA,CAAAiD,CAAAA,CAAM,UAAA,CAAAL,CAAW,CAAA,CAAIJ,GAAQ,CACnC,WAAA,CAAa6L,CAAAA,CACb,OAAA,CAASC,CACX,CAAC,CAAA,CAEKgC,CAAAA,CAAa,CAAC3I,CAAAA,EAAU,CAACiR,CAAAA,CAEzBM,CAAAA,CAAaC,gCAAgB,SAAY,CAC7C,GAAI,CAACxR,GAAU,CAACvE,CAAAA,EAAU,CAACwV,CAAAA,CAAQ,OAEnC,IAAM3U,CAAAA,CAAS0U,EAAAA,CAAgBhR,EAAQwO,CAAAA,CAAOyC,CAAAA,CAAQzF,CAAAA,CAAcnT,CAAK,EAEzE,GAAI,CACF,MAAMiD,CAAAA,CAAK,CAAE,GAAGgB,CAAAA,CAAQ,KAAA,CAAAjE,CAAAA,CAAO,MAAA,CAAAoD,CAAO,CAAC,EACzC,MAAQ,CAER,CACF,CAAA,CAAG,CAACA,EAAQuE,CAAAA,CAAQiR,CAAAA,CAAQ5Y,CAAAA,CAAOmW,CAAAA,CAAOhD,EAAclQ,CAAI,CAAC,CAAA,CAE7D,OAAOa,aAAAA,CACL,KAAO,CACL,MAAA,CAAA6D,EACA,KAAA,CAAAwO,CAAAA,CACA,UAAA,CAAA7F,CAAAA,CACA,UAAA,CAAA1N,CAAAA,CACA,UAAA,CAAAsW,CACF,GACA,CAACvR,CAAAA,CAAQwO,CAAAA,CAAO7F,CAAAA,CAAY1N,CAAAA,CAAYsW,CAAU,CACpD,CACF,CCvEO,SAASE,EAAAA,CAAyB,CACvC,IAAA,CAAAvC,CAAAA,CAAO,IAAA,CACP,MAAA,CAAAD,CAAAA,CACA,KAAA,CAAAyC,EAAQ,SAAA,CACR,SAAA,CAAA/N,CAAAA,CACA,GAAG8L,CACL,CAAA,CAAkC,CAChC,GAAM,CAAE,OAAAzP,CAAAA,CAAQ,KAAA,CAAAwO,CAAAA,CAAO,UAAA,CAAA7F,CAAAA,CAAY,UAAA,CAAA1N,CAAAA,CAAY,UAAA,CAAAsW,CAAW,CAAA,CACxDF,EAAAA,CAA4B5B,CAAY,CAAA,CAE1C,OACExN,cAAAA,CAACa,SAAAA,CAAA,CACC,SAAA,CAAS,KACT,IAAA,CAAMoM,CAAAA,CACN,MAAA,CAAQD,CAAAA,CACR,KAAA,CAAOyC,CAAAA,CACP,SAAA,CAAW/N,CAAAA,CACX,cAAa,IAAA,CACb,YAAA,CAAc1B,cAAAA,CAACmN,gBAAAA,CAAA,EAAc,CAAA,CAC7B,UAAA,CAAYzG,CAAAA,CACZ,UAAW1N,CAAAA,CACX,OAAA,CAASsW,CAAAA,CAER,QAAA,CAAAvR,CAAAA,EAAU,IAAA,CAAO,CAAA,EAAGA,CAAM,IAAIwO,CAAAA,CAAM,MAAM,CAAA,CAAA,CAAKA,CAAAA,CAAM,OACxD,CAEJ,CCvBA,IAAMmD,EAAAA,CAA0B3M,oBAAyC,IAAI,CAAA,CAatE,SAAS4M,EAAAA,CAAyB,CACvC,KAAA,CAAAvZ,CAAAA,CACA,eAAA,CAAAqO,EACA,WAAA,CAAAC,CAAAA,CACA,QAAA,CAAApB,CACF,EAAkC,CAChC,IAAM9J,CAAAA,CAAS6V,kCAAAA,CAAmBjZ,CAAK,CAAA,CACjC,CAAE,IAAA,CAAAiD,CAAK,CAAA,CAAIT,EAAAA,CAAQ,CACvB,WAAA,CAAa6L,EACb,OAAA,CAASC,CACX,CAAC,CAAA,CAEKkL,EAAYxW,YAAAA,CAAOI,CAAM,CAAA,CAC/BoW,CAAAA,CAAU,QAAUpW,CAAAA,CACpB,IAAMqW,CAAAA,CAAUzW,YAAAA,CAAOC,CAAI,CAAA,CAC3BwW,CAAAA,CAAQ,OAAA,CAAUxW,EAClB,IAAMyW,CAAAA,CAAW1W,YAAAA,CAAOhD,CAAK,EAC7B0Z,CAAAA,CAAS,OAAA,CAAU1Z,CAAAA,CAEnB,IAAM2Z,EAAazW,iBAAAA,CACjB,MACEC,CAAAA,EACoC,CACpC,IAAMqD,CAAAA,CAAIgT,CAAAA,CAAU,OAAA,CACpB,GAAKhT,CAAAA,CACL,OAAOiT,CAAAA,CAAQ,OAAA,CAAQ,CAAE,GAAGtW,CAAAA,CAAO,MAAA,CAAQqD,CAAAA,CAAG,MAAOkT,CAAAA,CAAS,OAAQ,CAAC,CACzE,CAAA,CACA,EACF,CAAA,CAEME,EAAWT,+BAAAA,CAAgBQ,CAAAA,CAAY,EAAE,EAE/C,OACE/P,cAAAA,CAAC0P,EAAAA,CAAwB,QAAA,CAAxB,CAAiC,KAAA,CAAOM,CAAAA,CACtC,QAAA,CAAA1M,CAAAA,CACH,CAEJ,CAQO,SAAS2M,EAAAA,EAA0C,CACxD,IAAMhN,CAAAA,CAAMC,gBAAAA,CAAWwM,EAAuB,CAAA,CAC9C,GAAIzM,CAAAA,GAAQ,IAAA,CACV,MAAM,IAAI,KAAA,CACR,qEACF,CAAA,CAEF,OAAOA,CACT,CCvDO,SAASiN,EAAAA,CACd7V,CAAAA,CACiC,CACjC,GAAM,CAAE,GAAAlE,CAAAA,CAAI,KAAA,CAAAC,CAAAA,CAAO,KAAA,CAAAmW,EAAO,MAAA,CAAAyC,CAAAA,CAAQ,gBAAA,CAAAjY,CAAiB,EAAIsD,CAAAA,CAEjD,CAAE,MAAA,CAAA0D,CAAAA,CAAQ,MAAA,CAAAyE,CAAO,CAAA,CAAIxL,kBAAAA,CACzBL,EACED,CAAAA,CAAsBP,CAAAA,CAAIC,CAAAA,CAAOmW,CAAAA,CAAM,QAASxV,CAAgB,CAClE,CACF,CAAA,CAEMwS,EAAevS,kBAAAA,CACnBmB,CAAAA,CAAiBD,CAAAA,CAAU9B,CAAAA,CAAO,KAAA,CAAOoM,CAAAA,CAAQzL,CAAgB,CAAC,CACpE,CAAA,CAEMsC,CAAAA,CAAO4W,EAAAA,EAAoB,CAE3B,CAACjX,CAAAA,CAAYC,CAAa,CAAA,CAAIC,cAAAA,CAAS,KAAK,CAAA,CAE5CwN,CAAAA,CAAa,CAAC3I,CAAAA,EAAU,CAACiR,CAAAA,CAIzBmB,CAAAA,CAAW/W,YAAAA,CAAOmT,CAAK,CAAA,CAC7B4D,CAAAA,CAAS,OAAA,CAAU5D,CAAAA,CACnB,IAAM6D,CAAAA,CAAkBhX,YAAAA,CAAOmQ,CAAY,CAAA,CAC3C6G,EAAgB,OAAA,CAAU7G,CAAAA,CAC1B,IAAMuG,CAAAA,CAAW1W,YAAAA,CAAOhD,CAAK,CAAA,CAC7B0Z,CAAAA,CAAS,QAAU1Z,CAAAA,CAEnB,IAAMkZ,CAAAA,CAAahW,iBAAAA,CAAY,SAAY,CACzC,GAAI,CAACyE,CAAAA,EAAU,CAACiR,CAAAA,CAAQ,OAExB,IAAM3U,CAAAA,CAAS0U,EAAAA,CACbhR,CAAAA,CACAoS,CAAAA,CAAS,OAAA,CACTnB,EACAoB,CAAAA,CAAgB,OAAA,CAChBN,CAAAA,CAAS,OACX,EAEA7W,CAAAA,CAAc,IAAI,CAAA,CAClB,GAAI,CACF,MAAMI,CAAAA,CAAKgB,CAAM,EACnB,CAAA,KAAQ,CAER,CAAA,OAAE,CACApB,EAAc,KAAK,EACrB,CACF,CAAA,CAAG,CAAC8E,CAAAA,CAAQiR,CAAAA,CAAQ3V,CAAI,CAAC,CAAA,CAEzB,OAAOa,aAAAA,CACL,KAAO,CACL,MAAA,CAAA6D,CAAAA,CACA,KAAA,CAAAwO,EACA,UAAA,CAAA7F,CAAAA,CACA,UAAA,CAAA1N,CAAAA,CACA,WAAAsW,CACF,CAAA,CAAA,CACA,CAACvR,CAAAA,CAAQwO,EAAO7F,CAAAA,CAAY1N,CAAAA,CAAYsW,CAAU,CACpD,CACF,CCtEO,IAAMe,EAAAA,CAA+BC,UAAAA,CAC1C,SAAsC,CACpC,IAAA,CAAArD,CAAAA,CAAO,IAAA,CACP,OAAAD,CAAAA,CACA,KAAA,CAAAyC,CAAAA,CAAQ,SAAA,CACR,UAAA/N,CAAAA,CACA,GAAG8L,CACL,CAAA,CAAsC,CACpC,GAAM,CAAE,MAAA,CAAAzP,CAAAA,CAAQ,KAAA,CAAAwO,CAAAA,CAAO,UAAA,CAAA7F,CAAAA,CAAY,WAAA1N,CAAAA,CAAY,UAAA,CAAAsW,CAAW,CAAA,CACxDY,GAAgC1C,CAAY,CAAA,CAE9C,OACExN,cAAAA,CAACa,UAAA,CACC,OAAA,CAAQ,OAAA,CACR,SAAA,CAAS,IAAA,CACT,IAAA,CAAMoM,CAAAA,CACN,MAAA,CAAQD,EACR,KAAA,CAAOyC,CAAAA,CACP,SAAA,CAAW/N,CAAAA,CACX,cAAa,IAAA,CACb,YAAA,CAAc1B,cAAAA,CAACmN,gBAAAA,CAAA,CAAc,SAAA,CAAU,WAAA,CAAY,CAAA,CACnD,UAAA,CAAYzG,CAAAA,CACZ,SAAA,CAAW1N,CAAAA,CACX,OAAA,CAASsW,EAER,QAAA,CAAAvR,CAAAA,EAAU,IAAA,CAAO,CAAA,EAAGA,CAAM,CAAA,CAAA,EAAIwO,CAAAA,CAAM,MAAM,CAAA,CAAA,CAAKA,EAAM,MAAA,CACxD,CAEJ,CACF,ECtCI,OAAO,MAAA,CAAW,GAAA,GACpB,MAAA,CAAO,oBAAsB,MAAA,CAAO,mBAAA,EAAuB,EAAC,CAC5D,OAAO,mBAAA,CAAoB,sBAAsB,CAAA,CAAI,QAAA,CAAA,KAGhDgE,EAAAA,CAAQ","file":"index.js","sourcesContent":["\"use client\";\n\nimport { atomFamily } from \"jotai-family\";\nimport { atomWithStorage } from \"jotai/utils\";\nimport type { Chain } from \"@liberfi.io/types\";\n\nexport interface AmountPresetState {\n amount: number | undefined;\n preset: number;\n}\n\nconst DEFAULT_PREFIX = \"liberfi.\";\n\nconst DEFAULT_STATE: AmountPresetState = { amount: undefined, preset: 0 };\n\nfunction storageKey(\n prefix: string,\n id: string,\n chain: string,\n tokenAddress: string,\n): string {\n return `${prefix}instant-trade.${id}.${chain}.${tokenAddress}`;\n}\n\nfunction parseKey(key: string): {\n prefix: string;\n id: string;\n chain: Chain;\n tokenAddress: string;\n} {\n const sep = key.lastIndexOf(\":\");\n const prefix = key.slice(0, sep + 1);\n const rest = key.slice(sep + 1);\n const [id, chain, tokenAddress] = rest.split(\".\");\n return {\n prefix,\n id,\n chain: chain as Chain,\n tokenAddress,\n };\n}\n\n/**\n * Construct an atomFamily key for instant-trade amount + preset state.\n *\n * @param id - Business identifier (e.g. `\"token-detail\"`).\n * @param chain - Target chain.\n * @param tokenAddress - Payment token address.\n * @param prefix - Storage key prefix. Defaults to `\"liberfi.\"`.\n */\nexport function instantTradeAmountKey(\n id: string,\n chain: Chain,\n tokenAddress: string,\n prefix: string = DEFAULT_PREFIX,\n): string {\n return `${prefix}:${id}.${chain}.${tokenAddress}`;\n}\n\n/**\n * Atom family for instant-trade amount and preset index, persisted via `atomWithStorage`.\n *\n * Each atom is keyed by a string built with {@link instantTradeAmountKey}.\n * The storage key includes `id`, `chain`, and `tokenAddress` so the same token\n * on different chains (e.g. USDC on Solana vs Ethereum) has separate persisted values.\n */\nexport const instantTradeAmountAtomFamily = atomFamily((key: string) => {\n const { prefix, id, chain, tokenAddress } = parseKey(key);\n return atomWithStorage<AmountPresetState>(\n storageKey(prefix, id, String(chain), tokenAddress),\n DEFAULT_STATE,\n undefined,\n { getOnInit: true },\n );\n});\n","import { useAtomValue } from \"jotai\";\nimport type { Chain } from \"@liberfi.io/types\";\nimport {\n instantTradeAmountAtomFamily,\n instantTradeAmountKey,\n type AmountPresetState,\n} from \"../states/instant-trade-amount\";\n\nexport interface UseInstantTradeAmountParams {\n /** Business identifier (e.g. `\"token-detail\"`). */\n id: string;\n /** Target chain. */\n chain: Chain;\n /** Payment token address. */\n tokenAddress: string;\n /** Storage key prefix. Must match the prefix used by the corresponding AmountPresetInputWidget. Defaults to `\"liberfi.\"`. */\n storageKeyPrefix?: string;\n}\n\n/**\n * Read the persisted instant-trade amount and preset index for a given id / chain / token.\n *\n * The value is sourced from the same `atomWithStorage` atom family that\n * {@link AmountPresetInputWidget} writes to, so it stays in sync automatically.\n */\nexport function useInstantTradeAmount({\n id,\n chain,\n tokenAddress,\n storageKeyPrefix,\n}: UseInstantTradeAmountParams): AmountPresetState {\n return useAtomValue(\n instantTradeAmountAtomFamily(\n instantTradeAmountKey(id, chain, tokenAddress, storageKeyPrefix),\n ),\n );\n}\n","import { Chain, API } from \"@liberfi.io/types\";\nimport type { WalletAdapter } from \"@liberfi.io/wallet-connector\";\n\n/**\n * Input parameters for the `swap()` function returned by {@link useSwap}.\n *\n * The caller provides chain, wallet, token addresses, amount and optional\n * chain-specific settings. The hook handles route fetching, signing and\n * transaction submission internally.\n */\nexport interface SwapInput {\n /** Target chain */\n chain: Chain;\n /** Wallet adapter used to sign the transaction */\n wallet: WalletAdapter;\n /** Input token address */\n input: string;\n /** Output token address */\n output: string;\n /** Amount in smallest unit (lamports for Solana, wei for EVM) */\n amount: string;\n /** Swap mode, defaults to EXACT_IN */\n mode?: API.SwapMode;\n /** Slippage tolerance, 0-100, defaults to 1 */\n slippage?: number;\n\n // -- Solana-specific --\n /** Priority fee in microLamports (Solana only) */\n priorityFee?: string;\n /** Jito/0solt tip fee in lamports (Solana only) */\n tipFee?: string;\n /** Enable anti-MEV via Jito/0solt (Solana only) */\n isAntiMev?: boolean;\n\n // -- EVM-specific --\n /** EIP-2612 permit data, alternative to on-chain approve (EVM only) */\n permit?: string;\n /** Transaction deadline timestamp in ms (EVM only) */\n deadline?: number;\n}\n\n/** Result returned after a swap transaction is successfully submitted. */\nexport interface SwapResult {\n /** Transaction hash / signature */\n txHash: string;\n /** Extra data from the API (e.g. jobId for confirmation polling) */\n extra?: Record<string, unknown>;\n}\n\n/** Phase of the swap flow, used in error callbacks. */\nexport type SwapPhase = \"route\" | \"sign\" | \"send\";\n\n/** Options for the {@link useSwap} hook. */\nexport interface UseSwapOptions {\n /** Called when the transaction is successfully submitted on-chain. */\n onSubmitted?: (result: SwapResult) => void;\n /** Called when an error occurs at any phase of the swap flow. */\n onError?: (error: Error, phase: SwapPhase) => void;\n}\n\n/** Options for the {@link useSwapRoutePolling} hook. */\nexport interface UseSwapRoutePollingOptions {\n /** Polling interval in ms. Defaults to 12000 (12s). */\n interval?: number;\n /** Pause polling (e.g. during swap execution). */\n paused?: boolean;\n /** Called when a route fetch fails. */\n onError?: (error: Error) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Instant Trade Preset\n// ---------------------------------------------------------------------------\n\n/** Configuration values for a single trade preset (slippage, fees, MEV). */\nexport interface TradePresetValues {\n /** Slippage tolerance, 0-100 (percent). `null` = use default. */\n slippage: number | null;\n\n // -- Solana-specific --\n /** Priority fee in SOL. `null` = use default. (Solana only) */\n priorityFee: number | null;\n /** Whether automatic fee estimation is enabled. (Solana only) */\n autoFee: boolean;\n /** Maximum fee cap when auto-fee is on, in SOL. (Solana only) */\n maxAutoFee: number | null;\n\n // -- EVM-specific --\n /** Gas fee in Gwei. `null` = use default. (EVM only) */\n gasFee: number | null;\n\n // -- Shared (chain-dependent visibility) --\n /** Tip/bribe fee in native token units. `null` = not applicable. (Solana, BSC) */\n tipFee: number | null;\n /** Anti-MEV protection level. */\n antiMev: \"off\" | \"reduced\" | \"secure\";\n /** Custom RPC endpoint URL. `null` = use default. */\n customRPC: string | null;\n}\n\n/** Default preset values matching Solana-typical settings. */\nexport const DEFAULT_SOL_TRADE_PRESET: TradePresetValues = {\n slippage: 20,\n priorityFee: 0.001,\n autoFee: false,\n maxAutoFee: 0.1,\n gasFee: null,\n tipFee: 0.001,\n antiMev: \"reduced\",\n customRPC: null,\n};\n\n/** Default preset values for EVM chains (gas fee in Gwei). */\nexport const DEFAULT_EVM_TRADE_PRESET: TradePresetValues = {\n slippage: 20,\n priorityFee: null,\n autoFee: false,\n maxAutoFee: null,\n gasFee: 2,\n tipFee: null,\n antiMev: \"off\",\n customRPC: null,\n};\n\n/** Default preset values for BSC (gas in Gwei + tip in BNB). */\nexport const DEFAULT_BSC_TRADE_PRESET: TradePresetValues = {\n slippage: 30,\n priorityFee: null,\n autoFee: false,\n maxAutoFee: null,\n gasFee: 2,\n tipFee: 0,\n antiMev: \"off\",\n customRPC: null,\n};\n\n/** Default quick-buy amounts keyed by token symbol. */\nconst DEFAULT_BUY_AMOUNTS_MAP: Record<string, number[]> = {\n SOL: [0.01, 0.1, 1, 10],\n ETH: [0.01, 0.02, 0.5, 1],\n BNB: [0.025, 0.05, 0.1, 0.25],\n USDC: [25, 50, 100, 200],\n USDT: [25, 50, 100, 200],\n};\n\nconst DEFAULT_BUY_AMOUNTS_FALLBACK: number[] = [1, 10, 25, 50];\n\n/** Returns default quick-buy amounts for the given token symbol. */\nexport function getDefaultBuyAmounts(symbol: string): number[] {\n return DEFAULT_BUY_AMOUNTS_MAP[symbol] ?? DEFAULT_BUY_AMOUNTS_FALLBACK;\n}\n\n/** Default quick-sell percentages. */\nexport const DEFAULT_SELL_PERCENTAGES: number[] = [10, 25, 50, 100];\n\n/** Confirmation status of a tracked transaction. */\nexport type TxConfirmationStatus = \"idle\" | \"pending\" | \"confirmed\" | \"failed\";\n\n/** Options for the {@link useTxConfirmation} hook. */\nexport interface UseTxConfirmationOptions {\n /** Called when the transaction is confirmed on-chain. */\n onConfirmed?: (txHash: string) => void;\n /** Called when the transaction fails or confirmation times out. */\n onFailed?: (txHash: string, error: Error) => void;\n /** SSE timeout in milliseconds. Defaults to 60000 (60s). */\n timeout?: number;\n}\n","import { Chain } from \"@liberfi.io/types\";\nimport {\n getNativeToken,\n isSolanaChain,\n isBinanceChain,\n} from \"@liberfi.io/utils\";\nimport {\n DEFAULT_SOL_TRADE_PRESET,\n DEFAULT_EVM_TRADE_PRESET,\n DEFAULT_BSC_TRADE_PRESET,\n type TradePresetValues,\n} from \"../../types\";\n\nexport type AntiMevOption = \"off\" | \"reduced\" | \"secure\";\n\nexport type FeeType = \"priorityFee\" | \"gasFee\";\n\nexport interface ChainPresetFeatures {\n /** Native token symbol (e.g. \"SOL\", \"ETH\", \"BNB\") */\n nativeSymbol: string;\n /** Semantic fee type — UI maps this to a translated label via i18n key. */\n feeType: FeeType;\n /** Unit displayed for the fee input (e.g. \"SOL\", \"Gwei\") */\n feeUnit: string;\n /** Decimal places for the fee input */\n feeDecimals: number;\n /** Whether this chain supports a separate tip/bribe fee */\n showTipFee: boolean;\n /** Unit for tip fee (e.g. \"SOL\", \"BNB\"). Empty when hidden. */\n tipFeeUnit: string;\n /** Decimal places for the tip fee input */\n tipFeeDecimals: number;\n /** Whether this chain supports automatic fee estimation */\n showAutoFee: boolean;\n /** Whether this chain supports custom RPC endpoint */\n showCustomRPC: boolean;\n /**\n * Available anti-MEV protection levels for this chain.\n * - Solana: [\"off\", \"reduced\", \"secure\"]\n * - ETH / BSC: [\"off\", \"secure\"]\n */\n antiMevOptions: AntiMevOption[];\n}\n\n/**\n * Returns the set of preset form features applicable to a given chain.\n *\n * - Solana: priority fee (SOL), tip fee (SOL/Jito), anti-MEV\n * - Ethereum: gas fee (Gwei) only\n * - BSC: gas fee (Gwei) + tip fee (BNB)\n * - Other EVM: gas fee (Gwei), same as Ethereum by default\n */\nexport function getChainPresetFeatures(chain: Chain): ChainPresetFeatures {\n const nativeToken = getNativeToken(chain);\n if (!nativeToken) {\n throw new Error(`No native token defined for chain \"${chain}\"`);\n }\n const nativeSymbol = nativeToken.symbol;\n\n if (isSolanaChain(chain)) {\n return {\n nativeSymbol,\n feeType: \"priorityFee\",\n feeUnit: nativeSymbol,\n feeDecimals: 9,\n showTipFee: true,\n tipFeeUnit: nativeSymbol,\n tipFeeDecimals: 9,\n showAutoFee: true,\n showCustomRPC: true,\n antiMevOptions: [\"off\", \"reduced\", \"secure\"],\n };\n }\n\n if (isBinanceChain(chain)) {\n return {\n nativeSymbol,\n feeType: \"gasFee\",\n feeUnit: \"Gwei\",\n feeDecimals: 2,\n showTipFee: true,\n tipFeeUnit: nativeSymbol,\n tipFeeDecimals: 9,\n showAutoFee: false,\n showCustomRPC: false,\n antiMevOptions: [\"off\", \"secure\"],\n };\n }\n\n return {\n nativeSymbol,\n feeType: \"gasFee\",\n feeUnit: \"Gwei\",\n feeDecimals: 2,\n showTipFee: false,\n tipFeeUnit: nativeSymbol,\n tipFeeDecimals: 9,\n showAutoFee: false,\n showCustomRPC: false,\n antiMevOptions: [\"off\", \"secure\"],\n };\n}\n\n/** Returns chain-appropriate default preset values. */\nexport function getDefaultPresetForChain(chain: Chain): TradePresetValues {\n if (isSolanaChain(chain)) return DEFAULT_SOL_TRADE_PRESET;\n if (isBinanceChain(chain)) return DEFAULT_BSC_TRADE_PRESET;\n return DEFAULT_EVM_TRADE_PRESET;\n}\n","\"use client\";\n\nimport { atomFamily } from \"jotai-family\";\nimport { atomWithStorage } from \"jotai/utils\";\nimport type { Chain } from \"@liberfi.io/types\";\nimport { getDefaultPresetForChain } from \"../components/instant-trade/chain-features\";\nimport type { TradePresetValues } from \"../types\";\n\nexport type PresetDirection = \"buy\" | \"sell\";\n\nconst DEFAULT_PREFIX = \"liberfi.\";\n\nfunction storageKey(\n prefix: string,\n chain: string,\n direction: PresetDirection,\n index: number,\n): string {\n return `${prefix}preset.${chain}.${direction}.${index}`;\n}\n\nfunction parseKey(key: string): {\n prefix: string;\n chain: Chain;\n direction: PresetDirection;\n index: number;\n} {\n const sep = key.lastIndexOf(\":\");\n const prefix = key.slice(0, sep + 1);\n const rest = key.slice(sep + 1);\n const [chain, direction, index] = rest.split(\".\");\n return {\n prefix,\n chain: chain as Chain,\n direction: direction as PresetDirection,\n index: Number(index),\n };\n}\n\n/**\n * Construct an atomFamily key from chain, direction, preset index and prefix.\n *\n * @param chain - Target chain.\n * @param direction - Trade direction: `\"buy\"` or `\"sell\"`.\n * @param index - Preset index (0, 1, or 2).\n * @param prefix - Storage key prefix. Defaults to `\"liberfi.\"`.\n */\nexport function presetKey(\n chain: Chain,\n direction: PresetDirection,\n index: number,\n prefix: string = DEFAULT_PREFIX,\n): string {\n return `${prefix}:${chain}.${direction}.${index}`;\n}\n\n/**\n * Atom family for trade preset values, persisted via `atomWithStorage`.\n *\n * Each atom is keyed by a string built with {@link presetKey}.\n * Default values are chain-specific via `getDefaultPresetForChain`.\n */\nexport const presetAtomFamily = atomFamily((key: string) => {\n const { prefix, chain, direction, index } = parseKey(key);\n return atomWithStorage<TradePresetValues>(\n storageKey(prefix, String(chain), direction, index),\n getDefaultPresetForChain(chain),\n undefined,\n { getOnInit: true },\n );\n});\n","import { useAtomValue } from \"jotai\";\nimport type { Chain } from \"@liberfi.io/types\";\nimport {\n presetAtomFamily,\n presetKey,\n type PresetDirection,\n} from \"../states/preset\";\nimport type { TradePresetValues } from \"../types\";\n\nexport interface UsePresetValuesParams {\n /** Target chain. */\n chain: Chain;\n /** Trade direction. */\n direction: PresetDirection;\n /** Preset index (0, 1, or 2). Defaults to 0. */\n presetIndex?: number;\n /** Storage key prefix. Must match the prefix used by the corresponding PresetFormWidget. Defaults to `\"liberfi.\"`. */\n storageKeyPrefix?: string;\n}\n\n/**\n * Read the current {@link TradePresetValues} for a given chain / direction / preset index.\n *\n * The value is sourced from the same `atomWithStorage` atom family that\n * {@link PresetFormWidget} writes to, so it stays in sync automatically.\n */\nexport function usePresetValues({\n chain,\n direction,\n presetIndex = 0,\n storageKeyPrefix,\n}: UsePresetValuesParams): TradePresetValues {\n return useAtomValue(\n presetAtomFamily(\n presetKey(chain, direction, presetIndex, storageKeyPrefix),\n ),\n );\n}\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { useDexClient } from \"@liberfi.io/react\";\nimport { API } from \"@liberfi.io/types\";\nimport type { SwapInput, SwapResult, UseSwapOptions } from \"../types\";\n\nfunction base64ToUint8Array(base64: string): Uint8Array {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\nfunction uint8ArrayToBase64(bytes: Uint8Array): string {\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\n/**\n * Hook that orchestrates the full swap flow: route -> sign -> send.\n *\n * Designed for IoC: no toast, no i18n, no UI side-effects.\n * The caller controls feedback via `onSubmitted` / `onError` callbacks.\n *\n * Works across Solana and EVM chains — chain-specific differences\n * (dex selection, tx format) are handled by the underlying client\n * and wallet adapter abstractions.\n */\nexport function useSwap(options?: UseSwapOptions) {\n const { client } = useDexClient();\n const [isSwapping, setIsSwapping] = useState(false);\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const swap = useCallback(\n async (input: SwapInput): Promise<SwapResult> => {\n const { wallet, chain, ...rest } = input;\n\n setIsSwapping(true);\n try {\n // 1. Fetch route — returns unsigned tx as base64\n let route: API.SwapRoute;\n try {\n route = await client.swapRoute({\n chain,\n userAddress: wallet.address,\n input: rest.input,\n output: rest.output,\n mode: rest.mode ?? API.SwapMode.EXACT_IN,\n amount: rest.amount,\n slippage: rest.slippage,\n priorityFee: rest.priorityFee,\n tipFee: rest.tipFee,\n isAntiMev: rest.isAntiMev,\n permit: rest.permit,\n deadline: rest.deadline,\n });\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n optionsRef.current?.onError?.(err, \"route\");\n throw err;\n }\n\n // 2. Sign the transaction via wallet adapter\n let signedBytes: Uint8Array;\n try {\n const unsignedBytes = base64ToUint8Array(route.serializedTx);\n signedBytes = await wallet.signTransaction(unsignedBytes);\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n optionsRef.current?.onError?.(err, \"sign\");\n throw err;\n }\n\n // 3. Submit the signed transaction\n let sendResult: API.SendTxResult;\n try {\n const signedBase64 = uint8ArrayToBase64(signedBytes);\n sendResult = await client.sendTx({\n chain,\n serializedTx: signedBase64,\n });\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n optionsRef.current?.onError?.(err, \"send\");\n throw err;\n }\n\n const result: SwapResult = {\n txHash: sendResult.txHash,\n extra: sendResult.extra,\n };\n\n optionsRef.current?.onSubmitted?.(result);\n return result;\n } finally {\n setIsSwapping(false);\n }\n },\n [client],\n );\n\n return useMemo(() => ({ swap, isSwapping }), [swap, isSwapping]);\n}\n","import { useEffect, useMemo, useRef } from \"react\";\nimport { useSwapRouteQuery } from \"@liberfi.io/react\";\nimport { API } from \"@liberfi.io/types\";\nimport type { UseSwapRoutePollingOptions } from \"../types\";\n\nconst DEFAULT_INTERVAL = 12_000;\n\n/**\n * Hook that polls for swap route quotes at a configurable interval.\n *\n * Built on top of `useSwapRouteQuery` (TanStack Query) — automatically\n * deduplicates requests, caches results, and invalidates when params change.\n *\n * Polling pauses when `paused` is true (e.g. during swap execution) or\n * when required params are missing.\n */\nexport function useSwapRoutePolling(\n params: Partial<API.SwapParams>,\n options?: UseSwapRoutePollingOptions,\n) {\n const interval = options?.interval ?? DEFAULT_INTERVAL;\n const paused = options?.paused ?? false;\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const hasRequiredParams =\n !!params.chain &&\n !!params.userAddress &&\n !!params.input &&\n !!params.output &&\n !!params.amount;\n\n const enabled = hasRequiredParams && !paused;\n\n const query = useSwapRouteQuery(params as API.SwapParams, {\n enabled,\n refetchInterval: enabled ? interval : false,\n retry: false,\n });\n\n useEffect(() => {\n if (query.error) {\n optionsRef.current?.onError?.(query.error);\n }\n }, [query.error]);\n\n return useMemo(\n () => ({\n route: query.data,\n isRouting: query.isFetching,\n error: query.error,\n }),\n [query.data, query.isFetching, query.error],\n );\n}\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { useDexClient } from \"@liberfi.io/react\";\nimport { Chain } from \"@liberfi.io/types\";\nimport type { TxConfirmationStatus, UseTxConfirmationOptions } from \"../types\";\n\ninterface TrackedTx {\n chain: Chain;\n txHash: string;\n status: TxConfirmationStatus;\n}\n\nconst DEFAULT_TIMEOUT = 60_000;\n\n/**\n * Hook that tracks transaction confirmation via backend SSE (Server-Sent Events).\n *\n * Designed to be composed with `useSwap` — call `track()` inside `onSubmitted`\n * to start monitoring. Supports tracking multiple concurrent transactions.\n *\n * @example\n * ```tsx\n * const { swap } = useSwap({ onSubmitted: (r) => track(chain, r.txHash) });\n * const { track, transactions } = useTxConfirmation({\n * onConfirmed: (txHash) => toast.success(`Confirmed: ${txHash}`),\n * onFailed: (txHash) => toast.error(`Failed: ${txHash}`),\n * });\n * ```\n */\nexport function useTxConfirmation(options?: UseTxConfirmationOptions) {\n const { client } = useDexClient();\n const [transactions, setTransactions] = useState<Map<string, TrackedTx>>(\n () => new Map(),\n );\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const updateTx = useCallback(\n (txHash: string, status: TxConfirmationStatus) => {\n setTransactions((prev) => {\n const existing = prev.get(txHash);\n if (!existing) return prev;\n if (existing.status === status) return prev;\n const next = new Map(prev);\n next.set(txHash, { ...existing, status });\n return next;\n });\n },\n [],\n );\n\n const track = useCallback(\n (chain: Chain, txHash: string) => {\n setTransactions((prev) => {\n if (prev.has(txHash)) return prev;\n const next = new Map(prev);\n next.set(txHash, { chain, txHash, status: \"pending\" });\n return next;\n });\n\n const timeout = optionsRef.current?.timeout ?? DEFAULT_TIMEOUT;\n\n client\n .checkTxSuccess(chain, txHash, timeout)\n .then((success) => {\n if (success) {\n updateTx(txHash, \"confirmed\");\n optionsRef.current?.onConfirmed?.(txHash);\n } else {\n const err = new Error(\"Transaction failed on-chain\");\n updateTx(txHash, \"failed\");\n optionsRef.current?.onFailed?.(txHash, err);\n }\n })\n .catch((e) => {\n const err = e instanceof Error ? e : new Error(String(e));\n updateTx(txHash, \"failed\");\n optionsRef.current?.onFailed?.(txHash, err);\n });\n },\n [client, updateTx],\n );\n\n const clear = useCallback((txHash: string) => {\n setTransactions((prev) => {\n if (!prev.has(txHash)) return prev;\n const next = new Map(prev);\n next.delete(txHash);\n return next;\n });\n }, []);\n\n const clearAll = useCallback(() => {\n setTransactions((prev) => (prev.size === 0 ? prev : new Map()));\n }, []);\n\n return useMemo(\n () => ({ track, clear, clearAll, transactions }),\n [track, clear, clearAll, transactions],\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useTokensQuery,\n useWalletPortfoliosByTokensQuery,\n} from \"@liberfi.io/react\";\nimport { API, Chain, ChainNamespace } from \"@liberfi.io/types\";\nimport { useWallets } from \"@liberfi.io/wallet-connector\";\nimport { useSwap } from \"../../hooks/useSwap\";\nimport { useSwapRoutePolling } from \"../../hooks/useSwapRoutePolling\";\nimport { useTxConfirmation } from \"../../hooks/useTxConfirmation\";\nimport type { UseSwapScriptParams, UseSwapScriptResult } from \"./types\";\n\nconst SOLANA_CHAINS: ReadonlySet<Chain> = new Set([\n Chain.SOLANA,\n Chain.SOLANA_TESTNET,\n Chain.SOLANA_DEVNET,\n]);\n\nfunction chainNamespace(chain: Chain): ChainNamespace {\n return SOLANA_CHAINS.has(chain) ? ChainNamespace.SOLANA : ChainNamespace.EVM;\n}\n\nconst TOKEN_POLL_MS = 10_000;\nconst BALANCE_POLL_MS = 15_000;\n\n/**\n * Computes the total output amount from route plans.\n * Each plan has an outputAmount in smallest units — we take the last plan's\n * output (the final token) and shift by decimals.\n */\nfunction formatOutputAmount(\n plans: Array<{ outputAmount: string }>,\n decimals: number,\n): string | undefined {\n if (plans.length === 0) return undefined;\n const lastPlan = plans[plans.length - 1]!;\n const raw = lastPlan.outputAmount;\n if (!raw || raw === \"0\") return \"0\";\n\n const padded = raw.padStart(decimals + 1, \"0\");\n const intPart = padded.slice(0, padded.length - decimals) || \"0\";\n const fracPart = padded.slice(padded.length - decimals);\n const trimmed = fracPart.replace(/0+$/, \"\");\n return trimmed ? `${intPart}.${trimmed}` : intPart;\n}\n\n/**\n * Script hook that encapsulates all data fetching and state management\n * for the swap form.\n *\n * Pure TypeScript — no JSX, no UI imports.\n */\nexport function useSwapScript(\n params: UseSwapScriptParams,\n): UseSwapScriptResult {\n const { chain } = params;\n\n // ── Wallet ────────────────────────────────────────────────────────────────\n\n const wallets = useWallets();\n const ns = chainNamespace(chain);\n const wallet = useMemo(\n () => wallets.find((w) => w.chainNamespace === ns && w.isConnected),\n [wallets, ns],\n );\n const walletAddress = wallet?.address ?? \"\";\n\n // ── Token selection state ─────────────────────────────────────────────────\n\n const [fromTokenAddress, setFromTokenAddress] = useState(params.from ?? \"\");\n const [toTokenAddress, setToTokenAddress] = useState(params.to ?? \"\");\n\n const fromRef = useRef(params.from);\n const toRef = useRef(params.to);\n useEffect(() => {\n if (params.from !== fromRef.current) {\n fromRef.current = params.from;\n if (params.from) setFromTokenAddress(params.from);\n }\n }, [params.from]);\n useEffect(() => {\n if (params.to !== toRef.current) {\n toRef.current = params.to;\n if (params.to) setToTokenAddress(params.to);\n }\n }, [params.to]);\n\n // ── Token metadata ────────────────────────────────────────────────────────\n\n const tokenAddresses = useMemo(\n () => [fromTokenAddress, toTokenAddress].filter(Boolean),\n [fromTokenAddress, toTokenAddress],\n );\n\n const tokensQuery = useTokensQuery(\n { chain, addresses: tokenAddresses },\n { enabled: tokenAddresses.length > 0, refetchInterval: TOKEN_POLL_MS },\n );\n\n const fromToken = useMemo(\n () => tokensQuery.data?.find((t) => t.address === fromTokenAddress) ?? null,\n [tokensQuery.data, fromTokenAddress],\n );\n const toToken = useMemo(\n () => tokensQuery.data?.find((t) => t.address === toTokenAddress) ?? null,\n [tokensQuery.data, toTokenAddress],\n );\n\n // ── Balances ──────────────────────────────────────────────────────────────\n\n const balancesQuery = useWalletPortfoliosByTokensQuery(\n { chain, address: walletAddress, tokenAddresses },\n {\n enabled: !!walletAddress && tokenAddresses.length > 0,\n refetchInterval: BALANCE_POLL_MS,\n },\n );\n\n const fromBalance = useMemo(\n () =>\n balancesQuery.data?.find((p) => p.address === fromTokenAddress) ?? null,\n [balancesQuery.data, fromTokenAddress],\n );\n const toBalance = useMemo(\n () => balancesQuery.data?.find((p) => p.address === toTokenAddress) ?? null,\n [balancesQuery.data, toTokenAddress],\n );\n\n // ── Amount ────────────────────────────────────────────────────────────────\n\n const [amount, setAmount] = useState<string | undefined>(undefined);\n\n const amountInDecimals = useMemo(() => {\n if (!amount || fromToken?.decimals == null) return undefined;\n const parts = amount.split(\".\");\n const intPart = parts[0] ?? \"0\";\n const fracPart = (parts[1] ?? \"\").slice(0, fromToken.decimals);\n const padded = fracPart.padEnd(fromToken.decimals, \"0\");\n const raw = intPart + padded;\n return raw.replace(/^0+/, \"\") || \"0\";\n }, [amount, fromToken?.decimals]);\n\n const amountInUsd = useMemo(() => {\n if (!amount || !fromToken?.marketData?.priceInUsd) return undefined;\n const price = Number(fromToken.marketData.priceInUsd);\n const value = Number(amount) * price;\n return Number.isFinite(value) ? value.toString() : undefined;\n }, [amount, fromToken?.marketData?.priceInUsd]);\n\n // ── Half / Max helpers ────────────────────────────────────────────────────\n\n const setHalfAmount = useCallback(() => {\n if (!fromBalance) return;\n const bal = Number(fromBalance.amount);\n if (!Number.isFinite(bal) || bal <= 0) return;\n const half = bal / 2;\n const decimals = fromToken?.decimals ?? 9;\n setAmount(\n half.toLocaleString(\"en-US\", {\n useGrouping: false,\n maximumFractionDigits: decimals,\n }),\n );\n }, [fromBalance, fromToken?.decimals]);\n\n const setMaxAmount = useCallback(() => {\n if (!fromBalance) return;\n const bal = Number(fromBalance.amount);\n if (!Number.isFinite(bal) || bal <= 0) return;\n const decimals = fromToken?.decimals ?? 9;\n setAmount(\n bal.toLocaleString(\"en-US\", {\n useGrouping: false,\n maximumFractionDigits: decimals,\n }),\n );\n }, [fromBalance, fromToken?.decimals]);\n\n // ── Route polling ─────────────────────────────────────────────────────────\n\n const routeParams = useMemo<Partial<API.SwapParams>>(\n () => ({\n chain,\n userAddress: walletAddress || undefined,\n input: fromTokenAddress || undefined,\n output: toTokenAddress || undefined,\n mode: API.SwapMode.EXACT_IN,\n amount: amountInDecimals,\n }),\n [chain, walletAddress, fromTokenAddress, toTokenAddress, amountInDecimals],\n );\n\n const isSwappingRef = useRef(false);\n\n const {\n route,\n isRouting,\n error: routeError,\n } = useSwapRoutePolling(routeParams, { paused: isSwappingRef.current });\n\n // ── Output amount ─────────────────────────────────────────────────────────\n\n const outputAmount = useMemo(\n () =>\n route && toToken\n ? formatOutputAmount(route.plans, toToken.decimals)\n : undefined,\n [route, toToken],\n );\n\n const outputAmountInUsd = useMemo(() => {\n if (!outputAmount || !toToken?.marketData?.priceInUsd) return undefined;\n const price = Number(toToken.marketData.priceInUsd);\n const value = Number(outputAmount) * price;\n return Number.isFinite(value) ? value.toString() : undefined;\n }, [outputAmount, toToken?.marketData?.priceInUsd]);\n\n // ── Swap execution ────────────────────────────────────────────────────────\n\n const { swap: rawSwap, isSwapping } = useSwap();\n isSwappingRef.current = isSwapping;\n\n const onCompleteRef = useRef(params.onComplete);\n onCompleteRef.current = params.onComplete;\n\n const { track, transactions } = useTxConfirmation({\n onConfirmed: (txHash) => {\n onCompleteRef.current?.({ success: true, txHash });\n },\n onFailed: (txHash) => {\n onCompleteRef.current?.({ success: false, txHash });\n },\n });\n\n const latestTxStatus = useMemo(() => {\n if (transactions.size === 0) return \"idle\" as const;\n const entries = Array.from(transactions.values());\n return entries[entries.length - 1]!.status;\n }, [transactions]);\n\n const swap = useCallback(async () => {\n if (\n !wallet ||\n !route ||\n !fromTokenAddress ||\n !toTokenAddress ||\n !amountInDecimals\n ) {\n return;\n }\n\n try {\n const result = await rawSwap({\n chain,\n wallet,\n input: fromTokenAddress,\n output: toTokenAddress,\n amount: amountInDecimals,\n mode: API.SwapMode.EXACT_IN,\n });\n track(chain, result.txHash);\n } catch {\n // Error is already reported via useSwap's onError callback\n }\n }, [\n wallet,\n route,\n chain,\n fromTokenAddress,\n toTokenAddress,\n amountInDecimals,\n rawSwap,\n track,\n ]);\n\n // ── Loading state ─────────────────────────────────────────────────────────\n\n const isLoading = tokensQuery.isPending || balancesQuery.isPending;\n\n // ── Return ────────────────────────────────────────────────────────────────\n\n return useMemo(\n () => ({\n fromTokenAddress,\n toTokenAddress,\n setFromTokenAddress,\n setToTokenAddress,\n\n fromToken,\n toToken,\n\n fromBalance,\n toBalance,\n\n amount,\n setAmount,\n setHalfAmount,\n setMaxAmount,\n amountInDecimals,\n amountInUsd,\n\n outputAmount,\n outputAmountInUsd,\n\n route,\n isRouting,\n routeError,\n\n swap,\n isSwapping,\n\n txStatus: latestTxStatus,\n\n isLoading,\n }),\n [\n fromTokenAddress,\n toTokenAddress,\n fromToken,\n toToken,\n fromBalance,\n toBalance,\n amount,\n setHalfAmount,\n setMaxAmount,\n amountInDecimals,\n amountInUsd,\n outputAmount,\n outputAmountInUsd,\n route,\n isRouting,\n routeError,\n swap,\n isSwapping,\n latestTxStatus,\n isLoading,\n ],\n );\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Avatar,\n Button,\n ChevronDownIcon,\n ChevronUpIcon,\n cn,\n Modal,\n ModalBody,\n ModalContent,\n ModalFooter,\n ModalHeader,\n TradeIcon,\n} from \"@liberfi.io/ui\";\nimport type { SwapPreviewModalProps } from \"./types\";\n\n/**\n * Modal that previews swap details before confirmation.\n *\n * Pure presentational — all data and callbacks received via props.\n * Shows from/to token cards, expandable route plan details,\n * and a confirm button.\n */\nexport function SwapPreviewModal({\n isOpen,\n onOpenChange,\n fromToken,\n toToken,\n fromBalance,\n inputAmount,\n inputAmountInUsd,\n outputAmount,\n outputAmountInUsd,\n route,\n isRouting,\n routeError,\n onConfirm,\n isSwapping,\n}: SwapPreviewModalProps) {\n const { t } = useTranslation();\n const [expanded, setExpanded] = useState(false);\n const toggleExpanded = useCallback(() => setExpanded((prev) => !prev), []);\n\n const plans = useMemo(() => {\n if (!route) return [];\n return route.plans.map((plan, i) => ({\n key: `plan-${i}`,\n name: plan.name,\n input: plan.input,\n inputAmount: plan.inputAmount,\n output: plan.output,\n outputAmount: plan.outputAmount,\n feeQuote: plan.feeQuote,\n feeAmount: plan.feeAmount,\n }));\n }, [route]);\n\n return (\n <Modal\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n hideCloseButton\n scrollBehavior=\"inside\"\n backdrop=\"blur\"\n >\n <ModalContent className=\"bg-content2 rounded-lg\">\n <ModalHeader>{t(\"trade.swap.preview\")}</ModalHeader>\n <ModalBody>\n <div className=\"flex w-full max-h-[70vh] flex-1 flex-col overflow-y-auto py-2\">\n {/* ── From preview ─────────────────────────────────────────── */}\n <div className=\"mb-5\">\n <div className=\"text-neutral flex items-center justify-between text-xs font-medium\">\n {t(\"trade.swap.from\")}\n </div>\n <div className=\"bg-content3 mt-3 flex w-full items-center gap-3 rounded-lg px-4 py-3\">\n <div className=\"flex flex-1 items-center gap-3\">\n {fromToken?.image && (\n <Avatar\n size=\"sm\"\n src={fromToken.image}\n name={fromToken.symbol}\n className=\"h-6 w-6\"\n />\n )}\n <div className=\"flex flex-col items-start justify-center gap-0.5\">\n <div className=\"text-foreground text-xs\">\n {fromToken?.symbol ?? \"—\"}\n </div>\n {fromBalance && (\n <div className=\"text-neutral flex items-center gap-1 text-[10px]\">\n <WalletBalanceIcon />\n <span>\n {formatNumber(fromBalance.amount)} {fromToken?.symbol}\n </span>\n </div>\n )}\n </div>\n </div>\n <div className=\"flex-0 flex flex-col items-end justify-center gap-0.5\">\n <div className=\"text-foreground text-xs\">\n {formatNumber(inputAmount)}\n </div>\n <div className=\"text-neutral text-[10px]\">\n ${formatUsd(inputAmountInUsd)}\n </div>\n </div>\n </div>\n </div>\n\n {/* ── To preview ───────────────────────────────────────────── */}\n <div className=\"mb-5\">\n <div className=\"text-neutral flex items-center justify-between text-xs font-medium\">\n {t(\"trade.swap.estimatedReceive\")}\n </div>\n <div className=\"bg-content3 mt-3 flex w-full items-center gap-3 rounded-lg px-4 py-3\">\n <div className=\"flex flex-1 items-center gap-3\">\n {toToken?.image && (\n <Avatar\n size=\"sm\"\n src={toToken.image}\n name={toToken.symbol}\n className=\"h-6 w-6\"\n />\n )}\n <div className=\"flex flex-col items-start justify-center gap-0.5\">\n <div className=\"text-foreground text-xs\">\n {toToken?.symbol ?? \"—\"}\n </div>\n <div className=\"text-neutral text-[10px]\">\n {truncateAddress(toToken?.address)}\n </div>\n </div>\n </div>\n <div className=\"flex-0 flex flex-col items-end justify-center gap-0.5\">\n <div className=\"text-foreground text-xs\">\n {formatNumber(outputAmount)}\n </div>\n <div className=\"text-neutral text-[10px]\">\n ${formatUsd(outputAmountInUsd)}\n </div>\n </div>\n </div>\n </div>\n\n {/* ── Route plan details ───────────────────────────────────── */}\n {expanded && plans.length > 0 && (\n <div className=\"my-3\">\n <div className=\"text-neutral flex items-center justify-between text-xs font-medium\">\n {t(\"trade.swap.routeDetails\")}\n </div>\n <div className=\"mt-3 flex flex-col gap-3\">\n {plans.map((plan) => (\n <div\n key={plan.key}\n className=\"bg-content3 flex w-full flex-col items-center gap-2 rounded-lg px-4 py-3\"\n >\n <div className=\"flex w-full items-center justify-between\">\n <div className=\"text-neutral text-xs\">\n {t(\"trade.swap.dex\")}\n </div>\n <div className=\"text-foreground text-xs\">\n {plan.name}\n </div>\n </div>\n <div className=\"flex w-full items-center justify-between\">\n <div className=\"text-neutral text-xs\">\n {t(\"trade.swap.swap\")}\n </div>\n <div className=\"text-foreground flex items-center gap-2 text-xs\">\n <span>\n {formatSmallAmount(plan.inputAmount)}{\" \"}\n {truncateAddress(plan.input)}\n </span>\n <TradeIcon\n width={12}\n height={12}\n className=\"text-foreground\"\n />\n <span>\n {formatSmallAmount(plan.outputAmount)}{\" \"}\n {truncateAddress(plan.output)}\n </span>\n </div>\n </div>\n {plan.feeAmount && (\n <div className=\"flex w-full items-center justify-between\">\n <div className=\"text-neutral text-xs\">\n {t(\"trade.swap.fee\")}\n </div>\n <div className=\"text-foreground text-xs\">\n {formatSmallAmount(plan.feeAmount)}{\" \"}\n {truncateAddress(plan.feeQuote)}\n </div>\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* ── Expand / collapse toggle ─────────────────────────────── */}\n {plans.length > 0 && (\n <div className=\"flex justify-center\">\n <Button\n size=\"sm\"\n className=\"text-neutral flex bg-transparent text-xs\"\n endContent={\n expanded ? (\n <ChevronUpIcon width={12} height={12} />\n ) : (\n <ChevronDownIcon width={12} height={12} />\n )\n }\n disableRipple\n onPress={toggleExpanded}\n >\n {expanded\n ? t(\"trade.swap.showLess\")\n : t(\"trade.swap.showMore\")}\n </Button>\n </div>\n )}\n </div>\n </ModalBody>\n <ModalFooter>\n <Button\n fullWidth\n color=\"primary\"\n className=\"flex rounded-lg\"\n disableRipple\n isDisabled={!route || !!routeError}\n isLoading={(!route && isRouting) || isSwapping}\n onPress={onConfirm}\n >\n {t(\"common.confirm\")}\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n );\n}\n\nfunction WalletBalanceIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={12}\n height={12}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"text-neutral\"\n >\n <path d=\"M21 12V7H5a2 2 0 0 1 0-4h14v4\" />\n <path d=\"M3 5v14a2 2 0 0 0 2 2h16v-5\" />\n <path d=\"M18 12a2 2 0 0 0 0 4h4v-4Z\" />\n </svg>\n );\n}\n\nfunction formatUsd(value: string | undefined): string {\n if (!value) return \"0.00\";\n const n = Number(value);\n if (!Number.isFinite(n)) return \"0.00\";\n return n.toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n}\n\nfunction formatNumber(value: string | undefined): string {\n if (!value) return \"0\";\n const n = Number(value);\n if (!Number.isFinite(n)) return \"0\";\n if (n >= 1_000_000)\n return (\n (n / 1_000_000).toLocaleString(\"en-US\", {\n maximumFractionDigits: 2,\n }) + \"M\"\n );\n if (n >= 1_000)\n return (\n (n / 1_000).toLocaleString(\"en-US\", { maximumFractionDigits: 2 }) + \"K\"\n );\n return n.toLocaleString(\"en-US\", { maximumFractionDigits: 6 });\n}\n\n/** Render raw smallest-unit amounts in abbreviated form. */\nfunction formatSmallAmount(value: string | undefined): string {\n if (!value || value === \"0\") return \"0\";\n const n = Number(value);\n if (!Number.isFinite(n)) return value;\n if (n >= 1e12) return (n / 1e12).toFixed(2) + \"T\";\n if (n >= 1e9) return (n / 1e9).toFixed(2) + \"B\";\n if (n >= 1e6) return (n / 1e6).toFixed(2) + \"M\";\n if (n >= 1e3) return (n / 1e3).toFixed(2) + \"K\";\n return value;\n}\n\nfunction truncateAddress(addr: string | undefined): string {\n if (!addr) return \"—\";\n if (addr.length <= 10) return addr;\n return `${addr.slice(0, 4)}...${addr.slice(-4)}`;\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { Avatar, Button, ChevronDownIcon, cn, Input } from \"@liberfi.io/ui\";\nimport type { SwapUIProps } from \"./types\";\n\n/**\n * Pure presentational component for the swap form.\n *\n * Receives all data and callbacks via props — no API calls, no subscriptions.\n * Consumers can replace this component entirely while reusing `useSwapScript`.\n */\nexport function SwapUI({\n fromToken,\n toToken,\n fromBalance,\n toBalance,\n amount,\n amountInUsd,\n onAmountChange,\n onHalfAmount,\n onMaxAmount,\n outputAmount,\n outputAmountInUsd,\n onFromTokenSelect,\n onToTokenSelect,\n route,\n isRouting,\n routeError,\n onPreview,\n isSwapping,\n className,\n}: SwapUIProps) {\n const { t } = useTranslation();\n\n return (\n <div className={cn(\"px-4 pb-4 lg:pb-8\", className)}>\n {/* ── From token section ─────────────────────────────────────────── */}\n <div className=\"space-y-3\">\n <p className=\"text-neutral text-sm font-medium\">\n {t(\"trade.swap.from\")}\n </p>\n <div className=\"bg-content1 flex flex-col rounded-lg px-3.5 pb-2.5 pt-2\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex-1\">\n <Input\n type=\"number\"\n value={amount ?? \"\"}\n onChange={(e) => onAmountChange(e.target.value || undefined)}\n placeholder=\"0\"\n classNames={{\n inputWrapper: cn(\n \"h-10 p-0 bg-transparent\",\n \"data-[hover=true]:bg-transparent group-data-[focus=true]:bg-transparent\",\n \"group-data-[focus-visible=true]:ring-offset-transparent group-data-[focus-visible=true]:ring-transparent\",\n ),\n input: cn(\n \"w-full h-full caret-primary text-3xl font-medium\",\n \"placeholder:text-placeholder placeholder:text-3xl placeholder:font-medium\",\n \"scrollbar-hide overflow-hidden text-ellipsis whitespace-nowrap\",\n ),\n }}\n />\n </div>\n <div className=\"flex-0 flex h-full items-center justify-center\">\n <Button\n className={cn(\n \"flex min-w-0 h-8 min-h-8 pl-3 pr-2 bg-content3 rounded-full\",\n fromToken ? \"text-foreground\" : \"text-neutral\",\n )}\n disableRipple\n startContent={\n fromToken?.image ? (\n <Avatar\n size=\"sm\"\n src={fromToken.image}\n name={fromToken.symbol}\n className=\"h-6 w-6\"\n />\n ) : null\n }\n endContent={\n <ChevronDownIcon\n width={16}\n height={16}\n className=\"text-neutral\"\n />\n }\n onPress={() => onFromTokenSelect(\"\")}\n >\n {fromToken ? fromToken.symbol : t(\"trade.swap.selectToken\")}\n </Button>\n </div>\n </div>\n\n <div className=\"mt-3 flex items-center justify-between gap-4\">\n <div className=\"text-neutral flex-1 text-xs\">\n ≈ ${formatUsd(amountInUsd)}\n </div>\n {fromBalance && (\n <div className=\"flex-0 flex items-center gap-2 pr-3 text-xs\">\n <WalletBalanceIcon />\n <span className=\"text-neutral\">\n {formatNumber(fromBalance.amount)} {fromBalance.symbol}\n </span>\n {onHalfAmount && (\n <span\n className=\"text-primary cursor-pointer\"\n onClick={onHalfAmount}\n >\n {t(\"trade.swap.half\")}\n </span>\n )}\n {onMaxAmount && (\n <span\n className=\"text-primary cursor-pointer\"\n onClick={onMaxAmount}\n >\n {t(\"common.max\")}\n </span>\n )}\n </div>\n )}\n </div>\n\n {routeError && (\n <p className=\"mt-1 break-words text-xs text-danger-500\">\n {routeError.message}\n </p>\n )}\n </div>\n </div>\n\n {/* ── To token section ───────────────────────────────────────────── */}\n <div className=\"mt-4 space-y-3\">\n <p className=\"text-neutral text-sm font-medium\">{t(\"trade.swap.to\")}</p>\n <div className=\"bg-content1 flex flex-col rounded-lg px-3.5 pb-2.5 pt-2\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex-1\">\n <Input\n type=\"number\"\n value={outputAmount ?? \"\"}\n disabled\n placeholder=\"0\"\n classNames={{\n inputWrapper: cn(\n \"h-10 p-0 bg-transparent\",\n \"data-[hover=true]:bg-transparent group-data-[focus=true]:bg-transparent\",\n \"group-data-[focus-visible=true]:ring-offset-transparent group-data-[focus-visible=true]:ring-transparent\",\n ),\n input: cn(\n \"w-full h-full caret-primary text-3xl font-medium\",\n \"placeholder:text-placeholder placeholder:text-3xl placeholder:font-medium\",\n \"scrollbar-hide overflow-hidden text-ellipsis whitespace-nowrap\",\n ),\n }}\n />\n </div>\n <div className=\"flex-0 flex h-full items-center justify-center\">\n <Button\n className={cn(\n \"flex min-w-0 h-8 min-h-8 pl-3 pr-2 bg-content3 rounded-full\",\n toToken ? \"text-foreground\" : \"text-neutral\",\n )}\n disableRipple\n startContent={\n toToken?.image ? (\n <Avatar\n size=\"sm\"\n src={toToken.image}\n name={toToken.symbol}\n className=\"h-6 w-6\"\n />\n ) : null\n }\n endContent={\n <ChevronDownIcon\n width={16}\n height={16}\n className=\"text-neutral\"\n />\n }\n onPress={() => onToTokenSelect(\"\")}\n >\n {toToken ? toToken.symbol : t(\"trade.swap.selectToken\")}\n </Button>\n </div>\n </div>\n\n <div className=\"mt-3 flex items-center justify-between gap-4\">\n <div className=\"text-neutral flex-1 text-xs\">\n ≈ ${formatUsd(outputAmountInUsd)}\n </div>\n {toBalance && (\n <div className=\"flex-0 flex items-center gap-2 pr-3 text-xs\">\n <WalletBalanceIcon />\n <span className=\"text-neutral\">\n {formatNumber(toBalance.amount)} {toBalance.symbol}\n </span>\n </div>\n )}\n </div>\n </div>\n </div>\n\n {/* ── Submit button ──────────────────────────────────────────────── */}\n <Button\n fullWidth\n color=\"primary\"\n className=\"mt-8 flex rounded-lg\"\n disableRipple\n isDisabled={!route}\n isLoading={!route && isRouting}\n onPress={onPreview}\n >\n {isSwapping\n ? t(\"trade.swap.swapping\")\n : isRouting\n ? t(\"trade.swap.findingRoute\")\n : t(\"trade.swap.swap\")}\n </Button>\n </div>\n );\n}\n\nfunction WalletBalanceIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={12}\n height={12}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"text-neutral\"\n >\n <path d=\"M21 12V7H5a2 2 0 0 1 0-4h14v4\" />\n <path d=\"M3 5v14a2 2 0 0 0 2 2h16v-5\" />\n <path d=\"M18 12a2 2 0 0 0 0 4h4v-4Z\" />\n </svg>\n );\n}\n\nfunction formatUsd(value: string | undefined): string {\n if (!value) return \"0.00\";\n const n = Number(value);\n if (!Number.isFinite(n)) return \"0.00\";\n return n.toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n}\n\nfunction formatNumber(value: string | undefined): string {\n if (!value) return \"0\";\n const n = Number(value);\n if (!Number.isFinite(n)) return \"0\";\n if (n >= 1_000_000)\n return (\n (n / 1_000_000).toLocaleString(\"en-US\", { maximumFractionDigits: 2 }) +\n \"M\"\n );\n if (n >= 1_000)\n return (\n (n / 1_000).toLocaleString(\"en-US\", { maximumFractionDigits: 2 }) + \"K\"\n );\n return n.toLocaleString(\"en-US\", { maximumFractionDigits: 6 });\n}\n","import { useCallback } from \"react\";\nimport { useDisclosure } from \"@liberfi.io/ui\";\nimport { SwapPreviewModal } from \"./swap-preview-modal\";\nimport { useSwapScript } from \"./swap.script\";\nimport { SwapUI } from \"./swap.ui\";\nimport type { SwapWidgetProps } from \"./types\";\n\n/**\n * Swap widget — thin orchestration layer.\n *\n * Calls `useSwapScript` to fetch all data, renders `SwapUI` for the form\n * and `SwapPreviewModal` for pre-swap confirmation.\n *\n * For custom UIs, use `useSwapScript` directly with your own presentation.\n */\nexport function SwapWidget({\n chain,\n from,\n to,\n onComplete,\n className,\n}: SwapWidgetProps) {\n const script = useSwapScript({ chain, from, to, onComplete });\n const { isOpen, onOpen, onOpenChange, onClose } = useDisclosure();\n\n const handleConfirm = useCallback(async () => {\n await script.swap();\n onClose();\n }, [script, onClose]);\n\n return (\n <>\n <SwapUI\n fromToken={script.fromToken}\n toToken={script.toToken}\n fromBalance={script.fromBalance}\n toBalance={script.toBalance}\n amount={script.amount}\n amountInUsd={script.amountInUsd}\n onAmountChange={script.setAmount}\n onHalfAmount={script.setHalfAmount}\n onMaxAmount={script.setMaxAmount}\n outputAmount={script.outputAmount}\n outputAmountInUsd={script.outputAmountInUsd}\n onFromTokenSelect={script.setFromTokenAddress}\n onToTokenSelect={script.setToTokenAddress}\n route={script.route}\n isRouting={script.isRouting}\n routeError={script.routeError}\n onPreview={onOpen}\n isSwapping={script.isSwapping}\n className={className}\n />\n <SwapPreviewModal\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n fromToken={script.fromToken}\n toToken={script.toToken}\n fromBalance={script.fromBalance}\n inputAmount={script.amount}\n inputAmountInUsd={script.amountInUsd}\n outputAmount={script.outputAmount}\n outputAmountInUsd={script.outputAmountInUsd}\n route={script.route}\n isRouting={script.isRouting}\n routeError={script.routeError}\n onConfirm={handleConfirm}\n isSwapping={script.isSwapping}\n />\n </>\n );\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState,\n} from \"react\";\nimport type { Chain } from \"@liberfi.io/types\";\nimport { getNativeToken } from \"@liberfi.io/utils\";\nimport { getDefaultBuyAmounts, DEFAULT_SELL_PERCENTAGES } from \"../../types\";\nimport { getDefaultPresetForChain } from \"./chain-features\";\nimport type {\n BuySettings,\n SellSettings,\n InstantTradeSettings,\n InstantTradeContextValue,\n InstantTradeProviderProps,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Defaults\n// ---------------------------------------------------------------------------\n\nfunction buildDefaultSettings(chain: Chain): InstantTradeSettings {\n const preset = getDefaultPresetForChain(chain);\n const nativeSymbol = getNativeToken(chain)?.symbol ?? \"ETH\";\n return {\n buy: {\n customAmounts: getDefaultBuyAmounts(nativeSymbol),\n presets: [{ ...preset }, { ...preset }, { ...preset }],\n },\n sell: {\n customPercentages: [...DEFAULT_SELL_PERCENTAGES],\n presets: [{ ...preset }, { ...preset }, { ...preset }],\n },\n };\n}\n\nexport const DEFAULT_INSTANT_TRADE_SETTINGS: InstantTradeSettings =\n buildDefaultSettings(\"900900900\" as Chain);\n\n// ---------------------------------------------------------------------------\n// localStorage helpers\n// ---------------------------------------------------------------------------\n\nfunction storageKey(chain: string) {\n return `liberfi.instant-trade.settings.${chain}`;\n}\n\nfunction readStoredSettings(\n chain: Chain,\n fallback: InstantTradeSettings,\n): InstantTradeSettings {\n try {\n const raw = localStorage.getItem(storageKey(String(chain)));\n if (raw) return JSON.parse(raw) as InstantTradeSettings;\n } catch {\n /* ignore */\n }\n return fallback;\n}\n\nfunction writeStoredSettings(chain: string, settings: InstantTradeSettings) {\n try {\n localStorage.setItem(storageKey(chain), JSON.stringify(settings));\n } catch {\n /* ignore */\n }\n}\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\nconst InstantTradeContext = createContext<InstantTradeContextValue | null>(\n null,\n);\n\n/** Access the nearest {@link InstantTradeProvider}. Throws if none found. */\nexport function useInstantTrade(): InstantTradeContextValue {\n const ctx = useContext(InstantTradeContext);\n if (!ctx) {\n throw new Error(\n \"useInstantTrade must be used within an InstantTradeProvider\",\n );\n }\n return ctx;\n}\n\n// ---------------------------------------------------------------------------\n// Provider\n// ---------------------------------------------------------------------------\n\n/**\n * Provides instant-trade state to descendant components.\n *\n * Settings follow a controlled / uncontrolled pattern:\n * - **Controlled**: pass `settings` + `onSettingsChange` props.\n * - **Uncontrolled** (default): settings auto-persist to localStorage keyed by chain.\n */\nexport function InstantTradeProvider({\n chain,\n tokenAddress,\n settings: controlledSettings,\n onSettingsChange,\n children,\n}: InstantTradeProviderProps) {\n const nativeToken = useMemo(() => getNativeToken(chain), [chain]);\n const isControlled = controlledSettings !== undefined;\n const chainDefaults = useMemo(() => buildDefaultSettings(chain), [chain]);\n\n // -- Uncontrolled settings state (only used when no controlled prop) --\n const [localSettings, setLocalSettings] = useState<InstantTradeSettings>(\n () =>\n isControlled ? chainDefaults : readStoredSettings(chain, chainDefaults),\n );\n\n const settings = isControlled ? controlledSettings : localSettings;\n\n const setSettings = useCallback(\n (next: InstantTradeSettings) => {\n if (isControlled) {\n onSettingsChange?.(next);\n } else {\n setLocalSettings(next);\n writeStoredSettings(String(chain), next);\n }\n },\n [isControlled, onSettingsChange, chain],\n );\n\n const updateBuySettings = useCallback(\n (buy: BuySettings) => setSettings({ ...settings, buy }),\n [settings, setSettings],\n );\n\n const updateSellSettings = useCallback(\n (sell: SellSettings) => setSettings({ ...settings, sell }),\n [settings, setSettings],\n );\n\n // -- UI state --\n const [direction, setDirection] = useState<\"buy\" | \"sell\">(\"buy\");\n const [amount, setAmount] = useState<number | undefined>();\n const [buyPreset, setBuyPreset] = useState(0);\n const [sellPreset, setSellPreset] = useState(0);\n\n const defaultPreset = useMemo(() => getDefaultPresetForChain(chain), [chain]);\n\n const currentPresetValues = useMemo(() => {\n const idx = direction === \"buy\" ? buyPreset : sellPreset;\n const presets =\n direction === \"buy\" ? settings.buy.presets : settings.sell.presets;\n return presets[idx] ?? defaultPreset;\n }, [direction, buyPreset, sellPreset, settings, defaultPreset]);\n\n const value = useMemo<InstantTradeContextValue>(\n () => ({\n chain,\n tokenAddress,\n nativeToken,\n direction,\n setDirection,\n amount,\n setAmount,\n buyPreset,\n setBuyPreset,\n sellPreset,\n setSellPreset,\n settings,\n updateBuySettings,\n updateSellSettings,\n currentPresetValues,\n }),\n [\n chain,\n tokenAddress,\n nativeToken,\n direction,\n amount,\n buyPreset,\n sellPreset,\n settings,\n updateBuySettings,\n updateSellSettings,\n currentPresetValues,\n ],\n );\n\n return (\n <InstantTradeContext.Provider value={value}>\n {children}\n </InstantTradeContext.Provider>\n );\n}\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport BigNumber from \"bignumber.js\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n useTokensQuery,\n useWalletPortfoliosByTokensQuery,\n} from \"@liberfi.io/react\";\nimport { ChainNamespace, Chain } from \"@liberfi.io/types\";\nimport {\n chainToNamespace,\n getNativeToken,\n getWrappedToken,\n isSolanaChain,\n formatAmountUSD,\n} from \"@liberfi.io/utils\";\nimport { useWallets } from \"@liberfi.io/wallet-connector\";\nimport { useSwap } from \"../../hooks/useSwap\";\nimport { getDefaultPresetForChain } from \"./chain-features\";\nimport { useInstantTrade } from \"./instant-trade.context\";\nimport type {\n UseInstantTradeScriptParams,\n UseInstantTradeScriptResult,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst BALANCE_POLL_MS = 15_000;\nconst TOKEN_POLL_MS = 10_000;\n\n// ---------------------------------------------------------------------------\n// Script hook\n// ---------------------------------------------------------------------------\n\n/**\n * Script hook that encapsulates all data and state for the instant trade form.\n *\n * Must be used inside an {@link InstantTradeProvider}.\n * Pure TypeScript — no JSX, no UI imports.\n */\nexport function useInstantTradeScript(\n params: UseInstantTradeScriptParams,\n): UseInstantTradeScriptResult {\n const { chain, tokenAddress, onSwapSubmitted, onSwapError } = params;\n const { t } = useTranslation();\n\n const ctx = useInstantTrade();\n\n const nativeToken = useMemo(() => getNativeToken(chain), [chain]);\n const wrappedToken = useMemo(() => getWrappedToken(chain), [chain]);\n\n // -- Wallet --\n const wallets = useWallets();\n const ns = chainToNamespace(chain);\n const wallet = useMemo(\n () => wallets.find((w) => w.chainNamespace === ns && w.isConnected),\n [wallets, ns],\n );\n const walletAddress = wallet?.address ?? \"\";\n\n // -- Token metadata --\n const tokenAddresses = useMemo(() => {\n const addrs = [tokenAddress];\n if (nativeToken) addrs.push(nativeToken.address);\n if (wrappedToken) addrs.push(wrappedToken.address);\n return addrs.filter(Boolean);\n }, [tokenAddress, nativeToken, wrappedToken]);\n\n const tokensQuery = useTokensQuery(\n { chain, addresses: tokenAddresses },\n { enabled: tokenAddresses.length > 0, refetchInterval: TOKEN_POLL_MS },\n );\n\n const tokenInfo = useMemo(\n () => tokensQuery.data?.find((t) => t.address === tokenAddress) ?? null,\n [tokensQuery.data, tokenAddress],\n );\n\n // -- Balances --\n const balancesQuery = useWalletPortfoliosByTokensQuery(\n { chain, address: walletAddress, tokenAddresses },\n {\n enabled: !!walletAddress && tokenAddresses.length > 0,\n refetchInterval: BALANCE_POLL_MS,\n },\n );\n\n const nativeAddr = nativeToken?.address ?? wrappedToken?.address ?? \"\";\n const nativeBalance = useMemo(\n () => balancesQuery.data?.find((p) => p.address === nativeAddr) ?? null,\n [balancesQuery.data, nativeAddr],\n );\n const tokenBalance = useMemo(\n () => balancesQuery.data?.find((p) => p.address === tokenAddress) ?? null,\n [balancesQuery.data, tokenAddress],\n );\n\n // -- Settings form visibility --\n const [showSettings, setShowSettings] = useState(false);\n const lastClickedPreset = useRef<number | null>(null);\n\n const handlePresetClick = useCallback((preset: number) => {\n const last = lastClickedPreset.current;\n lastClickedPreset.current = preset;\n setShowSettings((prev) =>\n last === null || last !== preset ? true : !prev,\n );\n }, []);\n\n // -- Swap execution --\n const onSubmittedRef = useRef(onSwapSubmitted);\n onSubmittedRef.current = onSwapSubmitted;\n const onErrorRef = useRef(onSwapError);\n onErrorRef.current = onSwapError;\n\n const { swap: rawSwap, isSwapping } = useSwap({\n onSubmitted: (result) => onSubmittedRef.current?.(result),\n onError: (err, phase) => onErrorRef.current?.(err, phase),\n });\n\n const swap = useCallback(async () => {\n if (!ctx.amount || !wallet || !tokenAddress) return;\n\n const nativeDecimals = nativeToken?.decimals ?? 9;\n const inputAddress = wrappedToken?.address ?? nativeToken?.address ?? \"\";\n\n const isBuy = ctx.direction === \"buy\";\n const from = isBuy ? inputAddress : tokenAddress;\n const to = isBuy ? tokenAddress : inputAddress;\n\n const decimals = isBuy ? nativeDecimals : (tokenInfo?.decimals ?? 9);\n const amountInDecimals = new BigNumber(ctx.amount)\n .shiftedBy(decimals)\n .decimalPlaces(0)\n .toString();\n\n const preset = ctx.currentPresetValues;\n const chainDefault = getDefaultPresetForChain(chain);\n const slippage = preset.slippage ?? chainDefault.slippage ?? 1;\n const isAntiMev = preset.antiMev !== \"off\";\n\n const solanaFields = isSolanaChain(chain)\n ? {\n priorityFee: new BigNumber(\n preset.priorityFee ?? chainDefault.priorityFee ?? 0,\n )\n .shiftedBy(nativeDecimals)\n .decimalPlaces(0)\n .toString(),\n tipFee: new BigNumber(preset.tipFee ?? chainDefault.tipFee ?? 0)\n .shiftedBy(nativeDecimals)\n .decimalPlaces(0)\n .toString(),\n isAntiMev,\n }\n : {};\n\n try {\n await rawSwap({\n chain,\n wallet,\n input: from,\n output: to,\n amount: amountInDecimals,\n slippage,\n ...solanaFields,\n });\n ctx.setAmount(undefined);\n } catch {\n /* error already reported via callback */\n }\n }, [\n ctx,\n wallet,\n tokenAddress,\n nativeToken,\n wrappedToken,\n tokenInfo,\n chain,\n rawSwap,\n ]);\n\n // -- Submit text --\n const submitText = useMemo(() => {\n const dir = t(ctx.direction === \"buy\" ? \"common.buy\" : \"common.sell\");\n if (!ctx.amount) return dir;\n\n const insufficientSuffix = ` (${t(\"trade.insufficientBalance\")})`;\n\n if (ctx.direction === \"buy\") {\n const bal = nativeBalance?.amount;\n if (bal && new BigNumber(bal).lt(ctx.amount))\n return `${dir}${insufficientSuffix}`;\n\n const symbol = nativeToken?.symbol ?? \"\";\n const nativePrice = tokensQuery.data?.find(\n (tk) => tk.address === nativeAddr,\n )?.marketData?.priceInUsd;\n if (nativePrice) {\n const usd = formatAmountUSD(\n new BigNumber(ctx.amount).times(Number(nativePrice)),\n );\n return t(\"trade.submitBuyAmount\", {\n amount: ctx.amount,\n symbol,\n usd,\n });\n }\n return t(\"trade.submitBuyAmountNoUsd\", {\n amount: ctx.amount,\n symbol,\n });\n }\n\n // sell\n const bal = tokenBalance?.amount;\n if (bal && new BigNumber(bal).lt(ctx.amount))\n return `${dir}${insufficientSuffix}`;\n return dir;\n }, [\n t,\n ctx.direction,\n ctx.amount,\n nativeBalance,\n tokenBalance,\n nativeToken,\n tokensQuery.data,\n nativeAddr,\n ]);\n\n const isDisabled = !ctx.amount || !wallet || !tokenAddress;\n const isLoading = tokensQuery.isPending || balancesQuery.isPending;\n\n return useMemo<UseInstantTradeScriptResult>(\n () => ({\n chain,\n tokenAddress,\n nativeToken,\n tokenInfo,\n nativeBalance,\n tokenBalance,\n direction: ctx.direction,\n setDirection: ctx.setDirection,\n amount: ctx.amount,\n setAmount: ctx.setAmount,\n buyPreset: ctx.buyPreset,\n setBuyPreset: ctx.setBuyPreset,\n sellPreset: ctx.sellPreset,\n setSellPreset: ctx.setSellPreset,\n currentPresetValues: ctx.currentPresetValues,\n settings: ctx.settings,\n updateBuySettings: ctx.updateBuySettings,\n updateSellSettings: ctx.updateSellSettings,\n showSettings,\n handlePresetClick,\n swap,\n isSwapping,\n submitText,\n isDisabled,\n isLoading,\n }),\n [\n chain,\n tokenAddress,\n nativeToken,\n tokenInfo,\n nativeBalance,\n tokenBalance,\n ctx,\n showSettings,\n handlePresetClick,\n swap,\n isSwapping,\n submitText,\n isDisabled,\n isLoading,\n ],\n );\n}\n","import { Key, useCallback, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n cn,\n InfoIcon,\n ShieldIcon,\n ShieldOffIcon,\n ShieldPlusIcon,\n Tab,\n StyledTooltip,\n StyledNumberInput,\n StyledInput,\n StyledSwitch,\n StyledBorderedTabs,\n} from \"@liberfi.io/ui\";\nimport type { TradePresetValues } from \"../../types\";\nimport { getChainPresetFeatures, type FeeType } from \"./chain-features\";\nimport type { PresetFormUIProps } from \"./types\";\n\n/**\n * Pure presentational preset-settings form.\n *\n * Renders inputs for slippage, priority fee, tip fee, auto fee,\n * max auto fee, anti-MEV and custom RPC.\n *\n * The `chain` prop controls which fields are visible:\n * - Solana: priority fee (SOL), tip fee (SOL), anti-MEV\n * - Ethereum: gas fee (Gwei) only\n * - BSC: gas fee (Gwei) + tip fee (BNB)\n */\nexport function PresetFormUI({\n value,\n onChange,\n chain,\n disableAnimation,\n className,\n}: PresetFormUIProps) {\n const update = useCallback(\n (patch: Partial<TradePresetValues>) => onChange({ ...value, ...patch }),\n [value, onChange],\n );\n\n const features = useMemo(() => getChainPresetFeatures(chain), [chain]);\n\n const feeKey =\n features.feeType === \"gasFee\"\n ? (\"gasFee\" as const)\n : (\"priorityFee\" as const);\n\n return (\n <div className={cn(\"space-y-4\", className)}>\n <SlippageRow\n value={value.slippage}\n onChange={(v) => update({ slippage: v })}\n />\n <FeeRow\n value={value[feeKey]}\n onChange={(v) => update({ [feeKey]: v })}\n feeType={features.feeType}\n symbol={features.feeUnit}\n decimals={features.feeDecimals}\n />\n {features.showTipFee && (\n <TipFeeRow\n value={value.tipFee}\n onChange={(v) => update({ tipFee: v })}\n symbol={features.tipFeeUnit}\n decimals={features.tipFeeDecimals}\n />\n )}\n {features.showAutoFee && (\n <>\n <AutoFeeRow\n value={value.autoFee}\n onChange={(v) => update({ autoFee: v })}\n disableAnimation={disableAnimation}\n />\n {value.autoFee && (\n <MaxAutoFeeRow\n value={value.maxAutoFee}\n onChange={(v) => update({ maxAutoFee: v })}\n symbol={features.nativeSymbol}\n />\n )}\n </>\n )}\n <AntiMEVRow\n value={value.antiMev}\n onChange={(v) => update({ antiMev: v })}\n options={features.antiMevOptions}\n disableAnimation={disableAnimation}\n />\n {features.showCustomRPC && (\n <CustomRPCRow\n value={value.customRPC}\n onChange={(v) => update({ customRPC: v })}\n />\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Internal row components\n// ---------------------------------------------------------------------------\n\n// -- Slippage --\n\nfunction SlippageRow({\n value,\n onChange,\n}: {\n value: number | null;\n onChange: (v: number | null) => void;\n}) {\n const { t } = useTranslation();\n const label = t(\"trade.preset.slippage\");\n return (\n <div className=\"w-full grid grid-cols-2 gap-2 items-center\">\n <div className=\"text-sm text-neutral\">{label}</div>\n <StyledNumberInput\n fullWidth\n variant=\"flat\"\n value={value === null ? undefined : value}\n onValueChange={(v) => onChange(isNaN(v) ? null : v)}\n hideStepper\n minValue={0}\n maxValue={100}\n step={1}\n endContent={<span className=\"text-sm text-neutral\">%</span>}\n aria-label={label}\n />\n </div>\n );\n}\n\n// -- Fee (priority fee for Solana, gas fee for EVM) --\n\nfunction FeeRow({\n value,\n onChange,\n feeType,\n symbol,\n decimals,\n}: {\n value: number | null;\n onChange: (v: number | null) => void;\n feeType: FeeType;\n symbol: string;\n decimals: number;\n}) {\n const { t } = useTranslation();\n const label = t(`trade.preset.${feeType}`);\n const tooltip = t(`trade.preset.${feeType}.tooltip`);\n return (\n <div className=\"w-full grid grid-cols-2 gap-2 items-center\">\n <div className=\"text-sm text-neutral flex items-center gap-1\">\n {label}\n <StyledTooltip content={tooltip}>\n <Button\n isIconOnly\n className=\"bg-transparent min-w-0 w-4 min-h-0 h-4 p-0\"\n disableRipple\n >\n <InfoIcon width={13} height={13} className=\"text-neutral\" />\n </Button>\n </StyledTooltip>\n </div>\n <StyledNumberInput\n fullWidth\n variant=\"flat\"\n value={value === null ? undefined : value}\n onValueChange={(v) => onChange(isNaN(v) ? null : v)}\n hideStepper\n minValue={0}\n formatOptions={{ maximumFractionDigits: decimals }}\n endContent={<span className=\"text-sm text-neutral\">{symbol}</span>}\n aria-label={label}\n />\n </div>\n );\n}\n\n// -- Tip Fee --\n\nfunction TipFeeRow({\n value,\n onChange,\n symbol,\n decimals,\n}: {\n value: number | null;\n onChange: (v: number | null) => void;\n symbol: string;\n decimals: number;\n}) {\n const { t } = useTranslation();\n const label = t(\"trade.preset.tipFee\");\n return (\n <div className=\"w-full grid grid-cols-2 gap-2 items-center\">\n <div className=\"text-sm text-neutral flex items-center gap-1\">\n {label}\n <StyledTooltip content={t(\"trade.preset.tipFee.tooltip\")}>\n <Button\n isIconOnly\n className=\"bg-transparent min-w-0 w-4 min-h-0 h-4 p-0\"\n disableRipple\n >\n <InfoIcon width={13} height={13} className=\"text-neutral\" />\n </Button>\n </StyledTooltip>\n </div>\n <StyledNumberInput\n fullWidth\n variant=\"flat\"\n value={value === null ? undefined : value}\n onValueChange={(v) => onChange(isNaN(v) ? null : v)}\n hideStepper\n minValue={0}\n formatOptions={{ maximumFractionDigits: decimals }}\n endContent={<span className=\"text-sm text-neutral\">{symbol}</span>}\n aria-label={label}\n />\n </div>\n );\n}\n\n// -- Auto Fee --\n\nfunction AutoFeeRow({\n value,\n onChange,\n disableAnimation,\n}: {\n value: boolean;\n onChange: (v: boolean) => void;\n disableAnimation?: boolean;\n}) {\n const { t } = useTranslation();\n const label = t(\"trade.preset.autoFee\");\n return (\n <div className=\"w-full grid grid-cols-2 gap-2 items-center\">\n <div className=\"text-sm text-neutral flex items-center gap-1\">\n {label}\n <StyledTooltip content={t(\"trade.preset.autoFee.tooltip\")}>\n <Button\n isIconOnly\n className=\"bg-transparent min-w-0 w-4 min-h-0 h-4 p-0\"\n disableRipple\n >\n <InfoIcon width={13} height={13} className=\"text-neutral\" />\n </Button>\n </StyledTooltip>\n </div>\n <div className=\"flex justify-end\">\n <StyledSwitch\n isSelected={value}\n onValueChange={onChange}\n color=\"primary\"\n aria-label={label}\n disableAnimation={disableAnimation}\n />\n </div>\n </div>\n );\n}\n\n// -- Max Auto Fee --\n\nfunction MaxAutoFeeRow({\n value,\n onChange,\n symbol,\n}: {\n value: number | null;\n onChange: (v: number | null) => void;\n symbol: string;\n}) {\n const { t } = useTranslation();\n const label = t(\"trade.preset.maxAutoFee\");\n return (\n <div className=\"w-full grid grid-cols-2 gap-2 items-center\">\n <div className=\"text-sm text-neutral\">{label}</div>\n <StyledNumberInput\n fullWidth\n variant=\"flat\"\n value={value === null ? undefined : value}\n onValueChange={(v) => onChange(isNaN(v) ? null : v)}\n hideStepper\n minValue={0}\n endContent={<span className=\"text-sm text-neutral\">{symbol}</span>}\n aria-label={label}\n />\n </div>\n );\n}\n\n// -- Anti-MEV --\n\nfunction AntiMEVRow({\n value,\n onChange,\n options,\n disableAnimation,\n}: {\n value: \"off\" | \"reduced\" | \"secure\";\n onChange: (v: \"off\" | \"reduced\" | \"secure\") => void;\n options: readonly (\"off\" | \"reduced\" | \"secure\")[];\n disableAnimation?: boolean;\n}) {\n const { t } = useTranslation();\n const label = t(\"trade.preset.antiMev\");\n const icons = useMemo(\n () =>\n ({\n off: ShieldOffIcon,\n reduced: ShieldIcon,\n secure: ShieldPlusIcon,\n }) as const,\n [],\n );\n const tooltips = useMemo(\n () => ({\n off: {\n title: t(\"trade.preset.antiMev.off\"),\n desc: t(\"trade.preset.antiMev.off.desc\"),\n },\n reduced: {\n title: t(\"trade.preset.antiMev.reduced\"),\n desc: t(\"trade.preset.antiMev.reduced.desc\"),\n },\n secure: {\n title: t(\"trade.preset.antiMev.secure\"),\n desc: t(\"trade.preset.antiMev.secure.desc\"),\n },\n }),\n [t],\n );\n return (\n <div className=\"w-full grid grid-cols-2 gap-2 items-center\">\n <div className=\"text-sm text-neutral flex items-center gap-1\">\n {label}\n <StyledTooltip content={t(\"trade.preset.antiMev.tooltip\")}>\n <Button\n isIconOnly\n className=\"bg-transparent min-w-0 w-4 min-h-0 h-4 p-0\"\n disableRipple\n >\n <InfoIcon width={13} height={13} className=\"text-neutral\" />\n </Button>\n </StyledTooltip>\n </div>\n <div className=\"flex justify-end\">\n <StyledBorderedTabs\n color=\"primary\"\n radius=\"lg\"\n classNames={{ tabList: \"gap-0\", tab: \"w-8 min-w-0 px-0\" }}\n selectedKey={value}\n onSelectionChange={onChange as (key: Key) => void}\n disableAnimation={disableAnimation}\n aria-label={label}\n >\n {options.map((opt) => {\n const Icon = icons[opt];\n const tip = tooltips[opt];\n return (\n <Tab\n key={opt}\n title={\n <StyledTooltip\n content={\n <div className=\"text-xs\">\n <div className=\"font-medium text-foreground\">\n {tip.title}\n </div>\n <div className=\"mt-0.5\">{tip.desc}</div>\n </div>\n }\n >\n <span className=\"flex items-center justify-center\">\n <Icon width={18} height={18} />\n </span>\n </StyledTooltip>\n }\n />\n );\n })}\n </StyledBorderedTabs>\n </div>\n </div>\n );\n}\n\n// -- Custom RPC --\n\nfunction CustomRPCRow({\n value,\n onChange,\n}: {\n value: string | null;\n onChange: (v: string | null) => void;\n}) {\n const { t } = useTranslation();\n const label = t(\"trade.preset.customRpc\");\n return (\n <div className=\"w-full flex gap-4 items-center\">\n <div className=\"flex-none text-sm text-neutral\">{label}</div>\n <div className=\"flex-auto\">\n <StyledInput\n fullWidth\n variant=\"flat\"\n value={value ?? \"\"}\n onValueChange={(v) => onChange(v || null)}\n placeholder=\"https://...\"\n aria-label={label}\n />\n </div>\n </div>\n );\n}\n","import { ChangeEvent, Key, useCallback, useMemo, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { Chain } from \"@liberfi.io/types\";\nimport {\n Button,\n CheckIcon,\n cn,\n CoinsIcon,\n EditIcon,\n NumberInput,\n ShieldIcon,\n ShieldOffIcon,\n ShieldPlusIcon,\n SlippageIcon,\n Tab,\n Tabs,\n Tooltip,\n ZapFastIcon,\n} from \"@liberfi.io/ui\";\nimport { formatPercent, formatPrice, getNativeToken } from \"@liberfi.io/utils\";\nimport type { TradePresetValues } from \"../../types\";\nimport { getChainPresetFeatures } from \"./chain-features\";\nimport { PresetFormUI } from \"./preset-form.ui\";\nimport type { InstantTradeUIProps } from \"./types\";\n\n/**\n * Pure presentational component for the instant trade form.\n *\n * Receives all data and callbacks via props — no API calls, no context access.\n * Consumers can replace this component while reusing `useInstantTradeScript`.\n */\nexport function InstantTradeUI({\n chain,\n direction,\n onDirectionChange,\n amount,\n onAmountChange,\n customAmounts,\n customPercentages,\n onQuickAmountClick,\n onQuickPercentageClick,\n onCustomAmountsEdit,\n onCustomPercentagesEdit,\n tokenSymbol,\n nativeBalance,\n tokenBalance,\n amountConversion,\n preset,\n onPresetChange,\n presetValues,\n onPresetSettingsChange,\n showSettings,\n onPresetClick,\n submitText,\n isDisabled,\n isLoading,\n onSubmit,\n className,\n headerExtra,\n}: InstantTradeUIProps) {\n const { t } = useTranslation();\n const nativeToken = useMemo(() => getNativeToken(chain), [chain]);\n const nativeSymbol = nativeToken?.symbol;\n const nativeDecimals = nativeToken?.decimals ?? 9;\n\n return (\n <div\n className={cn(\"flex-none sm:px-3 py-3 bg-content1 rounded-lg\", className)}\n >\n {/* ── Direction tabs ──────────────────────────────────────────────── */}\n <Tabs\n fullWidth\n size=\"sm\"\n selectedKey={direction}\n onSelectionChange={onDirectionChange as (key: Key) => void}\n classNames={{\n tabList: \"bg-content2\",\n tab: \"data-[selected=true]:bg-content3 h-6\",\n }}\n disableAnimation\n >\n <Tab key=\"buy\" title={t(\"common.buy\")} />\n <Tab key=\"sell\" title={t(\"common.sell\")} />\n </Tabs>\n\n {/* ── Trade type + extra ──────────────────────────────────────────── */}\n <div className=\"mt-2.5 h-8 flex items-center justify-between\">\n <Tabs\n size=\"sm\"\n variant=\"underlined\"\n classNames={{ tabList: \"gap-0\", tab: \"px-1.5\" }}\n selectedKey=\"market\"\n disableAnimation\n >\n <Tab key=\"market\" title={t(\"trade.market\")} />\n </Tabs>\n {headerExtra}\n </div>\n\n {/* ── Amount input ────────────────────────────────────────────────── */}\n <div className=\"mt-2.5\">\n {direction === \"buy\" ? (\n <BuyAmountSection\n amount={amount}\n onAmountChange={onAmountChange}\n customAmounts={customAmounts}\n onQuickAmountClick={onQuickAmountClick}\n onCustomAmountsEdit={onCustomAmountsEdit}\n nativeSymbol={nativeSymbol}\n nativeDecimals={nativeDecimals}\n amountLabel={t(\"trade.amount\")}\n />\n ) : (\n <SellAmountSection\n amount={amount}\n onAmountChange={onAmountChange}\n customPercentages={customPercentages}\n onQuickPercentageClick={onQuickPercentageClick}\n onCustomPercentagesEdit={onCustomPercentagesEdit}\n tokenSymbol={tokenSymbol}\n amountLabel={t(\"trade.amount\")}\n />\n )}\n </div>\n\n {/* ── Balance & conversion ─────────────────────────────────────── */}\n <div className=\"mt-2 flex items-center justify-between\">\n <div className=\"text-xs text-neutral space-x-1\">\n <span>{t(\"trade.balance\")}</span>\n <span>\n {direction === \"buy\"\n ? nativeBalance\n ? `${nativeBalance} ${nativeSymbol ?? \"\"}`\n : \"--\"\n : tokenBalance\n ? `${tokenBalance} ${tokenSymbol ?? \"\"}`\n : \"--\"}\n </span>\n </div>\n {amountConversion && (\n <div className=\"text-xs text-neutral\">{amountConversion}</div>\n )}\n </div>\n\n {/* ── Preset overview ──────────────────────────────────────────── */}\n <div className=\"mt-4\">\n <PresetOverview values={presetValues} chain={chain} />\n </div>\n\n {/* ── Preset switcher ──────────────────────────────────────────── */}\n <div className=\"mt-2\">\n <Tabs\n variant=\"bordered\"\n size=\"sm\"\n fullWidth\n classNames={{\n tabList: \"border-content3 border-1 gap-0 p-0.5\",\n tab: \"min-h-0 h-6 px-2 py-1 text-xs data-[selected=true]:bg-content3\",\n tabContent: \"text-neutral\",\n }}\n selectedKey={`${preset}`}\n onSelectionChange={(key: Key) => onPresetChange(Number(key))}\n disableAnimation\n aria-label={t(\"trade.preset.presets\")}\n >\n <Tab\n key={0}\n title={t(\"trade.preset.label\", { n: 1 })}\n onClick={() => onPresetClick(0)}\n />\n <Tab\n key={1}\n title={t(\"trade.preset.label\", { n: 2 })}\n onClick={() => onPresetClick(1)}\n />\n <Tab\n key={2}\n title={t(\"trade.preset.label\", { n: 3 })}\n onClick={() => onPresetClick(2)}\n />\n </Tabs>\n </div>\n\n {/* ── Settings form (conditional) ──────────────────────────────── */}\n {showSettings && (\n <div className=\"mt-2.5\">\n <PresetFormUI\n value={presetValues}\n onChange={onPresetSettingsChange}\n chain={chain}\n />\n </div>\n )}\n\n {/* ── Submit ───────────────────────────────────────────────────── */}\n <Button\n fullWidth\n size=\"sm\"\n color={direction === \"buy\" ? \"primary\" : \"secondary\"}\n className=\"mt-2 rounded-lg\"\n disableRipple\n isDisabled={isDisabled}\n isLoading={isLoading}\n onPress={onSubmit}\n >\n {submitText}\n </Button>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Buy amount section with quick-input buttons\n// ---------------------------------------------------------------------------\n\nfunction BuyAmountSection({\n amount,\n onAmountChange,\n customAmounts,\n onQuickAmountClick,\n onCustomAmountsEdit,\n nativeSymbol,\n nativeDecimals,\n amountLabel,\n}: {\n amount: number | undefined;\n onAmountChange: (v: number | undefined) => void;\n customAmounts: (number | null)[];\n onQuickAmountClick: (v: number) => void;\n onCustomAmountsEdit: (a: (number | null)[]) => void;\n nativeSymbol: string | undefined;\n nativeDecimals: number;\n amountLabel: string;\n}) {\n const handleChange = useCallback(\n (v: number | ChangeEvent<HTMLInputElement>) => {\n if (typeof v === \"number\") {\n onAmountChange(isNaN(v) ? undefined : v);\n }\n },\n [onAmountChange],\n );\n\n return (\n <div className=\"space-y-0.5\">\n <NumberInput\n min={0}\n value={amount}\n onChange={handleChange}\n fullWidth\n hideStepper\n startContent={\n <span className=\"flex-none text-xs text-neutral\">{amountLabel}</span>\n }\n endContent={\n <span className=\"flex-none text-xs text-neutral\">\n {nativeSymbol ?? \"\"}\n </span>\n }\n formatOptions={{\n maximumFractionDigits: nativeDecimals,\n }}\n classNames={{\n inputWrapper: cn(\n \"h-8 min-h-0 py-0 rounded-lg rounded-b-none shadow-none\",\n \"bg-content2 data-[hover=true]:bg-content3 group-data-[focus=true]:bg-content3\",\n ),\n input: \"text-xs\",\n }}\n />\n <QuickButtons\n values={customAmounts}\n onSelect={onQuickAmountClick}\n onEdit={onCustomAmountsEdit}\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Sell amount section with percentage quick-input buttons\n// ---------------------------------------------------------------------------\n\nfunction SellAmountSection({\n amount,\n onAmountChange,\n customPercentages,\n onQuickPercentageClick,\n onCustomPercentagesEdit,\n tokenSymbol,\n amountLabel,\n}: {\n amount: number | undefined;\n onAmountChange: (v: number | undefined) => void;\n customPercentages: (number | null)[];\n onQuickPercentageClick: (pct: number) => void;\n onCustomPercentagesEdit: (p: (number | null)[]) => void;\n tokenSymbol?: string;\n amountLabel: string;\n}) {\n const handleChange = useCallback(\n (v: number | ChangeEvent<HTMLInputElement>) => {\n if (typeof v === \"number\") {\n onAmountChange(isNaN(v) ? undefined : v);\n }\n },\n [onAmountChange],\n );\n\n return (\n <div className=\"space-y-0.5\">\n <NumberInput\n min={0}\n value={amount}\n onChange={handleChange}\n fullWidth\n hideStepper\n startContent={\n <span className=\"flex-none text-xs text-neutral\">{amountLabel}</span>\n }\n endContent={\n <span className=\"flex-none text-xs text-neutral\">\n {tokenSymbol ?? \"\"}\n </span>\n }\n classNames={{\n inputWrapper: cn(\n \"h-8 min-h-0 py-0 rounded-lg rounded-b-none shadow-none\",\n \"bg-content2 data-[hover=true]:bg-content3 group-data-[focus=true]:bg-content3\",\n ),\n input: \"text-xs\",\n }}\n />\n <QuickButtons\n values={customPercentages}\n onSelect={onQuickPercentageClick}\n onEdit={onCustomPercentagesEdit}\n suffix=\"%\"\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Reusable quick-input buttons (editable)\n// ---------------------------------------------------------------------------\n\nfunction QuickButtons({\n values,\n onSelect,\n onEdit,\n suffix,\n}: {\n values: (number | null)[];\n onSelect: (v: number) => void;\n onEdit: (v: (number | null)[]) => void;\n suffix?: string;\n}) {\n const [isEditing, setIsEditing] = useState(false);\n const [tempValues, setTempValues] = useState<(number | null)[]>([]);\n\n const handleStartEdit = useCallback(() => {\n setTempValues([...values]);\n setIsEditing(true);\n }, [values]);\n\n const handleSave = useCallback(() => {\n setIsEditing(false);\n onEdit(tempValues);\n }, [onEdit, tempValues]);\n\n return (\n <div className=\"flex gap-0.5\">\n <div className=\"flex-auto grid grid-cols-4 gap-0.5\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div\n key={i}\n className={cn(\n \"h-6 bg-content2 flex items-center justify-center\",\n i === 0 && \"rounded-bl-lg\",\n )}\n >\n {isEditing ? (\n <NumberInput\n fullWidth\n value={\n tempValues[i] === null || tempValues[i] === undefined\n ? undefined\n : tempValues[i]\n }\n onChange={(v: number | ChangeEvent<HTMLInputElement>) => {\n if (typeof v === \"number\") {\n const val = isNaN(v) ? null : v;\n setTempValues((prev) => {\n const next = [...prev];\n next[i] = val;\n return next;\n });\n }\n }}\n min={0}\n hideStepper\n classNames={{\n inputWrapper: cn(\n \"p-0 h-6 min-h-0 rounded-none flex shadow-none\",\n \"bg-content2 data-[hover=true]:bg-content3 group-data-[focus=true]:bg-content3\",\n i === 0 && \"rounded-bl-lg\",\n ),\n innerWrapper: \"pb-0\",\n input: \"text-xs text-center\",\n }}\n />\n ) : (\n <Button\n className=\"min-w-0 w-full min-h-0 h-full p-0 bg-transparent text-xs\"\n size=\"sm\"\n disableRipple\n onPress={() => values[i] != null && onSelect(values[i]!)}\n endContent={\n suffix ? (\n <span className=\"text-xs text-neutral\">{suffix}</span>\n ) : null\n }\n >\n {values[i] ?? \"\"}\n </Button>\n )}\n </div>\n ))}\n </div>\n <div className=\"flex-none bg-content2 rounded-br-lg overflow-hidden\">\n {isEditing ? (\n <Button\n size=\"sm\"\n isIconOnly\n className=\"bg-transparent h-6 min-h-6 p-0\"\n disableRipple\n onPress={handleSave}\n >\n <CheckIcon width={12} height={12} />\n </Button>\n ) : (\n <Button\n size=\"sm\"\n isIconOnly\n className=\"bg-transparent h-6 min-h-6 p-0\"\n disableRipple\n onPress={handleStartEdit}\n >\n <EditIcon width={12} height={12} />\n </Button>\n )}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Preset overview row (icons + values)\n// ---------------------------------------------------------------------------\n\nfunction PresetOverview({\n values,\n chain,\n}: {\n values: TradePresetValues;\n chain: Chain;\n}) {\n const { t } = useTranslation();\n const features = useMemo(() => getChainPresetFeatures(chain), [chain]);\n\n const antiMevKey =\n values.antiMev && values.antiMev !== \"off\" ? values.antiMev : \"off\";\n\n return (\n <div className=\"flex items-center gap-2\">\n <Tooltip\n content={t(\"trade.preset.slippage\")}\n classNames={{ content: \"text-xs text-neutral py-2 px-4 max-w-xs\" }}\n >\n <Button\n size=\"sm\"\n className=\"bg-transparent p-0 h-5 min-h-0 w-auto min-w-0 gap-0.5 text-xs text-neutral\"\n disableRipple\n startContent={<SlippageIcon width={14} height={14} />}\n >\n {formatPercent((values.slippage ?? 0) / 100)}\n </Button>\n </Tooltip>\n\n <Tooltip\n content={t(`trade.preset.${features.feeType}`)}\n classNames={{ content: \"text-xs text-neutral py-2 px-4 max-w-xs\" }}\n >\n <Button\n size=\"sm\"\n className=\"bg-transparent p-0 h-5 min-h-0 w-auto min-w-0 gap-0.5 text-xs text-neutral\"\n disableRipple\n startContent={<ZapFastIcon width={14} height={14} />}\n >\n {formatPrice(values.priorityFee ?? 0)}\n </Button>\n </Tooltip>\n\n {features.showTipFee && (\n <Tooltip\n content={t(\"trade.preset.tipFee\")}\n classNames={{ content: \"text-xs text-neutral py-2 px-4 max-w-xs\" }}\n >\n <Button\n size=\"sm\"\n className=\"bg-transparent p-0 h-5 min-h-0 w-auto min-w-0 gap-0.5 text-xs text-neutral\"\n disableRipple\n startContent={<CoinsIcon width={14} height={14} />}\n >\n {formatPrice(values.tipFee ?? 0)}\n </Button>\n </Tooltip>\n )}\n\n <Tooltip\n content={t(\"trade.preset.antiMev\")}\n classNames={{ content: \"text-xs text-neutral py-2 px-4 max-w-xs\" }}\n >\n <Button\n size=\"sm\"\n className=\"bg-transparent p-0 h-5 min-h-0 w-auto min-w-0 gap-0.5 text-xs text-neutral\"\n disableRipple\n startContent={\n <>\n {antiMevKey === \"off\" && (\n <ShieldOffIcon\n width={14}\n height={14}\n className=\"text-neutral\"\n />\n )}\n {antiMevKey === \"reduced\" && (\n <ShieldIcon width={14} height={14} className=\"text-neutral\" />\n )}\n {antiMevKey === \"secure\" && (\n <ShieldPlusIcon\n width={14}\n height={14}\n className=\"text-neutral\"\n />\n )}\n </>\n }\n >\n {t(`trade.preset.antiMev.${antiMevKey}`)}\n </Button>\n </Tooltip>\n </div>\n );\n}\n","import { useCallback } from \"react\";\nimport BigNumber from \"bignumber.js\";\nimport { InstantTradeProvider } from \"./instant-trade.context\";\nimport { useInstantTradeScript } from \"./instant-trade.script\";\nimport { InstantTradeUI } from \"./instant-trade.ui\";\nimport type {\n InstantTradeWidgetProps,\n BuySettings,\n SellSettings,\n} from \"./types\";\n\n/**\n * Full instant-trade widget — thin orchestration layer.\n *\n * Wraps `InstantTradeProvider`, calls `useInstantTradeScript` to get all data,\n * and renders `InstantTradeUI` as the presentational layer.\n *\n * For custom UIs, use `useInstantTradeScript` directly inside an\n * `InstantTradeProvider` with your own presentation.\n */\nexport function InstantTradeWidget({\n chain,\n tokenAddress,\n onSwapSubmitted,\n onSwapError,\n settings,\n onSettingsChange,\n headerExtra,\n className,\n}: InstantTradeWidgetProps) {\n return (\n <InstantTradeProvider\n chain={chain}\n tokenAddress={tokenAddress}\n settings={settings}\n onSettingsChange={onSettingsChange}\n >\n <InstantTradeWidgetInner\n chain={chain}\n tokenAddress={tokenAddress}\n onSwapSubmitted={onSwapSubmitted}\n onSwapError={onSwapError}\n headerExtra={headerExtra}\n className={className}\n />\n </InstantTradeProvider>\n );\n}\n\nfunction InstantTradeWidgetInner({\n chain,\n tokenAddress,\n onSwapSubmitted,\n onSwapError,\n headerExtra,\n className,\n}: Omit<InstantTradeWidgetProps, \"settings\" | \"onSettingsChange\">) {\n const script = useInstantTradeScript({\n chain,\n tokenAddress,\n onSwapSubmitted,\n onSwapError,\n });\n\n // -- Quick amount click (buy: set amount directly, sell: compute from balance) --\n const handleQuickAmountClick = useCallback(\n (v: number) => script.setAmount(v),\n [script],\n );\n\n const handleQuickPercentageClick = useCallback(\n (pct: number) => {\n const bal = script.tokenBalance?.amount;\n if (!bal) return;\n const amount = new BigNumber(bal).times(pct).div(100).toNumber();\n script.setAmount(amount);\n },\n [script],\n );\n\n // -- Custom amounts/percentages editing --\n const handleCustomAmountsEdit = useCallback(\n (amounts: (number | null)[]) => {\n script.updateBuySettings({\n ...script.settings.buy,\n customAmounts: amounts,\n });\n },\n [script],\n );\n\n const handleCustomPercentagesEdit = useCallback(\n (pcts: (number | null)[]) => {\n script.updateSellSettings({\n ...script.settings.sell,\n customPercentages: pcts,\n });\n },\n [script],\n );\n\n // -- Preset settings change --\n const handlePresetSettingsChange = useCallback(\n (values: import(\"../../types\").TradePresetValues) => {\n const isBuy = script.direction === \"buy\";\n const idx = isBuy ? script.buyPreset : script.sellPreset;\n\n if (isBuy) {\n const prev = script.settings.buy;\n const presets = [...prev.presets];\n presets[idx] = values;\n script.updateBuySettings({ ...prev, presets });\n } else {\n const prev = script.settings.sell;\n const presets = [...prev.presets];\n presets[idx] = values;\n script.updateSellSettings({ ...prev, presets });\n }\n },\n [script],\n );\n\n // -- Preset change (select preset index) --\n const handlePresetChange = useCallback(\n (p: number) => {\n if (script.direction === \"buy\") {\n script.setBuyPreset(p);\n } else {\n script.setSellPreset(p);\n }\n },\n [script],\n );\n\n const currentPreset =\n script.direction === \"buy\" ? script.buyPreset : script.sellPreset;\n\n return (\n <InstantTradeUI\n chain={chain}\n direction={script.direction}\n onDirectionChange={script.setDirection}\n amount={script.amount}\n onAmountChange={script.setAmount}\n customAmounts={script.settings.buy.customAmounts}\n customPercentages={script.settings.sell.customPercentages}\n onQuickAmountClick={handleQuickAmountClick}\n onQuickPercentageClick={handleQuickPercentageClick}\n onCustomAmountsEdit={handleCustomAmountsEdit}\n onCustomPercentagesEdit={handleCustomPercentagesEdit}\n tokenSymbol={script.tokenInfo?.symbol}\n nativeBalance={script.nativeBalance?.amount}\n tokenBalance={script.tokenBalance?.amount}\n amountConversion={undefined}\n preset={currentPreset}\n onPresetChange={handlePresetChange}\n presetValues={script.currentPresetValues}\n onPresetSettingsChange={handlePresetSettingsChange}\n showSettings={script.showSettings}\n onPresetClick={script.handlePresetClick}\n submitText={script.submitText}\n isDisabled={script.isDisabled}\n isLoading={script.isSwapping}\n onSubmit={script.swap}\n className={className}\n headerExtra={headerExtra}\n />\n );\n}\n","import { useCallback, useMemo } from \"react\";\nimport { useAtom, useAtomValue } from \"jotai\";\nimport {\n instantTradeAmountAtomFamily,\n instantTradeAmountKey,\n} from \"../../states/instant-trade-amount\";\nimport { presetAtomFamily, presetKey } from \"../../states/preset\";\nimport type {\n UseAmountPresetInputScriptParams,\n UseAmountPresetInputScriptResult,\n} from \"./types\";\n\n/**\n * Script hook for the amount + preset input.\n *\n * Subscribes to atom-backed `{ amount, preset }` state (keyed by\n * `id + chain + token.address`) and reads preset values from\n * {@link presetAtomFamily} for tooltip display.\n *\n * Use the companion {@link AmountPresetInputWidget} for the default UI,\n * or call this hook directly to build a custom amount + preset input.\n */\nexport function useAmountPresetInputScript(\n params: UseAmountPresetInputScriptParams,\n): UseAmountPresetInputScriptResult {\n const {\n id,\n chain,\n token,\n storageKeyPrefix,\n onAmountChange,\n onPresetChange,\n onPresetClick,\n } = params;\n\n const [state, setState] = useAtom(\n instantTradeAmountAtomFamily(\n instantTradeAmountKey(id, chain, token.address, storageKeyPrefix),\n ),\n );\n\n const p0 = useAtomValue(\n presetAtomFamily(presetKey(chain, \"buy\", 0, storageKeyPrefix)),\n );\n const p1 = useAtomValue(\n presetAtomFamily(presetKey(chain, \"buy\", 1, storageKeyPrefix)),\n );\n const p2 = useAtomValue(\n presetAtomFamily(presetKey(chain, \"buy\", 2, storageKeyPrefix)),\n );\n const presetValues = useMemo(() => [p0, p1, p2], [p0, p1, p2]);\n\n const handleAmountChange = useCallback(\n (amount: number | undefined) => {\n setState((prev) => ({ ...prev, amount }));\n onAmountChange?.(amount);\n },\n [setState, onAmountChange],\n );\n\n const handlePresetChange = useCallback(\n (preset: number) => {\n setState((prev) => ({ ...prev, preset }));\n onPresetChange?.(preset);\n },\n [setState, onPresetChange],\n );\n\n return {\n token,\n chain,\n amount: state.amount,\n handleAmountChange,\n preset: state.preset,\n handlePresetChange,\n onPresetClick,\n presetValues,\n };\n}\n","import { Key, useCallback, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { Chain } from \"@liberfi.io/types\";\nimport {\n cn,\n CoinsIcon,\n LightningIcon,\n ShieldIcon,\n ShieldOffIcon,\n ShieldPlusIcon,\n SlippageIcon,\n StyledLightTabs,\n StyledNumberInput,\n StyledTooltip,\n Tab,\n TokenIcon,\n ZapFastIcon,\n} from \"@liberfi.io/ui\";\nimport { formatPercent, formatPrice } from \"@liberfi.io/utils\";\nimport type { TradePresetValues } from \"../../types\";\nimport {\n getChainPresetFeatures,\n getDefaultPresetForChain,\n} from \"./chain-features\";\nimport type { AmountPresetInputUIProps } from \"./types\";\n\n/**\n * Compact amount input with preset selector buttons (presentational).\n *\n * Designed for inline/header usage (e.g. token detail page).\n * Receives all data via props — no context dependency.\n */\nexport function AmountPresetInputUI({\n token,\n chain,\n amount,\n onAmountChange,\n preset = 0,\n onPresetChange,\n onPresetClick,\n presetValues,\n radius = \"full\",\n size = \"md\",\n className,\n}: AmountPresetInputUIProps) {\n const { t } = useTranslation();\n const defaultPreset = useMemo(() => getDefaultPresetForChain(chain), [chain]);\n\n const handleSelectionChange = useCallback(\n (key: Key) => {\n onPresetChange?.(Number(key));\n },\n [onPresetChange],\n );\n\n return (\n <div\n className={cn(\n \"flex items-center border-2 border-border\",\n radius === \"full\" && \"rounded-full\",\n radius === \"lg\" && \"rounded-lg\",\n radius === \"md\" && \"rounded-md\",\n radius === \"sm\" && \"rounded-sm\",\n size === \"sm\" && \"h-8 pr-2\",\n size === \"md\" && \"h-10 pr-2.5\",\n size === \"lg\" && \"h-12 pr-3\",\n className,\n )}\n >\n <StyledNumberInput\n key={`${chain}-${token.address}`}\n className=\"flex-auto min-w-0 h-full\"\n fullWidth\n variant=\"flat\"\n value={amount}\n onValueChange={(v) => onAmountChange(isNaN(v) ? undefined : v)}\n hideStepper\n minValue={0}\n formatOptions={{\n maximumFractionDigits: token.decimals,\n }}\n size={size}\n startContent={\n <LightningIcon\n width={size === \"sm\" ? 12 : size === \"md\" ? 16 : 20}\n height={size === \"sm\" ? 12 : size === \"md\" ? 16 : 20}\n className=\"text-primary flex-none\"\n />\n }\n endContent={\n <TokenIcon\n symbol={token.symbol}\n size={size === \"sm\" ? 16 : size === \"md\" ? 20 : 28}\n className=\"flex-none\"\n />\n }\n placeholder=\"0.0\"\n aria-label={t(\"trade.instantTradeAmount\")}\n classNames={{\n base: \"h-full\",\n mainWrapper: \"h-full\",\n inputWrapper:\n \"!bg-transparent !shadow-none !border-0 !rounded-none h-full !min-h-0\",\n }}\n />\n\n <div className=\"w-px bg-border self-stretch my-1.5 mx-1.5 flex-none\" />\n\n <StyledLightTabs\n color=\"primary\"\n size={size}\n selectedKey={String(preset)}\n onSelectionChange={handleSelectionChange}\n classNames={{\n base: \"flex-none h-full\",\n tabList: cn(\n \"bg-transparent h-full\",\n size === \"sm\" && \"p-1 gap-1\",\n size === \"md\" && \"p-1 gap-0\",\n size === \"lg\" && \"p-1.5 gap-0\",\n ),\n tab: cn(\n \"h-full\",\n size === \"sm\" && \"text-xs px-1\",\n size === \"md\" && \"text-sm px-2.5\",\n size === \"lg\" && \"text-sm px-3\",\n ),\n cursor: \"rounded-sm\",\n }}\n >\n {Array.from({ length: 3 }).map((_, index) => (\n <Tab\n key={String(index)}\n title={\n <StyledTooltip\n content={\n <PresetTooltip\n values={presetValues?.[index] ?? defaultPreset}\n chain={chain}\n />\n }\n classNames={{\n content: \"w-fit bg-content2 p-4\",\n }}\n offset={12}\n >\n <span\n onClick={() => preset === index && onPresetClick?.(index)}\n >\n {t(\"trade.preset.short\", { n: index + 1 })}\n </span>\n </StyledTooltip>\n }\n />\n ))}\n </StyledLightTabs>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Preset tooltip content\n// ---------------------------------------------------------------------------\n\nfunction PresetTooltip({\n values,\n chain,\n}: {\n values: TradePresetValues;\n chain: Chain;\n}) {\n const { t } = useTranslation();\n const features = useMemo(() => getChainPresetFeatures(chain), [chain]);\n\n const antiMevKey =\n values.antiMev && values.antiMev !== \"off\" ? values.antiMev : \"off\";\n\n return (\n <div className=\"w-full flex flex-col gap-2 text-xs text-neutral\">\n <div className=\"w-full flex items-center justify-between gap-4 h-6\">\n <span className=\"flex gap-1 items-center\">\n <SlippageIcon width={18} height={18} />\n <span className=\"font-medium\">{t(\"trade.preset.slippage\")}</span>\n </span>\n <span className=\"text-foreground\">\n {formatPercent((values.slippage ?? 0) / 100)}\n </span>\n </div>\n <div className=\"w-full flex items-center justify-between gap-4 h-6\">\n <span className=\"flex gap-1 items-center\">\n <ZapFastIcon width={18} height={18} />\n <span className=\"font-medium\">\n {t(`trade.preset.${features.feeType}`)}\n </span>\n </span>\n <span className=\"text-foreground\">\n {formatPrice(values.priorityFee ?? 0)} {features.feeUnit}\n </span>\n </div>\n {features.showTipFee && (\n <div className=\"w-full flex items-center justify-between gap-4 h-6\">\n <span className=\"flex gap-1 items-center\">\n <CoinsIcon width={18} height={18} />\n <span className=\"font-medium\">{t(\"trade.preset.tipFee\")}</span>\n </span>\n <span className=\"text-foreground\">\n {formatPrice(values.tipFee ?? 0)} {features.tipFeeUnit}\n </span>\n </div>\n )}\n <div className=\"w-full flex items-center justify-between gap-4 h-6\">\n <span className=\"flex gap-1 items-center\">\n {antiMevKey === \"off\" && <ShieldOffIcon width={18} height={18} />}\n {antiMevKey === \"reduced\" && <ShieldIcon width={18} height={18} />}\n {antiMevKey === \"secure\" && <ShieldPlusIcon width={18} height={18} />}\n <span className=\"font-medium\">{t(\"trade.preset.antiMev\")}</span>\n </span>\n <span className=\"text-foreground\">\n {t(`trade.preset.antiMev.${antiMevKey}`)}\n </span>\n </div>\n </div>\n );\n}\n","import { useAmountPresetInputScript } from \"./amount-preset-input.script\";\nimport { AmountPresetInputUI } from \"./amount-preset-input.ui\";\nimport type { AmountPresetInputWidgetProps } from \"./types\";\n\n/**\n * Amount + preset input widget — atom-backed orchestration layer.\n *\n * Wires {@link useAmountPresetInputScript} to {@link AmountPresetInputUI}.\n * State is persisted via `atomWithStorage` (keyed by `id + chain + token.address`).\n *\n * For a pure presentational input without persistence, use {@link AmountPresetInputUI}.\n * For custom UI with the same state logic, use the hook directly.\n */\nexport function AmountPresetInputWidget({\n size,\n radius,\n className,\n ...scriptParams\n}: AmountPresetInputWidgetProps) {\n const {\n token,\n chain,\n amount,\n handleAmountChange,\n preset,\n handlePresetChange,\n onPresetClick,\n presetValues,\n } = useAmountPresetInputScript(scriptParams);\n\n return (\n <AmountPresetInputUI\n token={token}\n chain={chain}\n amount={amount}\n onAmountChange={handleAmountChange}\n preset={preset}\n onPresetChange={handlePresetChange}\n onPresetClick={onPresetClick}\n presetValues={presetValues}\n size={size}\n radius={radius}\n className={className}\n />\n );\n}\n","import { useCallback, useState } from \"react\";\nimport { useAtom } from \"jotai\";\nimport { presetAtomFamily, presetKey } from \"../../states/preset\";\nimport type { TradePresetValues } from \"../../types\";\nimport type {\n UsePresetFormScriptParams,\n UsePresetFormScriptResult,\n} from \"./types\";\n\n/**\n * Script hook for the preset form.\n *\n * Manages buy/sell direction state and subscribes to the atom-backed preset\n * values identified by `chain`, `presetIndex`, and `storageKeyPrefix`.\n *\n * Use the companion {@link PresetFormWidget} for the default UI,\n * or call this hook directly to build a custom preset form.\n */\nexport function usePresetFormScript(\n params: UsePresetFormScriptParams,\n): UsePresetFormScriptResult {\n const {\n chain,\n presetIndex = 0,\n defaultDirection = \"buy\",\n storageKeyPrefix,\n onChange,\n } = params;\n\n const [direction, setDirection] = useState<\"buy\" | \"sell\">(defaultDirection);\n\n const [value, setValue] = useAtom(\n presetAtomFamily(\n presetKey(chain, direction, presetIndex, storageKeyPrefix),\n ),\n );\n\n const handleChange = useCallback(\n (next: TradePresetValues) => {\n setValue(next);\n onChange?.(direction, next);\n },\n [setValue, onChange, direction],\n );\n\n return {\n direction,\n setDirection,\n value,\n handleChange,\n };\n}\n","import type { Key } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, StyledSolidTabs, Tab } from \"@liberfi.io/ui\";\nimport { usePresetFormScript } from \"./preset-form.script\";\nimport { PresetFormUI } from \"./preset-form.ui\";\nimport type { PresetFormWidgetProps } from \"./types\";\n\n/**\n * Preset form widget — atom-backed orchestration layer with Buy/Sell tabs.\n *\n * State is persisted via `atomWithStorage` (keyed by prefix + chain + direction + preset index).\n * Pass `storageKeyPrefix` to customize the storage key prefix.\n *\n * For a pure presentational form without persistence, use {@link PresetFormUI}.\n */\nexport function PresetFormWidget({\n disableAnimation,\n className,\n ...scriptParams\n}: PresetFormWidgetProps) {\n const { t } = useTranslation();\n const { direction, setDirection, value, handleChange } =\n usePresetFormScript(scriptParams);\n\n return (\n <div className={cn(\"space-y-3\", className)}>\n <StyledSolidTabs\n radius=\"lg\"\n color=\"default\"\n fullWidth\n selectedKey={direction}\n onSelectionChange={(key: Key) => setDirection(key as \"buy\" | \"sell\")}\n aria-label=\"Buy / Sell\"\n >\n <Tab key=\"buy\" title={t(\"common.buy\")} />\n <Tab key=\"sell\" title={t(\"common.sell\")} />\n </StyledSolidTabs>\n <PresetFormUI\n value={value}\n onChange={handleChange}\n chain={scriptParams.chain}\n disableAnimation={disableAnimation}\n />\n </div>\n );\n}\n","import { useCallback, useState } from \"react\";\nimport type { PresetDirection } from \"../../states/preset\";\nimport type { TradePresetValues } from \"../../types\";\nimport type {\n UseMultiPresetFormScriptParams,\n UseMultiPresetFormScriptResult,\n} from \"./types\";\n\nconst PRESET_COUNT = 3;\n\n/**\n * Script hook for the multi-preset form.\n *\n * Manages preset index selection and forwards value changes\n * tagged with the current index to the caller.\n *\n * Use the companion {@link MultiPresetFormWidget} for the default UI,\n * or call this hook directly to build a custom multi-preset form.\n */\nexport function useMultiPresetFormScript(\n params: UseMultiPresetFormScriptParams,\n): UseMultiPresetFormScriptResult {\n const { defaultPresetIndex = 0, onChange } = params;\n\n const [presetIndex, setPresetIndex] = useState(defaultPresetIndex);\n\n const handlePresetChange = useCallback(\n (direction: PresetDirection, value: TradePresetValues) => {\n onChange?.(presetIndex, direction, value);\n },\n [onChange, presetIndex],\n );\n\n return {\n presetCount: PRESET_COUNT,\n presetIndex,\n setPresetIndex,\n handlePresetChange,\n };\n}\n","import type { Key } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, StyledSolidTabs, Tab } from \"@liberfi.io/ui\";\nimport { useMultiPresetFormScript } from \"./multi-preset-form.script\";\nimport { PresetFormWidget } from \"./preset-form.widget\";\nimport type { MultiPresetFormWidgetProps } from \"./types\";\n\n/**\n * Multi preset form widget.\n *\n * Combines preset index tabs,\n * and a persisted {@link PresetFormWidget} into a single self-contained editor.\n */\nexport function MultiPresetFormWidget({\n defaultDirection,\n disableAnimation,\n className,\n ...scriptParams\n}: MultiPresetFormWidgetProps) {\n const { t } = useTranslation();\n const { presetCount, presetIndex, setPresetIndex, handlePresetChange } =\n useMultiPresetFormScript(scriptParams);\n\n return (\n <div className={cn(\"space-y-3\", className)}>\n <StyledSolidTabs\n radius=\"lg\"\n fullWidth\n color=\"default\"\n selectedKey={String(presetIndex)}\n onSelectionChange={(key: Key) => setPresetIndex(Number(key))}\n disableAnimation={disableAnimation}\n aria-label={t(\"trade.preset.presets\")}\n >\n {Array.from({ length: presetCount }, (_, i) => (\n <Tab key={String(i)} title={t(\"trade.preset.label\", { n: i + 1 })} />\n ))}\n </StyledSolidTabs>\n <PresetFormWidget\n chain={scriptParams.chain}\n presetIndex={presetIndex}\n defaultDirection={defaultDirection}\n storageKeyPrefix={scriptParams.storageKeyPrefix}\n onChange={handlePresetChange}\n disableAnimation={disableAnimation}\n />\n </div>\n );\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Chain } from \"@liberfi.io/types\";\nimport {\n ModalBody,\n ModalContent,\n ModalHeader,\n ScrollShadow,\n StyledModal,\n} from \"@liberfi.io/ui\";\nimport { ChainSelectMobileUI } from \"@liberfi.io/ui-chain-select\";\nimport {\n AsyncModal,\n type RenderAsyncModalProps,\n} from \"@liberfi.io/ui-scaffold\";\nimport type { PresetDirection } from \"../../states/preset\";\nimport type { TradePresetValues } from \"../../types\";\nimport { MultiPresetFormWidget } from \"./multi-preset-form.widget\";\nimport type { PresetFormModalParams } from \"./types\";\n\nconst DEFAULT_MODAL_ID = \"preset\";\n\n/**\n * Async-modal wrapper for multi-chain preset editing.\n *\n * Place this component once in the tree (e.g. layout). Open it from anywhere\n * via `useAsyncModal(\"preset\").onOpen({ params: { chains, defaultChain, storageKeyPrefix, onChange } })`.\n *\n * Header: title + chain switcher.\n * Body: multi-preset form.\n */\nexport function PresetFormModal({ id = DEFAULT_MODAL_ID }: { id?: string }) {\n return (\n <AsyncModal<PresetFormModalParams> id={id}>\n {(modalProps) => <PresetFormModalContent {...modalProps} />}\n </AsyncModal>\n );\n}\n\nfunction PresetFormModalContent({\n params = { chains: [Chain.SOLANA, Chain.ETHEREUM, Chain.BINANCE] },\n isOpen,\n onOpenChange,\n}: RenderAsyncModalProps<PresetFormModalParams>) {\n const { t } = useTranslation();\n\n const {\n chains,\n defaultChain,\n defaultDirection,\n defaultPresetIndex,\n storageKeyPrefix,\n onChange,\n } = params;\n\n const [chain, setChain] = useState<Chain>(defaultChain ?? chains[0]);\n\n useEffect(() => {\n setChain(defaultChain ?? chains[0]);\n }, [defaultChain, chains]);\n\n const handlePresetChange = useCallback(\n (\n presetIndex: number,\n direction: PresetDirection,\n value: TradePresetValues,\n ) => {\n onChange?.(chain, presetIndex, direction, value);\n },\n [onChange, chain],\n );\n\n return (\n <StyledModal isOpen={isOpen} onOpenChange={onOpenChange} size=\"md\">\n <ModalContent>\n <ModalHeader>\n <div className=\"flex w-full items-center justify-between gap-4\">\n <span className=\"flex-auto min-w-0 overflow-hidden text-ellipsis line-clamp-1 whitespace-nowrap\">\n {t(\"trade.preset.instantTradeSettings\")}\n </span>\n <ChainSelectMobileUI\n candidates={chains}\n chain={chain}\n onSelectChain={setChain}\n />\n </div>\n </ModalHeader>\n <ModalBody>\n <ScrollShadow>\n <MultiPresetFormWidget\n chain={chain}\n defaultDirection={defaultDirection}\n defaultPresetIndex={defaultPresetIndex}\n storageKeyPrefix={storageKeyPrefix}\n onChange={handlePresetChange}\n />\n </ScrollShadow>\n </ModalBody>\n </ModalContent>\n </StyledModal>\n );\n}\n","import BigNumber from \"bignumber.js\";\nimport type { Chain } from \"@liberfi.io/types\";\nimport type { PredefinedToken } from \"@liberfi.io/utils\";\nimport type { SwapInput, TradePresetValues } from \"../../types\";\nimport { getDefaultPresetForChain } from \"./chain-features\";\n\n/**\n * Builds the swap input parameters from user-facing values.\n *\n * Converts amount and fees from human-readable token units to the\n * smallest on-chain unit (e.g. lamports, wei) and applies chain-specific\n * defaults for any unset preset fields.\n *\n * Pure function — no React, no hooks, independently testable.\n */\nexport function buildSwapParams(\n amount: number,\n token: PredefinedToken,\n output: string,\n presetValues: TradePresetValues,\n chain: Chain,\n): Omit<SwapInput, \"wallet\" | \"chain\"> {\n const chainDefault = getDefaultPresetForChain(chain);\n\n const amountStr = new BigNumber(amount)\n .shiftedBy(token.decimals)\n .decimalPlaces(0)\n .toString();\n\n const priorityFee = new BigNumber(\n presetValues.priorityFee ?? chainDefault.priorityFee ?? 0,\n )\n .shiftedBy(token.decimals)\n .decimalPlaces(0)\n .toString();\n\n const tipFee = new BigNumber(presetValues.tipFee ?? chainDefault.tipFee ?? 0)\n .shiftedBy(token.decimals)\n .decimalPlaces(0)\n .toString();\n\n return {\n input: token.address,\n output,\n amount: amountStr,\n slippage: presetValues.slippage ?? chainDefault.slippage ?? 1,\n priorityFee,\n tipFee,\n isAntiMev: presetValues.antiMev !== \"off\",\n };\n}\n","import { useMemo } from \"react\";\nimport { useAtomValue } from \"jotai\";\nimport {\n useConnectedWallet,\n useAuthCallback,\n} from \"@liberfi.io/wallet-connector\";\nimport { useSwap } from \"../../hooks/useSwap\";\nimport {\n instantTradeAmountAtomFamily,\n instantTradeAmountKey,\n} from \"../../states/instant-trade-amount\";\nimport { presetAtomFamily, presetKey } from \"../../states/preset\";\nimport { buildSwapParams } from \"./instant-trade-utils\";\nimport type {\n UseInstantTradeButtonParams,\n UseInstantTradeButtonResult,\n} from \"./types\";\n\n/**\n * Script hook for the instant-trade button.\n *\n * Subscribes to the amount / preset atoms identified by `id`, resolves\n * preset values, and returns an auth-guarded swap handler plus all\n * derived state needed to render a trade button.\n *\n * Use the companion {@link InstantTradeButton} widget for the default UI,\n * or call this hook directly to render a fully custom button.\n */\nexport function useInstantTradeButtonScript(\n params: UseInstantTradeButtonParams,\n): UseInstantTradeButtonResult {\n const {\n id,\n chain,\n token,\n output,\n storageKeyPrefix,\n onSwapSubmitted,\n onSwapError,\n } = params;\n\n const { amount, preset } = useAtomValue(\n instantTradeAmountAtomFamily(\n instantTradeAmountKey(id, chain, token.address, storageKeyPrefix),\n ),\n );\n\n const presetValues = useAtomValue(\n presetAtomFamily(presetKey(chain, \"buy\", preset, storageKeyPrefix)),\n );\n\n const wallet = useConnectedWallet(chain);\n\n const { swap, isSwapping } = useSwap({\n onSubmitted: onSwapSubmitted,\n onError: onSwapError,\n });\n\n const isDisabled = !amount || !output;\n\n const handleSwap = useAuthCallback(async () => {\n if (!amount || !wallet || !output) return;\n\n const params = buildSwapParams(amount, token, output, presetValues, chain);\n\n try {\n await swap({ ...params, chain, wallet });\n } catch {\n /* errors reported via onSwapError callback */\n }\n }, [wallet, amount, output, chain, token, presetValues, swap]);\n\n return useMemo(\n () => ({\n amount,\n token,\n isDisabled,\n isSwapping,\n handleSwap,\n }),\n [amount, token, isDisabled, isSwapping, handleSwap],\n );\n}\n","import { LightningIcon, Button } from \"@liberfi.io/ui\";\nimport { useInstantTradeButtonScript } from \"./instant-trade-button.script\";\nimport type { InstantTradeButtonWidgetProps } from \"./types\";\n\n/**\n * Default instant-trade button widget.\n *\n * Wires {@link useInstantTradeButton} to a {@link Button} with a\n * lightning icon and `\"amount symbol\"` label. For a fully custom button,\n * use the hook directly.\n */\nexport function InstantTradeButtonWidget({\n size = \"sm\",\n radius,\n color = \"primary\",\n className,\n ...scriptParams\n}: InstantTradeButtonWidgetProps) {\n const { amount, token, isDisabled, isSwapping, handleSwap } =\n useInstantTradeButtonScript(scriptParams);\n\n return (\n <Button\n fullWidth\n size={size}\n radius={radius}\n color={color}\n className={className}\n disableRipple\n startContent={<LightningIcon />}\n isDisabled={isDisabled}\n isLoading={isSwapping}\n onPress={handleSwap}\n >\n {amount != null ? `${amount} ${token.symbol}` : token.symbol}\n </Button>\n );\n}\n","\"use client\";\n\nimport { createContext, useCallback, useContext, useRef } from \"react\";\nimport {\n useConnectedWallet,\n useAuthCallback,\n} from \"@liberfi.io/wallet-connector\";\nimport { useSwap } from \"../../hooks/useSwap\";\nimport type { SwapInput, SwapResult } from \"../../types\";\nimport type {\n InstantTradeSwapFn,\n InstantTradeSwapProviderProps,\n} from \"./types\";\n\nconst InstantTradeSwapContext = createContext<InstantTradeSwapFn | null>(null);\n\n/**\n * Provides a single auth-guarded swap function to all descendant\n * {@link InstantTradeListButtonWidget} components.\n *\n * Calls `useSwap`, `useConnectedWallet`, and `useAuthCallback` **once**\n * so that N list buttons share one set of context subscriptions instead\n * of each creating their own.\n *\n * The context value is a **stable function reference** (backed by refs)\n * that will not cause consumer re-renders.\n */\nexport function InstantTradeSwapProvider({\n chain,\n onSwapSubmitted,\n onSwapError,\n children,\n}: InstantTradeSwapProviderProps) {\n const wallet = useConnectedWallet(chain);\n const { swap } = useSwap({\n onSubmitted: onSwapSubmitted,\n onError: onSwapError,\n });\n\n const walletRef = useRef(wallet);\n walletRef.current = wallet;\n const swapRef = useRef(swap);\n swapRef.current = swap;\n const chainRef = useRef(chain);\n chainRef.current = chain;\n\n const stableSwap = useCallback(\n async (\n input: Omit<SwapInput, \"wallet\" | \"chain\">,\n ): Promise<SwapResult | undefined> => {\n const w = walletRef.current;\n if (!w) return undefined;\n return swapRef.current({ ...input, wallet: w, chain: chainRef.current });\n },\n [],\n );\n\n const authSwap = useAuthCallback(stableSwap, []);\n\n return (\n <InstantTradeSwapContext.Provider value={authSwap}>\n {children}\n </InstantTradeSwapContext.Provider>\n );\n}\n\n/**\n * Returns the auth-guarded swap function from the nearest\n * {@link InstantTradeSwapProvider}.\n *\n * @throws If called outside an `InstantTradeSwapProvider`.\n */\nexport function useInstantTradeSwap(): InstantTradeSwapFn {\n const ctx = useContext(InstantTradeSwapContext);\n if (ctx === null) {\n throw new Error(\n \"useInstantTradeSwap must be used within an InstantTradeSwapProvider\",\n );\n }\n return ctx;\n}\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { useAtomValue } from \"jotai\";\nimport {\n instantTradeAmountAtomFamily,\n instantTradeAmountKey,\n} from \"../../states/instant-trade-amount\";\nimport { presetAtomFamily, presetKey } from \"../../states/preset\";\nimport { useInstantTradeSwap } from \"./instant-trade-swap.context\";\nimport { buildSwapParams } from \"./instant-trade-utils\";\nimport type {\n UseInstantTradeListButtonParams,\n UseInstantTradeListButtonResult,\n} from \"./types\";\n\n/**\n * Lightweight script hook for the instant-trade button in list scenarios.\n *\n * Unlike {@link useInstantTradeButtonScript}, this hook does **not** call\n * `useSwap`, `useConnectedWallet`, or `useAuthCallback`. Instead it reads\n * the swap function from {@link InstantTradeSwapProvider} via context,\n * eliminating per-button context subscriptions that cause unnecessary\n * re-renders in large lists.\n *\n * Must be used inside an {@link InstantTradeSwapProvider}.\n */\nexport function useInstantTradeListButtonScript(\n params: UseInstantTradeListButtonParams,\n): UseInstantTradeListButtonResult {\n const { id, chain, token, output, storageKeyPrefix } = params;\n\n const { amount, preset } = useAtomValue(\n instantTradeAmountAtomFamily(\n instantTradeAmountKey(id, chain, token.address, storageKeyPrefix),\n ),\n );\n\n const presetValues = useAtomValue(\n presetAtomFamily(presetKey(chain, \"buy\", preset, storageKeyPrefix)),\n );\n\n const swap = useInstantTradeSwap();\n\n const [isSwapping, setIsSwapping] = useState(false);\n\n const isDisabled = !amount || !output;\n\n // Store frequently-changing or object-typed values in refs so that\n // handleSwap's dependency list stays minimal (only amount, output, swap).\n const tokenRef = useRef(token);\n tokenRef.current = token;\n const presetValuesRef = useRef(presetValues);\n presetValuesRef.current = presetValues;\n const chainRef = useRef(chain);\n chainRef.current = chain;\n\n const handleSwap = useCallback(async () => {\n if (!amount || !output) return;\n\n const params = buildSwapParams(\n amount,\n tokenRef.current,\n output,\n presetValuesRef.current,\n chainRef.current,\n );\n\n setIsSwapping(true);\n try {\n await swap(params);\n } catch {\n /* errors reported via Provider's onSwapError callback */\n } finally {\n setIsSwapping(false);\n }\n }, [amount, output, swap]);\n\n return useMemo(\n () => ({\n amount,\n token,\n isDisabled,\n isSwapping,\n handleSwap,\n }),\n [amount, token, isDisabled, isSwapping, handleSwap],\n );\n}\n","import { memo } from \"react\";\nimport { LightningIcon, Button } from \"@liberfi.io/ui\";\nimport { useInstantTradeListButtonScript } from \"./instant-trade-list-button.script\";\nimport type { InstantTradeListButtonWidgetProps } from \"./types\";\n\n/**\n * Memoized instant-trade button optimised for list rendering.\n *\n * Visually identical to {@link InstantTradeButtonWidget}, but internally\n * reads the swap function from {@link InstantTradeSwapProvider} instead\n * of calling `useSwap` / `useConnectedWallet` / `useAuthCallback` per\n * instance. This eliminates N redundant context subscriptions in a list\n * of N tokens.\n *\n * Must be used inside an {@link InstantTradeSwapProvider}.\n */\nexport const InstantTradeListButtonWidget = memo(\n function InstantTradeListButtonWidget({\n size = \"sm\",\n radius,\n color = \"primary\",\n className,\n ...scriptParams\n }: InstantTradeListButtonWidgetProps) {\n const { amount, token, isDisabled, isSwapping, handleSwap } =\n useInstantTradeListButtonScript(scriptParams);\n\n return (\n <Button\n variant=\"solid\"\n fullWidth\n size={size}\n radius={radius}\n color={color}\n className={className}\n disableRipple\n startContent={<LightningIcon className=\"flex-none\" />}\n isDisabled={isDisabled}\n isLoading={isSwapping}\n onPress={handleSwap}\n >\n {amount != null ? `${amount} ${token.symbol}` : token.symbol}\n </Button>\n );\n },\n);\n","declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/ui-trade\"] = \"0.1.22\";\n}\n\nexport default \"0.1.22\";\n"]}