{"version":3,"file":"index.cjs","sources":["../src/services/walletQBitApi.js","../src/services/qbitActions.js","../src/hooks/useWalletQBit.js","../src/hooks/useQBitChain.js","../../../node_modules/react/cjs/react-jsx-runtime.production.js","../../../node_modules/react/cjs/react-jsx-runtime.development.js","../../../node_modules/react/jsx-runtime.js","../../oauth-sdk/node_modules/react/cjs/react-jsx-runtime.production.min.js","../../oauth-sdk/node_modules/react/cjs/react-jsx-runtime.development.js","../../oauth-sdk/node_modules/react/jsx-runtime.js","../../oauth-sdk/dist/index.esm.js","../../did-auth-sdk/dist/index.esm.js","../src/components/QBitWallet.jsx","../src/i18n/index.js","../src/index.js"],"sourcesContent":["/**\n * Wallet QBit SDK - API 客户端\n * QBit 钱包集成后端接口封装\n * \n * 使用 BaseApiClient 基类简化代码\n */\n\nimport { BaseApiClient } from '@quantabit/sdk-config';\n\n/**\n * QBit 钱包 API 客户端\n */\nexport class WalletQBitApiClient extends BaseApiClient {\n  constructor(config = {}) {\n    super('/wallet/quantabit', config);\n  }\n\n  // ============ 钱包初始化 ============\n\n  /**\n   * 初始化 QBit 钱包\n   * @param {Object} options - 初始化选项\n   */\n  async initWallet(options = {}) {\n    return this.post('/init', options);\n  }\n\n  /**\n   * 获取 QBit 钱包状态\n   */\n  async getWalletStatus() {\n    return this.get('/status');\n  }\n\n  /**\n   * 绑定 QBit 账户\n   * @param {Object} credentials - QBit 凭证\n   */\n  async bindAccount(credentials) {\n    return this.post('/bind', credentials);\n  }\n\n  /**\n   * 解绑 QBit 账户\n   */\n  async unbindAccount() {\n    return this.post('/unbind');\n  }\n\n  // ============ 资产查询 ============\n\n  /**\n   * 获取资产总览\n   */\n  async getPortfolio() {\n    return this.get('/portfolio');\n  }\n\n  /**\n   * 获取资产余额\n   * @param {string} assetId - 资产 ID\n   */\n  async getBalance(assetId) {\n    return this.get(`/balance/${assetId}`);\n  }\n\n  /**\n   * 获取所有余额\n   */\n  async getAllBalances() {\n    return this.get('/balances');\n  }\n\n  /**\n   * 获取资产价值历史\n   * @param {Object} params - 查询参数\n   */\n  async getValueHistory(params = {}) {\n    return this.get('/portfolio/history', params);\n  }\n\n  // ============ 投资操作 ============\n\n  /**\n   * 获取投资产品列表\n   * @param {Object} params - 查询参数\n   */\n  async getInvestProducts(params = {}) {\n    return this.get('/invest/products', params);\n  }\n\n  /**\n   * 获取产品详情\n   * @param {string} productId - 产品 ID\n   */\n  async getProduct(productId) {\n    return this.get(`/invest/products/${productId}`);\n  }\n\n  /**\n   * 申购产品\n   * @param {string} productId - 产品 ID\n   * @param {string} amount - 金额\n   */\n  async subscribe(productId, amount) {\n    return this.post(`/invest/products/${productId}/subscribe`, { amount });\n  }\n\n  /**\n   * 赎回产品\n   * @param {string} productId - 产品 ID\n   * @param {string} amount - 金额\n   */\n  async redeem(productId, amount) {\n    return this.post(`/invest/products/${productId}/redeem`, { amount });\n  }\n\n  /**\n   * 获取我的投资\n   */\n  async getMyInvestments() {\n    return this.get('/invest/my');\n  }\n\n  // ============ 交易操作 ============\n\n  /**\n   * 获取充值地址\n   * @param {string} assetId - 资产 ID\n   * @param {string} chain - 链类型\n   */\n  async getDepositAddress(assetId, chain) {\n    return this.get('/deposit/address', { asset_id: assetId, chain });\n  }\n\n  /**\n   * 提现\n   * @param {Object} withdrawData - 提现数据\n   */\n  async withdraw(withdrawData) {\n    return this.post('/withdraw', withdrawData);\n  }\n\n  /**\n   * 内部转账\n   * @param {Object} transferData - 转账数据\n   */\n  async internalTransfer(transferData) {\n    return this.post('/transfer/internal', transferData);\n  }\n\n  /**\n   * 获取交易历史\n   * @param {Object} params - 查询参数\n   */\n  async getTransactionHistory(params = {}) {\n    return this.get('/transactions', params);\n  }\n\n  /**\n   * 获取交易详情\n   * @param {string} txId - 交易 ID\n   */\n  async getTransaction(txId) {\n    return this.get(`/transactions/${txId}`);\n  }\n\n  // ============ 收益查询 ============\n\n  /**\n   * 获取收益统计\n   * @param {Object} params - 查询参数\n   */\n  async getEarnings(params = {}) {\n    return this.get('/earnings', params);\n  }\n\n  /**\n   * 获取收益明细\n   * @param {Object} params - 查询参数\n   */\n  async getEarningDetails(params = {}) {\n    return this.get('/earnings/details', params);\n  }\n\n  /**\n   * 获取 APY 信息\n   * @param {string} productId - 产品 ID\n   */\n  async getApy(productId) {\n    return this.get(`/invest/products/${productId}/apy`);\n  }\n\n  // ============ DeFi 操作 ============\n\n  /**\n   * 获取 DeFi 协议列表\n   */\n  async getDefiProtocols() {\n    return this.get('/defi/protocols');\n  }\n\n  /**\n   * 获取流动性池\n   * @param {Object} params - 查询参数\n   */\n  async getLiquidityPools(params = {}) {\n    return this.get('/defi/pools', params);\n  }\n\n  /**\n   * 添加流动性\n   * @param {Object} liquidityData - 流动性数据\n   */\n  async addLiquidity(liquidityData) {\n    return this.post('/defi/add-liquidity', liquidityData);\n  }\n\n  /**\n   * 移除流动性\n   * @param {Object} liquidityData - 流动性数据\n   */\n  async removeLiquidity(liquidityData) {\n    return this.post('/defi/remove-liquidity', liquidityData);\n  }\n\n  /**\n   * 质押\n   * @param {Object} stakeData - 质押数据\n   */\n  async stake(stakeData) {\n    return this.post('/defi/stake', stakeData);\n  }\n\n  /**\n   * 解除质押\n   * @param {Object} unstakeData - 解除质押数据\n   */\n  async unstake(unstakeData) {\n    return this.post('/defi/unstake', unstakeData);\n  }\n\n  // ============ 通知设置 ============\n\n  /**\n   * 获取通知设置\n   */\n  async getNotificationSettings() {\n    return this.get('/settings/notifications');\n  }\n\n  /**\n   * 更新通知设置\n   * @param {Object} settings - 通知设置\n   */\n  async updateNotificationSettings(settings) {\n    return this.put('/settings/notifications', settings);\n  }\n\n  /**\n   * 设置价格提醒\n   * @param {Object} alert - 提醒配置\n   */\n  async setPriceAlert(alert) {\n    return this.post('/alerts/price', alert);\n  }\n\n  /**\n   * 获取我的提醒\n   */\n  async getMyAlerts() {\n    return this.get('/alerts');\n  }\n}\n\n// 创建默认实例\nexport const walletQBitApi = new WalletQBitApiClient();\n\n\n\nexport default walletQBitApi;\n","/**\n * QBit Ecosystem - Generic Blockchain Actions & Cashier SDK\n * 统一链上存证与快捷收银高级 SDK 模块\n * \n * 动态 DOM 注入，零框架依赖，完美支持 React/Vue/Vanilla HTML 应用一键接入。\n */\n\nimport { getConfig, CHAIN_NETWORKS } from '@quantabit/sdk-config';\n\n// 默认主网与备用 RPC 节点池 (做最后的 Fallback)\nconst DEFAULT_RPC_NODES = [\n  'https://api.mainnet.qbitchain.io',\n  'https://api.testnet.qbitchain.io',\n];\n\n/**\n * QBit 全局生态配置中心\n */\nexport class QBitEcosystem {\n  static apiKey = '';\n  static environment = 'production';\n  static rpcNodes = [];\n  static activeNodeIndex = 0;\n\n  /**\n   * 初始化 SDK\n   * @param {Object} options \n   */\n  static init(options = {}) {\n    this.apiKey = options.apiKey || '';\n    this.environment = options.environment || 'production';\n    \n    // 初始化节点池，优先从 sdk-config 中读取当前激活网络\n    const nodes = [];\n    if (options.networkEndpoint) {\n      nodes.push(options.networkEndpoint);\n    }\n    try {\n      const config = getConfig();\n      if (config.chainEndpoint) {\n        nodes.push(config.chainEndpoint.replace(/\\/$/, ''));\n      }\n      if (config.apiFullUrl) {\n        nodes.push(config.apiFullUrl.replace(/\\/$/, ''));\n      }\n    } catch (e) {\n      // 捕获可能的环境加载异常\n    }\n    \n    // 注入默认 Fallback 节点\n    DEFAULT_RPC_NODES.forEach(node => nodes.push(node));\n    \n    // 节点池去重并过滤空值\n    this.rpcNodes = Array.from(new Set(nodes.filter(Boolean)));\n    this.activeNodeIndex = 0;\n    \n    console.log(`[QBit SDK] 初始化成功。环境: ${this.environment}, 节点池:`, this.rpcNodes);\n  }\n\n  /**\n   * 带自动故障漂移的 RPC 请求封装 (Failover RPC)\n   */\n  static async requestNode(path, options = {}, retries = 3) {\n    for (let i = 0; i < retries; i++) {\n      const activeNode = this.rpcNodes[this.activeNodeIndex];\n      const url = `${activeNode}${path}`;\n      try {\n        const res = await fetch(url, {\n          ...options,\n          headers: {\n            'Content-Type': 'application/json',\n            'X-QBit-ApiKey': this.apiKey,\n            ...(options.headers || {})\n          }\n        });\n        if (res.ok) {\n          return await res.json();\n        }\n        throw new Error(`RPC 响应失败 Status: ${res.status}`);\n      } catch (err) {\n        console.warn(`[QBit SDK] 节点请求失败: ${activeNode}。正在尝试自动故障漂移...`, err);\n        // 自动漂移到下一个节点\n        this.activeNodeIndex = (this.activeNodeIndex + 1) % this.rpcNodes.length;\n      }\n    }\n    throw new Error(`[QBit SDK] 所有 RPC 节点均不可达。`);\n  }\n}\n\n/**\n * 全局通知飘窗控制 (Toast Notification System)\n */\nexport class QBitToast {\n  static container = null;\n\n  static ensureContainer() {\n    if (this.container) return;\n    this.container = document.createElement('div');\n    this.container.className = 'qbit-toast-container';\n    Object.assign(this.container.style, {\n      position: 'fixed',\n      top: '1.5rem',\n      right: '1.5rem',\n      zIndex: '10000',\n      display: 'flex',\n      flexDirection: 'column',\n      gap: '0.75rem',\n      pointerEvents: 'none'\n    });\n    document.body.appendChild(this.container);\n  }\n\n  /**\n   * 弹出 Toast 消息\n   * @param {Object} options \n   * @returns {string} toastId\n   */\n  static show(options = {}) {\n    this.ensureContainer();\n    const id = 'toast_' + Math.random().toString(36).substring(2, 9);\n    const toast = document.createElement('div');\n    toast.id = id;\n    toast.className = `qbit-toast qbit-toast-${options.type || 'info'}`;\n    \n    // 设置毛玻璃风格与渐变\n    Object.assign(toast.style, {\n      padding: '0.875rem 1.25rem',\n      background: 'rgba(15, 23, 42, 0.85)',\n      backdropFilter: 'blur(12px)',\n      webkitBackdropFilter: 'blur(12px)',\n      borderLeft: `4px solid ${this.getColor(options.type)}`,\n      borderRadius: '0.5rem',\n      boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.3)',\n      color: '#ffffff',\n      fontSize: '0.875rem',\n      fontFamily: 'Inter, system-ui, sans-serif',\n      display: 'flex',\n      alignItems: 'center',\n      gap: '0.75rem',\n      pointerEvents: 'auto',\n      transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n      opacity: '0',\n      transform: 'translateY(-10px)'\n    });\n\n    const icon = this.getIcon(options.type);\n    const textNode = document.createElement('div');\n    textNode.style.flex = '1';\n    textNode.textContent = options.message;\n\n    toast.appendChild(icon);\n    toast.appendChild(textNode);\n\n    if (options.txHash) {\n      const link = document.createElement('a');\n      let explorerUrl = 'https://explorer.mg.qbitchain.io';\n      try {\n        const config = getConfig();\n        const network = config.chainNetwork || 'mainnet';\n        const netConfig = CHAIN_NETWORKS[network];\n        if (netConfig && netConfig.explorerUrl) {\n          explorerUrl = netConfig.explorerUrl;\n        }\n      } catch (e) {\n        if (QBitEcosystem.environment !== 'production') {\n          explorerUrl = 'https://explorer.devnet.qbitchain.io';\n        }\n      }\n      link.href = `${explorerUrl.replace(/\\/$/, '')}/tx/${options.txHash}`;\n      link.target = '_blank';\n      link.textContent = '🔗 链上查看';\n      Object.assign(link.style, {\n        color: '#3b82f6',\n        textDecoration: 'none',\n        fontSize: '0.75rem',\n        fontWeight: 'bold',\n        marginLeft: '0.5rem'\n      });\n      toast.appendChild(link);\n    }\n\n    this.container.appendChild(toast);\n    \n    // 渐显动画\n    setTimeout(() => {\n      toast.style.opacity = '1';\n      toast.style.transform = 'translateY(0)';\n    }, 50);\n\n    // 自动销毁时间\n    if (options.duration !== 0 && options.type !== 'pending') {\n      setTimeout(() => {\n        this.dismiss(id);\n      }, options.duration || 3000);\n    }\n\n    return id;\n  }\n\n  static update(id, options = {}) {\n    const toast = document.getElementById(id);\n    if (!toast) return;\n    const textNode = toast.querySelector('div');\n    if (textNode && options.message) {\n      textNode.textContent = options.message;\n    }\n    if (options.type) {\n      toast.className = `qbit-toast qbit-toast-${options.type}`;\n      toast.style.borderLeft = `4px solid ${this.getColor(options.type)}`;\n    }\n  }\n\n  static dismiss(id) {\n    const toast = document.getElementById(id);\n    if (!toast) return;\n    toast.style.opacity = '0';\n    toast.style.transform = 'translateY(-10px)';\n    setTimeout(() => {\n      if (toast.parentNode) {\n        toast.parentNode.removeChild(toast);\n      }\n    }, 300);\n  }\n\n  static getColor(type) {\n    switch (type) {\n      case 'success': return '#10b981'; // 翠绿\n      case 'warning': return '#f59e0b'; // 珊瑚橙\n      case 'error': return '#ef4444';   // 宝石红\n      case 'pending': return '#3b82f6'; // 宝石蓝\n      default: return '#6b7280';\n    }\n  }\n\n  static getIcon(type) {\n    const el = document.createElement('span');\n    el.style.fontSize = '1.125rem';\n    switch (type) {\n      case 'success': el.textContent = '✅'; break;\n      case 'warning': el.textContent = '⚠️'; break;\n      case 'error': el.textContent = '❌'; break;\n      case 'pending':\n        el.textContent = '⚙️';\n        el.style.display = 'inline-block';\n        el.style.animation = 'qbit-spin 1.5s linear infinite';\n        break;\n      default: el.textContent = 'ℹ️'; break;\n    }\n    return el;\n  }\n}\n\n// 动态载入 CSS 关键帧动画\nif (typeof document !== 'undefined') {\n  const style = document.createElement('style');\n  style.innerHTML = `\n    @keyframes qbit-spin {\n      from { transform: rotate(0deg); }\n      to { transform: rotate(360deg); }\n    }\n    @keyframes qbit-shake {\n      0%, 100% { transform: translateX(0); }\n      20%, 60% { transform: translateX(-6px); }\n      40%, 80% { transform: translateX(6px); }\n    }\n    .qbit-shake-active {\n      animation: qbit-shake 0.4s ease-in-out;\n    }\n  `;\n  document.head.appendChild(style);\n}\n\n/**\n * QBit 统一收银台 (Ecosystem Cashier UI overlay)\n */\nexport class QBitCashier {\n  static activeOverlay = null;\n\n  /**\n   * 一键拉起生态统一收银台\n   * @param {Object} options \n   */\n  static open(options = {}) {\n    if (this.activeOverlay) {\n      this.close();\n    }\n\n    const overlay = document.createElement('div');\n    overlay.className = 'qbit-sdk-overlay';\n    Object.assign(overlay.style, {\n      position: 'fixed',\n      inset: '0',\n      background: 'rgba(15, 23, 42, 0.65)',\n      backdropFilter: 'blur(16px)',\n      webkitBackdropFilter: 'blur(16px)',\n      zIndex: '9999',\n      display: 'flex',\n      alignItems: 'center',\n      justifyContent: 'center',\n      fontFamily: 'Inter, system-ui, sans-serif'\n    });\n\n    const modal = document.createElement('div');\n    modal.className = 'qbit-sdk-modal';\n    Object.assign(modal.style, {\n      background: 'rgba(30, 41, 59, 0.85)',\n      border: '1px solid rgba(255, 255, 255, 0.1)',\n      borderRadius: '1.25rem',\n      padding: '2rem',\n      width: '100%',\n      maxWidth: '420px',\n      color: '#f8fafc',\n      boxShadow: '0 25px 50px -12px rgba(0, 0, 0, 0.4)'\n    });\n\n    // 订单信息标题\n    modal.innerHTML = `\n      <div style=\"display:flex; justify-content:space-between; align-items:center; margin-bottom:1.5rem;\">\n        <h3 style=\"margin:0; font-size:1.25rem; font-weight:700;\">QBit 统一收银台</h3>\n        <button id=\"qbit-cashier-close\" style=\"background:none; border:none; color:#94a3b8; cursor:pointer; font-size:1.25rem;\">✕</button>\n      </div>\n      <div style=\"background:rgba(255,255,255,0.05); padding:1rem; border-radius:0.75rem; margin-bottom:1.5rem;\">\n        <div style=\"font-size:0.75rem; color:#94a3b8; margin-bottom:0.25rem;\">支付金额</div>\n        <div style=\"font-size:2rem; font-weight:800; color:#3b82f6;\">${options.amount} QBIT</div>\n        <div style=\"font-size:0.875rem; margin-top:0.5rem; border-top:1px solid rgba(255,255,255,0.05); padding-top:0.5rem; color:#e2e8f0;\">\n          ${options.goodsName}\n        </div>\n      </div>\n      \n      <div style=\"margin-bottom:1.5rem;\">\n        <label style=\"display:block; font-size:0.75rem; color:#94a3b8; margin-bottom:0.5rem;\">请输入6位快捷支付密码 (云端托管钱包)</label>\n        <div id=\"qbit-pin-wrapper\" style=\"display:flex; gap:0.5rem; justify-content:space-between; margin-bottom:0.75rem;\">\n          <input type=\"password\" maxlength=\"1\" class=\"qbit-pin-input\" style=\"width:3rem; height:3.5rem; text-align:center; font-size:1.5rem; border-radius:0.5rem; border:1px solid rgba(255,255,255,0.15); background:rgba(15,23,42,0.5); color:white; outline:none;\" />\n          <input type=\"password\" maxlength=\"1\" class=\"qbit-pin-input\" style=\"width:3rem; height:3.5rem; text-align:center; font-size:1.5rem; border-radius:0.5rem; border:1px solid rgba(255,255,255,0.15); background:rgba(15,23,42,0.5); color:white; outline:none;\" />\n          <input type=\"password\" maxlength=\"1\" class=\"qbit-pin-input\" style=\"width:3rem; height:3.5rem; text-align:center; font-size:1.5rem; border-radius:0.5rem; border:1px solid rgba(255,255,255,0.15); background:rgba(15,23,42,0.5); color:white; outline:none;\" />\n          <input type=\"password\" maxlength=\"1\" class=\"qbit-pin-input\" style=\"width:3rem; height:3.5rem; text-align:center; font-size:1.5rem; border-radius:0.5rem; border:1px solid rgba(255,255,255,0.15); background:rgba(15,23,42,0.5); color:white; outline:none;\" />\n          <input type=\"password\" maxlength=\"1\" class=\"qbit-pin-input\" style=\"width:3rem; height:3.5rem; text-align:center; font-size:1.5rem; border-radius:0.5rem; border:1px solid rgba(255,255,255,0.15); background:rgba(15,23,42,0.5); color:white; outline:none;\" />\n          <input type=\"password\" maxlength=\"1\" class=\"qbit-pin-input\" style=\"width:3rem; height:3.5rem; text-align:center; font-size:1.5rem; border-radius:0.5rem; border:1px solid rgba(255,255,255,0.15); background:rgba(15,23,42,0.5); color:white; outline:none;\" />\n        </div>\n      </div>\n      \n      <button id=\"qbit-pay-btn\" style=\"width:100%; height:3rem; border:none; border-radius:0.75rem; background:linear-gradient(135deg, #3b82f6 0%, #8b5cf6 100%); color:white; font-size:1rem; font-weight:700; cursor:pointer; transition: opacity 0.2s; display:flex; align-items:center; justify-content:center; gap:0.5rem;\">\n        确认支付\n      </button>\n    `;\n\n    overlay.appendChild(modal);\n    document.body.appendChild(overlay);\n    this.activeOverlay = overlay;\n\n    // PIN 输入框聚焦与一键清空联动逻辑 (RULE[user_global] 6.2)\n    const inputs = modal.querySelectorAll('.qbit-pin-input');\n    const pinWrapper = modal.querySelector('#qbit-pin-wrapper');\n    const payBtn = modal.querySelector('#qbit-pay-btn');\n\n    inputs.forEach((input, index) => {\n      // 获得焦点时全选清空，遵守清空规则\n      input.addEventListener('focus', () => {\n        input.value = '';\n      });\n\n      // 输入联动\n      input.addEventListener('input', (e) => {\n        if (input.value.length === 1 && index < inputs.length - 1) {\n          inputs[index + 1].focus();\n        }\n      });\n\n      // 键盘删除键退格\n      input.addEventListener('keydown', (e) => {\n        if (e.key === 'Backspace' && input.value === '' && index > 0) {\n          inputs[index - 1].focus();\n        }\n      });\n    });\n\n    // 首次自动聚焦第一个输入框\n    setTimeout(() => {\n      if (inputs[0]) inputs[0].focus();\n    }, 100);\n\n    // 关闭回调\n    modal.querySelector('#qbit-cashier-close').addEventListener('click', () => {\n      this.close();\n      if (options.onCancel) options.onCancel();\n    });\n\n    // 支付提交 (带阻尼特效)\n    payBtn.addEventListener('click', async () => {\n      const pin = Array.from(inputs).map(i => i.value).join('');\n      if (pin.length < 6) {\n        // 密码位数不足，晃动特效并一键清空\n        pinWrapper.classList.add('qbit-shake-active');\n        inputs.forEach(i => i.value = '');\n        inputs[0].focus();\n        setTimeout(() => pinWrapper.classList.remove('qbit-shake-active'), 400);\n        return;\n      }\n\n      // 开启阻尼防抖：禁用交互，防止多次支付请求\n      payBtn.disabled = true;\n      payBtn.style.pointerEvents = 'none';\n      payBtn.style.opacity = '0.6';\n      payBtn.textContent = '正在签署交易...';\n\n      try {\n        // 请求托管签名与扣款\n        const receipt = await QBitEcosystem.requestNode('/wallet/quantabit/pay-custody', {\n          method: 'POST',\n          body: JSON.stringify({\n            amount: options.amount,\n            payee: options.payeeAddress,\n            order_id: options.orderId,\n            pin: pin\n          })\n        });\n\n        this.close();\n        if (options.onSuccess) {\n          options.onSuccess({\n            success: true,\n            txHash: receipt.tx_hash,\n            payee: options.payeeAddress,\n            amount: options.amount,\n            timestamp: Date.now()\n          });\n        }\n      } catch (err) {\n        // 解除阻尼，重新让用户操作，并一键清空刚才输错的密码\n        payBtn.disabled = false;\n        payBtn.style.pointerEvents = 'auto';\n        payBtn.style.opacity = '1';\n        payBtn.textContent = '确认支付';\n        \n        // 震动警示并清空\n        pinWrapper.classList.add('qbit-shake-active');\n        inputs.forEach(i => i.value = '');\n        inputs[0].focus();\n        setTimeout(() => pinWrapper.classList.remove('qbit-shake-active'), 400);\n\n        QBitToast.show({ message: `支付失败: ${err.message || '网络或密码异常'}`, type: 'error' });\n        if (options.onError) options.onError(err.message);\n      }\n    });\n  }\n\n  static close() {\n    if (this.activeOverlay && this.activeOverlay.parentNode) {\n      this.activeOverlay.parentNode.removeChild(this.activeOverlay);\n      this.activeOverlay = null;\n    }\n  }\n}\n\n/**\n * 链上存证高级操作器 (QBit Actions Layer)\n */\nexport class QBitActions {\n  /**\n   * 自动探测可用签名通道并调起存证广播\n   * @param {AnchorOptions} options \n   */\n  static async anchorResource(options = {}) {\n    const toastId = QBitToast.show({ message: `准备对 ${options.title || '资源'} 进行链上作者权存证...`, type: 'pending' });\n\n    try {\n      // 1. 发起存证请求到后端分配区块打包资源\n      const response = await QBitEcosystem.requestNode('/wallet/quantabit/anchor', {\n        method: 'POST',\n        body: JSON.stringify({\n          namespace: options.namespace,\n          resource_id: options.resourceId,\n          author_did: options.authorDid,\n          content_hash: options.contentHash,\n          fee_mode: options.feeMode || 'user_pay'\n        })\n      });\n\n      QBitToast.update(toastId, {\n        message: '存证哈希签名确认中...',\n        type: 'pending'\n      });\n\n      // 2. 模拟链上最终确认轮询 (2秒)\n      await new Promise(resolve => setTimeout(resolve, 2000));\n\n      QBitToast.update(toastId, {\n        message: '🎉 存证成功锁定，区块打包完成！',\n        type: 'success',\n        txHash: response.tx_hash\n      });\n\n      return {\n        success: true,\n        txHash: response.tx_hash,\n        blockNumber: response.block_number\n      };\n    } catch (err) {\n      QBitToast.update(toastId, {\n        message: `链上存证失败: ${err.message}`,\n        type: 'error'\n      });\n      return {\n        success: false,\n        error: err.message\n      };\n    }\n  }\n\n  /**\n   * 转账与代币支付快捷通道\n   * @param {PaymentOptions} options \n   */\n  static async requestPayment(options = {}) {\n    return new Promise((resolve) => {\n      QBitCashier.open({\n        orderId: options.memo || `pay_${Date.now()}`,\n        amount: options.amount,\n        goodsName: options.title,\n        payeeAddress: options.toAddress,\n        onSuccess: (receipt) => resolve(receipt),\n        onCancel: () => resolve({ success: false, error: '用户取消支付' }),\n        onError: (err) => resolve({ success: false, error: err })\n      });\n    });\n  }\n}\n\n/**\n * 链上回执异步校验工具\n */\nexport class QBitVerify {\n  /**\n   * 直连 QBit 链验证存证内容哈希真实性\n   */\n  static async verifyMemo(txHash, expectedNamespace, expectedHash) {\n    try {\n      // 请求 RPC 节点获取交易体内的 Memo 数据\n      const txData = await QBitEcosystem.requestNode(`/wallet/quantabit/transactions/${txHash}`);\n      \n      if (!txData) {\n        return { isConfirmed: false, isValid: false, confirmations: 0 };\n      }\n\n      // 核对 Namespace 及原始内容哈希摘要是否完全相符\n      const blockchainMemo = txData.memo || '';\n      const expectedMemoString = `${expectedNamespace}:${expectedHash}`;\n      const isValid = blockchainMemo.trim() === expectedMemoString.trim();\n\n      return {\n        isConfirmed: txData.confirmations >= 1,\n        isValid: isValid,\n        signer: txData.signer || 'unknown',\n        timestamp: txData.timestamp || Date.now(),\n        confirmations: txData.confirmations || 1\n      };\n    } catch (e) {\n      console.error('[QBit SDK] 异步校验链哈希失败:', e);\n      return { isConfirmed: false, isValid: false, confirmations: 0 };\n    }\n  }\n}\n","/**\n * Wallet QBit SDK - React Hooks\n * QBit 钱包功能的 React Hooks\n */\n\nimport { useState, useCallback, useEffect } from 'react';\nimport { walletQBitApi } from '../services/walletQBitApi';\n\n/**\n * 使用 QBit 钱包功能\n */\nexport function useWalletQBit() {\n  const [portfolio, setPortfolio] = useState(null);\n  const [balances, setBalances] = useState([]);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState(null);\n\n  // 获取资产组合\n  const fetchPortfolio = useCallback(async () => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await walletQBitApi.getPortfolio();\n      setPortfolio(result.data);\n      return result;\n    } catch (err) {\n      setError(err.message);\n      throw err;\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  // 获取所有余额\n  const fetchBalances = useCallback(async () => {\n    try {\n      const result = await walletQBitApi.getAllBalances();\n      setBalances(result.data || []);\n      return result;\n    } catch (err) {\n      setError(err.message);\n      throw err;\n    }\n  }, []);\n\n  // 获取充值地址\n  const getDepositAddress = useCallback(async (assetId, chain) => {\n    try {\n      const result = await walletQBitApi.getDepositAddress(assetId, chain);\n      return result.data?.address;\n    } catch (err) {\n      setError(err.message);\n      throw err;\n    }\n  }, []);\n\n  // 提现\n  const withdraw = useCallback(async (withdrawData) => {\n    setLoading(true);\n    try {\n      const result = await walletQBitApi.withdraw(withdrawData);\n      await fetchBalances();\n      return result;\n    } catch (err) {\n      setError(err.message);\n      throw err;\n    } finally {\n      setLoading(false);\n    }\n  }, [fetchBalances]);\n\n  useEffect(() => {\n    fetchPortfolio();\n    fetchBalances();\n  }, [fetchPortfolio, fetchBalances]);\n\n  return {\n    portfolio,\n    balances,\n    loading,\n    error,\n    totalValue: portfolio?.total_value || 0,\n    fetchPortfolio,\n    fetchBalances,\n    getDepositAddress,\n    withdraw,\n  };\n}\n\n/**\n * 使用投资产品功能\n */\nexport function useInvestProducts() {\n  const [products, setProducts] = useState([]);\n  const [myInvestments, setMyInvestments] = useState([]);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState(null);\n\n  // 获取投资产品\n  const fetchProducts = useCallback(async (params = {}) => {\n    setLoading(true);\n    try {\n      const result = await walletQBitApi.getInvestProducts(params);\n      setProducts(result.data || []);\n      return result;\n    } catch (err) {\n      setError(err.message);\n      throw err;\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  // 获取我的投资\n  const fetchMyInvestments = useCallback(async () => {\n    try {\n      const result = await walletQBitApi.getMyInvestments();\n      setMyInvestments(result.data || []);\n      return result;\n    } catch (err) {\n      setError(err.message);\n      throw err;\n    }\n  }, []);\n\n  // 申购\n  const subscribe = useCallback(async (productId, amount) => {\n    setLoading(true);\n    try {\n      const result = await walletQBitApi.subscribe(productId, amount);\n      await fetchMyInvestments();\n      return result;\n    } catch (err) {\n      setError(err.message);\n      throw err;\n    } finally {\n      setLoading(false);\n    }\n  }, [fetchMyInvestments]);\n\n  // 赎回\n  const redeem = useCallback(async (productId, amount) => {\n    setLoading(true);\n    try {\n      const result = await walletQBitApi.redeem(productId, amount);\n      await fetchMyInvestments();\n      return result;\n    } catch (err) {\n      setError(err.message);\n      throw err;\n    } finally {\n      setLoading(false);\n    }\n  }, [fetchMyInvestments]);\n\n  useEffect(() => {\n    fetchProducts();\n    fetchMyInvestments();\n  }, [fetchProducts, fetchMyInvestments]);\n\n  return {\n    products,\n    myInvestments,\n    loading,\n    error,\n    fetchProducts,\n    fetchMyInvestments,\n    subscribe,\n    redeem,\n  };\n}\n\n","/**\n * useQBitChain — 链上直连交互 React Hook\n * \n * 提供直接与 QBit Chain 交互的 React Hook，\n * 不走后端 API，直接通过 qbit-chain-sdk 与 RPC 节点通信。\n * \n * 适用场景：\n * - DApp 前端直连链查询\n * - 钱包插件链上余额/交易显示\n * - 链状态监控面板\n * \n * @example\n * function ChainDashboard() {\n *   const { chainStatus, balance, loading } = useQBitChain({\n *     address: myAddress,\n *     network: 'mainnet',\n *   });\n *   return <div>Balance: {balance?.qbt} QBT</div>;\n * }\n */\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\n\nfunction extractTransactionHash(result) {\n    if (!result) return null;\n    if (typeof result === 'string') return result;\n    return result.txHash || result.tx_hash || result.signature || result.hash || null;\n}\n\n/**\n * QBit Chain 直连交互 Hook\n * \n * @param {Object} options\n * @param {string} options.address - 查询地址（可选，传入后自动查余额和 Token）\n * @param {string} options.network - 网络 ('mainnet' | 'devnet')\n * @param {string} options.endpoint - 自定义 RPC 端点\n * @param {boolean} options.autoRefresh - 是否自动刷新（默认 false）\n * @param {number} options.refreshInterval - 刷新间隔（默认 30000ms）\n */\nexport function useQBitChain(options = {}) {\n    const {\n        address,\n        network = 'mainnet',\n        endpoint,\n        autoRefresh = false,\n        refreshInterval = 30000,\n    } = options;\n\n    // 状态\n    const [chainStatus, setChainStatus] = useState(null);\n    const [balance, setBalance] = useState(null);\n    const [tokenAccounts, setTokenAccounts] = useState([]);\n    const [validators, setValidators] = useState(null);\n    const [loading, setLoading] = useState(false);\n    const [error, setError] = useState(null);\n    const [connected, setConnected] = useState(false);\n\n    // SDK 引用（延迟加载）\n    const sdkRef = useRef(null);\n    const connRef = useRef(null);\n    const connectionKeyRef = useRef(null);\n    const subRef = useRef(null);\n\n    /**\n     * 延迟加载 chain SDK\n     */\n    const ensureSdk = useCallback(async () => {\n        const nextConnectionKey = JSON.stringify({ network, endpoint: endpoint || '' });\n        if (sdkRef.current && connRef.current && connectionKeyRef.current === nextConnectionKey) {\n            return;\n        }\n\n        try {\n            const sdk = sdkRef.current || await import('@quantabit/qbit-chain-sdk');\n            sdkRef.current = sdk;\n            if (subRef.current?.destroy) {\n                subRef.current.destroy();\n                subRef.current = null;\n            }\n            if (connRef.current?.destroy) {\n                connRef.current.destroy();\n            }\n            setConnected(false);\n            connRef.current = new sdk.QBitConnection({\n                network,\n                endpoint,\n                onConnect: () => setConnected(true),\n                onDisconnect: () => setConnected(false),\n            });\n            connectionKeyRef.current = nextConnectionKey;\n        } catch (err) {\n            throw new Error(`需要安装 @quantabit/qbit-chain-sdk: ${err.message}`);\n        }\n    }, [network, endpoint]);\n\n    /**\n     * 获取链状态\n     */\n    const fetchChainStatus = useCallback(async () => {\n        setLoading(true);\n        setError(null);\n        try {\n            await ensureSdk();\n            const status = await sdkRef.current.getChainStatus(connRef.current);\n            setChainStatus(status);\n            return status;\n        } catch (err) {\n            setError(err.message);\n            return null;\n        } finally {\n            setLoading(false);\n        }\n    }, [ensureSdk]);\n\n    /**\n     * 获取余额\n     */\n    const fetchBalance = useCallback(async (addr) => {\n        const targetAddr = addr || address;\n        if (!targetAddr) return null;\n\n        try {\n            await ensureSdk();\n            const result = await sdkRef.current.getBalance(targetAddr, connRef.current);\n            setBalance(result);\n            return result;\n        } catch (err) {\n            setError(err.message);\n            return null;\n        }\n    }, [address, ensureSdk]);\n\n    /**\n     * 获取 Token 持仓\n     */\n    const fetchTokenAccounts = useCallback(async (addr) => {\n        const targetAddr = addr || address;\n        if (!targetAddr) return [];\n\n        try {\n            await ensureSdk();\n            const result = await sdkRef.current.getTokenAccounts(targetAddr, connRef.current);\n            setTokenAccounts(result);\n            return result;\n        } catch (err) {\n            setError(err.message);\n            return [];\n        }\n    }, [address, ensureSdk]);\n\n    /**\n     * 获取验证者列表\n     */\n    const fetchValidators = useCallback(async () => {\n        try {\n            await ensureSdk();\n            const result = await sdkRef.current.getValidators(connRef.current);\n            setValidators(result);\n            return result;\n        } catch (err) {\n            setError(err.message);\n            return null;\n        }\n    }, [ensureSdk]);\n\n    /**\n     * 获取交易历史\n     */\n    const fetchTransactionHistory = useCallback(async (addr, opts = {}) => {\n        const targetAddr = addr || address;\n        if (!targetAddr) return [];\n\n        try {\n            await ensureSdk();\n            return await sdkRef.current.getTransactionHistory(targetAddr, opts, connRef.current);\n        } catch (err) {\n            setError(err.message);\n            return [];\n        }\n    }, [address, ensureSdk]);\n\n    /**\n     * 网络验证\n     */\n    const validateNetwork = useCallback(async () => {\n        try {\n            await ensureSdk();\n            return await sdkRef.current.validateNetwork(connRef.current);\n        } catch (err) {\n            setError(err.message);\n            return { valid: false, error: err.message };\n        }\n    }, [ensureSdk]);\n\n    /**\n     * 请求空投（仅 devnet / localnet）\n     * 成功后自动刷新余额。\n     */\n    const requestAirdrop = useCallback(async (amountQBT, addr) => {\n        const targetAddr = addr || address;\n        if (!targetAddr) {\n            throw new Error('Missing address for airdrop');\n        }\n        try {\n            await ensureSdk();\n            const signature = await sdkRef.current.requestAirdrop(targetAddr, amountQBT, connRef.current);\n            // 异步刷新余额（不阻塞返回）\n            fetchBalance(targetAddr).catch(() => {});\n            return signature;\n        } catch (err) {\n            setError(err.message);\n            throw err;\n        }\n    }, [address, ensureSdk, fetchBalance]);\n\n    /**\n     * 实时订阅余额变动，自动更新 balance 状态。\n     * @param {string} addr - 监听地址（默认 options.address）\n     * @returns {Promise<Function>} 取消订阅函数\n     */\n    const subscribeBalance = useCallback(async (addr) => {\n        const targetAddr = addr || address;\n        if (!targetAddr) {\n            throw new Error('Missing address for balance subscription');\n        }\n        try {\n            await ensureSdk();\n            if (!subRef.current) {\n                subRef.current = new sdkRef.current.QBitSubscription(connRef.current);\n            }\n            const id = subRef.current.onAccountChange(targetAddr, (info) => {\n                setBalance({ lamports: info.lamports, qbt: info.lamports / 1_000_000_000 });\n            });\n            return () => {\n                if (subRef.current) subRef.current.unsubscribe(id);\n            };\n        } catch (err) {\n            setError(err.message);\n            throw err;\n        }\n    }, [address, ensureSdk]);\n\n    /**\n     * 构建 Memo 交易（不签名、不发送）\n     * 适用于 DID/凭证/NFT 等业务 SDK 需要把哈希锚定到 QBit 主网的场景。\n     */\n    const buildMemoTransaction = useCallback(async (memo, opts = {}) => {\n        const payerAddress = opts.address || address;\n        if (!payerAddress) {\n            throw new Error('Missing payer address');\n        }\n\n        try {\n            await ensureSdk();\n            const txBuilder = new sdkRef.current.QBitTransaction(connRef.current);\n            txBuilder.addMemo(memo);\n            if (opts.priorityFee) {\n                txBuilder.setPriorityFee(opts.priorityFee);\n            }\n            return await txBuilder.build(payerAddress);\n        } catch (err) {\n            setError(err.message);\n            throw err;\n        }\n    }, [address, ensureSdk]);\n\n    /**\n     * 使用浏览器钱包签名并发送 Memo 交易\n     */\n    const sendMemoWithWallet = useCallback(async (provider, memo, opts = {}) => {\n        if (!provider) {\n            throw new Error('Missing QBit wallet provider');\n        }\n\n        const payerAddress =\n            opts.address ||\n            address ||\n            provider.publicKey?.toBase58?.() ||\n            provider.publicKey?.toString?.();\n\n        if (!payerAddress) {\n            throw new Error('Missing wallet address');\n        }\n\n        try {\n            await ensureSdk();\n            const transaction = await buildMemoTransaction(memo, {\n                ...opts,\n                address: payerAddress,\n            });\n\n            if (typeof provider.signAndSendTransaction === 'function') {\n                const result = await provider.signAndSendTransaction(transaction, {\n                    skipPreflight: opts.skipPreflight || false,\n                    preflightCommitment: opts.preflightCommitment || 'confirmed',\n                });\n                return {\n                    txHash: extractTransactionHash(result),\n                    memo,\n                    raw: result,\n                };\n            }\n\n            if (typeof provider.signTransaction !== 'function') {\n                throw new Error('Current wallet does not support signTransaction/signAndSendTransaction');\n            }\n\n            const signedTransaction = await provider.signTransaction(transaction);\n            const txHash = await connRef.current.sendTransaction(signedTransaction, {\n                skipPreflight: opts.skipPreflight || false,\n                preflightCommitment: opts.preflightCommitment || 'confirmed',\n            });\n\n            return {\n                txHash,\n                memo,\n                raw: signedTransaction,\n            };\n        } catch (err) {\n            setError(err.message);\n            throw err;\n        }\n    }, [address, buildMemoTransaction, ensureSdk]);\n\n    /**\n     * 刷新全部数据\n     */\n    const refresh = useCallback(async () => {\n        setLoading(true);\n        setError(null);\n        try {\n            await Promise.all([\n                fetchChainStatus(),\n                address ? fetchBalance() : Promise.resolve(),\n                address ? fetchTokenAccounts() : Promise.resolve(),\n            ]);\n        } finally {\n            setLoading(false);\n        }\n    }, [fetchChainStatus, fetchBalance, fetchTokenAccounts, address]);\n\n    // 初始化\n    useEffect(() => {\n        refresh();\n    }, [refresh]);\n\n    // 自动刷新\n    useEffect(() => {\n        if (!autoRefresh) return;\n\n        const timer = setInterval(() => {\n            refresh();\n        }, refreshInterval);\n\n        return () => clearInterval(timer);\n    }, [autoRefresh, refreshInterval, refresh]);\n\n    // 清理\n    useEffect(() => {\n        return () => {\n            if (subRef.current?.destroy) {\n                subRef.current.destroy();\n                subRef.current = null;\n            }\n            if (connRef.current?.destroy) {\n                connRef.current.destroy();\n                connRef.current = null;\n                connectionKeyRef.current = null;\n            }\n        };\n    }, []);\n\n    return {\n        // 状态\n        chainStatus,\n        balance,\n        tokenAccounts,\n        validators,\n        loading,\n        error,\n        connected,\n\n        // 操作\n        fetchChainStatus,\n        fetchBalance,\n        fetchTokenAccounts,\n        fetchValidators,\n        fetchTransactionHistory,\n        validateNetwork,\n        requestAirdrop,\n        subscribeBalance,\n        buildMemoTransaction,\n        sendMemoWithWallet,\n        refresh,\n\n        // 工具\n        get connection() { return connRef.current; },\n        get sdk() { return sdkRef.current; },\n    };\n}\n","/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n  REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n  var key = null;\n  void 0 !== maybeKey && (key = \"\" + maybeKey);\n  void 0 !== config.key && (key = \"\" + config.key);\n  if (\"key\" in config) {\n    maybeKey = {};\n    for (var propName in config)\n      \"key\" !== propName && (maybeKey[propName] = config[propName]);\n  } else maybeKey = config;\n  config = maybeKey.ref;\n  return {\n    $$typeof: REACT_ELEMENT_TYPE,\n    type: type,\n    key: key,\n    ref: void 0 !== config ? config : null,\n    props: maybeKey\n  };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n  (function () {\n    function getComponentNameFromType(type) {\n      if (null == type) return null;\n      if (\"function\" === typeof type)\n        return type.$$typeof === REACT_CLIENT_REFERENCE\n          ? null\n          : type.displayName || type.name || null;\n      if (\"string\" === typeof type) return type;\n      switch (type) {\n        case REACT_FRAGMENT_TYPE:\n          return \"Fragment\";\n        case REACT_PROFILER_TYPE:\n          return \"Profiler\";\n        case REACT_STRICT_MODE_TYPE:\n          return \"StrictMode\";\n        case REACT_SUSPENSE_TYPE:\n          return \"Suspense\";\n        case REACT_SUSPENSE_LIST_TYPE:\n          return \"SuspenseList\";\n        case REACT_ACTIVITY_TYPE:\n          return \"Activity\";\n      }\n      if (\"object\" === typeof type)\n        switch (\n          (\"number\" === typeof type.tag &&\n            console.error(\n              \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n            ),\n          type.$$typeof)\n        ) {\n          case REACT_PORTAL_TYPE:\n            return \"Portal\";\n          case REACT_CONTEXT_TYPE:\n            return type.displayName || \"Context\";\n          case REACT_CONSUMER_TYPE:\n            return (type._context.displayName || \"Context\") + \".Consumer\";\n          case REACT_FORWARD_REF_TYPE:\n            var innerType = type.render;\n            type = type.displayName;\n            type ||\n              ((type = innerType.displayName || innerType.name || \"\"),\n              (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n            return type;\n          case REACT_MEMO_TYPE:\n            return (\n              (innerType = type.displayName || null),\n              null !== innerType\n                ? innerType\n                : getComponentNameFromType(type.type) || \"Memo\"\n            );\n          case REACT_LAZY_TYPE:\n            innerType = type._payload;\n            type = type._init;\n            try {\n              return getComponentNameFromType(type(innerType));\n            } catch (x) {}\n        }\n      return null;\n    }\n    function testStringCoercion(value) {\n      return \"\" + value;\n    }\n    function checkKeyStringCoercion(value) {\n      try {\n        testStringCoercion(value);\n        var JSCompiler_inline_result = !1;\n      } catch (e) {\n        JSCompiler_inline_result = !0;\n      }\n      if (JSCompiler_inline_result) {\n        JSCompiler_inline_result = console;\n        var JSCompiler_temp_const = JSCompiler_inline_result.error;\n        var JSCompiler_inline_result$jscomp$0 =\n          (\"function\" === typeof Symbol &&\n            Symbol.toStringTag &&\n            value[Symbol.toStringTag]) ||\n          value.constructor.name ||\n          \"Object\";\n        JSCompiler_temp_const.call(\n          JSCompiler_inline_result,\n          \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n          JSCompiler_inline_result$jscomp$0\n        );\n        return testStringCoercion(value);\n      }\n    }\n    function getTaskName(type) {\n      if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n      if (\n        \"object\" === typeof type &&\n        null !== type &&\n        type.$$typeof === REACT_LAZY_TYPE\n      )\n        return \"<...>\";\n      try {\n        var name = getComponentNameFromType(type);\n        return name ? \"<\" + name + \">\" : \"<...>\";\n      } catch (x) {\n        return \"<...>\";\n      }\n    }\n    function getOwner() {\n      var dispatcher = ReactSharedInternals.A;\n      return null === dispatcher ? null : dispatcher.getOwner();\n    }\n    function UnknownOwner() {\n      return Error(\"react-stack-top-frame\");\n    }\n    function hasValidKey(config) {\n      if (hasOwnProperty.call(config, \"key\")) {\n        var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n        if (getter && getter.isReactWarning) return !1;\n      }\n      return void 0 !== config.key;\n    }\n    function defineKeyPropWarningGetter(props, displayName) {\n      function warnAboutAccessingKey() {\n        specialPropKeyWarningShown ||\n          ((specialPropKeyWarningShown = !0),\n          console.error(\n            \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n            displayName\n          ));\n      }\n      warnAboutAccessingKey.isReactWarning = !0;\n      Object.defineProperty(props, \"key\", {\n        get: warnAboutAccessingKey,\n        configurable: !0\n      });\n    }\n    function elementRefGetterWithDeprecationWarning() {\n      var componentName = getComponentNameFromType(this.type);\n      didWarnAboutElementRef[componentName] ||\n        ((didWarnAboutElementRef[componentName] = !0),\n        console.error(\n          \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n        ));\n      componentName = this.props.ref;\n      return void 0 !== componentName ? componentName : null;\n    }\n    function ReactElement(type, key, props, owner, debugStack, debugTask) {\n      var refProp = props.ref;\n      type = {\n        $$typeof: REACT_ELEMENT_TYPE,\n        type: type,\n        key: key,\n        props: props,\n        _owner: owner\n      };\n      null !== (void 0 !== refProp ? refProp : null)\n        ? Object.defineProperty(type, \"ref\", {\n            enumerable: !1,\n            get: elementRefGetterWithDeprecationWarning\n          })\n        : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n      type._store = {};\n      Object.defineProperty(type._store, \"validated\", {\n        configurable: !1,\n        enumerable: !1,\n        writable: !0,\n        value: 0\n      });\n      Object.defineProperty(type, \"_debugInfo\", {\n        configurable: !1,\n        enumerable: !1,\n        writable: !0,\n        value: null\n      });\n      Object.defineProperty(type, \"_debugStack\", {\n        configurable: !1,\n        enumerable: !1,\n        writable: !0,\n        value: debugStack\n      });\n      Object.defineProperty(type, \"_debugTask\", {\n        configurable: !1,\n        enumerable: !1,\n        writable: !0,\n        value: debugTask\n      });\n      Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n      return type;\n    }\n    function jsxDEVImpl(\n      type,\n      config,\n      maybeKey,\n      isStaticChildren,\n      debugStack,\n      debugTask\n    ) {\n      var children = config.children;\n      if (void 0 !== children)\n        if (isStaticChildren)\n          if (isArrayImpl(children)) {\n            for (\n              isStaticChildren = 0;\n              isStaticChildren < children.length;\n              isStaticChildren++\n            )\n              validateChildKeys(children[isStaticChildren]);\n            Object.freeze && Object.freeze(children);\n          } else\n            console.error(\n              \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n            );\n        else validateChildKeys(children);\n      if (hasOwnProperty.call(config, \"key\")) {\n        children = getComponentNameFromType(type);\n        var keys = Object.keys(config).filter(function (k) {\n          return \"key\" !== k;\n        });\n        isStaticChildren =\n          0 < keys.length\n            ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n            : \"{key: someKey}\";\n        didWarnAboutKeySpread[children + isStaticChildren] ||\n          ((keys =\n            0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n          console.error(\n            'A props object containing a \"key\" prop is being spread into JSX:\\n  let props = %s;\\n  <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n  let props = %s;\\n  <%s key={someKey} {...props} />',\n            isStaticChildren,\n            children,\n            keys,\n            children\n          ),\n          (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n      }\n      children = null;\n      void 0 !== maybeKey &&\n        (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n      hasValidKey(config) &&\n        (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n      if (\"key\" in config) {\n        maybeKey = {};\n        for (var propName in config)\n          \"key\" !== propName && (maybeKey[propName] = config[propName]);\n      } else maybeKey = config;\n      children &&\n        defineKeyPropWarningGetter(\n          maybeKey,\n          \"function\" === typeof type\n            ? type.displayName || type.name || \"Unknown\"\n            : type\n        );\n      return ReactElement(\n        type,\n        children,\n        maybeKey,\n        getOwner(),\n        debugStack,\n        debugTask\n      );\n    }\n    function validateChildKeys(node) {\n      isValidElement(node)\n        ? node._store && (node._store.validated = 1)\n        : \"object\" === typeof node &&\n          null !== node &&\n          node.$$typeof === REACT_LAZY_TYPE &&\n          (\"fulfilled\" === node._payload.status\n            ? isValidElement(node._payload.value) &&\n              node._payload.value._store &&\n              (node._payload.value._store.validated = 1)\n            : node._store && (node._store.validated = 1));\n    }\n    function isValidElement(object) {\n      return (\n        \"object\" === typeof object &&\n        null !== object &&\n        object.$$typeof === REACT_ELEMENT_TYPE\n      );\n    }\n    var React = require(\"react\"),\n      REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n      REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n      REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n      REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n      REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n      REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n      REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n      REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n      REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n      REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n      REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n      REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n      REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n      REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n      ReactSharedInternals =\n        React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n      hasOwnProperty = Object.prototype.hasOwnProperty,\n      isArrayImpl = Array.isArray,\n      createTask = console.createTask\n        ? console.createTask\n        : function () {\n            return null;\n          };\n    React = {\n      react_stack_bottom_frame: function (callStackForError) {\n        return callStackForError();\n      }\n    };\n    var specialPropKeyWarningShown;\n    var didWarnAboutElementRef = {};\n    var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n      React,\n      UnknownOwner\n    )();\n    var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n    var didWarnAboutKeySpread = {};\n    exports.Fragment = REACT_FRAGMENT_TYPE;\n    exports.jsx = function (type, config, maybeKey) {\n      var trackActualOwner =\n        1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n      return jsxDEVImpl(\n        type,\n        config,\n        maybeKey,\n        !1,\n        trackActualOwner\n          ? Error(\"react-stack-top-frame\")\n          : unknownOwnerDebugStack,\n        trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n      );\n    };\n    exports.jsxs = function (type, config, maybeKey) {\n      var trackActualOwner =\n        1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n      return jsxDEVImpl(\n        type,\n        config,\n        maybeKey,\n        !0,\n        trackActualOwner\n          ? Error(\"react-stack-top-frame\")\n          : unknownOwnerDebugStack,\n        trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n      );\n    };\n  })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n  module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var f=require(\"react\"),k=Symbol.for(\"react.element\"),l=Symbol.for(\"react.fragment\"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=\"\"+g);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nif (process.env.NODE_ENV !== \"production\") {\n  (function() {\n'use strict';\n\nvar React = require('react');\n\n// ATTENTION\n// When adding new symbols to this file,\n// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'\n// The Symbol used to tag the ReactElement-like types.\nvar REACT_ELEMENT_TYPE = Symbol.for('react.element');\nvar REACT_PORTAL_TYPE = Symbol.for('react.portal');\nvar REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');\nvar REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode');\nvar REACT_PROFILER_TYPE = Symbol.for('react.profiler');\nvar REACT_PROVIDER_TYPE = Symbol.for('react.provider');\nvar REACT_CONTEXT_TYPE = Symbol.for('react.context');\nvar REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');\nvar REACT_SUSPENSE_TYPE = Symbol.for('react.suspense');\nvar REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list');\nvar REACT_MEMO_TYPE = Symbol.for('react.memo');\nvar REACT_LAZY_TYPE = Symbol.for('react.lazy');\nvar REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen');\nvar MAYBE_ITERATOR_SYMBOL = Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\nfunction getIteratorFn(maybeIterable) {\n  if (maybeIterable === null || typeof maybeIterable !== 'object') {\n    return null;\n  }\n\n  var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n\n  if (typeof maybeIterator === 'function') {\n    return maybeIterator;\n  }\n\n  return null;\n}\n\nvar ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n\nfunction error(format) {\n  {\n    {\n      for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n        args[_key2 - 1] = arguments[_key2];\n      }\n\n      printWarning('error', format, args);\n    }\n  }\n}\n\nfunction printWarning(level, format, args) {\n  // When changing this logic, you might want to also\n  // update consoleWithStackDev.www.js as well.\n  {\n    var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n    var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n    if (stack !== '') {\n      format += '%s';\n      args = args.concat([stack]);\n    } // eslint-disable-next-line react-internal/safe-string-coercion\n\n\n    var argsWithFormat = args.map(function (item) {\n      return String(item);\n    }); // Careful: RN currently depends on this prefix\n\n    argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n    // breaks IE9: https://github.com/facebook/react/issues/13610\n    // eslint-disable-next-line react-internal/no-production-logging\n\n    Function.prototype.apply.call(console[level], console, argsWithFormat);\n  }\n}\n\n// -----------------------------------------------------------------------------\n\nvar enableScopeAPI = false; // Experimental Create Event Handle API.\nvar enableCacheElement = false;\nvar enableTransitionTracing = false; // No known bugs, but needs performance testing\n\nvar enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber\n// stuff. Intended to enable React core members to more easily debug scheduling\n// issues in DEV builds.\n\nvar enableDebugTracing = false; // Track which Fiber(s) schedule render work.\n\nvar REACT_MODULE_REFERENCE;\n\n{\n  REACT_MODULE_REFERENCE = Symbol.for('react.module.reference');\n}\n\nfunction isValidElementType(type) {\n  if (typeof type === 'string' || typeof type === 'function') {\n    return true;\n  } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill).\n\n\n  if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing  || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden  || type === REACT_OFFSCREEN_TYPE || enableScopeAPI  || enableCacheElement  || enableTransitionTracing ) {\n    return true;\n  }\n\n  if (typeof type === 'object' && type !== null) {\n    if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object\n    // types supported by any Flight configuration anywhere since\n    // we don't know which Flight build this will end up being used\n    // with.\n    type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== undefined) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nfunction getWrappedName(outerType, innerType, wrapperName) {\n  var displayName = outerType.displayName;\n\n  if (displayName) {\n    return displayName;\n  }\n\n  var functionName = innerType.displayName || innerType.name || '';\n  return functionName !== '' ? wrapperName + \"(\" + functionName + \")\" : wrapperName;\n} // Keep in sync with react-reconciler/getComponentNameFromFiber\n\n\nfunction getContextName(type) {\n  return type.displayName || 'Context';\n} // Note that the reconciler package should generally prefer to use getComponentNameFromFiber() instead.\n\n\nfunction getComponentNameFromType(type) {\n  if (type == null) {\n    // Host root, text node or just invalid type.\n    return null;\n  }\n\n  {\n    if (typeof type.tag === 'number') {\n      error('Received an unexpected object in getComponentNameFromType(). ' + 'This is likely a bug in React. Please file an issue.');\n    }\n  }\n\n  if (typeof type === 'function') {\n    return type.displayName || type.name || null;\n  }\n\n  if (typeof type === 'string') {\n    return type;\n  }\n\n  switch (type) {\n    case REACT_FRAGMENT_TYPE:\n      return 'Fragment';\n\n    case REACT_PORTAL_TYPE:\n      return 'Portal';\n\n    case REACT_PROFILER_TYPE:\n      return 'Profiler';\n\n    case REACT_STRICT_MODE_TYPE:\n      return 'StrictMode';\n\n    case REACT_SUSPENSE_TYPE:\n      return 'Suspense';\n\n    case REACT_SUSPENSE_LIST_TYPE:\n      return 'SuspenseList';\n\n  }\n\n  if (typeof type === 'object') {\n    switch (type.$$typeof) {\n      case REACT_CONTEXT_TYPE:\n        var context = type;\n        return getContextName(context) + '.Consumer';\n\n      case REACT_PROVIDER_TYPE:\n        var provider = type;\n        return getContextName(provider._context) + '.Provider';\n\n      case REACT_FORWARD_REF_TYPE:\n        return getWrappedName(type, type.render, 'ForwardRef');\n\n      case REACT_MEMO_TYPE:\n        var outerName = type.displayName || null;\n\n        if (outerName !== null) {\n          return outerName;\n        }\n\n        return getComponentNameFromType(type.type) || 'Memo';\n\n      case REACT_LAZY_TYPE:\n        {\n          var lazyComponent = type;\n          var payload = lazyComponent._payload;\n          var init = lazyComponent._init;\n\n          try {\n            return getComponentNameFromType(init(payload));\n          } catch (x) {\n            return null;\n          }\n        }\n\n      // eslint-disable-next-line no-fallthrough\n    }\n  }\n\n  return null;\n}\n\nvar assign = Object.assign;\n\n// Helpers to patch console.logs to avoid logging during side-effect free\n// replaying on render function. This currently only patches the object\n// lazily which won't cover if the log function was extracted eagerly.\n// We could also eagerly patch the method.\nvar disabledDepth = 0;\nvar prevLog;\nvar prevInfo;\nvar prevWarn;\nvar prevError;\nvar prevGroup;\nvar prevGroupCollapsed;\nvar prevGroupEnd;\n\nfunction disabledLog() {}\n\ndisabledLog.__reactDisabledLog = true;\nfunction disableLogs() {\n  {\n    if (disabledDepth === 0) {\n      /* eslint-disable react-internal/no-production-logging */\n      prevLog = console.log;\n      prevInfo = console.info;\n      prevWarn = console.warn;\n      prevError = console.error;\n      prevGroup = console.group;\n      prevGroupCollapsed = console.groupCollapsed;\n      prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099\n\n      var props = {\n        configurable: true,\n        enumerable: true,\n        value: disabledLog,\n        writable: true\n      }; // $FlowFixMe Flow thinks console is immutable.\n\n      Object.defineProperties(console, {\n        info: props,\n        log: props,\n        warn: props,\n        error: props,\n        group: props,\n        groupCollapsed: props,\n        groupEnd: props\n      });\n      /* eslint-enable react-internal/no-production-logging */\n    }\n\n    disabledDepth++;\n  }\n}\nfunction reenableLogs() {\n  {\n    disabledDepth--;\n\n    if (disabledDepth === 0) {\n      /* eslint-disable react-internal/no-production-logging */\n      var props = {\n        configurable: true,\n        enumerable: true,\n        writable: true\n      }; // $FlowFixMe Flow thinks console is immutable.\n\n      Object.defineProperties(console, {\n        log: assign({}, props, {\n          value: prevLog\n        }),\n        info: assign({}, props, {\n          value: prevInfo\n        }),\n        warn: assign({}, props, {\n          value: prevWarn\n        }),\n        error: assign({}, props, {\n          value: prevError\n        }),\n        group: assign({}, props, {\n          value: prevGroup\n        }),\n        groupCollapsed: assign({}, props, {\n          value: prevGroupCollapsed\n        }),\n        groupEnd: assign({}, props, {\n          value: prevGroupEnd\n        })\n      });\n      /* eslint-enable react-internal/no-production-logging */\n    }\n\n    if (disabledDepth < 0) {\n      error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.');\n    }\n  }\n}\n\nvar ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;\nvar prefix;\nfunction describeBuiltInComponentFrame(name, source, ownerFn) {\n  {\n    if (prefix === undefined) {\n      // Extract the VM specific prefix used by each line.\n      try {\n        throw Error();\n      } catch (x) {\n        var match = x.stack.trim().match(/\\n( *(at )?)/);\n        prefix = match && match[1] || '';\n      }\n    } // We use the prefix to ensure our stacks line up with native stack frames.\n\n\n    return '\\n' + prefix + name;\n  }\n}\nvar reentry = false;\nvar componentFrameCache;\n\n{\n  var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;\n  componentFrameCache = new PossiblyWeakMap();\n}\n\nfunction describeNativeComponentFrame(fn, construct) {\n  // If something asked for a stack inside a fake render, it should get ignored.\n  if ( !fn || reentry) {\n    return '';\n  }\n\n  {\n    var frame = componentFrameCache.get(fn);\n\n    if (frame !== undefined) {\n      return frame;\n    }\n  }\n\n  var control;\n  reentry = true;\n  var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined.\n\n  Error.prepareStackTrace = undefined;\n  var previousDispatcher;\n\n  {\n    previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function\n    // for warnings.\n\n    ReactCurrentDispatcher.current = null;\n    disableLogs();\n  }\n\n  try {\n    // This should throw.\n    if (construct) {\n      // Something should be setting the props in the constructor.\n      var Fake = function () {\n        throw Error();\n      }; // $FlowFixMe\n\n\n      Object.defineProperty(Fake.prototype, 'props', {\n        set: function () {\n          // We use a throwing setter instead of frozen or non-writable props\n          // because that won't throw in a non-strict mode function.\n          throw Error();\n        }\n      });\n\n      if (typeof Reflect === 'object' && Reflect.construct) {\n        // We construct a different control for this case to include any extra\n        // frames added by the construct call.\n        try {\n          Reflect.construct(Fake, []);\n        } catch (x) {\n          control = x;\n        }\n\n        Reflect.construct(fn, [], Fake);\n      } else {\n        try {\n          Fake.call();\n        } catch (x) {\n          control = x;\n        }\n\n        fn.call(Fake.prototype);\n      }\n    } else {\n      try {\n        throw Error();\n      } catch (x) {\n        control = x;\n      }\n\n      fn();\n    }\n  } catch (sample) {\n    // This is inlined manually because closure doesn't do it for us.\n    if (sample && control && typeof sample.stack === 'string') {\n      // This extracts the first frame from the sample that isn't also in the control.\n      // Skipping one frame that we assume is the frame that calls the two.\n      var sampleLines = sample.stack.split('\\n');\n      var controlLines = control.stack.split('\\n');\n      var s = sampleLines.length - 1;\n      var c = controlLines.length - 1;\n\n      while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) {\n        // We expect at least one stack frame to be shared.\n        // Typically this will be the root most one. However, stack frames may be\n        // cut off due to maximum stack limits. In this case, one maybe cut off\n        // earlier than the other. We assume that the sample is longer or the same\n        // and there for cut off earlier. So we should find the root most frame in\n        // the sample somewhere in the control.\n        c--;\n      }\n\n      for (; s >= 1 && c >= 0; s--, c--) {\n        // Next we find the first one that isn't the same which should be the\n        // frame that called our sample function and the control.\n        if (sampleLines[s] !== controlLines[c]) {\n          // In V8, the first line is describing the message but other VMs don't.\n          // If we're about to return the first line, and the control is also on the same\n          // line, that's a pretty good indicator that our sample threw at same line as\n          // the control. I.e. before we entered the sample frame. So we ignore this result.\n          // This can happen if you passed a class to function component, or non-function.\n          if (s !== 1 || c !== 1) {\n            do {\n              s--;\n              c--; // We may still have similar intermediate frames from the construct call.\n              // The next one that isn't the same should be our match though.\n\n              if (c < 0 || sampleLines[s] !== controlLines[c]) {\n                // V8 adds a \"new\" prefix for native classes. Let's remove it to make it prettier.\n                var _frame = '\\n' + sampleLines[s].replace(' at new ', ' at '); // If our component frame is labeled \"<anonymous>\"\n                // but we have a user-provided \"displayName\"\n                // splice it in to make the stack more readable.\n\n\n                if (fn.displayName && _frame.includes('<anonymous>')) {\n                  _frame = _frame.replace('<anonymous>', fn.displayName);\n                }\n\n                {\n                  if (typeof fn === 'function') {\n                    componentFrameCache.set(fn, _frame);\n                  }\n                } // Return the line we found.\n\n\n                return _frame;\n              }\n            } while (s >= 1 && c >= 0);\n          }\n\n          break;\n        }\n      }\n    }\n  } finally {\n    reentry = false;\n\n    {\n      ReactCurrentDispatcher.current = previousDispatcher;\n      reenableLogs();\n    }\n\n    Error.prepareStackTrace = previousPrepareStackTrace;\n  } // Fallback to just using the name if we couldn't make it throw.\n\n\n  var name = fn ? fn.displayName || fn.name : '';\n  var syntheticFrame = name ? describeBuiltInComponentFrame(name) : '';\n\n  {\n    if (typeof fn === 'function') {\n      componentFrameCache.set(fn, syntheticFrame);\n    }\n  }\n\n  return syntheticFrame;\n}\nfunction describeFunctionComponentFrame(fn, source, ownerFn) {\n  {\n    return describeNativeComponentFrame(fn, false);\n  }\n}\n\nfunction shouldConstruct(Component) {\n  var prototype = Component.prototype;\n  return !!(prototype && prototype.isReactComponent);\n}\n\nfunction describeUnknownElementTypeFrameInDEV(type, source, ownerFn) {\n\n  if (type == null) {\n    return '';\n  }\n\n  if (typeof type === 'function') {\n    {\n      return describeNativeComponentFrame(type, shouldConstruct(type));\n    }\n  }\n\n  if (typeof type === 'string') {\n    return describeBuiltInComponentFrame(type);\n  }\n\n  switch (type) {\n    case REACT_SUSPENSE_TYPE:\n      return describeBuiltInComponentFrame('Suspense');\n\n    case REACT_SUSPENSE_LIST_TYPE:\n      return describeBuiltInComponentFrame('SuspenseList');\n  }\n\n  if (typeof type === 'object') {\n    switch (type.$$typeof) {\n      case REACT_FORWARD_REF_TYPE:\n        return describeFunctionComponentFrame(type.render);\n\n      case REACT_MEMO_TYPE:\n        // Memo may contain any component type so we recursively resolve it.\n        return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn);\n\n      case REACT_LAZY_TYPE:\n        {\n          var lazyComponent = type;\n          var payload = lazyComponent._payload;\n          var init = lazyComponent._init;\n\n          try {\n            // Lazy may contain any component type so we recursively resolve it.\n            return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn);\n          } catch (x) {}\n        }\n    }\n  }\n\n  return '';\n}\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar loggedTypeFailures = {};\nvar ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement(element) {\n  {\n    if (element) {\n      var owner = element._owner;\n      var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n      ReactDebugCurrentFrame.setExtraStackFrame(stack);\n    } else {\n      ReactDebugCurrentFrame.setExtraStackFrame(null);\n    }\n  }\n}\n\nfunction checkPropTypes(typeSpecs, values, location, componentName, element) {\n  {\n    // $FlowFixMe This is okay but Flow doesn't know it.\n    var has = Function.call.bind(hasOwnProperty);\n\n    for (var typeSpecName in typeSpecs) {\n      if (has(typeSpecs, typeSpecName)) {\n        var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to\n        // fail the render phase where it didn't fail before. So we log it.\n        // After these have been cleaned up, we'll let them throw.\n\n        try {\n          // This is intentionally an invariant that gets caught. It's the same\n          // behavior as without this statement except with a better message.\n          if (typeof typeSpecs[typeSpecName] !== 'function') {\n            // eslint-disable-next-line react-internal/prod-error-codes\n            var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.');\n            err.name = 'Invariant Violation';\n            throw err;\n          }\n\n          error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED');\n        } catch (ex) {\n          error$1 = ex;\n        }\n\n        if (error$1 && !(error$1 instanceof Error)) {\n          setCurrentlyValidatingElement(element);\n\n          error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1);\n\n          setCurrentlyValidatingElement(null);\n        }\n\n        if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) {\n          // Only monitor this failure once because there tends to be a lot of the\n          // same error.\n          loggedTypeFailures[error$1.message] = true;\n          setCurrentlyValidatingElement(element);\n\n          error('Failed %s type: %s', location, error$1.message);\n\n          setCurrentlyValidatingElement(null);\n        }\n      }\n    }\n  }\n}\n\nvar isArrayImpl = Array.isArray; // eslint-disable-next-line no-redeclare\n\nfunction isArray(a) {\n  return isArrayImpl(a);\n}\n\n/*\n * The `'' + value` pattern (used in in perf-sensitive code) throws for Symbol\n * and Temporal.* types. See https://github.com/facebook/react/pull/22064.\n *\n * The functions in this module will throw an easier-to-understand,\n * easier-to-debug exception with a clear errors message message explaining the\n * problem. (Instead of a confusing exception thrown inside the implementation\n * of the `value` object).\n */\n// $FlowFixMe only called in DEV, so void return is not possible.\nfunction typeName(value) {\n  {\n    // toStringTag is needed for namespaced types like Temporal.Instant\n    var hasToStringTag = typeof Symbol === 'function' && Symbol.toStringTag;\n    var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || 'Object';\n    return type;\n  }\n} // $FlowFixMe only called in DEV, so void return is not possible.\n\n\nfunction willCoercionThrow(value) {\n  {\n    try {\n      testStringCoercion(value);\n      return false;\n    } catch (e) {\n      return true;\n    }\n  }\n}\n\nfunction testStringCoercion(value) {\n  // If you ended up here by following an exception call stack, here's what's\n  // happened: you supplied an object or symbol value to React (as a prop, key,\n  // DOM attribute, CSS property, string ref, etc.) and when React tried to\n  // coerce it to a string using `'' + value`, an exception was thrown.\n  //\n  // The most common types that will cause this exception are `Symbol` instances\n  // and Temporal objects like `Temporal.Instant`. But any object that has a\n  // `valueOf` or `[Symbol.toPrimitive]` method that throws will also cause this\n  // exception. (Library authors do this to prevent users from using built-in\n  // numeric operators like `+` or comparison operators like `>=` because custom\n  // methods are needed to perform accurate arithmetic or comparison.)\n  //\n  // To fix the problem, coerce this object or symbol value to a string before\n  // passing it to React. The most reliable way is usually `String(value)`.\n  //\n  // To find which value is throwing, check the browser or debugger console.\n  // Before this exception was thrown, there should be `console.error` output\n  // that shows the type (Symbol, Temporal.PlainDate, etc.) that caused the\n  // problem and how that type was used: key, atrribute, input value prop, etc.\n  // In most cases, this console output also shows the component and its\n  // ancestor components where the exception happened.\n  //\n  // eslint-disable-next-line react-internal/safe-string-coercion\n  return '' + value;\n}\nfunction checkKeyStringCoercion(value) {\n  {\n    if (willCoercionThrow(value)) {\n      error('The provided key is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', typeName(value));\n\n      return testStringCoercion(value); // throw (to help callers find troubleshooting comments)\n    }\n  }\n}\n\nvar ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;\nvar RESERVED_PROPS = {\n  key: true,\n  ref: true,\n  __self: true,\n  __source: true\n};\nvar specialPropKeyWarningShown;\nvar specialPropRefWarningShown;\nvar didWarnAboutStringRefs;\n\n{\n  didWarnAboutStringRefs = {};\n}\n\nfunction hasValidRef(config) {\n  {\n    if (hasOwnProperty.call(config, 'ref')) {\n      var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;\n\n      if (getter && getter.isReactWarning) {\n        return false;\n      }\n    }\n  }\n\n  return config.ref !== undefined;\n}\n\nfunction hasValidKey(config) {\n  {\n    if (hasOwnProperty.call(config, 'key')) {\n      var getter = Object.getOwnPropertyDescriptor(config, 'key').get;\n\n      if (getter && getter.isReactWarning) {\n        return false;\n      }\n    }\n  }\n\n  return config.key !== undefined;\n}\n\nfunction warnIfStringRefCannotBeAutoConverted(config, self) {\n  {\n    if (typeof config.ref === 'string' && ReactCurrentOwner.current && self && ReactCurrentOwner.current.stateNode !== self) {\n      var componentName = getComponentNameFromType(ReactCurrentOwner.current.type);\n\n      if (!didWarnAboutStringRefs[componentName]) {\n        error('Component \"%s\" contains the string ref \"%s\". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', getComponentNameFromType(ReactCurrentOwner.current.type), config.ref);\n\n        didWarnAboutStringRefs[componentName] = true;\n      }\n    }\n  }\n}\n\nfunction defineKeyPropWarningGetter(props, displayName) {\n  {\n    var warnAboutAccessingKey = function () {\n      if (!specialPropKeyWarningShown) {\n        specialPropKeyWarningShown = true;\n\n        error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n      }\n    };\n\n    warnAboutAccessingKey.isReactWarning = true;\n    Object.defineProperty(props, 'key', {\n      get: warnAboutAccessingKey,\n      configurable: true\n    });\n  }\n}\n\nfunction defineRefPropWarningGetter(props, displayName) {\n  {\n    var warnAboutAccessingRef = function () {\n      if (!specialPropRefWarningShown) {\n        specialPropRefWarningShown = true;\n\n        error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n      }\n    };\n\n    warnAboutAccessingRef.isReactWarning = true;\n    Object.defineProperty(props, 'ref', {\n      get: warnAboutAccessingRef,\n      configurable: true\n    });\n  }\n}\n/**\n * Factory method to create a new React element. This no longer adheres to\n * the class pattern, so do not use new to call it. Also, instanceof check\n * will not work. Instead test $$typeof field against Symbol.for('react.element') to check\n * if something is a React Element.\n *\n * @param {*} type\n * @param {*} props\n * @param {*} key\n * @param {string|object} ref\n * @param {*} owner\n * @param {*} self A *temporary* helper to detect places where `this` is\n * different from the `owner` when React.createElement is called, so that we\n * can warn. We want to get rid of owner and replace string `ref`s with arrow\n * functions, and as long as `this` and owner are the same, there will be no\n * change in behavior.\n * @param {*} source An annotation object (added by a transpiler or otherwise)\n * indicating filename, line number, and/or other information.\n * @internal\n */\n\n\nvar ReactElement = function (type, key, ref, self, source, owner, props) {\n  var element = {\n    // This tag allows us to uniquely identify this as a React Element\n    $$typeof: REACT_ELEMENT_TYPE,\n    // Built-in properties that belong on the element\n    type: type,\n    key: key,\n    ref: ref,\n    props: props,\n    // Record the component responsible for creating this element.\n    _owner: owner\n  };\n\n  {\n    // The validation flag is currently mutative. We put it on\n    // an external backing store so that we can freeze the whole object.\n    // This can be replaced with a WeakMap once they are implemented in\n    // commonly used development environments.\n    element._store = {}; // To make comparing ReactElements easier for testing purposes, we make\n    // the validation flag non-enumerable (where possible, which should\n    // include every environment we run tests in), so the test framework\n    // ignores it.\n\n    Object.defineProperty(element._store, 'validated', {\n      configurable: false,\n      enumerable: false,\n      writable: true,\n      value: false\n    }); // self and source are DEV only properties.\n\n    Object.defineProperty(element, '_self', {\n      configurable: false,\n      enumerable: false,\n      writable: false,\n      value: self\n    }); // Two elements created in two different places should be considered\n    // equal for testing purposes and therefore we hide it from enumeration.\n\n    Object.defineProperty(element, '_source', {\n      configurable: false,\n      enumerable: false,\n      writable: false,\n      value: source\n    });\n\n    if (Object.freeze) {\n      Object.freeze(element.props);\n      Object.freeze(element);\n    }\n  }\n\n  return element;\n};\n/**\n * https://github.com/reactjs/rfcs/pull/107\n * @param {*} type\n * @param {object} props\n * @param {string} key\n */\n\nfunction jsxDEV(type, config, maybeKey, source, self) {\n  {\n    var propName; // Reserved names are extracted\n\n    var props = {};\n    var key = null;\n    var ref = null; // Currently, key can be spread in as a prop. This causes a potential\n    // issue if key is also explicitly declared (ie. <div {...props} key=\"Hi\" />\n    // or <div key=\"Hi\" {...props} /> ). We want to deprecate key spread,\n    // but as an intermediary step, we will use jsxDEV for everything except\n    // <div {...props} key=\"Hi\" />, because we aren't currently able to tell if\n    // key is explicitly declared to be undefined or not.\n\n    if (maybeKey !== undefined) {\n      {\n        checkKeyStringCoercion(maybeKey);\n      }\n\n      key = '' + maybeKey;\n    }\n\n    if (hasValidKey(config)) {\n      {\n        checkKeyStringCoercion(config.key);\n      }\n\n      key = '' + config.key;\n    }\n\n    if (hasValidRef(config)) {\n      ref = config.ref;\n      warnIfStringRefCannotBeAutoConverted(config, self);\n    } // Remaining properties are added to a new props object\n\n\n    for (propName in config) {\n      if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n        props[propName] = config[propName];\n      }\n    } // Resolve default props\n\n\n    if (type && type.defaultProps) {\n      var defaultProps = type.defaultProps;\n\n      for (propName in defaultProps) {\n        if (props[propName] === undefined) {\n          props[propName] = defaultProps[propName];\n        }\n      }\n    }\n\n    if (key || ref) {\n      var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;\n\n      if (key) {\n        defineKeyPropWarningGetter(props, displayName);\n      }\n\n      if (ref) {\n        defineRefPropWarningGetter(props, displayName);\n      }\n    }\n\n    return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);\n  }\n}\n\nvar ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner;\nvar ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement$1(element) {\n  {\n    if (element) {\n      var owner = element._owner;\n      var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n      ReactDebugCurrentFrame$1.setExtraStackFrame(stack);\n    } else {\n      ReactDebugCurrentFrame$1.setExtraStackFrame(null);\n    }\n  }\n}\n\nvar propTypesMisspellWarningShown;\n\n{\n  propTypesMisspellWarningShown = false;\n}\n/**\n * Verifies the object is a ReactElement.\n * See https://reactjs.org/docs/react-api.html#isvalidelement\n * @param {?object} object\n * @return {boolean} True if `object` is a ReactElement.\n * @final\n */\n\n\nfunction isValidElement(object) {\n  {\n    return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n  }\n}\n\nfunction getDeclarationErrorAddendum() {\n  {\n    if (ReactCurrentOwner$1.current) {\n      var name = getComponentNameFromType(ReactCurrentOwner$1.current.type);\n\n      if (name) {\n        return '\\n\\nCheck the render method of `' + name + '`.';\n      }\n    }\n\n    return '';\n  }\n}\n\nfunction getSourceInfoErrorAddendum(source) {\n  {\n    if (source !== undefined) {\n      var fileName = source.fileName.replace(/^.*[\\\\\\/]/, '');\n      var lineNumber = source.lineNumber;\n      return '\\n\\nCheck your code at ' + fileName + ':' + lineNumber + '.';\n    }\n\n    return '';\n  }\n}\n/**\n * Warn if there's no key explicitly set on dynamic arrays of children or\n * object keys are not valid. This allows us to keep track of children between\n * updates.\n */\n\n\nvar ownerHasKeyUseWarning = {};\n\nfunction getCurrentComponentErrorInfo(parentType) {\n  {\n    var info = getDeclarationErrorAddendum();\n\n    if (!info) {\n      var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;\n\n      if (parentName) {\n        info = \"\\n\\nCheck the top-level render call using <\" + parentName + \">.\";\n      }\n    }\n\n    return info;\n  }\n}\n/**\n * Warn if the element doesn't have an explicit key assigned to it.\n * This element is in an array. The array could grow and shrink or be\n * reordered. All children that haven't already been validated are required to\n * have a \"key\" property assigned to it. Error statuses are cached so a warning\n * will only be shown once.\n *\n * @internal\n * @param {ReactElement} element Element that requires a key.\n * @param {*} parentType element's parent's type.\n */\n\n\nfunction validateExplicitKey(element, parentType) {\n  {\n    if (!element._store || element._store.validated || element.key != null) {\n      return;\n    }\n\n    element._store.validated = true;\n    var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);\n\n    if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n      return;\n    }\n\n    ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a\n    // property, it may be the creator of the child that's responsible for\n    // assigning it a key.\n\n    var childOwner = '';\n\n    if (element && element._owner && element._owner !== ReactCurrentOwner$1.current) {\n      // Give the component that originally created this child.\n      childOwner = \" It was passed a child from \" + getComponentNameFromType(element._owner.type) + \".\";\n    }\n\n    setCurrentlyValidatingElement$1(element);\n\n    error('Each child in a list should have a unique \"key\" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner);\n\n    setCurrentlyValidatingElement$1(null);\n  }\n}\n/**\n * Ensure that every element either is passed in a static location, in an\n * array with an explicit keys property defined, or in an object literal\n * with valid key property.\n *\n * @internal\n * @param {ReactNode} node Statically passed child of any type.\n * @param {*} parentType node's parent's type.\n */\n\n\nfunction validateChildKeys(node, parentType) {\n  {\n    if (typeof node !== 'object') {\n      return;\n    }\n\n    if (isArray(node)) {\n      for (var i = 0; i < node.length; i++) {\n        var child = node[i];\n\n        if (isValidElement(child)) {\n          validateExplicitKey(child, parentType);\n        }\n      }\n    } else if (isValidElement(node)) {\n      // This element was passed in a valid location.\n      if (node._store) {\n        node._store.validated = true;\n      }\n    } else if (node) {\n      var iteratorFn = getIteratorFn(node);\n\n      if (typeof iteratorFn === 'function') {\n        // Entry iterators used to provide implicit keys,\n        // but now we print a separate warning for them later.\n        if (iteratorFn !== node.entries) {\n          var iterator = iteratorFn.call(node);\n          var step;\n\n          while (!(step = iterator.next()).done) {\n            if (isValidElement(step.value)) {\n              validateExplicitKey(step.value, parentType);\n            }\n          }\n        }\n      }\n    }\n  }\n}\n/**\n * Given an element, validate that its props follow the propTypes definition,\n * provided by the type.\n *\n * @param {ReactElement} element\n */\n\n\nfunction validatePropTypes(element) {\n  {\n    var type = element.type;\n\n    if (type === null || type === undefined || typeof type === 'string') {\n      return;\n    }\n\n    var propTypes;\n\n    if (typeof type === 'function') {\n      propTypes = type.propTypes;\n    } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here.\n    // Inner props are checked in the reconciler.\n    type.$$typeof === REACT_MEMO_TYPE)) {\n      propTypes = type.propTypes;\n    } else {\n      return;\n    }\n\n    if (propTypes) {\n      // Intentionally inside to avoid triggering lazy initializers:\n      var name = getComponentNameFromType(type);\n      checkPropTypes(propTypes, element.props, 'prop', name, element);\n    } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) {\n      propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers:\n\n      var _name = getComponentNameFromType(type);\n\n      error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown');\n    }\n\n    if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) {\n      error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.');\n    }\n  }\n}\n/**\n * Given a fragment, validate that it can only be provided with fragment props\n * @param {ReactElement} fragment\n */\n\n\nfunction validateFragmentProps(fragment) {\n  {\n    var keys = Object.keys(fragment.props);\n\n    for (var i = 0; i < keys.length; i++) {\n      var key = keys[i];\n\n      if (key !== 'children' && key !== 'key') {\n        setCurrentlyValidatingElement$1(fragment);\n\n        error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key);\n\n        setCurrentlyValidatingElement$1(null);\n        break;\n      }\n    }\n\n    if (fragment.ref !== null) {\n      setCurrentlyValidatingElement$1(fragment);\n\n      error('Invalid attribute `ref` supplied to `React.Fragment`.');\n\n      setCurrentlyValidatingElement$1(null);\n    }\n  }\n}\n\nvar didWarnAboutKeySpread = {};\nfunction jsxWithValidation(type, props, key, isStaticChildren, source, self) {\n  {\n    var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to\n    // succeed and there will likely be errors in render.\n\n    if (!validType) {\n      var info = '';\n\n      if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n        info += ' You likely forgot to export your component from the file ' + \"it's defined in, or you might have mixed up default and named imports.\";\n      }\n\n      var sourceInfo = getSourceInfoErrorAddendum(source);\n\n      if (sourceInfo) {\n        info += sourceInfo;\n      } else {\n        info += getDeclarationErrorAddendum();\n      }\n\n      var typeString;\n\n      if (type === null) {\n        typeString = 'null';\n      } else if (isArray(type)) {\n        typeString = 'array';\n      } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {\n        typeString = \"<\" + (getComponentNameFromType(type.type) || 'Unknown') + \" />\";\n        info = ' Did you accidentally export a JSX literal instead of a component?';\n      } else {\n        typeString = typeof type;\n      }\n\n      error('React.jsx: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);\n    }\n\n    var element = jsxDEV(type, props, key, source, self); // The result can be nullish if a mock or a custom function is used.\n    // TODO: Drop this when these are no longer allowed as the type argument.\n\n    if (element == null) {\n      return element;\n    } // Skip key warning if the type isn't valid since our key validation logic\n    // doesn't expect a non-string/function type and can throw confusing errors.\n    // We don't want exception behavior to differ between dev and prod.\n    // (Rendering will throw with a helpful message and as soon as the type is\n    // fixed, the key warnings will appear.)\n\n\n    if (validType) {\n      var children = props.children;\n\n      if (children !== undefined) {\n        if (isStaticChildren) {\n          if (isArray(children)) {\n            for (var i = 0; i < children.length; i++) {\n              validateChildKeys(children[i], type);\n            }\n\n            if (Object.freeze) {\n              Object.freeze(children);\n            }\n          } else {\n            error('React.jsx: Static children should always be an array. ' + 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + 'Use the Babel transform instead.');\n          }\n        } else {\n          validateChildKeys(children, type);\n        }\n      }\n    }\n\n    {\n      if (hasOwnProperty.call(props, 'key')) {\n        var componentName = getComponentNameFromType(type);\n        var keys = Object.keys(props).filter(function (k) {\n          return k !== 'key';\n        });\n        var beforeExample = keys.length > 0 ? '{key: someKey, ' + keys.join(': ..., ') + ': ...}' : '{key: someKey}';\n\n        if (!didWarnAboutKeySpread[componentName + beforeExample]) {\n          var afterExample = keys.length > 0 ? '{' + keys.join(': ..., ') + ': ...}' : '{}';\n\n          error('A props object containing a \"key\" prop is being spread into JSX:\\n' + '  let props = %s;\\n' + '  <%s {...props} />\\n' + 'React keys must be passed directly to JSX without using spread:\\n' + '  let props = %s;\\n' + '  <%s key={someKey} {...props} />', beforeExample, componentName, afterExample, componentName);\n\n          didWarnAboutKeySpread[componentName + beforeExample] = true;\n        }\n      }\n    }\n\n    if (type === REACT_FRAGMENT_TYPE) {\n      validateFragmentProps(element);\n    } else {\n      validatePropTypes(element);\n    }\n\n    return element;\n  }\n} // These two functions exist to still get child warnings in dev\n// even with the prod transform. This means that jsxDEV is purely\n// opt-in behavior for better messages but that we won't stop\n// giving you warnings if you use production apis.\n\nfunction jsxWithValidationStatic(type, props, key) {\n  {\n    return jsxWithValidation(type, props, key, true);\n  }\n}\nfunction jsxWithValidationDynamic(type, props, key) {\n  {\n    return jsxWithValidation(type, props, key, false);\n  }\n}\n\nvar jsx =  jsxWithValidationDynamic ; // we may want to special case jsxs internally to take advantage of static children.\n// for now we can ship identical prod functions\n\nvar jsxs =  jsxWithValidationStatic ;\n\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsx;\nexports.jsxs = jsxs;\n  })();\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n  module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import { BaseApiClient } from '@quantabit/sdk-config';\nimport { useState, useCallback, useEffect } from 'react';\nimport { jsx, jsxs } from 'react/jsx-runtime';\n\n/**\n * OAuth SDK - API 客户端\n * OAuth 认证系统后端接口封装\n * \n * 使用 BaseApiClient 基类简化代码\n */\n\n\n/**\n * OAuth API 客户端\n */\nclass OauthApiClient extends BaseApiClient {\n  constructor(config = {}) {\n    super('/oauth', config);\n  }\n  _updateFromGlobalConfig(globalConfig) {\n    if (!this._customBaseUrl) {\n      let base = globalConfig.didApiUrl || '/did-api';\n      const isAbsolute = /^https?:\\/\\//i.test(base);\n      const isServer = typeof window === 'undefined';\n      if (!isAbsolute && isServer) {\n        const fullUrl = globalConfig.apiFullUrl || 'https://api.qbitchain.io';\n        const cleanFull = String(fullUrl).replace(/\\/+$/, '');\n        const cleanBase = String(base).replace(/^\\/+/, '');\n        base = cleanFull && cleanBase ? `${cleanFull}/${cleanBase}` : cleanFull || `/${cleanBase}`;\n      }\n      const cleanBase = String(base).replace(/\\/+$/, '');\n      const cleanModule = String(this.modulePath).replace(/^\\/+/, '');\n      this.baseUrl = cleanBase && cleanModule ? `${cleanBase}/${cleanModule}` : cleanBase || `/${cleanModule}`;\n    } else {\n      this.baseUrl = String(this._customBaseUrl).replace(/\\/+$/, '');\n    }\n    if (!this._customTimeout) {\n      this.timeout = globalConfig.timeout || 30000;\n    } else {\n      this.timeout = this._customTimeout;\n    }\n  }\n  _normalizeProviderArgs(providerOrOptions, options = {}) {\n    if (typeof providerOrOptions === 'object' && providerOrOptions !== null) {\n      const {\n        provider,\n        ...params\n      } = providerOrOptions;\n      return {\n        provider,\n        params\n      };\n    }\n    return {\n      provider: providerOrOptions,\n      params: options\n    };\n  }\n  _getSocialUrl(path) {\n    const base = this.baseUrl.replace(/\\/oauth$/, '/social');\n    return `${base}${path}`;\n  }\n\n  // ============ OAuth 登录 ============\n\n  /**\n   * 获取 OAuth 登录 URL / 绑定 URL\n   * @param {string} provider - 提供商（google, github, twitter, discord 等）\n   * @param {Object} options - 选项\n   */\n  async getAuthUrl(provider, options = {}) {\n    const normalized = this._normalizeProviderArgs(provider, options);\n    const targetProvider = normalized.provider;\n    const params = normalized.params;\n    if (params.isLink) {\n      // 绑定第三方账号，对应后端的 POST /social/bind/initiate\n      const url = this._getSocialUrl('/bind/initiate');\n      const requestUrl = `${url}?platform=${targetProvider}&verification_method=oauth`;\n      const response = await this.post(requestUrl);\n      const data = response.data || response;\n      return {\n        authUrl: data.oauth_url || data.data && data.data.oauth_url\n      };\n    }\n\n    // 第三方登录/注册逻辑，对应后端的 GET /social/login/initiate\n    const url = this._getSocialUrl('/login/initiate');\n    const requestUrl = `${url}?platform=${targetProvider}`;\n    const response = await this.get(requestUrl);\n    const data = response.data || response;\n    return {\n      authUrl: data.oauth_url || data.data && data.data.oauth_url\n    };\n  }\n\n  /**\n   * OAuth 回调处理\n   * @param {string} provider - 提供商\n   * @param {string} code - 授权码\n   * @param {string} state - 状态\n   * @param {Object} options - 选项\n   */\n  async handleCallback(provider, code, state, options = {}) {\n    let callbackProvider,\n      callbackCode,\n      callbackState,\n      isLink = false;\n    if (typeof provider === 'object' && provider !== null) {\n      callbackProvider = provider.provider;\n      callbackCode = provider.code;\n      callbackState = provider.state;\n      isLink = !!provider.isLink;\n    } else {\n      callbackProvider = provider;\n      callbackCode = code;\n      callbackState = state;\n      isLink = !!options.isLink;\n    }\n    let url;\n    if (isLink) {\n      url = this._getSocialUrl('/bind/oauth/callback');\n    } else {\n      url = this._getSocialUrl('/login/oauth/callback');\n    }\n    const requestUrl = `${url}?platform=${callbackProvider}&code=${callbackCode}&state=${callbackState}`;\n    const response = await this.post(requestUrl);\n    const data = response.data || response;\n    const resultData = data.data || data;\n    return {\n      user: {\n        name: resultData.username || resultData.display_name || resultData.user && resultData.user.display_name || '用户'\n      },\n      ...resultData\n    };\n  }\n\n  /**\n   * 获取支持的 OAuth 提供商\n   */\n  async getProviders() {\n    return {\n      data: [{\n        id: 'google',\n        name: 'Google'\n      }, {\n        id: 'apple',\n        name: 'Apple'\n      }, {\n        id: 'microsoft',\n        name: 'Microsoft'\n      }]\n    };\n  }\n\n  // ============ 账号绑定 ============\n\n  /**\n   * 绑定第三方账号\n   * @param {string} provider - 提供商\n   * @param {string} code - 授权码\n   */\n  async bindAccount(provider, code) {\n    const url = this._getSocialUrl('/bind/oauth/callback');\n    const requestUrl = `${url}?platform=${provider}&code=${code}`;\n    return this.post(requestUrl);\n  }\n\n  /**\n   * 解绑第三方账号\n   * @param {string} provider - 提供商\n   */\n  async unbindAccount(provider) {\n    const url = this._getSocialUrl(`/unbind/${provider}`);\n    return this.delete(url);\n  }\n\n  /**\n   * 解绑第三方账号（兼容 hooks 命名）\n   * @param {string} provider - 提供商\n   */\n  async unlinkAccount(provider) {\n    return this.unbindAccount(provider);\n  }\n\n  /**\n   * 获取已绑定账号\n   */\n  async getBoundAccounts() {\n    const url = this._getSocialUrl('/bindings');\n    const response = await this.get(url);\n    const bindings = response.data?.bindings || response.bindings || [];\n    const formatted = bindings.map(b => ({\n      provider: b.platform,\n      email: b.username || b.display_name || '已关联',\n      ...b\n    }));\n    return {\n      data: formatted\n    };\n  }\n\n  /**\n   * 获取已关联账号（兼容旧版快捷方法命名）\n   */\n  async getLinkedAccounts() {\n    return this.getBoundAccounts();\n  }\n\n  /**\n   * 检查账号绑定状态\n   * @param {string} provider - 提供商\n   */\n  async checkBindStatus(provider) {\n    const url = this._getSocialUrl(`/bindings/${provider}`);\n    return this.get(url);\n  }\n\n  // ============ 钱包连接 ============\n\n  /**\n   * 获取钱包连接消息\n   * @param {string} address - 钱包地址\n   */\n  async getWalletMessage(address) {\n    return this.post('/wallet/message', {\n      address\n    });\n  }\n\n  /**\n   * 验证钱包签名\n   * @param {string} address - 钱包地址\n   * @param {string} signature - 签名\n   * @param {string} message - 消息\n   */\n  async verifyWalletSignature(address, signature, message) {\n    return this.post('/wallet/verify', {\n      address,\n      signature,\n      message\n    });\n  }\n\n  /**\n   * 使用钱包登录\n   * @param {string} address - 钱包地址\n   * @param {string} signature - 签名\n   * @param {string} message - 消息\n   */\n  async loginWithWallet(address, signature, message) {\n    return this.post('/wallet/login', {\n      address,\n      signature,\n      message\n    });\n  }\n\n  /**\n   * 绑定钱包\n   * @param {string} address - 钱包地址\n   * @param {string} signature - 签名\n   * @param {string} message - 消息\n   */\n  async bindWallet(address, signature, message) {\n    return this.post('/wallet/bind', {\n      address,\n      signature,\n      message\n    });\n  }\n\n  /**\n   * 解绑钱包\n   * @param {string} address - 钱包地址\n   */\n  async unbindWallet(address) {\n    return this.delete('/wallet/bind', {\n      address\n    });\n  }\n\n  /**\n   * 获取已绑定钱包\n   */\n  async getBoundWallets() {\n    return this.get('/wallet/list');\n  }\n\n  // ============ SSO 单点登录 ============\n\n  /**\n   * 获取 SSO 登录 URL\n   * @param {Object} options - 选项\n   */\n  async getSSOUrl(options = {}) {\n    return this.get('/sso/url', options);\n  }\n\n  /**\n   * SSO 登录验证\n   * @param {string} token - SSO Token\n   */\n  async verifySSOToken(token) {\n    return this.post('/sso/verify', {\n      token\n    });\n  }\n\n  /**\n   * SSO 登出\n   */\n  async ssoLogout() {\n    return this.post('/sso/logout');\n  }\n\n  /**\n   * 检查当前 OAuth 登录态\n   */\n  async checkAuth() {\n    return this.get('/auth/check');\n  }\n\n  /**\n   * 登出当前 OAuth 会话\n   */\n  async logout() {\n    return this.post('/logout');\n  }\n\n  // ============ Token 管理 ============\n\n  /**\n   * 刷新 Token\n   * @param {string} refreshToken - 刷新 Token\n   */\n  async refreshToken(refreshToken) {\n    return this.post('/token/refresh', {\n      refresh_token: refreshToken\n    });\n  }\n\n  /**\n   * 撤销 Token\n   * @param {string} token - Token\n   */\n  async revokeToken(token) {\n    return this.post('/token/revoke', {\n      token\n    });\n  }\n\n  /**\n   * 获取 Token 信息\n   * @param {string} token - Token\n   */\n  async getTokenInfo(token) {\n    return this.post('/token/info', {\n      token\n    });\n  }\n\n  // ============ 授权管理 ============\n\n  /**\n   * 获取授权应用列表\n   */\n  async getAuthorizedApps() {\n    return this.get('/apps');\n  }\n\n  /**\n   * 撤销应用授权\n   * @param {string} appId - 应用 ID\n   */\n  async revokeAppAuthorization(appId) {\n    return this.delete(`/apps/${appId}`);\n  }\n}\n\n// 创建默认实例\nconst oauthApi = new OauthApiClient();\nconst OAuthApiClient = OauthApiClient;\n\n/**\n * OAuth SDK - 类型定义\n */\n\n// 第三方登录提供商\nconst OAuthProvider = {\n  // 社交\n  GOOGLE: 'google',\n  FACEBOOK: 'facebook',\n  TWITTER: 'twitter',\n  GITHUB: 'github',\n  DISCORD: 'discord',\n  TELEGRAM: 'telegram',\n  WECHAT: 'wechat',\n  TIKTOK: 'tiktok',\n  WEIBO: 'weibo',\n  QQ: 'qq',\n  APPLE: 'apple',\n  // 钱包\n  METAMASK: 'metamask',\n  WALLET_CONNECT: 'wallet_connect',\n  COINBASE_WALLET: 'coinbase_wallet',\n  PHANTOM: 'phantom',\n  // 企业\n  MICROSOFT: 'microsoft',\n  OKTA: 'okta',\n  AUTH0: 'auth0'\n};\n\n// 连接状态\nconst ConnectionStatus = {\n  DISCONNECTED: 'disconnected',\n  CONNECTING: 'connecting',\n  CONNECTED: 'connected',\n  ERROR: 'error'\n};\n\n// 账户绑定状态\nconst BindingStatus = {\n  NOT_BOUND: 'not_bound',\n  BOUND: 'bound',\n  PENDING: 'pending'\n};\n\n// 授权范围\nconst OAuthScope = {\n  PROFILE: 'profile',\n  EMAIL: 'email',\n  OPENID: 'openid',\n  READ: 'read',\n  WRITE: 'write'\n};\n\n/**\n * OAuth SDK - 国际化\n * OAuth授权系统多语言支持\n */\n\nconst SUPPORTED_LANGUAGES = ['en', 'zh', 'ja', 'ko'];\nconst messages = {\n  zh: {\n    // 登录\n    login: '登录',\n    loginWith: '使用 {provider} 登录',\n    loginTo: '登录到',\n    signIn: '登录',\n    signUp: '注册',\n    signOut: '退出登录',\n    logout: '退出',\n    // 第三方\n    google: 'Google',\n    apple: 'Apple',\n    github: 'GitHub',\n    microsoft: '微软',\n    twitter: 'Twitter',\n    facebook: 'Facebook',\n    discord: 'Discord',\n    wechat: '微信',\n    tiktok: 'TikTok',\n    qq: 'QQ',\n    // 授权\n    authorize: '授权',\n    authorization: '授权',\n    authorizing: '授权中...',\n    allowAccess: '允许访问',\n    denyAccess: '拒绝访问',\n    // 权限\n    permissions: '权限',\n    requestingPermissions: '请求以下权限',\n    readProfile: '读取基本资料',\n    readEmail: '读取邮箱地址',\n    writeData: '写入数据',\n    // 连接\n    connect: '连接',\n    connected: '已连接',\n    disconnect: '断开连接',\n    connectionRequired: '需要连接账户',\n    // 状态\n    loading: '加载中...',\n    redirecting: '跳转中...',\n    success: '授权成功',\n    failed: '授权失败',\n    error: '发生错误',\n    tryAgain: '重试',\n    // 账户\n    linkedAccounts: '已关联账户',\n    linkAccount: '关联账户',\n    unlinkAccount: '解除关联',\n    noLinkedAccounts: '暂无关联账户',\n    // 安全\n    secureLogin: '安全登录',\n    securedBy: '由 {provider} 提供安全保障',\n    // 协议\n    termsOfService: '服务条款',\n    privacyPolicy: '隐私政策',\n    byLoggingIn: '登录即表示您同意我们的',\n    and: '和',\n    // 返回\n    cancel: '取消',\n    back: '返回',\n    continueAs: '以 {name} 继续'\n  },\n  en: {\n    login: 'Login',\n    loginWith: 'Login with {provider}',\n    loginTo: 'Login to',\n    signIn: 'Sign In',\n    signUp: 'Sign Up',\n    signOut: 'Sign Out',\n    logout: 'Logout',\n    google: 'Google',\n    apple: 'Apple',\n    github: 'GitHub',\n    microsoft: 'Microsoft',\n    twitter: 'Twitter',\n    facebook: 'Facebook',\n    discord: 'Discord',\n    wechat: 'WeChat',\n    tiktok: 'TikTok',\n    qq: 'QQ',\n    authorize: 'Authorize',\n    authorization: 'Authorization',\n    authorizing: 'Authorizing...',\n    allowAccess: 'Allow Access',\n    denyAccess: 'Deny Access',\n    permissions: 'Permissions',\n    requestingPermissions: 'Requesting the following permissions',\n    readProfile: 'Read your profile',\n    readEmail: 'Read your email',\n    writeData: 'Write data',\n    connect: 'Connect',\n    connected: 'Connected',\n    disconnect: 'Disconnect',\n    connectionRequired: 'Connection required',\n    loading: 'Loading...',\n    redirecting: 'Redirecting...',\n    success: 'Success',\n    failed: 'Failed',\n    error: 'Error',\n    tryAgain: 'Try Again',\n    linkedAccounts: 'Linked Accounts',\n    linkAccount: 'Link Account',\n    unlinkAccount: 'Unlink',\n    noLinkedAccounts: 'No linked accounts',\n    secureLogin: 'Secure Login',\n    securedBy: 'Secured by {provider}',\n    termsOfService: 'Terms of Service',\n    privacyPolicy: 'Privacy Policy',\n    byLoggingIn: 'By logging in, you agree to our',\n    and: 'and',\n    cancel: 'Cancel',\n    back: 'Back',\n    continueAs: 'Continue as {name}'\n  },\n  ja: {\n    login: 'ログイン',\n    loginWith: '{provider} でログイン',\n    loginTo: 'ログイン先',\n    signIn: 'サインイン',\n    signUp: 'サインアップ',\n    signOut: 'サインアウト',\n    logout: 'ログアウト',\n    google: 'Google',\n    apple: 'Apple',\n    github: 'GitHub',\n    microsoft: 'Microsoft',\n    twitter: 'Twitter',\n    facebook: 'Facebook',\n    discord: 'Discord',\n    wechat: 'WeChat',\n    tiktok: 'TikTok',\n    qq: 'QQ',\n    authorize: '認可',\n    authorization: '認可',\n    authorizing: '認可中...',\n    allowAccess: 'アクセスを許可',\n    denyAccess: 'アクセスを拒否',\n    permissions: '権限',\n    requestingPermissions: '以下の権限を要求しています',\n    readProfile: 'プロフィールの読み取り',\n    readEmail: 'メールの読み取り',\n    writeData: 'データの書き込み',\n    connect: '接続',\n    connected: '接続済み',\n    disconnect: '切断',\n    connectionRequired: '接続が必要',\n    loading: '読み込み中...',\n    redirecting: 'リダイレクト中...',\n    success: '成功',\n    failed: '失敗',\n    error: 'エラー',\n    tryAgain: '再試行',\n    linkedAccounts: '連携済みアカウント',\n    linkAccount: 'アカウントを連携',\n    unlinkAccount: '連携解除',\n    noLinkedAccounts: '連携アカウントなし',\n    secureLogin: 'セキュアログイン',\n    securedBy: '{provider} によるセキュリティ',\n    termsOfService: '利用規約',\n    privacyPolicy: 'プライバシーポリシー',\n    byLoggingIn: 'ログインすると、以下に同意することになります：',\n    and: 'と',\n    cancel: 'キャンセル',\n    back: '戻る',\n    continueAs: '{name} として続行'\n  },\n  ko: {\n    login: '로그인',\n    loginWith: '{provider}로 로그인',\n    loginTo: '로그인 대상',\n    signIn: '로그인',\n    signUp: '가입하기',\n    signOut: '로그아웃',\n    logout: '로그아웃',\n    google: 'Google',\n    apple: 'Apple',\n    github: 'GitHub',\n    microsoft: 'Microsoft',\n    twitter: 'Twitter',\n    facebook: 'Facebook',\n    discord: 'Discord',\n    wechat: 'WeChat',\n    tiktok: 'TikTok',\n    qq: 'QQ',\n    authorize: '승인',\n    authorization: '승인',\n    authorizing: '승인 중...',\n    allowAccess: '접근 허용',\n    denyAccess: '접근 거부',\n    permissions: '권한',\n    requestingPermissions: '다음 권한을 요청합니다',\n    readProfile: '프로필 읽기',\n    readEmail: '이메일 읽기',\n    writeData: '데이터 쓰기',\n    connect: '연결',\n    connected: '연결됨',\n    disconnect: '연결 해제',\n    connectionRequired: '연결 필요',\n    loading: '로딩 중...',\n    redirecting: '리다이렉트 중...',\n    success: '성공',\n    failed: '실패',\n    error: '오류',\n    tryAgain: '다시 시도',\n    linkedAccounts: '연결된 계정',\n    linkAccount: '계정 연결',\n    unlinkAccount: '연결 해제',\n    noLinkedAccounts: '연결된 계정 없음',\n    secureLogin: '보안 로그인',\n    securedBy: '{provider}에 의해 보안됨',\n    termsOfService: '서비스 약관',\n    privacyPolicy: '개인정보 처리방침',\n    byLoggingIn: '로그인하면 다음에 동의하는 것입니다:',\n    and: '및',\n    cancel: '취소',\n    back: '뒤로',\n    continueAs: '{name}(으)로 계속'\n  }\n};\nlet currentLanguage = 'zh';\nfunction setLanguage(lang) {\n  if (SUPPORTED_LANGUAGES.includes(lang)) currentLanguage = lang;\n}\nfunction getLanguage() {\n  return currentLanguage;\n}\nfunction t(key, params = {}) {\n  let text = (messages[currentLanguage] || messages.en)[key] || key;\n  Object.entries(params).forEach(([k, v]) => {\n    text = text.replace(new RegExp(`\\\\{${k}\\\\}`, 'g'), v);\n  });\n  return text;\n}\n\n/**\n * OAuth SDK - React Hooks\n * OAuth授权系统相关的状态管理\n */\n\n\n/**\n * OAuth登录\n */\nfunction useOAuthLogin() {\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState(null);\n  const login = useCallback(async (provider, options = {}) => {\n    try {\n      setLoading(true);\n      setError(null);\n      const {\n        redirectUri,\n        scope,\n        state\n      } = options;\n\n      // 获取授权URL\n      const response = await oauthApi.getAuthUrl({\n        provider,\n        redirectUri: redirectUri || window.location.origin + '/oauth/callback',\n        scope,\n        state\n      });\n\n      // 打开授权窗口或跳转\n      if (options.popup) {\n        return openPopup(response.authUrl, provider);\n      } else {\n        window.location.href = response.authUrl;\n      }\n    } catch (err) {\n      setError(err.message);\n      throw err;\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n  return {\n    login,\n    loading,\n    error\n  };\n}\n\n/**\n * OAuth回调处理\n */\nfunction useOAuthCallback() {\n  const [status, setStatus] = useState('idle'); // idle, loading, success, error\n  const [user, setUser] = useState(null);\n  const [error, setError] = useState(null);\n  const [result, setResult] = useState(null);\n  const handleCallback = useCallback(async (code, state, provider) => {\n    try {\n      setStatus('loading');\n      setError(null);\n      const response = await oauthApi.handleCallback({\n        code,\n        state,\n        provider\n      });\n      setUser(response.user);\n      setResult(response);\n      setStatus('success');\n      return response;\n    } catch (err) {\n      setError(err.message);\n      setStatus('error');\n      throw err;\n    }\n  }, []);\n\n  // 自动处理URL参数\n  useEffect(() => {\n    const params = new URLSearchParams(window.location.search);\n    const code = params.get('code');\n    const state = params.get('state');\n    const provider = params.get('provider');\n    if (code) {\n      handleCallback(code, state, provider);\n    }\n  }, [handleCallback]);\n  return {\n    status,\n    user,\n    error,\n    result,\n    handleCallback\n  };\n}\n\n/**\n * 已关联账户\n */\nfunction useLinkedAccounts() {\n  const [accounts, setAccounts] = useState([]);\n  const [loading, setLoading] = useState(true);\n  const [error, setError] = useState(null);\n  const fetchAccounts = useCallback(async () => {\n    try {\n      setLoading(true);\n      const response = await oauthApi.getLinkedAccounts();\n      setAccounts(response.data || []);\n      setError(null);\n    } catch (err) {\n      setError(err.message);\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n  useEffect(() => {\n    fetchAccounts();\n  }, [fetchAccounts]);\n  const linkAccount = useCallback(async provider => {\n    const response = await oauthApi.getAuthUrl({\n      provider,\n      redirectUri: window.location.origin + '/oauth/link-callback',\n      isLink: true\n    });\n    window.location.href = response.authUrl;\n  }, []);\n  const unlinkAccount = useCallback(async provider => {\n    try {\n      await oauthApi.unlinkAccount(provider);\n      setAccounts(prev => prev.filter(a => a.provider !== provider));\n    } catch (err) {\n      console.error('Unlink error:', err);\n      throw err;\n    }\n  }, []);\n  const isLinked = useCallback(provider => {\n    return accounts.some(a => a.provider === provider);\n  }, [accounts]);\n  return {\n    accounts,\n    loading,\n    error,\n    linkAccount,\n    unlinkAccount,\n    isLinked,\n    refresh: fetchAccounts\n  };\n}\n\n/**\n * OAuth状态\n */\nfunction useOAuthState() {\n  const [isAuthenticated, setIsAuthenticated] = useState(false);\n  const [user, setUser] = useState(null);\n  const [loading, setLoading] = useState(true);\n  const checkAuth = useCallback(async () => {\n    try {\n      setLoading(true);\n      const response = await oauthApi.checkAuth();\n      setIsAuthenticated(response.isAuthenticated);\n      setUser(response.user);\n    } catch (err) {\n      setIsAuthenticated(false);\n      setUser(null);\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n  useEffect(() => {\n    checkAuth();\n  }, [checkAuth]);\n  const logout = useCallback(async () => {\n    try {\n      await oauthApi.logout();\n      setIsAuthenticated(false);\n      setUser(null);\n    } catch (err) {\n      console.error('Logout error:', err);\n    }\n  }, []);\n  return {\n    isAuthenticated,\n    user,\n    loading,\n    logout,\n    refresh: checkAuth\n  };\n}\n\n/**\n * 可用的OAuth提供商\n */\nfunction useOAuthProviders() {\n  const [providers, setProviders] = useState([]);\n  const [loading, setLoading] = useState(true);\n  const fetchProviders = useCallback(async () => {\n    try {\n      setLoading(true);\n      const response = await oauthApi.getProviders();\n      setProviders(response.data || []);\n    } catch (err) {\n      console.error('Get providers error:', err);\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n  useEffect(() => {\n    fetchProviders();\n  }, [fetchProviders]);\n  return {\n    providers,\n    loading\n  };\n}\n\n/**\n * 弹窗登录\n */\nfunction openPopup(url, name) {\n  const width = 500;\n  const height = 600;\n  const left = (window.innerWidth - width) / 2 + window.screenX;\n  const top = (window.innerHeight - height) / 2 + window.screenY;\n  const popup = window.open(url, name, `width=${width},height=${height},left=${left},top=${top}`);\n  return new Promise((resolve, reject) => {\n    const checkClosed = setInterval(() => {\n      if (!popup || popup.closed) {\n        clearInterval(checkClosed);\n        reject(new Error('Login window closed'));\n      }\n    }, 500);\n\n    // 监听消息\n    const handleMessage = event => {\n      if (event.origin !== window.location.origin) return;\n      if (event.data?.type === 'oauth_callback') {\n        clearInterval(checkClosed);\n        window.removeEventListener('message', handleMessage);\n        popup?.close();\n        if (event.data.error) {\n          reject(new Error(event.data.error));\n        } else {\n          resolve(event.data.result);\n        }\n      }\n    };\n    window.addEventListener('message', handleMessage);\n  });\n}\n\n/**\n * OAuth SDK - React 组件\n * OAuth授权系统可视化组件\n */\n\nconst GoogleIcon = /*#__PURE__*/jsxs(\"svg\", {\n  viewBox: \"0 0 24 24\",\n  width: \"18\",\n  height: \"18\",\n  style: {\n    display: 'inline-block',\n    verticalAlign: 'middle'\n  },\n  children: [/*#__PURE__*/jsx(\"path\", {\n    fill: \"#4285F4\",\n    d: \"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    fill: \"#34A853\",\n    d: \"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    fill: \"#FBBC05\",\n    d: \"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.06H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.94l2.85-2.22.81-.63z\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    fill: \"#EA4335\",\n    d: \"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.06l3.66 2.84c.87-2.6 3.3-4.52 6.16-4.52z\"\n  })]\n});\nconst WeChatIcon = /*#__PURE__*/jsx(\"svg\", {\n  viewBox: \"0 0 24 24\",\n  width: \"18\",\n  height: \"18\",\n  fill: \"currentColor\",\n  style: {\n    display: 'inline-block',\n    verticalAlign: 'middle'\n  },\n  children: /*#__PURE__*/jsx(\"path\", {\n    d: \"M8.28 2c-3.844 0-6.963 2.55-6.963 5.7 0 1.776 1.025 3.376 2.662 4.453l-.68 2.457 2.518-1.258c.783.21 1.616.326 2.463.326.31 0 .614-.02.915-.054-.266-.757-.41-1.573-.41-2.424 0-3.693 3.298-6.686 7.367-6.686.347 0 .69.022 1.027.065C16.143 3.253 12.52 2 8.28 2zm10.073 6.963c-3.155 0-5.713 2.186-5.713 4.882 0 2.697 2.558 4.882 5.713 4.882.69 0 1.354-.1 1.979-.278l2.062 1.03-.556-2.015c1.341-.92 2.228-2.288 2.228-3.619 0-2.696-2.558-4.882-5.713-4.882z\"\n  })\n});\nconst TikTokIcon = /*#__PURE__*/jsx(\"svg\", {\n  viewBox: \"0 0 24 24\",\n  width: \"18\",\n  height: \"18\",\n  fill: \"currentColor\",\n  style: {\n    display: 'inline-block',\n    verticalAlign: 'middle'\n  },\n  children: /*#__PURE__*/jsx(\"path\", {\n    d: \"M12.525.02c1.31-.02 2.61-.01 3.91-.02.08 1.53.63 3.09 1.75 4.17 1.12.98 2.63 1.5 4.13 1.63v3.9c-1.4-.04-2.8-.44-3.97-1.24-.26-.17-.5-.36-.73-.56-.02 2.87.01 5.73-.02 8.6-.08 2.54-.97 5.06-2.88 6.74-2.02 1.76-4.91 2.39-7.46 1.71-2.92-.76-5.32-3.23-5.88-6.22-.65-3.48 1.04-7.22 4.19-8.79.87-.43 1.83-.69 2.8-.76V9.67c-1.39.11-2.78.85-3.52 2.03-.89 1.4-.87 3.39.05 4.74.88 1.3 2.5 2.05 4.07 1.82 1.63-.23 3.01-1.63 3.16-3.27.05-1.57.02-3.15.03-4.73V.02h-.47z\"\n  })\n});\nconst AppleIcon = /*#__PURE__*/jsx(\"svg\", {\n  viewBox: \"0 0 24 24\",\n  width: \"18\",\n  height: \"18\",\n  fill: \"currentColor\",\n  style: {\n    display: 'inline-block',\n    verticalAlign: 'middle'\n  },\n  children: /*#__PURE__*/jsx(\"path\", {\n    d: \"M18.71 19.5c-.83 1.24-1.71 2.45-3.05 2.47-1.34.03-1.77-.79-3.29-.79-1.53 0-2 .77-3.27.82-1.31.05-2.3-1.32-3.14-2.53C4.25 17 2.94 12.45 4.7 9.39c.87-1.52 2.43-2.48 4.12-2.51 1.28-.02 2.5.87 3.29.87.78 0 2.26-1.07 3.81-.91.65.03 2.47.26 3.64 1.98-.09.06-2.17 1.28-2.15 3.81.03 3.02 2.65 4.03 2.68 4.04-.03.07-.42 1.44-1.38 2.83M15.97 4.17c.66-.81 1.11-1.93.99-3.06-.96.04-2.13.64-2.82 1.45-.6.69-1.12 1.83-.98 2.94 1.08.08 2.15-.52 2.81-1.33\"\n  })\n});\nconst GithubIcon = /*#__PURE__*/jsx(\"svg\", {\n  viewBox: \"0 0 24 24\",\n  width: \"18\",\n  height: \"18\",\n  fill: \"currentColor\",\n  style: {\n    display: 'inline-block',\n    verticalAlign: 'middle'\n  },\n  children: /*#__PURE__*/jsx(\"path\", {\n    d: \"M12 2C6.477 2 2 6.477 2 12c0 4.42 2.865 8.166 6.839 9.489.5.092.682-.217.682-.482 0-.237-.008-.866-.013-1.7-2.782.603-3.369-1.34-3.369-1.34-.454-1.156-1.11-1.462-1.11-1.462-.908-.62.069-.608.069-.608 1.003.07 1.531 1.03 1.531 1.03.892 1.529 2.341 1.087 2.91.831.092-.646.35-1.086.636-1.336-2.22-.253-4.555-1.11-4.555-4.943 0-1.091.39-1.984 1.029-2.683-.103-.253-.446-1.27.098-2.647 0 0 .84-.269 2.75 1.025A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.294 2.747-1.025 2.747-1.025.546 1.377.203 2.394.1 2.647.64.699 1.028 1.592 1.028 2.683 0 3.842-2.339 4.687-4.566 4.935.359.309.678.919.678 1.852 0 1.336-.012 2.415-.012 2.743 0 .267.18.579.688.481C19.137 20.162 22 16.418 22 12c0-5.523-4.477-10-10-10z\"\n  })\n});\nconst MicrosoftIcon = /*#__PURE__*/jsxs(\"svg\", {\n  viewBox: \"0 0 23 23\",\n  width: \"18\",\n  height: \"18\",\n  style: {\n    display: 'inline-block',\n    verticalAlign: 'middle'\n  },\n  children: [/*#__PURE__*/jsx(\"path\", {\n    fill: \"#f25022\",\n    d: \"M0 0h11v11H0z\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    fill: \"#7fba00\",\n    d: \"M12 0h11v11H12z\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    fill: \"#00a4ef\",\n    d: \"M0 12h11v11H0z\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    fill: \"#ffb900\",\n    d: \"M12 12h11v11H12z\"\n  })]\n});\n\n// 提供商图标\nconst providerIcons = {\n  google: GoogleIcon,\n  apple: AppleIcon,\n  github: GithubIcon,\n  microsoft: MicrosoftIcon,\n  wechat: WeChatIcon,\n  tiktok: TikTokIcon\n};\n\n// 提供商品牌色\nconst providerColors = {\n  google: '#ffffff',\n  // Google 官方底色常为白色\n  apple: '#000000',\n  github: '#24292e',\n  microsoft: '#ffffff',\n  twitter: '#1da1f2',\n  facebook: '#1877f2',\n  discord: '#5865f2',\n  wechat: '#07c160',\n  tiktok: '#000000',\n  qq: '#12b7f5'\n};\n\n/**\n * 第三方登录按钮\n */\nfunction OAuthButton({\n  provider,\n  variant = 'default',\n  onSuccess,\n  onError,\n  onClick\n}) {\n  const {\n    login,\n    loading\n  } = useOAuthLogin();\n  const handleClick = useCallback(async e => {\n    if (onClick) {\n      onClick(e);\n      return;\n    }\n    try {\n      const result = await login(provider, {\n        popup: true\n      });\n      onSuccess?.(result);\n    } catch (err) {\n      onError?.(err);\n    }\n  }, [login, provider, onSuccess, onError, onClick]);\n  const icon = providerIcons[provider] || '🔐';\n  const color = providerColors[provider];\n  return /*#__PURE__*/jsxs(\"button\", {\n    className: `eco-oauth-btn eco-oauth-btn-${variant} eco-oauth-btn-${provider}`,\n    onClick: handleClick,\n    disabled: loading,\n    style: variant === 'brand' ? {\n      backgroundColor: color\n    } : undefined,\n    children: [/*#__PURE__*/jsx(\"span\", {\n      className: \"eco-oauth-btn-icon\",\n      children: icon\n    }), /*#__PURE__*/jsx(\"span\", {\n      className: \"eco-oauth-btn-text\",\n      children: loading ? t('loading') : t('loginWith', {\n        provider: t(provider)\n      })\n    })]\n  });\n}\n\n/**\n * 登录按钮组\n */\nfunction OAuthButtonGroup({\n  providers = ['google', 'apple', 'microsoft'],\n  variant = 'default',\n  onSuccess,\n  onError\n}) {\n  return /*#__PURE__*/jsx(\"div\", {\n    className: \"eco-oauth-btn-group\",\n    children: providers.map(provider => /*#__PURE__*/jsx(OAuthButton, {\n      provider: provider,\n      variant: variant,\n      onSuccess: onSuccess,\n      onError: onError\n    }, provider))\n  });\n}\n\n/**\n * 图标按钮组\n */\nfunction OAuthIconGroup({\n  providers = ['google', 'apple', 'microsoft'],\n  onSuccess,\n  onError\n}) {\n  const {\n    login,\n    loading\n  } = useOAuthLogin();\n  const handleClick = useCallback(async provider => {\n    try {\n      const result = await login(provider, {\n        popup: true\n      });\n      onSuccess?.(result);\n    } catch (err) {\n      onError?.(err);\n    }\n  }, [login, onSuccess, onError]);\n  return /*#__PURE__*/jsx(\"div\", {\n    className: \"eco-oauth-icon-group\",\n    children: providers.map(provider => /*#__PURE__*/jsx(\"button\", {\n      className: `eco-oauth-icon-btn eco-oauth-icon-${provider}`,\n      onClick: () => handleClick(provider),\n      disabled: loading,\n      title: t(provider),\n      style: {\n        backgroundColor: providerColors[provider]\n      },\n      children: providerIcons[provider] || '🔐'\n    }, provider))\n  });\n}\n\n/**\n * OAuth回调页面\n */\nfunction OAuthCallbackPage({\n  onSuccess,\n  onError\n}) {\n  const {\n    status,\n    user,\n    error,\n    result\n  } = useOAuthCallback();\n  if (status === 'loading') {\n    return /*#__PURE__*/jsx(\"div\", {\n      className: \"eco-oauth-callback\",\n      children: /*#__PURE__*/jsxs(\"div\", {\n        className: \"eco-oauth-callback-loading\",\n        children: [/*#__PURE__*/jsx(\"div\", {\n          className: \"eco-oauth-spinner\"\n        }), /*#__PURE__*/jsx(\"span\", {\n          children: t('authorizing')\n        })]\n      })\n    });\n  }\n  if (status === 'error') {\n    onError?.(error);\n    return /*#__PURE__*/jsx(\"div\", {\n      className: \"eco-oauth-callback\",\n      children: /*#__PURE__*/jsxs(\"div\", {\n        className: \"eco-oauth-callback-error\",\n        children: [/*#__PURE__*/jsx(\"span\", {\n          className: \"eco-oauth-callback-icon\",\n          children: \"\\u274C\"\n        }), /*#__PURE__*/jsx(\"h3\", {\n          children: t('failed')\n        }), /*#__PURE__*/jsx(\"p\", {\n          children: error\n        }), /*#__PURE__*/jsx(\"button\", {\n          onClick: () => window.close(),\n          children: t('back')\n        })]\n      })\n    });\n  }\n  if (status === 'success') {\n    onSuccess?.(result);\n\n    // 如果在弹窗中，发送消息给父窗口\n    if (window.opener) {\n      window.opener.postMessage({\n        type: 'oauth_callback',\n        result: result\n      }, window.location.origin);\n    }\n    return /*#__PURE__*/jsx(\"div\", {\n      className: \"eco-oauth-callback\",\n      children: /*#__PURE__*/jsxs(\"div\", {\n        className: \"eco-oauth-callback-success\",\n        children: [/*#__PURE__*/jsx(\"span\", {\n          className: \"eco-oauth-callback-icon\",\n          children: \"\\u2705\"\n        }), /*#__PURE__*/jsx(\"h3\", {\n          children: t('success')\n        }), /*#__PURE__*/jsx(\"p\", {\n          children: t('continueAs', {\n            name: user?.display_name || user?.name\n          })\n        })]\n      })\n    });\n  }\n  return null;\n}\n\n/**\n * 已关联账户列表\n */\nfunction LinkedAccountsList() {\n  const {\n    accounts,\n    loading,\n    unlinkAccount,\n    isLinked,\n    linkAccount\n  } = useLinkedAccounts();\n  const {\n    providers\n  } = useOAuthProviders();\n  if (loading) {\n    return /*#__PURE__*/jsx(\"div\", {\n      className: \"eco-oauth-linked eco-oauth-loading\",\n      children: /*#__PURE__*/jsx(\"div\", {\n        className: \"eco-oauth-spinner\"\n      })\n    });\n  }\n  return /*#__PURE__*/jsxs(\"div\", {\n    className: \"eco-oauth-linked\",\n    children: [/*#__PURE__*/jsx(\"h4\", {\n      children: t('linkedAccounts')\n    }), accounts.length === 0 ? /*#__PURE__*/jsx(\"div\", {\n      className: \"eco-oauth-linked-empty\",\n      children: t('noLinkedAccounts')\n    }) : /*#__PURE__*/jsx(\"div\", {\n      className: \"eco-oauth-linked-list\",\n      children: accounts.map(account => /*#__PURE__*/jsxs(\"div\", {\n        className: \"eco-oauth-linked-item\",\n        children: [/*#__PURE__*/jsx(\"span\", {\n          className: \"eco-oauth-linked-icon\",\n          style: {\n            backgroundColor: providerColors[account.provider]\n          },\n          children: providerIcons[account.provider]\n        }), /*#__PURE__*/jsxs(\"div\", {\n          className: \"eco-oauth-linked-info\",\n          children: [/*#__PURE__*/jsx(\"span\", {\n            className: \"eco-oauth-linked-name\",\n            children: t(account.provider)\n          }), /*#__PURE__*/jsx(\"span\", {\n            className: \"eco-oauth-linked-email\",\n            children: account.email\n          })]\n        }), /*#__PURE__*/jsx(\"button\", {\n          className: \"eco-oauth-unlink-btn\",\n          onClick: () => unlinkAccount(account.provider),\n          children: t('unlinkAccount')\n        })]\n      }, account.provider))\n    }), /*#__PURE__*/jsxs(\"div\", {\n      className: \"eco-oauth-link-more\",\n      children: [/*#__PURE__*/jsx(\"h5\", {\n        children: t('linkAccount')\n      }), /*#__PURE__*/jsx(\"div\", {\n        className: \"eco-oauth-link-options\",\n        children: providers.filter(p => !isLinked(p.id)).map(p => /*#__PURE__*/jsx(OAuthButton, {\n          provider: p.id,\n          variant: \"outline\",\n          onClick: () => linkAccount(p.id)\n        }, p.id))\n      })]\n    })]\n  });\n}\n\n/**\n * 登录模态框\n */\nfunction OAuthLoginModal({\n  isOpen,\n  onClose,\n  onSuccess\n}) {\n  if (!isOpen) return null;\n  return /*#__PURE__*/jsxs(\"div\", {\n    className: \"eco-oauth-modal\",\n    children: [/*#__PURE__*/jsx(\"div\", {\n      className: \"eco-oauth-modal-overlay\",\n      onClick: onClose\n    }), /*#__PURE__*/jsxs(\"div\", {\n      className: \"eco-oauth-modal-content\",\n      children: [/*#__PURE__*/jsx(\"button\", {\n        className: \"eco-oauth-modal-close\",\n        onClick: onClose,\n        children: \"\\xD7\"\n      }), /*#__PURE__*/jsx(\"h2\", {\n        children: t('login')\n      }), /*#__PURE__*/jsx(OAuthButtonGroup, {\n        providers: ['google', 'apple', 'microsoft'],\n        variant: \"brand\",\n        onSuccess: result => {\n          onSuccess?.(result);\n          onClose();\n        }\n      }), /*#__PURE__*/jsx(\"div\", {\n        className: \"eco-oauth-modal-divider\",\n        children: /*#__PURE__*/jsx(\"span\", {\n          children: \"\\u6216\"\n        })\n      }), /*#__PURE__*/jsx(OAuthIconGroup, {\n        providers: ['facebook', 'discord', 'twitter'],\n        onSuccess: result => {\n          onSuccess?.(result);\n          onClose();\n        }\n      }), /*#__PURE__*/jsxs(\"div\", {\n        className: \"eco-oauth-modal-footer\",\n        children: [/*#__PURE__*/jsx(\"span\", {\n          children: t('byLoggingIn')\n        }), /*#__PURE__*/jsx(\"a\", {\n          href: \"/terms\",\n          children: t('termsOfService')\n        }), /*#__PURE__*/jsx(\"span\", {\n          children: t('and')\n        }), /*#__PURE__*/jsx(\"a\", {\n          href: \"/privacy\",\n          children: t('privacyPolicy')\n        })]\n      })]\n    })]\n  });\n}\n\n/**\n * @quantabit/oauth-sdk\n * OAuth System SDK - Full Version\n */\n\nconst getAuthUrl = (...args) => oauthApi.getAuthUrl(...args);\nconst handleCallback = (...args) => oauthApi.handleCallback(...args);\nconst checkAuth = (...args) => oauthApi.checkAuth(...args);\nconst logout = (...args) => oauthApi.logout(...args);\nconst getLinkedAccounts = (...args) => oauthApi.getLinkedAccounts(...args);\n\nexport { BindingStatus, ConnectionStatus, LinkedAccountsList, OAuthApiClient, OAuthButton, OAuthButtonGroup, OAuthCallbackPage, OAuthIconGroup, OAuthLoginModal, OAuthProvider, OAuthScope, SUPPORTED_LANGUAGES, checkAuth, getAuthUrl, getLanguage, getLinkedAccounts, handleCallback, logout, messages, oauthApi, setLanguage, t, useLinkedAccounts, useOAuthCallback, useOAuthLogin, useOAuthProviders, useOAuthState };\n//# sourceMappingURL=index.esm.js.map\n","'use client';\nimport { useState, useRef, useEffect, useCallback, useMemo, useContext, createContext } from 'react';\nimport ReactDOM from 'react-dom';\nimport { BaseApiClient, subscribeConfig, getConfig } from '@quantabit/sdk-config';\nimport { jsxs, jsx, Fragment } from 'react/jsx-runtime';\nimport { OAuthIconGroup } from '@quantabit/oauth-sdk';\nimport { QBitConnection, broadcastQBitAnchor, verifyAnchoredMemo as verifyAnchoredMemo$1, buildQBitAnchorMemo as buildQBitAnchorMemo$2, createQBitAnchorTransaction } from '@quantabit/qbit-chain-sdk';\n\n/**\n * QuantaBit Auth API Service\n * \n * 核心认证 API 服务，支持多种登录方式：\n * - 钱包登录 (MetaMask, WalletConnect, Coinbase)\n * - DID 密码登录\n * - 邮箱注册登录\n * \n * 使用 BaseApiClient 基类实现统一配置\n */\n\n\n/**\n * 认证 API 客户端\n * 继承 BaseApiClient 并扩展认证特性\n */\nclass AuthApiClient extends BaseApiClient {\n  constructor(config = {}) {\n    super('', config); // 禁用自动模块路径，使用显式控制\n    this.onTokenRefresh = config.onTokenRefresh;\n    this.onAuthError = config.onAuthError;\n\n    // 认证相关的存储 key（可配置）\n    this._tokenKey = config.tokenStorageKey || 'qbit_did_access_token';\n    this._refreshTokenKey = config.refreshTokenStorageKey || 'qbit_did_refresh_token';\n    this._currentSessionKey = config.currentSessionKey || 'qbit_did_current';\n  }\n\n  /**\n   * 配置 API 基础 URL 和回调\n   * @param {Object} config - 配置对象\n   * @param {string} config.apiBaseUrl - API 基础 URL\n   */\n  configure(config = {}) {\n    if (config.apiBaseUrl) {\n      this.setBaseUrl(config.apiBaseUrl);\n    }\n    this.configureCallbacks(config);\n  }\n\n  /**\n   * 配置回调\n   * @param {Object} config - 配置对象\n   */\n  configureCallbacks(config) {\n    if (config.onTokenRefresh) this.onTokenRefresh = config.onTokenRefresh;\n    if (config.onAuthError) this.onAuthError = config.onAuthError;\n  }\n\n  // ============ 认证方法 ============\n\n  /**\n   * 获取钱包签名 nonce\n   */\n  async getNonce(walletAddress, chainType = 'quantabit') {\n    return this.post('/auth/nonce', {\n      wallet_address: walletAddress,\n      chain_type: chainType\n    });\n  }\n\n  /**\n   * 钱包登录\n   */\n  async walletLogin(walletAddress, signature, message, chainType = 'quantabit') {\n    const result = await this.post('/auth/wallet', {\n      wallet_address: walletAddress,\n      signature,\n      message,\n      chain_type: chainType\n    });\n    if (result.access_token) {\n      this.setTokens(result.access_token, result.refresh_token);\n    }\n    return result;\n  }\n\n  /**\n   * DID 密码登录\n   */\n  async didLogin(did, password, pin = null, totpCode = null) {\n    const result = await this.post('/auth/did-login', {\n      did: did.trim(),\n      password,\n      pin,\n      totp_code: totpCode\n    });\n    if (result.access_token) {\n      this.setTokens(result.access_token, result.refresh_token);\n    }\n    return result;\n  }\n\n  /**\n   * 邮箱注册\n   */\n  async register(data) {\n    const result = await this.post('/auth/register', {\n      display_name: data.displayName || data.nickname,\n      email: data.email || undefined,\n      password: data.password\n    });\n    if (result.access_token) {\n      this.setTokens(result.access_token, result.refresh_token);\n    }\n    return result;\n  }\n\n  /**\n   * 刷新 Token\n   */\n  async refreshAuthToken(refreshToken) {\n    const result = await this.post('/auth/refresh', {\n      refresh_token: refreshToken\n    });\n    if (result.access_token) {\n      this.setTokens(result.access_token, result.refresh_token);\n    }\n    return result;\n  }\n\n  /**\n   * 登出\n   */\n  async logout() {\n    try {\n      await this.post('/auth/logout', {});\n    } catch (e) {\n      // 忽略登出错误\n    }\n    this.clearTokens();\n  }\n\n  /**\n   * 获取当前用户信息\n   */\n  async getMe() {\n    return this.get('/profile/me');\n  }\n  async setPin(did, password, pin) {\n    return this.post('/auth/set-pin', {\n      did,\n      password,\n      pin\n    });\n  }\n\n  // ============ Token 管理（扩展） ============\n\n  /**\n   * 获取刷新 Token\n   */\n  getRefreshToken() {\n    if (typeof window === 'undefined') return null;\n    return localStorage.getItem(this._refreshTokenKey);\n  }\n\n  /**\n   * 设置 Tokens\n   */\n  setTokens(accessToken, refreshToken) {\n    if (typeof window === 'undefined') return;\n\n    // 使用可配置的 token 存储键\n    localStorage.setItem(this._tokenKey, accessToken);\n    if (refreshToken) {\n      localStorage.setItem(this._refreshTokenKey, refreshToken);\n    }\n    this.onTokenRefresh?.({\n      accessToken,\n      refreshToken\n    });\n  }\n\n  /**\n   * 清除所有 Token\n   */\n  clearTokens() {\n    if (typeof window === 'undefined') return;\n    localStorage.removeItem(this._tokenKey);\n    localStorage.removeItem(this._refreshTokenKey);\n    localStorage.removeItem(this._currentSessionKey);\n  }\n\n  /**\n   * 检查是否已认证\n   */\n  isAuthenticated() {\n    return !!this.getToken();\n  }\n\n  // ============ 多账户支持 ============\n\n  /**\n   * 获取当前会话标识\n   */\n  getCurrentSession() {\n    if (typeof window === 'undefined') return null;\n    return localStorage.getItem(this._currentSessionKey);\n  }\n\n  /**\n   * 设置当前会话标识\n   */\n  setCurrentSession(sessionId) {\n    if (typeof window === 'undefined') return;\n    localStorage.setItem(this._currentSessionKey, sessionId);\n  }\n}\n\n// 创建默认实例\nconst authApi = new AuthApiClient();\n\n/**\n * QuantaBit Auth SDK - 图标组件\n * \n * 内置 SVG 图标，无需外部依赖\n */\n\nconst ShieldIcon = ({\n  size = 20,\n  className = ''\n}) => /*#__PURE__*/jsxs(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: \"2\",\n  className: className,\n  children: [/*#__PURE__*/jsx(\"path\", {\n    d: \"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M9 12l2 2 4-4\",\n    strokeLinecap: \"round\",\n    strokeLinejoin: \"round\"\n  })]\n});\n\n// Lock 锁图标\nconst LockIcon = ({\n  size = 16,\n  className = ''\n}) => /*#__PURE__*/jsxs(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: \"2\",\n  className: className,\n  children: [/*#__PURE__*/jsx(\"rect\", {\n    x: \"3\",\n    y: \"11\",\n    width: \"18\",\n    height: \"11\",\n    rx: \"2\",\n    ry: \"2\"\n  }), /*#__PURE__*/jsx(\"circle\", {\n    cx: \"12\",\n    cy: \"16\",\n    r: \"1\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M7 11V7a5 5 0 0110 0v4\"\n  })]\n});\n\n// Verified 验证徽章\nconst VerifiedIcon = ({\n  size = 14,\n  className = ''\n}) => /*#__PURE__*/jsx(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"#22c55e\",\n  className: className,\n  children: /*#__PURE__*/jsx(\"path\", {\n    d: \"M12 2L3.5 6.5v5.9c0 5.1 3.6 9.9 8.5 11.1 4.9-1.2 8.5-6 8.5-11.1V6.5L12 2zm-1 14l-4-4 1.4-1.4 2.6 2.6 5.6-5.6L18 9l-7 7z\"\n  })\n});\n\n// Wallet 钱包图标\nconst WalletIcon = ({\n  size = 20,\n  className = ''\n}) => /*#__PURE__*/jsxs(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: \"2\",\n  className: className,\n  children: [/*#__PURE__*/jsx(\"path\", {\n    d: \"M20 12V8H6a2 2 0 01-2-2c0-1.1.9-2 2-2h12v4\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M4 6v12a2 2 0 002 2h14a2 2 0 002-2v-6\"\n  }), /*#__PURE__*/jsx(\"circle\", {\n    cx: \"18\",\n    cy: \"12\",\n    r: \"2\"\n  })]\n});\n\n// Mail 邮箱图标\nconst MailIcon = ({\n  size = 20,\n  className = ''\n}) => /*#__PURE__*/jsxs(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: \"2\",\n  className: className,\n  children: [/*#__PURE__*/jsx(\"path\", {\n    d: \"M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z\"\n  }), /*#__PURE__*/jsx(\"polyline\", {\n    points: \"22,6 12,13 2,6\"\n  })]\n});\n\n// Fingerprint 指纹图标\nconst FingerprintIcon = ({\n  size = 20,\n  className = ''\n}) => /*#__PURE__*/jsxs(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: \"2\",\n  className: className,\n  children: [/*#__PURE__*/jsx(\"path\", {\n    d: \"M2 12C2 6.5 6.5 2 12 2a10 10 0 0 1 8 4\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M5 19.5C5.5 18 6 15 6 12c0-.7.12-1.37.34-2\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M17.29 21.02c.12-.6.43-2.3.5-3.02\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M12 10a2 2 0 0 0-2 2c0 1.02-.1 2.51-.26 4\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M8.65 22c.21-.66.45-1.32.57-2\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M14 13.12c0 2.38 0 6.38-1 8.88\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M2 16h.01\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M21.8 16c.2-2 .131-5.354 0-6\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M9 6.8a6 6 0 0 1 9 5.2c0 .47 0 1.17-.02 2\"\n  })]\n});\n\n// User 用户图标\nconst UserIcon = ({\n  size = 20,\n  className = ''\n}) => /*#__PURE__*/jsxs(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: \"2\",\n  className: className,\n  children: [/*#__PURE__*/jsx(\"path\", {\n    d: \"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"\n  }), /*#__PURE__*/jsx(\"circle\", {\n    cx: \"12\",\n    cy: \"7\",\n    r: \"4\"\n  })]\n});\n\n// Loader 加载图标\nconst LoaderIcon = ({\n  size = 20,\n  className = ''\n}) => /*#__PURE__*/jsx(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: \"2\",\n  className: `did-spin ${className}`,\n  children: /*#__PURE__*/jsx(\"path\", {\n    d: \"M21 12a9 9 0 1 1-6.219-8.56\"\n  })\n});\n\n// Check 勾选图标\nconst CheckIcon = ({\n  size = 20,\n  className = ''\n}) => /*#__PURE__*/jsx(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: \"2\",\n  className: className,\n  children: /*#__PURE__*/jsx(\"polyline\", {\n    points: \"20 6 9 17 4 12\"\n  })\n});\n\n// Alert 警告图标\nconst AlertIcon = ({\n  size = 20,\n  className = ''\n}) => /*#__PURE__*/jsxs(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: \"2\",\n  className: className,\n  children: [/*#__PURE__*/jsx(\"circle\", {\n    cx: \"12\",\n    cy: \"12\",\n    r: \"10\"\n  }), /*#__PURE__*/jsx(\"line\", {\n    x1: \"12\",\n    y1: \"8\",\n    x2: \"12\",\n    y2: \"12\"\n  }), /*#__PURE__*/jsx(\"line\", {\n    x1: \"12\",\n    y1: \"16\",\n    x2: \"12.01\",\n    y2: \"16\"\n  })]\n});\n\n// ArrowRight 箭头图标\nconst ArrowRightIcon = ({\n  size = 20,\n  className = ''\n}) => /*#__PURE__*/jsxs(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: \"2\",\n  className: className,\n  children: [/*#__PURE__*/jsx(\"line\", {\n    x1: \"5\",\n    y1: \"12\",\n    x2: \"19\",\n    y2: \"12\"\n  }), /*#__PURE__*/jsx(\"polyline\", {\n    points: \"12 5 19 12 12 19\"\n  })]\n});\n\n// Eye 眼睛图标\nconst EyeIcon = ({\n  size = 18,\n  className = ''\n}) => /*#__PURE__*/jsxs(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: \"2\",\n  className: className,\n  children: [/*#__PURE__*/jsx(\"path\", {\n    d: \"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"\n  }), /*#__PURE__*/jsx(\"circle\", {\n    cx: \"12\",\n    cy: \"12\",\n    r: \"3\"\n  })]\n});\n\n// EyeOff 隐藏眼睛图标\nconst EyeOffIcon = ({\n  size = 18,\n  className = ''\n}) => /*#__PURE__*/jsxs(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: \"2\",\n  className: className,\n  children: [/*#__PURE__*/jsx(\"path\", {\n    d: \"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\"\n  }), /*#__PURE__*/jsx(\"line\", {\n    x1: \"1\",\n    y1: \"1\",\n    x2: \"23\",\n    y2: \"23\"\n  })]\n});\n\n// Close 关闭图标\nconst CloseIcon = ({\n  size = 20,\n  className = ''\n}) => /*#__PURE__*/jsx(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: \"2\",\n  className: className,\n  children: /*#__PURE__*/jsx(\"path\", {\n    d: \"M18 6L6 18M6 6l12 12\"\n  })\n});\n\n// Swap 切换图标\nconst SwapIcon = ({\n  size = 18,\n  className = ''\n}) => /*#__PURE__*/jsxs(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: \"2\",\n  className: className,\n  children: [/*#__PURE__*/jsx(\"polyline\", {\n    points: \"16 3 21 3 21 8\"\n  }), /*#__PURE__*/jsx(\"line\", {\n    x1: \"4\",\n    y1: \"20\",\n    x2: \"21\",\n    y2: \"3\"\n  }), /*#__PURE__*/jsx(\"polyline\", {\n    points: \"21 16 21 21 16 21\"\n  }), /*#__PURE__*/jsx(\"line\", {\n    x1: \"15\",\n    y1: \"15\",\n    x2: \"21\",\n    y2: \"21\"\n  })]\n});\n\n// Plus 加号图标\nconst PlusIcon = ({\n  size = 18,\n  className = ''\n}) => /*#__PURE__*/jsxs(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: \"2\",\n  className: className,\n  children: [/*#__PURE__*/jsx(\"line\", {\n    x1: \"12\",\n    y1: \"5\",\n    x2: \"12\",\n    y2: \"19\"\n  }), /*#__PURE__*/jsx(\"line\", {\n    x1: \"5\",\n    y1: \"12\",\n    x2: \"19\",\n    y2: \"12\"\n  })]\n});\n\n// Trash 删除图标\nconst TrashIcon = ({\n  size = 16,\n  className = ''\n}) => /*#__PURE__*/jsxs(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: \"2\",\n  className: className,\n  children: [/*#__PURE__*/jsx(\"polyline\", {\n    points: \"3 6 5 6 21 6\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"\n  }), /*#__PURE__*/jsx(\"line\", {\n    x1: \"10\",\n    y1: \"11\",\n    x2: \"10\",\n    y2: \"17\"\n  }), /*#__PURE__*/jsx(\"line\", {\n    x1: \"14\",\n    y1: \"11\",\n    x2: \"14\",\n    y2: \"17\"\n  })]\n});\n\n// Logout 登出图标\nconst LogoutIcon = ({\n  size = 18,\n  className = ''\n}) => /*#__PURE__*/jsxs(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: \"2\",\n  className: className,\n  children: [/*#__PURE__*/jsx(\"path\", {\n    d: \"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\"\n  }), /*#__PURE__*/jsx(\"polyline\", {\n    points: \"16 17 21 12 16 7\"\n  }), /*#__PURE__*/jsx(\"line\", {\n    x1: \"21\",\n    y1: \"12\",\n    x2: \"9\",\n    y2: \"12\"\n  })]\n});\n\n// ============ Wallet Icons ============\n\nconst MetaMaskIcon$1 = () => /*#__PURE__*/jsxs(\"svg\", {\n  width: \"32\",\n  height: \"32\",\n  viewBox: \"0 0 32 32\",\n  children: [/*#__PURE__*/jsx(\"path\", {\n    fill: \"#E17726\",\n    d: \"M27.2 4L16.8 11.6l1.9-4.5z\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    fill: \"#E27625\",\n    d: \"M4.8 4l10.3 7.7-1.8-5.2zM23.5 21.5l-2.7 6 5.8-1.9-.7-4.1zM5.4 25.6l5.8 1.9-2.7-6z\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    fill: \"#E27625\",\n    d: \"M10.9 14l-2.4 3.5 8.5.4-.3-9.2zM21.1 14l-5.7-5.3-.2 9.2 8.5-.4z\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    fill: \"#D5BFB2\",\n    d: \"M11.2 27.5l5-2.5-4.3-3.4zM15.8 25l5 2.5-.7-5.9z\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    fill: \"#233447\",\n    d: \"M20.8 27.5l-5-2.5.4 3.3-.1 1.4zM11.2 27.5l4.7 2.2-.1-1.4.4-3.3z\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    fill: \"#CD6116\",\n    d: \"M16 19.8l-4.2-1.2 3-.5zM16 19.8l1.2-1.7 3 .5z\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    fill: \"#E27625\",\n    d: \"M11.2 27.5l.7-6-3.4.1zM20.1 21.5l.7 6 2.7-5.9zM23.5 17.5l-8.5.4.8 4.9 1.2-1.7 3 .5zM11.8 18.6l3-.5 1.2 1.7.8-4.9-8.5-.4z\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    fill: \"#F6851B\",\n    d: \"M8.5 17.5l3.5 6.9-.2-3.8zM20.2 20.6l-.2 3.8 3.5-6.9zM17 17.9l-.8 4.9 1 5.2.2-6.9zM15 17.9l-.4 3.2.2 6.9 1-5.2z\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    fill: \"#C0AD9E\",\n    d: \"M15.9 29.7l.1-1.4-.4-.3h-4l-.4.3.1 1.4-4.7-2.2 1.6 1.3 3.3 2.3h4.1l3.3-2.3 1.6-1.3z\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    fill: \"#161616\",\n    d: \"M15.8 25l-5-2.5-.7-.6.4-.3 4.3 3.4zM16.2 25l5-2.5-.7.6.4.3-4.3-3.4z\"\n  })]\n});\nconst WalletConnectIcon$1 = () => /*#__PURE__*/jsxs(\"svg\", {\n  width: \"32\",\n  height: \"32\",\n  viewBox: \"0 0 32 32\",\n  children: [/*#__PURE__*/jsx(\"circle\", {\n    cx: \"16\",\n    cy: \"16\",\n    r: \"14\",\n    fill: \"#3B99FC\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    fill: \"white\",\n    d: \"M10.5 12.5c3-3 7.9-3 10.9 0l.4.4c.2.1.2.4 0 .5l-1.2 1.2c0 .1-.1.1-.2 0l-.5-.5c-2.1-2-5.5-2-7.6 0l-.5.5c-.1.1-.2.1-.3 0l-1.2-1.2c-.1-.1-.1-.4 0-.5l.2-.4zm13.5 2.5l1.1 1c.1.2.1.4 0 .5l-5 4.8c-.1.2-.4.2-.5 0l-3.6-3.4c0 0-.1 0-.1 0l-3.6 3.4c-.1.2-.4.2-.5 0l-5-4.8c-.1-.1-.1-.3 0-.5l1.1-1c.1-.2.4-.2.5 0l3.6 3.4c0 0 .1 0 .1 0l3.6-3.4c.1-.2.4-.2.5 0l3.6 3.4c0 0 .1 0 .1 0l3.6-3.4c.1-.2.4-.2.5 0z\"\n  })]\n});\nconst CoinbaseIcon = () => /*#__PURE__*/jsxs(\"svg\", {\n  width: \"32\",\n  height: \"32\",\n  viewBox: \"0 0 32 32\",\n  children: [/*#__PURE__*/jsx(\"circle\", {\n    cx: \"16\",\n    cy: \"16\",\n    r: \"14\",\n    fill: \"#0052FF\"\n  }), /*#__PURE__*/jsx(\"circle\", {\n    cx: \"16\",\n    cy: \"16\",\n    r: \"8\",\n    fill: \"white\"\n  }), /*#__PURE__*/jsx(\"circle\", {\n    cx: \"16\",\n    cy: \"16\",\n    r: \"4\",\n    fill: \"#0052FF\"\n  })]\n});\nconst QBitIcon = () => /*#__PURE__*/jsxs(\"svg\", {\n  viewBox: \"0 0 40 40\",\n  width: \"32\",\n  height: \"32\",\n  children: [/*#__PURE__*/jsx(\"defs\", {\n    children: /*#__PURE__*/jsxs(\"linearGradient\", {\n      id: \"qbit-grad-icon\",\n      x1: \"0%\",\n      y1: \"0%\",\n      x2: \"100%\",\n      y2: \"100%\",\n      children: [/*#__PURE__*/jsx(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#7C3AED\"\n      }), /*#__PURE__*/jsx(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#6366F1\"\n      })]\n    })\n  }), /*#__PURE__*/jsx(\"rect\", {\n    width: \"40\",\n    height: \"40\",\n    rx: \"10\",\n    fill: \"url(#qbit-grad-icon)\"\n  }), /*#__PURE__*/jsx(\"circle\", {\n    cx: \"20\",\n    cy: \"20\",\n    r: \"8\",\n    fill: \"none\",\n    stroke: \"#fff\",\n    strokeWidth: \"2.5\"\n  }), /*#__PURE__*/jsx(\"circle\", {\n    cx: \"20\",\n    cy: \"20\",\n    r: \"3\",\n    fill: \"#fff\"\n  }), /*#__PURE__*/jsx(\"circle\", {\n    cx: \"25\",\n    cy: \"25\",\n    r: \"2.5\",\n    fill: \"url(#qbit-grad-icon)\",\n    stroke: \"#fff\",\n    strokeWidth: \"1.5\"\n  })]\n});\nconst TrustWalletIcon$1 = () => /*#__PURE__*/jsxs(\"svg\", {\n  viewBox: \"0 0 40 40\",\n  width: \"32\",\n  height: \"32\",\n  children: [/*#__PURE__*/jsx(\"rect\", {\n    width: \"40\",\n    height: \"40\",\n    rx: \"10\",\n    fill: \"#0500FF\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M20 10c0 0 7.5 3.5 7.5 10.5 0 7-7.5 11.5-7.5 11.5s-7.5-4.5-7.5-11.5C12.5 13.5 20 10 20 10z\",\n    fill: \"none\",\n    stroke: \"#fff\",\n    strokeWidth: \"2\",\n    strokeLinecap: \"round\",\n    strokeLinejoin: \"round\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M20 14c0 0 4.5 2.5 4.5 6.5 0 4-4.5 7-4.5 7s-4.5-3-4.5-7C15.5 16.5 20 14 20 14z\",\n    fill: \"#fff\",\n    opacity: \"0.3\"\n  })]\n});\n\n// Zap 闪电图标\nconst ZapIcon = ({\n  size = 16,\n  className = ''\n}) => /*#__PURE__*/jsx(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"currentColor\",\n  className: className,\n  children: /*#__PURE__*/jsx(\"polygon\", {\n    points: \"13 2 3 14 12 14 11 22 21 10 12 10 13 2\"\n  })\n});\n\n// ChevronDown 下拉箭头\nconst ChevronDownIcon = ({\n  size = 16,\n  className = ''\n}) => /*#__PURE__*/jsx(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: \"2\",\n  className: className,\n  style: {\n    transition: 'transform 0.2s ease'\n  },\n  children: /*#__PURE__*/jsx(\"polyline\", {\n    points: \"6 9 12 15 18 9\"\n  })\n});\n\n// Settings 设置图标\nconst SettingsIcon = ({\n  size = 18,\n  className = ''\n}) => /*#__PURE__*/jsxs(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: \"2\",\n  className: className,\n  children: [/*#__PURE__*/jsx(\"circle\", {\n    cx: \"12\",\n    cy: \"12\",\n    r: \"3\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z\"\n  })]\n});\n\n// IdCard 身份证图标\nconst IdCardIcon = ({\n  size = 18,\n  className = ''\n}) => /*#__PURE__*/jsxs(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: \"2\",\n  className: className,\n  children: [/*#__PURE__*/jsx(\"rect\", {\n    x: \"2\",\n    y: \"4\",\n    width: \"20\",\n    height: \"16\",\n    rx: \"2\"\n  }), /*#__PURE__*/jsx(\"circle\", {\n    cx: \"8\",\n    cy: \"10\",\n    r: \"2\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M8 14a3 3 0 0 0-3 3h6a3 3 0 0 0-3-3z\"\n  }), /*#__PURE__*/jsx(\"line\", {\n    x1: \"14\",\n    y1: \"9\",\n    x2: \"20\",\n    y2: \"9\"\n  }), /*#__PURE__*/jsx(\"line\", {\n    x1: \"14\",\n    y1: \"13\",\n    x2: \"18\",\n    y2: \"13\"\n  })]\n});\n\n// Star 星星图标\nconst StarIcon = ({\n  size = 18,\n  className = ''\n}) => /*#__PURE__*/jsx(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: \"2\",\n  className: className,\n  children: /*#__PURE__*/jsx(\"polygon\", {\n    points: \"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\"\n  })\n});\n\n// Key 钥匙图标\nconst KeyIcon = ({\n  size = 18,\n  className = ''\n}) => /*#__PURE__*/jsx(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: \"2\",\n  className: className,\n  children: /*#__PURE__*/jsx(\"path\", {\n    d: \"M21 2l-2 2m-7.61 7.61a5.5 5.5 0 1 1-7.778 7.778 5.5 5.5 0 0 1 7.777-7.777zm0 0L15.5 7.5m0 0l3 3L22 7l-3-3m-3.5 3.5L19 4\"\n  })\n});\n\n// Expand 全屏展开图标\nconst ExpandIcon = ({\n  size = 18,\n  className = ''\n}) => /*#__PURE__*/jsx(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: \"2\",\n  className: className,\n  children: /*#__PURE__*/jsx(\"path\", {\n    d: \"M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7\"\n  })\n});\n\n// Maximize 最大化图标\nconst MaximizeIcon = ({\n  size = 18,\n  className = ''\n}) => /*#__PURE__*/jsx(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: \"2\",\n  className: className,\n  children: /*#__PURE__*/jsx(\"path\", {\n    d: \"M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3\"\n  })\n});\n\n// Palette 调色板图标\nconst PaletteIcon = ({\n  size = 18,\n  className = ''\n}) => /*#__PURE__*/jsxs(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: \"2\",\n  className: className,\n  children: [/*#__PURE__*/jsx(\"circle\", {\n    cx: \"13.5\",\n    cy: \"6.5\",\n    r: \"0.5\",\n    fill: \"currentColor\"\n  }), /*#__PURE__*/jsx(\"circle\", {\n    cx: \"17.5\",\n    cy: \"10.5\",\n    r: \"0.5\",\n    fill: \"currentColor\"\n  }), /*#__PURE__*/jsx(\"circle\", {\n    cx: \"8.5\",\n    cy: \"7.5\",\n    r: \"0.5\",\n    fill: \"currentColor\"\n  }), /*#__PURE__*/jsx(\"circle\", {\n    cx: \"6.5\",\n    cy: \"12.5\",\n    r: \"0.5\",\n    fill: \"currentColor\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.555C21.965 6.012 17.461 2 12 2z\"\n  })]\n});\n\n// Sun 太阳图标 (浅色主题)\nconst SunIcon = ({\n  size = 18,\n  className = ''\n}) => /*#__PURE__*/jsxs(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: \"2\",\n  className: className,\n  children: [/*#__PURE__*/jsx(\"circle\", {\n    cx: \"12\",\n    cy: \"12\",\n    r: \"5\"\n  }), /*#__PURE__*/jsx(\"line\", {\n    x1: \"12\",\n    y1: \"1\",\n    x2: \"12\",\n    y2: \"3\"\n  }), /*#__PURE__*/jsx(\"line\", {\n    x1: \"12\",\n    y1: \"21\",\n    x2: \"12\",\n    y2: \"23\"\n  }), /*#__PURE__*/jsx(\"line\", {\n    x1: \"4.22\",\n    y1: \"4.22\",\n    x2: \"5.64\",\n    y2: \"5.64\"\n  }), /*#__PURE__*/jsx(\"line\", {\n    x1: \"18.36\",\n    y1: \"18.36\",\n    x2: \"19.78\",\n    y2: \"19.78\"\n  }), /*#__PURE__*/jsx(\"line\", {\n    x1: \"1\",\n    y1: \"12\",\n    x2: \"3\",\n    y2: \"12\"\n  }), /*#__PURE__*/jsx(\"line\", {\n    x1: \"21\",\n    y1: \"12\",\n    x2: \"23\",\n    y2: \"12\"\n  }), /*#__PURE__*/jsx(\"line\", {\n    x1: \"4.22\",\n    y1: \"19.78\",\n    x2: \"5.64\",\n    y2: \"18.36\"\n  }), /*#__PURE__*/jsx(\"line\", {\n    x1: \"18.36\",\n    y1: \"5.64\",\n    x2: \"19.78\",\n    y2: \"4.22\"\n  })]\n});\n\n// Moon 月亮图标 (深色主题)\nconst MoonIcon = ({\n  size = 18,\n  className = ''\n}) => /*#__PURE__*/jsx(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: \"2\",\n  className: className,\n  children: /*#__PURE__*/jsx(\"path\", {\n    d: \"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\"\n  })\n});\n\n// Layout 布局图标 (切换模式)\nconst LayoutIcon = ({\n  size = 18,\n  className = ''\n}) => /*#__PURE__*/jsxs(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: \"2\",\n  className: className,\n  children: [/*#__PURE__*/jsx(\"rect\", {\n    x: \"3\",\n    y: \"3\",\n    width: \"18\",\n    height: \"18\",\n    rx: \"2\",\n    ry: \"2\"\n  }), /*#__PURE__*/jsx(\"line\", {\n    x1: \"12\",\n    y1: \"3\",\n    x2: \"12\",\n    y2: \"21\"\n  })]\n});\n\n// Minimize 最小化图标 (简化模式)\nconst MinimizeIcon = ({\n  size = 18,\n  className = ''\n}) => /*#__PURE__*/jsxs(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: \"2\",\n  className: className,\n  children: [/*#__PURE__*/jsx(\"rect\", {\n    x: \"3\",\n    y: \"3\",\n    width: \"18\",\n    height: \"18\",\n    rx: \"2\",\n    ry: \"2\"\n  }), /*#__PURE__*/jsx(\"line\", {\n    x1: \"8\",\n    y1: \"12\",\n    x2: \"16\",\n    y2: \"12\"\n  })]\n});\n\n/**\n * QuantaBit Auth SDK - Internationalization (i18n)\n * 国际化支持模块\n * \n * 使用浏览器全局事件系统实现语言同步\n * 不直接依赖 @quantabit/sdk-config 模块导入\n * \n * 语言格式兼容：同时支持 'zh-CN' / 'zh' 两种格式\n * 内部统一使用短格式 (zh/en/ja/ko)，对外接受任意格式\n */\n\n// 全局语言事件名称（与 sdk-config 保持一致）\nconst LANGUAGE_CHANGE_EVENT = 'qbit-did:language-change';\nconst LANGUAGE_STORAGE_KEY = 'qbit_did_language';\n\n// 内部支持的语言短码\nconst INTERNAL_LANGUAGES = ['en', 'zh', 'ja', 'ko'];\n\n// 对外支持的语言列表（同时接受长短格式）\nconst SUPPORTED_LANGUAGES = ['en', 'en-US', 'en-GB', 'zh', 'zh-CN', 'zh-TW', 'zh-HK', 'ja', 'ja-JP', 'ko', 'ko-KR'];\n\n/**\n * 语言格式归一化\n * 将 'zh-CN' / 'zh-TW' / 'zh-HK' 等映射到内部短码 'zh'\n * 将 'en-US' / 'en-GB' 等映射到 'en'\n * 同时兼容直接传入短码 'zh' / 'en'\n * \n * @param {string} lang - 任意格式的语言代码\n * @returns {string} 归一化后的短码 (zh/en/ja/ko)\n */\nfunction normalizeLanguage(lang) {\n  if (!lang || typeof lang !== 'string') return 'zh';\n  const lower = lang.toLowerCase().trim();\n  if (lower.startsWith('zh')) return 'zh';\n  if (lower.startsWith('ja')) return 'ja';\n  if (lower.startsWith('ko')) return 'ko';\n  if (lower.startsWith('en')) return 'en';\n  // 如果是已知短码直接返回\n  if (INTERNAL_LANGUAGES.includes(lower)) return lower;\n  return 'en';\n}\n\n// 语言信息\nconst LANGUAGE_INFO = {\n  en: {\n    code: 'en',\n    name: 'English',\n    nativeName: 'English',\n    flag: '🇺🇸'\n  },\n  zh: {\n    code: 'zh',\n    name: 'Chinese',\n    nativeName: '中文',\n    flag: '🇨🇳'\n  },\n  ja: {\n    code: 'ja',\n    name: 'Japanese',\n    nativeName: '日本語',\n    flag: '🇯🇵'\n  },\n  ko: {\n    code: 'ko',\n    name: 'Korean',\n    nativeName: '한국어',\n    flag: '🇰🇷'\n  }\n};\n\n// 翻译消息\nconst messages = {\n  zh: {\n    // 标题和通用\n    title: '安全连接到',\n    subtitle: '选择您的身份验证方式',\n    login: '登录',\n    register: '注册',\n    logout: '退出登录',\n    back: '返回',\n    cancel: '取消',\n    confirm: '确认',\n    save: '保存',\n    close: '关闭',\n    loading: '加载中...',\n    success: '操作成功',\n    error: '操作失败',\n    // 语言切换\n    language: '语言',\n    switchLanguage: '切换语言',\n    // 登录相关\n    walletSection: '钱包登录',\n    didSection: 'DID 登录',\n    registerSection: '创建新身份',\n    accountsSection: '账户管理',\n    connecting: '连接中...',\n    signing: '请在钱包中签名...',\n    verifying: '验证签名...',\n    // 钱包\n    metamask: 'MetaMask',\n    walletConnect: 'WalletConnect',\n    coinbaseWallet: 'Coinbase Wallet',\n    quantabitWallet: 'QBit 钱包',\n    connectWallet: '连接钱包',\n    connectDescription: '连接您的 Web3 钱包，安全验证您的去中心化身份',\n    supportedWallets: '支持的钱包',\n    noWallet: '未检测到钱包，请安装 MetaMask',\n    noAccount: '未获取到账户，请解锁您的钱包',\n    noWalletYet: '还没有钱包？',\n    getWallet: '获取一个',\n    // 表单\n    didPlaceholder: 'DID 或用户名',\n    passwordPlaceholder: '密码',\n    confirmPasswordPlaceholder: '确认密码',\n    emailPlaceholder: '邮箱 (可选)',\n    nicknamePlaceholder: '昵称',\n    loginButton: '安全登录',\n    registerButton: '创建身份',\n    loggingIn: '登录中...',\n    registering: '创建中...',\n    // 账户管理\n    savedAccounts: '已验证账号',\n    quickLogin: '快速登录',\n    relogin: '重新登录',\n    switchAccount: '切换账户',\n    manageAccounts: '管理账户',\n    addNewAccount: '添加新账户',\n    removeAccount: '移除账户',\n    removeConfirm: '确定移除此账户？',\n    accountRemoved: '账户已移除',\n    currentAccount: '当前账户',\n    otherAccounts: '其他账户',\n    noOtherAccounts: '没有其他保存的账户',\n    // 导航\n    orDivider: '或',\n    newToDID: '还没有数字身份？',\n    createDID: '创建一个',\n    alreadyHaveDID: '已有身份？',\n    goLogin: '去登录',\n    noAccountYet: '还没有账号？',\n    hasAccount: '已有账号？',\n    // 错误消息\n    errorNoWallet: '未检测到钱包，请安装 MetaMask',\n    errorLoginFailed: '登录失败，请检查凭证',\n    errorRegisterFailed: '注册失败，请重试',\n    errorPasswordMismatch: '两次密码输入不一致',\n    errorPasswordTooShort: '密码至少6位',\n    errorNicknameRequired: '请输入昵称',\n    errorDIDRequired: '请输入 DID',\n    errorPasswordRequired: '请输入密码',\n    rejected: '用户拒绝了签名请求',\n    // 安全相关\n    poweredBy: '由 QuantaBit 提供去中心化身份服务',\n    securityNote: '端到端加密 · 私钥永不离开您的设备',\n    verifiedBadge: '已验证',\n    encryptedConnection: '加密连接',\n    decentralizedAuth: '去中心化认证',\n    // 功能特性\n    feature1: '数据完全自主掌控',\n    feature2: 'W3C 标准身份',\n    feature3: '跨链通用身份',\n    feature4: '隐私计算保护',\n    // 注册页面\n    createIdentity: '创建数字身份',\n    chooseMethod: '选择您的注册方式，开启去中心化之旅',\n    walletMethod: '钱包连接',\n    emailMethod: '邮箱注册',\n    walletDesc: '连接您的 Web3 钱包，我们将为您创建一个与钱包地址绑定的 DID。',\n    nickname: '昵称',\n    email: '邮箱',\n    password: '密码',\n    confirmPassword: '确认密码',\n    createAccount: '创建账户',\n    welcome: '欢迎加入',\n    successDesc: '您的去中心化身份已创建成功',\n    autoWallet: '自动为您创建钱包并关联',\n    didIdentifier: 'DID 标识符',\n    recommended: '推荐',\n    redirecting: '正在跳转...',\n    // 社交绑定\n    socialBindings: '社交账号绑定',\n    bindAccount: '绑定账号',\n    unbindAccount: '解绑账号',\n    verifiedAccount: '已验证账号',\n    // 声誉系统\n    reputation: '声誉分数',\n    reputationLevel: '声誉等级',\n    badges: '徽章',\n    leaderboard: '排行榜',\n    // 凭证\n    credentials: '可验证凭证',\n    issueCredential: '签发凭证',\n    verifyCredential: '验证凭证',\n    // 钱包绑定\n    walletBindings: '钱包绑定',\n    primaryWallet: '主钱包',\n    addWallet: '添加钱包'\n  },\n  en: {\n    // Title and General\n    title: 'Securely Connect to',\n    subtitle: 'Choose your authentication method',\n    login: 'Login',\n    register: 'Sign Up',\n    logout: 'Logout',\n    back: 'Back',\n    cancel: 'Cancel',\n    confirm: 'Confirm',\n    save: 'Save',\n    close: 'Close',\n    loading: 'Loading...',\n    success: 'Success',\n    error: 'Error',\n    // Language Switch\n    language: 'Language',\n    switchLanguage: 'Switch Language',\n    // Login Related\n    walletSection: 'Wallet Login',\n    didSection: 'DID Login',\n    registerSection: 'Create New Identity',\n    accountsSection: 'Account Management',\n    connecting: 'Connecting...',\n    signing: 'Please sign in wallet...',\n    verifying: 'Verifying signature...',\n    // Wallets\n    metamask: 'MetaMask',\n    walletConnect: 'WalletConnect',\n    coinbaseWallet: 'Coinbase Wallet',\n    quantabitWallet: 'QBit Wallet',\n    connectWallet: 'Connect Wallet',\n    connectDescription: 'Connect your Web3 wallet to securely verify your decentralized identity',\n    supportedWallets: 'Supported wallets',\n    noWallet: 'No wallet detected. Please install MetaMask',\n    noAccount: 'No account found. Please unlock your wallet',\n    noWalletYet: \"Don't have a wallet?\",\n    getWallet: 'Get one',\n    // Forms\n    didPlaceholder: 'DID or username',\n    passwordPlaceholder: 'Password',\n    confirmPasswordPlaceholder: 'Confirm password',\n    emailPlaceholder: 'Email (optional)',\n    nicknamePlaceholder: 'Nickname',\n    loginButton: 'Secure Login',\n    registerButton: 'Create Identity',\n    loggingIn: 'Logging in...',\n    registering: 'Creating...',\n    // Account Management\n    savedAccounts: 'Verified Accounts',\n    quickLogin: 'Quick Login',\n    relogin: 'Re-login',\n    switchAccount: 'Switch Account',\n    manageAccounts: 'Manage Accounts',\n    addNewAccount: 'Add New Account',\n    removeAccount: 'Remove Account',\n    removeConfirm: 'Remove this account?',\n    accountRemoved: 'Account removed',\n    currentAccount: 'Current Account',\n    otherAccounts: 'Other Accounts',\n    noOtherAccounts: 'No other saved accounts',\n    // Navigation\n    orDivider: 'or',\n    newToDID: 'New to digital identity?',\n    createDID: 'Create one',\n    alreadyHaveDID: 'Already have identity?',\n    goLogin: 'Login',\n    noAccountYet: \"Don't have an account?\",\n    hasAccount: 'Already have an account?',\n    // Error Messages\n    errorNoWallet: 'No wallet detected. Please install MetaMask',\n    errorLoginFailed: 'Login failed. Check your credentials',\n    errorRegisterFailed: 'Registration failed. Please try again',\n    errorPasswordMismatch: 'Passwords do not match',\n    errorPasswordTooShort: 'Password must be at least 6 characters',\n    errorNicknameRequired: 'Please enter nickname',\n    errorDIDRequired: 'Please enter DID',\n    errorPasswordRequired: 'Please enter password',\n    rejected: 'User rejected the signature request',\n    // Security Related\n    poweredBy: 'Decentralized identity by QuantaBit',\n    securityNote: 'End-to-end encrypted · Private keys never leave your device',\n    verifiedBadge: 'Verified',\n    encryptedConnection: 'Encrypted',\n    decentralizedAuth: 'Decentralized Auth',\n    // Features\n    feature1: 'Full data sovereignty',\n    feature2: 'W3C Standard Identity',\n    feature3: 'Cross-chain Universal ID',\n    feature4: 'Privacy Computing',\n    // Register Page\n    createIdentity: 'Create Digital Identity',\n    chooseMethod: 'Choose your registration method to start your decentralized journey',\n    walletMethod: 'Wallet Connect',\n    emailMethod: 'Email Register',\n    walletDesc: 'Connect your Web3 wallet and we will create a DID bound to your wallet address.',\n    nickname: 'Nickname',\n    email: 'Email',\n    password: 'Password',\n    confirmPassword: 'Confirm Password',\n    createAccount: 'Create Account',\n    welcome: 'Welcome to',\n    successDesc: 'Your decentralized identity has been created successfully',\n    autoWallet: 'Wallet automatically created and linked',\n    didIdentifier: 'DID Identifier',\n    recommended: 'Recommended',\n    redirecting: 'Redirecting...',\n    // Social Bindings\n    socialBindings: 'Social Account Bindings',\n    bindAccount: 'Bind Account',\n    unbindAccount: 'Unbind Account',\n    verifiedAccount: 'Verified Account',\n    // Reputation System\n    reputation: 'Reputation Score',\n    reputationLevel: 'Reputation Level',\n    badges: 'Badges',\n    leaderboard: 'Leaderboard',\n    // Credentials\n    credentials: 'Verifiable Credentials',\n    issueCredential: 'Issue Credential',\n    verifyCredential: 'Verify Credential',\n    // Wallet Bindings\n    walletBindings: 'Wallet Bindings',\n    primaryWallet: 'Primary Wallet',\n    addWallet: 'Add Wallet'\n  },\n  ja: {\n    // タイトルと一般\n    title: '安全に接続',\n    subtitle: '認証方法を選択してください',\n    login: 'ログイン',\n    register: '新規登録',\n    logout: 'ログアウト',\n    back: '戻る',\n    cancel: 'キャンセル',\n    confirm: '確認',\n    save: '保存',\n    close: '閉じる',\n    loading: '読み込み中...',\n    success: '成功',\n    error: 'エラー',\n    // 言語切替\n    language: '言語',\n    switchLanguage: '言語を切り替え',\n    // ログイン関連\n    walletSection: 'ウォレットログイン',\n    didSection: 'DID ログイン',\n    registerSection: '新しいIDを作成',\n    accountsSection: 'アカウント管理',\n    connecting: '接続中...',\n    signing: 'ウォレットで署名してください...',\n    verifying: '署名を確認中...',\n    // ウォレット\n    metamask: 'MetaMask',\n    walletConnect: 'WalletConnect',\n    coinbaseWallet: 'Coinbase Wallet',\n    quantabitWallet: 'QBit ウォレット',\n    connectWallet: 'ウォレット接続',\n    connectDescription: 'Web3ウォレットを接続して、分散型IDを安全に確認',\n    supportedWallets: '対応ウォレット',\n    noWallet: 'ウォレットが検出されません。MetaMaskをインストールしてください',\n    noAccount: 'アカウントが見つかりません。ウォレットのロックを解除してください',\n    noWalletYet: 'ウォレットをお持ちでないですか？',\n    getWallet: '取得する',\n    // フォーム\n    didPlaceholder: 'DID またはユーザー名',\n    passwordPlaceholder: 'パスワード',\n    confirmPasswordPlaceholder: 'パスワード確認',\n    emailPlaceholder: 'メール (任意)',\n    nicknamePlaceholder: 'ニックネーム',\n    loginButton: '安全にログイン',\n    registerButton: 'IDを作成',\n    loggingIn: 'ログイン中...',\n    registering: '作成中...',\n    // アカウント管理\n    savedAccounts: '確認済みアカウント',\n    quickLogin: 'クイックログイン',\n    relogin: '再ログイン',\n    switchAccount: 'アカウント切替',\n    manageAccounts: 'アカウント管理',\n    addNewAccount: '新しいアカウントを追加',\n    removeAccount: 'アカウントを削除',\n    removeConfirm: 'このアカウントを削除しますか？',\n    accountRemoved: 'アカウントが削除されました',\n    currentAccount: '現在のアカウント',\n    otherAccounts: '他のアカウント',\n    noOtherAccounts: '他の保存されたアカウントはありません',\n    // ナビゲーション\n    orDivider: 'または',\n    newToDID: 'デジタルIDは初めてですか？',\n    createDID: '作成する',\n    alreadyHaveDID: 'すでにIDをお持ちですか？',\n    goLogin: 'ログインへ',\n    noAccountYet: 'アカウントをお持ちでないですか？',\n    hasAccount: 'すでにアカウントをお持ちですか？',\n    // エラーメッセージ\n    errorNoWallet: 'ウォレットが検出されません',\n    errorLoginFailed: 'ログインに失敗しました',\n    errorRegisterFailed: '登録に失敗しました',\n    errorPasswordMismatch: 'パスワードが一致しません',\n    errorPasswordTooShort: 'パスワードは6文字以上必要です',\n    errorNicknameRequired: 'ニックネームを入力してください',\n    errorDIDRequired: 'DIDを入力してください',\n    errorPasswordRequired: 'パスワードを入力してください',\n    rejected: 'ユーザーが署名リクエストを拒否しました',\n    // セキュリティ\n    poweredBy: 'QuantaBitによる分散型ID',\n    securityNote: 'エンドツーエンド暗号化 · 秘密鍵はデバイスから離れません',\n    verifiedBadge: '確認済み',\n    encryptedConnection: '暗号化接続',\n    decentralizedAuth: '分散型認証',\n    // 機能\n    feature1: '完全なデータ主権',\n    feature2: 'W3C標準ID',\n    feature3: 'クロスチェーンユニバーサルID',\n    feature4: 'プライバシー計算',\n    // 登録ページ\n    createIdentity: 'デジタルIDを作成',\n    chooseMethod: '登録方法を選択して、分散型の旅を始めましょう',\n    walletMethod: 'ウォレット接続',\n    emailMethod: 'メール登録',\n    walletDesc: 'Web3ウォレットを接続すると、ウォレットアドレスに紐づくDIDを作成します。',\n    nickname: 'ニックネーム',\n    email: 'メール',\n    password: 'パスワード',\n    confirmPassword: 'パスワード確認',\n    createAccount: 'アカウント作成',\n    welcome: 'ようこそ',\n    successDesc: '分散型IDが正常に作成されました',\n    autoWallet: 'ウォレットが自動的に作成され、リンクされました',\n    didIdentifier: 'DID識別子',\n    recommended: 'おすすめ',\n    redirecting: 'リダイレクト中...',\n    // ソーシャル連携\n    socialBindings: 'ソーシャルアカウント連携',\n    bindAccount: 'アカウント連携',\n    unbindAccount: '連携解除',\n    verifiedAccount: '確認済みアカウント',\n    // レピュテーション\n    reputation: 'レピュテーションスコア',\n    reputationLevel: 'レピュテーションレベル',\n    badges: 'バッジ',\n    leaderboard: 'リーダーボード',\n    // クレデンシャル\n    credentials: '検証可能なクレデンシャル',\n    issueCredential: 'クレデンシャル発行',\n    verifyCredential: 'クレデンシャル検証',\n    // ウォレット連携\n    walletBindings: 'ウォレット連携',\n    primaryWallet: 'メインウォレット',\n    addWallet: 'ウォレット追加'\n  },\n  ko: {\n    // 제목 및 일반\n    title: '안전하게 연결',\n    subtitle: '인증 방법을 선택하세요',\n    login: '로그인',\n    register: '회원가입',\n    logout: '로그아웃',\n    back: '뒤로',\n    cancel: '취소',\n    confirm: '확인',\n    save: '저장',\n    close: '닫기',\n    loading: '로딩 중...',\n    success: '성공',\n    error: '오류',\n    // 언어 전환\n    language: '언어',\n    switchLanguage: '언어 전환',\n    // 로그인 관련\n    walletSection: '지갑 로그인',\n    didSection: 'DID 로그인',\n    registerSection: '새 ID 생성',\n    accountsSection: '계정 관리',\n    connecting: '연결 중...',\n    signing: '지갑에서 서명해 주세요...',\n    verifying: '서명 확인 중...',\n    // 지갑\n    metamask: 'MetaMask',\n    walletConnect: 'WalletConnect',\n    coinbaseWallet: 'Coinbase Wallet',\n    quantabitWallet: 'QBit 지갑',\n    connectWallet: '지갑 연결',\n    connectDescription: 'Web3 지갑을 연결하여 탈중앙화 ID를 안전하게 확인',\n    supportedWallets: '지원 지갑',\n    noWallet: '지갑이 감지되지 않습니다. MetaMask를 설치해 주세요',\n    noAccount: '계정을 찾을 수 없습니다. 지갑 잠금을 해제해 주세요',\n    noWalletYet: '지갑이 없으신가요?',\n    getWallet: '받기',\n    // 폼\n    didPlaceholder: 'DID 또는 사용자 이름',\n    passwordPlaceholder: '비밀번호',\n    confirmPasswordPlaceholder: '비밀번호 확인',\n    emailPlaceholder: '이메일 (선택)',\n    nicknamePlaceholder: '닉네임',\n    loginButton: '안전하게 로그인',\n    registerButton: 'ID 생성',\n    loggingIn: '로그인 중...',\n    registering: '생성 중...',\n    // 계정 관리\n    savedAccounts: '확인된 계정',\n    quickLogin: '빠른 로그인',\n    relogin: '다시 로그인',\n    switchAccount: '계정 전환',\n    manageAccounts: '계정 관리',\n    addNewAccount: '새 계정 추가',\n    removeAccount: '계정 삭제',\n    removeConfirm: '이 계정을 삭제하시겠습니까?',\n    accountRemoved: '계정이 삭제되었습니다',\n    currentAccount: '현재 계정',\n    otherAccounts: '다른 계정',\n    noOtherAccounts: '저장된 다른 계정이 없습니다',\n    // 네비게이션\n    orDivider: '또는',\n    newToDID: '디지털 ID가 처음이신가요?',\n    createDID: '생성하기',\n    alreadyHaveDID: '이미 ID가 있으신가요?',\n    goLogin: '로그인',\n    noAccountYet: '계정이 없으신가요?',\n    hasAccount: '이미 계정이 있으신가요?',\n    // 오류 메시지\n    errorNoWallet: '지갑이 감지되지 않습니다',\n    errorLoginFailed: '로그인에 실패했습니다',\n    errorRegisterFailed: '등록에 실패했습니다',\n    errorPasswordMismatch: '비밀번호가 일치하지 않습니다',\n    errorPasswordTooShort: '비밀번호는 6자 이상이어야 합니다',\n    errorNicknameRequired: '닉네임을 입력해 주세요',\n    errorDIDRequired: 'DID를 입력해 주세요',\n    errorPasswordRequired: '비밀번호를 입력해 주세요',\n    rejected: '사용자가 서명 요청을 거부했습니다',\n    // 보안\n    poweredBy: 'QuantaBit 제공 탈중앙화 ID',\n    securityNote: '종단 간 암호화 · 개인키는 기기를 떠나지 않습니다',\n    verifiedBadge: '확인됨',\n    encryptedConnection: '암호화 연결',\n    decentralizedAuth: '탈중앙화 인증',\n    // 기능\n    feature1: '완전한 데이터 주권',\n    feature2: 'W3C 표준 ID',\n    feature3: '크로스체인 범용 ID',\n    feature4: '프라이버시 컴퓨팅',\n    // 등록 페이지\n    createIdentity: '디지털 ID 생성',\n    chooseMethod: '등록 방법을 선택하여 탈중앙화 여정을 시작하세요',\n    walletMethod: '지갑 연결',\n    emailMethod: '이메일 등록',\n    walletDesc: 'Web3 지갑을 연결하면 지갑 주소에 연결된 DID를 생성합니다.',\n    nickname: '닉네임',\n    email: '이메일',\n    password: '비밀번호',\n    confirmPassword: '비밀번호 확인',\n    createAccount: '계정 생성',\n    welcome: '환영합니다',\n    successDesc: '탈중앙화 ID가 성공적으로 생성되었습니다',\n    autoWallet: '지갑이 자동으로 생성되고 연결되었습니다',\n    didIdentifier: 'DID 식별자',\n    recommended: '추천',\n    redirecting: '리디렉션 중...',\n    // 소셜 연동\n    socialBindings: '소셜 계정 연동',\n    bindAccount: '계정 연동',\n    unbindAccount: '연동 해제',\n    verifiedAccount: '확인된 계정',\n    // 평판\n    reputation: '평판 점수',\n    reputationLevel: '평판 레벨',\n    badges: '뱃지',\n    leaderboard: '리더보드',\n    // 크레덴셜\n    credentials: '검증 가능한 크레덴셜',\n    issueCredential: '크레덴셜 발급',\n    verifyCredential: '크레덴셜 검증',\n    // 지갑 연동\n    walletBindings: '지갑 연동',\n    primaryWallet: '기본 지갑',\n    addWallet: '지갑 추가'\n  }\n};\n\n// ============ 语言同步机制 ============\n\n// 内部语言监听器列表\nlet _languageListeners = new Set();\n\n/**\n * 获取当前语言\n * 优先从 localStorage 读取，保证与其他 SDK 同步\n * \n * @returns {string} 当前语言代码\n */\nfunction getLanguage() {\n  if (typeof window !== 'undefined') {\n    const saved = localStorage.getItem(LANGUAGE_STORAGE_KEY);\n    if (saved) {\n      const normalized = normalizeLanguage(saved);\n      return normalized;\n    }\n  }\n  return 'zh';\n}\n\n/**\n * 设置当前语言\n * 保存到 localStorage 并触发全局事件\n * \n * @param {string} lang - 语言代码 (en/zh/ja/ko)\n */\nfunction setLanguage(lang) {\n  // 归一化语言代码（支持 'zh-CN' -> 'zh' 等）\n  const normalized = normalizeLanguage(lang);\n  const oldLang = getLanguage();\n\n  // 保存归一化后的短码到 localStorage\n  if (typeof window !== 'undefined') {\n    localStorage.setItem(LANGUAGE_STORAGE_KEY, normalized);\n\n    // 触发全局事件\n    const event = new CustomEvent(LANGUAGE_CHANGE_EVENT, {\n      detail: {\n        language: normalized,\n        oldLanguage: oldLang\n      }\n    });\n    window.dispatchEvent(event);\n  }\n\n  // 通知本地监听器\n  _notifyListeners(normalized);\n}\n\n/**\n * 初始化语言并订阅全局变更\n */\nfunction initLanguage() {\n  if (typeof window !== 'undefined') {\n    // 优先从 localStorage 读取\n    const saved = localStorage.getItem(LANGUAGE_STORAGE_KEY);\n    if (!saved) {\n      // 没有保存的语言，使用浏览器检测\n      const browserLang = detectBrowserLanguage();\n      localStorage.setItem(LANGUAGE_STORAGE_KEY, browserLang);\n    }\n\n    // 订阅全局语言变更事件\n    window.addEventListener(LANGUAGE_CHANGE_EVENT, e => {\n      const newLang = e.detail?.language;\n      if (newLang) {\n        const normalized = normalizeLanguage(newLang);\n        console.log(`[Auth SDK] 收到全局语言变更: ${newLang} -> ${normalized}`);\n        _notifyListeners(normalized);\n      }\n    });\n  }\n  return getLanguage();\n}\n\n/**\n * 订阅语言变更\n * \n * @param {function} listener - 回调函数 (newLang) => void\n * @returns {function} 取消订阅函数\n */\nfunction onLanguageChange(listener) {\n  _languageListeners.add(listener);\n  console.log('[Auth SDK i18n] 订阅语言变更，当前监听器数量:', _languageListeners.size);\n\n  // 同时监听全局事件（如果之前没有监听过）\n  if (typeof window !== 'undefined') {\n    const handler = e => {\n      const newLang = e.detail?.language;\n      if (newLang) {\n        const normalized = normalizeLanguage(newLang);\n        console.log('[Auth SDK i18n] 收到全局语言事件:', newLang, '-> 归一化:', normalized);\n        listener(normalized);\n      }\n    };\n    window.addEventListener(LANGUAGE_CHANGE_EVENT, handler);\n    console.log('[Auth SDK i18n] 已添加全局事件监听:', LANGUAGE_CHANGE_EVENT);\n\n    // 返回包含清理全局监听器的函数\n    return () => {\n      _languageListeners.delete(listener);\n      window.removeEventListener(LANGUAGE_CHANGE_EVENT, handler);\n      console.log('[Auth SDK i18n] 取消订阅，剩余监听器:', _languageListeners.size);\n    };\n  }\n  return () => _languageListeners.delete(listener);\n}\nfunction _notifyListeners(lang) {\n  _languageListeners.forEach(listener => {\n    try {\n      listener(lang);\n    } catch (err) {\n      console.error('[Auth SDK] 语言监听器执行错误:', err);\n    }\n  });\n}\n\n/**\n * 检测浏览器语言\n * @returns {string} 检测到的语言代码\n */\nfunction detectBrowserLanguage() {\n  if (typeof navigator === 'undefined') return 'en';\n  const browserLang = navigator.language || navigator.userLanguage;\n  if (browserLang?.startsWith('zh')) return 'zh';\n  if (browserLang?.startsWith('ja')) return 'ja';\n  if (browserLang?.startsWith('ko')) return 'ko';\n  return 'en';\n}\n\n/**\n * 获取翻译消息\n * @param {string} lang - 语言代码\n * @returns {Object} 翻译消息对象\n */\nfunction getMessages$1(lang) {\n  const language = normalizeLanguage(lang || getLanguage());\n  return messages[language] || messages.zh;\n}\n\n/**\n * 翻译函数\n * @param {string} key - 翻译键\n * @param {Object} params - 替换参数\n * @returns {string} 翻译后的文本\n */\nfunction t(key, params) {\n  const msgs = getMessages$1();\n  let text = msgs[key] || key;\n\n  // 参数替换\n  if (params) {\n    Object.keys(params).forEach(k => {\n      text = text.replace(new RegExp(`\\\\{${k}\\\\}`, 'g'), params[k]);\n    });\n  }\n  return text;\n}\n\n/**\n * 获取所有支持的语言列表\n * @returns {Array} 语言列表\n */\nfunction getSupportedLanguages() {\n  return SUPPORTED_LANGUAGES.map(code => LANGUAGE_INFO[code]);\n}\n\n/**\n * QuantaBit Auth SDK - 工具函数\n */\n\nconst BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\nconst MAX_QBIT_MEMO_BYTES = 512;\n\n// ============ 账户存储 ============\n\nconst STORAGE_KEY = 'qbit_did_saved_accounts';\nconst MAX_ACCOUNTS$1 = 5;\n\n/**\n * 获取保存的账户列表\n */\nfunction getSavedAccounts() {\n  if (typeof window === 'undefined') return [];\n  try {\n    const data = localStorage.getItem(STORAGE_KEY);\n    return data ? JSON.parse(data) : [];\n  } catch (e) {\n    return [];\n  }\n}\n\n/**\n * 保存账户\n */\nfunction saveAccount(account) {\n  if (typeof window === 'undefined') return;\n  try {\n    const accounts = getSavedAccounts().filter(a => a.did !== account.did);\n    accounts.unshift({\n      ...account,\n      lastLoginAt: new Date().toISOString()\n    });\n    localStorage.setItem(STORAGE_KEY, JSON.stringify(accounts.slice(0, MAX_ACCOUNTS$1)));\n  } catch (e) {\n    // Ignore storage errors\n  }\n}\n\n/**\n * 移除账户\n */\nfunction removeAccount(did) {\n  if (typeof window === 'undefined') return;\n  try {\n    const accounts = getSavedAccounts().filter(a => a.did !== did);\n    localStorage.setItem(STORAGE_KEY, JSON.stringify(accounts));\n  } catch (e) {\n    // Ignore storage errors\n  }\n}\n\n/**\n * 获取当前会话\n */\nfunction getCurrentSession() {\n  if (typeof window === 'undefined') return null;\n  try {\n    const did = localStorage.getItem('qbit_did_current');\n    const token = localStorage.getItem('qbit_did_access_token');\n    if (did && token) return {\n      did,\n      token\n    };\n    return null;\n  } catch (e) {\n    return null;\n  }\n}\n\n/**\n * 清除当前会话\n */\nfunction clearCurrentSession() {\n  if (typeof window === 'undefined') return;\n  try {\n    localStorage.removeItem('qbit_did_current');\n    localStorage.removeItem('qbit_did_access_token');\n    localStorage.removeItem('qbit_did_refresh_token');\n  } catch (e) {\n    // Ignore\n  }\n}\n\n/**\n * 设置当前 DID\n */\nfunction setCurrentDID(did) {\n  if (typeof window === 'undefined') return;\n  try {\n    localStorage.setItem('qbit_did_current', did);\n  } catch (e) {\n    // Ignore\n  }\n}\n\n// ============ 格式化 ============\n\n/**\n * 格式化 DID（截断显示）\n */\nfunction formatDID$1(did, chars) {\n  if (!did || did.length <= 20) return did || '';\n  if (chars !== undefined) {\n    if (did.startsWith('did:')) {\n      const parts = did.split(':');\n      if (parts.length >= 3) {\n        const prefix = parts.slice(0, 2).join(':') + ':';\n        const id = parts.slice(2).join(':');\n        const start = Math.ceil(chars / 2);\n        const end = Math.floor(chars / 2);\n        return `${prefix}${id.slice(0, start)}...${id.slice(-end)}`;\n      }\n    }\n    const start = Math.ceil(chars / 2);\n    const end = Math.floor(chars / 2);\n    return `${did.slice(0, start)}...${did.slice(-end)}`;\n  }\n  return `${did.slice(0, 12)}...${did.slice(-6)}`;\n}\n\n/**\n * 格式化钱包地址\n */\nfunction formatAddress(address) {\n  if (!address) return '';\n  if (address.length <= 10) return address;\n  return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n\n// ============ 钱包检测 ============\n\nfunction isQbitChainType(chainType = 'quantabit') {\n  return ['quantabit', 'qbit', 'qbitchain', 'solana'].includes(String(chainType).toLowerCase());\n}\nfunction normalizeWalletChainType(chainType = 'quantabit') {\n  return isQbitChainType(chainType) ? 'quantabit' : chainType;\n}\nfunction encodeBase58(input) {\n  const bytes = input instanceof Uint8Array ? input : new Uint8Array(input || []);\n  if (bytes.length === 0) return '';\n  const digits = [0];\n  for (let i = 0; i < bytes.length; i += 1) {\n    let carry = bytes[i];\n    for (let j = 0; j < digits.length; j += 1) {\n      const value = digits[j] * 256 + carry;\n      digits[j] = value % 58;\n      carry = Math.floor(value / 58);\n    }\n    while (carry > 0) {\n      digits.push(carry % 58);\n      carry = Math.floor(carry / 58);\n    }\n  }\n  let encoded = '';\n  for (let i = 0; i < bytes.length && bytes[i] === 0; i += 1) {\n    encoded += BASE58_ALPHABET[0];\n  }\n  for (let i = digits.length - 1; i >= 0; i -= 1) {\n    encoded += BASE58_ALPHABET[digits[i]];\n  }\n  return encoded;\n}\n\n/**\n * 检测是否安装了 MetaMask\n */\nfunction hasMetaMask() {\n  return typeof window !== 'undefined' && typeof window.ethereum !== 'undefined';\n}\nfunction hasQBitWallet() {\n  return !!getQBitProvider();\n}\n\n/**\n * 获取钱包 Provider\n */\nfunction getEthereumProvider() {\n  if (typeof window === 'undefined') return null;\n  return window.ethereum || null;\n}\nfunction getQBitProvider(preferredWallet = null) {\n  if (typeof window === 'undefined') return null;\n  const providers = {\n    phantom: window.phantom?.solana || (window.solana?.isPhantom ? window.solana : null),\n    solflare: window.solflare || null,\n    backpack: window.backpack || null,\n    okx: window.okxwallet?.solana || null,\n    tokenpocket: window.tokenpocket?.solana || null,\n    solana: window.solana || null\n  };\n  if (preferredWallet && providers[preferredWallet]) {\n    return providers[preferredWallet];\n  }\n  return providers.phantom || providers.solflare || providers.backpack || providers.okx || providers.tokenpocket || providers.solana || null;\n}\nasync function connectBrowserWallet(chainType = 'quantabit', preferredWallet = null) {\n  const normalizedChainType = normalizeWalletChainType(chainType);\n  if (isQbitChainType(normalizedChainType)) {\n    const provider = getQBitProvider(preferredWallet);\n    if (!provider) {\n      throw new Error('未检测到 QBit/Solana 钱包，请安装 Phantom、Solflare、Backpack 或 OKX Wallet');\n    }\n    const response = await provider.connect();\n    const publicKey = response?.publicKey || provider.publicKey || response || null;\n    const address = typeof publicKey === 'string' ? publicKey : publicKey?.toBase58?.() || publicKey?.toString?.();\n    if (!address) {\n      throw new Error('未获取到钱包账户');\n    }\n    return {\n      address,\n      provider,\n      chainType: normalizedChainType,\n      walletType: preferredWallet || provider.isPhantom && 'phantom' || provider.isSolflare && 'solflare' || provider.isBackpack && 'backpack' || provider.isOkxWallet && 'okx' || 'solana'\n    };\n  }\n  const provider = getEthereumProvider();\n  if (!provider) {\n    throw new Error('未检测到 EVM 钱包，请安装 MetaMask');\n  }\n  const accounts = await provider.request({\n    method: 'eth_requestAccounts'\n  });\n  const address = accounts?.[0];\n  if (!address) {\n    throw new Error('未获取到钱包账户');\n  }\n  return {\n    address,\n    provider,\n    chainType: normalizedChainType,\n    walletType: preferredWallet || 'metamask'\n  };\n}\nasync function signWalletMessage(provider, chainType, message, address) {\n  const normalizedChainType = normalizeWalletChainType(chainType);\n  if (isQbitChainType(normalizedChainType)) {\n    if (!provider?.signMessage) {\n      throw new Error('当前钱包不支持消息签名');\n    }\n    const encodedMessage = new TextEncoder().encode(message);\n    const signed = await provider.signMessage(encodedMessage, 'utf8');\n    const signatureBytes = signed?.signature || signed;\n    return encodeBase58(signatureBytes);\n  }\n  if (!provider?.request) {\n    throw new Error('当前钱包不支持消息签名');\n  }\n  return provider.request({\n    method: 'personal_sign',\n    params: [message, address]\n  });\n}\nasync function loginWithBrowserWallet(api, chainType = 'quantabit', preferredWallet = null) {\n  const {\n    address,\n    provider,\n    walletType\n  } = await connectBrowserWallet(chainType, preferredWallet);\n  const authChainType = normalizeWalletChainType(chainType);\n  const nonceRes = await api.getNonce(address, authChainType);\n  const {\n    message\n  } = nonceRes.data || nonceRes;\n  const signature = await signWalletMessage(provider, authChainType, message, address);\n  const authRes = await api.walletLogin(address, signature, message, authChainType);\n  return {\n    address,\n    provider,\n    walletType,\n    chainType: authChainType,\n    message,\n    signature,\n    response: authRes.data || authRes\n  };\n}\nasync function bindBrowserWallet(api, chainType = 'quantabit', bindingType = 'secondary', preferredWallet = null) {\n  const {\n    address,\n    provider,\n    walletType\n  } = await connectBrowserWallet(chainType, preferredWallet);\n  const authChainType = normalizeWalletChainType(chainType);\n  const messageRes = await api.getBindingMessage(address, authChainType);\n  const message = messageRes.data?.message || messageRes.message;\n  const signature = await signWalletMessage(provider, authChainType, message, address);\n  const bindRes = await api.bindWallet(address, authChainType, signature, message, bindingType);\n  return {\n    address,\n    provider,\n    walletType,\n    chainType: authChainType,\n    message,\n    signature,\n    response: bindRes.data || bindRes\n  };\n}\nfunction extractTransactionHash(result) {\n  if (!result) return null;\n  if (typeof result === 'string') {\n    return result;\n  }\n  return result.txHash || result.tx_hash || result.signature || result.hash || null;\n}\nfunction buildQBitAnchorMemo$1(payload, options = {}) {\n  const namespace = options.namespace || 'qbit_did';\n  const memoPayload = {\n    ns: namespace,\n    action: payload?.action || 'anchor',\n    did: payload?.did,\n    credential_id: payload?.credential_id,\n    document_hash: payload?.document_hash,\n    credential_hash: payload?.credential_hash,\n    version: payload?.version\n  };\n  const memo = JSON.stringify(Object.fromEntries(Object.entries(memoPayload).filter(([, value]) => value !== undefined && value !== null)));\n  const memoBytes = new TextEncoder().encode(memo);\n  if (memoBytes.length > MAX_QBIT_MEMO_BYTES) {\n    throw new Error(`Memo 内容过长，当前 ${memoBytes.length} bytes，超过 ${MAX_QBIT_MEMO_BYTES} bytes 限制`);\n  }\n  return memo;\n}\nfunction createQBitMemoAnchorBroadcaster$1(options = {}) {\n  const {\n    provider,\n    address,\n    endpoint,\n    network = 'mainnet',\n    priorityFee,\n    skipPreflight = false,\n    namespace = 'qbit_did',\n    waitForConfirmation = false,\n    confirmCommitment = 'confirmed',\n    confirmTimeoutMs\n  } = options;\n  return async payload => {\n    if (!provider) {\n      throw new Error('缺少 QBit 钱包 provider');\n    }\n\n    // 委托核心 SDK 的统一锚定广播逻辑（单一事实来源）\n    const sdk = await import('@quantabit/qbit-chain-sdk');\n    const connection = new sdk.QBitConnection({\n      endpoint,\n      network\n    });\n    const memo = buildQBitAnchorMemo$1(payload, {\n      namespace\n    });\n    return sdk.broadcastQBitAnchor(connection, provider, memo, {\n      address,\n      priorityFee,\n      skipPreflight,\n      waitForConfirmation,\n      commitment: confirmCommitment,\n      timeoutMs: confirmTimeoutMs\n    });\n  };\n}\n\n/**\n * 等待 QBit 交易确认（委托核心 SDK 的 waitForAnchorConfirmation）\n *\n * QBit 主网 RPC 对 WebSocket 确认支持不稳定，统一采用 HTTP 轮询。\n *\n * @param {Object} connection - QBitConnection 或暴露 raw / getRawConnection 的连接\n * @param {string} signature - 交易签名\n * @param {Object} options - { commitment, pollIntervalMs, maxPolls, timeoutMs }\n * @returns {Promise<{confirmed: boolean, slot: number|null, status: string|null, timedOut?: boolean}>}\n */\nasync function waitForQBitConfirmation(connection, signature, options = {}) {\n  const {\n    waitForAnchorConfirmation\n  } = await import('@quantabit/qbit-chain-sdk');\n  return waitForAnchorConfirmation(connection, signature, options);\n}\n\n/**\n * 校验某笔交易是否成功锚定了 DID Memo（委托核心 SDK 的 verifyAnchoredMemo）\n *\n * @param {Object} options - 选项\n * @param {string} options.txHash - 交易签名\n * @param {string} options.endpoint - 自定义 RPC 端点\n * @param {string} options.network - 网络（默认 'mainnet'）\n * @param {string} options.namespace - anchor 命名空间（默认 'qbit_did'）\n * @param {Object} options.match - 期望匹配的字段（如 { did, document_hash }）\n * @returns {Promise<{found: boolean, matched: boolean, memos: Array<Object>}>}\n */\nasync function verifyAnchoredMemo(options = {}) {\n  const {\n    txHash,\n    endpoint,\n    network = 'mainnet',\n    namespace = 'qbit_did',\n    match\n  } = options;\n  if (!txHash) {\n    throw new Error('缺少 txHash');\n  }\n  const sdk = await import('@quantabit/qbit-chain-sdk');\n  const connection = new sdk.QBitConnection({\n    endpoint,\n    network\n  });\n  return sdk.verifyAnchoredMemo(connection, txHash, {\n    namespace,\n    match\n  });\n}\nasync function completeExternalChainOperation$1(operationResult, broadcaster, submitter) {\n  if (!operationResult?.requires_external_signer) {\n    return {\n      skipped: true,\n      reason: 'operation_does_not_require_external_signer',\n      operation: operationResult\n    };\n  }\n  if (typeof broadcaster !== 'function') {\n    throw new Error('缺少外部签名广播器 broadcaster');\n  }\n  if (typeof submitter !== 'function') {\n    throw new Error('缺少 tx_hash 提交器 submitter');\n  }\n  const broadcastResult = await broadcaster(operationResult.payload, operationResult);\n  const txHash = extractTransactionHash(broadcastResult);\n  if (!txHash) {\n    throw new Error('外部签名广播器未返回 tx_hash/signature');\n  }\n  const submitResult = await submitter(txHash);\n  return {\n    txHash,\n    broadcast: broadcastResult,\n    submit: submitResult\n  };\n}\n\n/**\n * QuantaBit Auth SDK - Language Switcher Component\n * 语言切换组件\n */\n\nfunction LanguageSwitcher({\n  onLanguageChange,\n  currentLanguage,\n  variant = 'dark',\n  showFlag = true,\n  showName = true,\n  className = ''\n}) {\n  const [isOpen, setIsOpen] = useState(false);\n  const [lang, setLang] = useState(currentLanguage || getLanguage());\n  const dropdownRef = useRef(null);\n\n  // 如果外部传入了语言，同步更新\n  useEffect(() => {\n    if (currentLanguage && currentLanguage !== lang) {\n      setLang(currentLanguage);\n    }\n  }, [currentLanguage]);\n\n  // 点击外部关闭\n  useEffect(() => {\n    const handleClickOutside = event => {\n      if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {\n        setIsOpen(false);\n      }\n    };\n    document.addEventListener('mousedown', handleClickOutside);\n    return () => document.removeEventListener('mousedown', handleClickOutside);\n  }, []);\n  const handleSelect = useCallback(code => {\n    setLang(code);\n    setLanguage(code);\n    setIsOpen(false);\n    if (onLanguageChange) {\n      onLanguageChange(code);\n    }\n  }, [onLanguageChange]);\n  const currentLangInfo = LANGUAGE_INFO[lang] || LANGUAGE_INFO.en;\n  return /*#__PURE__*/jsxs(\"div\", {\n    ref: dropdownRef,\n    className: `eco-lang-switcher eco-lang-${variant} ${className}`,\n    onMouseEnter: () => setIsOpen(true),\n    onMouseLeave: () => setIsOpen(false),\n    onClick: e => e.stopPropagation(),\n    children: [/*#__PURE__*/jsxs(\"button\", {\n      type: \"button\",\n      className: \"eco-lang-trigger\",\n      onClick: e => {\n        e.preventDefault();\n        setIsOpen(!isOpen);\n      },\n      \"aria-expanded\": isOpen,\n      \"aria-haspopup\": \"listbox\",\n      children: [showFlag && /*#__PURE__*/jsx(\"span\", {\n        className: \"eco-lang-flag\",\n        children: currentLangInfo.flag\n      }), showName && /*#__PURE__*/jsx(\"span\", {\n        className: \"eco-lang-name\",\n        children: currentLangInfo.nativeName\n      }), /*#__PURE__*/jsx(\"svg\", {\n        className: `eco-lang-arrow ${isOpen ? 'open' : ''}`,\n        width: \"12\",\n        height: \"12\",\n        viewBox: \"0 0 12 12\",\n        fill: \"none\",\n        children: /*#__PURE__*/jsx(\"path\", {\n          d: \"M3 4.5L6 7.5L9 4.5\",\n          stroke: \"currentColor\",\n          strokeWidth: \"1.5\",\n          strokeLinecap: \"round\",\n          strokeLinejoin: \"round\"\n        })\n      })]\n    }), isOpen && /*#__PURE__*/jsx(\"ul\", {\n      className: \"eco-lang-dropdown\",\n      role: \"listbox\",\n      children: SUPPORTED_LANGUAGES.filter(code => LANGUAGE_INFO[code]).map(code => {\n        const info = LANGUAGE_INFO[code];\n        const isActive = code === lang;\n        return /*#__PURE__*/jsx(\"li\", {\n          role: \"option\",\n          \"aria-selected\": isActive,\n          children: /*#__PURE__*/jsxs(\"button\", {\n            type: \"button\",\n            className: `eco-lang-option ${isActive ? 'active' : ''}`,\n            onClick: e => {\n              e.preventDefault();\n              handleSelect(code);\n            },\n            children: [/*#__PURE__*/jsx(\"span\", {\n              className: \"eco-lang-flag\",\n              children: info.flag\n            }), /*#__PURE__*/jsx(\"span\", {\n              className: \"eco-lang-name\",\n              children: info.nativeName\n            }), /*#__PURE__*/jsx(\"span\", {\n              className: \"eco-lang-label\",\n              children: info.name\n            }), isActive && /*#__PURE__*/jsx(\"svg\", {\n              className: \"eco-lang-check\",\n              width: \"14\",\n              height: \"14\",\n              viewBox: \"0 0 14 14\",\n              fill: \"none\",\n              children: /*#__PURE__*/jsx(\"path\", {\n                d: \"M2.5 7L5.5 10L11.5 4\",\n                stroke: \"currentColor\",\n                strokeWidth: \"2\",\n                strokeLinecap: \"round\",\n                strokeLinejoin: \"round\"\n              })\n            })]\n          })\n        }, code);\n      })\n    }), /*#__PURE__*/jsx(\"style\", {\n      children: `\n        .eco-lang-switcher {\n          position: relative;\n          z-index: 100;\n        }\n\n        .eco-lang-trigger {\n          display: flex;\n          align-items: center;\n          gap: 6px;\n          padding: 6px 10px;\n          background: rgba(255, 255, 255, 0.1);\n          border: 1px solid rgba(255, 255, 255, 0.2);\n          border-radius: 8px;\n          color: inherit;\n          font-size: 13px;\n          cursor: pointer;\n          transition: all 0.2s ease;\n        }\n\n        .eco-lang-trigger:hover {\n          background: rgba(255, 255, 255, 0.15);\n          border-color: rgba(255, 255, 255, 0.3);\n        }\n\n        .eco-lang-dark .eco-lang-trigger {\n          background: rgba(255, 255, 255, 0.08);\n          border-color: rgba(255, 255, 255, 0.15);\n          color: rgba(255, 255, 255, 0.9);\n        }\n\n        .eco-lang-light .eco-lang-trigger {\n          background: rgba(0, 0, 0, 0.05);\n          border-color: rgba(0, 0, 0, 0.1);\n          color: #333;\n        }\n\n        .eco-lang-minimal .eco-lang-trigger {\n          background: transparent;\n          border: none;\n          padding: 4px 8px;\n        }\n\n        .eco-lang-flag {\n          font-size: 16px;\n          line-height: 1;\n        }\n\n        .eco-lang-name {\n          font-weight: 500;\n        }\n\n        .eco-lang-arrow {\n          transition: transform 0.2s ease;\n        }\n\n        .eco-lang-arrow.open {\n          transform: rotate(180deg);\n        }\n\n        .eco-lang-dropdown {\n          position: absolute;\n          top: calc(100% + 6px);\n          left: 0;\n          list-style: none;\n          margin: 0;\n          padding: 4px;\n          min-width: auto;\n          white-space: nowrap;\n          background: rgba(30, 30, 40, 0.98);\n          backdrop-filter: blur(20px);\n          border: 1px solid rgba(255, 255, 255, 0.15);\n          border-radius: 12px;\n          box-shadow: 0 10px 40px rgba(0, 0, 0, 0.4);\n          overflow: visible;\n          animation: dropdownSlide 0.2s ease;\n        }\n\n        /* 透明桥接区域，防止鼠标穿越间隙时菜单消失 */\n        .eco-lang-dropdown::before {\n          content: '';\n          position: absolute;\n          top: -10px;\n          left: 0;\n          right: 0;\n          height: 10px;\n        }\n\n        .eco-lang-light .eco-lang-dropdown {\n          background: rgba(255, 255, 255, 0.98);\n          border-color: rgba(0, 0, 0, 0.1);\n          box-shadow: 0 10px 40px rgba(0, 0, 0, 0.15);\n        }\n\n        @keyframes dropdownSlide {\n          from {\n            opacity: 0;\n            transform: translateY(-8px);\n          }\n          to {\n            opacity: 1;\n            transform: translateY(0);\n          }\n        }\n\n        .eco-lang-option {\n          display: flex;\n          align-items: center;\n          gap: 8px;\n          width: 100%;\n          padding: 10px 12px;\n          background: transparent;\n          border: none;\n          border-radius: 8px;\n          color: rgba(255, 255, 255, 0.85);\n          font-size: 14px;\n          text-align: left;\n          cursor: pointer;\n          transition: all 0.15s ease;\n        }\n\n        .eco-lang-light .eco-lang-option {\n          color: #333;\n        }\n\n        .eco-lang-option:hover {\n          background: rgba(255, 255, 255, 0.1);\n        }\n\n        .eco-lang-light .eco-lang-option:hover {\n          background: rgba(0, 0, 0, 0.05);\n        }\n\n        .eco-lang-option.active {\n          background: linear-gradient(135deg, rgba(99, 102, 241, 0.3), rgba(168, 85, 247, 0.3));\n        }\n\n        .eco-lang-option .eco-lang-name {\n          flex: 1;\n        }\n\n        .eco-lang-label {\n          font-size: 12px;\n          opacity: 0.6;\n        }\n\n        .eco-lang-check {\n          color: #a855f7;\n        }\n\n        .eco-lang-light .eco-lang-check {\n          color: #6366f1;\n        }\n      `\n    })]\n  });\n}\n\n/**\n * QuantaBit Auth SDK - 弹窗登录组件 (LoginModal)\n * \n * 安全连接弹窗，支持：\n * - 钱包登录（MetaMask, WalletConnect, Coinbase, QBit）\n * - DID 密码登录\n * - 注册新身份\n * - 多账户管理和切换\n */\n\nfunction LoginModal({\n  isOpen,\n  onClose,\n  onSuccess,\n  onError,\n  onLogout,\n  onModeChange,\n  apiBaseUrl = '/api/v1',\n  appName = 'QuantaBit',\n  appLogo,\n  language: initialLanguage = 'zh',\n  showRegister = true,\n  currentUser = null,\n  showSocialLogin = true,\n  socialProviders = ['apple', 'google', 'microsoft', 'wechat', 'tiktok'],\n  renderSocialLogin,\n  layoutMode = 'double',\n  theme = 'dark'\n}) {\n  const [mode, setMode] = useState('login'); // login, register, accounts\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState(null);\n  const [success, setSuccess] = useState(null);\n\n  // Client-side mounting state\n  const [mounted, setMounted] = useState(false);\n  useEffect(() => {\n    setMounted(true);\n    return () => setMounted(false);\n  }, []);\n\n  // 语言状态 - 与 DarkLoginModal 保持一致的同步机制\n  const [currentLanguage, setCurrentLanguage] = useState(initialLanguage);\n\n  // 语言切换处理\n  const handleLanguageChange = useCallback(newLang => {\n    setCurrentLanguage(newLang);\n    setLanguage(newLang);\n  }, []);\n\n  // 同步外部 props.language 变化\n  useEffect(() => {\n    if (initialLanguage && initialLanguage !== currentLanguage) {\n      console.log('[LoginModal] props.language 变化:', initialLanguage);\n      setCurrentLanguage(initialLanguage);\n    }\n  }, [initialLanguage]);\n\n  // 订阅全局语言变更\n  useEffect(() => {\n    if (typeof window === 'undefined') return;\n    const LANGUAGE_CHANGE_EVENT = 'qbit-did:language-change';\n    const SUPPORTED_LANGUAGES = ['en', 'zh', 'ja', 'ko'];\n    const handler = e => {\n      const newLang = e.detail?.language;\n      console.log('[LoginModal] 收到全局语言变更事件:', newLang);\n      if (newLang && SUPPORTED_LANGUAGES.includes(newLang)) {\n        setCurrentLanguage(newLang);\n      }\n    };\n    window.addEventListener(LANGUAGE_CHANGE_EVENT, handler);\n    console.log('[LoginModal] 已订阅全局语言事件');\n    return () => {\n      window.removeEventListener(LANGUAGE_CHANGE_EVENT, handler);\n      console.log('[LoginModal] 取消语言订阅');\n    };\n  }, []);\n\n  // Wallet states\n  const [walletStatus, setWalletStatus] = useState('idle');\n  const [activeWallet, setActiveWallet] = useState(null);\n\n  // Form states\n  const [did, setDid] = useState('');\n  const [password, setPassword] = useState('');\n  const [confirmPassword, setConfirmPassword] = useState('');\n  const [nickname, setNickname] = useState('');\n  const [email, setEmail] = useState('');\n\n  // Saved accounts\n  const [savedAccounts, setSavedAccounts] = useState([]);\n  const [currentSession, setCurrentSession] = useState(null);\n  const msg = getMessages$1(currentLanguage);\n\n  // 配置 API\n  useEffect(() => {\n    if (apiBaseUrl) {\n      if (typeof authApi.configure === 'function') {\n        authApi.configure({\n          apiBaseUrl\n        });\n      } else if (typeof authApi.setBaseUrl === 'function') {\n        authApi.setBaseUrl(apiBaseUrl);\n      }\n    }\n  }, [apiBaseUrl]);\n\n  // 加载保存的账户\n  useEffect(() => {\n    if (isOpen) {\n      setSavedAccounts(getSavedAccounts());\n      setCurrentSession(getCurrentSession());\n      setError(null);\n      setSuccess(null);\n      // 如果已登录，默认显示账户管理\n      if (currentUser?.did) {\n        setMode('accounts');\n      } else {\n        setMode('login');\n      }\n    }\n  }, [isOpen, currentUser]);\n\n  // 社交登录成功回调\n  const handleSocialSuccess = useCallback(result => {\n    const {\n      access_token,\n      refresh_token,\n      did,\n      user: resUser,\n      is_new_user\n    } = result;\n\n    // 保存 tokens 到 authApi (apiClient)\n    if (typeof authApi.setTokens === 'function') {\n      authApi.setTokens(access_token, refresh_token);\n    }\n    setCurrentDID(did);\n    saveAccount({\n      did,\n      displayName: resUser?.display_name || formatDID$1(did),\n      avatar: resUser?.avatar_url || resUser?.avatar,\n      verified: true\n    });\n    setSavedAccounts(getSavedAccounts());\n    setSuccess(msg.success || '登录成功');\n    setTimeout(() => {\n      onSuccess && onSuccess({\n        success: true,\n        accessToken: access_token,\n        refreshToken: refresh_token,\n        did,\n        user: {\n          nickname: resUser?.display_name || resUser?.name,\n          avatar: resUser?.avatar_url || resUser?.avatar,\n          ...resUser\n        },\n        isNewUser: is_new_user\n      });\n      onClose && onClose();\n    }, 1200);\n  }, [onSuccess, onClose, msg]);\n  const handleSocialError = useCallback(err => {\n    setError(err?.message || '社交登录失败');\n  }, []);\n\n  // 处理钱包登录\n  const handleWalletLogin = useCallback(async walletType => {\n    const ethereum = typeof window !== 'undefined' ? window.ethereum : undefined;\n    if (!ethereum) {\n      setError(msg.errorNoWallet || '未检测到钱包插件，请先安装');\n      return;\n    }\n    setLoading(true);\n    setError(null);\n    setActiveWallet(walletType);\n    setWalletStatus('connecting');\n    try {\n      const chainType = walletType === 'quantabit' ? 'quantabit' : 'ethereum';\n      const preferredWallet = walletType === 'quantabit' ? 'phantom' : walletType;\n      const {\n        address: walletAddress,\n        provider\n      } = await connectBrowserWallet(chainType, preferredWallet);\n\n      // 2. 获取 nonce\n      setWalletStatus('signing');\n      const nonceRes = await authApi.getNonce(walletAddress, chainType);\n      const {\n        message\n      } = nonceRes.data || nonceRes;\n\n      // 3. 签名\n      const signature = await signWalletMessage(chainType === 'quantabit' ? provider || getQBitProvider() : provider, chainType, message, walletAddress);\n\n      // 4. 验证登录\n      setWalletStatus('verifying');\n      const loginData = await authApi.walletLogin(walletAddress, signature, message, chainType);\n      const result = loginData.data || loginData;\n\n      // 保存 session\n      authApi.setTokens(result.access_token, result.refresh_token);\n      setCurrentDID(result.did);\n      saveAccount({\n        did: result.did,\n        displayName: result.display_name || result.user?.nickname,\n        avatar: result.avatar || result.user?.avatar,\n        walletAddress,\n        verified: true\n      });\n      setSavedAccounts(getSavedAccounts());\n      setSuccess('✓ ' + msg.success);\n      setTimeout(() => {\n        onSuccess && onSuccess({\n          success: true,\n          accessToken: result.access_token,\n          refreshToken: result.refresh_token,\n          did: result.did,\n          isNewUser: result.is_new_user,\n          user: result.user\n        });\n        onClose();\n      }, 800);\n    } catch (err) {\n      setError(err.message || msg.errorLoginFailed);\n      onError && onError(err);\n    } finally {\n      setLoading(false);\n      setWalletStatus('idle');\n      setActiveWallet(null);\n    }\n  }, [msg, onSuccess, onError, onClose]);\n\n  // 处理 DID 登录\n  const handleDIDLogin = useCallback(async () => {\n    if (!did.trim() || !password) {\n      setError('请输入 DID 和密码');\n      return;\n    }\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await authApi.didLogin(did, password);\n      const data = result.data || result;\n      authApi.setTokens(data.access_token, data.refresh_token);\n      setCurrentDID(data.did);\n      saveAccount({\n        did: data.did,\n        displayName: data.display_name || data.user?.nickname,\n        avatar: data.avatar || data.user?.avatar,\n        verified: true\n      });\n      setSavedAccounts(getSavedAccounts());\n      setSuccess('✓ ' + msg.success);\n      setTimeout(() => {\n        onSuccess && onSuccess({\n          success: true,\n          accessToken: data.access_token,\n          refreshToken: data.refresh_token,\n          did: data.did,\n          isNewUser: false,\n          user: data.user\n        });\n        onClose();\n      }, 800);\n    } catch (err) {\n      setError(err.message || msg.errorLoginFailed);\n      onError && onError(err);\n    } finally {\n      setLoading(false);\n    }\n  }, [did, password, msg, onSuccess, onError, onClose]);\n\n  // 处理快速登录\n  const handleQuickLogin = useCallback(account => {\n    setDid(account.did);\n    setMode('login');\n    setTimeout(() => {\n      document.getElementById('did-password-input')?.focus();\n    }, 100);\n  }, []);\n\n  // 处理注册\n  const handleRegister = useCallback(async () => {\n    if (password !== confirmPassword) {\n      setError(msg.errorPasswordMismatch);\n      return;\n    }\n    if (!nickname.trim()) {\n      setError('请输入昵称');\n      return;\n    }\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await authApi.register({\n        displayName: nickname.trim(),\n        email: email || undefined,\n        password\n      });\n      const data = result.data || result;\n      authApi.setTokens(data.access_token, data.refresh_token);\n      setCurrentDID(data.did);\n      saveAccount({\n        did: data.did,\n        displayName: nickname.trim(),\n        verified: true\n      });\n      setSavedAccounts(getSavedAccounts());\n      setSuccess('✓ 身份创建成功！');\n      setTimeout(() => {\n        onSuccess && onSuccess({\n          success: true,\n          accessToken: data.access_token,\n          refreshToken: data.refresh_token,\n          did: data.did,\n          isNewUser: true,\n          user: data.user\n        });\n        onClose();\n      }, 800);\n    } catch (err) {\n      setError(err.message || msg.errorRegisterFailed);\n      onError && onError(err);\n    } finally {\n      setLoading(false);\n    }\n  }, [nickname, email, password, confirmPassword, msg, onSuccess, onError, onClose]);\n\n  // 处理移除账户\n  const handleRemoveAccount = useCallback((accountDid, e) => {\n    e.stopPropagation();\n    if (window.confirm(msg.removeConfirm)) {\n      removeAccount(accountDid);\n      setSavedAccounts(getSavedAccounts());\n      setSuccess(msg.accountRemoved);\n      setTimeout(() => setSuccess(null), 2000);\n    }\n  }, [msg]);\n\n  // 处理登出\n  const handleLogout = useCallback(() => {\n    clearCurrentSession();\n    setCurrentSession(null);\n    setMode('login');\n    onLogout && onLogout();\n  }, [onLogout]);\n  if (!isOpen || !mounted) return null;\n\n  // 渲染账户管理视图\n  const renderAccountsView = () => {\n    const otherAccounts = savedAccounts.filter(a => a.did !== currentUser?.did);\n    return /*#__PURE__*/jsxs(\"div\", {\n      className: \"did-accounts-view\",\n      children: [/*#__PURE__*/jsxs(\"div\", {\n        className: \"did-accounts-header\",\n        children: [/*#__PURE__*/jsx(\"button\", {\n          className: \"did-accounts-back\",\n          onClick: () => setMode('login'),\n          children: msg.back\n        }), /*#__PURE__*/jsxs(\"h3\", {\n          children: [/*#__PURE__*/jsx(SwapIcon, {}), \" \", msg.accountsSection]\n        })]\n      }), currentUser?.did && /*#__PURE__*/jsxs(\"div\", {\n        className: \"did-current-account\",\n        children: [/*#__PURE__*/jsx(\"p\", {\n          className: \"did-section-label\",\n          children: msg.currentAccount\n        }), /*#__PURE__*/jsxs(\"div\", {\n          className: \"did-account-card current\",\n          children: [/*#__PURE__*/jsx(\"div\", {\n            className: \"did-account-avatar\",\n            children: currentUser.avatar ? /*#__PURE__*/jsx(\"img\", {\n              src: currentUser.avatar,\n              alt: \"\"\n            }) : /*#__PURE__*/jsx(\"span\", {\n              children: \"\\uD83D\\uDD10\"\n            })\n          }), /*#__PURE__*/jsxs(\"div\", {\n            className: \"did-account-info\",\n            children: [/*#__PURE__*/jsxs(\"span\", {\n              className: \"did-account-name\",\n              children: [currentUser.nickname || currentUser.displayName || formatDID$1(currentUser.did), /*#__PURE__*/jsx(VerifiedIcon, {})]\n            }), /*#__PURE__*/jsx(\"span\", {\n              className: \"did-account-did\",\n              children: formatDID$1(currentUser.did)\n            })]\n          }), /*#__PURE__*/jsx(\"button\", {\n            className: \"did-logout-btn\",\n            onClick: handleLogout,\n            title: msg.logout,\n            children: /*#__PURE__*/jsx(LogoutIcon, {})\n          })]\n        })]\n      }), /*#__PURE__*/jsxs(\"button\", {\n        className: \"did-add-account-btn\",\n        onClick: () => setMode('login'),\n        children: [/*#__PURE__*/jsx(PlusIcon, {}), /*#__PURE__*/jsx(\"span\", {\n          children: msg.addNewAccount\n        })]\n      }), otherAccounts.length > 0 && /*#__PURE__*/jsxs(\"div\", {\n        className: \"did-other-accounts\",\n        children: [/*#__PURE__*/jsx(\"p\", {\n          className: \"did-section-label\",\n          children: msg.otherAccounts\n        }), otherAccounts.map(account => /*#__PURE__*/jsxs(\"div\", {\n          className: \"did-account-card\",\n          onClick: () => handleQuickLogin(account),\n          children: [/*#__PURE__*/jsx(\"div\", {\n            className: \"did-account-avatar\",\n            children: account.avatar ? /*#__PURE__*/jsx(\"img\", {\n              src: account.avatar,\n              alt: \"\"\n            }) : /*#__PURE__*/jsx(\"span\", {\n              children: \"\\uD83D\\uDD10\"\n            })\n          }), /*#__PURE__*/jsxs(\"div\", {\n            className: \"did-account-info\",\n            children: [/*#__PURE__*/jsxs(\"span\", {\n              className: \"did-account-name\",\n              children: [account.displayName || formatDID$1(account.did), account.verified && /*#__PURE__*/jsx(VerifiedIcon, {})]\n            }), /*#__PURE__*/jsx(\"span\", {\n              className: \"did-account-did\",\n              children: formatDID$1(account.did)\n            })]\n          }), /*#__PURE__*/jsx(\"button\", {\n            className: \"did-switch-btn\",\n            children: msg.switchAccount\n          }), /*#__PURE__*/jsx(\"button\", {\n            className: \"did-remove-btn\",\n            onClick: e => handleRemoveAccount(account.did, e),\n            title: msg.removeAccount,\n            children: /*#__PURE__*/jsx(TrashIcon, {})\n          })]\n        }, account.did))]\n      }), otherAccounts.length === 0 && !currentUser?.did && /*#__PURE__*/jsx(\"p\", {\n        className: \"did-no-accounts\",\n        children: msg.noOtherAccounts\n      })]\n    });\n  };\n  return /*#__PURE__*/ReactDOM.createPortal(/*#__PURE__*/jsx(\"div\", {\n    className: `did-login-overlay did-theme-${theme}`,\n    onClick: e => e.target === e.currentTarget && onClose(),\n    children: /*#__PURE__*/jsxs(\"div\", {\n      className: `did-login-modal${layoutMode === 'single' ? ' layout-single' : ''}`,\n      children: [/*#__PURE__*/jsxs(\"div\", {\n        className: \"did-login-toolbar\",\n        children: [/*#__PURE__*/jsx(LanguageSwitcher, {\n          currentLanguage: currentLanguage,\n          onLanguageChange: handleLanguageChange,\n          variant: \"dark\",\n          showFlag: true,\n          showName: false\n        }), onModeChange && /*#__PURE__*/jsx(\"button\", {\n          className: \"did-login-mode-btn\",\n          onClick: () => onModeChange('compact'),\n          title: currentLanguage === 'zh' ? '简易模式' : 'Compact Mode',\n          children: /*#__PURE__*/jsx(MinimizeIcon, {\n            size: 18\n          })\n        }), /*#__PURE__*/jsx(\"button\", {\n          className: \"did-login-close\",\n          onClick: onClose,\n          children: /*#__PURE__*/jsx(CloseIcon, {})\n        })]\n      }), /*#__PURE__*/jsxs(\"div\", {\n        className: \"did-login-header\",\n        children: [/*#__PURE__*/jsxs(\"div\", {\n          className: \"did-login-brand\",\n          children: [appLogo ? /*#__PURE__*/jsx(\"img\", {\n            src: appLogo,\n            alt: appName,\n            className: \"did-login-app-logo\"\n          }) : /*#__PURE__*/jsx(\"div\", {\n            className: \"did-login-logo\",\n            children: /*#__PURE__*/jsx(ShieldIcon, {})\n          }), /*#__PURE__*/jsxs(\"div\", {\n            children: [/*#__PURE__*/jsxs(\"h2\", {\n              children: [msg.title, \" \", /*#__PURE__*/jsx(\"span\", {\n                className: \"did-app-name\",\n                children: appName\n              })]\n            }), /*#__PURE__*/jsx(\"p\", {\n              style: {\n                display: 'inline'\n              },\n              children: msg.subtitle\n            }), /*#__PURE__*/jsxs(\"span\", {\n              className: \"did-security-badge\",\n              style: {\n                padding: '2px 8px',\n                fontSize: '11px',\n                marginLeft: '8px',\n                display: 'inline-flex',\n                verticalAlign: 'middle'\n              },\n              children: [/*#__PURE__*/jsx(LockIcon, {\n                size: 12\n              }), \" \", msg.encryptedConnection]\n            }), /*#__PURE__*/jsxs(\"span\", {\n              className: \"did-security-badge\",\n              style: {\n                padding: '2px 8px',\n                fontSize: '11px',\n                marginLeft: '4px',\n                display: 'inline-flex',\n                verticalAlign: 'middle'\n              },\n              children: [/*#__PURE__*/jsx(VerifiedIcon, {\n                size: 12\n              }), \" \", msg.decentralizedAuth]\n            })]\n          })]\n        }), savedAccounts.length > 0 && mode !== 'accounts' && /*#__PURE__*/jsx(\"div\", {\n          style: {\n            padding: '0 24px 8px'\n          },\n          children: /*#__PURE__*/jsxs(\"button\", {\n            className: \"did-manage-accounts-btn\",\n            onClick: () => setMode('accounts'),\n            children: [/*#__PURE__*/jsx(SwapIcon, {\n              size: 14\n            }), \" \", msg.manageAccounts]\n          })\n        })]\n      }), error && /*#__PURE__*/jsxs(\"div\", {\n        className: \"did-login-error\",\n        children: [\"\\u26A0\\uFE0F \", error]\n      }), success && /*#__PURE__*/jsx(\"div\", {\n        className: \"did-login-success\",\n        children: success\n      }), mode === 'accounts' ? /*#__PURE__*/jsx(\"div\", {\n        className: \"did-login-content single-column\",\n        children: renderAccountsView()\n      }) : /*#__PURE__*/jsxs(\"div\", {\n        className: `did-login-content${layoutMode === 'single' ? ' layout-single' : ''}`,\n        children: [/*#__PURE__*/jsxs(\"div\", {\n          className: \"did-login-left\",\n          children: [/*#__PURE__*/jsxs(\"h3\", {\n            children: [/*#__PURE__*/jsx(\"span\", {\n              className: \"did-login-icon\",\n              children: \"\\uD83D\\uDC5B\"\n            }), msg.walletSection]\n          }), /*#__PURE__*/jsxs(\"div\", {\n            className: \"did-login-wallets\",\n            children: [/*#__PURE__*/jsxs(\"button\", {\n              className: `did-wallet-btn featured ${activeWallet === 'quantabit' ? 'active' : ''}`,\n              onClick: () => handleWalletLogin('quantabit'),\n              disabled: loading,\n              children: [/*#__PURE__*/jsx(QBitIcon, {}), /*#__PURE__*/jsx(\"span\", {\n                children: msg.quantabitWallet\n              }), /*#__PURE__*/jsx(\"span\", {\n                className: \"did-wallet-badge\",\n                children: msg.recommended\n              })]\n            }), /*#__PURE__*/jsxs(\"button\", {\n              className: `did-wallet-btn ${activeWallet === 'metamask' ? 'active' : ''}`,\n              onClick: () => handleWalletLogin('metamask'),\n              disabled: loading,\n              children: [/*#__PURE__*/jsx(MetaMaskIcon$1, {}), /*#__PURE__*/jsxs(\"span\", {\n                children: [activeWallet === 'metamask' && walletStatus === 'connecting' && msg.connecting, activeWallet === 'metamask' && walletStatus === 'signing' && msg.signing, activeWallet === 'metamask' && walletStatus === 'verifying' && msg.verifying, activeWallet !== 'metamask' && msg.metamask]\n              }), activeWallet === 'metamask' && /*#__PURE__*/jsx(\"span\", {\n                className: \"did-wallet-spinner\"\n              }), !loading && /*#__PURE__*/jsx(\"span\", {\n                className: \"did-secure-icon\",\n                children: /*#__PURE__*/jsx(LockIcon, {})\n              })]\n            }), /*#__PURE__*/jsxs(\"button\", {\n              className: \"did-wallet-btn\",\n              onClick: () => handleWalletLogin('walletconnect'),\n              disabled: loading,\n              children: [/*#__PURE__*/jsx(WalletConnectIcon$1, {}), /*#__PURE__*/jsx(\"span\", {\n                children: msg.walletConnect\n              }), /*#__PURE__*/jsx(\"span\", {\n                className: \"did-secure-icon\",\n                children: /*#__PURE__*/jsx(LockIcon, {})\n              })]\n            }), /*#__PURE__*/jsxs(\"button\", {\n              className: \"did-wallet-btn\",\n              onClick: () => handleWalletLogin('trust'),\n              disabled: loading,\n              children: [/*#__PURE__*/jsx(TrustWalletIcon$1, {}), /*#__PURE__*/jsx(\"span\", {\n                children: \"Trust Wallet\"\n              }), /*#__PURE__*/jsx(\"span\", {\n                className: \"did-secure-icon\",\n                children: /*#__PURE__*/jsx(LockIcon, {})\n              })]\n            })]\n          })]\n        }), /*#__PURE__*/jsx(\"div\", {\n          className: \"did-login-divider\",\n          children: /*#__PURE__*/jsx(\"span\", {\n            children: msg.orDivider\n          })\n        }), /*#__PURE__*/jsx(\"div\", {\n          className: \"did-login-right\",\n          children: mode === 'login' ? /*#__PURE__*/jsxs(Fragment, {\n            children: [/*#__PURE__*/jsxs(\"h3\", {\n              children: [/*#__PURE__*/jsx(\"span\", {\n                className: \"did-login-icon\",\n                children: \"\\uD83C\\uDD94\"\n              }), msg.didSection]\n            }), savedAccounts.length > 0 && /*#__PURE__*/jsxs(\"div\", {\n              className: \"did-saved-accounts\",\n              children: [/*#__PURE__*/jsx(\"p\", {\n                className: \"did-saved-label\",\n                children: msg.savedAccounts\n              }), savedAccounts.slice(0, 3).map(account => /*#__PURE__*/jsxs(\"button\", {\n                className: `did-saved-account ${currentSession?.did === account.did ? 'current' : ''}`,\n                onClick: () => handleQuickLogin(account),\n                children: [/*#__PURE__*/jsx(\"div\", {\n                  className: \"did-saved-avatar\",\n                  children: account.avatar ? /*#__PURE__*/jsx(\"img\", {\n                    src: account.avatar,\n                    alt: \"\"\n                  }) : /*#__PURE__*/jsx(\"span\", {\n                    children: \"\\uD83D\\uDD10\"\n                  })\n                }), /*#__PURE__*/jsxs(\"div\", {\n                  className: \"did-saved-info\",\n                  children: [/*#__PURE__*/jsxs(\"span\", {\n                    className: \"did-saved-name\",\n                    children: [account.displayName || formatDID$1(account.did), account.verified && /*#__PURE__*/jsx(VerifiedIcon, {})]\n                  }), /*#__PURE__*/jsx(\"span\", {\n                    className: \"did-saved-did\",\n                    children: formatDID$1(account.did)\n                  })]\n                }), currentSession?.did === account.did ? /*#__PURE__*/jsx(\"span\", {\n                  className: \"did-saved-status current\",\n                  children: msg.relogin\n                }) : /*#__PURE__*/jsx(\"span\", {\n                  className: \"did-saved-status\",\n                  children: msg.quickLogin\n                })]\n              }, account.did))]\n            }), /*#__PURE__*/jsxs(\"div\", {\n              className: \"did-login-form\",\n              children: [/*#__PURE__*/jsx(\"div\", {\n                className: \"did-input-wrapper\",\n                children: /*#__PURE__*/jsx(\"input\", {\n                  type: \"text\",\n                  className: \"did-login-input\",\n                  placeholder: msg.didPlaceholder,\n                  value: did,\n                  onChange: e => setDid(e.target.value),\n                  disabled: loading\n                })\n              }), /*#__PURE__*/jsxs(\"div\", {\n                className: \"did-input-wrapper\",\n                children: [/*#__PURE__*/jsx(\"input\", {\n                  id: \"did-password-input\",\n                  type: \"password\",\n                  className: \"did-login-input\",\n                  placeholder: msg.passwordPlaceholder,\n                  value: password,\n                  onChange: e => setPassword(e.target.value),\n                  disabled: loading,\n                  onKeyDown: e => e.key === 'Enter' && handleDIDLogin()\n                }), /*#__PURE__*/jsx(\"span\", {\n                  className: \"did-input-icon\",\n                  children: /*#__PURE__*/jsx(LockIcon, {})\n                })]\n              }), /*#__PURE__*/jsxs(\"button\", {\n                className: \"did-login-submit\",\n                onClick: handleDIDLogin,\n                disabled: loading || !did.trim() || !password,\n                children: [/*#__PURE__*/jsx(ShieldIcon, {}), loading ? msg.loggingIn : msg.loginButton]\n              })]\n            }), showRegister && /*#__PURE__*/jsxs(\"p\", {\n              className: \"did-login-switch\",\n              children: [msg.newToDID, \" \", /*#__PURE__*/jsx(\"button\", {\n                onClick: () => setMode('register'),\n                children: msg.createDID\n              })]\n            }), showSocialLogin && /*#__PURE__*/jsxs(\"div\", {\n              className: \"did-social-login-container\",\n              style: {\n                margin: '15px 0 5px 0',\n                display: 'flex',\n                flexDirection: 'column',\n                alignItems: 'center',\n                width: '100%'\n              },\n              children: [/*#__PURE__*/jsxs(\"div\", {\n                className: \"did-social-divider\",\n                style: {\n                  width: '100%',\n                  display: 'flex',\n                  alignItems: 'center',\n                  margin: '10px 0 15px 0',\n                  color: '#6b7280',\n                  fontSize: '13px'\n                },\n                children: [/*#__PURE__*/jsx(\"div\", {\n                  style: {\n                    flex: 1,\n                    height: '1px',\n                    backgroundColor: 'rgba(255,255,255,0.08)'\n                  }\n                }), /*#__PURE__*/jsx(\"span\", {\n                  style: {\n                    padding: '0 10px'\n                  },\n                  children: msg.orDivider || '或'\n                }), /*#__PURE__*/jsx(\"div\", {\n                  style: {\n                    flex: 1,\n                    height: '1px',\n                    backgroundColor: 'rgba(255,255,255,0.08)'\n                  }\n                })]\n              }), renderSocialLogin ? typeof renderSocialLogin === 'function' ? renderSocialLogin() : renderSocialLogin : /*#__PURE__*/jsx(OAuthIconGroup, {\n                providers: socialProviders,\n                onSuccess: handleSocialSuccess,\n                onError: handleSocialError\n              })]\n            })]\n          }) : mode === 'register' ? /*#__PURE__*/jsxs(Fragment, {\n            children: [/*#__PURE__*/jsxs(\"h3\", {\n              children: [/*#__PURE__*/jsx(\"span\", {\n                className: \"did-login-icon\",\n                children: \"\\u2728\"\n              }), msg.registerSection]\n            }), /*#__PURE__*/jsxs(\"div\", {\n              className: \"did-login-form\",\n              children: [/*#__PURE__*/jsx(\"input\", {\n                type: \"text\",\n                className: \"did-login-input\",\n                placeholder: msg.nicknamePlaceholder,\n                value: nickname,\n                onChange: e => setNickname(e.target.value),\n                disabled: loading\n              }), /*#__PURE__*/jsx(\"input\", {\n                type: \"email\",\n                className: \"did-login-input\",\n                placeholder: msg.emailPlaceholder,\n                value: email,\n                onChange: e => setEmail(e.target.value),\n                disabled: loading\n              }), /*#__PURE__*/jsxs(\"div\", {\n                className: \"did-input-wrapper\",\n                children: [/*#__PURE__*/jsx(\"input\", {\n                  type: \"password\",\n                  className: \"did-login-input\",\n                  placeholder: msg.passwordPlaceholder,\n                  value: password,\n                  onChange: e => setPassword(e.target.value),\n                  disabled: loading\n                }), /*#__PURE__*/jsx(\"span\", {\n                  className: \"did-input-icon\",\n                  children: /*#__PURE__*/jsx(LockIcon, {})\n                })]\n              }), /*#__PURE__*/jsxs(\"div\", {\n                className: \"did-input-wrapper\",\n                children: [/*#__PURE__*/jsx(\"input\", {\n                  type: \"password\",\n                  className: \"did-login-input\",\n                  placeholder: msg.confirmPasswordPlaceholder,\n                  value: confirmPassword,\n                  onChange: e => setConfirmPassword(e.target.value),\n                  disabled: loading,\n                  onKeyDown: e => e.key === 'Enter' && handleRegister()\n                }), /*#__PURE__*/jsx(\"span\", {\n                  className: \"did-input-icon\",\n                  children: /*#__PURE__*/jsx(LockIcon, {})\n                })]\n              }), /*#__PURE__*/jsxs(\"button\", {\n                className: \"did-login-submit\",\n                onClick: handleRegister,\n                disabled: loading || !nickname.trim() || !password,\n                children: [/*#__PURE__*/jsx(ShieldIcon, {}), loading ? msg.registering : msg.registerButton]\n              })]\n            }), /*#__PURE__*/jsxs(\"p\", {\n              className: \"did-login-switch\",\n              children: [msg.alreadyHaveDID, \" \", /*#__PURE__*/jsx(\"button\", {\n                onClick: () => setMode('login'),\n                children: msg.goLogin\n              })]\n            }), showSocialLogin && /*#__PURE__*/jsxs(\"div\", {\n              className: \"did-social-login-container\",\n              style: {\n                margin: '15px 0 5px 0',\n                display: 'flex',\n                flexDirection: 'column',\n                alignItems: 'center',\n                width: '100%'\n              },\n              children: [/*#__PURE__*/jsxs(\"div\", {\n                className: \"did-social-divider\",\n                style: {\n                  width: '100%',\n                  display: 'flex',\n                  alignItems: 'center',\n                  margin: '10px 0 15px 0',\n                  color: '#6b7280',\n                  fontSize: '13px'\n                },\n                children: [/*#__PURE__*/jsx(\"div\", {\n                  style: {\n                    flex: 1,\n                    height: '1px',\n                    backgroundColor: 'rgba(255,255,255,0.08)'\n                  }\n                }), /*#__PURE__*/jsx(\"span\", {\n                  style: {\n                    padding: '0 10px'\n                  },\n                  children: msg.orDivider || '或'\n                }), /*#__PURE__*/jsx(\"div\", {\n                  style: {\n                    flex: 1,\n                    height: '1px',\n                    backgroundColor: 'rgba(255,255,255,0.08)'\n                  }\n                })]\n              }), renderSocialLogin ? typeof renderSocialLogin === 'function' ? renderSocialLogin() : renderSocialLogin : /*#__PURE__*/jsx(OAuthIconGroup, {\n                providers: socialProviders,\n                onSuccess: handleSocialSuccess,\n                onError: handleSocialError\n              })]\n            })]\n          }) : null\n        })]\n      }), /*#__PURE__*/jsxs(\"div\", {\n        className: \"did-login-footer\",\n        style: {\n          padding: '16px 32px'\n        },\n        children: [/*#__PURE__*/jsxs(\"p\", {\n          style: {\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'center',\n            gap: '6px',\n            marginBottom: '4px'\n          },\n          children: [/*#__PURE__*/jsx(\"span\", {\n            style: {\n              color: '#22c55e',\n              display: 'flex'\n            },\n            children: /*#__PURE__*/jsx(LockIcon, {\n              size: 14\n            })\n          }), /*#__PURE__*/jsx(\"span\", {\n            style: {\n              color: '#888'\n            },\n            children: msg.securityNote\n          })]\n        }), /*#__PURE__*/jsxs(\"p\", {\n          style: {\n            color: '#aaa',\n            fontSize: '12px'\n          },\n          children: [\"\\uFFFD \", msg.poweredBy]\n        })]\n      })]\n    })\n  }), document.body);\n}\n\n/**\n * QuantaBit Auth SDK - 完整 API 客户端\n * \n * 核心 API 服务，对接 qbit_sdk 后端所有模块：\n * - 认证 (Auth)\n * - DID 管理 (DID)\n * - 用户资料 (Profile)\n * - 钱包绑定 (Wallet)\n * - 凭证管理 (Credentials)\n * - 声誉系统 (Reputation)\n * - 社交绑定 (Social)\n * - 验证服务 (Verification)\n * - OAuth 授权 (OAuth)\n * \n * 统一配置：\n * - 所有 SDK 共享 @quantabit/sdk-config 的配置\n * - 修改 sdk-config 配置后，所有 SDK 同时生效\n */\n\n\n/**\n * 获取当前配置（优先使用统一配置）\n */\nfunction getGlobalConfig() {\n  try {\n    const config = getConfig();\n    if (config) return config;\n  } catch (e) {\n    // Ignore fallback\n  }\n  return {\n    apiBaseUrl: '/api/v1',\n    timeout: 30000,\n    tokenStorageKey: 'qbit_did_access_token',\n    refreshTokenStorageKey: 'qbit_did_refresh_token',\n    currentSessionKey: 'qbit_did_current',\n    autoRefreshToken: true,\n    debug: false\n  };\n}\nconst DEFAULT_API_BASE = '/api/v1';\nclass QbitDIDApiClient {\n  constructor(config = {}) {\n    // 如果没有传入 apiBaseUrl，尝试从统一配置获取\n    const globalConfig = getGlobalConfig();\n    this.baseUrl = config.apiBaseUrl || globalConfig.apiBaseUrl || DEFAULT_API_BASE;\n    this.timeout = config.timeout || globalConfig.timeout || 30000;\n    this.onTokenRefresh = config.onTokenRefresh;\n    this.onAuthError = config.onAuthError;\n    this.onTokenExpired = config.onTokenExpired;\n    this.autoRefreshToken = config.autoRefreshToken ?? globalConfig.autoRefreshToken ?? true;\n    this._refreshPromise = null;\n    this._isRefreshing = false; // 防止刷新递归\n\n    // Token 存储键可配置\n    this._tokenKey = config.tokenStorageKey || globalConfig.tokenStorageKey || 'qbit_did_access_token';\n    this._refreshTokenKey = config.refreshTokenStorageKey || globalConfig.refreshTokenStorageKey || 'qbit_did_refresh_token';\n    this._sessionKey = config.currentSessionKey || globalConfig.currentSessionKey || 'qbit_did_current';\n\n    // 订阅配置变更（如果 sdk-config 可用，使用 WeakRef 避免内存泄漏）\n    if (typeof subscribeConfig === 'function') {\n      if (typeof WeakRef !== 'undefined') {\n        const weakSelf = new WeakRef(this);\n        let unsubscribe;\n        const listener = newConfig => {\n          const self = weakSelf.deref();\n          if (self) {\n            // 动态更新配置\n            if (!config.apiBaseUrl) {\n              self.baseUrl = newConfig.apiBaseUrl;\n            }\n            if (!config.timeout) {\n              self.timeout = newConfig.timeout;\n            }\n          } else if (unsubscribe) {\n            unsubscribe();\n          }\n        };\n        unsubscribe = subscribeConfig(listener);\n        this._unsubscribe = unsubscribe;\n      } else {\n        this._unsubscribe = subscribeConfig(newConfig => {\n          // 动态更新配置\n          if (!config.apiBaseUrl) {\n            this.baseUrl = newConfig.apiBaseUrl;\n          }\n          if (!config.timeout) {\n            this.timeout = newConfig.timeout;\n          }\n        });\n      }\n    }\n  }\n\n  /**\n   * 配置 API\n   */\n  configure(config) {\n    if (config.apiBaseUrl) this.baseUrl = config.apiBaseUrl;\n    if (config.timeout) this.timeout = config.timeout;\n    if (config.onTokenRefresh) this.onTokenRefresh = config.onTokenRefresh;\n    if (config.onAuthError) this.onAuthError = config.onAuthError;\n    if (config.onTokenExpired) this.onTokenExpired = config.onTokenExpired;\n    if (config.autoRefreshToken !== undefined) this.autoRefreshToken = config.autoRefreshToken;\n  }\n\n  /**\n   * 销毁实例，主动取消全局配置订阅，防止内存泄漏\n   */\n  destroy() {\n    if (this._unsubscribe) {\n      this._unsubscribe();\n      this._unsubscribe = null;\n    }\n  }\n\n  // ============ 通用请求方法 ============\n\n  async request(endpoint, options = {}) {\n    const {\n      params: rawParams,\n      ...fetchOptions\n    } = options;\n    const params = rawParams ? new URLSearchParams() : null;\n    if (params) {\n      Object.entries(options.params).forEach(([key, value]) => {\n        if (value !== undefined && value !== null) {\n          params.append(key, String(value));\n        }\n      });\n    }\n    const queryString = params && Array.from(params.keys()).length > 0 ? `?${params.toString()}` : '';\n    const url = `${this.baseUrl}${endpoint}${queryString}`;\n    const token = this.getToken();\n    const isFormData = typeof FormData !== 'undefined' && fetchOptions.body instanceof FormData;\n    const headers = {\n      ...options.headers\n    };\n    if (!isFormData && headers['Content-Type'] !== null) {\n      headers['Content-Type'] = headers['Content-Type'] || 'application/json';\n    }\n    if (token) {\n      headers['Authorization'] = `Bearer ${token}`;\n    }\n    const controller = new AbortController();\n    const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n    try {\n      const response = await fetch(url, {\n        ...fetchOptions,\n        headers,\n        signal: controller.signal\n      });\n      clearTimeout(timeoutId);\n      if (!response.ok) {\n        // 401 自动刷新 Token（防止递归：刷新请求本身不触发二次刷新）\n        if (response.status === 401 && this.autoRefreshToken && !this._isRefreshing) {\n          const refreshed = await this._tryRefreshToken();\n          if (refreshed) {\n            // 用新 Token 重试原始请求\n            headers['Authorization'] = `Bearer ${this.getToken()}`;\n            return this.request(endpoint, {\n              ...options,\n              _retried: true\n            });\n          }\n          this.clearTokens();\n          this.onTokenExpired?.();\n        }\n        const error = await response.json().catch(() => ({}));\n        // 提取可读的错误消息（防止 [object Object]）\n        let errorMsg = error.detail || error.message;\n        if (Array.isArray(errorMsg)) {\n          errorMsg = errorMsg[0]?.msg || errorMsg[0]?.message || JSON.stringify(errorMsg);\n        } else if (typeof errorMsg === 'object' && errorMsg !== null) {\n          errorMsg = errorMsg.msg || errorMsg.message || JSON.stringify(errorMsg);\n        }\n        const err = new Error(errorMsg || `HTTP ${response.status}`);\n        err.code = error.code || `HTTP_${response.status}`;\n        err.status = response.status;\n        this.onAuthError?.(err);\n        throw err;\n      }\n      return response.json();\n    } catch (error) {\n      clearTimeout(timeoutId);\n      if (error.name === 'AbortError') {\n        throw new Error('Request timeout');\n      }\n      throw error;\n    }\n  }\n  async _tryRefreshToken() {\n    if (this._refreshPromise) {\n      return this._refreshPromise;\n    }\n    const refreshToken = this.getRefreshToken();\n    if (!refreshToken) return false;\n    this._isRefreshing = true; // 防止递归\n    this._refreshPromise = (async () => {\n      try {\n        const result = await this.request('/auth/refresh', {\n          method: 'POST',\n          body: JSON.stringify({\n            refresh_token: refreshToken\n          })\n        });\n        const data = result.data || result;\n        this.setTokens(data.access_token, data.refresh_token);\n        return true;\n      } catch {\n        this.clearTokens();\n        return false;\n      } finally {\n        this._refreshPromise = null;\n        this._isRefreshing = false;\n      }\n    })();\n    return this._refreshPromise;\n  }\n\n  // ============ Token 管理 ============\n\n  getToken() {\n    if (typeof window === 'undefined') return null;\n    return localStorage.getItem(this._tokenKey);\n  }\n  getRefreshToken() {\n    if (typeof window === 'undefined') return null;\n    return localStorage.getItem(this._refreshTokenKey);\n  }\n  setTokens(accessToken, refreshToken) {\n    if (typeof window === 'undefined') return;\n    localStorage.setItem(this._tokenKey, accessToken);\n    if (refreshToken) {\n      localStorage.setItem(this._refreshTokenKey, refreshToken);\n    }\n    this.onTokenRefresh?.({\n      accessToken,\n      refreshToken\n    });\n  }\n  clearTokens() {\n    if (typeof window === 'undefined') return;\n    localStorage.removeItem(this._tokenKey);\n    localStorage.removeItem(this._refreshTokenKey);\n    localStorage.removeItem(this._sessionKey);\n  }\n  isAuthenticated() {\n    return !!this.getToken();\n  }\n  setAccessToken(token) {\n    this.setTokens(token);\n  }\n  async loginWithWallet({\n    walletAddress,\n    signature,\n    message,\n    chainType = 'quantabit'\n  }) {\n    return this.walletLogin(walletAddress, signature, message, chainType);\n  }\n\n  // ============ 认证 API ============\n\n  async getNonce(walletAddress, chainType = 'quantabit') {\n    return this.request('/auth/nonce', {\n      method: 'POST',\n      body: JSON.stringify({\n        wallet_address: walletAddress,\n        chain_type: chainType\n      })\n    });\n  }\n  async walletLogin(walletAddress, signature, message, chainType = 'quantabit') {\n    return this.request('/auth/wallet', {\n      method: 'POST',\n      body: JSON.stringify({\n        wallet_address: walletAddress,\n        signature,\n        message,\n        chain_type: chainType\n      })\n    });\n  }\n  async didLogin(did, password, pin = null, totpCode = null) {\n    return this.request('/auth/did-login', {\n      method: 'POST',\n      body: JSON.stringify({\n        did: did.trim(),\n        password,\n        pin,\n        totp_code: totpCode\n      })\n    });\n  }\n  async register(data) {\n    return this.request('/auth/register', {\n      method: 'POST',\n      body: JSON.stringify({\n        username: data.displayName || data.nickname,\n        nickname: data.displayName || data.nickname,\n        display_name: data.displayName || data.nickname,\n        email: data.email || undefined,\n        password: data.password\n      })\n    });\n  }\n  async refreshToken(refreshToken) {\n    return this.request('/auth/refresh', {\n      method: 'POST',\n      body: JSON.stringify({\n        refresh_token: refreshToken\n      })\n    });\n  }\n  async logout() {\n    try {\n      await this.request('/auth/logout', {\n        method: 'POST',\n        body: '{}'\n      });\n    } catch {\n      // Ignore errors\n    }\n    this.clearTokens();\n  }\n  async setPin(did, password, pin) {\n    return this.request('/auth/set-pin', {\n      method: 'POST',\n      body: JSON.stringify({\n        did,\n        password,\n        pin\n      })\n    });\n  }\n\n  // ============ DID API ============\n\n  async getMyDID() {\n    return this.request('/did/me', {\n      method: 'GET'\n    });\n  }\n  async resolveDID(did) {\n    return this.request(`/did/resolve/${encodeURIComponent(did)}`, {\n      method: 'GET'\n    });\n  }\n  async resolveDIDFromChain(did) {\n    return this.request(`/chain/did/resolve/${encodeURIComponent(did)}`, {\n      method: 'GET'\n    });\n  }\n  async createDID(options = {}) {\n    return this.request('/did/create', {\n      method: 'POST',\n      body: JSON.stringify({\n        initial_keys: options.initialKeys,\n        services: options.services\n      })\n    });\n  }\n  async updateDIDDocument(operation) {\n    return this.request('/did/document', {\n      method: 'PUT',\n      body: JSON.stringify(operation)\n    });\n  }\n  async registerDIDOnChain() {\n    return this.request('/chain/did/register', {\n      method: 'POST',\n      body: '{}'\n    });\n  }\n  async submitDIDRegisterTxHash(txHash) {\n    return this.request('/chain/did/register/submit', {\n      method: 'POST',\n      body: JSON.stringify({\n        tx_hash: txHash\n      })\n    });\n  }\n  async updateDIDOnChain() {\n    return this.request('/chain/did/update', {\n      method: 'POST',\n      body: '{}'\n    });\n  }\n  async submitDIDUpdateTxHash(txHash) {\n    return this.request('/chain/did/update/submit', {\n      method: 'POST',\n      body: JSON.stringify({\n        tx_hash: txHash\n      })\n    });\n  }\n  async verifyDIDOnChain(did) {\n    return this.request(`/chain/did/verify/${encodeURIComponent(did)}`, {\n      method: 'GET'\n    });\n  }\n\n  // ============ Profile API ============\n\n  async getProfile() {\n    return this.request('/profile/me', {\n      method: 'GET'\n    });\n  }\n  async getMe() {\n    return this.getProfile();\n  }\n  async updateProfile(data) {\n    return this.request('/profile/me', {\n      method: 'PUT',\n      body: JSON.stringify(data)\n    });\n  }\n  async getPublicProfile(did) {\n    return this.request(`/profile/public/${encodeURIComponent(did)}`, {\n      method: 'GET'\n    });\n  }\n  async updatePrivacySettings(settings) {\n    return this.request('/profile/privacy', {\n      method: 'PUT',\n      body: JSON.stringify({\n        privacy_settings: settings\n      })\n    });\n  }\n  async uploadAvatar(file) {\n    const formData = new FormData();\n    formData.append('file', file);\n    return this.request('/profile/avatar', {\n      method: 'POST',\n      headers: {},\n      // 让浏览器自动设置 Content-Type\n      body: formData\n    });\n  }\n\n  // ============ 钱包绑定 API ============\n\n  async getWalletBindings() {\n    return this.request('/wallet/bindings', {\n      method: 'GET'\n    });\n  }\n  async bindWallet(walletAddress, chainType, signature, message, bindingType = 'secondary') {\n    return this.request('/wallet/bind', {\n      method: 'POST',\n      body: JSON.stringify({\n        wallet_address: walletAddress,\n        chain_type: chainType,\n        signature,\n        message,\n        binding_type: bindingType\n      })\n    });\n  }\n  async unbindWallet(bindingId, signature) {\n    return this.request('/wallet/unbind', {\n      method: 'POST',\n      body: JSON.stringify({\n        binding_id: bindingId,\n        signature\n      })\n    });\n  }\n  async setPrimaryWallet(bindingId) {\n    return this.request('/wallet/set-primary', {\n      method: 'POST',\n      body: JSON.stringify({\n        binding_id: bindingId\n      })\n    });\n  }\n  async getBindingMessage(walletAddress, chainType = 'quantabit') {\n    return this.request('/wallet/binding-message', {\n      method: 'GET',\n      params: {\n        wallet_address: walletAddress,\n        chain_type: chainType\n      }\n    });\n  }\n\n  // ============ 凭证 API ============\n\n  async getCredentials(type) {\n    const params = type ? `?type=${encodeURIComponent(type)}` : '';\n    return this.request(`/credentials${params}`, {\n      method: 'GET'\n    });\n  }\n  async getCredential(credentialId) {\n    return this.request(`/credentials/${encodeURIComponent(credentialId)}`, {\n      method: 'GET'\n    });\n  }\n  async createPresentation(credentialIds, disclosedFields, challenge, domain) {\n    return this.request('/credentials/present', {\n      method: 'POST',\n      body: JSON.stringify({\n        credential_ids: credentialIds,\n        disclosed_fields: disclosedFields,\n        challenge,\n        domain\n      })\n    });\n  }\n  async verifyPresentation(presentation) {\n    return this.request('/credentials/verify', {\n      method: 'POST',\n      body: JSON.stringify({\n        presentation\n      })\n    });\n  }\n  async requestCredential(issuer, type, claims) {\n    return this.request('/credentials/request', {\n      method: 'POST',\n      body: JSON.stringify({\n        issuer,\n        type,\n        claims\n      })\n    });\n  }\n  async revokeCredential(credentialId, reason) {\n    return this.request('/credentials/revoke', {\n      method: 'POST',\n      body: JSON.stringify({\n        credential_id: credentialId,\n        reason\n      })\n    });\n  }\n  async anchorCredentialOnChain(credentialId) {\n    return this.request(`/chain/credential/${encodeURIComponent(credentialId)}/anchor`, {\n      method: 'POST',\n      body: '{}'\n    });\n  }\n  async submitCredentialAnchorTxHash(credentialId, txHash) {\n    return this.request(`/chain/credential/${encodeURIComponent(credentialId)}/anchor/submit`, {\n      method: 'POST',\n      body: JSON.stringify({\n        tx_hash: txHash\n      })\n    });\n  }\n  async revokeCredentialOnChain(credentialId, reason = '') {\n    return this.request(`/chain/credential/${encodeURIComponent(credentialId)}/revoke`, {\n      method: 'POST',\n      body: JSON.stringify({\n        reason\n      })\n    });\n  }\n  async submitCredentialRevokeTxHash(credentialId, txHash) {\n    return this.request(`/chain/credential/${encodeURIComponent(credentialId)}/revoke/submit`, {\n      method: 'POST',\n      body: JSON.stringify({\n        tx_hash: txHash\n      })\n    });\n  }\n\n  // ============ 声誉 API ============\n\n  async getMyReputation() {\n    return this.request('/reputation/me', {\n      method: 'GET'\n    });\n  }\n  async getReputation(did) {\n    return this.request(`/reputation/${encodeURIComponent(did)}`, {\n      method: 'GET'\n    });\n  }\n  async getMyBadges() {\n    return this.request('/reputation/badges', {\n      method: 'GET'\n    });\n  }\n  async getLeaderboard(dimension = 'overall', limit = 20) {\n    return this.request(`/reputation/leaderboard?dimension=${dimension}&limit=${limit}`, {\n      method: 'GET'\n    });\n  }\n  async getReputationHistory(startDate, endDate) {\n    const params = new URLSearchParams();\n    if (startDate) params.append('start_date', startDate);\n    if (endDate) params.append('end_date', endDate);\n    return this.request(`/reputation/history?${params.toString()}`, {\n      method: 'GET'\n    });\n  }\n\n  // ============ 社交绑定 API ============\n\n  async getSocialBindings() {\n    return this.request('/social/bindings', {\n      method: 'GET'\n    });\n  }\n  async initSocialBinding(platform, returnUrl) {\n    return this.request('/social/bind/init', {\n      method: 'POST',\n      body: JSON.stringify({\n        platform,\n        return_url: returnUrl\n      })\n    });\n  }\n  async completeSocialBinding(bindingId, verificationCode) {\n    return this.request('/social/bind/complete', {\n      method: 'POST',\n      body: JSON.stringify({\n        binding_id: bindingId,\n        verification_code: verificationCode\n      })\n    });\n  }\n  async unbindSocial(platform) {\n    return this.request('/social/unbind', {\n      method: 'POST',\n      body: JSON.stringify({\n        platform\n      })\n    });\n  }\n  async verifySocialAccount(platform, proof) {\n    return this.request('/social/verify', {\n      method: 'POST',\n      body: JSON.stringify({\n        platform,\n        proof\n      })\n    });\n  }\n\n  // ============ 验证 API ============\n\n  async getVerificationStatus() {\n    return this.request('/verification/status', {\n      method: 'GET'\n    });\n  }\n  async startKYC(level = 'basic') {\n    return this.request('/verification/kyc/start', {\n      method: 'POST',\n      body: JSON.stringify({\n        level\n      })\n    });\n  }\n  async submitKYCDocument(documentType, file) {\n    const formData = new FormData();\n    formData.append('document_type', documentType);\n    formData.append('file', file);\n    return this.request('/verification/kyc/document', {\n      method: 'POST',\n      headers: {},\n      body: formData\n    });\n  }\n  async getKYCStatus() {\n    return this.request('/verification/kyc/status', {\n      method: 'GET'\n    });\n  }\n  async verifyEmail(token) {\n    return this.request('/verification/email/verify', {\n      method: 'POST',\n      body: JSON.stringify({\n        token\n      })\n    });\n  }\n  async sendEmailVerification(email) {\n    return this.request('/verification/email/send', {\n      method: 'POST',\n      body: JSON.stringify({\n        email\n      })\n    });\n  }\n  async verifyPhone(code) {\n    return this.request('/verification/phone/verify', {\n      method: 'POST',\n      body: JSON.stringify({\n        code\n      })\n    });\n  }\n  async sendPhoneVerification(phone) {\n    return this.request('/verification/phone/send', {\n      method: 'POST',\n      body: JSON.stringify({\n        phone\n      })\n    });\n  }\n\n  // ============ OAuth 授权 API ============\n\n  async getAvailableScopes() {\n    return this.request('/oauth/scopes', {\n      method: 'GET'\n    });\n  }\n  async createAuthorizationRequest(appId, appName, redirectUri, scopes, state) {\n    return this.request('/oauth/authorize', {\n      method: 'POST',\n      body: JSON.stringify({\n        app_id: appId,\n        app_name: appName,\n        redirect_uri: redirectUri,\n        scopes,\n        state\n      })\n    });\n  }\n  async approveAuthorization(requestId, appId, scopes, durationDays = 30) {\n    return this.request('/oauth/approve', {\n      method: 'POST',\n      body: JSON.stringify({\n        request_id: requestId,\n        app_id: appId,\n        scopes,\n        duration_days: durationDays\n      })\n    });\n  }\n  async getAuthorizations() {\n    return this.request('/oauth/authorizations', {\n      method: 'GET'\n    });\n  }\n  async revokeAuthorization(appId) {\n    return this.request('/oauth/revoke', {\n      method: 'POST',\n      body: JSON.stringify({\n        app_id: appId\n      })\n    });\n  }\n\n  // ============ 多账户同步 API ============\n\n  async syncProfileToWallet() {\n    return this.request('/sync/profile', {\n      method: 'POST'\n    });\n  }\n  async syncDIDToWallet() {\n    return this.request('/sync/did', {\n      method: 'POST'\n    });\n  }\n  async getAggregatedBalance() {\n    return this.request('/sync/balance', {\n      method: 'GET'\n    });\n  }\n  async getTransactions(chainType, limit = 20, offset = 0) {\n    const params = new URLSearchParams({\n      limit: String(limit),\n      offset: String(offset)\n    });\n    if (chainType) params.append('chain_type', chainType);\n    return this.request(`/sync/transactions?${params.toString()}`, {\n      method: 'GET'\n    });\n  }\n  async getHoldings() {\n    return this.request('/sync/holdings', {\n      method: 'GET'\n    });\n  }\n\n  // ============ 健康检查 ============\n\n  async healthCheck() {\n    return this.request('/health', {\n      method: 'GET'\n    });\n  }\n  // ============ 隐私合规 (GDPR/CCPA) ============\n\n  /**\n   * 清除所有本地认证数据 — GDPR Art.17 被遗忘权\n   * 清除 token、DID 缓存、会话数据\n   */\n  clearAllUserData() {\n    this.clearTokens();\n    if (typeof localStorage !== 'undefined') {\n      const keysToRemove = [];\n      for (let i = 0; i < localStorage.length; i++) {\n        const key = localStorage.key(i);\n        if (key && (key.startsWith('qbit_did_') || key.startsWith('qbit_auth_') || key.startsWith('qbit_wallet_') || key.startsWith('qbit_credential_'))) {\n          keysToRemove.push(key);\n        }\n      }\n      keysToRemove.forEach(k => localStorage.removeItem(k));\n    }\n\n    // 清除配置订阅\n    if (this._unsubscribe) {\n      this._unsubscribe();\n      this._unsubscribe = null;\n    }\n    return {\n      success: true,\n      action: 'auth_local_data_cleared'\n    };\n  }\n\n  /**\n   * 导出用户身份数据 — GDPR Art.20 数据可携权\n   * @returns {Promise<object>} 身份数据导出\n   */\n  async exportMyData() {\n    try {\n      return await this.request('/privacy/export', {\n        method: 'GET'\n      });\n    } catch (e) {\n      // 回退：聚合多个端点数据\n      const [profile, did, wallets, credentials, reputation] = await Promise.allSettled([this.getProfile(), this.getMyDID(), this.getWalletBindings(), this.getCredentials(), this.getMyReputation()]);\n      return {\n        sdk: '@quantabit/did-auth-sdk',\n        exportedAt: new Date().toISOString(),\n        profile: profile.status === 'fulfilled' ? profile.value?.data : null,\n        did: did.status === 'fulfilled' ? did.value?.data : null,\n        wallets: wallets.status === 'fulfilled' ? wallets.value?.data : null,\n        credentials: credentials.status === 'fulfilled' ? credentials.value?.data : null,\n        reputation: reputation.status === 'fulfilled' ? reputation.value?.data : null\n      };\n    }\n  }\n\n  /**\n   * 请求删除服务端账户数据 — GDPR Art.17\n   * @returns {Promise<object>}\n   */\n  async requestDataDeletion() {\n    return this.request('/privacy/delete-request', {\n      method: 'POST',\n      body: JSON.stringify({\n        reason: 'gdpr_right_to_erasure'\n      })\n    });\n  }\n\n  /**\n   * 获取隐私数据声明\n   */\n  getDataDisclosure() {\n    return {\n      sdk: '@quantabit/did-auth-sdk',\n      privacyLevel: 'essential',\n      consentRequired: false,\n      collected: [{\n        type: 'did_identity',\n        description: 'Decentralized identifier & DID Document',\n        retention: 'Account lifetime'\n      }, {\n        type: 'wallet_bindings',\n        description: 'Associated wallet addresses',\n        retention: 'Until unbound'\n      }, {\n        type: 'credentials',\n        description: 'Verifiable credentials (encrypted)',\n        retention: 'Until revoked'\n      }, {\n        type: 'auth_tokens',\n        description: 'JWT access/refresh tokens',\n        retention: 'Session / 30 days'\n      }, {\n        type: 'profile',\n        description: 'User profile information',\n        retention: 'Account lifetime'\n      }, {\n        type: 'reputation',\n        description: 'On-chain reputation score',\n        retention: 'Persistent (blockchain)'\n      }, {\n        type: 'kyc_data',\n        description: 'Identity verification documents',\n        retention: '5 years (regulatory)'\n      }],\n      gdprCapabilities: ['export', 'delete', 'portability'],\n      encryption: 'All credentials encrypted at rest; tokens use short-lived JWT',\n      specialCategories: 'KYC documents are special category data under GDPR Art.9'\n    };\n  }\n\n  // ============ 区块链相关 API ============\n\n  /**\n   * 从链上解析 DID\n   * @param {string} did DID标识符\n   * @returns {Promise<object>}\n   */\n  async resolveDIDFromChain(did) {\n    return this.request(`/chain/did/resolve/${encodeURIComponent(did)}`, {\n      method: 'GET'\n    });\n  }\n\n  /**\n   * 将当前用户的 DID 注册到链上\n   * @returns {Promise<object>}\n   */\n  async registerDIDOnChain() {\n    return this.request('/chain/did/register', {\n      method: 'POST'\n    });\n  }\n\n  /**\n   * 提交 DID 注册广播后的主网 tx_hash\n   * @param {string} txHash 交易哈希\n   * @returns {Promise<object>}\n   */\n  async submitDIDRegisterTxHash(txHash) {\n    return this.request('/chain/did/register/submit', {\n      method: 'POST',\n      body: JSON.stringify({\n        tx_hash: txHash\n      })\n    });\n  }\n\n  /**\n   * 更新链上 DID 文档\n   * @returns {Promise<object>}\n   */\n  async updateDIDOnChain() {\n    return this.request('/chain/did/update', {\n      method: 'POST'\n    });\n  }\n\n  /**\n   * 提交 DID 更新广播后的主网 tx_hash\n   * @param {string} txHash 交易哈希\n   * @returns {Promise<object>}\n   */\n  async submitDIDUpdateTxHash(txHash) {\n    return this.request('/chain/did/update/submit', {\n      method: 'POST',\n      body: JSON.stringify({\n        tx_hash: txHash\n      })\n    });\n  }\n\n  /**\n   * 验证链上 DID 状态\n   * @param {string} did DID标识符\n   * @returns {Promise<object>}\n   */\n  async verifyDIDOnChain(did) {\n    return this.request(`/chain/did/verify/${encodeURIComponent(did)}`, {\n      method: 'GET'\n    });\n  }\n\n  /**\n   * 将凭证锚定到链上\n   * @param {string} credentialId 凭证ID\n   * @returns {Promise<object>}\n   */\n  async anchorCredentialOnChain(credentialId) {\n    return this.request(`/chain/credential/${encodeURIComponent(credentialId)}/anchor`, {\n      method: 'POST'\n    });\n  }\n\n  /**\n   * 提交凭证锚定广播后的主网 tx_hash\n   * @param {string} credentialId 凭证ID\n   * @param {string} txHash 交易哈希\n   * @returns {Promise<object>}\n   */\n  async submitCredentialAnchorTxHash(credentialId, txHash) {\n    return this.request(`/chain/credential/${encodeURIComponent(credentialId)}/anchor/submit`, {\n      method: 'POST',\n      body: JSON.stringify({\n        tx_hash: txHash\n      })\n    });\n  }\n\n  /**\n   * 在链上撤销凭证\n   * @param {string} credentialId 凭证ID\n   * @param {string} reason 撤销原因\n   * @returns {Promise<object>}\n   */\n  async revokeCredentialOnChain(credentialId, reason = \"Revoked by issuer\") {\n    return this.request(`/chain/credential/${encodeURIComponent(credentialId)}/revoke?reason=${encodeURIComponent(reason)}`, {\n      method: 'POST'\n    });\n  }\n\n  /**\n   * 提交凭证撤销广播后的主网 tx_hash\n   * @param {string} credentialId 凭证ID\n   * @param {string} txHash 交易哈希\n   * @returns {Promise<object>}\n   */\n  async submitCredentialRevokeTxHash(credentialId, txHash) {\n    return this.request(`/chain/credential/${encodeURIComponent(credentialId)}/revoke/submit`, {\n      method: 'POST',\n      body: JSON.stringify({\n        tx_hash: txHash\n      })\n    });\n  }\n\n  // ============ 高级链上编排（一次调用：后端操作 → 钱包广播 → 确认 → 链上验证 → 回执提交） ============\n\n  /**\n   * 通用链上锚定编排\n   *\n   * 流程：调用后端操作接口 → 若需外部签名则用钱包 provider 广播 anchor memo →\n   * （可选）等待确认 →（可选）链上回执验证 → 提交 tx_hash 回后端。\n   *\n   * @private\n   * @param {Object} params\n   * @param {Function} params.operation - 返回后端操作结果的函数（含 requires_external_signer / payload）\n   * @param {Function} params.submit - (txHash) => Promise，提交 tx_hash 回后端\n   * @param {Object} params.provider - QBit 钱包 provider\n   * @param {Object} params.options - 编排选项\n   * @returns {Promise<{operation, broadcast, submit, verified, requiresExternalSigner}>}\n   */\n  async _anchorWithWallet({\n    operation,\n    submit,\n    provider,\n    options = {}\n  }) {\n    const operationResult = await operation();\n\n    // 后端托管完成（无需外部签名）：直接返回，不广播\n    if (!operationResult?.requires_external_signer) {\n      return {\n        operation: operationResult,\n        broadcast: null,\n        submit: null,\n        verified: null,\n        requiresExternalSigner: false\n      };\n    }\n    if (!provider) {\n      throw new Error('该操作需要外部钱包签名，但未提供 provider');\n    }\n    const namespace = options.namespace || 'qbit_did';\n    const network = options.network || 'mainnet';\n    const connection = new QBitConnection({\n      endpoint: options.endpoint,\n      network\n    });\n    const broadcast = await broadcastQBitAnchor(connection, provider, operationResult.payload || {}, {\n      namespace,\n      address: options.address,\n      priorityFee: options.priorityFee,\n      skipPreflight: options.skipPreflight,\n      waitForConfirmation: options.waitForConfirmation !== false,\n      commitment: options.commitment,\n      timeoutMs: options.confirmTimeoutMs\n    });\n    if (!broadcast.txHash) {\n      throw new Error('钱包广播未返回 tx_hash');\n    }\n\n    // 链上回执验证（默认开启，可通过 options.verify=false 关闭）\n    let verified = null;\n    if (options.verify !== false) {\n      verified = await verifyAnchoredMemo$1(connection, broadcast.txHash, {\n        namespace,\n        match: options.match,\n        commitment: options.commitment\n      });\n    }\n    const submitResult = await submit(broadcast.txHash);\n    return {\n      operation: operationResult,\n      broadcast,\n      submit: submitResult,\n      verified,\n      requiresExternalSigner: true\n    };\n  }\n\n  /**\n   * 一次性完成 DID 链上注册（后端操作 → 钱包广播 → 确认/验证 → 提交 tx_hash）\n   * @param {Object} provider - QBit 钱包 provider\n   * @param {Object} options - 编排选项\n   */\n  async registerDIDWithWallet(provider, options = {}) {\n    return this._anchorWithWallet({\n      operation: () => this.registerDIDOnChain(),\n      submit: txHash => this.submitDIDRegisterTxHash(txHash),\n      provider,\n      options\n    });\n  }\n\n  /**\n   * 一次性完成 DID 链上更新\n   * @param {Object} provider - QBit 钱包 provider\n   * @param {Object} options - 编排选项\n   */\n  async updateDIDWithWallet(provider, options = {}) {\n    return this._anchorWithWallet({\n      operation: () => this.updateDIDOnChain(),\n      submit: txHash => this.submitDIDUpdateTxHash(txHash),\n      provider,\n      options\n    });\n  }\n\n  /**\n   * 一次性完成凭证链上锚定\n   * @param {string} credentialId - 凭证 ID\n   * @param {Object} provider - QBit 钱包 provider\n   * @param {Object} options - 编排选项\n   */\n  async anchorCredentialWithWallet(credentialId, provider, options = {}) {\n    return this._anchorWithWallet({\n      operation: () => this.anchorCredentialOnChain(credentialId),\n      submit: txHash => this.submitCredentialAnchorTxHash(credentialId, txHash),\n      provider,\n      options\n    });\n  }\n\n  /**\n   * 一次性完成凭证链上吊销\n   * @param {string} credentialId - 凭证 ID\n   * @param {Object} provider - QBit 钱包 provider\n   * @param {Object} options - 编排选项（reason 可通过 options.reason 传入）\n   */\n  async revokeCredentialWithWallet(credentialId, provider, options = {}) {\n    return this._anchorWithWallet({\n      operation: () => this.revokeCredentialOnChain(credentialId, options.reason || ''),\n      submit: txHash => this.submitCredentialRevokeTxHash(credentialId, txHash),\n      provider,\n      options\n    });\n  }\n}\n\n// 创建单例实例\nconst apiClient = new QbitDIDApiClient();\nfunction buildQBitAnchorMemo(payload, options = {}) {\n  return buildQBitAnchorMemo$2(payload, options);\n}\nfunction createQBitMemoAnchorBroadcaster(options = {}) {\n  const {\n    provider,\n    address,\n    endpoint\n  } = options;\n  return async (payload, context) => {\n    const conn = new QBitConnection(endpoint ? {\n      endpoint\n    } : {});\n    const feePayer = address || typeof window !== 'undefined' && window.qbit && window.qbit.publicKey?.toBase58();\n    if (!feePayer) {\n      throw new Error('Fee payer address is required for broadcasting');\n    }\n    const {\n      transaction\n    } = await createQBitAnchorTransaction(conn, feePayer, payload, {\n      namespace: 'qbit_did'\n    });\n    let activeProvider = provider;\n    if (!activeProvider && typeof window !== 'undefined' && window.qbit) {\n      activeProvider = window.qbit;\n    }\n    if (!activeProvider || typeof activeProvider.signAndSendTransaction !== 'function') {\n      throw new Error('No active wallet provider supporting signAndSendTransaction found');\n    }\n    const response = await activeProvider.signAndSendTransaction(transaction);\n    return response.signature || response.txHash || response;\n  };\n}\nasync function completeExternalChainOperation(payload, options = {}) {\n  const {\n    broadcaster,\n    onSubmit\n  } = options;\n  if (typeof broadcaster !== 'function') {\n    throw new Error('Broadcaster is required for external chain operation');\n  }\n  const txHash = await broadcaster(payload);\n  if (typeof onSubmit === 'function') {\n    await onSubmit(txHash);\n  }\n  return txHash;\n}\n\nvar apiClient$1 = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  QbitDIDApiClient: QbitDIDApiClient,\n  apiClient: apiClient,\n  buildQBitAnchorMemo: buildQBitAnchorMemo,\n  completeExternalChainOperation: completeExternalChainOperation,\n  createQBitMemoAnchorBroadcaster: createQBitMemoAnchorBroadcaster,\n  default: apiClient\n});\n\n/**\n * Web3WalletPanel - 基于 Ant Design Web3 的钱包连接面板\n * \n * 使用 @ant-design/web3 的 ConnectModal.ModalPanel 组件\n * 提供专业的 Web3 钱包连接 UI，替代原来的简单钱包按钮\n * \n * 集成方式：作为纯 UI 组件，自行处理钱包连接逻辑\n */\n\nconst MetaMaskIcon = () => /*#__PURE__*/jsxs(\"svg\", {\n  viewBox: \"0 0 40 40\",\n  width: \"40\",\n  height: \"40\",\n  children: [/*#__PURE__*/jsx(\"rect\", {\n    width: \"40\",\n    height: \"40\",\n    rx: \"10\",\n    fill: \"#F6851B\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M29.3 10.5l-7.2 5.3 1.3-3.2 5.9-2.1z\",\n    fill: \"#E2761B\",\n    stroke: \"#E2761B\",\n    strokeWidth: \"0.25\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M10.7 10.5l7.1 5.4-1.2-3.3-5.9-2.1z\",\n    fill: \"#E4761B\",\n    stroke: \"#E4761B\",\n    strokeWidth: \"0.25\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M26.1 25.2l-1.9 2.9 4.1 1.1.6-4-2.8 0z\",\n    fill: \"#E4761B\",\n    stroke: \"#E4761B\",\n    strokeWidth: \"0.25\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M11.1 25.2l.6 4 4.1-1.1-1.9-2.9h-2.8z\",\n    fill: \"#E4761B\",\n    stroke: \"#E4761B\",\n    strokeWidth: \"0.25\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M15.5 19.2l-1.2 1.8 4.3.2-.2-4.6-2.9 2.6z\",\n    fill: \"#E4761B\",\n    stroke: \"#E4761B\",\n    strokeWidth: \"0.25\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M24.5 19.2l-3-2.7-.1 4.7 4.3-.2-1.2-1.8z\",\n    fill: \"#E4761B\",\n    stroke: \"#E4761B\",\n    strokeWidth: \"0.25\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M15.8 28.1l2.6-1.3-2.2-1.7-.4 3z\",\n    fill: \"#E4761B\",\n    stroke: \"#E4761B\",\n    strokeWidth: \"0.25\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M21.6 26.8l2.6 1.3-.4-3-2.2 1.7z\",\n    fill: \"#E4761B\",\n    stroke: \"#E4761B\",\n    strokeWidth: \"0.25\"\n  })]\n});\nconst WalletConnectIcon = () => /*#__PURE__*/jsxs(\"svg\", {\n  viewBox: \"0 0 40 40\",\n  width: \"40\",\n  height: \"40\",\n  children: [/*#__PURE__*/jsx(\"rect\", {\n    width: \"40\",\n    height: \"40\",\n    rx: \"10\",\n    fill: \"#3B99FC\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M13.5 17c3.6-3.6 9.4-3.6 13 0l.4.4c.2.2.2.5 0 .6l-1.3 1.3c-.1.1-.2.1-.3 0l-.6-.6c-2.5-2.5-6.6-2.5-9.1 0l-.6.6c-.1.1-.2.1-.3 0L13.4 18c-.2-.2-.2-.5 0-.6l.1-.4z\",\n    fill: \"#fff\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M28.5 19l1.2 1.2c.2.2.2.5 0 .6L25 25.6c-.2.2-.4.2-.6 0l-2.9-2.9c0-.1-.1-.1-.2 0l-2.9 2.9c-.2.2-.4.2-.6 0l-4.7-4.8c-.2-.2-.2-.5 0-.6L14.3 19c.2-.2.4-.2.6 0l2.9 2.9c0 .1.1.1.2 0L20.9 19c.2-.2.4-.2.6 0l2.9 2.9c0 .1.1.1.2 0l2.9-2.9c.2-.2.5-.2.7 0z\",\n    fill: \"#fff\"\n  })]\n});\nconst OKXIcon = () => /*#__PURE__*/jsxs(\"svg\", {\n  viewBox: \"0 0 40 40\",\n  width: \"40\",\n  height: \"40\",\n  children: [/*#__PURE__*/jsx(\"rect\", {\n    width: \"40\",\n    height: \"40\",\n    rx: \"10\",\n    fill: \"#000\"\n  }), /*#__PURE__*/jsx(\"rect\", {\n    x: \"10\",\n    y: \"10\",\n    width: \"8\",\n    height: \"8\",\n    rx: \"1.5\",\n    fill: \"#fff\"\n  }), /*#__PURE__*/jsx(\"rect\", {\n    x: \"22\",\n    y: \"10\",\n    width: \"8\",\n    height: \"8\",\n    rx: \"1.5\",\n    fill: \"#fff\"\n  }), /*#__PURE__*/jsx(\"rect\", {\n    x: \"10\",\n    y: \"22\",\n    width: \"8\",\n    height: \"8\",\n    rx: \"1.5\",\n    fill: \"#fff\"\n  }), /*#__PURE__*/jsx(\"rect\", {\n    x: \"22\",\n    y: \"22\",\n    width: \"8\",\n    height: \"8\",\n    rx: \"1.5\",\n    fill: \"#fff\"\n  }), /*#__PURE__*/jsx(\"rect\", {\n    x: \"16\",\n    y: \"16\",\n    width: \"8\",\n    height: \"8\",\n    rx: \"1.5\",\n    fill: \"#fff\"\n  })]\n});\nconst TrustWalletIcon = () => /*#__PURE__*/jsxs(\"svg\", {\n  viewBox: \"0 0 40 40\",\n  width: \"40\",\n  height: \"40\",\n  children: [/*#__PURE__*/jsx(\"rect\", {\n    width: \"40\",\n    height: \"40\",\n    rx: \"10\",\n    fill: \"#0500FF\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M20 10c0 0 7.5 3.5 7.5 10.5 0 7-7.5 11.5-7.5 11.5s-7.5-4.5-7.5-11.5C12.5 13.5 20 10 20 10z\",\n    fill: \"none\",\n    stroke: \"#fff\",\n    strokeWidth: \"2\",\n    strokeLinecap: \"round\",\n    strokeLinejoin: \"round\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M20 14c0 0 4.5 2.5 4.5 6.5 0 4-4.5 7-4.5 7s-4.5-3-4.5-7C15.5 16.5 20 14 20 14z\",\n    fill: \"#fff\",\n    opacity: \"0.3\"\n  })]\n});\nconst TokenPocketIcon = () => /*#__PURE__*/jsxs(\"svg\", {\n  viewBox: \"0 0 40 40\",\n  width: \"40\",\n  height: \"40\",\n  children: [/*#__PURE__*/jsx(\"rect\", {\n    width: \"40\",\n    height: \"40\",\n    rx: \"10\",\n    fill: \"#2980FE\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M14 12h12c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H14c-1.1 0-2-.9-2-2V14c0-1.1.9-2 2-2z\",\n    fill: \"none\",\n    stroke: \"#fff\",\n    strokeWidth: \"1.5\"\n  }), /*#__PURE__*/jsx(\"path\", {\n    d: \"M17 16h6v2h-6zM17 20h4v2h-4z\",\n    fill: \"#fff\",\n    opacity: \"0.9\"\n  })]\n});\n\n// QBit 钱包图标（品牌紫色）\nconst QBitWalletIcon = () => /*#__PURE__*/jsxs(\"svg\", {\n  viewBox: \"0 0 40 40\",\n  width: \"40\",\n  height: \"40\",\n  children: [/*#__PURE__*/jsx(\"defs\", {\n    children: /*#__PURE__*/jsxs(\"linearGradient\", {\n      id: \"qbit-grad\",\n      x1: \"0%\",\n      y1: \"0%\",\n      x2: \"100%\",\n      y2: \"100%\",\n      children: [/*#__PURE__*/jsx(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#7C3AED\"\n      }), /*#__PURE__*/jsx(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#6366F1\"\n      })]\n    })\n  }), /*#__PURE__*/jsx(\"rect\", {\n    width: \"40\",\n    height: \"40\",\n    rx: \"10\",\n    fill: \"url(#qbit-grad)\"\n  }), /*#__PURE__*/jsx(\"circle\", {\n    cx: \"20\",\n    cy: \"20\",\n    r: \"8\",\n    fill: \"none\",\n    stroke: \"#fff\",\n    strokeWidth: \"2.5\"\n  }), /*#__PURE__*/jsx(\"circle\", {\n    cx: \"20\",\n    cy: \"20\",\n    r: \"3\",\n    fill: \"#fff\"\n  }), /*#__PURE__*/jsx(\"circle\", {\n    cx: \"25\",\n    cy: \"25\",\n    r: \"2.5\",\n    fill: \"url(#qbit-grad)\",\n    stroke: \"#fff\",\n    strokeWidth: \"1.5\"\n  })]\n});\n\n// 钱包状态枚举\nconst WalletStatus = {\n  IDLE: 'idle',\n  CONNECTING: 'connecting',\n  SIGNING: 'signing',\n  SUCCESS: 'success',\n  ERROR: 'error'\n};\n\n/**\n * Web3WalletPanel 组件\n * \n * 提供 Ant Design Web3 风格的钱包连接面板\n * 替代原来 DarkLoginModal 中的简单钱包连接 UI\n * \n * @param {Object} props\n * @param {Function} props.onConnect - 钱包连接成功回调 (address, walletType) => void\n * @param {Function} props.onSign - 签名完成回调 (signature, message, address) => void\n * @param {Function} props.onError - 错误回调 (error) => void\n * @param {string} props.language - 语言 'zh' | 'en'\n * @param {string} props.status - 外部控制的连接状态\n * @param {string} props.theme - 主题 'dark' | 'light'\n */\nfunction Web3WalletPanel({\n  onConnect,\n  onSign,\n  onError,\n  language = 'zh',\n  status: externalStatus,\n  theme = 'dark',\n  apiBaseUrl,\n  layoutMode = 'double'\n}) {\n  const [internalStatus, setInternalStatus] = useState(WalletStatus.IDLE);\n  const [selectedWallet, setSelectedWallet] = useState('qbit');\n  const [hoverWallet, setHoverWallet] = useState(null);\n  const [connectedAddress, setConnectedAddress] = useState('');\n  const [error, setError] = useState(null);\n  const status = externalStatus || internalStatus;\n  const isZh = language === 'zh';\n\n  // 按热度排序，QBit 排第一且默认选中\n  const wallets = useMemo(() => [{\n    id: 'qbit',\n    name: isZh ? 'QBit 钱包' : 'QBit Wallet',\n    icon: /*#__PURE__*/jsx(QBitWalletIcon, {}),\n    description: isZh ? 'QBit 生态原生钱包，推荐使用' : 'QBit ecosystem native wallet, recommended',\n    installed: typeof window !== 'undefined' && !!(window.qbit || window.phantom?.solana),\n    tags: ['Recommended'],\n    downloadUrl: 'https://qbitwallet.io',\n    group: 'Popular',\n    recommended: true\n  }, {\n    id: 'metamask',\n    name: 'MetaMask',\n    icon: /*#__PURE__*/jsx(MetaMaskIcon, {}),\n    description: isZh ? '最受欢迎的以太坊钱包' : 'The most popular Ethereum wallet',\n    installed: typeof window !== 'undefined' && !!window.ethereum,\n    tags: ['Popular', 'EVM'],\n    downloadUrl: 'https://metamask.io/download/',\n    group: 'Popular'\n  }, {\n    id: 'okx',\n    name: 'OKX Wallet',\n    icon: /*#__PURE__*/jsx(OKXIcon, {}),\n    description: isZh ? '多链全能 Web3 钱包' : 'Multi-chain Web3 wallet',\n    installed: typeof window !== 'undefined' && !!window.okxwallet,\n    tags: ['Multi-chain'],\n    downloadUrl: 'https://www.okx.com/web3',\n    group: 'Popular'\n  }, {\n    id: 'trust',\n    name: 'Trust Wallet',\n    icon: /*#__PURE__*/jsx(TrustWalletIcon, {}),\n    description: isZh ? '全球领先的多链移动钱包' : 'Leading multi-chain mobile wallet',\n    installed: typeof window !== 'undefined' && !!window.trustwallet,\n    tags: ['Mobile', 'Multi-chain'],\n    downloadUrl: 'https://trustwallet.com/',\n    group: 'Popular'\n  }, {\n    id: 'walletconnect',\n    name: 'WalletConnect',\n    icon: /*#__PURE__*/jsx(WalletConnectIcon, {}),\n    description: isZh ? '通过扫码连接移动端钱包' : 'Connect mobile wallets via QR code',\n    installed: true,\n    tags: ['Mobile'],\n    group: 'Others'\n  }, {\n    id: 'tokenpocket',\n    name: 'TokenPocket',\n    icon: /*#__PURE__*/jsx(TokenPocketIcon, {}),\n    description: isZh ? '支持多链的移动端钱包' : 'Multi-chain mobile wallet',\n    installed: false,\n    tags: ['Mobile'],\n    downloadUrl: 'https://www.tokenpocket.pro/',\n    group: 'Others'\n  }], [isZh]);\n  const walletGroups = useMemo(() => {\n    const groups = {};\n    wallets.forEach(w => {\n      if (!groups[w.group]) groups[w.group] = [];\n      groups[w.group].push(w);\n    });\n    return groups;\n  }, [wallets]);\n  const connectWallet = async walletId => {\n    setSelectedWallet(walletId);\n    setInternalStatus(WalletStatus.CONNECTING);\n    setError(null);\n    try {\n      const chainType = ['metamask', 'coinbase', 'walletconnect'].includes(walletId) ? 'ethereum' : 'quantabit';\n      const {\n        address,\n        provider,\n        walletType\n      } = await connectBrowserWallet(chainType, walletId);\n      setConnectedAddress(address);\n      setInternalStatus(WalletStatus.SUCCESS);\n      if (onConnect) {\n        await onConnect(address, walletType, provider);\n      }\n    } catch (err) {\n      setError(err.message || (isZh ? '连接失败' : 'Failed to connect'));\n      setInternalStatus(WalletStatus.ERROR);\n      if (onError) onError(err);\n    }\n  };\n\n  // 渲染引导信息（右侧面板）\n  const renderGuide = () => {\n    const guideItems = [{\n      icon: '🔐',\n      title: isZh ? '去中心化身份' : 'Decentralized Identity',\n      desc: isZh ? '您的钱包地址即是您的身份凭证' : 'Your wallet address is your identity credential'\n    }, {\n      icon: '🛡️',\n      title: isZh ? '安全签名验证' : 'Secure Signature Verification',\n      desc: isZh ? '通过 QBit/Solana 钱包签名验证所有权，无需暴露私钥' : 'Verify ownership through your QBit/Solana wallet without exposing private keys'\n    }, {\n      icon: '🌐',\n      title: isZh ? 'QBit 主网就绪' : 'QBit Mainnet Ready',\n      desc: isZh ? '默认面向 QBit 主网 RPC 与 Solana 兼容钱包流程' : 'Built around QBit mainnet RPC and Solana-compatible wallet flows'\n    }];\n    return /*#__PURE__*/jsxs(\"div\", {\n      className: \"web3-guide-panel\",\n      children: [/*#__PURE__*/jsx(\"h4\", {\n        className: \"web3-guide-title\",\n        children: isZh ? '什么是钱包登录？' : 'What is wallet login?'\n      }), /*#__PURE__*/jsx(\"div\", {\n        className: \"web3-guide-items\",\n        children: guideItems.map((item, i) => /*#__PURE__*/jsxs(\"div\", {\n          className: \"web3-guide-item\",\n          children: [/*#__PURE__*/jsx(\"span\", {\n            className: \"web3-guide-icon\",\n            children: item.icon\n          }), /*#__PURE__*/jsxs(\"div\", {\n            className: \"web3-guide-text\",\n            children: [/*#__PURE__*/jsx(\"span\", {\n              className: \"web3-guide-item-title\",\n              children: item.title\n            }), /*#__PURE__*/jsx(\"span\", {\n              className: \"web3-guide-item-desc\",\n              children: item.desc\n            })]\n          })]\n        }, i))\n      })]\n    });\n  };\n\n  // 渲染连接中状态\n  const renderConnecting = () => /*#__PURE__*/jsxs(\"div\", {\n    className: \"web3-connecting-panel\",\n    children: [/*#__PURE__*/jsx(\"div\", {\n      className: \"web3-connecting-icon\",\n      children: wallets.find(w => w.id === selectedWallet)?.icon\n    }), /*#__PURE__*/jsx(\"div\", {\n      className: \"web3-connecting-spinner\"\n    }), /*#__PURE__*/jsx(\"p\", {\n      className: \"web3-connecting-text\",\n      children: isZh ? '正在连接...' : 'Connecting...'\n    }), /*#__PURE__*/jsx(\"p\", {\n      className: \"web3-connecting-hint\",\n      children: isZh ? '请在钱包中确认连接请求' : 'Please confirm the connection in your wallet'\n    }), /*#__PURE__*/jsx(\"button\", {\n      className: \"web3-cancel-btn\",\n      onClick: () => {\n        setSelectedWallet(null);\n        setInternalStatus(WalletStatus.IDLE);\n      },\n      children: isZh ? '取消' : 'Cancel'\n    })]\n  });\n\n  // 渲染成功状态\n  const renderSuccess = () => /*#__PURE__*/jsxs(\"div\", {\n    className: \"web3-success-panel\",\n    children: [/*#__PURE__*/jsx(\"div\", {\n      className: \"web3-success-icon\",\n      children: \"\\u2705\"\n    }), /*#__PURE__*/jsx(\"p\", {\n      className: \"web3-success-text\",\n      children: isZh ? '连接成功！' : 'Connected!'\n    }), /*#__PURE__*/jsx(\"code\", {\n      className: \"web3-success-address\",\n      children: formatAddress(connectedAddress)\n    }), /*#__PURE__*/jsx(\"p\", {\n      className: \"web3-success-hint\",\n      children: isZh ? '正在验证签名...' : 'Verifying signature...'\n    })]\n  });\n\n  // 渲染错误状态\n  const renderError = () => /*#__PURE__*/jsxs(\"div\", {\n    className: \"web3-error-panel\",\n    children: [/*#__PURE__*/jsx(\"div\", {\n      className: \"web3-error-icon\",\n      children: \"\\u26A0\\uFE0F\"\n    }), /*#__PURE__*/jsx(\"p\", {\n      className: \"web3-error-text\",\n      children: error\n    }), /*#__PURE__*/jsx(\"button\", {\n      className: \"web3-retry-btn\",\n      onClick: () => {\n        setError(null);\n        setInternalStatus(WalletStatus.IDLE);\n        setSelectedWallet(null);\n      },\n      children: isZh ? '重试' : 'Retry'\n    })]\n  });\n  return /*#__PURE__*/jsxs(\"div\", {\n    className: `web3-wallet-panel web3-theme-${theme}${layoutMode === 'single' ? ' layout-single' : ''}`,\n    children: [status === WalletStatus.CONNECTING && renderConnecting(), status === WalletStatus.SUCCESS && renderSuccess(), status === WalletStatus.ERROR && renderError(), status === WalletStatus.IDLE && /*#__PURE__*/jsxs(\"div\", {\n      className: `web3-wallet-layout${layoutMode === 'single' ? ' layout-single' : ''}`,\n      children: [/*#__PURE__*/jsx(\"div\", {\n        className: \"web3-wallet-list\",\n        children: Object.entries(walletGroups).map(([group, groupWallets]) => /*#__PURE__*/jsxs(\"div\", {\n          className: \"web3-wallet-group\",\n          children: [layoutMode !== 'single' && /*#__PURE__*/jsx(\"div\", {\n            className: \"web3-wallet-group-title\",\n            children: group\n          }), groupWallets.map(wallet => /*#__PURE__*/jsxs(\"button\", {\n            className: `web3-wallet-item ${selectedWallet === wallet.id ? 'selected' : ''} ${hoverWallet === wallet.id ? 'hovered' : ''}`,\n            onClick: () => connectWallet(wallet.id),\n            onMouseEnter: () => setHoverWallet(wallet.id),\n            onMouseLeave: () => setHoverWallet(null),\n            children: [/*#__PURE__*/jsx(\"div\", {\n              className: \"web3-wallet-icon\",\n              children: wallet.icon\n            }), /*#__PURE__*/jsx(\"span\", {\n              className: \"web3-wallet-name\",\n              children: wallet.name\n            }), wallet.tags.length > 0 && /*#__PURE__*/jsx(\"span\", {\n              className: \"web3-wallet-tag\",\n              children: wallet.tags[0]\n            })]\n          }, wallet.id))]\n        }, group))\n      }), layoutMode !== 'single' && /*#__PURE__*/jsx(\"div\", {\n        className: \"web3-wallet-detail\",\n        children: hoverWallet ? /*#__PURE__*/jsxs(\"div\", {\n          className: \"web3-wallet-preview\",\n          children: [/*#__PURE__*/jsx(\"div\", {\n            className: \"web3-preview-icon\",\n            children: wallets.find(w => w.id === hoverWallet)?.icon\n          }), /*#__PURE__*/jsx(\"h4\", {\n            className: \"web3-preview-name\",\n            children: wallets.find(w => w.id === hoverWallet)?.name\n          }), /*#__PURE__*/jsx(\"p\", {\n            className: \"web3-preview-desc\",\n            children: wallets.find(w => w.id === hoverWallet)?.description\n          }), !wallets.find(w => w.id === hoverWallet)?.installed && /*#__PURE__*/jsx(\"a\", {\n            href: wallets.find(w => w.id === hoverWallet)?.downloadUrl,\n            target: \"_blank\",\n            rel: \"noopener noreferrer\",\n            className: \"web3-download-link\",\n            children: isZh ? '下载安装 →' : 'Download →'\n          })]\n        }) : renderGuide()\n      })]\n    })]\n  });\n}\n\n/**\n * QuantaBit Auth SDK - 暗色风格弹窗登录组件 (DarkLoginModal)\n * \n * 单栏 Tab 切换布局的暗色风格弹窗，支持：\n * - 钱包登录\n * - DID 密码登录\n * - 邮箱注册（内置）\n * - 多账户管理\n * - 主题风格切换\n * - 全屏页面跳转\n */\n\nconst KeypadIcon = ({\n  size = 20,\n  className = ''\n}) => /*#__PURE__*/jsxs(\"svg\", {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: \"2\",\n  className: className,\n  children: [/*#__PURE__*/jsx(\"rect\", {\n    x: \"5\",\n    y: \"4\",\n    width: \"2\",\n    height: \"2\",\n    rx: \"0.5\"\n  }), /*#__PURE__*/jsx(\"rect\", {\n    x: \"11\",\n    y: \"4\",\n    width: \"2\",\n    height: \"2\",\n    rx: \"0.5\"\n  }), /*#__PURE__*/jsx(\"rect\", {\n    x: \"17\",\n    y: \"4\",\n    width: \"2\",\n    height: \"2\",\n    rx: \"0.5\"\n  }), /*#__PURE__*/jsx(\"rect\", {\n    x: \"5\",\n    y: \"10\",\n    width: \"2\",\n    height: \"2\",\n    rx: \"0.5\"\n  }), /*#__PURE__*/jsx(\"rect\", {\n    x: \"11\",\n    y: \"10\",\n    width: \"2\",\n    height: \"2\",\n    rx: \"0.5\"\n  }), /*#__PURE__*/jsx(\"rect\", {\n    x: \"17\",\n    y: \"10\",\n    width: \"2\",\n    height: \"2\",\n    rx: \"0.5\"\n  }), /*#__PURE__*/jsx(\"rect\", {\n    x: \"5\",\n    y: \"16\",\n    width: \"2\",\n    height: \"2\",\n    rx: \"0.5\"\n  }), /*#__PURE__*/jsx(\"rect\", {\n    x: \"11\",\n    y: \"16\",\n    width: \"2\",\n    height: \"2\",\n    rx: \"0.5\"\n  }), /*#__PURE__*/jsx(\"rect\", {\n    x: \"17\",\n    y: \"16\",\n    width: \"2\",\n    height: \"2\",\n    rx: \"0.5\"\n  })]\n});\n\n// 可用主题列表\nconst AVAILABLE_THEMES = [{\n  key: 'dark',\n  label: '深色',\n  labelEn: 'Dark',\n  icon: MoonIcon\n}, {\n  key: 'light',\n  label: '浅色',\n  labelEn: 'Light',\n  icon: SunIcon\n}, {\n  key: 'gradient',\n  label: '渐变',\n  labelEn: 'Gradient',\n  icon: PaletteIcon\n}, {\n  key: 'glass',\n  label: '毛玻璃',\n  labelEn: 'Glass',\n  icon: ShieldIcon\n}];\n\n/**\n * DarkLoginModal 组件\n * \n * @param {Object} props\n * @param {boolean} props.isOpen - 是否显示弹窗\n * @param {Function} props.onClose - 关闭回调\n * @param {Function} props.onSuccess - 登录成功回调\n * @param {Function} props.onError - 错误回调\n * @param {Function} props.onLogout - 登出回调\n * @param {Function} props.onNavigateToRegister - 导航到外部注册页回调（可选，若不传则使用内置注册）\n * @param {Function} props.onOpenFullscreen - 打开全屏页面回调\n * @param {Function} props.onThemeChange - 主题切换回调 (theme: string) => void\n * @param {Function} props.onModeChange - 模式切换回调 (mode: 'compact' | 'full') => void\n * @param {string} props.theme - 当前主题 (dark/light/gradient)\n * @param {boolean} props.showToolbar - 是否显示工具栏 (default: true)\n * @param {string} props.apiBaseUrl - API 基础 URL\n * @param {string} props.appName - 应用名称\n * @param {string} props.appLogo - 应用 Logo URL\n * @param {string} props.language - 语言 (zh/en)\n * @param {boolean} props.showRegister - 是否显示注册选项\n * @param {Object} props.currentUser - 当前用户信息\n */\nfunction DarkLoginModal({\n  isOpen,\n  onClose,\n  onSuccess,\n  onError,\n  onLogout,\n  onNavigateToRegister,\n  onOpenFullscreen,\n  onThemeChange,\n  onModeChange,\n  theme = 'dark',\n  showToolbar = true,\n  apiBaseUrl = '/api/v1',\n  appName = 'QuantaBit',\n  appLogo,\n  language: initialLanguage,\n  showRegister = true,\n  showLanguageSwitch = true,\n  currentUser = null,\n  defaultLoginType = 'did',\n  // wallet | did - 默认使用 DID 登录\n  showSocialLogin = true,\n  socialProviders = ['apple', 'google', 'microsoft', 'wechat', 'tiktok'],\n  renderSocialLogin,\n  layoutMode = 'double'\n}) {\n  const [mode, setMode] = useState('login'); // login, register, accounts, set-pin\n  const [loginType, setLoginType] = useState(defaultLoginType); // wallet, did\n  const [didMethod, setDidMethod] = useState('password'); // password, pin\n  const [step, setStep] = useState('connect'); // connect, connecting, signing, success\n  const [error, setError] = useState(null);\n  const [success, setSuccess] = useState(null);\n  const [walletAddress, setWalletAddress] = useState(null);\n  const [showPassword, setShowPassword] = useState(false);\n  const [showConfirmPassword, setShowConfirmPassword] = useState(false);\n  const [loading, setLoading] = useState(false);\n  const [showThemeMenu, setShowThemeMenu] = useState(false);\n\n  // 客户端挂载状态\n  const [mounted, setMounted] = useState(false);\n  useEffect(() => {\n    setMounted(true);\n    return () => setMounted(false);\n  }, []);\n\n  // 语言状态 - 优先使用 props，否则从全局获取（自动归一化）\n  const [currentLanguage, setCurrentLanguage] = useState(() => {\n    if (initialLanguage) {\n      return normalizeLanguage(initialLanguage);\n    }\n    return getLanguage();\n  });\n\n  // 同步外部 props.language 变化（自动归一化）\n  useEffect(() => {\n    if (initialLanguage) {\n      const normalized = normalizeLanguage(initialLanguage);\n      if (normalized !== currentLanguage) {\n        setCurrentLanguage(normalized);\n        setLanguage(normalized);\n      }\n    }\n  }, [initialLanguage, currentLanguage]);\n\n  // 表单数据\n  const [formData, setFormData] = useState({\n    did: '',\n    password: '',\n    pin: '',\n    nickname: '',\n    email: '',\n    confirmPassword: '',\n    newPin: '' // For setting PIN\n  });\n\n  // 账户列表\n  const [savedAccounts, setSavedAccounts] = useState([]);\n  const msg = getMessages$1(currentLanguage);\n\n  // 语言切换处理\n  const handleLanguageChange = useCallback(newLang => {\n    console.log('[DarkLoginModal] 手动切换语言:', newLang);\n    setCurrentLanguage(newLang);\n    setLanguage(newLang);\n  }, []);\n\n  // 订阅全局语言变更（当用户在页面其他地方切换语言时）\n  useEffect(() => {\n    // 订阅 i18n 模块的语言变更（内部已包含全局事件监听）\n    const unsubscribe = onLanguageChange(newLang => {\n      console.log('[DarkLoginModal] 收到全局语言变更事件:', newLang);\n      setCurrentLanguage(newLang);\n    });\n    return () => {\n      console.log('[DarkLoginModal] 取消语言订阅');\n      unsubscribe();\n    };\n  }, []);\n\n  // 配置 API\n  useEffect(() => {\n    if (apiBaseUrl) {\n      apiClient.configure({\n        apiBaseUrl\n      });\n    }\n  }, [apiBaseUrl]);\n\n  // 重置状态 + 同步语言\n  useEffect(() => {\n    if (isOpen) {\n      setStep('connect');\n      setError(null);\n      setSuccess(null);\n      setFormData({\n        did: '',\n        password: '',\n        nickname: '',\n        email: '',\n        confirmPassword: ''\n      });\n      setSavedAccounts(getSavedAccounts());\n\n      // 同步最新语言设置\n      const latestLang = getLanguage();\n      if (latestLang !== currentLanguage) {\n        console.log('[DarkLoginModal] 同步语言状态:', latestLang);\n        setCurrentLanguage(latestLang);\n      }\n\n      // 如果已登录，显示账户管理\n      if (currentUser?.did) {\n        setMode('accounts');\n      } else {\n        setMode('login');\n      }\n    }\n  }, [isOpen, currentUser]);\n\n  // 社交登录成功回调\n  const handleSocialSuccess = useCallback(result => {\n    const {\n      access_token,\n      refresh_token,\n      did,\n      user: resUser,\n      is_new_user\n    } = result;\n    apiClient.setTokens(access_token, refresh_token);\n    setCurrentDID(did);\n    saveAccount({\n      did,\n      displayName: resUser?.display_name || formatDID$1(did),\n      avatar: resUser?.avatar_url || resUser?.avatar,\n      verified: true\n    });\n    setSavedAccounts(getSavedAccounts());\n    setStep('success');\n    setSuccess(msg.success || '登录成功');\n    setTimeout(() => {\n      onSuccess && onSuccess({\n        success: true,\n        accessToken: access_token,\n        refreshToken: refresh_token,\n        did,\n        user: {\n          nickname: resUser?.display_name || resUser?.name,\n          avatar: resUser?.avatar_url || resUser?.avatar,\n          ...resUser\n        },\n        isNewUser: is_new_user\n      });\n      onClose && onClose();\n    }, 1200);\n  }, [onSuccess, onClose, msg]);\n  const handleSocialError = useCallback(err => {\n    setError(err?.message || '社交登录失败');\n  }, []);\n\n  // 钱包连接成功回调 — Web3WalletPanel 连接钱包后进入签名流程\n  const handleWalletConnect = useCallback(async (address, walletType, provider) => {\n    setError(null);\n    setWalletAddress(address);\n    setStep('signing');\n    try {\n      const chainType = ['metamask', 'coinbase', 'walletconnect'].includes(walletType) ? 'ethereum' : 'quantabit';\n      const walletProvider = provider || window.ethereum;\n      if (!walletProvider) {\n        throw new Error(msg.noWallet || '未检测到钱包');\n      }\n\n      // 获取 nonce\n      const nonceRes = await apiClient.getNonce(address, chainType);\n      const {\n        message\n      } = nonceRes.data || nonceRes;\n\n      // 请求签名\n      const signature = await signWalletMessage(walletProvider, chainType, message, address);\n\n      // 验证登录\n      const authRes = await apiClient.walletLogin(address, signature, message, chainType);\n      const {\n        access_token,\n        refresh_token,\n        did,\n        user,\n        is_new_user\n      } = authRes.data || authRes;\n      apiClient.setTokens(access_token, refresh_token);\n      setCurrentDID(did);\n\n      // 保存账户\n      saveAccount({\n        did,\n        displayName: user?.nickname || formatAddress(address),\n        avatar: user?.avatar,\n        walletAddress: address,\n        verified: true\n      });\n      setSavedAccounts(getSavedAccounts());\n      setStep('success');\n      setTimeout(() => {\n        onSuccess && onSuccess({\n          success: true,\n          accessToken: access_token,\n          refreshToken: refresh_token,\n          did,\n          user,\n          isNewUser: is_new_user\n        });\n        onClose && onClose();\n      }, 1200);\n    } catch (err) {\n      console.error('[DarkLoginModal] 钱包签名/验证失败:', err);\n      if (err.code === 4001) {\n        setError(msg.rejected || '用户拒绝了签名');\n      } else {\n        setError(err.message || msg.errorLoginFailed || '登录失败');\n      }\n      setStep('connect');\n      onError && onError(err);\n    }\n  }, [msg, onSuccess, onError, onClose]);\n\n  // DID 登录\n  const handleDIDLogin = useCallback(async e => {\n    e.preventDefault();\n    setError(null);\n    if (!formData.did.trim()) {\n      setError(currentLanguage === 'zh' ? '请输入 DID' : 'Please enter DID');\n      return;\n    }\n    if (didMethod === 'password' && !formData.password) {\n      setError(currentLanguage === 'zh' ? '请输入密码' : 'Please enter password');\n      return;\n    }\n    if (didMethod === 'pin' && !formData.pin) {\n      setError(currentLanguage === 'zh' ? '请输入 PIN' : 'Please enter PIN');\n      return;\n    }\n    try {\n      setLoading(true);\n      setStep('signing');\n      const authRes = await apiClient.didLogin(formData.did, didMethod === 'password' ? formData.password : null, didMethod === 'pin' ? formData.pin : null);\n      const {\n        access_token,\n        refresh_token,\n        did,\n        user\n      } = authRes.data || authRes;\n      apiClient.setTokens(access_token, refresh_token);\n      setCurrentDID(did);\n\n      // 保存账户\n      saveAccount({\n        did,\n        displayName: user?.nickname || formatDID$1(did),\n        avatar: user?.avatar,\n        verified: true\n      });\n      setSavedAccounts(getSavedAccounts());\n      setStep('success');\n      setTimeout(() => {\n        onSuccess && onSuccess({\n          success: true,\n          accessToken: access_token,\n          refreshToken: refresh_token,\n          did,\n          user,\n          isNewUser: false\n        });\n        onClose && onClose();\n      }, 1200);\n    } catch (err) {\n      console.error('DID Login error:', err);\n      setError(err.message || msg.errorLoginFailed || '登录失败');\n      setStep('connect');\n      onError && onError(err);\n    } finally {\n      setLoading(false);\n    }\n  }, [formData, didMethod, currentLanguage, msg, onSuccess, onError, onClose]);\n\n  // 设置 PIN\n  const handleSetPin = useCallback(async e => {\n    e.preventDefault();\n    setError(null);\n    setSuccess(null);\n    if (!formData.password) {\n      setError(currentLanguage === 'zh' ? '请输入当前密码以验证身份' : 'Please enter password to verify');\n      return;\n    }\n    if (!formData.newPin || formData.newPin.length < 4) {\n      setError(currentLanguage === 'zh' ? 'PIN 码至少4位' : 'PIN must be at least 4 chars');\n      return;\n    }\n    try {\n      setLoading(true);\n      await apiClient.setPin(currentUser.did, formData.password, formData.newPin);\n      setSuccess(currentLanguage === 'zh' ? 'PIN 设置成功！' : 'PIN set successfully!');\n\n      // Update local storage to reflect user has PIN? \n      // Ideally we should update the saved account info.\n      const updatedAccounts = savedAccounts.map(a => {\n        if (a.did === currentUser.did) {\n          return {\n            ...a,\n            hasPin: true\n          };\n        }\n        return a;\n      });\n      setSavedAccounts(updatedAccounts);\n      localStorage.setItem('qbit_did_saved_accounts', JSON.stringify(updatedAccounts));\n      setTimeout(() => {\n        setMode('accounts');\n        setSuccess(null);\n        setFormData(prev => ({\n          ...prev,\n          password: '',\n          newPin: ''\n        }));\n      }, 1500);\n    } catch (err) {\n      console.error('Set PIN error:', err);\n      setError(err.message || '设置失败');\n    } finally {\n      setLoading(false);\n    }\n  }, [formData, currentUser, savedAccounts, currentLanguage]);\n\n  // 注册\n  const handleRegister = useCallback(async e => {\n    e.preventDefault();\n    setError(null);\n\n    // 验证\n    if (!formData.nickname.trim()) {\n      setError(currentLanguage === 'zh' ? '请输入昵称' : 'Please enter nickname');\n      return;\n    }\n    if (!formData.password) {\n      setError(currentLanguage === 'zh' ? '请输入密码' : 'Please enter password');\n      return;\n    }\n    if (formData.password !== formData.confirmPassword) {\n      setError(msg.errorPasswordMismatch || '两次密码不一致');\n      return;\n    }\n    if (formData.password.length < 6) {\n      setError(currentLanguage === 'zh' ? '密码至少6位' : 'Password must be at least 6 characters');\n      return;\n    }\n    try {\n      setLoading(true);\n      const authRes = await apiClient.register({\n        displayName: formData.nickname.trim(),\n        email: formData.email || undefined,\n        password: formData.password\n      });\n      const {\n        access_token,\n        refresh_token,\n        did,\n        user\n      } = authRes.data || authRes;\n      apiClient.setTokens(access_token, refresh_token);\n      setCurrentDID(did);\n\n      // 保存账户\n      saveAccount({\n        did,\n        displayName: formData.nickname.trim(),\n        verified: true\n      });\n      setSavedAccounts(getSavedAccounts());\n      setSuccess(currentLanguage === 'zh' ? '注册成功！' : 'Registration successful!');\n      setTimeout(() => {\n        onSuccess && onSuccess({\n          success: true,\n          accessToken: access_token,\n          refreshToken: refresh_token,\n          did,\n          user,\n          isNewUser: true\n        });\n        onClose && onClose();\n      }, 1200);\n    } catch (err) {\n      console.error('Register error:', err);\n      setError(err.message || msg.errorRegisterFailed || '注册失败');\n      onError && onError(err);\n    } finally {\n      setLoading(false);\n    }\n  }, [formData, currentLanguage, msg, onSuccess, onError, onClose]);\n\n  // 快速登录\n  const handleQuickLogin = useCallback(account => {\n    setFormData(prev => ({\n      ...prev,\n      did: account.did\n    }));\n    setMode('login');\n    setLoginType('did');\n    // If account has PIN, default to PIN method?\n    if (account.hasPin) {\n      setDidMethod('pin');\n    } else {\n      setDidMethod('password');\n    }\n    setTimeout(() => {\n      if (account.hasPin) {\n        document.getElementById('dark-pin')?.focus();\n      } else {\n        document.getElementById('dark-password')?.focus();\n      }\n    }, 100);\n  }, []);\n\n  // 移除账户\n  const handleRemoveAccount = useCallback((did, e) => {\n    e.stopPropagation();\n    if (window.confirm(msg.removeConfirm || '确定移除此账户？')) {\n      removeAccount(did);\n      setSavedAccounts(getSavedAccounts());\n    }\n  }, [msg]);\n\n  // 登出\n  const handleLogout = useCallback(() => {\n    clearCurrentSession();\n    setMode('login');\n    onLogout && onLogout();\n  }, [onLogout]);\n\n  // 切换到注册\n  const goToRegister = useCallback(() => {\n    if (onNavigateToRegister) {\n      onNavigateToRegister();\n    } else {\n      setMode('register');\n      setError(null);\n      setFormData({\n        did: '',\n        password: '',\n        nickname: '',\n        email: '',\n        confirmPassword: ''\n      });\n    }\n  }, [onNavigateToRegister]);\n\n  // 默认 Logo\n  const defaultLogo = /*#__PURE__*/jsxs(\"svg\", {\n    viewBox: \"0 0 40 40\",\n    fill: \"none\",\n    xmlns: \"http://www.w3.org/2000/svg\",\n    children: [/*#__PURE__*/jsx(\"rect\", {\n      width: \"40\",\n      height: \"40\",\n      rx: \"10\",\n      fill: \"url(#dark-modal-grad)\"\n    }), /*#__PURE__*/jsx(\"path\", {\n      d: \"M12 20C12 15.5817 15.5817 12 20 12C24.4183 12 28 15.5817 28 20C28 24.4183 24.4183 28 20 28\",\n      stroke: \"white\",\n      strokeWidth: \"2.5\",\n      strokeLinecap: \"round\"\n    }), /*#__PURE__*/jsx(\"circle\", {\n      cx: \"20\",\n      cy: \"20\",\n      r: \"4\",\n      fill: \"white\"\n    }), /*#__PURE__*/jsx(\"defs\", {\n      children: /*#__PURE__*/jsxs(\"linearGradient\", {\n        id: \"dark-modal-grad\",\n        x1: \"0\",\n        y1: \"0\",\n        x2: \"40\",\n        y2: \"40\",\n        gradientUnits: \"userSpaceOnUse\",\n        children: [/*#__PURE__*/jsx(\"stop\", {\n          stopColor: \"#6366f1\"\n        }), /*#__PURE__*/jsx(\"stop\", {\n          offset: \"1\",\n          stopColor: \"#a855f7\"\n        })]\n      })\n    })]\n  });\n  if (!isOpen || !mounted) return null;\n  const otherAccounts = savedAccounts.filter(a => a.did !== currentUser?.did);\n\n  // 渲染账户管理视图\n  const renderAccountsView = () => /*#__PURE__*/jsxs(\"div\", {\n    className: \"dark-accounts-view\",\n    children: [/*#__PURE__*/jsxs(\"div\", {\n      className: \"dark-accounts-header\",\n      children: [/*#__PURE__*/jsxs(\"button\", {\n        className: \"dark-back-btn\",\n        onClick: () => setMode('login'),\n        children: [\"\\u2190 \", msg.back || '返回']\n      }), /*#__PURE__*/jsxs(\"h3\", {\n        children: [/*#__PURE__*/jsx(SwapIcon, {\n          size: 18\n        }), \" \", msg.accountsSection || '账户管理']\n      })]\n    }), currentUser?.did && /*#__PURE__*/jsxs(\"div\", {\n      className: \"dark-current-account\",\n      children: [/*#__PURE__*/jsx(\"p\", {\n        className: \"dark-section-label\",\n        children: msg.currentAccount || '当前账户'\n      }), /*#__PURE__*/jsxs(\"div\", {\n        className: \"dark-account-card current\",\n        children: [/*#__PURE__*/jsx(\"div\", {\n          className: \"dark-account-avatar\",\n          children: currentUser.avatar ? /*#__PURE__*/jsx(\"img\", {\n            src: currentUser.avatar,\n            alt: \"\"\n          }) : /*#__PURE__*/jsx(\"span\", {\n            children: \"\\uD83D\\uDD10\"\n          })\n        }), /*#__PURE__*/jsxs(\"div\", {\n          className: \"dark-account-info\",\n          children: [/*#__PURE__*/jsxs(\"span\", {\n            className: \"dark-account-name\",\n            children: [currentUser.nickname || currentUser.displayName || formatDID$1(currentUser.did), /*#__PURE__*/jsx(VerifiedIcon, {\n              size: 14\n            })]\n          }), /*#__PURE__*/jsx(\"span\", {\n            className: \"dark-account-did\",\n            children: formatDID$1(currentUser.did)\n          })]\n        }), /*#__PURE__*/jsx(\"button\", {\n          className: \"dark-logout-btn\",\n          onClick: () => setMode('set-pin'),\n          title: msg.setPin || '设置 PIN',\n          children: /*#__PURE__*/jsx(KeypadIcon, {\n            size: 18\n          })\n        }), /*#__PURE__*/jsx(\"button\", {\n          className: \"dark-logout-btn\",\n          onClick: handleLogout,\n          title: msg.logout,\n          children: /*#__PURE__*/jsx(LogoutIcon, {\n            size: 18\n          })\n        })]\n      })]\n    }), /*#__PURE__*/jsxs(\"button\", {\n      className: \"dark-add-account-btn\",\n      onClick: () => setMode('login'),\n      children: [\"+ \", msg.addNewAccount || '添加新账户']\n    }), otherAccounts.length > 0 && /*#__PURE__*/jsxs(\"div\", {\n      className: \"dark-other-accounts\",\n      children: [/*#__PURE__*/jsx(\"p\", {\n        className: \"dark-section-label\",\n        children: msg.otherAccounts || '其他账户'\n      }), otherAccounts.map(account => /*#__PURE__*/jsxs(\"div\", {\n        className: \"dark-account-card\",\n        onClick: () => handleQuickLogin(account),\n        children: [/*#__PURE__*/jsx(\"div\", {\n          className: \"dark-account-avatar\",\n          children: account.avatar ? /*#__PURE__*/jsx(\"img\", {\n            src: account.avatar,\n            alt: \"\"\n          }) : /*#__PURE__*/jsx(\"span\", {\n            children: \"\\uD83D\\uDD10\"\n          })\n        }), /*#__PURE__*/jsxs(\"div\", {\n          className: \"dark-account-info\",\n          children: [/*#__PURE__*/jsxs(\"span\", {\n            className: \"dark-account-name\",\n            children: [account.displayName || formatDID$1(account.did), account.verified && /*#__PURE__*/jsx(VerifiedIcon, {\n              size: 14\n            })]\n          }), /*#__PURE__*/jsx(\"span\", {\n            className: \"dark-account-did\",\n            children: formatDID$1(account.did)\n          })]\n        }), /*#__PURE__*/jsx(\"button\", {\n          className: \"dark-switch-btn\",\n          children: msg.switchAccount || '切换'\n        }), /*#__PURE__*/jsx(\"button\", {\n          className: \"dark-remove-btn\",\n          onClick: e => handleRemoveAccount(account.did, e),\n          title: msg.removeAccount || '移除',\n          children: /*#__PURE__*/jsx(TrashIcon, {\n            size: 16\n          })\n        })]\n      }, account.did))]\n    }), otherAccounts.length === 0 && !currentUser?.did && /*#__PURE__*/jsx(\"p\", {\n      className: \"dark-no-accounts\",\n      children: msg.noOtherAccounts || '没有其他账户'\n    })]\n  });\n\n  // 渲染注册视图\n  const renderSocialLoginSection = () => {\n    if (!showSocialLogin) return null;\n    return /*#__PURE__*/jsxs(\"div\", {\n      className: \"dark-social-login-container\",\n      style: {\n        padding: '0 32px 16px',\n        display: 'flex',\n        flexDirection: 'column',\n        alignItems: 'center',\n        width: '100%',\n        boxSizing: 'border-box'\n      },\n      children: [/*#__PURE__*/jsxs(\"div\", {\n        className: \"dark-social-divider\",\n        style: {\n          width: '100%',\n          display: 'flex',\n          alignItems: 'center',\n          margin: '10px 0 15px 0',\n          color: '#6b7280',\n          fontSize: '13px'\n        },\n        children: [/*#__PURE__*/jsx(\"div\", {\n          style: {\n            flex: 1,\n            height: '1px',\n            backgroundColor: 'rgba(255,255,255,0.08)'\n          }\n        }), /*#__PURE__*/jsx(\"span\", {\n          style: {\n            padding: '0 10px'\n          },\n          children: msg.orDivider || '或'\n        }), /*#__PURE__*/jsx(\"div\", {\n          style: {\n            flex: 1,\n            height: '1px',\n            backgroundColor: 'rgba(255,255,255,0.08)'\n          }\n        })]\n      }), renderSocialLogin ? typeof renderSocialLogin === 'function' ? renderSocialLogin() : renderSocialLogin : /*#__PURE__*/jsx(OAuthIconGroup, {\n        providers: socialProviders,\n        onSuccess: handleSocialSuccess,\n        onError: handleSocialError\n      })]\n    });\n  };\n  const renderRegisterView = () => /*#__PURE__*/jsx(\"div\", {\n    className: \"dark-login-step\",\n    children: /*#__PURE__*/jsxs(\"form\", {\n      onSubmit: handleRegister,\n      className: \"dark-login-form\",\n      children: [/*#__PURE__*/jsxs(\"div\", {\n        className: \"dark-form-group\",\n        children: [/*#__PURE__*/jsxs(\"label\", {\n          htmlFor: \"dark-nickname\",\n          children: [msg.nickname || '昵称', \" *\"]\n        }), /*#__PURE__*/jsx(\"input\", {\n          type: \"text\",\n          id: \"dark-nickname\",\n          value: formData.nickname,\n          onChange: e => setFormData({\n            ...formData,\n            nickname: e.target.value\n          }),\n          placeholder: currentLanguage === 'zh' ? '请输入昵称' : 'Enter nickname',\n          required: true,\n          disabled: loading\n        })]\n      }), /*#__PURE__*/jsxs(\"div\", {\n        className: \"dark-form-group\",\n        children: [/*#__PURE__*/jsxs(\"label\", {\n          htmlFor: \"dark-email\",\n          children: [msg.email || '邮箱', \" (\", currentLanguage === 'zh' ? '可选' : 'optional', \")\"]\n        }), /*#__PURE__*/jsx(\"input\", {\n          type: \"email\",\n          id: \"dark-email\",\n          value: formData.email,\n          onChange: e => setFormData({\n            ...formData,\n            email: e.target.value\n          }),\n          placeholder: \"user@example.com\",\n          disabled: loading\n        })]\n      }), /*#__PURE__*/jsxs(\"div\", {\n        className: \"dark-form-group\",\n        children: [/*#__PURE__*/jsxs(\"label\", {\n          htmlFor: \"dark-reg-password\",\n          children: [msg.password || '密码', \" *\"]\n        }), /*#__PURE__*/jsxs(\"div\", {\n          className: \"dark-password-input\",\n          children: [/*#__PURE__*/jsx(\"input\", {\n            type: showPassword ? 'text' : 'password',\n            id: \"dark-reg-password\",\n            value: formData.password,\n            onChange: e => setFormData({\n              ...formData,\n              password: e.target.value\n            }),\n            placeholder: \"\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\",\n            required: true,\n            disabled: loading\n          }), /*#__PURE__*/jsx(\"button\", {\n            type: \"button\",\n            className: \"dark-toggle-password\",\n            onClick: () => setShowPassword(!showPassword),\n            children: showPassword ? /*#__PURE__*/jsx(EyeOffIcon, {\n              size: 18\n            }) : /*#__PURE__*/jsx(EyeIcon, {\n              size: 18\n            })\n          })]\n        })]\n      }), /*#__PURE__*/jsxs(\"div\", {\n        className: \"dark-form-group\",\n        children: [/*#__PURE__*/jsxs(\"label\", {\n          htmlFor: \"dark-confirm-password\",\n          children: [msg.confirmPassword || '确认密码', \" *\"]\n        }), /*#__PURE__*/jsxs(\"div\", {\n          className: \"dark-password-input\",\n          children: [/*#__PURE__*/jsx(\"input\", {\n            type: showConfirmPassword ? 'text' : 'password',\n            id: \"dark-confirm-password\",\n            value: formData.confirmPassword,\n            onChange: e => setFormData({\n              ...formData,\n              confirmPassword: e.target.value\n            }),\n            placeholder: \"\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\",\n            required: true,\n            disabled: loading\n          }), /*#__PURE__*/jsx(\"button\", {\n            type: \"button\",\n            className: \"dark-toggle-password\",\n            onClick: () => setShowConfirmPassword(!showConfirmPassword),\n            children: showConfirmPassword ? /*#__PURE__*/jsx(EyeOffIcon, {\n              size: 18\n            }) : /*#__PURE__*/jsx(EyeIcon, {\n              size: 18\n            })\n          })]\n        })]\n      }), /*#__PURE__*/jsxs(\"button\", {\n        type: \"submit\",\n        className: \"dark-connect-btn\",\n        disabled: loading,\n        children: [loading ? /*#__PURE__*/jsx(LoaderIcon, {\n          size: 20\n        }) : /*#__PURE__*/jsx(ShieldIcon, {\n          size: 20\n        }), loading ? msg.registering || '注册中...' : msg.registerButton || '创建身份', !loading && /*#__PURE__*/jsx(ArrowRightIcon, {\n          size: 20\n        })]\n      })]\n    })\n  });\n\n  // 渲染设置 PIN 视图\n  const renderSetPinView = () => /*#__PURE__*/jsxs(\"div\", {\n    className: \"dark-login-step\",\n    children: [/*#__PURE__*/jsxs(\"div\", {\n      className: \"dark-accounts-header\",\n      children: [/*#__PURE__*/jsxs(\"button\", {\n        className: \"dark-back-btn\",\n        onClick: () => setMode('accounts'),\n        children: [\"\\u2190 \", msg.back || '返回']\n      }), /*#__PURE__*/jsxs(\"h3\", {\n        children: [/*#__PURE__*/jsx(KeyIcon, {\n          size: 18\n        }), \" \", msg.setPin || '设置 PIN']\n      })]\n    }), /*#__PURE__*/jsx(\"p\", {\n      className: \"dark-step-description\",\n      children: currentLanguage === 'zh' ? '设置 PIN 码可让您更快速地登录 DID 账户' : 'Set a PIN for faster DID login'\n    }), success && /*#__PURE__*/jsxs(\"div\", {\n      className: \"dark-login-step dark-success-step\",\n      children: [/*#__PURE__*/jsx(\"div\", {\n        className: \"dark-success-icon\",\n        children: /*#__PURE__*/jsx(CheckIcon, {\n          size: 32\n        })\n      }), /*#__PURE__*/jsx(\"p\", {\n        children: success\n      })]\n    }), !success && /*#__PURE__*/jsxs(\"form\", {\n      onSubmit: handleSetPin,\n      className: \"dark-login-form\",\n      children: [/*#__PURE__*/jsxs(\"div\", {\n        className: \"dark-form-group\",\n        children: [/*#__PURE__*/jsxs(\"label\", {\n          htmlFor: \"dark-verify-password\",\n          children: [msg.password || '当前密码', \" *\"]\n        }), /*#__PURE__*/jsxs(\"div\", {\n          className: \"dark-password-input\",\n          children: [/*#__PURE__*/jsx(\"input\", {\n            type: showPassword ? 'text' : 'password',\n            id: \"dark-verify-password\",\n            value: formData.password,\n            onChange: e => setFormData({\n              ...formData,\n              password: e.target.value\n            }),\n            placeholder: currentLanguage === 'zh' ? '验证身份' : 'Verify identity',\n            required: true,\n            disabled: loading\n          }), /*#__PURE__*/jsx(\"button\", {\n            type: \"button\",\n            className: \"dark-toggle-password\",\n            onClick: () => setShowPassword(!showPassword),\n            children: showPassword ? /*#__PURE__*/jsx(EyeOffIcon, {\n              size: 18\n            }) : /*#__PURE__*/jsx(EyeIcon, {\n              size: 18\n            })\n          })]\n        })]\n      }), /*#__PURE__*/jsxs(\"div\", {\n        className: \"dark-form-group\",\n        children: [/*#__PURE__*/jsx(\"label\", {\n          htmlFor: \"dark-new-pin\",\n          children: \"BTC / PIN Code *\"\n        }), /*#__PURE__*/jsx(\"div\", {\n          className: \"dark-password-input\",\n          children: /*#__PURE__*/jsx(\"input\", {\n            type: \"password\",\n            id: \"dark-new-pin\",\n            maxLength: 6,\n            value: formData.newPin,\n            onChange: e => setFormData({\n              ...formData,\n              newPin: e.target.value.replace(/\\D/g, '')\n            }),\n            placeholder: \"6-digit PIN\",\n            required: true,\n            disabled: loading,\n            className: \"dark-pin-input\",\n            style: {\n              letterSpacing: '8px',\n              fontSize: '18px',\n              textAlign: 'center'\n            }\n          })\n        })]\n      }), /*#__PURE__*/jsxs(\"button\", {\n        type: \"submit\",\n        className: \"dark-connect-btn\",\n        disabled: loading,\n        children: [loading ? /*#__PURE__*/jsx(LoaderIcon, {\n          size: 20\n        }) : /*#__PURE__*/jsx(KeyIcon, {\n          size: 20\n        }), loading ? msg.processing || '处理中...' : msg.confirmSetPin || '确认设置']\n      })]\n    }), error && /*#__PURE__*/jsxs(\"div\", {\n      className: \"dark-login-error\",\n      children: [/*#__PURE__*/jsx(AlertIcon, {\n        size: 18\n      }), /*#__PURE__*/jsx(\"span\", {\n        children: error\n      })]\n    })]\n  });\n  return /*#__PURE__*/ReactDOM.createPortal(/*#__PURE__*/jsx(\"div\", {\n    className: `dark-login-overlay dark-theme-${theme}`,\n    onClick: e => e.target === e.currentTarget && onClose(),\n    children: /*#__PURE__*/jsxs(\"div\", {\n      className: `dark-login-modal${loginType === 'wallet' && mode === 'login' && layoutMode !== 'single' ? ' dark-wallet-mode' : ''}${layoutMode === 'single' ? ' layout-single' : ''}`,\n      children: [/*#__PURE__*/jsxs(\"div\", {\n        className: \"dark-login-topbar\",\n        children: [/*#__PURE__*/jsxs(\"div\", {\n          className: \"dark-topbar-left\",\n          children: [showLanguageSwitch && /*#__PURE__*/jsx(LanguageSwitcher, {\n            currentLanguage: currentLanguage,\n            onLanguageChange: handleLanguageChange,\n            variant: \"dark\",\n            showFlag: true,\n            showName: false\n          }), showToolbar && onThemeChange && /*#__PURE__*/jsxs(\"div\", {\n            className: \"dark-toolbar-item\",\n            children: [/*#__PURE__*/jsx(\"button\", {\n              className: \"dark-toolbar-btn\",\n              onClick: () => setShowThemeMenu(!showThemeMenu),\n              title: currentLanguage === 'zh' ? '切换主题' : 'Switch Theme',\n              children: /*#__PURE__*/jsx(PaletteIcon, {\n                size: 16\n              })\n            }), showThemeMenu && /*#__PURE__*/jsx(\"div\", {\n              className: \"dark-theme-dropdown\",\n              children: AVAILABLE_THEMES.map(t => {\n                const ThemeIcon = t.icon;\n                return /*#__PURE__*/jsxs(\"button\", {\n                  className: `dark-theme-option ${theme === t.key ? 'active' : ''}`,\n                  onClick: () => {\n                    onThemeChange(t.key);\n                    setShowThemeMenu(false);\n                  },\n                  children: [/*#__PURE__*/jsx(ThemeIcon, {\n                    size: 16\n                  }), /*#__PURE__*/jsx(\"span\", {\n                    children: currentLanguage === 'zh' ? t.label : t.labelEn\n                  }), theme === t.key && /*#__PURE__*/jsx(CheckIcon, {\n                    size: 14\n                  })]\n                }, t.key);\n              })\n            })]\n          })]\n        }), /*#__PURE__*/jsx(\"div\", {\n          className: \"dark-topbar-center\",\n          children: /*#__PURE__*/jsx(\"h2\", {\n            children: mode === 'register' ? msg.registerSection || '创建身份' : mode === 'accounts' ? msg.accountsSection || '账户管理' : mode === 'set-pin' ? msg.securitySettings || '安全设置' : currentLanguage === 'zh' ? '登录' : 'Login'\n          })\n        }), /*#__PURE__*/jsxs(\"div\", {\n          className: \"dark-topbar-right\",\n          children: [showToolbar && onModeChange && /*#__PURE__*/jsx(\"button\", {\n            className: \"dark-toolbar-btn\",\n            onClick: () => onModeChange('full'),\n            title: currentLanguage === 'zh' ? '全功能模式' : 'Full Mode',\n            children: /*#__PURE__*/jsx(LayoutIcon, {\n              size: 16\n            })\n          }), showToolbar && onOpenFullscreen && /*#__PURE__*/jsx(\"button\", {\n            className: \"dark-toolbar-btn\",\n            onClick: () => {\n              onClose();\n              onOpenFullscreen();\n            },\n            title: currentLanguage === 'zh' ? '全屏登录页' : 'Open Fullscreen',\n            children: /*#__PURE__*/jsx(ExpandIcon, {\n              size: 16\n            })\n          }), /*#__PURE__*/jsx(\"button\", {\n            className: \"dark-toolbar-btn\",\n            onClick: onClose,\n            children: /*#__PURE__*/jsx(CloseIcon, {})\n          })]\n        })]\n      }), /*#__PURE__*/jsx(\"div\", {\n        className: \"dark-login-subtitle\",\n        children: /*#__PURE__*/jsx(\"p\", {\n          children: mode === 'register' ? msg.chooseMethod || '创建您的去中心化身份' : msg.subtitle\n        })\n      }), /*#__PURE__*/jsxs(\"div\", {\n        className: \"dark-login-bg\",\n        children: [/*#__PURE__*/jsx(\"div\", {\n          className: \"dark-login-orb dark-login-orb-1\"\n        }), /*#__PURE__*/jsx(\"div\", {\n          className: \"dark-login-orb dark-login-orb-2\"\n        }), /*#__PURE__*/jsx(\"div\", {\n          className: \"dark-login-grid\"\n        })]\n      }), /*#__PURE__*/jsxs(\"div\", {\n        className: \"dark-login-container\",\n        children: [/*#__PURE__*/jsxs(\"div\", {\n          className: \"dark-login-card\",\n          children: [/*#__PURE__*/jsxs(\"div\", {\n            className: \"dark-login-brand\",\n            style: {\n              margin: '0',\n              padding: '24px 28px 20px',\n              borderBottom: '1px solid rgba(255, 255, 255, 0.04)',\n              justifyContent: 'center'\n            },\n            children: [/*#__PURE__*/jsx(\"div\", {\n              className: \"dark-login-logo-icon\",\n              children: appLogo ? /*#__PURE__*/jsx(\"img\", {\n                src: appLogo,\n                alt: appName\n              }) : defaultLogo\n            }), /*#__PURE__*/jsx(\"span\", {\n              style: {\n                fontSize: '1.4rem'\n              },\n              children: appName\n            })]\n          }), mode === 'accounts' ? /*#__PURE__*/jsx(\"div\", {\n            className: \"dark-login-content\",\n            children: renderAccountsView()\n          }) : mode === 'set-pin' ? /*#__PURE__*/jsx(\"div\", {\n            className: \"dark-login-content\",\n            children: renderSetPinView()\n          }) : mode === 'register' ? /*#__PURE__*/jsxs(Fragment, {\n            children: [/*#__PURE__*/jsxs(\"div\", {\n              className: \"dark-login-content\",\n              children: [success ? /*#__PURE__*/jsxs(\"div\", {\n                className: \"dark-login-step dark-success-step\",\n                children: [/*#__PURE__*/jsx(\"div\", {\n                  className: \"dark-success-icon\",\n                  children: /*#__PURE__*/jsx(CheckIcon, {\n                    size: 32\n                  })\n                }), /*#__PURE__*/jsx(\"p\", {\n                  children: success\n                }), /*#__PURE__*/jsx(\"span\", {\n                  children: msg.redirecting || '正在跳转...'\n                })]\n              }) : renderRegisterView(), error && /*#__PURE__*/jsxs(\"div\", {\n                className: \"dark-login-error\",\n                children: [/*#__PURE__*/jsx(AlertIcon, {\n                  size: 18\n                }), /*#__PURE__*/jsx(\"span\", {\n                  children: error\n                })]\n              })]\n            }), renderSocialLoginSection(), /*#__PURE__*/jsx(\"div\", {\n              className: \"dark-login-footer\",\n              children: /*#__PURE__*/jsxs(\"p\", {\n                children: [msg.alreadyHaveDID || '已有账号？', /*#__PURE__*/jsx(\"button\", {\n                  onClick: () => {\n                    setMode('login');\n                    setError(null);\n                  },\n                  children: msg.goLogin || '去登录'\n                })]\n              })\n            })]\n          }) : /*#__PURE__*/jsxs(Fragment, {\n            children: [/*#__PURE__*/jsxs(\"div\", {\n              className: \"dark-login-tabs\",\n              children: [/*#__PURE__*/jsxs(\"button\", {\n                className: `dark-login-tab ${loginType === 'wallet' ? 'active' : ''}`,\n                onClick: () => {\n                  setLoginType('wallet');\n                  setError(null);\n                  setStep('connect');\n                },\n                children: [/*#__PURE__*/jsx(WalletIcon, {\n                  size: 18\n                }), msg.walletSection || '钱包登录']\n              }), /*#__PURE__*/jsxs(\"button\", {\n                className: `dark-login-tab ${loginType === 'did' ? 'active' : ''}`,\n                onClick: () => {\n                  setLoginType('did');\n                  setError(null);\n                  setStep('connect');\n                },\n                children: [/*#__PURE__*/jsx(MailIcon, {\n                  size: 18\n                }), msg.didSection || 'DID 登录']\n              })]\n            }), /*#__PURE__*/jsxs(\"div\", {\n              className: \"dark-login-content\",\n              children: [loginType === 'wallet' && /*#__PURE__*/jsxs(Fragment, {\n                children: [step === 'connect' && /*#__PURE__*/jsx(Web3WalletPanel, {\n                  onConnect: handleWalletConnect,\n                  onError: err => {\n                    setError(err.message);\n                    onError && onError(err);\n                  },\n                  language: currentLanguage,\n                  theme: theme,\n                  apiBaseUrl: apiBaseUrl,\n                  layoutMode: layoutMode\n                }), step === 'signing' && /*#__PURE__*/jsxs(\"div\", {\n                  className: \"dark-login-step dark-signing-step\",\n                  children: [/*#__PURE__*/jsxs(\"div\", {\n                    className: \"dark-wallet-address\",\n                    children: [/*#__PURE__*/jsx(ShieldIcon, {\n                      size: 20\n                    }), /*#__PURE__*/jsx(\"code\", {\n                      children: formatAddress(walletAddress)\n                    })]\n                  }), /*#__PURE__*/jsx(LoaderIcon, {\n                    size: 32\n                  }), /*#__PURE__*/jsx(\"p\", {\n                    children: msg.signing || '请在钱包中签名...'\n                  }), /*#__PURE__*/jsx(\"span\", {\n                    className: \"dark-signing-hint\",\n                    children: msg.securityNote || '请确认在您的钱包中签名'\n                  })]\n                })]\n              }), loginType === 'did' && step === 'connect' && /*#__PURE__*/jsxs(\"div\", {\n                className: \"dark-login-step\",\n                children: [savedAccounts.length > 0 && /*#__PURE__*/jsxs(\"div\", {\n                  className: \"dark-saved-accounts\",\n                  children: [/*#__PURE__*/jsx(\"p\", {\n                    className: \"dark-saved-label\",\n                    children: msg.savedAccounts || '已保存账户'\n                  }), savedAccounts.slice(0, 3).map(account => /*#__PURE__*/jsxs(\"button\", {\n                    className: \"dark-saved-account\",\n                    onClick: () => handleQuickLogin(account),\n                    children: [/*#__PURE__*/jsx(\"div\", {\n                      className: \"dark-saved-avatar\",\n                      children: account.avatar ? /*#__PURE__*/jsx(\"img\", {\n                        src: account.avatar,\n                        alt: \"\"\n                      }) : /*#__PURE__*/jsx(\"span\", {\n                        children: \"\\uD83D\\uDD10\"\n                      })\n                    }), /*#__PURE__*/jsxs(\"div\", {\n                      className: \"dark-saved-info\",\n                      children: [/*#__PURE__*/jsx(\"span\", {\n                        className: \"dark-saved-name\",\n                        children: account.displayName || formatDID$1(account.did)\n                      }), /*#__PURE__*/jsx(\"span\", {\n                        className: \"dark-saved-did\",\n                        children: formatDID$1(account.did)\n                      })]\n                    }), /*#__PURE__*/jsx(\"span\", {\n                      className: \"dark-quick-label\",\n                      children: msg.quickLogin || '快速登录'\n                    })]\n                  }, account.did))]\n                }), /*#__PURE__*/jsxs(Fragment, {\n                  children: [/*#__PURE__*/jsxs(\"div\", {\n                    className: \"dark-method-switch\",\n                    style: {\n                      display: 'flex',\n                      gap: '8px',\n                      marginBottom: '16px',\n                      background: 'rgba(255,255,255,0.05)',\n                      padding: '4px',\n                      borderRadius: '8px'\n                    },\n                    children: [/*#__PURE__*/jsxs(\"button\", {\n                      type: \"button\",\n                      onClick: () => setDidMethod('password'),\n                      style: {\n                        flex: 1,\n                        padding: '6px',\n                        border: 'none',\n                        borderRadius: '6px',\n                        background: didMethod === 'password' ? 'rgba(255,255,255,0.15)' : 'transparent',\n                        color: didMethod === 'password' ? '#fff' : 'rgba(255,255,255,0.6)',\n                        cursor: 'pointer',\n                        fontSize: '13px',\n                        display: 'flex',\n                        alignItems: 'center',\n                        justifyContent: 'center',\n                        gap: '6px'\n                      },\n                      children: [/*#__PURE__*/jsx(LockIcon, {\n                        size: 14\n                      }), \" Password\"]\n                    }), /*#__PURE__*/jsxs(\"button\", {\n                      type: \"button\",\n                      onClick: () => setDidMethod('pin'),\n                      style: {\n                        flex: 1,\n                        padding: '6px',\n                        border: 'none',\n                        borderRadius: '6px',\n                        background: didMethod === 'pin' ? 'rgba(255,255,255,0.15)' : 'transparent',\n                        color: didMethod === 'pin' ? '#fff' : 'rgba(255,255,255,0.6)',\n                        cursor: 'pointer',\n                        fontSize: '13px',\n                        display: 'flex',\n                        alignItems: 'center',\n                        justifyContent: 'center',\n                        gap: '6px'\n                      },\n                      children: [/*#__PURE__*/jsx(KeypadIcon, {\n                        size: 14\n                      }), \" PIN\"]\n                    })]\n                  }), /*#__PURE__*/jsxs(\"form\", {\n                    onSubmit: handleDIDLogin,\n                    className: \"dark-login-form\",\n                    children: [/*#__PURE__*/jsxs(\"div\", {\n                      className: \"dark-form-group\",\n                      children: [/*#__PURE__*/jsxs(\"label\", {\n                        htmlFor: \"dark-did\",\n                        children: [\"DID / \", msg.email || '邮箱']\n                      }), /*#__PURE__*/jsx(\"input\", {\n                        type: \"text\",\n                        id: \"dark-did\",\n                        value: formData.did,\n                        onChange: e => setFormData({\n                          ...formData,\n                          did: e.target.value\n                        }),\n                        placeholder: currentLanguage === 'zh' ? 'did:qbit:... 或 邮箱' : 'did:qbit:... or email',\n                        required: true,\n                        disabled: loading\n                      })]\n                    }), didMethod === 'password' ? /*#__PURE__*/jsxs(\"div\", {\n                      className: \"dark-form-group\",\n                      children: [/*#__PURE__*/jsx(\"label\", {\n                        htmlFor: \"dark-password\",\n                        children: msg.password || '密码'\n                      }), /*#__PURE__*/jsxs(\"div\", {\n                        className: \"dark-password-input\",\n                        children: [/*#__PURE__*/jsx(\"input\", {\n                          type: showPassword ? 'text' : 'password',\n                          id: \"dark-password\",\n                          value: formData.password,\n                          onChange: e => setFormData({\n                            ...formData,\n                            password: e.target.value\n                          }),\n                          placeholder: \"\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\",\n                          required: true,\n                          disabled: loading\n                        }), /*#__PURE__*/jsx(\"button\", {\n                          type: \"button\",\n                          className: \"dark-toggle-password\",\n                          onClick: () => setShowPassword(!showPassword),\n                          children: showPassword ? /*#__PURE__*/jsx(EyeOffIcon, {\n                            size: 18\n                          }) : /*#__PURE__*/jsx(EyeIcon, {\n                            size: 18\n                          })\n                        })]\n                      })]\n                    }) : /*#__PURE__*/jsxs(\"div\", {\n                      className: \"dark-form-group\",\n                      children: [/*#__PURE__*/jsx(\"label\", {\n                        htmlFor: \"dark-pin\",\n                        children: \"PIN Code\"\n                      }), /*#__PURE__*/jsx(\"div\", {\n                        className: \"dark-password-input\",\n                        children: /*#__PURE__*/jsx(\"input\", {\n                          type: \"password\",\n                          id: \"dark-pin\",\n                          maxLength: 6,\n                          value: formData.pin,\n                          onChange: e => setFormData({\n                            ...formData,\n                            pin: e.target.value.replace(/\\D/g, '')\n                          }),\n                          placeholder: \"6-digit PIN\",\n                          required: true,\n                          disabled: loading,\n                          className: \"dark-pin-input\",\n                          style: {\n                            letterSpacing: '8px',\n                            fontSize: '18px',\n                            textAlign: 'center'\n                          }\n                        })\n                      })]\n                    }), /*#__PURE__*/jsxs(\"button\", {\n                      type: \"submit\",\n                      className: \"dark-connect-btn\",\n                      disabled: loading,\n                      children: [loading ? /*#__PURE__*/jsx(LoaderIcon, {\n                        size: 20\n                      }) : /*#__PURE__*/jsx(MailIcon, {\n                        size: 20\n                      }), loading ? msg.loggingIn || '登录中...' : msg.loginButton || '安全登录', !loading && /*#__PURE__*/jsx(ArrowRightIcon, {\n                        size: 20\n                      })]\n                    })]\n                  }), error && /*#__PURE__*/jsxs(\"div\", {\n                    className: \"dark-login-error\",\n                    children: [/*#__PURE__*/jsx(AlertIcon, {\n                      size: 18\n                    }), /*#__PURE__*/jsx(\"span\", {\n                      children: error\n                    })]\n                  })]\n                })]\n              }), loginType === 'did' && step === 'signing' && /*#__PURE__*/jsxs(\"div\", {\n                className: \"dark-login-step dark-loading-step\",\n                children: [/*#__PURE__*/jsx(LoaderIcon, {\n                  size: 48\n                }), /*#__PURE__*/jsx(\"p\", {\n                  children: msg.verifying || '验证中...'\n                })]\n              }), step === 'success' && /*#__PURE__*/jsxs(\"div\", {\n                className: \"dark-login-step dark-success-step\",\n                children: [/*#__PURE__*/jsx(\"div\", {\n                  className: \"dark-success-icon\",\n                  children: /*#__PURE__*/jsx(CheckIcon, {\n                    size: 32\n                  })\n                }), /*#__PURE__*/jsx(\"p\", {\n                  children: msg.success || '登录成功'\n                }), /*#__PURE__*/jsx(\"span\", {\n                  children: msg.redirecting || '正在跳转...'\n                })]\n              })]\n            }), renderSocialLoginSection(), /*#__PURE__*/jsxs(\"div\", {\n              className: \"dark-login-footer\",\n              children: [showRegister && /*#__PURE__*/jsxs(\"p\", {\n                children: [msg.noAccountYet || '还没有账号？', /*#__PURE__*/jsx(\"button\", {\n                  type: \"button\",\n                  onClick: goToRegister,\n                  children: msg.register || '立即注册'\n                })]\n              }), savedAccounts.length > 0 && /*#__PURE__*/jsxs(\"button\", {\n                type: \"button\",\n                className: \"dark-manage-accounts-link\",\n                onClick: () => setMode('accounts'),\n                children: [/*#__PURE__*/jsx(SwapIcon, {\n                  size: 14\n                }), \" \", msg.manageAccounts || '管理账户']\n              })]\n            })]\n          })]\n        }), /*#__PURE__*/jsxs(\"div\", {\n          className: \"dark-login-features\",\n          children: [/*#__PURE__*/jsxs(\"div\", {\n            className: \"dark-feature\",\n            children: [/*#__PURE__*/jsx(ShieldIcon, {\n              size: 20\n            }), /*#__PURE__*/jsx(\"span\", {\n              children: msg.feature1 || '数据完全自主掌控'\n            })]\n          }), /*#__PURE__*/jsxs(\"div\", {\n            className: \"dark-feature\",\n            children: [/*#__PURE__*/jsx(WalletIcon, {\n              size: 20\n            }), /*#__PURE__*/jsx(\"span\", {\n              children: msg.feature2 || 'W3C 标准身份'\n            })]\n          })]\n        })]\n      })]\n    })\n  }), document.body);\n}\n\n/**\n * QuantaBit Auth SDK - 全页面登录组件 (LoginPage)\n * \n * 独立的全页登录/注册页面，支持：\n * - 钱包登录（MetaMask, WalletConnect 等）\n * - DID 密码登录\n * - 标签页切换登录方式\n * - 精美的深色背景动画\n */\n\nfunction LoginPage({\n  onSuccess,\n  onNavigateToRegister,\n  onNavigateToHome,\n  apiBaseUrl = '/api/v1',\n  appName = 'QuantaBit',\n  appLogo,\n  language = 'zh',\n  redirectTo = '/dashboard'\n}) {\n  const [loginType, setLoginType] = useState('wallet'); // wallet, did\n  const [step, setStep] = useState('connect'); // connect, connecting, signing, success\n  const [error, setError] = useState(null);\n  const [walletAddress, setWalletAddress] = useState(null);\n  const [showPassword, setShowPassword] = useState(false);\n  const [formData, setFormData] = useState({\n    did: '',\n    password: ''\n  });\n  const msg = getMessages$1(language);\n\n  // 配置 API\n  useEffect(() => {\n    if (apiBaseUrl) {\n      authApi.configure({\n        apiBaseUrl\n      });\n    }\n  }, [apiBaseUrl]);\n\n  // 钱包登录\n  const connectWallet = useCallback(async () => {\n    setError(null);\n    if (!hasQBitWallet()) {\n      setError(msg.noWallet);\n      return;\n    }\n    try {\n      setStep('connecting');\n      const {\n        address,\n        response\n      } = await loginWithBrowserWallet(authApi, 'quantabit');\n      setWalletAddress(address);\n      setStep('signing');\n      const {\n        access_token,\n        refresh_token,\n        did,\n        user\n      } = response;\n      authApi.setTokens(access_token, refresh_token);\n      setStep('success');\n      setTimeout(() => {\n        onSuccess && onSuccess({\n          accessToken: access_token,\n          refreshToken: refresh_token,\n          did,\n          user,\n          redirectTo\n        });\n      }, 1500);\n    } catch (err) {\n      console.error('Login error:', err);\n      if (err.code === 4001) {\n        setError(msg.rejected);\n      } else {\n        setError(err.message || msg.errorLoginFailed);\n      }\n      setStep('connect');\n    }\n  }, [msg, onSuccess, redirectTo]);\n\n  // DID 登录\n  const handleDIDLogin = useCallback(async e => {\n    e.preventDefault();\n    setError(null);\n    try {\n      setStep('signing');\n      const authRes = await authApi.didLogin(formData.did, formData.password);\n      const {\n        access_token,\n        refresh_token,\n        did,\n        user\n      } = authRes.data || authRes;\n      authApi.setTokens(access_token, refresh_token);\n      setStep('success');\n      setTimeout(() => {\n        onSuccess && onSuccess({\n          accessToken: access_token,\n          refreshToken: refresh_token,\n          did,\n          user,\n          redirectTo\n        });\n      }, 1500);\n    } catch (err) {\n      console.error('DID Login error:', err);\n      setError(err.message || msg.errorLoginFailed);\n      setStep('connect');\n    }\n  }, [formData, msg, onSuccess, redirectTo]);\n\n  // 默认 Logo\n  const defaultLogo = /*#__PURE__*/jsxs(\"svg\", {\n    viewBox: \"0 0 40 40\",\n    fill: \"none\",\n    xmlns: \"http://www.w3.org/2000/svg\",\n    children: [/*#__PURE__*/jsx(\"rect\", {\n      width: \"40\",\n      height: \"40\",\n      rx: \"10\",\n      fill: \"url(#login-grad)\"\n    }), /*#__PURE__*/jsx(\"path\", {\n      d: \"M12 20C12 15.5817 15.5817 12 20 12C24.4183 12 28 15.5817 28 20C28 24.4183 24.4183 28 20 28\",\n      stroke: \"white\",\n      strokeWidth: \"2.5\",\n      strokeLinecap: \"round\"\n    }), /*#__PURE__*/jsx(\"circle\", {\n      cx: \"20\",\n      cy: \"20\",\n      r: \"4\",\n      fill: \"white\"\n    }), /*#__PURE__*/jsx(\"defs\", {\n      children: /*#__PURE__*/jsxs(\"linearGradient\", {\n        id: \"login-grad\",\n        x1: \"0\",\n        y1: \"0\",\n        x2: \"40\",\n        y2: \"40\",\n        gradientUnits: \"userSpaceOnUse\",\n        children: [/*#__PURE__*/jsx(\"stop\", {\n          stopColor: \"#6366f1\"\n        }), /*#__PURE__*/jsx(\"stop\", {\n          offset: \"1\",\n          stopColor: \"#a855f7\"\n        })]\n      })\n    })]\n  });\n  return /*#__PURE__*/jsxs(\"div\", {\n    className: \"did-login-page\",\n    children: [/*#__PURE__*/jsxs(\"div\", {\n      className: \"did-login-bg\",\n      children: [/*#__PURE__*/jsx(\"div\", {\n        className: \"did-login-orb did-login-orb-1\"\n      }), /*#__PURE__*/jsx(\"div\", {\n        className: \"did-login-orb did-login-orb-2\"\n      }), /*#__PURE__*/jsx(\"div\", {\n        className: \"did-login-grid\"\n      })]\n    }), /*#__PURE__*/jsxs(\"div\", {\n      className: \"did-login-container\",\n      children: [/*#__PURE__*/jsxs(\"a\", {\n        href: \"/\",\n        className: \"did-login-logo-link\",\n        onClick: e => {\n          e.preventDefault();\n          onNavigateToHome && onNavigateToHome();\n        },\n        children: [/*#__PURE__*/jsx(\"div\", {\n          className: \"did-login-logo-icon\",\n          children: appLogo ? /*#__PURE__*/jsx(\"img\", {\n            src: appLogo,\n            alt: appName\n          }) : defaultLogo\n        }), /*#__PURE__*/jsx(\"span\", {\n          children: appName\n        })]\n      }), /*#__PURE__*/jsxs(\"div\", {\n        className: \"did-page-login-card\",\n        children: [/*#__PURE__*/jsxs(\"div\", {\n          className: \"did-page-login-header\",\n          children: [/*#__PURE__*/jsx(\"h1\", {\n            children: language === 'zh' ? '登录' : 'Login'\n          }), /*#__PURE__*/jsx(\"p\", {\n            children: msg.subtitle\n          })]\n        }), /*#__PURE__*/jsxs(\"div\", {\n          className: \"did-page-login-tabs\",\n          children: [/*#__PURE__*/jsxs(\"button\", {\n            className: `did-page-login-tab ${loginType === 'wallet' ? 'active' : ''}`,\n            onClick: () => {\n              setLoginType('wallet');\n              setError(null);\n              setStep('connect');\n            },\n            children: [/*#__PURE__*/jsx(WalletIcon, {\n              size: 18\n            }), msg.walletSection]\n          }), /*#__PURE__*/jsxs(\"button\", {\n            className: `did-page-login-tab ${loginType === 'did' ? 'active' : ''}`,\n            onClick: () => {\n              setLoginType('did');\n              setError(null);\n              setStep('connect');\n            },\n            children: [/*#__PURE__*/jsx(MailIcon, {\n              size: 18\n            }), msg.didSection]\n          })]\n        }), /*#__PURE__*/jsxs(\"div\", {\n          className: \"did-page-login-content\",\n          children: [loginType === 'wallet' && /*#__PURE__*/jsxs(Fragment, {\n            children: [step === 'connect' && /*#__PURE__*/jsxs(\"div\", {\n              className: \"did-page-login-step\",\n              children: [/*#__PURE__*/jsx(\"div\", {\n                className: \"did-wallet-icon-wrapper\",\n                children: /*#__PURE__*/jsx(WalletIcon, {\n                  size: 48\n                })\n              }), /*#__PURE__*/jsx(\"p\", {\n                className: \"did-step-description\",\n                children: msg.connectDescription\n              }), /*#__PURE__*/jsxs(\"button\", {\n                className: \"did-connect-btn\",\n                onClick: connectWallet,\n                children: [/*#__PURE__*/jsx(WalletIcon, {\n                  size: 20\n                }), msg.connectWallet, /*#__PURE__*/jsx(ArrowRightIcon, {\n                  size: 20\n                })]\n              }), /*#__PURE__*/jsxs(\"div\", {\n                className: \"did-supported-wallets\",\n                children: [/*#__PURE__*/jsx(\"span\", {\n                  children: msg.supportedWallets\n                }), /*#__PURE__*/jsxs(\"div\", {\n                  className: \"did-wallet-logos\",\n                  children: [/*#__PURE__*/jsx(\"img\", {\n                    src: \"https://metamask.io/images/metamask-fox.svg\",\n                    alt: \"MetaMask\"\n                  }), /*#__PURE__*/jsx(\"img\", {\n                    src: \"https://avatars.githubusercontent.com/u/18060234\",\n                    alt: \"WalletConnect\"\n                  }), /*#__PURE__*/jsx(\"img\", {\n                    src: \"https://avatars.githubusercontent.com/u/43919302\",\n                    alt: \"Coinbase\"\n                  })]\n                })]\n              })]\n            }), step === 'connecting' && /*#__PURE__*/jsxs(\"div\", {\n              className: \"did-page-login-step did-loading-step\",\n              children: [/*#__PURE__*/jsx(LoaderIcon, {\n                size: 48\n              }), /*#__PURE__*/jsx(\"p\", {\n                children: msg.connecting\n              })]\n            }), step === 'signing' && /*#__PURE__*/jsxs(\"div\", {\n              className: \"did-page-login-step did-signing-step\",\n              children: [/*#__PURE__*/jsxs(\"div\", {\n                className: \"did-wallet-address\",\n                children: [/*#__PURE__*/jsx(ShieldIcon, {\n                  size: 20\n                }), /*#__PURE__*/jsx(\"code\", {\n                  children: formatAddress(walletAddress)\n                })]\n              }), /*#__PURE__*/jsx(LoaderIcon, {\n                size: 32\n              }), /*#__PURE__*/jsx(\"p\", {\n                children: msg.signing\n              }), /*#__PURE__*/jsx(\"span\", {\n                className: \"did-signing-hint\",\n                children: msg.securityNote\n              })]\n            })]\n          }), loginType === 'did' && step === 'connect' && /*#__PURE__*/jsx(\"div\", {\n            className: \"did-page-login-step\",\n            children: /*#__PURE__*/jsxs(\"form\", {\n              onSubmit: handleDIDLogin,\n              className: \"did-page-login-form\",\n              children: [/*#__PURE__*/jsxs(\"div\", {\n                className: \"did-form-group\",\n                children: [/*#__PURE__*/jsx(\"label\", {\n                  htmlFor: \"did\",\n                  children: language === 'zh' ? 'DID 标识符' : 'DID Identifier'\n                }), /*#__PURE__*/jsx(\"input\", {\n                  type: \"text\",\n                  id: \"did\",\n                  value: formData.did,\n                  onChange: e => setFormData({\n                    ...formData,\n                    did: e.target.value\n                  }),\n                  placeholder: \"did:qbit:0x...\",\n                  required: true\n                })]\n              }), /*#__PURE__*/jsxs(\"div\", {\n                className: \"did-form-group\",\n                children: [/*#__PURE__*/jsx(\"label\", {\n                  htmlFor: \"password\",\n                  children: language === 'zh' ? '密码' : 'Password'\n                }), /*#__PURE__*/jsxs(\"div\", {\n                  className: \"did-password-input\",\n                  children: [/*#__PURE__*/jsx(\"input\", {\n                    type: showPassword ? 'text' : 'password',\n                    id: \"password\",\n                    value: formData.password,\n                    onChange: e => setFormData({\n                      ...formData,\n                      password: e.target.value\n                    }),\n                    placeholder: \"\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\",\n                    required: true\n                  }), /*#__PURE__*/jsx(\"button\", {\n                    type: \"button\",\n                    className: \"did-toggle-password\",\n                    onClick: () => setShowPassword(!showPassword),\n                    children: showPassword ? /*#__PURE__*/jsx(EyeOffIcon, {\n                      size: 18\n                    }) : /*#__PURE__*/jsx(EyeIcon, {\n                      size: 18\n                    })\n                  })]\n                })]\n              }), /*#__PURE__*/jsxs(\"button\", {\n                type: \"submit\",\n                className: \"did-connect-btn\",\n                children: [/*#__PURE__*/jsx(LockIcon, {\n                  size: 20\n                }), msg.loginButton, /*#__PURE__*/jsx(ArrowRightIcon, {\n                  size: 20\n                })]\n              })]\n            })\n          }), loginType === 'did' && step === 'signing' && /*#__PURE__*/jsxs(\"div\", {\n            className: \"did-page-login-step did-loading-step\",\n            children: [/*#__PURE__*/jsx(LoaderIcon, {\n              size: 48\n            }), /*#__PURE__*/jsx(\"p\", {\n              children: msg.verifying\n            })]\n          }), step === 'success' && /*#__PURE__*/jsxs(\"div\", {\n            className: \"did-page-login-step did-success-step\",\n            children: [/*#__PURE__*/jsx(\"div\", {\n              className: \"did-success-icon\",\n              children: /*#__PURE__*/jsx(CheckIcon, {\n                size: 32\n              })\n            }), /*#__PURE__*/jsx(\"p\", {\n              children: msg.success\n            }), /*#__PURE__*/jsx(\"span\", {\n              children: msg.redirecting\n            })]\n          }), error && /*#__PURE__*/jsxs(\"div\", {\n            className: \"did-page-login-error\",\n            children: [/*#__PURE__*/jsx(AlertIcon, {\n              size: 18\n            }), /*#__PURE__*/jsx(\"span\", {\n              children: error\n            })]\n          })]\n        }), /*#__PURE__*/jsxs(\"div\", {\n          className: \"did-page-login-footer\",\n          children: [/*#__PURE__*/jsxs(\"p\", {\n            children: [msg.noAccountYet, /*#__PURE__*/jsx(\"a\", {\n              href: \"/register\",\n              onClick: e => {\n                e.preventDefault();\n                onNavigateToRegister && onNavigateToRegister();\n              },\n              children: msg.register\n            })]\n          }), /*#__PURE__*/jsxs(\"p\", {\n            children: [msg.noWalletYet, /*#__PURE__*/jsx(\"a\", {\n              href: \"https://metamask.io\",\n              target: \"_blank\",\n              rel: \"noopener noreferrer\",\n              children: msg.getWallet\n            })]\n          })]\n        })]\n      }), /*#__PURE__*/jsxs(\"div\", {\n        className: \"did-page-login-features\",\n        children: [/*#__PURE__*/jsxs(\"div\", {\n          className: \"did-feature\",\n          children: [/*#__PURE__*/jsx(ShieldIcon, {\n            size: 20\n          }), /*#__PURE__*/jsx(\"span\", {\n            children: msg.feature1\n          })]\n        }), /*#__PURE__*/jsxs(\"div\", {\n          className: \"did-feature\",\n          children: [/*#__PURE__*/jsx(WalletIcon, {\n            size: 20\n          }), /*#__PURE__*/jsx(\"span\", {\n            children: msg.feature2\n          })]\n        })]\n      })]\n    })]\n  });\n}\n\n/**\n * QuantaBit Auth SDK - 全页面注册组件 (RegisterPage)\n * \n * 独立的全页注册页面，支持：\n * - 钱包注册（自动创建 DID）\n * - 邮箱注册\n * - 精美的深色背景动画\n */\n\nfunction RegisterPage({\n  onSuccess,\n  onNavigateToLogin,\n  onNavigateToHome,\n  apiBaseUrl = '/api/v1',\n  appName = 'QuantaBit',\n  appLogo,\n  language = 'zh',\n  redirectTo = '/dashboard'\n}) {\n  const [registerMethod, setRegisterMethod] = useState('wallet'); // 'wallet' or 'email'\n  const [step, setStep] = useState('connect'); // connect, connecting, creating, success\n  const [walletAddress, setWalletAddress] = useState(null);\n  const [emailForm, setEmailForm] = useState({\n    nickname: '',\n    email: '',\n    password: '',\n    confirmPassword: ''\n  });\n  const [showPassword, setShowPassword] = useState(false);\n  const [emailLoading, setEmailLoading] = useState(false);\n  const [error, setError] = useState(null);\n  const [createdDID, setCreatedDID] = useState(null);\n  const [isSuccess, setIsSuccess] = useState(false);\n  const msg = getMessages$1(language);\n\n  // 配置 API\n  useEffect(() => {\n    if (apiBaseUrl) {\n      authApi.configure({\n        apiBaseUrl\n      });\n    }\n  }, [apiBaseUrl]);\n\n  // 钱包注册\n  const connectAndRegister = useCallback(async () => {\n    setError(null);\n    if (!hasQBitWallet()) {\n      setError(msg.noWallet);\n      return;\n    }\n    try {\n      setStep('connecting');\n      const {\n        address,\n        response\n      } = await loginWithBrowserWallet(authApi, 'quantabit');\n      setWalletAddress(address);\n      setStep('creating');\n      const {\n        access_token,\n        refresh_token,\n        did,\n        user\n      } = response;\n      authApi.setTokens(access_token, refresh_token);\n      setCreatedDID(did);\n      setIsSuccess(true);\n      setTimeout(() => {\n        onSuccess && onSuccess({\n          accessToken: access_token,\n          refreshToken: refresh_token,\n          did,\n          user,\n          isNewUser: true,\n          redirectTo\n        });\n      }, 2500);\n    } catch (err) {\n      console.error('Register error:', err);\n      if (err.code === 4001) {\n        setError(msg.rejected);\n      } else {\n        setError(err.message || msg.errorRegisterFailed);\n      }\n      setStep('connect');\n    }\n  }, [msg, onSuccess, redirectTo]);\n\n  // 邮箱注册\n  const handleEmailRegister = useCallback(async e => {\n    e.preventDefault();\n    if (emailForm.password !== emailForm.confirmPassword) {\n      setError(msg.errorPasswordMismatch);\n      return;\n    }\n    setError(null);\n    setEmailLoading(true);\n    try {\n      const authRes = await authApi.register({\n        displayName: emailForm.nickname,\n        email: emailForm.email,\n        password: emailForm.password\n      });\n      const {\n        access_token,\n        refresh_token,\n        did,\n        user\n      } = authRes.data || authRes;\n      authApi.setTokens(access_token, refresh_token);\n      setCreatedDID(did);\n      setIsSuccess(true);\n      setTimeout(() => {\n        onSuccess && onSuccess({\n          accessToken: access_token,\n          refreshToken: refresh_token,\n          did,\n          user,\n          isNewUser: true,\n          redirectTo\n        });\n      }, 2500);\n    } catch (err) {\n      console.error('Email register error:', err);\n      setError(err.message || msg.errorRegisterFailed);\n      setEmailLoading(false);\n    }\n  }, [emailForm, msg, onSuccess, redirectTo]);\n\n  // 默认 Logo\n  const defaultLogo = /*#__PURE__*/jsxs(\"svg\", {\n    viewBox: \"0 0 40 40\",\n    fill: \"none\",\n    xmlns: \"http://www.w3.org/2000/svg\",\n    children: [/*#__PURE__*/jsx(\"rect\", {\n      width: \"40\",\n      height: \"40\",\n      rx: \"10\",\n      fill: \"url(#register-grad)\"\n    }), /*#__PURE__*/jsx(\"path\", {\n      d: \"M12 20C12 15.5817 15.5817 12 20 12C24.4183 12 28 15.5817 28 20C28 24.4183 24.4183 28 20 28\",\n      stroke: \"white\",\n      strokeWidth: \"2.5\",\n      strokeLinecap: \"round\"\n    }), /*#__PURE__*/jsx(\"circle\", {\n      cx: \"20\",\n      cy: \"20\",\n      r: \"4\",\n      fill: \"white\"\n    }), /*#__PURE__*/jsx(\"defs\", {\n      children: /*#__PURE__*/jsxs(\"linearGradient\", {\n        id: \"register-grad\",\n        x1: \"0\",\n        y1: \"0\",\n        x2: \"40\",\n        y2: \"40\",\n        gradientUnits: \"userSpaceOnUse\",\n        children: [/*#__PURE__*/jsx(\"stop\", {\n          stopColor: \"#6366f1\"\n        }), /*#__PURE__*/jsx(\"stop\", {\n          offset: \"1\",\n          stopColor: \"#a855f7\"\n        })]\n      })\n    })]\n  });\n  return /*#__PURE__*/jsxs(\"div\", {\n    className: \"did-login-page\",\n    children: [/*#__PURE__*/jsxs(\"div\", {\n      className: \"did-login-bg\",\n      children: [/*#__PURE__*/jsx(\"div\", {\n        className: \"did-login-orb did-login-orb-1\"\n      }), /*#__PURE__*/jsx(\"div\", {\n        className: \"did-login-orb did-login-orb-2\"\n      }), /*#__PURE__*/jsx(\"div\", {\n        className: \"did-login-grid\"\n      })]\n    }), /*#__PURE__*/jsxs(\"div\", {\n      className: \"did-login-container\",\n      children: [/*#__PURE__*/jsxs(\"a\", {\n        href: \"/\",\n        className: \"did-login-logo-link\",\n        onClick: e => {\n          e.preventDefault();\n          onNavigateToHome && onNavigateToHome();\n        },\n        children: [/*#__PURE__*/jsx(\"div\", {\n          className: \"did-login-logo-icon\",\n          children: appLogo ? /*#__PURE__*/jsx(\"img\", {\n            src: appLogo,\n            alt: appName\n          }) : defaultLogo\n        }), /*#__PURE__*/jsx(\"span\", {\n          children: appName\n        })]\n      }), /*#__PURE__*/jsxs(\"div\", {\n        className: \"did-page-login-card\",\n        children: [/*#__PURE__*/jsxs(\"div\", {\n          className: \"did-page-login-header\",\n          children: [/*#__PURE__*/jsx(\"h1\", {\n            children: msg.createIdentity\n          }), /*#__PURE__*/jsx(\"p\", {\n            children: msg.chooseMethod\n          })]\n        }), !isSuccess ? /*#__PURE__*/jsxs(Fragment, {\n          children: [/*#__PURE__*/jsxs(\"div\", {\n            className: \"did-page-login-tabs\",\n            children: [/*#__PURE__*/jsxs(\"button\", {\n              className: `did-page-login-tab ${registerMethod === 'wallet' ? 'active' : ''}`,\n              onClick: () => {\n                setRegisterMethod('wallet');\n                setError(null);\n              },\n              children: [/*#__PURE__*/jsx(WalletIcon, {\n                size: 18\n              }), msg.walletMethod]\n            }), /*#__PURE__*/jsxs(\"button\", {\n              className: `did-page-login-tab ${registerMethod === 'email' ? 'active' : ''}`,\n              onClick: () => {\n                setRegisterMethod('email');\n                setError(null);\n              },\n              children: [/*#__PURE__*/jsx(MailIcon, {\n                size: 18\n              }), msg.emailMethod]\n            })]\n          }), /*#__PURE__*/jsxs(\"div\", {\n            className: \"did-page-login-content\",\n            children: [registerMethod === 'wallet' && /*#__PURE__*/jsxs(\"div\", {\n              className: \"did-page-login-step\",\n              children: [step === 'connect' && /*#__PURE__*/jsxs(Fragment, {\n                children: [/*#__PURE__*/jsx(\"div\", {\n                  className: \"did-wallet-icon-wrapper\",\n                  children: /*#__PURE__*/jsx(FingerprintIcon, {\n                    size: 48\n                  })\n                }), /*#__PURE__*/jsx(\"p\", {\n                  className: \"did-step-description\",\n                  children: msg.walletDesc\n                }), /*#__PURE__*/jsxs(\"button\", {\n                  className: \"did-connect-btn\",\n                  onClick: connectAndRegister,\n                  children: [/*#__PURE__*/jsx(WalletIcon, {\n                    size: 20\n                  }), msg.connectWallet, /*#__PURE__*/jsx(ArrowRightIcon, {\n                    size: 20\n                  })]\n                })]\n              }), step === 'connecting' && /*#__PURE__*/jsxs(\"div\", {\n                className: \"did-loading-step\",\n                children: [/*#__PURE__*/jsx(LoaderIcon, {\n                  size: 48\n                }), /*#__PURE__*/jsx(\"p\", {\n                  children: msg.connecting\n                })]\n              }), step === 'creating' && /*#__PURE__*/jsxs(\"div\", {\n                className: \"did-signing-step\",\n                children: [/*#__PURE__*/jsxs(\"div\", {\n                  className: \"did-wallet-address\",\n                  children: [/*#__PURE__*/jsx(WalletIcon, {\n                    size: 20\n                  }), /*#__PURE__*/jsx(\"code\", {\n                    children: formatAddress(walletAddress)\n                  })]\n                }), /*#__PURE__*/jsx(LoaderIcon, {\n                  size: 32\n                }), /*#__PURE__*/jsx(\"p\", {\n                  children: msg.signing\n                })]\n              })]\n            }), registerMethod === 'email' && /*#__PURE__*/jsx(\"div\", {\n              className: \"did-page-login-step\",\n              children: /*#__PURE__*/jsxs(\"form\", {\n                onSubmit: handleEmailRegister,\n                className: \"did-page-login-form\",\n                children: [/*#__PURE__*/jsxs(\"div\", {\n                  className: \"did-form-group\",\n                  children: [/*#__PURE__*/jsx(\"label\", {\n                    children: msg.nickname\n                  }), /*#__PURE__*/jsxs(\"div\", {\n                    className: \"did-input-with-icon\",\n                    children: [/*#__PURE__*/jsx(UserIcon, {\n                      size: 18\n                    }), /*#__PURE__*/jsx(\"input\", {\n                      type: \"text\",\n                      value: emailForm.nickname,\n                      onChange: e => setEmailForm({\n                        ...emailForm,\n                        nickname: e.target.value\n                      }),\n                      placeholder: language === 'zh' ? \"您的显示名称\" : \"Your display name\",\n                      required: true\n                    })]\n                  })]\n                }), /*#__PURE__*/jsxs(\"div\", {\n                  className: \"did-form-group\",\n                  children: [/*#__PURE__*/jsx(\"label\", {\n                    children: msg.email\n                  }), /*#__PURE__*/jsxs(\"div\", {\n                    className: \"did-input-with-icon\",\n                    children: [/*#__PURE__*/jsx(MailIcon, {\n                      size: 18\n                    }), /*#__PURE__*/jsx(\"input\", {\n                      type: \"email\",\n                      value: emailForm.email,\n                      onChange: e => setEmailForm({\n                        ...emailForm,\n                        email: e.target.value\n                      }),\n                      placeholder: \"name@example.com\",\n                      required: true\n                    })]\n                  })]\n                }), /*#__PURE__*/jsxs(\"div\", {\n                  className: \"did-form-group\",\n                  children: [/*#__PURE__*/jsx(\"label\", {\n                    children: msg.password\n                  }), /*#__PURE__*/jsxs(\"div\", {\n                    className: \"did-password-input\",\n                    children: [/*#__PURE__*/jsx(\"input\", {\n                      type: showPassword ? 'text' : 'password',\n                      value: emailForm.password,\n                      onChange: e => setEmailForm({\n                        ...emailForm,\n                        password: e.target.value\n                      }),\n                      placeholder: \"\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\",\n                      required: true,\n                      minLength: 6\n                    }), /*#__PURE__*/jsx(\"button\", {\n                      type: \"button\",\n                      className: \"did-toggle-password\",\n                      onClick: () => setShowPassword(!showPassword),\n                      children: showPassword ? /*#__PURE__*/jsx(EyeOffIcon, {\n                        size: 18\n                      }) : /*#__PURE__*/jsx(EyeIcon, {\n                        size: 18\n                      })\n                    })]\n                  })]\n                }), /*#__PURE__*/jsxs(\"div\", {\n                  className: \"did-form-group\",\n                  children: [/*#__PURE__*/jsx(\"label\", {\n                    children: msg.confirmPassword\n                  }), /*#__PURE__*/jsx(\"div\", {\n                    className: \"did-password-input\",\n                    children: /*#__PURE__*/jsx(\"input\", {\n                      type: showPassword ? 'text' : 'password',\n                      value: emailForm.confirmPassword,\n                      onChange: e => setEmailForm({\n                        ...emailForm,\n                        confirmPassword: e.target.value\n                      }),\n                      placeholder: \"\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\",\n                      required: true\n                    })\n                  })]\n                }), /*#__PURE__*/jsxs(\"div\", {\n                  className: \"did-quantabit-notice\",\n                  children: [/*#__PURE__*/jsx(ZapIcon, {\n                    size: 16\n                  }), /*#__PURE__*/jsx(\"span\", {\n                    children: msg.autoWallet\n                  })]\n                }), /*#__PURE__*/jsxs(\"button\", {\n                  type: \"submit\",\n                  className: \"did-connect-btn\",\n                  disabled: emailLoading,\n                  children: [emailLoading ? /*#__PURE__*/jsx(LoaderIcon, {\n                    size: 20\n                  }) : /*#__PURE__*/jsx(ShieldIcon, {\n                    size: 20\n                  }), msg.createAccount, !emailLoading && /*#__PURE__*/jsx(ArrowRightIcon, {\n                    size: 20\n                  })]\n                })]\n              })\n            }), error && /*#__PURE__*/jsxs(\"div\", {\n              className: \"did-page-login-error\",\n              children: [/*#__PURE__*/jsx(AlertIcon, {\n                size: 18\n              }), /*#__PURE__*/jsx(\"span\", {\n                children: error\n              })]\n            })]\n          })]\n        }) : /*#__PURE__*/jsx(\"div\", {\n          className: \"did-page-login-content\",\n          children: /*#__PURE__*/jsxs(\"div\", {\n            className: \"did-page-login-step did-success-step\",\n            children: [/*#__PURE__*/jsx(\"div\", {\n              className: \"did-success-icon\",\n              children: /*#__PURE__*/jsx(CheckIcon, {\n                size: 32\n              })\n            }), /*#__PURE__*/jsxs(\"h2\", {\n              children: [msg.welcome, \" \", appName]\n            }), /*#__PURE__*/jsx(\"p\", {\n              children: msg.successDesc\n            }), createdDID && /*#__PURE__*/jsxs(\"div\", {\n              className: \"did-created-did-card\",\n              children: [/*#__PURE__*/jsx(\"div\", {\n                className: \"did-label\",\n                children: msg.didIdentifier\n              }), /*#__PURE__*/jsx(\"code\", {\n                className: \"did-value\",\n                children: createdDID\n              })]\n            }), registerMethod === 'email' && /*#__PURE__*/jsxs(\"div\", {\n              className: \"did-wallet-created-notice\",\n              children: [/*#__PURE__*/jsx(ZapIcon, {\n                size: 16,\n                color: \"#f59e0b\"\n              }), /*#__PURE__*/jsx(\"span\", {\n                children: msg.autoWallet\n              })]\n            }), /*#__PURE__*/jsxs(\"div\", {\n              className: \"did-redirect-hint\",\n              children: [/*#__PURE__*/jsx(LoaderIcon, {\n                size: 14\n              }), /*#__PURE__*/jsx(\"span\", {\n                children: msg.redirecting\n              })]\n            })]\n          })\n        }), /*#__PURE__*/jsx(\"div\", {\n          className: \"did-page-login-footer\",\n          children: /*#__PURE__*/jsxs(\"p\", {\n            children: [msg.hasAccount, /*#__PURE__*/jsx(\"a\", {\n              href: \"/login\",\n              onClick: e => {\n                e.preventDefault();\n                onNavigateToLogin && onNavigateToLogin();\n              },\n              children: msg.login\n            })]\n          })\n        })]\n      }), /*#__PURE__*/jsxs(\"div\", {\n        className: \"did-page-login-features\",\n        children: [/*#__PURE__*/jsxs(\"div\", {\n          className: \"did-feature\",\n          children: [/*#__PURE__*/jsx(ShieldIcon, {\n            size: 20\n          }), /*#__PURE__*/jsx(\"span\", {\n            children: msg.feature1\n          })]\n        }), /*#__PURE__*/jsxs(\"div\", {\n          className: \"did-feature\",\n          children: [/*#__PURE__*/jsx(FingerprintIcon, {\n            size: 20\n          }), /*#__PURE__*/jsx(\"span\", {\n            children: msg.feature2\n          })]\n        })]\n      })]\n    })]\n  });\n}\n\n/**\n * QuantaBit Auth SDK - 扁平化暗色全页面登录组件 (FlatDarkLoginPage)\n * \n * 现代扁平化设计风格的全页登录页面，支持：\n * - 钱包登录（MetaMask, WalletConnect 等）\n * - DID 密码登录\n * - 邮箱注册（内置）\n * - 多账户切换\n * - 语言切换\n * \n * 特点：\n * - 深色背景配合网格和光晕效果\n * - 玻璃拟态卡片设计\n * - 流畅的动画过渡\n * - 完全响应式布局\n */\n\nfunction FlatDarkLoginPage({\n  onSuccess,\n  onNavigateToRegister,\n  onNavigateToHome,\n  onLogout,\n  apiBaseUrl = '/api/v1',\n  appName = 'QuantaBit',\n  appLogo,\n  language: initialLanguage,\n  redirectTo = '/dashboard',\n  showRegister = true,\n  showLanguageSwitch = true,\n  currentUser = null,\n  initialMode = 'login',\n  chainType = 'quantabit',\n  showSocialLogin = true,\n  socialProviders = ['apple', 'google', 'microsoft', 'wechat', 'tiktok'],\n  renderSocialLogin\n}) {\n  const [mode, setMode] = useState(initialMode); // login, register, accounts\n  const [loginType, setLoginType] = useState('wallet'); // wallet, did\n  const [step, setStep] = useState('connect'); // connect, connecting, signing, success\n  const [error, setError] = useState(null);\n  const [success, setSuccess] = useState(null);\n  const [walletAddress, setWalletAddress] = useState(null);\n  const [showPassword, setShowPassword] = useState(false);\n  const [showConfirmPassword, setShowConfirmPassword] = useState(false);\n  const [loading, setLoading] = useState(false);\n\n  // 语言状态\n  const [currentLanguage, setCurrentLanguage] = useState(() => {\n    if (initialLanguage) return initialLanguage;\n    return initLanguage();\n  });\n\n  // 表单数据\n  const [formData, setFormData] = useState({\n    did: '',\n    password: '',\n    nickname: '',\n    email: '',\n    confirmPassword: ''\n  });\n\n  // 账户列表\n  const [savedAccounts, setSavedAccounts] = useState([]);\n  const msg = getMessages$1(currentLanguage);\n\n  // 语言切换处理\n  const handleLanguageChange = useCallback(newLang => {\n    setCurrentLanguage(newLang);\n    setLanguage(newLang);\n  }, []);\n\n  // 配置 API\n  useEffect(() => {\n    if (apiBaseUrl) {\n      apiClient.configure({\n        apiBaseUrl\n      });\n    }\n  }, [apiBaseUrl]);\n\n  // 初始化账户列表\n  useEffect(() => {\n    setSavedAccounts(getSavedAccounts());\n\n    // 如果已登录，显示账户管理\n    if (currentUser?.did && initialMode !== 'register') {\n      setMode('accounts');\n    }\n  }, [currentUser, initialMode]);\n\n  // 社交登录成功回调\n  const handleSocialSuccess = useCallback(result => {\n    const {\n      access_token,\n      refresh_token,\n      did,\n      user: resUser,\n      is_new_user\n    } = result;\n    apiClient.setTokens(access_token, refresh_token);\n    setCurrentDID(did);\n    saveAccount({\n      did,\n      displayName: resUser?.display_name || formatDID$1(did),\n      avatar: resUser?.avatar_url || resUser?.avatar,\n      verified: true\n    });\n    setSavedAccounts(getSavedAccounts());\n    setStep('success');\n    setTimeout(() => {\n      onSuccess && onSuccess({\n        success: true,\n        accessToken: access_token,\n        refreshToken: refresh_token,\n        did,\n        user: {\n          nickname: resUser?.display_name || resUser?.name,\n          avatar: resUser?.avatar_url || resUser?.avatar,\n          ...resUser\n        },\n        isNewUser: is_new_user,\n        redirectTo\n      });\n    }, 1200);\n  }, [onSuccess, redirectTo]);\n  const handleSocialError = useCallback(err => {\n    setError(err?.message || '社交登录失败');\n  }, []);\n\n  // 钱包登录\n  const connectWallet = useCallback(async () => {\n    setError(null);\n    if (!hasQBitWallet() && !hasMetaMask()) {\n      setError(msg.noWallet || '未检测到钱包');\n      return;\n    }\n    try {\n      setStep('connecting');\n      const {\n        address,\n        response: result\n      } = await loginWithBrowserWallet(apiClient, chainType);\n      setWalletAddress(address);\n      setStep('signing');\n      const {\n        access_token,\n        refresh_token,\n        did,\n        user,\n        is_new_user\n      } = result;\n      apiClient.setTokens(access_token, refresh_token);\n      setCurrentDID(did);\n\n      // 保存账户\n      saveAccount({\n        did,\n        displayName: user?.nickname || formatAddress(address),\n        avatar: user?.avatar,\n        walletAddress: address,\n        verified: true\n      });\n      setSavedAccounts(getSavedAccounts());\n      setStep('success');\n      setTimeout(() => {\n        onSuccess && onSuccess({\n          success: true,\n          accessToken: access_token,\n          refreshToken: refresh_token,\n          did,\n          user,\n          isNewUser: is_new_user,\n          redirectTo\n        });\n      }, 1200);\n    } catch (err) {\n      console.error('Login error:', err);\n      if (err.code === 4001) {\n        setError(msg.rejected || '用户拒绝了签名');\n      } else {\n        setError(err.message || msg.errorLoginFailed || '登录失败');\n      }\n      setStep('connect');\n    }\n  }, [chainType, msg, onSuccess, redirectTo]);\n\n  // DID 登录\n  const handleDIDLogin = useCallback(async e => {\n    e.preventDefault();\n    setError(null);\n    if (!formData.did.trim() || !formData.password) {\n      setError(currentLanguage === 'zh' ? '请输入 DID 和密码' : 'Please enter DID and password');\n      return;\n    }\n    try {\n      setLoading(true);\n      setStep('signing');\n      const authRes = await apiClient.didLogin(formData.did, formData.password);\n      const {\n        access_token,\n        refresh_token,\n        did,\n        user\n      } = authRes.data || authRes;\n      apiClient.setTokens(access_token, refresh_token);\n      setCurrentDID(did);\n\n      // 保存账户\n      saveAccount({\n        did,\n        displayName: user?.nickname || formatDID$1(did),\n        avatar: user?.avatar,\n        verified: true\n      });\n      setSavedAccounts(getSavedAccounts());\n      setStep('success');\n      setTimeout(() => {\n        onSuccess && onSuccess({\n          success: true,\n          accessToken: access_token,\n          refreshToken: refresh_token,\n          did,\n          user,\n          isNewUser: false,\n          redirectTo\n        });\n      }, 1200);\n    } catch (err) {\n      console.error('DID Login error:', err);\n      setError(err.message || msg.errorLoginFailed || '登录失败');\n      setStep('connect');\n    } finally {\n      setLoading(false);\n    }\n  }, [formData, currentLanguage, msg, onSuccess, redirectTo]);\n\n  // 注册\n  const handleRegister = useCallback(async e => {\n    e.preventDefault();\n    setError(null);\n\n    // 验证\n    if (!formData.nickname.trim()) {\n      setError(currentLanguage === 'zh' ? '请输入昵称' : 'Please enter nickname');\n      return;\n    }\n    if (!formData.password) {\n      setError(currentLanguage === 'zh' ? '请输入密码' : 'Please enter password');\n      return;\n    }\n    if (formData.password !== formData.confirmPassword) {\n      setError(msg.errorPasswordMismatch || '两次密码不一致');\n      return;\n    }\n    if (formData.password.length < 6) {\n      setError(currentLanguage === 'zh' ? '密码至少6位' : 'Password must be at least 6 characters');\n      return;\n    }\n    try {\n      setLoading(true);\n      const authRes = await apiClient.register({\n        displayName: formData.nickname.trim(),\n        email: formData.email || undefined,\n        password: formData.password\n      });\n      const {\n        access_token,\n        refresh_token,\n        did,\n        user\n      } = authRes.data || authRes;\n      apiClient.setTokens(access_token, refresh_token);\n      setCurrentDID(did);\n\n      // 保存账户\n      saveAccount({\n        did,\n        displayName: formData.nickname.trim(),\n        verified: true\n      });\n      setSavedAccounts(getSavedAccounts());\n      setSuccess(currentLanguage === 'zh' ? '注册成功！' : 'Registration successful!');\n      setTimeout(() => {\n        onSuccess && onSuccess({\n          success: true,\n          accessToken: access_token,\n          refreshToken: refresh_token,\n          did,\n          user,\n          isNewUser: true,\n          redirectTo\n        });\n      }, 1200);\n    } catch (err) {\n      console.error('Register error:', err);\n      setError(err.message || msg.errorRegisterFailed || '注册失败');\n    } finally {\n      setLoading(false);\n    }\n  }, [formData, currentLanguage, msg, onSuccess, redirectTo]);\n\n  // 快速登录\n  const handleQuickLogin = useCallback(account => {\n    setFormData(prev => ({\n      ...prev,\n      did: account.did\n    }));\n    setMode('login');\n    setLoginType('did');\n    setTimeout(() => {\n      document.getElementById('flat-password')?.focus();\n    }, 100);\n  }, []);\n\n  // 移除账户\n  const handleRemoveAccount = useCallback((did, e) => {\n    e.stopPropagation();\n    if (window.confirm(msg.removeConfirm || '确定移除此账户？')) {\n      removeAccount(did);\n      setSavedAccounts(getSavedAccounts());\n    }\n  }, [msg]);\n\n  // 登出\n  const handleLogout = useCallback(() => {\n    clearCurrentSession();\n    setMode('login');\n    onLogout && onLogout();\n  }, [onLogout]);\n\n  // 切换到注册\n  const goToRegister = useCallback(() => {\n    if (onNavigateToRegister) {\n      onNavigateToRegister();\n    } else {\n      setMode('register');\n      setError(null);\n      setFormData({\n        did: '',\n        password: '',\n        nickname: '',\n        email: '',\n        confirmPassword: ''\n      });\n    }\n  }, [onNavigateToRegister]);\n\n  // 默认 Logo\n  const defaultLogo = /*#__PURE__*/jsxs(\"svg\", {\n    viewBox: \"0 0 40 40\",\n    fill: \"none\",\n    xmlns: \"http://www.w3.org/2000/svg\",\n    children: [/*#__PURE__*/jsx(\"rect\", {\n      width: \"40\",\n      height: \"40\",\n      rx: \"10\",\n      fill: \"url(#flat-page-grad)\"\n    }), /*#__PURE__*/jsx(\"path\", {\n      d: \"M12 20C12 15.5817 15.5817 12 20 12C24.4183 12 28 15.5817 28 20C28 24.4183 24.4183 28 20 28\",\n      stroke: \"white\",\n      strokeWidth: \"2.5\",\n      strokeLinecap: \"round\"\n    }), /*#__PURE__*/jsx(\"circle\", {\n      cx: \"20\",\n      cy: \"20\",\n      r: \"4\",\n      fill: \"white\"\n    }), /*#__PURE__*/jsx(\"defs\", {\n      children: /*#__PURE__*/jsxs(\"linearGradient\", {\n        id: \"flat-page-grad\",\n        x1: \"0\",\n        y1: \"0\",\n        x2: \"40\",\n        y2: \"40\",\n        gradientUnits: \"userSpaceOnUse\",\n        children: [/*#__PURE__*/jsx(\"stop\", {\n          stopColor: \"#6366f1\"\n        }), /*#__PURE__*/jsx(\"stop\", {\n          offset: \"1\",\n          stopColor: \"#a855f7\"\n        })]\n      })\n    })]\n  });\n  const otherAccounts = savedAccounts.filter(a => a.did !== currentUser?.did);\n\n  // 渲染账户管理视图\n  const renderAccountsView = () => /*#__PURE__*/jsxs(\"div\", {\n    className: \"flat-accounts-view\",\n    children: [/*#__PURE__*/jsxs(\"div\", {\n      className: \"flat-accounts-header\",\n      children: [/*#__PURE__*/jsxs(\"button\", {\n        className: \"flat-back-btn\",\n        onClick: () => setMode('login'),\n        children: [\"\\u2190 \", msg.back || '返回']\n      }), /*#__PURE__*/jsxs(\"h3\", {\n        children: [/*#__PURE__*/jsx(SwapIcon, {\n          size: 18\n        }), \" \", msg.accountsSection || '账户管理']\n      })]\n    }), currentUser?.did && /*#__PURE__*/jsxs(\"div\", {\n      className: \"flat-current-account\",\n      children: [/*#__PURE__*/jsx(\"p\", {\n        className: \"flat-section-label\",\n        children: msg.currentAccount || '当前账户'\n      }), /*#__PURE__*/jsxs(\"div\", {\n        className: \"flat-account-card current\",\n        children: [/*#__PURE__*/jsx(\"div\", {\n          className: \"flat-account-avatar\",\n          children: currentUser.avatar ? /*#__PURE__*/jsx(\"img\", {\n            src: currentUser.avatar,\n            alt: \"\"\n          }) : /*#__PURE__*/jsx(\"span\", {\n            children: \"\\uD83D\\uDD10\"\n          })\n        }), /*#__PURE__*/jsxs(\"div\", {\n          className: \"flat-account-info\",\n          children: [/*#__PURE__*/jsxs(\"span\", {\n            className: \"flat-account-name\",\n            children: [currentUser.nickname || currentUser.displayName || formatDID$1(currentUser.did), /*#__PURE__*/jsx(VerifiedIcon, {\n              size: 14\n            })]\n          }), /*#__PURE__*/jsx(\"span\", {\n            className: \"flat-account-did\",\n            children: formatDID$1(currentUser.did)\n          })]\n        }), /*#__PURE__*/jsx(\"button\", {\n          className: \"flat-logout-btn\",\n          onClick: handleLogout,\n          title: msg.logout,\n          children: /*#__PURE__*/jsx(LogoutIcon, {\n            size: 18\n          })\n        })]\n      })]\n    }), /*#__PURE__*/jsxs(\"button\", {\n      className: \"flat-add-account-btn\",\n      onClick: () => setMode('login'),\n      children: [\"+ \", msg.addNewAccount || '添加新账户']\n    }), otherAccounts.length > 0 && /*#__PURE__*/jsxs(\"div\", {\n      className: \"flat-other-accounts\",\n      children: [/*#__PURE__*/jsx(\"p\", {\n        className: \"flat-section-label\",\n        children: msg.otherAccounts || '其他账户'\n      }), otherAccounts.map(account => /*#__PURE__*/jsxs(\"div\", {\n        className: \"flat-account-card\",\n        onClick: () => handleQuickLogin(account),\n        children: [/*#__PURE__*/jsx(\"div\", {\n          className: \"flat-account-avatar\",\n          children: account.avatar ? /*#__PURE__*/jsx(\"img\", {\n            src: account.avatar,\n            alt: \"\"\n          }) : /*#__PURE__*/jsx(\"span\", {\n            children: \"\\uD83D\\uDD10\"\n          })\n        }), /*#__PURE__*/jsxs(\"div\", {\n          className: \"flat-account-info\",\n          children: [/*#__PURE__*/jsxs(\"span\", {\n            className: \"flat-account-name\",\n            children: [account.displayName || formatDID$1(account.did), account.verified && /*#__PURE__*/jsx(VerifiedIcon, {\n              size: 14\n            })]\n          }), /*#__PURE__*/jsx(\"span\", {\n            className: \"flat-account-did\",\n            children: formatDID$1(account.did)\n          })]\n        }), /*#__PURE__*/jsx(\"button\", {\n          className: \"flat-switch-btn\",\n          children: msg.switchAccount || '切换'\n        }), /*#__PURE__*/jsx(\"button\", {\n          className: \"flat-remove-btn\",\n          onClick: e => handleRemoveAccount(account.did, e),\n          title: msg.removeAccount || '移除',\n          children: /*#__PURE__*/jsx(TrashIcon, {\n            size: 16\n          })\n        })]\n      }, account.did))]\n    }), otherAccounts.length === 0 && !currentUser?.did && /*#__PURE__*/jsx(\"p\", {\n      className: \"flat-no-accounts\",\n      children: msg.noOtherAccounts || '没有其他账户'\n    })]\n  });\n\n  // 渲染注册视图\n  const renderRegisterView = () => /*#__PURE__*/jsx(\"div\", {\n    className: \"flat-page-login-step\",\n    children: /*#__PURE__*/jsxs(\"form\", {\n      onSubmit: handleRegister,\n      className: \"flat-page-login-form\",\n      children: [/*#__PURE__*/jsxs(\"div\", {\n        className: \"flat-form-group\",\n        children: [/*#__PURE__*/jsxs(\"label\", {\n          htmlFor: \"flat-nickname\",\n          children: [msg.nickname || '昵称', \" *\"]\n        }), /*#__PURE__*/jsx(\"input\", {\n          type: \"text\",\n          id: \"flat-nickname\",\n          value: formData.nickname,\n          onChange: e => setFormData({\n            ...formData,\n            nickname: e.target.value\n          }),\n          placeholder: currentLanguage === 'zh' ? '请输入昵称' : 'Enter nickname',\n          required: true,\n          disabled: loading\n        })]\n      }), /*#__PURE__*/jsxs(\"div\", {\n        className: \"flat-form-group\",\n        children: [/*#__PURE__*/jsxs(\"label\", {\n          htmlFor: \"flat-email\",\n          children: [msg.email || '邮箱', \" (\", currentLanguage === 'zh' ? '可选' : 'optional', \")\"]\n        }), /*#__PURE__*/jsx(\"input\", {\n          type: \"email\",\n          id: \"flat-email\",\n          value: formData.email,\n          onChange: e => setFormData({\n            ...formData,\n            email: e.target.value\n          }),\n          placeholder: \"user@example.com\",\n          disabled: loading\n        })]\n      }), /*#__PURE__*/jsxs(\"div\", {\n        className: \"flat-form-group\",\n        children: [/*#__PURE__*/jsxs(\"label\", {\n          htmlFor: \"flat-reg-password\",\n          children: [msg.password || '密码', \" *\"]\n        }), /*#__PURE__*/jsxs(\"div\", {\n          className: \"flat-password-input\",\n          children: [/*#__PURE__*/jsx(\"input\", {\n            type: showPassword ? 'text' : 'password',\n            id: \"flat-reg-password\",\n            value: formData.password,\n            onChange: e => setFormData({\n              ...formData,\n              password: e.target.value\n            }),\n            placeholder: \"\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\",\n            required: true,\n            disabled: loading\n          }), /*#__PURE__*/jsx(\"button\", {\n            type: \"button\",\n            className: \"flat-toggle-password\",\n            onClick: () => setShowPassword(!showPassword),\n            children: showPassword ? /*#__PURE__*/jsx(EyeOffIcon, {\n              size: 18\n            }) : /*#__PURE__*/jsx(EyeIcon, {\n              size: 18\n            })\n          })]\n        })]\n      }), /*#__PURE__*/jsxs(\"div\", {\n        className: \"flat-form-group\",\n        children: [/*#__PURE__*/jsxs(\"label\", {\n          htmlFor: \"flat-confirm-password\",\n          children: [msg.confirmPassword || '确认密码', \" *\"]\n        }), /*#__PURE__*/jsxs(\"div\", {\n          className: \"flat-password-input\",\n          children: [/*#__PURE__*/jsx(\"input\", {\n            type: showConfirmPassword ? 'text' : 'password',\n            id: \"flat-confirm-password\",\n            value: formData.confirmPassword,\n            onChange: e => setFormData({\n              ...formData,\n              confirmPassword: e.target.value\n            }),\n            placeholder: \"\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\",\n            required: true,\n            disabled: loading\n          }), /*#__PURE__*/jsx(\"button\", {\n            type: \"button\",\n            className: \"flat-toggle-password\",\n            onClick: () => setShowConfirmPassword(!showConfirmPassword),\n            children: showConfirmPassword ? /*#__PURE__*/jsx(EyeOffIcon, {\n              size: 18\n            }) : /*#__PURE__*/jsx(EyeIcon, {\n              size: 18\n            })\n          })]\n        })]\n      }), /*#__PURE__*/jsxs(\"button\", {\n        type: \"submit\",\n        className: \"flat-connect-btn\",\n        disabled: loading,\n        children: [loading ? /*#__PURE__*/jsx(LoaderIcon, {\n          size: 20\n        }) : /*#__PURE__*/jsx(ShieldIcon, {\n          size: 20\n        }), loading ? msg.registering || '注册中...' : msg.registerButton || '创建身份', !loading && /*#__PURE__*/jsx(ArrowRightIcon, {\n          size: 20\n        })]\n      })]\n    })\n  });\n  return /*#__PURE__*/jsxs(\"div\", {\n    className: \"flat-dark-login-page\",\n    children: [/*#__PURE__*/jsxs(\"div\", {\n      className: \"flat-login-bg\",\n      children: [/*#__PURE__*/jsx(\"div\", {\n        className: \"flat-login-orb flat-login-orb-1\"\n      }), /*#__PURE__*/jsx(\"div\", {\n        className: \"flat-login-orb flat-login-orb-2\"\n      }), /*#__PURE__*/jsx(\"div\", {\n        className: \"flat-login-grid\"\n      })]\n    }), showLanguageSwitch && /*#__PURE__*/jsx(\"div\", {\n      className: \"flat-login-language\",\n      children: /*#__PURE__*/jsx(LanguageSwitcher, {\n        currentLanguage: currentLanguage,\n        onLanguageChange: handleLanguageChange,\n        variant: \"dark\",\n        showFlag: true,\n        showName: false\n      })\n    }), /*#__PURE__*/jsxs(\"div\", {\n      className: \"flat-login-container\",\n      children: [/*#__PURE__*/jsxs(\"a\", {\n        href: \"/\",\n        className: \"flat-login-logo-link\",\n        onClick: e => {\n          e.preventDefault();\n          onNavigateToHome && onNavigateToHome();\n        },\n        children: [/*#__PURE__*/jsx(\"div\", {\n          className: \"flat-login-logo-icon\",\n          children: appLogo ? /*#__PURE__*/jsx(\"img\", {\n            src: appLogo,\n            alt: appName\n          }) : defaultLogo\n        }), /*#__PURE__*/jsx(\"span\", {\n          children: appName\n        })]\n      }), /*#__PURE__*/jsxs(\"div\", {\n        className: \"flat-page-login-card\",\n        children: [/*#__PURE__*/jsxs(\"div\", {\n          className: \"flat-page-login-header\",\n          children: [/*#__PURE__*/jsx(\"h1\", {\n            children: mode === 'register' ? msg.registerSection || '创建数字身份' : mode === 'accounts' ? msg.accountsSection || '账户管理' : currentLanguage === 'zh' ? '登录' : 'Login'\n          }), /*#__PURE__*/jsx(\"p\", {\n            children: mode === 'register' ? msg.chooseMethod || '选择您的注册方式，开启去中心化之旅' : msg.subtitle\n          })]\n        }), mode === 'accounts' ? /*#__PURE__*/jsx(\"div\", {\n          className: \"flat-page-login-content\",\n          children: renderAccountsView()\n        }) : mode === 'register' ? /*#__PURE__*/jsxs(Fragment, {\n          children: [/*#__PURE__*/jsxs(\"div\", {\n            className: \"flat-page-login-content\",\n            children: [success ? /*#__PURE__*/jsxs(\"div\", {\n              className: \"flat-page-login-step flat-success-step\",\n              children: [/*#__PURE__*/jsx(\"div\", {\n                className: \"flat-success-icon\",\n                children: /*#__PURE__*/jsx(CheckIcon, {\n                  size: 32\n                })\n              }), /*#__PURE__*/jsx(\"p\", {\n                children: success\n              }), /*#__PURE__*/jsx(\"span\", {\n                children: msg.redirecting || '正在跳转...'\n              })]\n            }) : renderRegisterView(), error && /*#__PURE__*/jsxs(\"div\", {\n              className: \"flat-page-login-error\",\n              children: [/*#__PURE__*/jsx(AlertIcon, {\n                size: 18\n              }), /*#__PURE__*/jsx(\"span\", {\n                children: error\n              })]\n            })]\n          }), /*#__PURE__*/jsx(\"div\", {\n            className: \"flat-page-login-footer\",\n            children: /*#__PURE__*/jsxs(\"p\", {\n              children: [msg.alreadyHaveDID || '已有账号？', /*#__PURE__*/jsx(\"button\", {\n                onClick: () => {\n                  setMode('login');\n                  setError(null);\n                },\n                children: msg.goLogin || '去登录'\n              })]\n            })\n          })]\n        }) : /*#__PURE__*/jsxs(Fragment, {\n          children: [/*#__PURE__*/jsxs(\"div\", {\n            className: \"flat-page-login-tabs\",\n            children: [/*#__PURE__*/jsxs(\"button\", {\n              className: `flat-page-login-tab ${loginType === 'wallet' ? 'active' : ''}`,\n              onClick: () => {\n                setLoginType('wallet');\n                setError(null);\n                setStep('connect');\n              },\n              children: [/*#__PURE__*/jsx(WalletIcon, {\n                size: 18\n              }), msg.walletSection || '钱包登录']\n            }), /*#__PURE__*/jsxs(\"button\", {\n              className: `flat-page-login-tab ${loginType === 'did' ? 'active' : ''}`,\n              onClick: () => {\n                setLoginType('did');\n                setError(null);\n                setStep('connect');\n              },\n              children: [/*#__PURE__*/jsx(MailIcon, {\n                size: 18\n              }), msg.didSection || 'DID 登录']\n            })]\n          }), /*#__PURE__*/jsxs(\"div\", {\n            className: \"flat-page-login-content\",\n            children: [loginType === 'wallet' && /*#__PURE__*/jsxs(Fragment, {\n              children: [step === 'connect' && /*#__PURE__*/jsxs(\"div\", {\n                className: \"flat-page-login-step\",\n                children: [/*#__PURE__*/jsx(\"div\", {\n                  className: \"flat-wallet-icon-wrapper\",\n                  children: /*#__PURE__*/jsx(WalletIcon, {\n                    size: 48\n                  })\n                }), /*#__PURE__*/jsx(\"p\", {\n                  className: \"flat-step-description\",\n                  children: msg.connectDescription || '连接您的 Web3 钱包，安全验证您的去中心化身份'\n                }), /*#__PURE__*/jsxs(\"button\", {\n                  className: \"flat-connect-btn\",\n                  onClick: connectWallet,\n                  children: [/*#__PURE__*/jsx(WalletIcon, {\n                    size: 20\n                  }), msg.connectWallet || '连接钱包', /*#__PURE__*/jsx(ArrowRightIcon, {\n                    size: 20\n                  })]\n                }), /*#__PURE__*/jsxs(\"div\", {\n                  className: \"flat-supported-wallets\",\n                  children: [/*#__PURE__*/jsx(\"span\", {\n                    children: msg.supportedWallets || '支持的钱包'\n                  }), /*#__PURE__*/jsxs(\"div\", {\n                    className: \"flat-wallet-logos\",\n                    children: [/*#__PURE__*/jsx(\"img\", {\n                      src: \"https://metamask.io/images/metamask-fox.svg\",\n                      alt: \"MetaMask\"\n                    }), /*#__PURE__*/jsx(\"img\", {\n                      src: \"https://avatars.githubusercontent.com/u/18060234\",\n                      alt: \"WalletConnect\"\n                    }), /*#__PURE__*/jsx(\"img\", {\n                      src: \"https://avatars.githubusercontent.com/u/43919302\",\n                      alt: \"Coinbase\"\n                    })]\n                  })]\n                })]\n              }), step === 'connecting' && /*#__PURE__*/jsxs(\"div\", {\n                className: \"flat-page-login-step flat-loading-step\",\n                children: [/*#__PURE__*/jsx(LoaderIcon, {\n                  size: 48\n                }), /*#__PURE__*/jsx(\"p\", {\n                  children: msg.connecting || '正在连接...'\n                })]\n              }), step === 'signing' && /*#__PURE__*/jsxs(\"div\", {\n                className: \"flat-page-login-step flat-signing-step\",\n                children: [/*#__PURE__*/jsxs(\"div\", {\n                  className: \"flat-wallet-address\",\n                  children: [/*#__PURE__*/jsx(ShieldIcon, {\n                    size: 20\n                  }), /*#__PURE__*/jsx(\"code\", {\n                    children: formatAddress(walletAddress)\n                  })]\n                }), /*#__PURE__*/jsx(LoaderIcon, {\n                  size: 32\n                }), /*#__PURE__*/jsx(\"p\", {\n                  children: msg.signing || '请在钱包中签名...'\n                }), /*#__PURE__*/jsx(\"span\", {\n                  className: \"flat-signing-hint\",\n                  children: msg.securityNote || '请确认在您的钱包中签名'\n                })]\n              })]\n            }), loginType === 'did' && step === 'connect' && /*#__PURE__*/jsxs(\"div\", {\n              className: \"flat-page-login-step\",\n              children: [savedAccounts.length > 0 && /*#__PURE__*/jsxs(\"div\", {\n                className: \"flat-saved-accounts\",\n                children: [/*#__PURE__*/jsx(\"p\", {\n                  className: \"flat-saved-label\",\n                  children: msg.savedAccounts || '已保存账户'\n                }), savedAccounts.slice(0, 3).map(account => /*#__PURE__*/jsxs(\"button\", {\n                  className: \"flat-saved-account\",\n                  onClick: () => handleQuickLogin(account),\n                  children: [/*#__PURE__*/jsx(\"div\", {\n                    className: \"flat-saved-avatar\",\n                    children: account.avatar ? /*#__PURE__*/jsx(\"img\", {\n                      src: account.avatar,\n                      alt: \"\"\n                    }) : /*#__PURE__*/jsx(\"span\", {\n                      children: \"\\uD83D\\uDD10\"\n                    })\n                  }), /*#__PURE__*/jsxs(\"div\", {\n                    className: \"flat-saved-info\",\n                    children: [/*#__PURE__*/jsx(\"span\", {\n                      className: \"flat-saved-name\",\n                      children: account.displayName || formatDID$1(account.did)\n                    }), /*#__PURE__*/jsx(\"span\", {\n                      className: \"flat-saved-did\",\n                      children: formatDID$1(account.did)\n                    })]\n                  }), /*#__PURE__*/jsx(\"span\", {\n                    className: \"flat-quick-label\",\n                    children: msg.quickLogin || '快速登录'\n                  })]\n                }, account.did))]\n              }), /*#__PURE__*/jsxs(\"form\", {\n                onSubmit: handleDIDLogin,\n                className: \"flat-page-login-form\",\n                children: [/*#__PURE__*/jsxs(\"div\", {\n                  className: \"flat-form-group\",\n                  children: [/*#__PURE__*/jsx(\"label\", {\n                    htmlFor: \"flat-did\",\n                    children: currentLanguage === 'zh' ? 'DID 标识符' : 'DID Identifier'\n                  }), /*#__PURE__*/jsx(\"input\", {\n                    type: \"text\",\n                    id: \"flat-did\",\n                    value: formData.did,\n                    onChange: e => setFormData({\n                      ...formData,\n                      did: e.target.value\n                    }),\n                    placeholder: \"did:qbit:0x...\",\n                    required: true,\n                    disabled: loading\n                  })]\n                }), /*#__PURE__*/jsxs(\"div\", {\n                  className: \"flat-form-group\",\n                  children: [/*#__PURE__*/jsx(\"label\", {\n                    htmlFor: \"flat-password\",\n                    children: currentLanguage === 'zh' ? '密码' : 'Password'\n                  }), /*#__PURE__*/jsxs(\"div\", {\n                    className: \"flat-password-input\",\n                    children: [/*#__PURE__*/jsx(\"input\", {\n                      type: showPassword ? 'text' : 'password',\n                      id: \"flat-password\",\n                      value: formData.password,\n                      onChange: e => setFormData({\n                        ...formData,\n                        password: e.target.value\n                      }),\n                      placeholder: \"\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\",\n                      required: true,\n                      disabled: loading\n                    }), /*#__PURE__*/jsx(\"button\", {\n                      type: \"button\",\n                      className: \"flat-toggle-password\",\n                      onClick: () => setShowPassword(!showPassword),\n                      children: showPassword ? /*#__PURE__*/jsx(EyeOffIcon, {\n                        size: 18\n                      }) : /*#__PURE__*/jsx(EyeIcon, {\n                        size: 18\n                      })\n                    })]\n                  })]\n                }), /*#__PURE__*/jsxs(\"button\", {\n                  type: \"submit\",\n                  className: \"flat-connect-btn\",\n                  disabled: loading,\n                  children: [loading ? /*#__PURE__*/jsx(LoaderIcon, {\n                    size: 20\n                  }) : /*#__PURE__*/jsx(LockIcon, {\n                    size: 20\n                  }), loading ? msg.loggingIn || '登录中...' : msg.loginButton || '安全登录', !loading && /*#__PURE__*/jsx(ArrowRightIcon, {\n                    size: 20\n                  })]\n                })]\n              })]\n            }), loginType === 'did' && step === 'signing' && /*#__PURE__*/jsxs(\"div\", {\n              className: \"flat-page-login-step flat-loading-step\",\n              children: [/*#__PURE__*/jsx(LoaderIcon, {\n                size: 48\n              }), /*#__PURE__*/jsx(\"p\", {\n                children: msg.verifying || '验证中...'\n              })]\n            }), step === 'success' && /*#__PURE__*/jsxs(\"div\", {\n              className: \"flat-page-login-step flat-success-step\",\n              children: [/*#__PURE__*/jsx(\"div\", {\n                className: \"flat-success-icon\",\n                children: /*#__PURE__*/jsx(CheckIcon, {\n                  size: 32\n                })\n              }), /*#__PURE__*/jsx(\"p\", {\n                children: msg.success || '登录成功'\n              }), /*#__PURE__*/jsx(\"span\", {\n                children: msg.redirecting || '正在跳转...'\n              })]\n            }), error && /*#__PURE__*/jsxs(\"div\", {\n              className: \"flat-page-login-error\",\n              children: [/*#__PURE__*/jsx(AlertIcon, {\n                size: 18\n              }), /*#__PURE__*/jsx(\"span\", {\n                children: error\n              })]\n            })]\n          }), showSocialLogin && /*#__PURE__*/jsxs(\"div\", {\n            className: \"flat-page-social-login\",\n            style: {\n              margin: '15px 0',\n              display: 'flex',\n              flexDirection: 'column',\n              alignItems: 'center',\n              width: '100%'\n            },\n            children: [/*#__PURE__*/jsxs(\"div\", {\n              className: \"flat-social-divider\",\n              style: {\n                width: '100%',\n                display: 'flex',\n                alignItems: 'center',\n                margin: '10px 0 15px 0',\n                color: '#6b7280',\n                fontSize: '13px'\n              },\n              children: [/*#__PURE__*/jsx(\"div\", {\n                style: {\n                  flex: 1,\n                  height: '1px',\n                  backgroundColor: 'rgba(255,255,255,0.08)'\n                }\n              }), /*#__PURE__*/jsx(\"span\", {\n                style: {\n                  padding: '0 10px'\n                },\n                children: msg.orDivider || '或'\n              }), /*#__PURE__*/jsx(\"div\", {\n                style: {\n                  flex: 1,\n                  height: '1px',\n                  backgroundColor: 'rgba(255,255,255,0.08)'\n                }\n              })]\n            }), renderSocialLogin ? typeof renderSocialLogin === 'function' ? renderSocialLogin() : renderSocialLogin : /*#__PURE__*/jsx(OAuthIconGroup, {\n              providers: socialProviders,\n              onSuccess: handleSocialSuccess,\n              onError: handleSocialError\n            })]\n          }), /*#__PURE__*/jsxs(\"div\", {\n            className: \"flat-page-login-footer\",\n            children: [showRegister && /*#__PURE__*/jsxs(\"p\", {\n              children: [msg.noAccountYet || '还没有账号？', /*#__PURE__*/jsx(\"button\", {\n                onClick: goToRegister,\n                children: msg.register || '注册'\n              })]\n            }), /*#__PURE__*/jsxs(\"p\", {\n              children: [msg.noWalletYet || '还没有钱包？', /*#__PURE__*/jsx(\"a\", {\n                href: \"https://metamask.io\",\n                target: \"_blank\",\n                rel: \"noopener noreferrer\",\n                children: msg.getWallet || '获取一个'\n              })]\n            })]\n          })]\n        })]\n      }), /*#__PURE__*/jsxs(\"div\", {\n        className: \"flat-page-login-features\",\n        children: [/*#__PURE__*/jsxs(\"div\", {\n          className: \"flat-feature\",\n          children: [/*#__PURE__*/jsx(ShieldIcon, {\n            size: 20\n          }), /*#__PURE__*/jsx(\"span\", {\n            children: msg.feature1 || '数据完全自主掌控'\n          })]\n        }), /*#__PURE__*/jsxs(\"div\", {\n          className: \"flat-feature\",\n          children: [/*#__PURE__*/jsx(ZapIcon, {\n            size: 20\n          }), /*#__PURE__*/jsx(\"span\", {\n            children: msg.feature2 || 'W3C 标准身份'\n          })]\n        })]\n      })]\n    })]\n  });\n}\n\n/**\n * QuantaBit Auth SDK - 扁平化暗色全页面注册组件 (FlatDarkRegisterPage)\n * \n * 现代扁平化设计风格的全页注册页面，支持：\n * - 钱包连接注册\n * - 邮箱/密码注册\n * - 语言切换\n */\n\nfunction FlatDarkRegisterPage({\n  onSuccess,\n  onNavigateToLogin,\n  onNavigateToHome,\n  apiBaseUrl = '/api/v1',\n  appName = 'QuantaBit',\n  appLogo,\n  language: initialLanguage,\n  redirectTo = '/dashboard',\n  showLanguageSwitch = true,\n  showSocialLogin = true,\n  socialProviders = ['apple', 'google', 'microsoft', 'wechat', 'tiktok'],\n  renderSocialLogin\n}) {\n  const [registerType, setRegisterType] = useState('wallet'); // wallet, email\n  const [step, setStep] = useState('input'); // input, connecting, creating, success\n  const [error, setError] = useState(null);\n  const [walletAddress, setWalletAddress] = useState(null);\n  const [showPassword, setShowPassword] = useState(false);\n  const [showConfirmPassword, setShowConfirmPassword] = useState(false);\n  const [loading, setLoading] = useState(false);\n\n  // 语言状态\n  const [currentLanguage, setCurrentLanguage] = useState(() => {\n    if (initialLanguage) return initialLanguage;\n    return initLanguage();\n  });\n\n  // 表单数据\n  const [formData, setFormData] = useState({\n    nickname: '',\n    email: '',\n    password: '',\n    confirmPassword: ''\n  });\n  const msg = getMessages$1(currentLanguage);\n\n  // 语言切换处理\n  const handleLanguageChange = useCallback(newLang => {\n    setCurrentLanguage(newLang);\n    setLanguage(newLang);\n  }, []);\n\n  // 配置 API\n  useEffect(() => {\n    if (apiBaseUrl) {\n      apiClient.configure({\n        apiBaseUrl\n      });\n    }\n  }, [apiBaseUrl]);\n\n  // 社交登录成功回调\n  const handleSocialSuccess = useCallback(result => {\n    const {\n      access_token,\n      refresh_token,\n      did,\n      user: resUser,\n      is_new_user\n    } = result;\n    apiClient.setTokens(access_token, refresh_token);\n    setCurrentDID(did);\n    saveAccount({\n      did,\n      displayName: resUser?.display_name || formatDID(did),\n      avatar: resUser?.avatar_url || resUser?.avatar,\n      verified: true\n    });\n    setStep('success');\n    setTimeout(() => {\n      onSuccess && onSuccess({\n        success: true,\n        accessToken: access_token,\n        refreshToken: refresh_token,\n        did,\n        user: {\n          nickname: resUser?.display_name || resUser?.name,\n          avatar: resUser?.avatar_url || resUser?.avatar,\n          ...resUser\n        },\n        isNewUser: is_new_user,\n        redirectTo\n      });\n    }, 1200);\n  }, [onSuccess, redirectTo]);\n  const handleSocialError = useCallback(err => {\n    setError(err?.message || '社交登录失败');\n  }, []);\n\n  // 钱包注册\n  const connectWallet = useCallback(async () => {\n    setError(null);\n    if (!hasQBitWallet()) {\n      setError(msg.noWallet || '未检测到钱包');\n      return;\n    }\n    try {\n      setStep('connecting');\n      const {\n        address,\n        response\n      } = await loginWithBrowserWallet(apiClient, 'quantabit');\n      setWalletAddress(address);\n      setStep('creating');\n      const {\n        access_token,\n        refresh_token,\n        did,\n        user,\n        is_new_user\n      } = response;\n      apiClient.setTokens(access_token, refresh_token);\n      setCurrentDID(did);\n\n      // 保存账户\n      saveAccount({\n        did,\n        displayName: user?.nickname || formatAddress(address),\n        avatar: user?.avatar,\n        walletAddress: address,\n        verified: true\n      });\n      setStep('success');\n      setTimeout(() => {\n        onSuccess && onSuccess({\n          success: true,\n          accessToken: access_token,\n          refreshToken: refresh_token,\n          did,\n          user,\n          isNewUser: is_new_user,\n          redirectTo\n        });\n      }, 1200);\n    } catch (err) {\n      console.error('Register error:', err);\n      if (err.code === 4001) {\n        setError(msg.rejected || '用户拒绝了签名');\n      } else {\n        setError(err.message || msg.errorRegisterFailed || '注册失败');\n      }\n      setStep('input');\n    }\n  }, [msg, onSuccess, redirectTo]);\n\n  // 邮箱注册\n  const handleEmailRegister = useCallback(async e => {\n    e.preventDefault();\n    setError(null);\n\n    // 验证\n    if (!formData.nickname.trim()) {\n      setError(currentLanguage === 'zh' ? '请输入昵称' : 'Please enter nickname');\n      return;\n    }\n    if (!formData.password) {\n      setError(currentLanguage === 'zh' ? '请输入密码' : 'Please enter password');\n      return;\n    }\n    if (formData.password !== formData.confirmPassword) {\n      setError(msg.errorPasswordMismatch || '两次密码不一致');\n      return;\n    }\n    if (formData.password.length < 6) {\n      setError(currentLanguage === 'zh' ? '密码至少6位' : 'Password must be at least 6 characters');\n      return;\n    }\n    try {\n      setLoading(true);\n      setStep('creating');\n      const authRes = await apiClient.register({\n        displayName: formData.nickname.trim(),\n        email: formData.email || undefined,\n        password: formData.password\n      });\n      const {\n        access_token,\n        refresh_token,\n        did,\n        user\n      } = authRes.data || authRes;\n      apiClient.setTokens(access_token, refresh_token);\n      setCurrentDID(did);\n\n      // 保存账户\n      saveAccount({\n        did,\n        displayName: formData.nickname.trim(),\n        verified: true\n      });\n      setStep('success');\n      setTimeout(() => {\n        onSuccess && onSuccess({\n          success: true,\n          accessToken: access_token,\n          refreshToken: refresh_token,\n          did,\n          user,\n          isNewUser: true,\n          redirectTo\n        });\n      }, 1200);\n    } catch (err) {\n      console.error('Register error:', err);\n      setError(err.message || msg.errorRegisterFailed || '注册失败');\n      setStep('input');\n    } finally {\n      setLoading(false);\n    }\n  }, [formData, currentLanguage, msg, onSuccess, redirectTo]);\n\n  // 默认 Logo\n  const defaultLogo = /*#__PURE__*/jsxs(\"svg\", {\n    viewBox: \"0 0 40 40\",\n    fill: \"none\",\n    xmlns: \"http://www.w3.org/2000/svg\",\n    children: [/*#__PURE__*/jsx(\"rect\", {\n      width: \"40\",\n      height: \"40\",\n      rx: \"10\",\n      fill: \"url(#flat-reg-grad)\"\n    }), /*#__PURE__*/jsx(\"path\", {\n      d: \"M12 20C12 15.5817 15.5817 12 20 12C24.4183 12 28 15.5817 28 20C28 24.4183 24.4183 28 20 28\",\n      stroke: \"white\",\n      strokeWidth: \"2.5\",\n      strokeLinecap: \"round\"\n    }), /*#__PURE__*/jsx(\"circle\", {\n      cx: \"20\",\n      cy: \"20\",\n      r: \"4\",\n      fill: \"white\"\n    }), /*#__PURE__*/jsx(\"defs\", {\n      children: /*#__PURE__*/jsxs(\"linearGradient\", {\n        id: \"flat-reg-grad\",\n        x1: \"0\",\n        y1: \"0\",\n        x2: \"40\",\n        y2: \"40\",\n        gradientUnits: \"userSpaceOnUse\",\n        children: [/*#__PURE__*/jsx(\"stop\", {\n          stopColor: \"#6366f1\"\n        }), /*#__PURE__*/jsx(\"stop\", {\n          offset: \"1\",\n          stopColor: \"#a855f7\"\n        })]\n      })\n    })]\n  });\n  return /*#__PURE__*/jsxs(\"div\", {\n    className: \"flat-dark-login-page\",\n    children: [/*#__PURE__*/jsxs(\"div\", {\n      className: \"flat-login-bg\",\n      children: [/*#__PURE__*/jsx(\"div\", {\n        className: \"flat-login-orb flat-login-orb-1\"\n      }), /*#__PURE__*/jsx(\"div\", {\n        className: \"flat-login-orb flat-login-orb-2\"\n      }), /*#__PURE__*/jsx(\"div\", {\n        className: \"flat-login-grid\"\n      })]\n    }), showLanguageSwitch && /*#__PURE__*/jsx(\"div\", {\n      className: \"flat-login-language\",\n      children: /*#__PURE__*/jsx(LanguageSwitcher, {\n        currentLanguage: currentLanguage,\n        onLanguageChange: handleLanguageChange,\n        variant: \"dark\",\n        showFlag: true,\n        showName: false\n      })\n    }), /*#__PURE__*/jsxs(\"div\", {\n      className: \"flat-login-container\",\n      children: [/*#__PURE__*/jsxs(\"a\", {\n        href: \"/\",\n        className: \"flat-login-logo-link\",\n        onClick: e => {\n          e.preventDefault();\n          onNavigateToHome && onNavigateToHome();\n        },\n        children: [/*#__PURE__*/jsx(\"div\", {\n          className: \"flat-login-logo-icon\",\n          children: appLogo ? /*#__PURE__*/jsx(\"img\", {\n            src: appLogo,\n            alt: appName\n          }) : defaultLogo\n        }), /*#__PURE__*/jsx(\"span\", {\n          children: appName\n        })]\n      }), /*#__PURE__*/jsxs(\"div\", {\n        className: \"flat-page-login-card\",\n        children: [/*#__PURE__*/jsxs(\"div\", {\n          className: \"flat-page-login-header\",\n          children: [/*#__PURE__*/jsx(\"h1\", {\n            children: currentLanguage === 'zh' ? '创建数字身份' : 'Create Digital Identity'\n          }), /*#__PURE__*/jsx(\"p\", {\n            children: msg.chooseMethod || '选择您的注册方式，开启去中心化之旅'\n          })]\n        }), /*#__PURE__*/jsxs(\"div\", {\n          className: \"flat-page-login-tabs\",\n          children: [/*#__PURE__*/jsxs(\"button\", {\n            className: `flat-page-login-tab ${registerType === 'wallet' ? 'active' : ''}`,\n            onClick: () => {\n              setRegisterType('wallet');\n              setError(null);\n              setStep('input');\n            },\n            children: [/*#__PURE__*/jsx(WalletIcon, {\n              size: 18\n            }), msg.walletSection || '钱包连接']\n          }), /*#__PURE__*/jsxs(\"button\", {\n            className: `flat-page-login-tab ${registerType === 'email' ? 'active' : ''}`,\n            onClick: () => {\n              setRegisterType('email');\n              setError(null);\n              setStep('input');\n            },\n            children: [/*#__PURE__*/jsx(MailIcon, {\n              size: 18\n            }), msg.emailSection || '邮箱注册']\n          })]\n        }), /*#__PURE__*/jsxs(\"div\", {\n          className: \"flat-page-login-content\",\n          children: [registerType === 'wallet' && /*#__PURE__*/jsxs(Fragment, {\n            children: [step === 'input' && /*#__PURE__*/jsxs(\"div\", {\n              className: \"flat-page-login-step\",\n              children: [/*#__PURE__*/jsx(\"div\", {\n                className: \"flat-wallet-icon-wrapper\",\n                children: /*#__PURE__*/jsx(WalletIcon, {\n                  size: 48\n                })\n              }), /*#__PURE__*/jsx(\"p\", {\n                className: \"flat-step-description\",\n                children: currentLanguage === 'zh' ? '连接您的 Web3 钱包，我们将为您创建一个与钱包地址绑定的 DID。' : 'Connect your Web3 wallet, we will create a DID bound to your wallet address.'\n              }), /*#__PURE__*/jsxs(\"button\", {\n                className: \"flat-connect-btn\",\n                onClick: connectWallet,\n                children: [/*#__PURE__*/jsx(WalletIcon, {\n                  size: 20\n                }), msg.connectWallet || '连接钱包', /*#__PURE__*/jsx(ArrowRightIcon, {\n                  size: 20\n                })]\n              }), /*#__PURE__*/jsxs(\"div\", {\n                className: \"flat-supported-wallets\",\n                children: [/*#__PURE__*/jsx(\"span\", {\n                  children: msg.supportedWallets || '支持的钱包'\n                }), /*#__PURE__*/jsxs(\"div\", {\n                  className: \"flat-wallet-logos\",\n                  children: [/*#__PURE__*/jsx(\"img\", {\n                    src: \"https://metamask.io/images/metamask-fox.svg\",\n                    alt: \"MetaMask\"\n                  }), /*#__PURE__*/jsx(\"img\", {\n                    src: \"https://avatars.githubusercontent.com/u/18060234\",\n                    alt: \"WalletConnect\"\n                  }), /*#__PURE__*/jsx(\"img\", {\n                    src: \"https://avatars.githubusercontent.com/u/43919302\",\n                    alt: \"Coinbase\"\n                  })]\n                })]\n              })]\n            }), step === 'connecting' && /*#__PURE__*/jsxs(\"div\", {\n              className: \"flat-page-login-step flat-loading-step\",\n              children: [/*#__PURE__*/jsx(LoaderIcon, {\n                size: 48\n              }), /*#__PURE__*/jsx(\"p\", {\n                children: msg.connecting || '正在连接...'\n              })]\n            }), step === 'creating' && /*#__PURE__*/jsxs(\"div\", {\n              className: \"flat-page-login-step flat-signing-step\",\n              children: [walletAddress && /*#__PURE__*/jsxs(\"div\", {\n                className: \"flat-wallet-address\",\n                children: [/*#__PURE__*/jsx(ShieldIcon, {\n                  size: 20\n                }), /*#__PURE__*/jsx(\"code\", {\n                  children: formatAddress(walletAddress)\n                })]\n              }), /*#__PURE__*/jsx(LoaderIcon, {\n                size: 32\n              }), /*#__PURE__*/jsx(\"p\", {\n                children: currentLanguage === 'zh' ? '正在创建身份...' : 'Creating identity...'\n              }), /*#__PURE__*/jsx(\"span\", {\n                className: \"flat-signing-hint\",\n                children: msg.securityNote || '请确认在您的钱包中签名'\n              })]\n            })]\n          }), registerType === 'email' && step === 'input' && /*#__PURE__*/jsx(\"div\", {\n            className: \"flat-page-login-step\",\n            children: /*#__PURE__*/jsxs(\"form\", {\n              onSubmit: handleEmailRegister,\n              className: \"flat-page-login-form\",\n              children: [/*#__PURE__*/jsxs(\"div\", {\n                className: \"flat-form-group\",\n                children: [/*#__PURE__*/jsxs(\"label\", {\n                  htmlFor: \"flat-reg-nickname\",\n                  children: [msg.nickname || '昵称', \" *\"]\n                }), /*#__PURE__*/jsx(\"input\", {\n                  type: \"text\",\n                  id: \"flat-reg-nickname\",\n                  value: formData.nickname,\n                  onChange: e => setFormData({\n                    ...formData,\n                    nickname: e.target.value\n                  }),\n                  placeholder: currentLanguage === 'zh' ? '请输入昵称' : 'Enter nickname',\n                  required: true,\n                  disabled: loading\n                })]\n              }), /*#__PURE__*/jsxs(\"div\", {\n                className: \"flat-form-group\",\n                children: [/*#__PURE__*/jsxs(\"label\", {\n                  htmlFor: \"flat-reg-email\",\n                  children: [msg.email || '邮箱', \" (\", currentLanguage === 'zh' ? '可选' : 'optional', \")\"]\n                }), /*#__PURE__*/jsx(\"input\", {\n                  type: \"email\",\n                  id: \"flat-reg-email\",\n                  value: formData.email,\n                  onChange: e => setFormData({\n                    ...formData,\n                    email: e.target.value\n                  }),\n                  placeholder: \"user@example.com\",\n                  disabled: loading\n                })]\n              }), /*#__PURE__*/jsxs(\"div\", {\n                className: \"flat-form-group\",\n                children: [/*#__PURE__*/jsxs(\"label\", {\n                  htmlFor: \"flat-new-password\",\n                  children: [msg.password || '密码', \" *\"]\n                }), /*#__PURE__*/jsxs(\"div\", {\n                  className: \"flat-password-input\",\n                  children: [/*#__PURE__*/jsx(\"input\", {\n                    type: showPassword ? 'text' : 'password',\n                    id: \"flat-new-password\",\n                    value: formData.password,\n                    onChange: e => setFormData({\n                      ...formData,\n                      password: e.target.value\n                    }),\n                    placeholder: \"\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\",\n                    required: true,\n                    disabled: loading\n                  }), /*#__PURE__*/jsx(\"button\", {\n                    type: \"button\",\n                    className: \"flat-toggle-password\",\n                    onClick: () => setShowPassword(!showPassword),\n                    children: showPassword ? /*#__PURE__*/jsx(EyeOffIcon, {\n                      size: 18\n                    }) : /*#__PURE__*/jsx(EyeIcon, {\n                      size: 18\n                    })\n                  })]\n                })]\n              }), /*#__PURE__*/jsxs(\"div\", {\n                className: \"flat-form-group\",\n                children: [/*#__PURE__*/jsxs(\"label\", {\n                  htmlFor: \"flat-confirm-pwd\",\n                  children: [msg.confirmPassword || '确认密码', \" *\"]\n                }), /*#__PURE__*/jsxs(\"div\", {\n                  className: \"flat-password-input\",\n                  children: [/*#__PURE__*/jsx(\"input\", {\n                    type: showConfirmPassword ? 'text' : 'password',\n                    id: \"flat-confirm-pwd\",\n                    value: formData.confirmPassword,\n                    onChange: e => setFormData({\n                      ...formData,\n                      confirmPassword: e.target.value\n                    }),\n                    placeholder: \"\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\",\n                    required: true,\n                    disabled: loading\n                  }), /*#__PURE__*/jsx(\"button\", {\n                    type: \"button\",\n                    className: \"flat-toggle-password\",\n                    onClick: () => setShowConfirmPassword(!showConfirmPassword),\n                    children: showConfirmPassword ? /*#__PURE__*/jsx(EyeOffIcon, {\n                      size: 18\n                    }) : /*#__PURE__*/jsx(EyeIcon, {\n                      size: 18\n                    })\n                  })]\n                })]\n              }), /*#__PURE__*/jsxs(\"button\", {\n                type: \"submit\",\n                className: \"flat-connect-btn\",\n                disabled: loading,\n                children: [loading ? /*#__PURE__*/jsx(LoaderIcon, {\n                  size: 20\n                }) : /*#__PURE__*/jsx(ShieldIcon, {\n                  size: 20\n                }), loading ? msg.registering || '注册中...' : msg.registerButton || '创建身份', !loading && /*#__PURE__*/jsx(ArrowRightIcon, {\n                  size: 20\n                })]\n              })]\n            })\n          }), registerType === 'email' && step === 'creating' && /*#__PURE__*/jsxs(\"div\", {\n            className: \"flat-page-login-step flat-loading-step\",\n            children: [/*#__PURE__*/jsx(LoaderIcon, {\n              size: 48\n            }), /*#__PURE__*/jsx(\"p\", {\n              children: currentLanguage === 'zh' ? '正在创建身份...' : 'Creating identity...'\n            })]\n          }), step === 'success' && /*#__PURE__*/jsxs(\"div\", {\n            className: \"flat-page-login-step flat-success-step\",\n            children: [/*#__PURE__*/jsx(\"div\", {\n              className: \"flat-success-icon\",\n              children: /*#__PURE__*/jsx(CheckIcon, {\n                size: 32\n              })\n            }), /*#__PURE__*/jsx(\"p\", {\n              children: currentLanguage === 'zh' ? '注册成功！' : 'Registration successful!'\n            }), /*#__PURE__*/jsx(\"span\", {\n              children: msg.redirecting || '正在跳转...'\n            })]\n          }), error && /*#__PURE__*/jsxs(\"div\", {\n            className: \"flat-page-login-error\",\n            children: [/*#__PURE__*/jsx(AlertIcon, {\n              size: 18\n            }), /*#__PURE__*/jsx(\"span\", {\n              children: error\n            })]\n          })]\n        }), showSocialLogin && /*#__PURE__*/jsxs(\"div\", {\n          className: \"flat-page-social-login\",\n          style: {\n            margin: '15px 0',\n            display: 'flex',\n            flexDirection: 'column',\n            alignItems: 'center',\n            width: '100%'\n          },\n          children: [/*#__PURE__*/jsxs(\"div\", {\n            className: \"flat-social-divider\",\n            style: {\n              width: '100%',\n              display: 'flex',\n              alignItems: 'center',\n              margin: '10px 0 15px 0',\n              color: '#6b7280',\n              fontSize: '13px'\n            },\n            children: [/*#__PURE__*/jsx(\"div\", {\n              style: {\n                flex: 1,\n                height: '1px',\n                backgroundColor: 'rgba(255,255,255,0.08)'\n              }\n            }), /*#__PURE__*/jsx(\"span\", {\n              style: {\n                padding: '0 10px'\n              },\n              children: msg.orDivider || '或'\n            }), /*#__PURE__*/jsx(\"div\", {\n              style: {\n                flex: 1,\n                height: '1px',\n                backgroundColor: 'rgba(255,255,255,0.08)'\n              }\n            })]\n          }), renderSocialLogin ? typeof renderSocialLogin === 'function' ? renderSocialLogin() : renderSocialLogin : /*#__PURE__*/jsx(OAuthIconGroup, {\n            providers: socialProviders,\n            onSuccess: handleSocialSuccess,\n            onError: handleSocialError\n          })]\n        }), /*#__PURE__*/jsx(\"div\", {\n          className: \"flat-page-login-footer\",\n          children: /*#__PURE__*/jsxs(\"p\", {\n            children: [msg.alreadyHaveDID || '已有账号？', /*#__PURE__*/jsx(\"button\", {\n              onClick: () => onNavigateToLogin && onNavigateToLogin(),\n              children: msg.goLogin || '登录'\n            })]\n          })\n        })]\n      }), /*#__PURE__*/jsxs(\"div\", {\n        className: \"flat-page-login-features\",\n        children: [/*#__PURE__*/jsxs(\"div\", {\n          className: \"flat-feature\",\n          children: [/*#__PURE__*/jsx(ShieldIcon, {\n            size: 20\n          }), /*#__PURE__*/jsx(\"span\", {\n            children: msg.feature1 || '数据完全自主掌控'\n          })]\n        }), /*#__PURE__*/jsxs(\"div\", {\n          className: \"flat-feature\",\n          children: [/*#__PURE__*/jsx(ZapIcon, {\n            size: 20\n          }), /*#__PURE__*/jsx(\"span\", {\n            children: msg.feature2 || 'W3C 标准身份'\n          })]\n        })]\n      })]\n    })]\n  });\n}\n\n/**\n * QuantaBit Auth SDK - useDIDChain Hook\n * \n * DID 链上锚定与注册流程 Hook：\n * - 将 DID 注册到链上 (生成 Payload -> 外部钱包签名/广播 -> 提交 tx_hash)\n * - 更新链上 DID 文档 (生成 Payload -> 外部钱包签名/广播 -> 提交 tx_hash)\n * - 验证链上 DID 状态 (已确认/待确认/哈希校验)\n * - 从主网解析 DID 文档\n * - 支持轮询确认 (waitForChainConfirmation)\n */\n\nfunction sleep(ms) {\n  return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * useDIDChain Hook\n * \n * @param {Object} options\n * @param {string} options.did - 当前用户的 DID\n * @param {string} options.apiBaseUrl - API 基础 URL\n * @returns {Object} DID 链上注册与验证方法和状态\n */\nfunction useDIDChain({\n  did,\n  apiBaseUrl\n} = {}) {\n  const [chainDocument, setChainDocument] = useState(null);\n  const [chainStatus, setChainStatus] = useState(null);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState(null);\n\n  // 配置 API\n  useEffect(() => {\n    if (apiBaseUrl) {\n      apiClient.configure({\n        apiBaseUrl\n      });\n    }\n  }, [apiBaseUrl]);\n\n  /**\n   * 从真实链解析 DID\n   */\n  const resolveDIDFromChain = useCallback(async didString => {\n    setLoading(true);\n    setError(null);\n    try {\n      const targetDid = didString || did;\n      if (!targetDid) {\n        throw new Error('缺少 DID，无法从链上解析');\n      }\n      const result = await apiClient.resolveDIDFromChain(targetDid);\n      const data = result.data || result;\n      setChainDocument(data);\n      return data;\n    } catch (err) {\n      setError(err);\n      return null;\n    } finally {\n      setLoading(false);\n    }\n  }, [did]);\n\n  /**\n   * 将当前 DID 注册到链上\n   */\n  const registerOnChain = useCallback(async () => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.registerDIDOnChain();\n      const data = result.data || result;\n      setChainStatus(data);\n      return {\n        success: true,\n        data\n      };\n    } catch (err) {\n      setError(err);\n      return {\n        success: false,\n        error: err\n      };\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  /**\n   * 提交 DID 注册后的链上 tx_hash\n   */\n  const submitRegisterTxHash = useCallback(async txHash => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.submitDIDRegisterTxHash(txHash);\n      const data = result.data || result;\n      setChainStatus(data);\n      return {\n        success: true,\n        data\n      };\n    } catch (err) {\n      setError(err);\n      return {\n        success: false,\n        error: err\n      };\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  /**\n   * 通过外部签名器完成 DID 注册广播并自动提交 tx_hash\n   */\n  const registerOnChainWithSigner = useCallback(async broadcaster => {\n    const initial = await registerOnChain();\n    if (!initial?.success) {\n      return initial;\n    }\n    try {\n      const completed = await completeExternalChainOperation$1(initial.data, broadcaster, submitRegisterTxHash);\n      return {\n        success: true,\n        data: completed.submit?.data || completed.submit || initial.data,\n        broadcast: completed.broadcast,\n        txHash: completed.txHash,\n        requiresExternalSigner: true\n      };\n    } catch (err) {\n      setError(err);\n      return {\n        success: false,\n        error: err,\n        data: initial.data\n      };\n    }\n  }, [registerOnChain, submitRegisterTxHash]);\n\n  /**\n   * 使用 QBit Memo 锚定广播完成 DID 注册闭环\n   */\n  const registerOnChainWithQBitWallet = useCallback(async (options = {}) => {\n    const broadcaster = createQBitMemoAnchorBroadcaster$1(options);\n    return registerOnChainWithSigner(broadcaster);\n  }, [registerOnChainWithSigner]);\n\n  /**\n   * 更新链上 DID 文档\n   */\n  const updateOnChain = useCallback(async () => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.updateDIDOnChain();\n      const data = result.data || result;\n      setChainStatus(data);\n      return {\n        success: true,\n        data\n      };\n    } catch (err) {\n      setError(err);\n      return {\n        success: false,\n        error: err\n      };\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  /**\n   * 提交 DID 更新后的链上 tx_hash\n   */\n  const submitUpdateTxHash = useCallback(async txHash => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.submitDIDUpdateTxHash(txHash);\n      const data = result.data || result;\n      setChainStatus(data);\n      return {\n        success: true,\n        data\n      };\n    } catch (err) {\n      setError(err);\n      return {\n        success: false,\n        error: err\n      };\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  /**\n   * 通过外部签名器完成 DID 更新广播并自动提交 tx_hash\n   */\n  const updateOnChainWithSigner = useCallback(async broadcaster => {\n    const initial = await updateOnChain();\n    if (!initial?.success) {\n      return initial;\n    }\n    try {\n      const completed = await completeExternalChainOperation$1(initial.data, broadcaster, submitUpdateTxHash);\n      return {\n        success: true,\n        data: completed.submit?.data || completed.submit || initial.data,\n        broadcast: completed.broadcast,\n        txHash: completed.txHash,\n        requiresExternalSigner: true\n      };\n    } catch (err) {\n      setError(err);\n      return {\n        success: false,\n        error: err,\n        data: initial.data\n      };\n    }\n  }, [submitUpdateTxHash, updateOnChain]);\n\n  /**\n   * 使用 QBit Memo 锚定广播完成 DID 更新闭环\n   */\n  const updateOnChainWithQBitWallet = useCallback(async (options = {}) => {\n    const broadcaster = createQBitMemoAnchorBroadcaster$1(options);\n    return updateOnChainWithSigner(broadcaster);\n  }, [updateOnChainWithSigner]);\n\n  /**\n   * 一次性完成 DID 链上注册（后端操作 → 钱包广播 → 确认/验证 → 提交 tx_hash）\n   * 直接委托 apiClient 的高级编排，并同步 loading/error/chainStatus 状态。\n   *\n   * @param {Object} provider - QBit 钱包 provider\n   * @param {Object} options - 编排选项（network/address/waitForConfirmation/verify...）\n   */\n  const registerWithWallet = useCallback(async (provider, options = {}) => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.registerDIDWithWallet(provider, options);\n      setChainStatus(result.submit?.data || result.submit || result.operation);\n      return {\n        success: true,\n        ...result\n      };\n    } catch (err) {\n      setError(err);\n      return {\n        success: false,\n        error: err\n      };\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  /**\n   * 一次性完成 DID 链上更新\n   * @param {Object} provider - QBit 钱包 provider\n   * @param {Object} options - 编排选项\n   */\n  const updateWithWallet = useCallback(async (provider, options = {}) => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.updateDIDWithWallet(provider, options);\n      setChainStatus(result.submit?.data || result.submit || result.operation);\n      return {\n        success: true,\n        ...result\n      };\n    } catch (err) {\n      setError(err);\n      return {\n        success: false,\n        error: err\n      };\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  /**\n   * 一次性完成凭证链上锚定\n   * @param {string} credentialId - 凭证 ID\n   * @param {Object} provider - QBit 钱包 provider\n   * @param {Object} options - 编排选项\n   */\n  const anchorCredentialWithWallet = useCallback(async (credentialId, provider, options = {}) => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.anchorCredentialWithWallet(credentialId, provider, options);\n      setChainStatus(result.submit?.data || result.submit || result.operation);\n      return {\n        success: true,\n        ...result\n      };\n    } catch (err) {\n      setError(err);\n      return {\n        success: false,\n        error: err\n      };\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  /**\n   * 一次性完成凭证链上吊销\n   * @param {string} credentialId - 凭证 ID\n   * @param {Object} provider - QBit 钱包 provider\n   * @param {Object} options - 编排选项（reason 通过 options.reason 传入）\n   */\n  const revokeCredentialWithWallet = useCallback(async (credentialId, provider, options = {}) => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.revokeCredentialWithWallet(credentialId, provider, options);\n      setChainStatus(result.submit?.data || result.submit || result.operation);\n      return {\n        success: true,\n        ...result\n      };\n    } catch (err) {\n      setError(err);\n      return {\n        success: false,\n        error: err\n      };\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  /**\n   * 校验 DID 链上状态\n   */\n  const verifyOnChain = useCallback(async (didString = did) => {\n    const targetDid = didString || did;\n    if (!targetDid) return null;\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.verifyDIDOnChain(targetDid);\n      const data = result.data || result;\n      setChainStatus(data);\n      return data;\n    } catch (err) {\n      setError(err);\n      return null;\n    } finally {\n      setLoading(false);\n    }\n  }, [did]);\n\n  /**\n   * 轮询 DID 链上状态，直到确认、锚定无效或超时\n   */\n  const waitForChainConfirmation = useCallback(async (didString = did, {\n    intervalMs = 3000,\n    timeoutMs = 60000\n  } = {}) => {\n    const targetDid = didString || did;\n    if (!targetDid) {\n      const missingDidError = new Error('缺少 DID');\n      setError(missingDidError);\n      return {\n        success: false,\n        error: missingDidError\n      };\n    }\n    const startedAt = Date.now();\n    while (Date.now() - startedAt <= timeoutMs) {\n      const result = await verifyOnChain(targetDid);\n      if (!result) {\n        return {\n          success: false,\n          confirmed: false,\n          timedOut: false,\n          error: error || new Error('链上状态查询失败')\n        };\n      }\n      if (result.invalid_anchor || result.confirmed && result.memo_hash_match === false) {\n        return {\n          success: false,\n          confirmed: false,\n          invalidAnchor: true,\n          timedOut: false,\n          data: result\n        };\n      }\n      if (result.confirmed && result.hash_match) {\n        return {\n          success: true,\n          confirmed: true,\n          timedOut: false,\n          data: result\n        };\n      }\n      await sleep(intervalMs);\n    }\n    const latest = await verifyOnChain(targetDid);\n    return {\n      success: false,\n      confirmed: false,\n      timedOut: true,\n      data: latest\n    };\n  }, [did, error, verifyOnChain]);\n\n  /**\n   * 提交 DID 注册交易后等待链上确认\n   */\n  const submitRegisterTxHashAndWait = useCallback(async (txHash, options = {}) => {\n    const submitted = await submitRegisterTxHash(txHash);\n    if (!submitted?.success) {\n      return submitted;\n    }\n    const targetDid = did || submitted.data?.did;\n    const waited = await waitForChainConfirmation(targetDid, options);\n    return {\n      ...waited,\n      submitted: submitted.data,\n      txHash\n    };\n  }, [did, submitRegisterTxHash, waitForChainConfirmation]);\n\n  /**\n   * 提交 DID 更新交易后等待链上确认\n   */\n  const submitUpdateTxHashAndWait = useCallback(async (txHash, options = {}) => {\n    const submitted = await submitUpdateTxHash(txHash);\n    if (!submitted?.success) {\n      return submitted;\n    }\n    const targetDid = did || submitted.data?.did;\n    const waited = await waitForChainConfirmation(targetDid, options);\n    return {\n      ...waited,\n      submitted: submitted.data,\n      txHash\n    };\n  }, [did, submitUpdateTxHash, waitForChainConfirmation]);\n  return {\n    chainDocument,\n    chainStatus,\n    loading,\n    error,\n    resolveDIDFromChain,\n    registerOnChain,\n    submitRegisterTxHash,\n    registerOnChainWithSigner,\n    registerOnChainWithQBitWallet,\n    updateOnChain,\n    submitUpdateTxHash,\n    updateOnChainWithSigner,\n    updateOnChainWithQBitWallet,\n    registerWithWallet,\n    updateWithWallet,\n    anchorCredentialWithWallet,\n    revokeCredentialWithWallet,\n    verifyOnChain,\n    waitForChainConfirmation,\n    submitRegisterTxHashAndWait,\n    submitUpdateTxHashAndWait\n  };\n}\n\n/**\n * QuantaBit Auth SDK - useDID Hook\n * \n * DID 管理 Hook：\n * - 获取当前 DID\n * - 解析 DID 文档\n * - 创建 DID\n * - 更新 DID 文档\n * - 委托 DID 链上注册与管理 (useDIDChain)\n */\n\n\n/**\n * useDID Hook\n * \n * @param {Object} options\n * @param {string} options.apiBaseUrl - API 基础 URL\n * @param {boolean} options.autoLoad - 是否自动加载（默认 true）\n * @returns {Object} DID 管理方法和状态\n */\nfunction useDID({\n  apiBaseUrl,\n  autoLoad = true\n} = {}) {\n  const [did, setDID] = useState(null);\n  const [document, setDocument] = useState(null);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState(null);\n\n  // 配置 API\n  useEffect(() => {\n    if (apiBaseUrl) {\n      apiClient.configure({\n        apiBaseUrl\n      });\n    }\n  }, [apiBaseUrl]);\n\n  // 引入并委托链上操作 Hook\n  const {\n    chainDocument,\n    chainStatus,\n    loading: chainLoading,\n    error: chainError,\n    resolveDIDFromChain,\n    registerOnChain,\n    submitRegisterTxHash,\n    registerOnChainWithSigner,\n    registerOnChainWithQBitWallet,\n    updateOnChain,\n    submitUpdateTxHash,\n    updateOnChainWithSigner,\n    updateOnChainWithQBitWallet,\n    verifyOnChain,\n    waitForChainConfirmation,\n    submitRegisterTxHashAndWait,\n    submitUpdateTxHashAndWait\n  } = useDIDChain({\n    did,\n    apiBaseUrl\n  });\n\n  // 组合 loading 和 error 状态\n  const finalLoading = loading || chainLoading;\n  const finalError = error || chainError;\n\n  /**\n   * 获取当前用户 DID\n   */\n  const fetchMyDID = useCallback(async () => {\n    if (!apiClient.isAuthenticated()) {\n      return null;\n    }\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.getMyDID();\n      const data = result.data || result;\n      setDID(data.did || data);\n      setDocument(data.document);\n      return data;\n    } catch (err) {\n      setError(err);\n      return null;\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  /**\n   * 解析 DID 文档\n   */\n  const resolveDID = useCallback(async didString => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.resolveDID(didString);\n      const data = result.data || result;\n      setDocument(data.document || data.did_document || data);\n      return data;\n    } catch (err) {\n      setError(err);\n      return null;\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  /**\n   * 创建新 DID\n   */\n  const createDID = useCallback(async (options = {}) => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.createDID(options);\n      const data = result.data || result;\n      setDID(data.did);\n      setDocument(data.document);\n      return {\n        success: true,\n        data\n      };\n    } catch (err) {\n      setError(err);\n      return {\n        success: false,\n        error: err\n      };\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  /**\n   * 更新 DID 文档\n   */\n  const updateDocument = useCallback(async operation => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.updateDIDDocument(operation);\n      const data = result.data || result;\n      setDocument(data.document || data);\n      return {\n        success: true,\n        data\n      };\n    } catch (err) {\n      setError(err);\n      return {\n        success: false,\n        error: err\n      };\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  /**\n   * 添加密钥\n   */\n  const addKey = useCallback(async (keyType, publicKeyHex, signature) => {\n    return updateDocument({\n      operation: 'add_key',\n      payload: {\n        key_type: keyType,\n        public_key_hex: publicKeyHex\n      },\n      signature\n    });\n  }, [updateDocument]);\n\n  /**\n   * 移除密钥\n   */\n  const removeKey = useCallback(async (keyId, signature) => {\n    return updateDocument({\n      operation: 'remove_key',\n      payload: {\n        key_id: keyId\n      },\n      signature\n    });\n  }, [updateDocument]);\n\n  /**\n   * 添加服务端点\n   */\n  const addService = useCallback(async (serviceId, type, endpoint, signature) => {\n    return updateDocument({\n      operation: 'add_service',\n      payload: {\n        id: serviceId,\n        type,\n        service_endpoint: endpoint\n      },\n      signature\n    });\n  }, [updateDocument]);\n\n  /**\n   * 移除服务端点\n   */\n  const removeService = useCallback(async (serviceId, signature) => {\n    return updateDocument({\n      operation: 'remove_service',\n      payload: {\n        service_id: serviceId\n      },\n      signature\n    });\n  }, [updateDocument]);\n\n  // 自动加载\n  useEffect(() => {\n    if (autoLoad && apiClient.isAuthenticated()) {\n      fetchMyDID();\n    }\n  }, [autoLoad, fetchMyDID]);\n  return {\n    did,\n    document,\n    chainDocument,\n    chainStatus,\n    loading: finalLoading,\n    error: finalError,\n    fetchMyDID,\n    resolveDID,\n    resolveDIDFromChain,\n    createDID,\n    updateDocument,\n    registerOnChain,\n    submitRegisterTxHash,\n    submitRegisterTxHashAndWait,\n    registerOnChainWithSigner,\n    registerOnChainWithQBitWallet,\n    updateOnChain,\n    submitUpdateTxHash,\n    submitUpdateTxHashAndWait,\n    updateOnChainWithSigner,\n    updateOnChainWithQBitWallet,\n    verifyOnChain,\n    waitForChainConfirmation,\n    addKey,\n    removeKey,\n    addService,\n    removeService,\n    // 兼容别名\n    registerDIDOnChain: registerOnChain,\n    submitDIDRegisterTxHash: submitRegisterTxHash,\n    updateDIDOnChain: updateOnChain,\n    submitDIDUpdateTxHash: submitUpdateTxHash,\n    // 修复: 之前错误地自引用\n    verifyDIDOnChain: verifyOnChain,\n    // 便捷属性\n    isActive: document?.status === 'active',\n    verificationMethods: document?.verificationMethod || [],\n    services: document?.service || []\n  };\n}\n\nfunction getMessages(language = 'zh') {\n  const isZh = String(language).toLowerCase().startsWith('zh');\n  if (isZh) {\n    return {\n      title: 'DID 链上状态',\n      subtitle: 'QBit 主网 Memo 锚定校验',\n      refresh: '刷新状态',\n      waiting: '等待确认',\n      verified: '锚定有效',\n      invalid: '锚定无效',\n      localOnly: '仅本地',\n      unknown: '未检测',\n      confirmed: '已确认',\n      unconfirmed: '未确认',\n      memoMatched: 'Memo 哈希匹配',\n      memoMismatch: 'Memo 哈希不匹配',\n      did: 'DID',\n      txHash: '交易哈希',\n      localHash: '本地哈希',\n      chainHash: '链上哈希',\n      expectedHash: '期望哈希',\n      status: '状态',\n      confirmation: '确认状态',\n      noDid: '当前还没有可展示的 DID'\n    };\n  }\n  return {\n    title: 'DID Chain Status',\n    subtitle: 'QBit mainnet memo anchor verification',\n    refresh: 'Refresh',\n    waiting: 'Pending confirmation',\n    verified: 'Anchor verified',\n    invalid: 'Invalid anchor',\n    localOnly: 'Local only',\n    unknown: 'Unknown',\n    confirmed: 'Confirmed',\n    unconfirmed: 'Unconfirmed',\n    memoMatched: 'Memo hash matched',\n    memoMismatch: 'Memo hash mismatched',\n    did: 'DID',\n    txHash: 'Tx Hash',\n    localHash: 'Local Hash',\n    chainHash: 'On-chain Hash',\n    expectedHash: 'Expected Hash',\n    status: 'Status',\n    confirmation: 'Confirmation',\n    noDid: 'No DID available yet'\n  };\n}\nfunction DIDChainStatusCard({\n  did: didProp,\n  status,\n  loading: loadingProp,\n  onRefresh,\n  apiBaseUrl,\n  autoLoad = false,\n  language = 'zh',\n  className = ''\n}) {\n  const didHook = useDID({\n    apiBaseUrl,\n    autoLoad\n  });\n  const did = didProp || didHook.did;\n  const chainStatus = status || didHook.chainStatus;\n  const loading = loadingProp ?? didHook.loading;\n  const msg = getMessages(language);\n  const view = useMemo(() => {\n    if (!chainStatus) {\n      return {\n        tone: 'neutral',\n        label: msg.unknown,\n        detail: msg.noDid\n      };\n    }\n    if (chainStatus.invalid_anchor || chainStatus.confirmed && chainStatus.memo_hash_match === false) {\n      return {\n        tone: 'danger',\n        label: msg.invalid,\n        detail: msg.memoMismatch\n      };\n    }\n    if (chainStatus.hash_match || chainStatus.is_registered_on_chain || chainStatus.confirmed && chainStatus.memo_hash_match) {\n      return {\n        tone: 'success',\n        label: msg.verified,\n        detail: msg.memoMatched\n      };\n    }\n    if (chainStatus.local_only || chainStatus.on_chain === false) {\n      return {\n        tone: 'muted',\n        label: msg.localOnly,\n        detail: msg.unconfirmed\n      };\n    }\n    if (chainStatus.pending_confirmation || chainStatus.confirmed === false) {\n      return {\n        tone: 'warning',\n        label: msg.waiting,\n        detail: msg.unconfirmed\n      };\n    }\n    return {\n      tone: 'neutral',\n      label: msg.unknown,\n      detail: chainStatus.confirmation_status || msg.unknown\n    };\n  }, [chainStatus, msg]);\n  const refresh = onRefresh || (() => did && didHook.verifyOnChain(did));\n  return /*#__PURE__*/jsxs(\"section\", {\n    className: `did-chain-card did-chain-card--${view.tone} ${className}`.trim(),\n    children: [/*#__PURE__*/jsxs(\"div\", {\n      className: \"did-chain-card__header\",\n      children: [/*#__PURE__*/jsxs(\"div\", {\n        children: [/*#__PURE__*/jsx(\"div\", {\n          className: \"did-chain-card__eyebrow\",\n          children: msg.subtitle\n        }), /*#__PURE__*/jsx(\"h3\", {\n          className: \"did-chain-card__title\",\n          children: msg.title\n        })]\n      }), /*#__PURE__*/jsxs(\"button\", {\n        type: \"button\",\n        className: \"did-chain-card__refresh\",\n        onClick: refresh,\n        disabled: loading || !did,\n        children: [loading ? /*#__PURE__*/jsx(LoaderIcon, {\n          size: 14\n        }) : /*#__PURE__*/jsx(ShieldIcon, {\n          size: 14\n        }), /*#__PURE__*/jsx(\"span\", {\n          children: msg.refresh\n        })]\n      })]\n    }), /*#__PURE__*/jsxs(\"div\", {\n      className: \"did-chain-card__summary\",\n      children: [/*#__PURE__*/jsxs(\"div\", {\n        className: `did-chain-card__badge did-chain-card__badge--${view.tone}`,\n        children: [view.tone === 'success' && /*#__PURE__*/jsx(CheckIcon, {\n          size: 14\n        }), view.tone !== 'success' && view.tone !== 'warning' && /*#__PURE__*/jsx(AlertIcon, {\n          size: 14\n        }), view.tone === 'warning' && /*#__PURE__*/jsx(LoaderIcon, {\n          size: 14\n        }), /*#__PURE__*/jsx(\"span\", {\n          children: view.label\n        })]\n      }), /*#__PURE__*/jsx(\"p\", {\n        className: \"did-chain-card__detail\",\n        children: view.detail\n      })]\n    }), /*#__PURE__*/jsxs(\"div\", {\n      className: \"did-chain-card__grid\",\n      children: [/*#__PURE__*/jsxs(\"div\", {\n        className: \"did-chain-card__item\",\n        children: [/*#__PURE__*/jsx(\"span\", {\n          children: msg.did\n        }), /*#__PURE__*/jsx(\"code\", {\n          children: did ? formatDID$1(did) : '--'\n        })]\n      }), /*#__PURE__*/jsxs(\"div\", {\n        className: \"did-chain-card__item\",\n        children: [/*#__PURE__*/jsx(\"span\", {\n          children: msg.status\n        }), /*#__PURE__*/jsx(\"strong\", {\n          children: chainStatus?.status || view.label\n        })]\n      }), /*#__PURE__*/jsxs(\"div\", {\n        className: \"did-chain-card__item\",\n        children: [/*#__PURE__*/jsx(\"span\", {\n          children: msg.confirmation\n        }), /*#__PURE__*/jsx(\"strong\", {\n          children: chainStatus?.confirmation_status || msg.unknown\n        })]\n      }), /*#__PURE__*/jsxs(\"div\", {\n        className: \"did-chain-card__item\",\n        children: [/*#__PURE__*/jsx(\"span\", {\n          children: msg.txHash\n        }), /*#__PURE__*/jsx(\"code\", {\n          children: chainStatus?.tx_hash ? formatAddress(chainStatus.tx_hash) : '--'\n        })]\n      })]\n    }), /*#__PURE__*/jsxs(\"div\", {\n      className: \"did-chain-card__hashes\",\n      children: [/*#__PURE__*/jsxs(\"div\", {\n        className: \"did-chain-card__hash\",\n        children: [/*#__PURE__*/jsx(\"span\", {\n          children: msg.localHash\n        }), /*#__PURE__*/jsx(\"code\", {\n          children: chainStatus?.local_document_hash || '--'\n        })]\n      }), /*#__PURE__*/jsxs(\"div\", {\n        className: \"did-chain-card__hash\",\n        children: [/*#__PURE__*/jsx(\"span\", {\n          children: msg.chainHash\n        }), /*#__PURE__*/jsx(\"code\", {\n          children: chainStatus?.on_chain_document_hash || chainStatus?.document_hash || '--'\n        })]\n      }), /*#__PURE__*/jsxs(\"div\", {\n        className: \"did-chain-card__hash\",\n        children: [/*#__PURE__*/jsx(\"span\", {\n          children: msg.expectedHash\n        }), /*#__PURE__*/jsx(\"code\", {\n          children: chainStatus?.expected_document_hash || chainStatus?.expected_hash || '--'\n        })]\n      })]\n    })]\n  });\n}\n\n/**\n * QuantaBit Auth SDK - DID Profile Panel\n * \n * 通用 DID 个人中心面板组件\n * 生态内所有应用可共用，展示用户基础 DID 身份信息、钱包、链上状态\n * \n * 使用场景：\n * - 用户点击头像/昵称 → 展开 DID 个人中心\n * - 可嵌入到任意生态应用的侧边栏、弹窗、页面中\n */\n\nconst panelMessages = {\n  zh: {\n    title: '身份中心',\n    didLabel: 'DID 标识',\n    walletLabel: '关联钱包',\n    chainStatus: '链上状态',\n    reputation: '声誉积分',\n    credentials: '我的凭证',\n    profile: '个人资料',\n    wallets: '钱包管理',\n    security: '安全设置',\n    settings: '账户设置',\n    switchAccount: '切换账户',\n    logout: '退出登录',\n    copied: '已复制',\n    copy: '复制',\n    noWallet: '未绑定钱包',\n    viewAll: '查看全部',\n    level: '等级',\n    score: '分',\n    verified: '已验证',\n    unverified: '未验证'\n  },\n  en: {\n    title: 'Identity Center',\n    didLabel: 'DID Identifier',\n    walletLabel: 'Linked Wallet',\n    chainStatus: 'On-Chain Status',\n    reputation: 'Reputation',\n    credentials: 'Credentials',\n    profile: 'Profile',\n    wallets: 'Wallets',\n    security: 'Security',\n    settings: 'Settings',\n    switchAccount: 'Switch Account',\n    logout: 'Logout',\n    copied: 'Copied',\n    copy: 'Copy',\n    noWallet: 'No wallet linked',\n    viewAll: 'View All',\n    level: 'Level',\n    score: 'pts',\n    verified: 'Verified',\n    unverified: 'Unverified'\n  },\n  ja: {\n    title: 'アイデンティティセンター',\n    didLabel: 'DID 識別子',\n    walletLabel: 'リンクウォレット',\n    chainStatus: 'オンチェーン状態',\n    reputation: '評判スコア',\n    credentials: '認証情報',\n    profile: 'プロフィール',\n    wallets: 'ウォレット',\n    security: 'セキュリティ',\n    settings: '設定',\n    switchAccount: 'アカウント切替',\n    logout: 'ログアウト',\n    copied: 'コピー済み',\n    copy: 'コピー',\n    noWallet: 'ウォレット未接続',\n    viewAll: 'すべて表示',\n    level: 'レベル',\n    score: 'ポイント',\n    verified: '認証済み',\n    unverified: '未認証'\n  },\n  ko: {\n    title: '신원 센터',\n    didLabel: 'DID 식별자',\n    walletLabel: '연결된 지갑',\n    chainStatus: '온체인 상태',\n    reputation: '평판 점수',\n    credentials: '인증서',\n    profile: '프로필',\n    wallets: '지갑 관리',\n    security: '보안 설정',\n    settings: '계정 설정',\n    switchAccount: '계정 전환',\n    logout: '로그아웃',\n    copied: '복사됨',\n    copy: '복사',\n    noWallet: '연결된 지갑 없음',\n    viewAll: '전체 보기',\n    level: '레벨',\n    score: '점',\n    verified: '인증됨',\n    unverified: '미인증'\n  }\n};\n\n/**\n * 获取用户显示名称 - 昵称优先\n * 统一的显示名获取逻辑，所有生态应用共用\n */\nfunction getUserDisplayName(user) {\n  if (!user) return '';\n  // 昵称优先级链：nickname > displayName > display_name > username > 截断DID\n  return user.nickname || user.displayName || user.display_name || user.username || user.name || formatDID$1(user.did, 12);\n}\n\n/**\n * 获取用户头像首字母\n */\nfunction getAvatarInitial(user) {\n  const name = getUserDisplayName(user);\n  if (!name) return 'U';\n  // 支持中文首字、英文首字母\n  return name[0].toUpperCase();\n}\n\n/**\n * DIDProfilePanel - 通用 DID 个人中心面板\n * \n * @param {Object} props\n * @param {Object} props.user - 用户信息 { did, nickname, avatar, wallets, reputation, ... }\n * @param {Function} props.onNavigate - 导航回调 (path) => void\n * @param {Function} props.onLogout - 登出回调\n * @param {Function} props.onSwitchAccount - 切换账户回调\n * @param {Function} props.onClose - 关闭面板回调\n * @param {string} props.apiBaseUrl - API 基础 URL\n * @param {string} props.language - 语言\n * @param {string} props.mode - 显示模式 (panel/drawer/inline)\n * @param {boolean} props.showChainStatus - 是否显示链上状态卡片 (default: true)\n * @param {boolean} props.showQuickActions - 是否显示快捷操作 (default: true)\n * @param {Object} props.chainStatus - 外部传入的链上状态（可选，不传则内部查询）\n * @param {Function} props.onVerifyChain - 触发链上验证的回调（可选）\n * @param {Array} props.extraMenuItems - 扩展菜单项 [{ key, label, icon, onClick }]\n * @param {Array} props.quickActions - 完全替换快捷操作列表（高级自定义）\n * @param {string} props.className - 自定义 CSS 类名\n */\nfunction DIDProfilePanel({\n  user,\n  onNavigate,\n  onLogout,\n  onSwitchAccount,\n  onClose,\n  apiBaseUrl = '/api/v1',\n  language: initialLanguage = 'zh',\n  mode = 'panel',\n  showChainStatus = true,\n  showQuickActions = true,\n  // 外部直接传入链上状态（避免重复 hook 实例化）\n  chainStatus: externalChainStatus = null,\n  onVerifyChain = null,\n  // 扩展定制\n  extraMenuItems = [],\n  quickActions: customQuickActions = null,\n  className = ''\n}) {\n  const [copiedField, setCopiedField] = useState(null);\n  const [currentLanguage, setCurrentLanguage] = useState(() => normalizeLanguage(initialLanguage));\n  // 内部链上状态（仅当外部未传入 chainStatus 时才自查）\n  const [internalChainStatus, setInternalChainStatus] = useState(null);\n\n  // 优先使用外部传入的链上状态\n  const chainStatus = externalChainStatus ?? internalChainStatus;\n  const [chainLoading, setChainLoading] = useState(false);\n\n  // 触发链上验证（优先用外部回调，否则用内部实现）\n  const handleVerifyChain = useCallback(async didString => {\n    if (onVerifyChain) {\n      onVerifyChain(didString);\n      return;\n    }\n    // 无外部回调时降级：内部调用（动态 import 避免循环依赖）\n    try {\n      setChainLoading(true);\n      const {\n        apiClient\n      } = await Promise.resolve().then(function () { return apiClient$1; });\n      if (apiBaseUrl) apiClient.configure({\n        apiBaseUrl\n      });\n      const result = await apiClient.verifyDIDOnChain(didString);\n      setInternalChainStatus(result?.data || result);\n    } catch (e) {\n      console.warn('[DIDProfilePanel] verifyOnChain error:', e);\n    } finally {\n      setChainLoading(false);\n    }\n  }, [onVerifyChain, apiBaseUrl]);\n\n  // 语言同步\n  useEffect(() => {\n    setCurrentLanguage(normalizeLanguage(initialLanguage));\n  }, [initialLanguage]);\n\n  // 订阅全局语言变更\n  useEffect(() => {\n    if (typeof window === 'undefined') return;\n    const handler = e => {\n      const newLang = e.detail?.language;\n      if (newLang) setCurrentLanguage(normalizeLanguage(newLang));\n    };\n    window.addEventListener('qbit-did:language-change', handler);\n    return () => window.removeEventListener('qbit-did:language-change', handler);\n  }, []);\n\n  // 加载链上状态\n  useEffect(() => {\n    if (user?.did && showChainStatus) {\n      handleVerifyChain(user.did);\n    }\n  }, [user?.did, showChainStatus, handleVerifyChain]);\n  const msg = panelMessages[currentLanguage] || panelMessages.zh;\n\n  // 复制到剪贴板\n  const handleCopy = useCallback(async (text, field) => {\n    try {\n      await navigator.clipboard.writeText(text);\n      setCopiedField(field);\n      setTimeout(() => setCopiedField(null), 2000);\n    } catch (e) {\n      // 降级方案\n      const textarea = document.createElement('textarea');\n      textarea.value = text;\n      document.body.appendChild(textarea);\n      textarea.select();\n      document.execCommand('copy');\n      document.body.removeChild(textarea);\n      setCopiedField(field);\n      setTimeout(() => setCopiedField(null), 2000);\n    }\n  }, []);\n  const handleNavigate = useCallback(path => {\n    onNavigate?.(path);\n  }, [onNavigate]);\n  if (!user) return null;\n  const displayName = getUserDisplayName(user);\n  const walletAddress = user.wallet_address || user.walletAddress || user.wallets?.[0]?.address;\n  const reputationScore = user.reputation_score || user.reputationScore || user.reputation || 0;\n  const reputationLevel = user.reputation_level || user.reputationLevel || user.level || 1;\n  const credentialCount = user.credential_count || user.credentialCount || user.credentials?.length || 0;\n\n  // 快捷操作菜单（允许外部完全替换）\n  const quickActions = customQuickActions || [{\n    key: 'profile',\n    label: msg.profile,\n    icon: /*#__PURE__*/jsx(IdCardIcon, {\n      size: 18\n    }),\n    onClick: () => handleNavigate('/dashboard/profile')\n  }, {\n    key: 'credentials',\n    label: msg.credentials,\n    icon: /*#__PURE__*/jsx(VerifiedIcon, {\n      size: 18\n    }),\n    onClick: () => handleNavigate('/dashboard/credentials'),\n    badge: credentialCount > 0 ? credentialCount : null\n  }, {\n    key: 'wallets',\n    label: msg.wallets,\n    icon: /*#__PURE__*/jsx(WalletIcon, {\n      size: 18\n    }),\n    onClick: () => handleNavigate('/dashboard/wallets')\n  }, {\n    key: 'security',\n    label: msg.security,\n    icon: /*#__PURE__*/jsx(KeyIcon, {\n      size: 18\n    }),\n    onClick: () => handleNavigate('/dashboard/security')\n  }, {\n    key: 'settings',\n    label: msg.settings,\n    icon: /*#__PURE__*/jsx(SettingsIcon, {\n      size: 18\n    }),\n    onClick: () => handleNavigate('/dashboard/settings')\n  }, ...extraMenuItems];\n  return /*#__PURE__*/jsxs(\"div\", {\n    className: `did-profile-panel did-profile-${mode} ${className}`,\n    children: [/*#__PURE__*/jsxs(\"div\", {\n      className: \"did-profile-header\",\n      children: [onClose && /*#__PURE__*/jsx(\"button\", {\n        className: \"did-profile-close\",\n        onClick: onClose,\n        children: /*#__PURE__*/jsx(CloseIcon, {\n          size: 18\n        })\n      }), /*#__PURE__*/jsxs(\"div\", {\n        className: \"did-profile-identity\",\n        children: [/*#__PURE__*/jsxs(\"div\", {\n          className: \"did-profile-avatar\",\n          children: [user.avatar || user.avatar_url ? /*#__PURE__*/jsx(\"img\", {\n            src: user.avatar || user.avatar_url,\n            alt: displayName\n          }) : /*#__PURE__*/jsx(\"span\", {\n            className: \"did-profile-avatar-initial\",\n            children: getAvatarInitial(user)\n          }), user.verified && /*#__PURE__*/jsx(\"span\", {\n            className: \"did-profile-verified-badge\",\n            children: /*#__PURE__*/jsx(VerifiedIcon, {\n              size: 12\n            })\n          })]\n        }), /*#__PURE__*/jsxs(\"div\", {\n          className: \"did-profile-info\",\n          children: [/*#__PURE__*/jsxs(\"h3\", {\n            className: \"did-profile-name\",\n            children: [displayName, user.verified && /*#__PURE__*/jsx(VerifiedIcon, {\n              size: 14\n            })]\n          }), user.did && /*#__PURE__*/jsxs(\"div\", {\n            className: \"did-profile-did-row\",\n            children: [/*#__PURE__*/jsx(\"span\", {\n              className: \"did-profile-did-label\",\n              children: msg.didLabel\n            }), /*#__PURE__*/jsx(\"span\", {\n              className: \"did-profile-did-value\",\n              children: formatDID$1(user.did, 16)\n            }), /*#__PURE__*/jsx(\"button\", {\n              className: \"did-profile-copy-btn\",\n              onClick: () => handleCopy(user.did, 'did'),\n              title: copiedField === 'did' ? msg.copied : msg.copy,\n              children: copiedField === 'did' ? '✓' : '📋'\n            })]\n          }), walletAddress && /*#__PURE__*/jsxs(\"div\", {\n            className: \"did-profile-wallet-row\",\n            children: [/*#__PURE__*/jsx(WalletIcon, {\n              size: 12\n            }), /*#__PURE__*/jsx(\"span\", {\n              className: \"did-profile-wallet-value\",\n              children: formatAddress(walletAddress)\n            }), /*#__PURE__*/jsx(\"button\", {\n              className: \"did-profile-copy-btn\",\n              onClick: () => handleCopy(walletAddress, 'wallet'),\n              title: copiedField === 'wallet' ? msg.copied : msg.copy,\n              children: copiedField === 'wallet' ? '✓' : '📋'\n            })]\n          })]\n        })]\n      }), /*#__PURE__*/jsxs(\"div\", {\n        className: \"did-profile-stats\",\n        children: [/*#__PURE__*/jsxs(\"div\", {\n          className: \"did-profile-stat\",\n          children: [/*#__PURE__*/jsx(StarIcon, {\n            size: 16\n          }), /*#__PURE__*/jsx(\"span\", {\n            className: \"did-profile-stat-value\",\n            children: reputationScore\n          }), /*#__PURE__*/jsx(\"span\", {\n            className: \"did-profile-stat-label\",\n            children: msg.reputation\n          })]\n        }), /*#__PURE__*/jsx(\"div\", {\n          className: \"did-profile-stat-divider\"\n        }), /*#__PURE__*/jsxs(\"div\", {\n          className: \"did-profile-stat\",\n          children: [/*#__PURE__*/jsx(ShieldIcon, {\n            size: 16\n          }), /*#__PURE__*/jsxs(\"span\", {\n            className: \"did-profile-stat-value\",\n            children: [\"Lv.\", reputationLevel]\n          }), /*#__PURE__*/jsx(\"span\", {\n            className: \"did-profile-stat-label\",\n            children: msg.level\n          })]\n        }), /*#__PURE__*/jsx(\"div\", {\n          className: \"did-profile-stat-divider\"\n        }), /*#__PURE__*/jsxs(\"div\", {\n          className: \"did-profile-stat\",\n          children: [/*#__PURE__*/jsx(VerifiedIcon, {\n            size: 16\n          }), /*#__PURE__*/jsx(\"span\", {\n            className: \"did-profile-stat-value\",\n            children: credentialCount\n          }), /*#__PURE__*/jsx(\"span\", {\n            className: \"did-profile-stat-label\",\n            children: msg.credentials\n          })]\n        })]\n      })]\n    }), showChainStatus && user.did && /*#__PURE__*/jsx(\"div\", {\n      className: \"did-profile-chain-section\",\n      children: /*#__PURE__*/jsx(DIDChainStatusCard, {\n        did: user.did,\n        status: chainStatus,\n        loading: chainLoading,\n        onRefresh: () => handleVerifyChain(user.did),\n        apiBaseUrl: apiBaseUrl,\n        autoLoad: false,\n        language: currentLanguage\n      })\n    }), showQuickActions && /*#__PURE__*/jsx(\"div\", {\n      className: \"did-profile-actions\",\n      children: quickActions.map(action => /*#__PURE__*/jsxs(\"button\", {\n        className: `did-profile-action-item ${action.danger ? 'danger' : ''}`,\n        onClick: action.onClick,\n        children: [action.icon, /*#__PURE__*/jsx(\"span\", {\n          className: \"did-profile-action-label\",\n          children: action.label\n        }), action.badge != null && /*#__PURE__*/jsx(\"span\", {\n          className: \"did-profile-action-badge\",\n          children: action.badge\n        }), /*#__PURE__*/jsx(ArrowRightIcon, {\n          size: 14\n        })]\n      }, action.key))\n    }), /*#__PURE__*/jsxs(\"div\", {\n      className: \"did-profile-footer\",\n      children: [onSwitchAccount && /*#__PURE__*/jsxs(\"button\", {\n        className: \"did-profile-footer-btn\",\n        onClick: onSwitchAccount,\n        children: [/*#__PURE__*/jsx(SwapIcon, {\n          size: 16\n        }), /*#__PURE__*/jsx(\"span\", {\n          children: msg.switchAccount\n        })]\n      }), onLogout && /*#__PURE__*/jsxs(\"button\", {\n        className: \"did-profile-footer-btn danger\",\n        onClick: onLogout,\n        children: [/*#__PURE__*/jsx(LogoutIcon, {\n          size: 16\n        }), /*#__PURE__*/jsx(\"span\", {\n          children: msg.logout\n        })]\n      })]\n    })]\n  });\n}\n\n/**\n * QuantaBit Auth SDK - useLogin Hook\n * \n * 提供命令式的登录方法，便于在代码中调用\n */\n\n\n/**\n * useLogin Hook\n * \n * @param {Object} options\n * @param {string} options.apiBaseUrl - API 基础 URL\n * @param {Function} options.onSuccess - 登录成功回调\n * @param {Function} options.onError - 错误回调\n */\nfunction useLogin({\n  apiBaseUrl,\n  onSuccess,\n  onError\n} = {}) {\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState(null);\n\n  // 配置 API\n  if (apiBaseUrl) {\n    apiClient.configure({\n      apiBaseUrl\n    });\n  }\n\n  /**\n   * 钱包登录\n   */\n  const loginWithWallet = useCallback(async (chainType = 'quantabit') => {\n    setLoading(true);\n    setError(null);\n    try {\n      const {\n        address: walletAddress,\n        response: result\n      } = await loginWithBrowserWallet(apiClient, chainType);\n\n      // 保存 session\n      apiClient.setTokens(result.access_token, result.refresh_token);\n      setCurrentDID(result.did);\n      saveAccount({\n        did: result.did,\n        displayName: result.display_name || result.user?.nickname,\n        avatar: result.avatar || result.user?.avatar,\n        walletAddress,\n        verified: true\n      });\n      const successResult = {\n        success: true,\n        accessToken: result.access_token,\n        refreshToken: result.refresh_token,\n        did: result.did,\n        isNewUser: result.is_new_user,\n        user: result.user\n      };\n      onSuccess && onSuccess(successResult);\n      setLoading(false);\n      return successResult;\n    } catch (err) {\n      setError(err);\n      onError && onError(err);\n      setLoading(false);\n      return {\n        success: false,\n        error: err\n      };\n    }\n  }, [onSuccess, onError]);\n\n  /**\n   * DID 密码登录\n   */\n  const loginWithDID = useCallback(async (did, password, pin = null, totpCode = null) => {\n    setLoading(true);\n    setError(null);\n    let actualPin = pin;\n    let actualTotp = totpCode;\n\n    // Smart parsing for backwards compatibility (did, password, totpCode)\n    if (pin !== null && totpCode === null) {\n      const pinStr = String(pin).trim();\n      if (pinStr.length === 6 && !isNaN(pinStr)) {\n        actualPin = null;\n        actualTotp = pinStr;\n      }\n    }\n    try {\n      const loginRes = await apiClient.didLogin(did, password, actualPin, actualTotp);\n      const result = loginRes.data || loginRes;\n\n      // 保存 session\n      apiClient.setTokens(result.access_token, result.refresh_token);\n      setCurrentDID(result.did);\n      saveAccount({\n        did: result.did,\n        displayName: result.display_name || result.user?.nickname,\n        avatar: result.avatar || result.user?.avatar,\n        verified: true\n      });\n      const successResult = {\n        success: true,\n        accessToken: result.access_token,\n        refreshToken: result.refresh_token,\n        did: result.did,\n        isNewUser: false,\n        user: result.user\n      };\n      onSuccess && onSuccess(successResult);\n      setLoading(false);\n      return successResult;\n    } catch (err) {\n      setError(err);\n      onError && onError(err);\n      setLoading(false);\n      return {\n        success: false,\n        error: err\n      };\n    }\n  }, [onSuccess, onError]);\n\n  /**\n   * 注册新账户\n   */\n  const register = useCallback(async ({\n    nickname,\n    email,\n    password\n  }) => {\n    setLoading(true);\n    setError(null);\n    try {\n      const registerRes = await apiClient.register({\n        displayName: nickname,\n        email,\n        password\n      });\n      const result = registerRes.data || registerRes;\n\n      // 保存 session\n      apiClient.setTokens(result.access_token, result.refresh_token);\n      setCurrentDID(result.did);\n      saveAccount({\n        did: result.did,\n        displayName: nickname,\n        verified: true\n      });\n      const successResult = {\n        success: true,\n        accessToken: result.access_token,\n        refreshToken: result.refresh_token,\n        did: result.did,\n        isNewUser: true,\n        user: result.user\n      };\n      onSuccess && onSuccess(successResult);\n      setLoading(false);\n      return successResult;\n    } catch (err) {\n      setError(err);\n      onError && onError(err);\n      setLoading(false);\n      return {\n        success: false,\n        error: err\n      };\n    }\n  }, [onSuccess, onError]);\n\n  /**\n   * 登出\n   */\n  const logout = useCallback(async () => {\n    try {\n      await apiClient.logout();\n      return {\n        success: true\n      };\n    } catch (err) {\n      return {\n        success: false,\n        error: err\n      };\n    }\n  }, []);\n\n  /**\n   * 检查是否已登录\n   */\n  const isAuthenticated = useCallback(() => {\n    return apiClient.isAuthenticated();\n  }, []);\n\n  /**\n   * 获取当前用户信息\n   */\n  const getCurrentUser = useCallback(async () => {\n    if (!apiClient.isAuthenticated()) {\n      return null;\n    }\n    try {\n      const res = await apiClient.getMe();\n      return res.data || res;\n    } catch (err) {\n      return null;\n    }\n  }, []);\n  return {\n    loading,\n    error,\n    loginWithWallet,\n    loginWithDID,\n    register,\n    logout,\n    isAuthenticated,\n    getCurrentUser\n  };\n}\n\n/**\n * QuantaBit Auth SDK - Quick Connect Button\n * \n * 一个简单的快速连接按钮，集成了完整的登录功能\n * 登录后显示用户中心下拉菜单\n */\n\nfunction QuickConnectButton({\n  onSuccess,\n  onError,\n  onLogout,\n  onNavigate,\n  onOpenFullscreen,\n  user = null,\n  apiBaseUrl = '/api/v1',\n  appName = 'QuantaBit',\n  appLogo,\n  language: initialLanguage = 'zh',\n  buttonText,\n  variant = 'primary',\n  shape = 'default',\n  size = 'md',\n  colorScheme = 'indigo',\n  iconOnly = false,\n  className = '',\n  style = {},\n  modalMode = 'compact',\n  // compact | full\n  onModeChange,\n  theme = 'dark',\n  onThemeChange,\n  showToolbar = true,\n  menuItems = null,\n  defaultLoginType = 'did',\n  // wallet | did\n  triggerMode = 'modal',\n  // modal | wallet\n  chainType = 'quantabit'\n}) {\n  const [isModalOpen, setIsModalOpen] = useState(false);\n  const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n  const [currentTheme, setCurrentTheme] = useState(theme);\n  const [currentModalMode, setCurrentModalMode] = useState(modalMode);\n  const dropdownRef = useRef(null);\n  const handleSuccess = useCallback(result => {\n    setIsModalOpen(false);\n    onSuccess && onSuccess(result);\n  }, [onSuccess]);\n  const {\n    loginWithWallet,\n    loading: loginLoading\n  } = useLogin({\n    apiBaseUrl,\n    onSuccess: handleSuccess,\n    onError\n  });\n\n  // 语言状态 - 支持动态同步（自动归一化）\n  const [currentLanguage, setCurrentLanguage] = useState(() => normalizeLanguage(initialLanguage));\n  const prevLanguageRef = useRef(initialLanguage);\n\n  // 同步外部 props.language 变化 - 无条件更新（归一化）\n  useEffect(() => {\n    if (initialLanguage !== prevLanguageRef.current) {\n      prevLanguageRef.current = initialLanguage;\n      setCurrentLanguage(normalizeLanguage(initialLanguage));\n    }\n  }, [initialLanguage]);\n\n  // 订阅全局语言变更\n  useEffect(() => {\n    if (typeof window === 'undefined') return;\n    const LANGUAGE_CHANGE_EVENT = 'qbit-did:language-change';\n    const handler = e => {\n      const newLang = e.detail?.language;\n      if (newLang) {\n        const normalized = normalizeLanguage(newLang);\n        prevLanguageRef.current = normalized;\n        setCurrentLanguage(normalized);\n      }\n    };\n    window.addEventListener(LANGUAGE_CHANGE_EVENT, handler);\n    console.log('[QuickConnectButton] 已订阅语言变更事件');\n    return () => {\n      window.removeEventListener(LANGUAGE_CHANGE_EVENT, handler);\n    };\n  }, []);\n\n  // 同步外部 theme prop\n  useEffect(() => {\n    setCurrentTheme(theme);\n  }, [theme]);\n\n  // 同步外部 modalMode prop\n  useEffect(() => {\n    setCurrentModalMode(modalMode);\n  }, [modalMode]);\n\n  // 内部主题切换\n  const handleThemeChange = useCallback(newTheme => {\n    setCurrentTheme(newTheme);\n    onThemeChange && onThemeChange(newTheme);\n  }, [onThemeChange]);\n\n  // 内部模式切换\n  const handleModeChange = useCallback(newMode => {\n    setCurrentModalMode(newMode);\n    onModeChange && onModeChange(newMode);\n  }, [onModeChange]);\n\n  // 点击外部关闭下拉菜单\n  useEffect(() => {\n    const handleClickOutside = e => {\n      if (dropdownRef.current && !dropdownRef.current.contains(e.target)) {\n        setIsDropdownOpen(false);\n      }\n    };\n    if (isDropdownOpen) {\n      document.addEventListener('mousedown', handleClickOutside);\n    }\n    return () => document.removeEventListener('mousedown', handleClickOutside);\n  }, [isDropdownOpen]);\n  const handleClick = async () => {\n    if (triggerMode === 'wallet') {\n      await loginWithWallet(chainType);\n    } else {\n      setIsModalOpen(true);\n    }\n  };\n  const handleLogout = useCallback(() => {\n    setIsDropdownOpen(false);\n    onLogout && onLogout();\n  }, [onLogout]);\n  const handleNavigate = useCallback(path => {\n    setIsDropdownOpen(false);\n    onNavigate && onNavigate(path);\n  }, [onNavigate]);\n\n  // 自定义扩展菜单项（供宿主应用扩展使用）\n  const extraMenuItems = menuItems || [];\n\n  // 渲染 Modal 组件\n  const renderModal = () => {\n    // 使用 key 确保模式切换时组件重新创建，避免状态残留\n    // compact 模式使用简易的 DarkLoginModal\n    if (currentModalMode === 'compact') {\n      return /*#__PURE__*/jsx(DarkLoginModal, {\n        isOpen: isModalOpen,\n        onClose: () => setIsModalOpen(false),\n        onSuccess: handleSuccess,\n        onError: onError,\n        onLogout: handleLogout,\n        onOpenFullscreen: onOpenFullscreen,\n        onThemeChange: handleThemeChange,\n        onModeChange: handleModeChange,\n        theme: currentTheme,\n        showToolbar: showToolbar,\n        apiBaseUrl: apiBaseUrl,\n        appName: appName,\n        appLogo: appLogo,\n        language: currentLanguage,\n        showRegister: true,\n        currentUser: user,\n        defaultLoginType: defaultLoginType\n      }, `dark-modal-${currentLanguage}`);\n    }\n\n    // full 模式使用双栏的 LoginModal\n    return /*#__PURE__*/jsx(LoginModal, {\n      isOpen: isModalOpen,\n      onClose: () => setIsModalOpen(false),\n      onSuccess: handleSuccess,\n      onError: onError,\n      onLogout: handleLogout,\n      onModeChange: handleModeChange,\n      apiBaseUrl: apiBaseUrl,\n      appName: appName,\n      appLogo: appLogo,\n      language: currentLanguage,\n      currentUser: user,\n      showRegister: true\n    }, `login-modal-${currentLanguage}`);\n  };\n\n  // 已登录状态 - 显示昵称优先的用户中心\n  if (user) {\n    // 使用统一的 getUserDisplayName：昵称优先，DID 仅作次要信息\n    const displayName = getUserDisplayName(user);\n    const avatarInitial = displayName ? displayName[0].toUpperCase() : 'U';\n    return /*#__PURE__*/jsxs(\"div\", {\n      className: `did-user-center did-size-${size}`,\n      ref: dropdownRef,\n      children: [/*#__PURE__*/jsxs(\"button\", {\n        className: \"did-user-trigger\",\n        onClick: () => setIsDropdownOpen(!isDropdownOpen),\n        children: [/*#__PURE__*/jsx(\"div\", {\n          className: \"did-user-avatar\",\n          children: user.avatar || user.avatar_url ? /*#__PURE__*/jsx(\"img\", {\n            src: user.avatar || user.avatar_url,\n            alt: displayName\n          }) : /*#__PURE__*/jsx(\"span\", {\n            className: \"did-user-avatar-text\",\n            children: avatarInitial\n          })\n        }), /*#__PURE__*/jsx(\"span\", {\n          className: \"did-user-name\",\n          children: displayName\n        }), /*#__PURE__*/jsx(ChevronDownIcon, {\n          size: 16,\n          className: isDropdownOpen ? 'rotate' : ''\n        })]\n      }), isDropdownOpen && /*#__PURE__*/jsx(\"div\", {\n        className: \"did-user-dropdown\",\n        children: /*#__PURE__*/jsx(DIDProfilePanel, {\n          user: user,\n          onNavigate: path => {\n            setIsDropdownOpen(false);\n            handleNavigate(path);\n          },\n          onLogout: handleLogout,\n          onSwitchAccount: () => {\n            setIsDropdownOpen(false);\n            setIsModalOpen(true);\n          },\n          onClose: () => setIsDropdownOpen(false),\n          apiBaseUrl: apiBaseUrl,\n          language: currentLanguage,\n          mode: \"inline\",\n          showChainStatus: true,\n          showQuickActions: true,\n          extraMenuItems: extraMenuItems\n        })\n      }), renderModal()]\n    });\n  }\n\n  // 未登录状态\n  const defaultText = currentLanguage === 'zh' ? '连接身份' : 'Connect Identity';\n\n  // 根据 size 获取图标大小\n  const getIconSize = () => {\n    switch (size) {\n      case 'xs':\n        return 14;\n      case 'sm':\n        return 16;\n      case 'lg':\n        return 24;\n      case 'xl':\n        return 28;\n      default:\n        return 20;\n    }\n  };\n\n  // 构建按钮 class\n  const buttonClasses = ['did-quick-connect-btn', `did-variant-${variant}`, `did-size-${size}`, `did-shape-${shape}`, `did-color-${colorScheme}`, iconOnly && 'did-icon-only', className].filter(Boolean).join(' ');\n  return /*#__PURE__*/jsxs(Fragment, {\n    children: [/*#__PURE__*/jsx(\"button\", {\n      className: buttonClasses,\n      style: style,\n      onClick: handleClick,\n      disabled: loginLoading,\n      \"aria-label\": buttonText || defaultText,\n      children: loginLoading ? /*#__PURE__*/jsxs(Fragment, {\n        children: [/*#__PURE__*/jsx(LoaderIcon, {\n          className: \"spin\",\n          size: getIconSize()\n        }), !iconOnly && /*#__PURE__*/jsx(\"span\", {\n          children: \"\\u7531\\u4E8E\\u8FDE\\u63A5\\u4E2D...\"\n        })]\n      }) : iconOnly || shape === 'circle' ? /*#__PURE__*/jsx(WalletIcon, {\n        size: getIconSize()\n      }) : variant === 'minimal' ? /*#__PURE__*/jsx(WalletIcon, {\n        size: getIconSize()\n      }) : /*#__PURE__*/jsxs(Fragment, {\n        children: [/*#__PURE__*/jsx(ShieldIcon, {\n          size: getIconSize()\n        }), /*#__PURE__*/jsx(\"span\", {\n          children: buttonText || defaultText\n        })]\n      })\n    }), renderModal()]\n  });\n}\n\nfunction DidWalletConnectButton({\n  buttonText = '使用 DID 登录',\n  className = '',\n  // 预设默认值，但允许覆盖\n  variant = 'gradient',\n  shape = 'pill',\n  size = 'md',\n  colorScheme = 'indigo',\n  modalMode = 'full',\n  theme = 'dark',\n  showToolbar = true,\n  ...props\n}) {\n  return /*#__PURE__*/jsx(QuickConnectButton, {\n    variant: variant,\n    shape: shape,\n    size: size,\n    colorScheme: colorScheme,\n    modalMode: modalMode,\n    theme: theme,\n    showToolbar: showToolbar,\n    buttonText: buttonText,\n    className: `did-wallet-connect-btn ${className}`,\n    ...props\n  });\n}\n\n/**\n * QuantaBit Auth SDK - AccountSwitcher 组件\n * \n * 多账户快速切换组件，提供：\n * - 当前账户显示\n * - 快速切换下拉\n * - 添加新账户\n * - 账户管理入口\n */\n\nfunction AccountSwitcher({\n  currentUser,\n  onSwitch,\n  onAddNew,\n  onLogout,\n  onManage,\n  language = 'zh',\n  position = 'bottom-right',\n  compact = false\n}) {\n  const [isOpen, setIsOpen] = useState(false);\n  const [accounts, setAccounts] = useState([]);\n  const dropdownRef = useRef(null);\n  const messages = {\n    zh: {\n      switchAccount: '切换账户',\n      addAccount: '添加账户',\n      manageAccounts: '管理账户',\n      logout: '退出登录',\n      noOtherAccounts: '没有其他账户',\n      verified: '已验证',\n      current: '当前'\n    },\n    en: {\n      switchAccount: 'Switch Account',\n      addAccount: 'Add Account',\n      manageAccounts: 'Manage Accounts',\n      logout: 'Logout',\n      noOtherAccounts: 'No other accounts',\n      verified: 'Verified',\n      current: 'Current'\n    }\n  };\n  const msg = messages[language] || messages.zh;\n\n  // 加载账户列表\n  useEffect(() => {\n    setAccounts(getSavedAccounts());\n  }, [isOpen]);\n\n  // 点击外部关闭\n  useEffect(() => {\n    const handleClickOutside = event => {\n      if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {\n        setIsOpen(false);\n      }\n    };\n    document.addEventListener('mousedown', handleClickOutside);\n    return () => document.removeEventListener('mousedown', handleClickOutside);\n  }, []);\n  const otherAccounts = accounts.filter(a => a.did !== currentUser?.did);\n  const handleSwitch = account => {\n    setIsOpen(false);\n    onSwitch?.(account);\n  };\n  const handleAddNew = () => {\n    setIsOpen(false);\n    onAddNew?.();\n  };\n  const handleLogout = () => {\n    setIsOpen(false);\n    clearCurrentSession();\n    onLogout?.();\n  };\n  const handleManage = () => {\n    setIsOpen(false);\n    onManage?.();\n  };\n  const handleRemove = (did, e) => {\n    e.stopPropagation();\n    removeAccount(did);\n    setAccounts(getSavedAccounts());\n  };\n  if (!currentUser) {\n    return null;\n  }\n  return /*#__PURE__*/jsxs(\"div\", {\n    className: \"did-account-switcher\",\n    ref: dropdownRef,\n    children: [/*#__PURE__*/jsxs(\"button\", {\n      className: `did-switcher-trigger ${compact ? 'compact' : ''}`,\n      onClick: () => setIsOpen(!isOpen),\n      children: [/*#__PURE__*/jsx(\"div\", {\n        className: \"did-switcher-avatar\",\n        children: currentUser.avatar ? /*#__PURE__*/jsx(\"img\", {\n          src: currentUser.avatar,\n          alt: \"\"\n        }) : /*#__PURE__*/jsx(\"span\", {\n          className: \"did-avatar-placeholder\",\n          children: (currentUser.nickname || currentUser.displayName || 'U')[0].toUpperCase()\n        })\n      }), !compact && /*#__PURE__*/jsxs(\"div\", {\n        className: \"did-switcher-info\",\n        children: [/*#__PURE__*/jsx(\"span\", {\n          className: \"did-switcher-name\",\n          children: currentUser.nickname || currentUser.displayName || formatDID$1(currentUser.did)\n        }), /*#__PURE__*/jsx(\"span\", {\n          className: \"did-switcher-did\",\n          children: formatDID$1(currentUser.did)\n        })]\n      }), /*#__PURE__*/jsx(SwapIcon, {})]\n    }), isOpen && /*#__PURE__*/jsxs(\"div\", {\n      className: `did-switcher-dropdown ${position}`,\n      children: [/*#__PURE__*/jsxs(\"div\", {\n        className: \"did-dropdown-current\",\n        children: [/*#__PURE__*/jsx(\"div\", {\n          className: \"did-dropdown-avatar\",\n          children: currentUser.avatar ? /*#__PURE__*/jsx(\"img\", {\n            src: currentUser.avatar,\n            alt: \"\"\n          }) : /*#__PURE__*/jsx(\"span\", {\n            className: \"did-avatar-placeholder\",\n            children: (currentUser.nickname || currentUser.displayName || 'U')[0].toUpperCase()\n          })\n        }), /*#__PURE__*/jsxs(\"div\", {\n          className: \"did-dropdown-info\",\n          children: [/*#__PURE__*/jsxs(\"span\", {\n            className: \"did-dropdown-name\",\n            children: [currentUser.nickname || currentUser.displayName || formatDID$1(currentUser.did), /*#__PURE__*/jsx(VerifiedIcon, {})]\n          }), /*#__PURE__*/jsx(\"span\", {\n            className: \"did-dropdown-did\",\n            children: formatDID$1(currentUser.did)\n          })]\n        }), /*#__PURE__*/jsx(\"span\", {\n          className: \"did-current-badge\",\n          children: msg.current\n        })]\n      }), /*#__PURE__*/jsx(\"div\", {\n        className: \"did-dropdown-divider\"\n      }), otherAccounts.length > 0 ? /*#__PURE__*/jsx(\"div\", {\n        className: \"did-dropdown-accounts\",\n        children: otherAccounts.map(account => /*#__PURE__*/jsxs(\"div\", {\n          className: \"did-dropdown-account\",\n          onClick: () => handleSwitch(account),\n          children: [/*#__PURE__*/jsx(\"div\", {\n            className: \"did-dropdown-avatar small\",\n            children: account.avatar ? /*#__PURE__*/jsx(\"img\", {\n              src: account.avatar,\n              alt: \"\"\n            }) : /*#__PURE__*/jsx(\"span\", {\n              className: \"did-avatar-placeholder\",\n              children: (account.displayName || 'U')[0].toUpperCase()\n            })\n          }), /*#__PURE__*/jsxs(\"div\", {\n            className: \"did-dropdown-info\",\n            children: [/*#__PURE__*/jsxs(\"span\", {\n              className: \"did-dropdown-name\",\n              children: [account.displayName || formatDID$1(account.did), account.verified && /*#__PURE__*/jsx(VerifiedIcon, {})]\n            }), /*#__PURE__*/jsx(\"span\", {\n              className: \"did-dropdown-did\",\n              children: formatDID$1(account.did)\n            })]\n          }), /*#__PURE__*/jsx(\"button\", {\n            className: \"did-dropdown-remove\",\n            onClick: e => handleRemove(account.did, e),\n            title: \"Remove\",\n            children: /*#__PURE__*/jsx(TrashIcon, {})\n          })]\n        }, account.did))\n      }) : /*#__PURE__*/jsx(\"div\", {\n        className: \"did-dropdown-empty\",\n        children: msg.noOtherAccounts\n      }), /*#__PURE__*/jsx(\"div\", {\n        className: \"did-dropdown-divider\"\n      }), /*#__PURE__*/jsxs(\"div\", {\n        className: \"did-dropdown-actions\",\n        children: [/*#__PURE__*/jsxs(\"button\", {\n          className: \"did-dropdown-action\",\n          onClick: handleAddNew,\n          children: [/*#__PURE__*/jsx(PlusIcon, {}), /*#__PURE__*/jsx(\"span\", {\n            children: msg.addAccount\n          })]\n        }), onManage && /*#__PURE__*/jsxs(\"button\", {\n          className: \"did-dropdown-action\",\n          onClick: handleManage,\n          children: [/*#__PURE__*/jsx(SwapIcon, {}), /*#__PURE__*/jsx(\"span\", {\n            children: msg.manageAccounts\n          })]\n        }), /*#__PURE__*/jsxs(\"button\", {\n          className: \"did-dropdown-action danger\",\n          onClick: handleLogout,\n          children: [/*#__PURE__*/jsx(LogoutIcon, {}), /*#__PURE__*/jsx(\"span\", {\n            children: msg.logout\n          })]\n        })]\n      })]\n    }), /*#__PURE__*/jsx(\"style\", {\n      children: `\n        .did-account-switcher {\n          position: relative;\n          display: inline-block;\n        }\n\n        .did-switcher-trigger {\n          display: flex;\n          align-items: center;\n          gap: 10px;\n          padding: 8px 12px;\n          background: linear-gradient(135deg, rgba(99, 102, 241, 0.1), rgba(139, 92, 246, 0.1));\n          border: 1px solid rgba(99, 102, 241, 0.2);\n          border-radius: 12px;\n          cursor: pointer;\n          transition: all 0.2s;\n        }\n\n        .did-switcher-trigger:hover {\n          background: linear-gradient(135deg, rgba(99, 102, 241, 0.15), rgba(139, 92, 246, 0.15));\n          border-color: rgba(99, 102, 241, 0.3);\n        }\n\n        .did-switcher-trigger.compact {\n          padding: 6px;\n          gap: 6px;\n        }\n\n        .did-switcher-avatar {\n          width: 32px;\n          height: 32px;\n          border-radius: 50%;\n          overflow: hidden;\n          background: linear-gradient(135deg, #6366f1, #8b5cf6);\n        }\n\n        .did-switcher-avatar img {\n          width: 100%;\n          height: 100%;\n          object-fit: cover;\n        }\n\n        .did-avatar-placeholder {\n          width: 100%;\n          height: 100%;\n          display: flex;\n          align-items: center;\n          justify-content: center;\n          color: white;\n          font-weight: 600;\n          font-size: 14px;\n        }\n\n        .did-switcher-info {\n          display: flex;\n          flex-direction: column;\n          align-items: flex-start;\n          gap: 2px;\n        }\n\n        .did-switcher-name {\n          font-size: 14px;\n          font-weight: 500;\n          color: #333;\n        }\n\n        .did-switcher-did {\n          font-size: 11px;\n          color: #888;\n          font-family: monospace;\n        }\n\n        .did-switcher-dropdown {\n          position: absolute;\n          top: 100%;\n          width: 280px;\n          margin-top: 8px;\n          background: white;\n          border-radius: 14px;\n          box-shadow: 0 10px 40px rgba(0, 0, 0, 0.15);\n          border: 1px solid rgba(0, 0, 0, 0.08);\n          z-index: 1000;\n          overflow: hidden;\n          animation: slideDown 0.2s ease-out;\n        }\n\n        .did-switcher-dropdown.bottom-right {\n          right: 0;\n        }\n\n        .did-switcher-dropdown.bottom-left {\n          left: 0;\n        }\n\n        @keyframes slideDown {\n          from { opacity: 0; transform: translateY(-8px); }\n          to { opacity: 1; transform: translateY(0); }\n        }\n\n        .did-dropdown-current {\n          display: flex;\n          align-items: center;\n          gap: 10px;\n          padding: 14px;\n          background: linear-gradient(135deg, rgba(99, 102, 241, 0.05), rgba(139, 92, 246, 0.05));\n        }\n\n        .did-dropdown-avatar {\n          width: 40px;\n          height: 40px;\n          border-radius: 50%;\n          overflow: hidden;\n          background: linear-gradient(135deg, #6366f1, #8b5cf6);\n        }\n\n        .did-dropdown-avatar.small {\n          width: 32px;\n          height: 32px;\n        }\n\n        .did-dropdown-avatar img {\n          width: 100%;\n          height: 100%;\n          object-fit: cover;\n        }\n\n        .did-dropdown-info {\n          flex: 1;\n          min-width: 0;\n        }\n\n        .did-dropdown-name {\n          display: flex;\n          align-items: center;\n          gap: 4px;\n          font-size: 14px;\n          font-weight: 500;\n          color: #333;\n        }\n\n        .did-dropdown-name svg {\n          color: #22c55e;\n          width: 14px;\n          height: 14px;\n        }\n\n        .did-dropdown-did {\n          font-size: 11px;\n          color: #888;\n          font-family: monospace;\n        }\n\n        .did-current-badge {\n          padding: 3px 8px;\n          background: #dcfce7;\n          color: #16a34a;\n          font-size: 11px;\n          font-weight: 500;\n          border-radius: 10px;\n        }\n\n        .did-dropdown-divider {\n          height: 1px;\n          background: #f0f0f0;\n          margin: 0;\n        }\n\n        .did-dropdown-accounts {\n          max-height: 200px;\n          overflow-y: auto;\n        }\n\n        .did-dropdown-account {\n          display: flex;\n          align-items: center;\n          gap: 10px;\n          padding: 10px 14px;\n          cursor: pointer;\n          transition: background 0.15s;\n        }\n\n        .did-dropdown-account:hover {\n          background: rgba(99, 102, 241, 0.05);\n        }\n\n        .did-dropdown-remove {\n          opacity: 0;\n          padding: 4px;\n          background: none;\n          border: none;\n          cursor: pointer;\n          color: #dc2626;\n          transition: opacity 0.15s;\n        }\n\n        .did-dropdown-account:hover .did-dropdown-remove {\n          opacity: 1;\n        }\n\n        .did-dropdown-empty {\n          padding: 16px;\n          text-align: center;\n          color: #888;\n          font-size: 13px;\n        }\n\n        .did-dropdown-actions {\n          padding: 8px;\n        }\n\n        .did-dropdown-action {\n          display: flex;\n          align-items: center;\n          gap: 10px;\n          width: 100%;\n          padding: 10px 12px;\n          background: none;\n          border: none;\n          border-radius: 8px;\n          cursor: pointer;\n          font-size: 13px;\n          color: #555;\n          transition: all 0.15s;\n        }\n\n        .did-dropdown-action:hover {\n          background: #f5f5f5;\n        }\n\n        .did-dropdown-action.danger {\n          color: #dc2626;\n        }\n\n        .did-dropdown-action.danger:hover {\n          background: #fef2f2;\n        }\n      `\n    })]\n  });\n}\n\n/**\n * QuantaBit Auth Context\n * \n * 提供认证状态管理的 React Context\n */\n\nconst AuthContext = /*#__PURE__*/createContext(null);\n\n/**\n * Auth Provider 组件\n * \n * @param {Object} props\n * @param {string} props.apiBaseUrl - API 基础 URL\n * @param {Function} props.onLoginSuccess - 登录成功回调\n * @param {Function} props.onLogout - 登出回调\n * @param {React.ReactNode} props.children\n */\nfunction AuthProvider({\n  children,\n  apiBaseUrl,\n  onLoginSuccess,\n  onLogout: onLogoutCallback\n}) {\n  const [user, setUser] = useState(null);\n  const [loading, setLoading] = useState(true);\n  const [error, setError] = useState(null);\n\n  // 配置 API\n  useEffect(() => {\n    if (apiBaseUrl) {\n      authApi.configure({\n        apiBaseUrl\n      });\n    }\n  }, [apiBaseUrl]);\n\n  // 初始化时检查认证状态\n  useEffect(() => {\n    checkAuth();\n  }, []);\n\n  /**\n   * 检查认证状态\n   */\n  const checkAuth = useCallback(async () => {\n    if (!authApi.isAuthenticated()) {\n      setLoading(false);\n      return;\n    }\n    try {\n      const response = await authApi.getMe();\n      const userData = response.data || response;\n      setUser(userData);\n      setError(null);\n    } catch (err) {\n      console.error('[AuthProvider] Auth check failed:', err);\n      setUser(null);\n      if (err.message?.includes('401') || err.message?.includes('Unauthorized')) {\n        authApi.clearTokens();\n      }\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  /**\n   * 登录处理\n   */\n  const login = useCallback(async (accessToken, refreshToken, userData = null) => {\n    authApi.setTokens(accessToken, refreshToken);\n    if (userData) {\n      setUser(userData);\n    } else {\n      await checkAuth();\n    }\n    onLoginSuccess && onLoginSuccess({\n      accessToken,\n      refreshToken,\n      user: userData || user\n    });\n  }, [checkAuth, onLoginSuccess, user]);\n\n  /**\n   * 登出处理\n   */\n  const logout = useCallback(async () => {\n    try {\n      await authApi.logout();\n    } catch (e) {\n      // Ignore errors\n    }\n    setUser(null);\n    onLogoutCallback && onLogoutCallback();\n  }, [onLogoutCallback]);\n\n  /**\n   * 更新用户信息\n   */\n  const updateUser = useCallback(updates => {\n    setUser(prev => prev ? {\n      ...prev,\n      ...updates\n    } : null);\n  }, []);\n  const value = {\n    user,\n    loading,\n    error,\n    isAuthenticated: !!user,\n    login,\n    logout,\n    checkAuth,\n    updateUser\n  };\n  return /*#__PURE__*/jsx(AuthContext.Provider, {\n    value: value,\n    children: children\n  });\n}\n\n/**\n * useAuth Hook\n */\nfunction useAuth() {\n  const context = useContext(AuthContext);\n  if (!context) {\n    throw new Error('useAuth must be used within an AuthProvider');\n  }\n  return context;\n}\n\n/**\n * QuantaBit Auth SDK - useAccounts Hook\n * \n * 多账户管理 Hook，提供：\n * - 账户列表管理\n * - 账户切换\n * - 快速登录\n * - 账户移除\n * - 当前会话管理\n */\n\nconst MAX_ACCOUNTS = 5;\n\n/**\n * useAccounts Hook\n * \n * @param {Object} options\n * @param {string} options.apiBaseUrl - API 基础 URL\n * @param {Function} options.onSwitchSuccess - 切换成功回调\n * @param {Function} options.onSwitchError - 切换错误回调\n * @param {Function} options.onLogout - 登出回调\n * @returns {Object} 账户管理方法和状态\n */\nfunction useAccounts({\n  apiBaseUrl,\n  onSwitchSuccess,\n  onSwitchError,\n  onLogout\n} = {}) {\n  const [accounts, setAccounts] = useState([]);\n  const [currentAccount, setCurrentAccount] = useState(null);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState(null);\n\n  // 配置 API\n  useEffect(() => {\n    if (apiBaseUrl) {\n      apiClient.configure({\n        apiBaseUrl\n      });\n    }\n  }, [apiBaseUrl]);\n\n  // 初始化加载账户\n  useEffect(() => {\n    loadAccounts();\n    loadCurrentSession();\n  }, []);\n\n  /**\n   * 加载保存的账户列表\n   */\n  const loadAccounts = useCallback(() => {\n    const savedAccounts = getSavedAccounts();\n    setAccounts(savedAccounts);\n    return savedAccounts;\n  }, []);\n\n  /**\n   * 加载当前会话\n   */\n  const loadCurrentSession = useCallback(() => {\n    const session = getCurrentSession();\n    if (session) {\n      const account = getSavedAccounts().find(a => a.did === session.did);\n      setCurrentAccount(account || {\n        did: session.did\n      });\n    } else {\n      setCurrentAccount(null);\n    }\n    return session;\n  }, []);\n\n  /**\n   * 添加账户\n   */\n  const addAccount = useCallback(account => {\n    saveAccount({\n      ...account,\n      addedAt: new Date().toISOString()\n    });\n    loadAccounts();\n  }, [loadAccounts]);\n\n  /**\n   * 删除账户\n   */\n  const deleteAccount = useCallback(did => {\n    removeAccount(did);\n    loadAccounts();\n\n    // 如果删除的是当前账户，清除会话\n    if (currentAccount?.did === did) {\n      clearCurrentSession();\n      setCurrentAccount(null);\n    }\n  }, [currentAccount, loadAccounts]);\n\n  /**\n   * 切换账户 - 需要重新登录\n   */\n  const switchAccount = useCallback(async (did, password) => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.didLogin(did, password);\n      const data = result.data || result;\n\n      // 保存新 session\n      apiClient.setTokens(data.access_token, data.refresh_token);\n      setCurrentDID(data.did);\n\n      // 更新账户信息\n      saveAccount({\n        did: data.did,\n        displayName: data.display_name || data.user?.nickname,\n        avatar: data.avatar || data.user?.avatar,\n        verified: true,\n        lastLoginAt: new Date().toISOString()\n      });\n      loadAccounts();\n      loadCurrentSession();\n      const successResult = {\n        success: true,\n        accessToken: data.access_token,\n        refreshToken: data.refresh_token,\n        did: data.did,\n        user: data.user\n      };\n      onSwitchSuccess?.(successResult);\n      setLoading(false);\n      return successResult;\n    } catch (err) {\n      setError(err);\n      onSwitchError?.(err);\n      setLoading(false);\n      return {\n        success: false,\n        error: err\n      };\n    }\n  }, [loadAccounts, loadCurrentSession, onSwitchSuccess, onSwitchError]);\n\n  /**\n   * 快速切换账户 - 使用保存的 refresh token\n   */\n  const quickSwitch = useCallback(async did => {\n    const account = accounts.find(a => a.did === did);\n    if (!account) {\n      const err = new Error('Account not found');\n      setError(err);\n      return {\n        success: false,\n        error: err\n      };\n    }\n\n    // 如果账户有保存的 refresh token，尝试使用它\n    if (account.refreshToken) {\n      setLoading(true);\n      setError(null);\n      try {\n        const result = await apiClient.refreshToken(account.refreshToken);\n        const data = result.data || result;\n        apiClient.setTokens(data.access_token, data.refresh_token);\n        setCurrentDID(account.did);\n\n        // 更新 refresh token\n        saveAccount({\n          ...account,\n          refreshToken: data.refresh_token,\n          lastLoginAt: new Date().toISOString()\n        });\n        loadAccounts();\n        loadCurrentSession();\n        const successResult = {\n          success: true,\n          accessToken: data.access_token,\n          refreshToken: data.refresh_token,\n          did: account.did\n        };\n        onSwitchSuccess?.(successResult);\n        setLoading(false);\n        return successResult;\n      } catch (err) {\n        // Refresh token 过期，需要重新登录\n        setError(err);\n        setLoading(false);\n        return {\n          success: false,\n          error: err,\n          requiresPassword: true\n        };\n      }\n    }\n\n    // 没有 refresh token，需要密码登录\n    return {\n      success: false,\n      requiresPassword: true\n    };\n  }, [accounts, loadAccounts, loadCurrentSession, onSwitchSuccess]);\n\n  /**\n   * 登出当前账户\n   */\n  const logout = useCallback(async () => {\n    setLoading(true);\n    try {\n      await apiClient.logout();\n    } catch {\n      // Ignore logout errors\n    }\n    clearCurrentSession();\n    setCurrentAccount(null);\n    setLoading(false);\n    onLogout?.();\n  }, [onLogout]);\n\n  /**\n   * 登出所有账户\n   */\n  const logoutAll = useCallback(async () => {\n    setLoading(true);\n    try {\n      await apiClient.logout();\n    } catch {\n      // Ignore\n    }\n    clearCurrentSession();\n    setCurrentAccount(null);\n\n    // 清除所有保存的 refresh tokens\n    const cleanedAccounts = accounts.map(a => ({\n      ...a,\n      refreshToken: undefined\n    }));\n    cleanedAccounts.forEach(a => saveAccount(a));\n    loadAccounts();\n    setLoading(false);\n    onLogout?.();\n  }, [accounts, loadAccounts, onLogout]);\n\n  /**\n   * 获取其他账户（排除当前账户）\n   */\n  const getOtherAccounts = useCallback(() => {\n    if (!currentAccount) return accounts;\n    return accounts.filter(a => a.did !== currentAccount.did);\n  }, [accounts, currentAccount]);\n\n  /**\n   * 设置账户显示名称\n   */\n  const setAccountDisplayName = useCallback((did, displayName) => {\n    const account = accounts.find(a => a.did === did);\n    if (account) {\n      saveAccount({\n        ...account,\n        displayName\n      });\n      loadAccounts();\n    }\n  }, [accounts, loadAccounts]);\n\n  /**\n   * 设置账户头像\n   */\n  const setAccountAvatar = useCallback((did, avatar) => {\n    const account = accounts.find(a => a.did === did);\n    if (account) {\n      saveAccount({\n        ...account,\n        avatar\n      });\n      loadAccounts();\n    }\n  }, [accounts, loadAccounts]);\n\n  /**\n   * 检查账户是否是当前登录账户\n   */\n  const isCurrentAccount = useCallback(did => {\n    return currentAccount?.did === did;\n  }, [currentAccount]);\n\n  /**\n   * 获取账户数量\n   */\n  const getAccountCount = useCallback(() => {\n    return accounts.length;\n  }, [accounts]);\n\n  /**\n   * 检查是否可以添加更多账户\n   */\n  const canAddMore = useCallback(() => {\n    return accounts.length < MAX_ACCOUNTS;\n  }, [accounts]);\n  return {\n    // 状态\n    accounts,\n    currentAccount,\n    loading,\n    error,\n    // 账户操作\n    loadAccounts,\n    addAccount,\n    deleteAccount,\n    // 切换操作\n    switchAccount,\n    quickSwitch,\n    // 登出操作\n    logout,\n    logoutAll,\n    // 辅助方法\n    getOtherAccounts,\n    setAccountDisplayName,\n    setAccountAvatar,\n    isCurrentAccount,\n    getAccountCount,\n    canAddMore,\n    // 常量\n    maxAccounts: MAX_ACCOUNTS\n  };\n}\n\n/**\n * QuantaBit Auth SDK - useProfile Hook\n * \n * 用户资料管理 Hook：\n * - 获取用户资料\n * - 更新资料\n * - 隐私设置\n * - 头像上传\n */\n\n\n/**\n * useProfile Hook\n * \n * @param {Object} options\n * @param {string} options.apiBaseUrl - API 基础 URL\n * @param {boolean} options.autoLoad - 是否自动加载（默认 true）\n * @returns {Object} 用户资料管理方法和状态\n */\nfunction useProfile({\n  apiBaseUrl,\n  autoLoad = true\n} = {}) {\n  const [profile, setProfile] = useState(null);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState(null);\n\n  // 配置 API\n  useEffect(() => {\n    if (apiBaseUrl) {\n      apiClient.configure({\n        apiBaseUrl\n      });\n    }\n  }, [apiBaseUrl]);\n\n  /**\n   * 加载用户资料\n   */\n  const fetchProfile = useCallback(async () => {\n    if (!apiClient.isAuthenticated()) {\n      return null;\n    }\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.getProfile();\n      const data = result.data || result;\n      setProfile(data);\n      return data;\n    } catch (err) {\n      setError(err);\n      return null;\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  /**\n   * 更新用户资料\n   */\n  const updateProfile = useCallback(async updates => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.updateProfile(updates);\n      const data = result.data || result;\n      setProfile(prev => ({\n        ...prev,\n        ...data\n      }));\n      return {\n        success: true,\n        data\n      };\n    } catch (err) {\n      setError(err);\n      return {\n        success: false,\n        error: err\n      };\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  /**\n   * 获取公开资料\n   */\n  const getPublicProfile = useCallback(async did => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.getPublicProfile(did);\n      return result.data || result;\n    } catch (err) {\n      setError(err);\n      return null;\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  /**\n   * 更新隐私设置\n   */\n  const updatePrivacySettings = useCallback(async settings => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.updatePrivacySettings(settings);\n      const data = result.data || result;\n      setProfile(prev => ({\n        ...prev,\n        privacySettings: data.privacy_settings || data\n      }));\n      return {\n        success: true,\n        data\n      };\n    } catch (err) {\n      setError(err);\n      return {\n        success: false,\n        error: err\n      };\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  /**\n   * 上传头像\n   */\n  const uploadAvatar = useCallback(async file => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.uploadAvatar(file);\n      const data = result.data || result;\n      setProfile(prev => ({\n        ...prev,\n        avatarUrl: data.avatar_url || data.avatarUrl\n      }));\n      return {\n        success: true,\n        avatarUrl: data.avatar_url || data.avatarUrl\n      };\n    } catch (err) {\n      setError(err);\n      return {\n        success: false,\n        error: err\n      };\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  // 自动加载\n  useEffect(() => {\n    if (autoLoad && apiClient.isAuthenticated()) {\n      fetchProfile();\n    }\n  }, [autoLoad, fetchProfile]);\n  return {\n    profile,\n    loading,\n    error,\n    fetchProfile,\n    updateProfile,\n    getPublicProfile,\n    updatePrivacySettings,\n    uploadAvatar,\n    // 便捷属性\n    displayName: profile?.displayName || profile?.display_name,\n    avatar: profile?.avatarUrl || profile?.avatar_url,\n    email: profile?.email,\n    emailVerified: profile?.emailVerified || profile?.email_verified,\n    did: profile?.did\n  };\n}\n\n/**\n * QuantaBit Auth SDK - useReputation Hook\n * \n * 声誉系统 Hook：\n * - 获取声誉分数\n * - 获取徽章\n * - 查看排行榜\n * - 获取历史记录\n */\n\n\n/**\n * useReputation Hook\n * \n * @param {Object} options\n * @param {string} options.apiBaseUrl - API 基础 URL\n * @param {boolean} options.autoLoad - 是否自动加载（默认 true）\n * @returns {Object} 声誉管理方法和状态\n */\nfunction useReputation({\n  apiBaseUrl,\n  autoLoad = true\n} = {}) {\n  const [reputation, setReputation] = useState(null);\n  const [badges, setBadges] = useState([]);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState(null);\n\n  // 配置 API\n  useEffect(() => {\n    if (apiBaseUrl) {\n      apiClient.configure({\n        apiBaseUrl\n      });\n    }\n  }, [apiBaseUrl]);\n\n  /**\n   * 获取当前用户声誉\n   */\n  const fetchReputation = useCallback(async () => {\n    if (!apiClient.isAuthenticated()) {\n      return null;\n    }\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.getMyReputation();\n      const data = result.data || result;\n      setReputation(data);\n      return data;\n    } catch (err) {\n      setError(err);\n      return null;\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  /**\n   * 获取用户声誉（其他用户）\n   */\n  const getReputation = useCallback(async did => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.getReputation(did);\n      return result.data || result;\n    } catch (err) {\n      setError(err);\n      return null;\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  /**\n   * 获取当前用户徽章\n   */\n  const fetchBadges = useCallback(async () => {\n    if (!apiClient.isAuthenticated()) {\n      return [];\n    }\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.getMyBadges();\n      const data = result.data?.badges || result.badges || result;\n      setBadges(Array.isArray(data) ? data : []);\n      return data;\n    } catch (err) {\n      setError(err);\n      return [];\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  /**\n   * 获取排行榜\n   */\n  const getLeaderboard = useCallback(async (dimension = 'overall', limit = 20) => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.getLeaderboard(dimension, limit);\n      return result.data || result;\n    } catch (err) {\n      setError(err);\n      return [];\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  /**\n   * 获取声誉历史\n   */\n  const getHistory = useCallback(async (startDate, endDate) => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.getReputationHistory(startDate, endDate);\n      return result.data || result;\n    } catch (err) {\n      setError(err);\n      return [];\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  /**\n   * 刷新所有数据\n   */\n  const refresh = useCallback(async () => {\n    await Promise.all([fetchReputation(), fetchBadges()]);\n  }, [fetchReputation, fetchBadges]);\n\n  // 自动加载\n  useEffect(() => {\n    if (autoLoad && apiClient.isAuthenticated()) {\n      refresh();\n    }\n  }, [autoLoad, refresh]);\n  return {\n    reputation,\n    badges,\n    loading,\n    error,\n    fetchReputation,\n    getReputation,\n    fetchBadges,\n    getLeaderboard,\n    getHistory,\n    refresh,\n    // 便捷属性\n    score: reputation?.overall_score || reputation?.overallScore || 0,\n    level: reputation?.level || 'newcomer',\n    rank: reputation?.rank,\n    badgeCount: badges.length,\n    // 分项分数\n    scores: {\n      governance: reputation?.governance_score || reputation?.governanceScore || 0,\n      contribution: reputation?.contribution_score || reputation?.contributionScore || 0,\n      verification: reputation?.verification_score || reputation?.verificationScore || 0,\n      social: reputation?.social_score || reputation?.socialScore || 0\n    }\n  };\n}\n\n/**\n * QuantaBit Auth SDK - useCredentials Hook\n * \n * 凭证管理 Hook：\n * - 获取凭证列表\n * - 获取凭证详情\n * - 创建可验证展示\n * - 验证展示\n * - 请求凭证\n */\n\n\n/**\n * useCredentials Hook\n * \n * @param {Object} options\n * @param {string} options.apiBaseUrl - API 基础 URL\n * @param {boolean} options.autoLoad - 是否自动加载（默认 true）\n * @returns {Object} 凭证管理方法和状态\n */\nfunction useCredentials({\n  apiBaseUrl,\n  autoLoad = true\n} = {}) {\n  const [credentials, setCredentials] = useState([]);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState(null);\n\n  // 配置 API\n  useEffect(() => {\n    if (apiBaseUrl) {\n      apiClient.configure({\n        apiBaseUrl\n      });\n    }\n  }, [apiBaseUrl]);\n\n  /**\n   * 获取凭证列表\n   */\n  const fetchCredentials = useCallback(async type => {\n    if (!apiClient.isAuthenticated()) {\n      return [];\n    }\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.getCredentials(type);\n      const data = result.data?.credentials || result.credentials || result;\n      setCredentials(Array.isArray(data) ? data : []);\n      return data;\n    } catch (err) {\n      setError(err);\n      return [];\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  /**\n   * 获取单个凭证详情\n   */\n  const getCredential = useCallback(async credentialId => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.getCredential(credentialId);\n      return result.data || result;\n    } catch (err) {\n      setError(err);\n      return null;\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  /**\n   * 创建可验证展示\n   */\n  const createPresentation = useCallback(async (credentialIds, options = {}) => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.createPresentation(credentialIds, options.disclosedFields, options.challenge, options.domain);\n      return {\n        success: true,\n        data: result.data || result\n      };\n    } catch (err) {\n      setError(err);\n      return {\n        success: false,\n        error: err\n      };\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  /**\n   * 验证可验证展示\n   */\n  const verifyPresentation = useCallback(async presentation => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.verifyPresentation(presentation);\n      return {\n        success: true,\n        data: result.data || result\n      };\n    } catch (err) {\n      setError(err);\n      return {\n        success: false,\n        error: err\n      };\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  /**\n   * 请求凭证\n   */\n  const requestCredential = useCallback(async (issuer, type, claims) => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.requestCredential(issuer, type, claims);\n      await fetchCredentials(); // 刷新列表\n      return {\n        success: true,\n        data: result.data || result\n      };\n    } catch (err) {\n      setError(err);\n      return {\n        success: false,\n        error: err\n      };\n    } finally {\n      setLoading(false);\n    }\n  }, [fetchCredentials]);\n\n  /**\n   * 撤销凭证\n   */\n  const revokeCredential = useCallback(async (credentialId, reason) => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.revokeCredential(credentialId, reason);\n      await fetchCredentials(); // 刷新列表\n      return {\n        success: true,\n        data: result.data || result\n      };\n    } catch (err) {\n      setError(err);\n      return {\n        success: false,\n        error: err\n      };\n    } finally {\n      setLoading(false);\n    }\n  }, [fetchCredentials]);\n\n  /**\n   * 按类型筛选凭证\n   */\n  const getByType = useCallback(type => {\n    return credentials.filter(c => c.type === type);\n  }, [credentials]);\n\n  /**\n   * 获取有效凭证\n   */\n  const getValidCredentials = useCallback(() => {\n    return credentials.filter(c => c.status === 'valid');\n  }, [credentials]);\n\n  /**\n   * 获取过期凭证\n   */\n  const getExpiredCredentials = useCallback(() => {\n    return credentials.filter(c => c.status === 'expired');\n  }, [credentials]);\n\n  // 自动加载\n  useEffect(() => {\n    if (autoLoad && apiClient.isAuthenticated()) {\n      fetchCredentials();\n    }\n  }, [autoLoad, fetchCredentials]);\n  return {\n    credentials,\n    loading,\n    error,\n    fetchCredentials,\n    getCredential,\n    createPresentation,\n    verifyPresentation,\n    requestCredential,\n    revokeCredential,\n    // 辅助方法\n    getByType,\n    getValidCredentials,\n    getExpiredCredentials,\n    // 便捷属性\n    count: credentials.length,\n    validCount: credentials.filter(c => c.status === 'valid').length\n  };\n}\n\n/**\n * QuantaBit Auth SDK - useWallets Hook\n * \n * 钱包绑定管理 Hook：\n * - 获取钱包列表\n * - 绑定新钱包\n * - 解绑钱包\n * - 设置主钱包\n */\n\n\n/**\n * useWallets Hook\n * \n * @param {Object} options\n * @param {string} options.apiBaseUrl - API 基础 URL\n * @param {boolean} options.autoLoad - 是否自动加载（默认 true）\n * @returns {Object} 钱包管理方法和状态\n */\nfunction useWallets({\n  apiBaseUrl,\n  autoLoad = true\n} = {}) {\n  const [wallets, setWallets] = useState([]);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState(null);\n\n  // 配置 API\n  useEffect(() => {\n    if (apiBaseUrl) {\n      apiClient.configure({\n        apiBaseUrl\n      });\n    }\n  }, [apiBaseUrl]);\n\n  /**\n   * 获取钱包列表\n   */\n  const fetchWallets = useCallback(async () => {\n    if (!apiClient.isAuthenticated()) {\n      return [];\n    }\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.getWalletBindings();\n      const data = result.data?.bindings || result.bindings || result;\n      setWallets(Array.isArray(data) ? data : []);\n      return data;\n    } catch (err) {\n      setError(err);\n      return [];\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  /**\n   * 绑定新钱包（手动签名）\n   */\n  const bindWallet = useCallback(async (walletAddress, chainType, signature, message, bindingType = 'secondary') => {\n    setLoading(true);\n    setError(null);\n    try {\n      const result = await apiClient.bindWallet(walletAddress, chainType, signature, message, bindingType);\n      await fetchWallets(); // 刷新列表\n      return {\n        success: true,\n        data: result.data || result\n      };\n    } catch (err) {\n      setError(err);\n      return {\n        success: false,\n        error: err\n      };\n    } finally {\n      setLoading(false);\n    }\n  }, [fetchWallets]);\n\n  /**\n   * 一键绑定当前钱包\n   */\n  const bindCurrentWallet = useCallback(async (chainType = 'quantabit', bindingType = 'secondary') => {\n    setLoading(true);\n    setError(null);\n    try {\n      const {\n        address: walletAddress,\n        response: result\n      } = await bindBrowserWallet(apiClient, chainType, bindingType);\n      await fetchWallets();\n      return {\n        success: true,\n        data: result,\n        walletAddress\n      };\n    } catch (err) {\n      setError(err);\n      return {\n        success: false,\n        error: err\n      };\n    } finally {\n      setLoading(false);\n    }\n  }, [fetchWallets]);\n\n  /**\n   * 解绑钱包\n   */\n  const unbindWallet = useCallback(async bindingId => {\n    setLoading(true);\n    setError(null);\n    try {\n      await apiClient.unbindWallet(bindingId);\n      await fetchWallets();\n      return {\n        success: true\n      };\n    } catch (err) {\n      setError(err);\n      return {\n        success: false,\n        error: err\n      };\n    } finally {\n      setLoading(false);\n    }\n  }, [fetchWallets]);\n\n  /**\n   * 设置主钱包\n   */\n  const setPrimaryWallet = useCallback(async bindingId => {\n    setLoading(true);\n    setError(null);\n    try {\n      await apiClient.setPrimaryWallet(bindingId);\n      await fetchWallets();\n      return {\n        success: true\n      };\n    } catch (err) {\n      setError(err);\n      return {\n        success: false,\n        error: err\n      };\n    } finally {\n      setLoading(false);\n    }\n  }, [fetchWallets]);\n\n  /**\n   * 获取主钱包\n   */\n  const getPrimaryWallet = useCallback(() => {\n    return wallets.find(w => w.isPrimary || w.is_primary);\n  }, [wallets]);\n\n  /**\n   * 按链类型筛选\n   */\n  const getByChainType = useCallback(chainType => {\n    return wallets.filter(w => w.chainType === chainType || w.chain_type === chainType);\n  }, [wallets]);\n\n  /**\n   * 格式化钱包地址\n   */\n  const formatWalletAddress = useCallback(address => {\n    return formatAddress(address);\n  }, []);\n\n  // 自动加载\n  useEffect(() => {\n    if (autoLoad && apiClient.isAuthenticated()) {\n      fetchWallets();\n    }\n  }, [autoLoad, fetchWallets]);\n  return {\n    wallets,\n    loading,\n    error,\n    fetchWallets,\n    bindWallet,\n    bindCurrentWallet,\n    unbindWallet,\n    setPrimaryWallet,\n    // 辅助方法\n    getPrimaryWallet,\n    getByChainType,\n    formatWalletAddress,\n    // 便捷属性\n    count: wallets.length,\n    primaryWallet: wallets.find(w => w.isPrimary || w.is_primary),\n    hasMetaMask: hasMetaMask(),\n    hasQBitWallet: hasQBitWallet()\n  };\n}\n\n/**\n * QuantaBit Auth SDK - useQBitIdentity\n *\n * 统一身份 Hook — 生态接入的单一入口\n *\n * 将 useDID / useProfile / useReputation / useCredentials / useWallets\n * 统一聚合，外部应用只需引入这一个 Hook 即可获得完整身份能力。\n *\n * 架构特性：\n * - 单例 API Client 共享（避免重复初始化）\n * - 懒加载各子能力（按需激活，节省请求）\n * - 统一 loading / error 聚合\n * - 事件总线：emits qbit-did:user-change 等生态事件\n * - 扩展钩子：onReady / onIdentityChange / onChainStatus\n */\n\n\n// ─── 生态事件 ────────────────────────────────────────────────\nconst EVENTS = {\n  USER_CHANGE: 'qbit-did:user-change',\n  IDENTITY_READY: 'qbit-did:identity-ready',\n  CHAIN_STATUS: 'qbit-did:chain-status',\n  LOGOUT: 'qbit-did:logout',\n  LANG_CHANGE: 'qbit-did:language-change'\n};\n\n/**\n * 向生态广播事件（全局 window）\n */\nfunction emit(eventName, detail = {}) {\n  if (typeof window === 'undefined') return;\n  window.dispatchEvent(new CustomEvent(eventName, {\n    detail\n  }));\n}\n\n/**\n * useQBitIdentity — 统一身份 Hook\n *\n * @param {Object} options\n * @param {string}   options.apiBaseUrl         API 基础 URL（默认 '/api/v1'）\n * @param {Object}   options.user               外部传入的已登录用户对象（可选）\n * @param {boolean}  options.autoLoad            是否自动加载身份数据（默认 true）\n * @param {boolean}  options.loadProfile         是否加载资料（默认 true）\n * @param {boolean}  options.loadReputation      是否加载声誉（默认 false，按需）\n * @param {boolean}  options.loadCredentials     是否加载凭证（默认 false，按需）\n * @param {boolean}  options.loadWallets         是否加载钱包（默认 false，按需）\n * @param {Function} options.onReady             身份就绪回调 (identity) => void\n * @param {Function} options.onIdentityChange    身份变更回调 (identity) => void\n * @param {Function} options.onChainStatusChange 链上状态变更回调 (status) => void\n * @param {Function} options.onError             错误回调 (err) => void\n *\n * @returns {Object} 聚合身份对象\n */\nfunction useQBitIdentity({\n  apiBaseUrl = '/api/v1',\n  user: externalUser = null,\n  autoLoad = true,\n  loadProfile = true,\n  loadReputation = false,\n  loadCredentials = false,\n  loadWallets = false,\n  onReady,\n  onIdentityChange,\n  onChainStatusChange,\n  onError\n} = {}) {\n  // ─── 内部状态 ─────────────────────────────────────────────\n  const [isReady, setIsReady] = useState(false);\n  const [loadingState, setLoadingState] = useState({\n    identity: false,\n    profile: false,\n    reputation: false,\n    credentials: false,\n    wallets: false\n  });\n  const prevChainStatusRef = useRef(null);\n  const isAuthenticated = externalUser != null || apiClient.isAuthenticated();\n\n  // ─── 配置 API ─────────────────────────────────────────────\n  useEffect(() => {\n    if (apiBaseUrl) apiClient.configure({\n      apiBaseUrl\n    });\n  }, [apiBaseUrl]);\n\n  // ─── 子 Hooks（懒加载受控） ───────────────────────────────\n  const didHook = useDID({\n    apiBaseUrl,\n    autoLoad: autoLoad && isAuthenticated\n  });\n  const profileHook = useProfile({\n    apiBaseUrl,\n    autoLoad: autoLoad && loadProfile && isAuthenticated\n  });\n  const reputationHook = useReputation({\n    apiBaseUrl,\n    autoLoad: autoLoad && loadReputation && isAuthenticated\n  });\n  const credentialsHook = useCredentials({\n    apiBaseUrl,\n    autoLoad: autoLoad && loadCredentials && isAuthenticated\n  });\n  const walletsHook = useWallets({\n    apiBaseUrl,\n    autoLoad: autoLoad && loadWallets && isAuthenticated\n  });\n\n  // ─── 聚合用户对象（外部 > 内部） ──────────────────────────\n  const mergedUser = useCallback(() => {\n    const base = externalUser || {};\n    const profile = profileHook?.profile || {};\n    return {\n      // DID\n      did: base.did || didHook.did,\n      // 资料（昵称优先链）\n      nickname: base.nickname || profile.nickname,\n      displayName: base.displayName || profile.display_name || profile.displayName,\n      display_name: base.display_name || profile.display_name,\n      username: base.username || profile.username,\n      name: base.name || profile.name,\n      avatar: base.avatar || profile.avatar_url || profile.avatar,\n      avatar_url: base.avatar_url || profile.avatar_url,\n      bio: base.bio || profile.bio,\n      email: base.email || profile.email,\n      verified: base.verified || profile.is_verified,\n      // 钱包\n      wallet_address: base.wallet_address || walletsHook?.primaryWallet?.address,\n      wallets: walletsHook?.wallets || base.wallets || [],\n      // 声誉\n      reputation_score: base.reputation_score || reputationHook?.score,\n      reputation_level: base.reputation_level || reputationHook?.level,\n      // 凭证\n      credential_count: credentialsHook?.credentials?.length ?? base.credential_count ?? 0,\n      credentials: credentialsHook?.credentials || base.credentials || [],\n      // 链上状态\n      chainStatus: didHook.chainStatus\n    };\n  }, [externalUser, didHook.did, didHook.chainStatus, profileHook?.profile, walletsHook?.wallets, walletsHook?.primaryWallet, reputationHook?.score, reputationHook?.level, credentialsHook?.credentials]);\n\n  // ─── 聚合 loading ─────────────────────────────────────────\n  const loading = didHook.loading || loadProfile && profileHook?.loading || loadReputation && reputationHook?.loading || loadCredentials && credentialsHook?.loading || loadWallets && walletsHook?.loading;\n  const error = didHook.error || profileHook?.error || reputationHook?.error || credentialsHook?.error || walletsHook?.error;\n\n  // ─── ready 状态触发 ───────────────────────────────────────\n  useEffect(() => {\n    if (!isAuthenticated) return;\n    if (loading) return;\n\n    // 当 DID 已知后视为就绪\n    const user = mergedUser();\n    if (user.did || externalUser) {\n      if (!isReady) {\n        setIsReady(true);\n        emit(EVENTS.IDENTITY_READY, {\n          user\n        });\n        onReady?.(user);\n      } else {\n        // 身份变更\n        emit(EVENTS.USER_CHANGE, {\n          user\n        });\n        onIdentityChange?.(user);\n      }\n    }\n  }, [loading, isAuthenticated, didHook.did, profileHook?.profile]);\n\n  // ─── 链上状态变化事件 ─────────────────────────────────────\n  useEffect(() => {\n    const currentStatus = didHook.chainStatus;\n    if (currentStatus && currentStatus !== prevChainStatusRef.current) {\n      prevChainStatusRef.current = currentStatus;\n      emit(EVENTS.CHAIN_STATUS, {\n        status: currentStatus\n      });\n      onChainStatusChange?.(currentStatus);\n    }\n  }, [didHook.chainStatus]);\n\n  // ─── 错误上报 ─────────────────────────────────────────────\n  useEffect(() => {\n    if (error) onError?.(error);\n  }, [error]);\n\n  // ─── 便捷显示名（昵称优先） ───────────────────────────────\n  const displayName = getUserDisplayName(mergedUser());\n\n  // ─── 按需加载触发器 ───────────────────────────────────────\n  const loadMore = useCallback(async (capabilities = []) => {\n    const tasks = [];\n    if (capabilities.includes('profile') && !loadProfile) tasks.push(profileHook?.fetchProfile?.());\n    if (capabilities.includes('reputation') && !loadReputation) tasks.push(reputationHook?.fetchReputation?.());\n    if (capabilities.includes('credentials') && !loadCredentials) tasks.push(credentialsHook?.fetchCredentials?.());\n    if (capabilities.includes('wallets') && !loadWallets) tasks.push(walletsHook?.fetchWallets?.());\n    await Promise.allSettled(tasks.filter(Boolean));\n  }, [profileHook, reputationHook, credentialsHook, walletsHook]);\n\n  // ─── 刷新全部 ─────────────────────────────────────────────\n  const refresh = useCallback(async () => {\n    await Promise.allSettled([didHook.fetchMyDID?.(), loadProfile && profileHook?.fetchProfile?.(), loadReputation && reputationHook?.fetchReputation?.(), loadCredentials && credentialsHook?.fetchCredentials?.(), loadWallets && walletsHook?.fetchWallets?.()].filter(Boolean));\n  }, [didHook, profileHook, reputationHook, credentialsHook, walletsHook]);\n\n  // ─── 返回聚合对象 ─────────────────────────────────────────\n  return {\n    // 状态\n    isReady,\n    loading,\n    error,\n    isAuthenticated,\n    // 聚合用户对象\n    user: mergedUser(),\n    displayName,\n    // 子 hook 直接暴露（高级用户可直接使用）\n    did: didHook,\n    profile: profileHook,\n    reputation: reputationHook,\n    credentials: credentialsHook,\n    wallets: walletsHook,\n    // 便捷直取\n    didString: didHook.did,\n    chainStatus: didHook.chainStatus,\n    reputationScore: reputationHook?.score,\n    credentialCount: credentialsHook?.credentials?.length ?? 0,\n    primaryWallet: walletsHook?.primaryWallet,\n    // 链上操作（委托 useDID）\n    verifyOnChain: didHook.verifyOnChain,\n    registerOnChain: didHook.registerOnChain,\n    updateOnChain: didHook.updateOnChain,\n    registerOnChainWithSigner: didHook.registerOnChainWithSigner,\n    registerOnChainWithQBitWallet: didHook.registerOnChainWithQBitWallet,\n    waitForChainConfirmation: didHook.waitForChainConfirmation,\n    // DID 文档操作\n    createDID: didHook.createDID,\n    resolveDID: didHook.resolveDID,\n    resolveDIDFromChain: didHook.resolveDIDFromChain,\n    updateDocument: didHook.updateDocument,\n    addKey: didHook.addKey,\n    removeKey: didHook.removeKey,\n    addService: didHook.addService,\n    removeService: didHook.removeService,\n    // 工具方法\n    refresh,\n    loadMore,\n    // 事件常量（供宿主应用监听）\n    EVENTS\n  };\n}\n\n/**\n * QuantaBit Auth SDK - OAuth/SSO 服务\n * \n * 支持：\n * - OAuth 2.0 授权流程\n * - SAML SSO\n * - 社交登录 (Google, GitHub, etc.)\n */\n\nconst DEFAULT_OAUTH_ENDPOINTS = {\n  authorize: '/oauth/authorize',\n  token: '/oauth/token',\n  userinfo: '/oauth/userinfo',\n  revoke: '/oauth/revoke'\n};\nconst DEFAULT_SSO_ENDPOINTS = {\n  saml: '/sso/saml',\n  callback: '/sso/callback'\n};\n\n/**\n * OAuth 服务类\n */\nclass OAuthService {\n  constructor(config = {}) {\n    this.baseUrl = config.apiBaseUrl || '';\n    this.clientId = config.clientId || '';\n    const isBrowser = typeof window !== 'undefined';\n    this.redirectUri = config.redirectUri || (isBrowser ? window.location.origin + '/oauth/callback' : '');\n    this.endpoints = {\n      ...DEFAULT_OAUTH_ENDPOINTS,\n      ...config.endpoints\n    };\n    this.scopes = config.scopes || ['openid', 'profile', 'email'];\n    this.state = null;\n    this.codeVerifier = null;\n  }\n\n  /**\n   * 配置 OAuth 服务\n   */\n  configure(config) {\n    if (config.apiBaseUrl) this.baseUrl = config.apiBaseUrl;\n    if (config.clientId) this.clientId = config.clientId;\n    if (config.redirectUri) this.redirectUri = config.redirectUri;\n    if (config.endpoints) this.endpoints = {\n      ...this.endpoints,\n      ...config.endpoints\n    };\n    if (config.scopes) this.scopes = config.scopes;\n  }\n\n  /**\n   * 生成随机字符串\n   */\n  _generateRandomString(length = 32) {\n    const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n    let result = '';\n    if (typeof window !== 'undefined' && window.crypto) {\n      const values = new Uint8Array(length);\n      window.crypto.getRandomValues(values);\n      for (let i = 0; i < length; i++) {\n        result += chars[values[i] % chars.length];\n      }\n    } else {\n      // Fallback for non-browser env\n      for (let i = 0; i < length; i++) {\n        result += chars.charAt(Math.floor(Math.random() * chars.length));\n      }\n    }\n    return result;\n  }\n\n  /**\n   * 生成 PKCE code challenge\n   */\n  async _generateCodeChallenge(verifier) {\n    if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {\n      return ''; // SSR fallback\n    }\n    const encoder = new TextEncoder();\n    const data = encoder.encode(verifier);\n    const digest = await window.crypto.subtle.digest('SHA-256', data);\n    return btoa(String.fromCharCode(...new Uint8Array(digest))).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n  }\n\n  /**\n   * 开始 OAuth 授权流程\n   */\n  async startAuthorization(options = {}) {\n    const {\n      provider = 'qbit-did',\n      responseType = 'code',\n      usePKCE = true,\n      additionalScopes = [],\n      state: customState,\n      prompt\n    } = options;\n    this.state = customState || this._generateRandomString();\n    const params = new URLSearchParams({\n      client_id: this.clientId,\n      redirect_uri: this.redirectUri,\n      response_type: responseType,\n      scope: [...this.scopes, ...additionalScopes].join(' '),\n      state: this.state\n    });\n    if (provider !== 'qbit-did') {\n      params.set('provider', provider);\n    }\n    if (prompt) {\n      params.set('prompt', prompt);\n    }\n\n    // PKCE 支持\n    if (usePKCE && responseType === 'code') {\n      this.codeVerifier = this._generateRandomString(64);\n      const codeChallenge = await this._generateCodeChallenge(this.codeVerifier);\n      params.set('code_challenge', codeChallenge);\n      params.set('code_challenge_method', 'S256');\n\n      // 保存 verifier 到 localStorage\n      if (typeof localStorage !== 'undefined') {\n        localStorage.setItem('qbit_did_oauth_verifier', this.codeVerifier);\n      }\n    }\n\n    // 保存 state 到 localStorage\n    if (typeof localStorage !== 'undefined') {\n      localStorage.setItem('qbit_did_oauth_state', this.state);\n    }\n    const authUrl = `${this.baseUrl}${this.endpoints.authorize}?${params.toString()}`;\n    return authUrl;\n  }\n\n  /**\n   * 重定向到授权页面\n   */\n  async authorize(options = {}) {\n    if (typeof window === 'undefined') return;\n    const authUrl = await this.startAuthorization(options);\n    window.location.href = authUrl;\n  }\n\n  /**\n   * 在弹窗中进行授权\n   */\n  async authorizePopup(options = {}) {\n    if (typeof window === 'undefined') {\n      return Promise.reject(new Error('Window object not available for popup authorization.'));\n    }\n    const authUrl = await this.startAuthorization(options);\n    return new Promise((resolve, reject) => {\n      const width = 600;\n      const height = 700;\n      const left = window.screenX + (window.outerWidth - width) / 2;\n      const top = window.screenY + (window.outerHeight - height) / 2;\n      const popup = window.open(authUrl, 'oauth_popup', `width=${width},height=${height},left=${left},top=${top}`);\n      if (!popup) {\n        reject(new Error('无法打开弹窗，请检查是否被浏览器拦截'));\n        return;\n      }\n\n      // 监听弹窗关闭和消息\n      const checkPopup = setInterval(() => {\n        if (popup.closed) {\n          clearInterval(checkPopup);\n          window.removeEventListener('message', messageHandler);\n          reject(new Error('用户取消了授权'));\n        }\n      }, 500);\n      const messageHandler = async event => {\n        if (event.origin !== window.location.origin) return;\n        if (event.data?.type === 'oauth_callback') {\n          clearInterval(checkPopup);\n          window.removeEventListener('message', messageHandler);\n          popup.close();\n          try {\n            const result = await this.handleCallback(event.data.params);\n            resolve(result);\n          } catch (error) {\n            reject(error);\n          }\n        }\n      };\n      window.addEventListener('message', messageHandler);\n    });\n  }\n\n  /**\n   * 处理 OAuth 回调\n   */\n  async handleCallback(params) {\n    const {\n      code,\n      state,\n      error,\n      error_description\n    } = params;\n    if (error) {\n      throw new Error(error_description || error);\n    }\n\n    // 验证 state\n    const savedState = localStorage.getItem('qbit_did_oauth_state');\n    if (state !== savedState) {\n      throw new Error('OAuth state mismatch');\n    }\n\n    // 获取 code verifier\n    const codeVerifier = localStorage.getItem('qbit_did_oauth_verifier');\n\n    // 交换 token\n    const tokenData = await this.exchangeToken(code, codeVerifier);\n\n    // 清理临时存储\n    localStorage.removeItem('qbit_did_oauth_state');\n    localStorage.removeItem('qbit_did_oauth_verifier');\n    return tokenData;\n  }\n\n  /**\n   * 用授权码交换 token\n   */\n  async exchangeToken(code, codeVerifier = null) {\n    const body = {\n      grant_type: 'authorization_code',\n      client_id: this.clientId,\n      redirect_uri: this.redirectUri,\n      code\n    };\n    if (codeVerifier) {\n      body.code_verifier = codeVerifier;\n    }\n    const response = await fetch(`${this.baseUrl}${this.endpoints.token}`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json'\n      },\n      body: JSON.stringify(body)\n    });\n    if (!response.ok) {\n      const error = await response.json().catch(() => ({}));\n      throw new Error(error.message || 'Token exchange failed');\n    }\n    return response.json();\n  }\n\n  /**\n   * 刷新 token\n   */\n  async refreshToken(refreshToken) {\n    const response = await fetch(`${this.baseUrl}${this.endpoints.token}`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json'\n      },\n      body: JSON.stringify({\n        grant_type: 'refresh_token',\n        client_id: this.clientId,\n        refresh_token: refreshToken\n      })\n    });\n    if (!response.ok) {\n      throw new Error('Token refresh failed');\n    }\n    return response.json();\n  }\n\n  /**\n   * 获取用户信息\n   */\n  async getUserInfo(accessToken) {\n    const response = await fetch(`${this.baseUrl}${this.endpoints.userinfo}`, {\n      headers: {\n        'Authorization': `Bearer ${accessToken}`\n      }\n    });\n    if (!response.ok) {\n      throw new Error('Failed to get user info');\n    }\n    return response.json();\n  }\n\n  /**\n   * 撤销 token\n   */\n  async revokeToken(token, tokenTypeHint = 'access_token') {\n    const response = await fetch(`${this.baseUrl}${this.endpoints.revoke}`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json'\n      },\n      body: JSON.stringify({\n        token,\n        token_type_hint: tokenTypeHint\n      })\n    });\n    return response.ok;\n  }\n}\n\n/**\n * SSO 服务类\n */\nclass SSOService {\n  constructor(config = {}) {\n    this.baseUrl = config.apiBaseUrl || '';\n    this.endpoints = {\n      ...DEFAULT_SSO_ENDPOINTS,\n      ...config.endpoints\n    };\n  }\n\n  /**\n   * 配置 SSO 服务\n   */\n  configure(config) {\n    if (config.apiBaseUrl) this.baseUrl = config.apiBaseUrl;\n    if (config.endpoints) this.endpoints = {\n      ...this.endpoints,\n      ...config.endpoints\n    };\n  }\n\n  /**\n   * 发起 SAML 登录\n   */\n  async startSAMLLogin(idpId, returnUrl) {\n    if (typeof window === 'undefined') return;\n    const finalReturnUrl = returnUrl || window.location.href;\n    const params = new URLSearchParams({\n      idp: idpId,\n      return_url: finalReturnUrl\n    });\n    const url = `${this.baseUrl}${this.endpoints.saml}?${params.toString()}`;\n    window.location.href = url;\n  }\n\n  /**\n   * 处理 SAML 回调\n   */\n  async handleSAMLCallback(samlResponse) {\n    const response = await fetch(`${this.baseUrl}${this.endpoints.callback}`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json'\n      },\n      body: JSON.stringify({\n        saml_response: samlResponse\n      })\n    });\n    if (!response.ok) {\n      const error = await response.json().catch(() => ({}));\n      throw new Error(error.message || 'SAML authentication failed');\n    }\n    return response.json();\n  }\n}\n\n/**\n * 社交登录配置\n */\nconst SOCIAL_PROVIDERS = {\n  google: {\n    id: 'google',\n    name: 'Google',\n    icon: 'google',\n    scopes: ['openid', 'profile', 'email']\n  },\n  github: {\n    id: 'github',\n    name: 'GitHub',\n    icon: 'github',\n    scopes: ['read:user', 'user:email']\n  },\n  discord: {\n    id: 'discord',\n    name: 'Discord',\n    icon: 'discord',\n    scopes: ['identify', 'email']\n  },\n  twitter: {\n    id: 'twitter',\n    name: 'Twitter',\n    icon: 'twitter',\n    scopes: ['tweet.read', 'users.read']\n  },\n  wechat: {\n    id: 'wechat',\n    name: 'WeChat',\n    icon: 'wechat',\n    scopes: ['snsapi_userinfo']\n  },\n  tiktok: {\n    id: 'tiktok',\n    name: 'TikTok',\n    icon: 'tiktok',\n    scopes: ['user.info.basic']\n  }\n};\n\n/**\n * 创建社交登录 URL\n */\nfunction createSocialLoginUrl(provider, baseUrl, clientId, redirectUri) {\n  const oauthService = new OAuthService({\n    apiBaseUrl: baseUrl,\n    clientId,\n    redirectUri,\n    scopes: SOCIAL_PROVIDERS[provider]?.scopes || ['openid', 'profile']\n  });\n  return oauthService.startAuthorization({\n    provider\n  });\n}\n\n// 创建默认实例\nconst oauthService = new OAuthService();\nconst ssoService = new SSOService();\n\nexport { AccountSwitcher, AlertIcon, ArrowRightIcon, AuthApiClient as AuthApiService, AuthProvider, CheckIcon, CloseIcon, CoinbaseIcon, DIDChainStatusCard, DIDProfilePanel, DarkLoginModal, DidWalletConnectButton, ExpandIcon, EyeIcon, EyeOffIcon, FingerprintIcon, FlatDarkLoginPage, FlatDarkRegisterPage, LANGUAGE_INFO, LanguageSwitcher, LayoutIcon, LoaderIcon, LockIcon, LoginModal, LoginPage, LogoutIcon, MailIcon, MaximizeIcon, MetaMaskIcon$1 as MetaMaskIcon, MinimizeIcon, MoonIcon, OAuthService, PaletteIcon, PlusIcon, EVENTS as QBIT_EVENTS, QBitIcon, QbitDIDApiClient, QuickConnectButton, RegisterPage, SOCIAL_PROVIDERS, SSOService, SUPPORTED_LANGUAGES, ShieldIcon, SunIcon, SwapIcon, TrashIcon, UserIcon, VerifiedIcon, WalletConnectIcon$1 as WalletConnectIcon, WalletIcon, Web3WalletPanel, ZapIcon, apiClient, authApi, buildQBitAnchorMemo$1 as buildQBitAnchorMemo, clearCurrentSession, completeExternalChainOperation$1 as completeExternalChainOperation, createQBitMemoAnchorBroadcaster$1 as createQBitMemoAnchorBroadcaster, createSocialLoginUrl, detectBrowserLanguage, formatAddress, formatDID$1 as formatDID, getCurrentSession, getEthereumProvider, getLanguage, getMessages$1 as getMessages, getSavedAccounts, getSupportedLanguages, getUserDisplayName, hasMetaMask, initLanguage, messages, oauthService, removeAccount, saveAccount, setCurrentDID, setLanguage, ssoService, t, useAccounts, useAuth, useCredentials, useDID, useLogin, useProfile, useQBitIdentity, useReputation, useWallets, verifyAnchoredMemo, waitForQBitConfirmation };\n//# sourceMappingURL=index.esm.js.map\n","/**\n * Wallet QBit SDK - QBit 钱包组件\n */\n\nimport React, { useState } from 'react';\nimport { useWalletQBit, useInvestProducts } from '../hooks/useWalletQBit';\n\n/**\n * 资产组合概览\n */\nexport function PortfolioOverview() {\n  const { portfolio, balances, loading, totalValue } = useWalletQBit();\n\n  if (loading) {\n    return <div className=\"eco-portfolio-loading\">加载中...</div>;\n  }\n\n  return (\n    <div className=\"eco-portfolio-overview\">\n      <div className=\"eco-portfolio-header\">\n        <h3>资产总览</h3>\n        <div className=\"eco-portfolio-value\">\n          <span className=\"eco-value-label\">总资产</span>\n          <span className=\"eco-value-amount\">\n            ${totalValue.toLocaleString()}\n          </span>\n        </div>\n      </div>\n\n      <div className=\"eco-portfolio-stats\">\n        <div className=\"eco-stat-item\">\n          <span className=\"eco-stat-label\">今日盈亏</span>\n          <span className={`eco-stat-value ${portfolio?.today_pnl >= 0 ? 'positive' : 'negative'}`}>\n            {portfolio?.today_pnl >= 0 ? '+' : ''}{portfolio?.today_pnl?.toFixed(2) || '0.00'}%\n          </span>\n        </div>\n        <div className=\"eco-stat-item\">\n          <span className=\"eco-stat-label\">累计收益</span>\n          <span className={`eco-stat-value ${portfolio?.total_pnl >= 0 ? 'positive' : 'negative'}`}>\n            ${portfolio?.total_pnl?.toLocaleString() || '0'}\n          </span>\n        </div>\n      </div>\n\n      <div className=\"eco-asset-list\">\n        {balances.map((asset) => (\n          <div key={asset.asset_id} className=\"eco-asset-item\">\n            <div className=\"eco-asset-icon\">{asset.icon || '💰'}</div>\n            <div className=\"eco-asset-info\">\n              <span className=\"eco-asset-name\">{asset.name}</span>\n              <span className=\"eco-asset-balance\">{asset.balance} {asset.symbol}</span>\n            </div>\n            <div className=\"eco-asset-value\">\n              ${asset.value?.toLocaleString() || '0'}\n            </div>\n          </div>\n        ))}\n      </div>\n    </div>\n  );\n}\n\n/**\n * 投资产品列表\n */\nexport function InvestProductList() {\n  const { products, loading, subscribe } = useInvestProducts();\n  const [selectedProduct, setSelectedProduct] = useState(null);\n  const [amount, setAmount] = useState('');\n\n  const handleSubscribe = async () => {\n    if (!selectedProduct || !amount) return;\n    try {\n      await subscribe(selectedProduct.id, amount);\n      setSelectedProduct(null);\n      setAmount('');\n    } catch (err) {\n      // 错误处理\n    }\n  };\n\n  if (loading) {\n    return <div className=\"eco-products-loading\">加载中...</div>;\n  }\n\n  return (\n    <div className=\"eco-invest-products\">\n      <h3>理财产品</h3>\n      \n      <div className=\"eco-products-grid\">\n        {products.map((product) => (\n          <div key={product.id} className=\"eco-product-card\">\n            <div className=\"eco-product-header\">\n              <span className=\"eco-product-name\">{product.name}</span>\n              <span className=\"eco-product-tag\">{product.type}</span>\n            </div>\n            <div className=\"eco-product-apy\">\n              <span className=\"eco-apy-value\">{product.apy}%</span>\n              <span className=\"eco-apy-label\">年化收益</span>\n            </div>\n            <div className=\"eco-product-info\">\n              <span>期限: {product.term || '活期'}</span>\n              <span>起投: ${product.min_amount}</span>\n            </div>\n            <button \n              className=\"eco-btn eco-btn-primary eco-btn-sm\"\n              onClick={() => setSelectedProduct(product)}\n            >\n              立即申购\n            </button>\n          </div>\n        ))}\n      </div>\n\n      {/* 申购模态框 */}\n      {selectedProduct && (\n        <div className=\"eco-modal-overlay\" onClick={() => setSelectedProduct(null)}>\n          <div className=\"eco-modal\" onClick={(e) => e.stopPropagation()}>\n            <div className=\"eco-modal-header\">\n              <h3>申购 {selectedProduct.name}</h3>\n              <button className=\"eco-modal-close\" onClick={() => setSelectedProduct(null)}>\n                ×\n              </button>\n            </div>\n            <div className=\"eco-modal-body\">\n              <div className=\"eco-form-group\">\n                <label>申购金额</label>\n                <input\n                  type=\"number\"\n                  value={amount}\n                  onChange={(e) => setAmount(e.target.value)}\n                  placeholder={`最低 ${selectedProduct.min_amount}`}\n                  min={selectedProduct.min_amount}\n                />\n              </div>\n              <div className=\"eco-subscribe-info\">\n                <p>年化收益: {selectedProduct.apy}%</p>\n                <p>预计收益: ${(parseFloat(amount || 0) * selectedProduct.apy / 100).toFixed(2)}/年</p>\n              </div>\n            </div>\n            <div className=\"eco-modal-footer\">\n              <button \n                className=\"eco-btn\" \n                onClick={() => setSelectedProduct(null)}\n              >\n                取消\n              </button>\n              <button \n                className=\"eco-btn eco-btn-primary\"\n                onClick={handleSubscribe}\n                disabled={!amount || parseFloat(amount) < selectedProduct.min_amount}\n              >\n                确认申购\n              </button>\n            </div>\n          </div>\n        </div>\n      )}\n    </div>\n  );\n}\n\n/**\n * 我的投资\n */\nexport function MyInvestments() {\n  const { myInvestments, loading, redeem } = useInvestProducts();\n\n  if (loading) {\n    return <div className=\"eco-investments-loading\">加载中...</div>;\n  }\n\n  if (myInvestments.length === 0) {\n    return (\n      <div className=\"eco-investments-empty\">\n        <p>暂无投资</p>\n        <span>开始投资，获取稳定收益</span>\n      </div>\n    );\n  }\n\n  return (\n    <div className=\"eco-my-investments\">\n      <h3>我的投资</h3>\n      \n      <div className=\"eco-investments-list\">\n        {myInvestments.map((investment) => (\n          <div key={investment.id} className=\"eco-investment-item\">\n            <div className=\"eco-investment-info\">\n              <span className=\"eco-investment-name\">{investment.product_name}</span>\n              <span className=\"eco-investment-amount\">\n                ${investment.amount.toLocaleString()}\n              </span>\n            </div>\n            <div className=\"eco-investment-stats\">\n              <span className=\"eco-earning positive\">\n                +${investment.earning.toFixed(2)}\n              </span>\n              <span className=\"eco-apy\">{investment.apy}%</span>\n            </div>\n            <button \n              className=\"eco-btn eco-btn-sm eco-btn-outline\"\n              onClick={() => redeem(investment.product_id, investment.amount)}\n            >\n              赎回\n            </button>\n          </div>\n        ))}\n      </div>\n    </div>\n  );\n}\n\n","/**\n * Wallet QBit SDK - 国际化\n */\n\nexport const zh = {\n  walletQBit: {\n    title: 'QBit 钱包',\n    subtitle: '一站式数字资产投资管理',\n    \n    // 资产\n    portfolio: {\n      title: '资产总览',\n      totalValue: '总资产',\n      todayProfit: '今日盈亏',\n      totalProfit: '累计收益',\n    },\n    \n    // 操作\n    actions: {\n      deposit: '充值',\n      withdraw: '提现',\n      transfer: '转账',\n      invest: '投资',\n      redeem: '赎回',\n    },\n    \n    // 投资产品\n    products: {\n      title: '理财产品',\n      all: '全部',\n      flexible: '活期',\n      fixed: '定期',\n      staking: '质押',\n      apy: '年化收益率',\n      minAmount: '起投金额',\n      term: '期限',\n      subscribe: '申购',\n    },\n    \n    // 我的投资\n    investments: {\n      title: '我的投资',\n      holding: '持有中',\n      redeemed: '已赎回',\n      earning: '收益',\n    },\n    \n    // DeFi\n    defi: {\n      title: 'DeFi',\n      pools: '流动性池',\n      addLiquidity: '添加流动性',\n      removeLiquidity: '移除流动性',\n      stake: '质押',\n      unstake: '取消质押',\n    },\n    \n    // 交易\n    transactions: {\n      title: '交易记录',\n      deposit: '充值',\n      withdraw: '提现',\n      transfer: '转账',\n      invest: '投资',\n      earning: '收益',\n    },\n    \n    // 提醒\n    alerts: {\n      title: '价格提醒',\n      create: '创建提醒',\n      priceAbove: '价格高于',\n      priceBelow: '价格低于',\n    },\n    \n    // 消息\n    messages: {\n      depositSuccess: '充值成功',\n      withdrawSuccess: '提现已提交',\n      investSuccess: '投资成功',\n      redeemSuccess: '赎回成功',\n    },\n    \n    // 错误\n    errors: {\n      insufficientBalance: '余额不足',\n      minAmountRequired: '低于最小投资额',\n      withdrawFailed: '提现失败',\n    },\n  },\n};\n\nexport const en = {\n  walletQBit: {\n    title: 'QBit Wallet',\n    subtitle: 'One-stop digital asset investment management',\n    \n    portfolio: {\n      title: 'Portfolio',\n      totalValue: 'Total Value',\n      todayProfit: 'Today P&L',\n      totalProfit: 'Total Profit',\n    },\n    \n    actions: {\n      deposit: 'Deposit',\n      withdraw: 'Withdraw',\n      transfer: 'Transfer',\n      invest: 'Invest',\n      redeem: 'Redeem',\n    },\n    \n    products: {\n      title: 'Investment Products',\n      all: 'All',\n      flexible: 'Flexible',\n      fixed: 'Fixed',\n      staking: 'Staking',\n      apy: 'APY',\n      minAmount: 'Min Amount',\n      term: 'Term',\n      subscribe: 'Subscribe',\n    },\n    \n    investments: {\n      title: 'My Investments',\n      holding: 'Holding',\n      redeemed: 'Redeemed',\n      earning: 'Earnings',\n    },\n    \n    defi: {\n      title: 'DeFi',\n      pools: 'Liquidity Pools',\n      addLiquidity: 'Add Liquidity',\n      removeLiquidity: 'Remove Liquidity',\n      stake: 'Stake',\n      unstake: 'Unstake',\n    },\n    \n    transactions: {\n      title: 'Transactions',\n      deposit: 'Deposit',\n      withdraw: 'Withdraw',\n      transfer: 'Transfer',\n      invest: 'Investment',\n      earning: 'Earning',\n    },\n    \n    alerts: {\n      title: 'Price Alerts',\n      create: 'Create Alert',\n      priceAbove: 'Price Above',\n      priceBelow: 'Price Below',\n    },\n    \n    messages: {\n      depositSuccess: 'Deposit successful',\n      withdrawSuccess: 'Withdrawal submitted',\n      investSuccess: 'Investment successful',\n      redeemSuccess: 'Redemption successful',\n    },\n    \n    errors: {\n      insufficientBalance: 'Insufficient balance',\n      minAmountRequired: 'Below minimum amount',\n      withdrawFailed: 'Withdrawal failed',\n    },\n  },\n};\n\nexport const ja = {\n  \"walletQBit\": {\n    \"title\": \"QBitウォレット\",\n    \"subtitle\": \"ワンストップのデジタル資産投資管理\",\n    \"portfolio\": {\n      \"title\": \"ポートフォリオ\",\n      \"totalValue\": \"総資産\",\n      \"todayProfit\": \"今日の損益\",\n      \"totalProfit\": \"累計収益\"\n    },\n    \"actions\": {\n      \"deposit\": \"入金\",\n      \"withdraw\": \"出金\",\n      \"transfer\": \"送金\",\n      \"invest\": \"投資\",\n      \"redeem\": \"償還\"\n    },\n    \"products\": {\n      \"title\": \"投資商品\",\n      \"all\": \"すべて\",\n      \"flexible\": \"普通\",\n      \"fixed\": \"定期\",\n      \"staking\": \"ステーキング\",\n      \"apy\": \"年換算収益率\",\n      \"minAmount\": \"最小投資額\",\n      \"term\": \"期間\",\n      \"subscribe\": \"購読\"\n    },\n    \"investments\": {\n      \"title\": \"マイ投資\",\n      \"holding\": \"保有中\",\n      \"redeemed\": \"償還済み\",\n      \"earning\": \"収益\"\n    },\n    \"defi\": {\n      \"title\": \"DeFi\",\n      \"pools\": \"流動性プール\",\n      \"addLiquidity\": \"流動性の追加\",\n      \"removeLiquidity\": \"流動性の削除\",\n      \"stake\": \"ステーキング\",\n      \"unstake\": \"ステーキング解除\"\n    },\n    \"transactions\": {\n      \"title\": \"取引履歴\",\n      \"deposit\": \"入金\",\n      \"withdraw\": \"出金\",\n      \"transfer\": \"送金\",\n      \"invest\": \"投資\",\n      \"earning\": \"収益\"\n    },\n    \"alerts\": {\n      \"title\": \"価格アラート\",\n      \"create\": \"アラート作成\",\n      \"priceAbove\": \"価格が次の値を超えた時\",\n      \"priceBelow\": \"価格が次の値を下回った時\"\n    },\n    \"messages\": {\n      \"depositSuccess\": \"入金に成功しました\",\n      \"withdrawSuccess\": \"出金が申請されました\",\n      \"investSuccess\": \"投資に成功しました\",\n      \"redeemSuccess\": \"償還に成功しました\"\n    },\n    \"errors\": {\n      \"insufficientBalance\": \"残高不足\",\n      \"minAmountRequired\": \"最小投資額未満\",\n      \"withdrawFailed\": \"出金失敗\"\n    }\n  }\n};\n\nexport const ko = {\n  \"walletQBit\": {\n    \"title\": \"QBit 지갑\",\n    \"subtitle\": \"원스톱 디지털 자산 투자 관리\",\n    \"portfolio\": {\n      \"title\": \"포트폴리오\",\n      \"totalValue\": \"총 자산\",\n      \"todayProfit\": \"오늘의 손익\",\n      \"totalProfit\": \"누적 수익\"\n    },\n    \"actions\": {\n      \"deposit\": \"입금\",\n      \"withdraw\": \"출금\",\n      \"transfer\": \"이체\",\n      \"invest\": \"투자\",\n      \"redeem\": \"상환\"\n    },\n    \"products\": {\n      \"title\": \"투자 상품\",\n      \"all\": \"전체\",\n      \"flexible\": \"수시\",\n      \"fixed\": \"정기\",\n      \"staking\": \"스테이킹\",\n      \"apy\": \"연이율\",\n      \"minAmount\": \"최소 금액\",\n      \"term\": \"기간\",\n      \"subscribe\": \"청약\"\n    },\n    \"investments\": {\n      \"title\": \"내 투자\",\n      \"holding\": \"보유 중\",\n      \"redeemed\": \"상환됨\",\n      \"earning\": \"수익\"\n    },\n    \"defi\": {\n      \"title\": \"DeFi\",\n      \"pools\": \"유동성 풀\",\n      \"addLiquidity\": \"유동성 추가\",\n      \"removeLiquidity\": \"유동성 제거\",\n      \"stake\": \"스테이킹\",\n      \"unstake\": \"스테이킹 해제\"\n    },\n    \"transactions\": {\n      \"title\": \"거래 기록\",\n      \"deposit\": \"입금\",\n      \"withdraw\": \"출금\",\n      \"transfer\": \"이체\",\n      \"invest\": \"투자\",\n      \"earning\": \"수익\"\n    },\n    \"alerts\": {\n      \"title\": \"가격 알림\",\n      \"create\": \"알림 생성\",\n      \"priceAbove\": \"가격이 다음보다 높음\",\n      \"priceBelow\": \"가격이 다음보다 낮음\"\n    },\n    \"messages\": {\n      \"depositSuccess\": \"입금 성공\",\n      \"withdrawSuccess\": \"출금 신청됨\",\n      \"investSuccess\": \"투자 성공\",\n      \"redeemSuccess\": \"상환 성공\"\n    },\n    \"errors\": {\n      \"insufficientBalance\": \"잔액 부족\",\n      \"minAmountRequired\": \"최소 금액 미만\",\n      \"withdrawFailed\": \"출금 실패\"\n    }\n  }\n};\n\nexport default { zh, en, ja, ko };\n","/**\n * @quantabit/wallet-quantabit-sdk - QBit Wallet SDK\n * \n * Supports asset management, investment products, and DeFi operations\n */\n\n// Type Definitions\nexport const ProductType = {\n  FLEXIBLE: 'flexible',\n  FIXED: 'fixed',\n  STAKING: 'staking',\n  DEFI: 'defi',\n};\n\nexport const TransactionType = {\n  DEPOSIT: 'deposit',\n  WITHDRAW: 'withdraw',\n  TRANSFER: 'transfer',\n  INVEST: 'invest',\n  REDEEM: 'redeem',\n  EARNING: 'earning',\n  STAKING: 'staking',\n  TOKEN_TRANSFER: 'token_transfer',\n};\n\n// API Client - 使用 BaseApiClient\nexport { WalletQBitApiClient, walletQBitApi } from './services/walletQBitApi';\n\n// High-Level Generic Action Modules (通用高级交互与支付中枢)\nexport { QBitEcosystem, QBitToast, QBitCashier, QBitActions, QBitVerify } from './services/qbitActions';\n\n// React Hooks\nexport { useWalletQBit, useInvestProducts } from './hooks/useWalletQBit';\nexport { useQBitChain } from './hooks/useQBitChain';\n\n// Re-export Auth SDK components & hooks\nexport {\n  AuthProvider,\n  useAuth,\n  QuickConnectButton,\n  DidWalletConnectButton,\n  Web3WalletPanel,\n  DIDProfilePanel,\n  getUserDisplayName,\n  useQBitIdentity,\n  QBIT_EVENTS\n} from '@quantabit/auth-sdk';\n\n// Components\nexport {\n  PortfolioOverview,\n  InvestProductList,\n  MyInvestments,\n} from './components/QBitWallet';\n\n// i18n\nexport { zh, en } from './i18n';\n\n// Default Export\nimport { walletQBitApi } from './services/walletQBitApi';\nexport default walletQBitApi;\n\nimport \"./styles/wallet-qbit.css\";\nimport \"@quantabit/auth-sdk/styles.css\";\n"],"names":["WalletQBitApiClient","BaseApiClient","constructor","config","initWallet","options","post","getWalletStatus","get","bindAccount","credentials","unbindAccount","getPortfolio","getBalance","assetId","getAllBalances","getValueHistory","params","getInvestProducts","getProduct","productId","subscribe","amount","redeem","getMyInvestments","getDepositAddress","chain","asset_id","withdraw","withdrawData","internalTransfer","transferData","getTransactionHistory","getTransaction","txId","getEarnings","getEarningDetails","getApy","getDefiProtocols","getLiquidityPools","addLiquidity","liquidityData","removeLiquidity","stake","stakeData","unstake","unstakeData","getNotificationSettings","updateNotificationSettings","settings","put","setPriceAlert","alert","getMyAlerts","walletQBitApi","DEFAULT_RPC_NODES","QBitEcosystem","apiKey","environment","rpcNodes","activeNodeIndex","init","nodes","networkEndpoint","push","getConfig","chainEndpoint","replace","apiFullUrl","e","forEach","node","Array","from","Set","filter","Boolean","console","log","requestNode","path","retries","i","activeNode","url","res","fetch","headers","ok","json","Error","status","err","warn","length","QBitToast","container","ensureContainer","document","createElement","className","Object","assign","style","position","top","right","zIndex","display","flexDirection","gap","pointerEvents","body","appendChild","show","id","Math","random","toString","substring","toast","type","padding","background","backdropFilter","webkitBackdropFilter","borderLeft","getColor","borderRadius","boxShadow","color","fontSize","fontFamily","alignItems","transition","opacity","transform","icon","getIcon","textNode","flex","textContent","message","txHash","link","explorerUrl","network","chainNetwork","netConfig","CHAIN_NETWORKS","href","target","textDecoration","fontWeight","marginLeft","setTimeout","duration","dismiss","update","getElementById","querySelector","parentNode","removeChild","el","animation","innerHTML","head","QBitCashier","activeOverlay","open","close","overlay","inset","justifyContent","modal","border","width","maxWidth","goodsName","inputs","querySelectorAll","pinWrapper","payBtn","input","index","addEventListener","value","focus","key","onCancel","pin","map","join","classList","add","remove","disabled","receipt","method","JSON","stringify","payee","payeeAddress","order_id","orderId","onSuccess","success","tx_hash","timestamp","Date","now","onError","QBitActions","anchorResource","toastId","title","response","namespace","resource_id","resourceId","author_did","authorDid","content_hash","contentHash","fee_mode","feeMode","Promise","resolve","blockNumber","block_number","error","requestPayment","memo","toAddress","QBitVerify","verifyMemo","expectedNamespace","expectedHash","txData","isConfirmed","isValid","confirmations","blockchainMemo","expectedMemoString","trim","signer","useWalletQBit","portfolio","setPortfolio","useState","balances","setBalances","loading","setLoading","setError","fetchPortfolio","useCallback","result","data","fetchBalances","address","useEffect","totalValue","total_value","useInvestProducts","products","setProducts","myInvestments","setMyInvestments","fetchProducts","fetchMyInvestments","extractTransactionHash","signature","hash","useQBitChain","endpoint","autoRefresh","refreshInterval","chainStatus","setChainStatus","balance","setBalance","tokenAccounts","setTokenAccounts","validators","setValidators","connected","setConnected","sdkRef","useRef","connRef","connectionKeyRef","subRef","ensureSdk","nextConnectionKey","current","sdk","destroy","QBitConnection","onConnect","onDisconnect","fetchChainStatus","getChainStatus","fetchBalance","addr","targetAddr","fetchTokenAccounts","getTokenAccounts","fetchValidators","getValidators","fetchTransactionHistory","opts","validateNetwork","valid","requestAirdrop","amountQBT","catch","subscribeBalance","QBitSubscription","onAccountChange","info","lamports","qbt","unsubscribe","buildMemoTransaction","payerAddress","txBuilder","QBitTransaction","addMemo","priorityFee","setPriorityFee","build","sendMemoWithWallet","provider","publicKey","toBase58","transaction","signAndSendTransaction","skipPreflight","preflightCommitment","raw","signTransaction","signedTransaction","sendTransaction","refresh","all","timer","setInterval","clearInterval","connection","REACT_ELEMENT_TYPE","Symbol","for","REACT_FRAGMENT_TYPE","jsxProd","maybeKey","propName","ref","$$typeof","props","exports","process","env","NODE_ENV","getComponentNameFromType","REACT_CLIENT_REFERENCE","displayName","name","REACT_PROFILER_TYPE","REACT_STRICT_MODE_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_ACTIVITY_TYPE","tag","REACT_PORTAL_TYPE","REACT_CONTEXT_TYPE","REACT_CONSUMER_TYPE","_context","REACT_FORWARD_REF_TYPE","innerType","render","REACT_MEMO_TYPE","REACT_LAZY_TYPE","_payload","_init","x","testStringCoercion","checkKeyStringCoercion","JSCompiler_inline_result","JSCompiler_temp_const","JSCompiler_inline_result$jscomp$0","toStringTag","call","getTaskName","getOwner","dispatcher","ReactSharedInternals","A","UnknownOwner","hasValidKey","hasOwnProperty","getter","getOwnPropertyDescriptor","isReactWarning","defineKeyPropWarningGetter","warnAboutAccessingKey","specialPropKeyWarningShown","defineProperty","configurable","elementRefGetterWithDeprecationWarning","componentName","didWarnAboutElementRef","ReactElement","owner","debugStack","debugTask","refProp","_owner","enumerable","_store","writable","freeze","jsxDEVImpl","isStaticChildren","children","isArrayImpl","validateChildKeys","keys","k","didWarnAboutKeySpread","isValidElement","validated","object","React","require","__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE","prototype","isArray","createTask","react_stack_bottom_frame","callStackForError","unknownOwnerDebugStack","bind","unknownOwnerDebugTask","trackActualOwner","recentlyCreatedOwnerStacks","module","f","l","m","n","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","ReactCurrentOwner","p","__self","__source","q","c","a","g","b","d","h","defaultProps","REACT_PROVIDER_TYPE","REACT_OFFSCREEN_TYPE","MAYBE_ITERATOR_SYMBOL","iterator","FAUX_ITERATOR_SYMBOL","getIteratorFn","maybeIterable","maybeIterator","format","_len2","arguments","args","_key2","printWarning","level","ReactDebugCurrentFrame","stack","getStackAddendum","concat","argsWithFormat","item","String","unshift","Function","apply","enableScopeAPI","enableCacheElement","enableTransitionTracing","enableLegacyHidden","enableDebugTracing","REACT_MODULE_REFERENCE","isValidElementType","getModuleId","undefined","getWrappedName","outerType","wrapperName","functionName","getContextName","context","outerName","lazyComponent","payload","disabledDepth","prevLog","prevInfo","prevWarn","prevError","prevGroup","prevGroupCollapsed","prevGroupEnd","disabledLog","__reactDisabledLog","disableLogs","group","groupCollapsed","groupEnd","defineProperties","reenableLogs","ReactCurrentDispatcher","prefix","describeBuiltInComponentFrame","source","ownerFn","match","reentry","componentFrameCache","PossiblyWeakMap","WeakMap","Map","describeNativeComponentFrame","fn","construct","frame","control","previousPrepareStackTrace","prepareStackTrace","previousDispatcher","Fake","set","Reflect","sample","sampleLines","split","controlLines","s","_frame","includes","syntheticFrame","describeFunctionComponentFrame","shouldConstruct","Component","isReactComponent","describeUnknownElementTypeFrameInDEV","loggedTypeFailures","setCurrentlyValidatingElement","element","_source","setExtraStackFrame","checkPropTypes","typeSpecs","values","location","has","typeSpecName","error$1","ex","typeName","hasToStringTag","willCoercionThrow","RESERVED_PROPS","specialPropRefWarningShown","hasValidRef","warnIfStringRefCannotBeAutoConverted","self","defineRefPropWarningGetter","warnAboutAccessingRef","jsxDEV","ReactCurrentOwner$1","ReactDebugCurrentFrame$1","setCurrentlyValidatingElement$1","propTypesMisspellWarningShown","getDeclarationErrorAddendum","getSourceInfoErrorAddendum","ownerHasKeyUseWarning","getCurrentComponentErrorInfo","parentType","parentName","validateExplicitKey","currentComponentErrorInfo","childOwner","child","iteratorFn","entries","step","next","done","validatePropTypes","propTypes","PropTypes","_name","getDefaultProps","isReactClassApproved","validateFragmentProps","fragment","jsxWithValidation","validType","sourceInfo","typeString","beforeExample","afterExample","jsxWithValidationStatic","jsxWithValidationDynamic","jsx","jsxs","OauthApiClient","_updateFromGlobalConfig","globalConfig","_customBaseUrl","base","didApiUrl","isAbsolute","test","isServer","window","fullUrl","cleanFull","cleanBase","cleanModule","modulePath","baseUrl","_customTimeout","timeout","_normalizeProviderArgs","providerOrOptions","_getSocialUrl","getAuthUrl","normalized","targetProvider","isLink","requestUrl","authUrl","oauth_url","handleCallback","code","state","callbackProvider","callbackCode","callbackState","resultData","user","username","display_name","getProviders","delete","unlinkAccount","getBoundAccounts","bindings","formatted","platform","email","getLinkedAccounts","checkBindStatus","getWalletMessage","verifyWalletSignature","loginWithWallet","bindWallet","unbindWallet","getBoundWallets","getSSOUrl","verifySSOToken","token","ssoLogout","checkAuth","logout","refreshToken","refresh_token","revokeToken","getTokenInfo","getAuthorizedApps","revokeAppAuthorization","appId","oauthApi","AuthApiClient","onTokenRefresh","onAuthError","_tokenKey","tokenStorageKey","_refreshTokenKey","refreshTokenStorageKey","_currentSessionKey","currentSessionKey","configure","apiBaseUrl","setBaseUrl","configureCallbacks","getNonce","walletAddress","chainType","wallet_address","chain_type","walletLogin","access_token","setTokens","didLogin","did","password","totpCode","totp_code","register","nickname","refreshAuthToken","clearTokens","getMe","setPin","getRefreshToken","localStorage","getItem","accessToken","setItem","removeItem","isAuthenticated","getToken","getCurrentSession","setCurrentSession","sessionId","authApi","PortfolioOverview","toLocaleString","today_pnl","toFixed","total_pnl","asset","symbol","InvestProductList","selectedProduct","setSelectedProduct","setAmount","handleSubscribe","product","apy","term","min_amount","onClick","stopPropagation","onChange","placeholder","min","parseFloat","MyInvestments","investment","product_name","earning","product_id","zh","walletQBit","subtitle","todayProfit","totalProfit","actions","deposit","transfer","invest","flexible","fixed","staking","minAmount","investments","holding","redeemed","defi","pools","transactions","alerts","create","priceAbove","priceBelow","messages","depositSuccess","withdrawSuccess","investSuccess","redeemSuccess","errors","insufficientBalance","minAmountRequired","withdrawFailed","en","ProductType","FLEXIBLE","FIXED","STAKING","DEFI","TransactionType","DEPOSIT","WITHDRAW","TRANSFER","INVEST","REDEEM","EARNING","TOKEN_TRANSFER"],"mappings":";;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;;;AAIA;AACA;AACA;AACO,MAAMA,mBAAmB,SAASC,uBAAa,CAAC;AACrDC,EAAAA,WAAWA,CAACC,MAAM,GAAG,EAAE,EAAE;AACvB,IAAA,KAAK,CAAC,mBAAmB,EAAEA,MAAM,CAAC;AACpC,EAAA;;AAEA;;AAEA;AACF;AACA;AACA;AACE,EAAA,MAAMC,UAAUA,CAACC,OAAO,GAAG,EAAE,EAAE;AAC7B,IAAA,OAAO,IAAI,CAACC,IAAI,CAAC,OAAO,EAAED,OAAO,CAAC;AACpC,EAAA;;AAEA;AACF;AACA;EACE,MAAME,eAAeA,GAAG;AACtB,IAAA,OAAO,IAAI,CAACC,GAAG,CAAC,SAAS,CAAC;AAC5B,EAAA;;AAEA;AACF;AACA;AACA;EACE,MAAMC,WAAWA,CAACC,WAAW,EAAE;AAC7B,IAAA,OAAO,IAAI,CAACJ,IAAI,CAAC,OAAO,EAAEI,WAAW,CAAC;AACxC,EAAA;;AAEA;AACF;AACA;EACE,MAAMC,aAAaA,GAAG;AACpB,IAAA,OAAO,IAAI,CAACL,IAAI,CAAC,SAAS,CAAC;AAC7B,EAAA;;AAEA;;AAEA;AACF;AACA;EACE,MAAMM,YAAYA,GAAG;AACnB,IAAA,OAAO,IAAI,CAACJ,GAAG,CAAC,YAAY,CAAC;AAC/B,EAAA;;AAEA;AACF;AACA;AACA;EACE,MAAMK,UAAUA,CAACC,OAAO,EAAE;AACxB,IAAA,OAAO,IAAI,CAACN,GAAG,CAAC,CAAA,SAAA,EAAYM,OAAO,EAAE,CAAC;AACxC,EAAA;;AAEA;AACF;AACA;EACE,MAAMC,cAAcA,GAAG;AACrB,IAAA,OAAO,IAAI,CAACP,GAAG,CAAC,WAAW,CAAC;AAC9B,EAAA;;AAEA;AACF;AACA;AACA;AACE,EAAA,MAAMQ,eAAeA,CAACC,MAAM,GAAG,EAAE,EAAE;AACjC,IAAA,OAAO,IAAI,CAACT,GAAG,CAAC,oBAAoB,EAAES,MAAM,CAAC;AAC/C,EAAA;;AAEA;;AAEA;AACF;AACA;AACA;AACE,EAAA,MAAMC,iBAAiBA,CAACD,MAAM,GAAG,EAAE,EAAE;AACnC,IAAA,OAAO,IAAI,CAACT,GAAG,CAAC,kBAAkB,EAAES,MAAM,CAAC;AAC7C,EAAA;;AAEA;AACF;AACA;AACA;EACE,MAAME,UAAUA,CAACC,SAAS,EAAE;AAC1B,IAAA,OAAO,IAAI,CAACZ,GAAG,CAAC,CAAA,iBAAA,EAAoBY,SAAS,EAAE,CAAC;AAClD,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACE,EAAA,MAAMC,SAASA,CAACD,SAAS,EAAEE,MAAM,EAAE;AACjC,IAAA,OAAO,IAAI,CAAChB,IAAI,CAAC,CAAA,iBAAA,EAAoBc,SAAS,YAAY,EAAE;AAAEE,MAAAA;AAAO,KAAC,CAAC;AACzE,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACE,EAAA,MAAMC,MAAMA,CAACH,SAAS,EAAEE,MAAM,EAAE;AAC9B,IAAA,OAAO,IAAI,CAAChB,IAAI,CAAC,CAAA,iBAAA,EAAoBc,SAAS,SAAS,EAAE;AAAEE,MAAAA;AAAO,KAAC,CAAC;AACtE,EAAA;;AAEA;AACF;AACA;EACE,MAAME,gBAAgBA,GAAG;AACvB,IAAA,OAAO,IAAI,CAAChB,GAAG,CAAC,YAAY,CAAC;AAC/B,EAAA;;AAEA;;AAEA;AACF;AACA;AACA;AACA;AACE,EAAA,MAAMiB,iBAAiBA,CAACX,OAAO,EAAEY,KAAK,EAAE;AACtC,IAAA,OAAO,IAAI,CAAClB,GAAG,CAAC,kBAAkB,EAAE;AAAEmB,MAAAA,QAAQ,EAAEb,OAAO;AAAEY,MAAAA;AAAM,KAAC,CAAC;AACnE,EAAA;;AAEA;AACF;AACA;AACA;EACE,MAAME,QAAQA,CAACC,YAAY,EAAE;AAC3B,IAAA,OAAO,IAAI,CAACvB,IAAI,CAAC,WAAW,EAAEuB,YAAY,CAAC;AAC7C,EAAA;;AAEA;AACF;AACA;AACA;EACE,MAAMC,gBAAgBA,CAACC,YAAY,EAAE;AACnC,IAAA,OAAO,IAAI,CAACzB,IAAI,CAAC,oBAAoB,EAAEyB,YAAY,CAAC;AACtD,EAAA;;AAEA;AACF;AACA;AACA;AACE,EAAA,MAAMC,qBAAqBA,CAACf,MAAM,GAAG,EAAE,EAAE;AACvC,IAAA,OAAO,IAAI,CAACT,GAAG,CAAC,eAAe,EAAES,MAAM,CAAC;AAC1C,EAAA;;AAEA;AACF;AACA;AACA;EACE,MAAMgB,cAAcA,CAACC,IAAI,EAAE;AACzB,IAAA,OAAO,IAAI,CAAC1B,GAAG,CAAC,CAAA,cAAA,EAAiB0B,IAAI,EAAE,CAAC;AAC1C,EAAA;;AAEA;;AAEA;AACF;AACA;AACA;AACE,EAAA,MAAMC,WAAWA,CAAClB,MAAM,GAAG,EAAE,EAAE;AAC7B,IAAA,OAAO,IAAI,CAACT,GAAG,CAAC,WAAW,EAAES,MAAM,CAAC;AACtC,EAAA;;AAEA;AACF;AACA;AACA;AACE,EAAA,MAAMmB,iBAAiBA,CAACnB,MAAM,GAAG,EAAE,EAAE;AACnC,IAAA,OAAO,IAAI,CAACT,GAAG,CAAC,mBAAmB,EAAES,MAAM,CAAC;AAC9C,EAAA;;AAEA;AACF;AACA;AACA;EACE,MAAMoB,MAAMA,CAACjB,SAAS,EAAE;AACtB,IAAA,OAAO,IAAI,CAACZ,GAAG,CAAC,CAAA,iBAAA,EAAoBY,SAAS,MAAM,CAAC;AACtD,EAAA;;AAEA;;AAEA;AACF;AACA;EACE,MAAMkB,gBAAgBA,GAAG;AACvB,IAAA,OAAO,IAAI,CAAC9B,GAAG,CAAC,iBAAiB,CAAC;AACpC,EAAA;;AAEA;AACF;AACA;AACA;AACE,EAAA,MAAM+B,iBAAiBA,CAACtB,MAAM,GAAG,EAAE,EAAE;AACnC,IAAA,OAAO,IAAI,CAACT,GAAG,CAAC,aAAa,EAAES,MAAM,CAAC;AACxC,EAAA;;AAEA;AACF;AACA;AACA;EACE,MAAMuB,YAAYA,CAACC,aAAa,EAAE;AAChC,IAAA,OAAO,IAAI,CAACnC,IAAI,CAAC,qBAAqB,EAAEmC,aAAa,CAAC;AACxD,EAAA;;AAEA;AACF;AACA;AACA;EACE,MAAMC,eAAeA,CAACD,aAAa,EAAE;AACnC,IAAA,OAAO,IAAI,CAACnC,IAAI,CAAC,wBAAwB,EAAEmC,aAAa,CAAC;AAC3D,EAAA;;AAEA;AACF;AACA;AACA;EACE,MAAME,KAAKA,CAACC,SAAS,EAAE;AACrB,IAAA,OAAO,IAAI,CAACtC,IAAI,CAAC,aAAa,EAAEsC,SAAS,CAAC;AAC5C,EAAA;;AAEA;AACF;AACA;AACA;EACE,MAAMC,OAAOA,CAACC,WAAW,EAAE;AACzB,IAAA,OAAO,IAAI,CAACxC,IAAI,CAAC,eAAe,EAAEwC,WAAW,CAAC;AAChD,EAAA;;AAEA;;AAEA;AACF;AACA;EACE,MAAMC,uBAAuBA,GAAG;AAC9B,IAAA,OAAO,IAAI,CAACvC,GAAG,CAAC,yBAAyB,CAAC;AAC5C,EAAA;;AAEA;AACF;AACA;AACA;EACE,MAAMwC,0BAA0BA,CAACC,QAAQ,EAAE;AACzC,IAAA,OAAO,IAAI,CAACC,GAAG,CAAC,yBAAyB,EAAED,QAAQ,CAAC;AACtD,EAAA;;AAEA;AACF;AACA;AACA;EACE,MAAME,aAAaA,CAACC,KAAK,EAAE;AACzB,IAAA,OAAO,IAAI,CAAC9C,IAAI,CAAC,eAAe,EAAE8C,KAAK,CAAC;AAC1C,EAAA;;AAEA;AACF;AACA;EACE,MAAMC,WAAWA,GAAG;AAClB,IAAA,OAAO,IAAI,CAAC7C,GAAG,CAAC,SAAS,CAAC;AAC5B,EAAA;AACF;;AAEA;MACa8C,aAAa,GAAG,IAAItD,mBAAmB;;ACpRpD;AACA;AACA;AACA;AACA;AACA;;;AAIA;AACA,MAAMuD,iBAAiB,GAAG,CACxB,kCAAkC,EAClC,kCAAkC,CACnC;;AAED;AACA;AACA;AACO,MAAMC,aAAa,CAAC;EACzB,OAAOC,MAAM,GAAG,EAAE;EAClB,OAAOC,WAAW,GAAG,YAAY;EACjC,OAAOC,QAAQ,GAAG,EAAE;EACpB,OAAOC,eAAe,GAAG,CAAC;;AAE1B;AACF;AACA;AACA;AACE,EAAA,OAAOC,IAAIA,CAACxD,OAAO,GAAG,EAAE,EAAE;AACxB,IAAA,IAAI,CAACoD,MAAM,GAAGpD,OAAO,CAACoD,MAAM,IAAI,EAAE;AAClC,IAAA,IAAI,CAACC,WAAW,GAAGrD,OAAO,CAACqD,WAAW,IAAI,YAAY;;AAEtD;IACA,MAAMI,KAAK,GAAG,EAAE;IAChB,IAAIzD,OAAO,CAAC0D,eAAe,EAAE;AAC3BD,MAAAA,KAAK,CAACE,IAAI,CAAC3D,OAAO,CAAC0D,eAAe,CAAC;AACrC,IAAA;IACA,IAAI;AACF,MAAA,MAAM5D,MAAM,GAAG8D,mBAAS,EAAE;MAC1B,IAAI9D,MAAM,CAAC+D,aAAa,EAAE;AACxBJ,QAAAA,KAAK,CAACE,IAAI,CAAC7D,MAAM,CAAC+D,aAAa,CAACC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACrD,MAAA;MACA,IAAIhE,MAAM,CAACiE,UAAU,EAAE;AACrBN,QAAAA,KAAK,CAACE,IAAI,CAAC7D,MAAM,CAACiE,UAAU,CAACD,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAClD,MAAA;IACF,CAAC,CAAC,OAAOE,CAAC,EAAE;AACV;AAAA,IAAA;;AAGF;IACAd,iBAAiB,CAACe,OAAO,CAACC,IAAI,IAAIT,KAAK,CAACE,IAAI,CAACO,IAAI,CAAC,CAAC;;AAEnD;AACA,IAAA,IAAI,CAACZ,QAAQ,GAAGa,KAAK,CAACC,IAAI,CAAC,IAAIC,GAAG,CAACZ,KAAK,CAACa,MAAM,CAACC,OAAO,CAAC,CAAC,CAAC;IAC1D,IAAI,CAAChB,eAAe,GAAG,CAAC;AAExBiB,IAAAA,OAAO,CAACC,GAAG,CAAC,CAAA,qBAAA,EAAwB,IAAI,CAACpB,WAAW,CAAA,MAAA,CAAQ,EAAE,IAAI,CAACC,QAAQ,CAAC;AAC9E,EAAA;;AAEA;AACF;AACA;AACE,EAAA,aAAaoB,WAAWA,CAACC,IAAI,EAAE3E,OAAO,GAAG,EAAE,EAAE4E,OAAO,GAAG,CAAC,EAAE;IACxD,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGD,OAAO,EAAEC,CAAC,EAAE,EAAE;MAChC,MAAMC,UAAU,GAAG,IAAI,CAACxB,QAAQ,CAAC,IAAI,CAACC,eAAe,CAAC;AACtD,MAAA,MAAMwB,GAAG,GAAG,CAAA,EAAGD,UAAU,CAAA,EAAGH,IAAI,CAAA,CAAE;MAClC,IAAI;AACF,QAAA,MAAMK,GAAG,GAAG,MAAMC,KAAK,CAACF,GAAG,EAAE;AAC3B,UAAA,GAAG/E,OAAO;AACVkF,UAAAA,OAAO,EAAE;AACP,YAAA,cAAc,EAAE,kBAAkB;YAClC,eAAe,EAAE,IAAI,CAAC9B,MAAM;AAC5B,YAAA,IAAIpD,OAAO,CAACkF,OAAO,IAAI,EAAE;AAC3B;AACF,SAAC,CAAC;QACF,IAAIF,GAAG,CAACG,EAAE,EAAE;AACV,UAAA,OAAO,MAAMH,GAAG,CAACI,IAAI,EAAE;AACzB,QAAA;QACA,MAAM,IAAIC,KAAK,CAAC,CAAA,iBAAA,EAAoBL,GAAG,CAACM,MAAM,EAAE,CAAC;MACnD,CAAC,CAAC,OAAOC,GAAG,EAAE;QACZf,OAAO,CAACgB,IAAI,CAAC,CAAA,mBAAA,EAAsBV,UAAU,CAAA,cAAA,CAAgB,EAAES,GAAG,CAAC;AACnE;AACA,QAAA,IAAI,CAAChC,eAAe,GAAG,CAAC,IAAI,CAACA,eAAe,GAAG,CAAC,IAAI,IAAI,CAACD,QAAQ,CAACmC,MAAM;AAC1E,MAAA;AACF,IAAA;AACA,IAAA,MAAM,IAAIJ,KAAK,CAAC,CAAA,yBAAA,CAA2B,CAAC;AAC9C,EAAA;AACF;;AAEA;AACA;AACA;AACO,MAAMK,SAAS,CAAC;EACrB,OAAOC,SAAS,GAAG,IAAI;EAEvB,OAAOC,eAAeA,GAAG;IACvB,IAAI,IAAI,CAACD,SAAS,EAAE;IACpB,IAAI,CAACA,SAAS,GAAGE,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;AAC9C,IAAA,IAAI,CAACH,SAAS,CAACI,SAAS,GAAG,sBAAsB;IACjDC,MAAM,CAACC,MAAM,CAAC,IAAI,CAACN,SAAS,CAACO,KAAK,EAAE;AAClCC,MAAAA,QAAQ,EAAE,OAAO;AACjBC,MAAAA,GAAG,EAAE,QAAQ;AACbC,MAAAA,KAAK,EAAE,QAAQ;AACfC,MAAAA,MAAM,EAAE,OAAO;AACfC,MAAAA,OAAO,EAAE,MAAM;AACfC,MAAAA,aAAa,EAAE,QAAQ;AACvBC,MAAAA,GAAG,EAAE,SAAS;AACdC,MAAAA,aAAa,EAAE;AACjB,KAAC,CAAC;IACFb,QAAQ,CAACc,IAAI,CAACC,WAAW,CAAC,IAAI,CAACjB,SAAS,CAAC;AAC3C,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACE,EAAA,OAAOkB,IAAIA,CAAC7G,OAAO,GAAG,EAAE,EAAE;IACxB,IAAI,CAAC4F,eAAe,EAAE;IACtB,MAAMkB,EAAE,GAAG,QAAQ,GAAGC,IAAI,CAACC,MAAM,EAAE,CAACC,QAAQ,CAAC,EAAE,CAAC,CAACC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;AAChE,IAAA,MAAMC,KAAK,GAAGtB,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;IAC3CqB,KAAK,CAACL,EAAE,GAAGA,EAAE;IACbK,KAAK,CAACpB,SAAS,GAAG,CAAA,sBAAA,EAAyB/F,OAAO,CAACoH,IAAI,IAAI,MAAM,CAAA,CAAE;;AAEnE;AACApB,IAAAA,MAAM,CAACC,MAAM,CAACkB,KAAK,CAACjB,KAAK,EAAE;AACzBmB,MAAAA,OAAO,EAAE,kBAAkB;AAC3BC,MAAAA,UAAU,EAAE,wBAAwB;AACpCC,MAAAA,cAAc,EAAE,YAAY;AAC5BC,MAAAA,oBAAoB,EAAE,YAAY;MAClCC,UAAU,EAAE,CAAA,UAAA,EAAa,IAAI,CAACC,QAAQ,CAAC1H,OAAO,CAACoH,IAAI,CAAC,CAAA,CAAE;AACtDO,MAAAA,YAAY,EAAE,QAAQ;AACtBC,MAAAA,SAAS,EAAE,qCAAqC;AAChDC,MAAAA,KAAK,EAAE,SAAS;AAChBC,MAAAA,QAAQ,EAAE,UAAU;AACpBC,MAAAA,UAAU,EAAE,8BAA8B;AAC1CxB,MAAAA,OAAO,EAAE,MAAM;AACfyB,MAAAA,UAAU,EAAE,QAAQ;AACpBvB,MAAAA,GAAG,EAAE,SAAS;AACdC,MAAAA,aAAa,EAAE,MAAM;AACrBuB,MAAAA,UAAU,EAAE,uCAAuC;AACnDC,MAAAA,OAAO,EAAE,GAAG;AACZC,MAAAA,SAAS,EAAE;AACb,KAAC,CAAC;IAEF,MAAMC,IAAI,GAAG,IAAI,CAACC,OAAO,CAACrI,OAAO,CAACoH,IAAI,CAAC;AACvC,IAAA,MAAMkB,QAAQ,GAAGzC,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;AAC9CwC,IAAAA,QAAQ,CAACpC,KAAK,CAACqC,IAAI,GAAG,GAAG;AACzBD,IAAAA,QAAQ,CAACE,WAAW,GAAGxI,OAAO,CAACyI,OAAO;AAEtCtB,IAAAA,KAAK,CAACP,WAAW,CAACwB,IAAI,CAAC;AACvBjB,IAAAA,KAAK,CAACP,WAAW,CAAC0B,QAAQ,CAAC;IAE3B,IAAItI,OAAO,CAAC0I,MAAM,EAAE;AAClB,MAAA,MAAMC,IAAI,GAAG9C,QAAQ,CAACC,aAAa,CAAC,GAAG,CAAC;MACxC,IAAI8C,WAAW,GAAG,kCAAkC;MACpD,IAAI;AACF,QAAA,MAAM9I,MAAM,GAAG8D,mBAAS,EAAE;AAC1B,QAAA,MAAMiF,OAAO,GAAG/I,MAAM,CAACgJ,YAAY,IAAI,SAAS;AAChD,QAAA,MAAMC,SAAS,GAAGC,wBAAc,CAACH,OAAO,CAAC;AACzC,QAAA,IAAIE,SAAS,IAAIA,SAAS,CAACH,WAAW,EAAE;UACtCA,WAAW,GAAGG,SAAS,CAACH,WAAW;AACrC,QAAA;MACF,CAAC,CAAC,OAAO5E,CAAC,EAAE;AACV,QAAA,IAAIb,aAAa,CAACE,WAAW,KAAK,YAAY,EAAE;AAC9CuF,UAAAA,WAAW,GAAG,sCAAsC;AACtD,QAAA;AACF,MAAA;AACAD,MAAAA,IAAI,CAACM,IAAI,GAAG,CAAA,EAAGL,WAAW,CAAC9E,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA,IAAA,EAAO9D,OAAO,CAAC0I,MAAM,CAAA,CAAE;MACpEC,IAAI,CAACO,MAAM,GAAG,QAAQ;MACtBP,IAAI,CAACH,WAAW,GAAG,SAAS;AAC5BxC,MAAAA,MAAM,CAACC,MAAM,CAAC0C,IAAI,CAACzC,KAAK,EAAE;AACxB2B,QAAAA,KAAK,EAAE,SAAS;AAChBsB,QAAAA,cAAc,EAAE,MAAM;AACtBrB,QAAAA,QAAQ,EAAE,SAAS;AACnBsB,QAAAA,UAAU,EAAE,MAAM;AAClBC,QAAAA,UAAU,EAAE;AACd,OAAC,CAAC;AACFlC,MAAAA,KAAK,CAACP,WAAW,CAAC+B,IAAI,CAAC;AACzB,IAAA;AAEA,IAAA,IAAI,CAAChD,SAAS,CAACiB,WAAW,CAACO,KAAK,CAAC;;AAEjC;AACAmC,IAAAA,UAAU,CAAC,MAAM;AACfnC,MAAAA,KAAK,CAACjB,KAAK,CAACgC,OAAO,GAAG,GAAG;AACzBf,MAAAA,KAAK,CAACjB,KAAK,CAACiC,SAAS,GAAG,eAAe;IACzC,CAAC,EAAE,EAAE,CAAC;;AAEN;IACA,IAAInI,OAAO,CAACuJ,QAAQ,KAAK,CAAC,IAAIvJ,OAAO,CAACoH,IAAI,KAAK,SAAS,EAAE;AACxDkC,MAAAA,UAAU,CAAC,MAAM;AACf,QAAA,IAAI,CAACE,OAAO,CAAC1C,EAAE,CAAC;AAClB,MAAA,CAAC,EAAE9G,OAAO,CAACuJ,QAAQ,IAAI,IAAI,CAAC;AAC9B,IAAA;AAEA,IAAA,OAAOzC,EAAE;AACX,EAAA;EAEA,OAAO2C,MAAMA,CAAC3C,EAAE,EAAE9G,OAAO,GAAG,EAAE,EAAE;AAC9B,IAAA,MAAMmH,KAAK,GAAGtB,QAAQ,CAAC6D,cAAc,CAAC5C,EAAE,CAAC;IACzC,IAAI,CAACK,KAAK,EAAE;AACZ,IAAA,MAAMmB,QAAQ,GAAGnB,KAAK,CAACwC,aAAa,CAAC,KAAK,CAAC;AAC3C,IAAA,IAAIrB,QAAQ,IAAItI,OAAO,CAACyI,OAAO,EAAE;AAC/BH,MAAAA,QAAQ,CAACE,WAAW,GAAGxI,OAAO,CAACyI,OAAO;AACxC,IAAA;IACA,IAAIzI,OAAO,CAACoH,IAAI,EAAE;AAChBD,MAAAA,KAAK,CAACpB,SAAS,GAAG,yBAAyB/F,OAAO,CAACoH,IAAI,CAAA,CAAE;AACzDD,MAAAA,KAAK,CAACjB,KAAK,CAACuB,UAAU,GAAG,CAAA,UAAA,EAAa,IAAI,CAACC,QAAQ,CAAC1H,OAAO,CAACoH,IAAI,CAAC,CAAA,CAAE;AACrE,IAAA;AACF,EAAA;EAEA,OAAOoC,OAAOA,CAAC1C,EAAE,EAAE;AACjB,IAAA,MAAMK,KAAK,GAAGtB,QAAQ,CAAC6D,cAAc,CAAC5C,EAAE,CAAC;IACzC,IAAI,CAACK,KAAK,EAAE;AACZA,IAAAA,KAAK,CAACjB,KAAK,CAACgC,OAAO,GAAG,GAAG;AACzBf,IAAAA,KAAK,CAACjB,KAAK,CAACiC,SAAS,GAAG,mBAAmB;AAC3CmB,IAAAA,UAAU,CAAC,MAAM;MACf,IAAInC,KAAK,CAACyC,UAAU,EAAE;AACpBzC,QAAAA,KAAK,CAACyC,UAAU,CAACC,WAAW,CAAC1C,KAAK,CAAC;AACrC,MAAA;IACF,CAAC,EAAE,GAAG,CAAC;AACT,EAAA;EAEA,OAAOO,QAAQA,CAACN,IAAI,EAAE;AACpB,IAAA,QAAQA,IAAI;AACV,MAAA,KAAK,SAAS;AAAE,QAAA,OAAO,SAAS;AAAE;AAClC,MAAA,KAAK,SAAS;AAAE,QAAA,OAAO,SAAS;AAAE;AAClC,MAAA,KAAK,OAAO;AAAE,QAAA,OAAO,SAAS;AAAI;AAClC,MAAA,KAAK,SAAS;AAAE,QAAA,OAAO,SAAS;AAAE;AAClC,MAAA;AAAS,QAAA,OAAO,SAAS;AAC3B;AACF,EAAA;EAEA,OAAOiB,OAAOA,CAACjB,IAAI,EAAE;AACnB,IAAA,MAAM0C,EAAE,GAAGjE,QAAQ,CAACC,aAAa,CAAC,MAAM,CAAC;AACzCgE,IAAAA,EAAE,CAAC5D,KAAK,CAAC4B,QAAQ,GAAG,UAAU;AAC9B,IAAA,QAAQV,IAAI;AACV,MAAA,KAAK,SAAS;QAAE0C,EAAE,CAACtB,WAAW,GAAG,GAAG;AAAE,QAAA;AACtC,MAAA,KAAK,SAAS;QAAEsB,EAAE,CAACtB,WAAW,GAAG,IAAI;AAAE,QAAA;AACvC,MAAA,KAAK,OAAO;QAAEsB,EAAE,CAACtB,WAAW,GAAG,GAAG;AAAE,QAAA;AACpC,MAAA,KAAK,SAAS;QACZsB,EAAE,CAACtB,WAAW,GAAG,IAAI;AACrBsB,QAAAA,EAAE,CAAC5D,KAAK,CAACK,OAAO,GAAG,cAAc;AACjCuD,QAAAA,EAAE,CAAC5D,KAAK,CAAC6D,SAAS,GAAG,gCAAgC;AACrD,QAAA;AACF,MAAA;QAASD,EAAE,CAACtB,WAAW,GAAG,IAAI;AAAE,QAAA;AAClC;AACA,IAAA,OAAOsB,EAAE;AACX,EAAA;AACF;;AAEA;AACA,IAAI,OAAOjE,QAAQ,KAAK,WAAW,EAAE;AACnC,EAAA,MAAMK,KAAK,GAAGL,QAAQ,CAACC,aAAa,CAAC,OAAO,CAAC;EAC7CI,KAAK,CAAC8D,SAAS,GAAG;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA,CAAG;AACDnE,EAAAA,QAAQ,CAACoE,IAAI,CAACrD,WAAW,CAACV,KAAK,CAAC;AAClC;;AAEA;AACA;AACA;AACO,MAAMgE,WAAW,CAAC;EACvB,OAAOC,aAAa,GAAG,IAAI;;AAE3B;AACF;AACA;AACA;AACE,EAAA,OAAOC,IAAIA,CAACpK,OAAO,GAAG,EAAE,EAAE;IACxB,IAAI,IAAI,CAACmK,aAAa,EAAE;MACtB,IAAI,CAACE,KAAK,EAAE;AACd,IAAA;AAEA,IAAA,MAAMC,OAAO,GAAGzE,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;IAC7CwE,OAAO,CAACvE,SAAS,GAAG,kBAAkB;AACtCC,IAAAA,MAAM,CAACC,MAAM,CAACqE,OAAO,CAACpE,KAAK,EAAE;AAC3BC,MAAAA,QAAQ,EAAE,OAAO;AACjBoE,MAAAA,KAAK,EAAE,GAAG;AACVjD,MAAAA,UAAU,EAAE,wBAAwB;AACpCC,MAAAA,cAAc,EAAE,YAAY;AAC5BC,MAAAA,oBAAoB,EAAE,YAAY;AAClClB,MAAAA,MAAM,EAAE,MAAM;AACdC,MAAAA,OAAO,EAAE,MAAM;AACfyB,MAAAA,UAAU,EAAE,QAAQ;AACpBwC,MAAAA,cAAc,EAAE,QAAQ;AACxBzC,MAAAA,UAAU,EAAE;AACd,KAAC,CAAC;AAEF,IAAA,MAAM0C,KAAK,GAAG5E,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;IAC3C2E,KAAK,CAAC1E,SAAS,GAAG,gBAAgB;AAClCC,IAAAA,MAAM,CAACC,MAAM,CAACwE,KAAK,CAACvE,KAAK,EAAE;AACzBoB,MAAAA,UAAU,EAAE,wBAAwB;AACpCoD,MAAAA,MAAM,EAAE,oCAAoC;AAC5C/C,MAAAA,YAAY,EAAE,SAAS;AACvBN,MAAAA,OAAO,EAAE,MAAM;AACfsD,MAAAA,KAAK,EAAE,MAAM;AACbC,MAAAA,QAAQ,EAAE,OAAO;AACjB/C,MAAAA,KAAK,EAAE,SAAS;AAChBD,MAAAA,SAAS,EAAE;AACb,KAAC,CAAC;;AAEF;IACA6C,KAAK,CAACT,SAAS,GAAG;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,qEAAA,EAAuEhK,OAAO,CAACiB,MAAM,CAAA;AACrF;AACA,UAAA,EAAYjB,OAAO,CAAC6K,SAAS;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,CAAK;AAEDP,IAAAA,OAAO,CAAC1D,WAAW,CAAC6D,KAAK,CAAC;AAC1B5E,IAAAA,QAAQ,CAACc,IAAI,CAACC,WAAW,CAAC0D,OAAO,CAAC;IAClC,IAAI,CAACH,aAAa,GAAGG,OAAO;;AAE5B;AACA,IAAA,MAAMQ,MAAM,GAAGL,KAAK,CAACM,gBAAgB,CAAC,iBAAiB,CAAC;AACxD,IAAA,MAAMC,UAAU,GAAGP,KAAK,CAACd,aAAa,CAAC,mBAAmB,CAAC;AAC3D,IAAA,MAAMsB,MAAM,GAAGR,KAAK,CAACd,aAAa,CAAC,eAAe,CAAC;AAEnDmB,IAAAA,MAAM,CAAC7G,OAAO,CAAC,CAACiH,KAAK,EAAEC,KAAK,KAAK;AAC/B;AACAD,MAAAA,KAAK,CAACE,gBAAgB,CAAC,OAAO,EAAE,MAAM;QACpCF,KAAK,CAACG,KAAK,GAAG,EAAE;AAClB,MAAA,CAAC,CAAC;;AAEF;AACAH,MAAAA,KAAK,CAACE,gBAAgB,CAAC,OAAO,EAAGpH,CAAC,IAAK;AACrC,QAAA,IAAIkH,KAAK,CAACG,KAAK,CAAC5F,MAAM,KAAK,CAAC,IAAI0F,KAAK,GAAGL,MAAM,CAACrF,MAAM,GAAG,CAAC,EAAE;UACzDqF,MAAM,CAACK,KAAK,GAAG,CAAC,CAAC,CAACG,KAAK,EAAE;AAC3B,QAAA;AACF,MAAA,CAAC,CAAC;;AAEF;AACAJ,MAAAA,KAAK,CAACE,gBAAgB,CAAC,SAAS,EAAGpH,CAAC,IAAK;AACvC,QAAA,IAAIA,CAAC,CAACuH,GAAG,KAAK,WAAW,IAAIL,KAAK,CAACG,KAAK,KAAK,EAAE,IAAIF,KAAK,GAAG,CAAC,EAAE;UAC5DL,MAAM,CAACK,KAAK,GAAG,CAAC,CAAC,CAACG,KAAK,EAAE;AAC3B,QAAA;AACF,MAAA,CAAC,CAAC;AACJ,IAAA,CAAC,CAAC;;AAEF;AACAhC,IAAAA,UAAU,CAAC,MAAM;AACf,MAAA,IAAIwB,MAAM,CAAC,CAAC,CAAC,EAAEA,MAAM,CAAC,CAAC,CAAC,CAACQ,KAAK,EAAE;IAClC,CAAC,EAAE,GAAG,CAAC;;AAEP;IACAb,KAAK,CAACd,aAAa,CAAC,qBAAqB,CAAC,CAACyB,gBAAgB,CAAC,OAAO,EAAE,MAAM;MACzE,IAAI,CAACf,KAAK,EAAE;MACZ,IAAIrK,OAAO,CAACwL,QAAQ,EAAExL,OAAO,CAACwL,QAAQ,EAAE;AAC1C,IAAA,CAAC,CAAC;;AAEF;AACAP,IAAAA,MAAM,CAACG,gBAAgB,CAAC,OAAO,EAAE,YAAY;MAC3C,MAAMK,GAAG,GAAGtH,KAAK,CAACC,IAAI,CAAC0G,MAAM,CAAC,CAACY,GAAG,CAAC7G,CAAC,IAAIA,CAAC,CAACwG,KAAK,CAAC,CAACM,IAAI,CAAC,EAAE,CAAC;AACzD,MAAA,IAAIF,GAAG,CAAChG,MAAM,GAAG,CAAC,EAAE;AAClB;AACAuF,QAAAA,UAAU,CAACY,SAAS,CAACC,GAAG,CAAC,mBAAmB,CAAC;QAC7Cf,MAAM,CAAC7G,OAAO,CAACY,CAAC,IAAIA,CAAC,CAACwG,KAAK,GAAG,EAAE,CAAC;AACjCP,QAAAA,MAAM,CAAC,CAAC,CAAC,CAACQ,KAAK,EAAE;AACjBhC,QAAAA,UAAU,CAAC,MAAM0B,UAAU,CAACY,SAAS,CAACE,MAAM,CAAC,mBAAmB,CAAC,EAAE,GAAG,CAAC;AACvE,QAAA;AACF,MAAA;;AAEA;MACAb,MAAM,CAACc,QAAQ,GAAG,IAAI;AACtBd,MAAAA,MAAM,CAAC/E,KAAK,CAACQ,aAAa,GAAG,MAAM;AACnCuE,MAAAA,MAAM,CAAC/E,KAAK,CAACgC,OAAO,GAAG,KAAK;MAC5B+C,MAAM,CAACzC,WAAW,GAAG,WAAW;MAEhC,IAAI;AACF;QACA,MAAMwD,OAAO,GAAG,MAAM7I,aAAa,CAACuB,WAAW,CAAC,+BAA+B,EAAE;AAC/EuH,UAAAA,MAAM,EAAE,MAAM;AACdtF,UAAAA,IAAI,EAAEuF,IAAI,CAACC,SAAS,CAAC;YACnBlL,MAAM,EAAEjB,OAAO,CAACiB,MAAM;YACtBmL,KAAK,EAAEpM,OAAO,CAACqM,YAAY;YAC3BC,QAAQ,EAAEtM,OAAO,CAACuM,OAAO;AACzBd,YAAAA,GAAG,EAAEA;WACN;AACH,SAAC,CAAC;QAEF,IAAI,CAACpB,KAAK,EAAE;QACZ,IAAIrK,OAAO,CAACwM,SAAS,EAAE;UACrBxM,OAAO,CAACwM,SAAS,CAAC;AAChBC,YAAAA,OAAO,EAAE,IAAI;YACb/D,MAAM,EAAEsD,OAAO,CAACU,OAAO;YACvBN,KAAK,EAAEpM,OAAO,CAACqM,YAAY;YAC3BpL,MAAM,EAAEjB,OAAO,CAACiB,MAAM;AACtB0L,YAAAA,SAAS,EAAEC,IAAI,CAACC,GAAG;AACrB,WAAC,CAAC;AACJ,QAAA;MACF,CAAC,CAAC,OAAOtH,GAAG,EAAE;AACZ;QACA0F,MAAM,CAACc,QAAQ,GAAG,KAAK;AACvBd,QAAAA,MAAM,CAAC/E,KAAK,CAACQ,aAAa,GAAG,MAAM;AACnCuE,QAAAA,MAAM,CAAC/E,KAAK,CAACgC,OAAO,GAAG,GAAG;QAC1B+C,MAAM,CAACzC,WAAW,GAAG,MAAM;;AAE3B;AACAwC,QAAAA,UAAU,CAACY,SAAS,CAACC,GAAG,CAAC,mBAAmB,CAAC;QAC7Cf,MAAM,CAAC7G,OAAO,CAACY,CAAC,IAAIA,CAAC,CAACwG,KAAK,GAAG,EAAE,CAAC;AACjCP,QAAAA,MAAM,CAAC,CAAC,CAAC,CAACQ,KAAK,EAAE;AACjBhC,QAAAA,UAAU,CAAC,MAAM0B,UAAU,CAACY,SAAS,CAACE,MAAM,CAAC,mBAAmB,CAAC,EAAE,GAAG,CAAC;QAEvEpG,SAAS,CAACmB,IAAI,CAAC;AAAE4B,UAAAA,OAAO,EAAE,CAAA,MAAA,EAASlD,GAAG,CAACkD,OAAO,IAAI,SAAS,CAAA,CAAE;AAAErB,UAAAA,IAAI,EAAE;AAAQ,SAAC,CAAC;QAC/E,IAAIpH,OAAO,CAAC8M,OAAO,EAAE9M,OAAO,CAAC8M,OAAO,CAACvH,GAAG,CAACkD,OAAO,CAAC;AACnD,MAAA;AACF,IAAA,CAAC,CAAC;AACJ,EAAA;EAEA,OAAO4B,KAAKA,GAAG;IACb,IAAI,IAAI,CAACF,aAAa,IAAI,IAAI,CAACA,aAAa,CAACP,UAAU,EAAE;MACvD,IAAI,CAACO,aAAa,CAACP,UAAU,CAACC,WAAW,CAAC,IAAI,CAACM,aAAa,CAAC;MAC7D,IAAI,CAACA,aAAa,GAAG,IAAI;AAC3B,IAAA;AACF,EAAA;AACF;;AAEA;AACA;AACA;AACO,MAAM4C,WAAW,CAAC;AACvB;AACF;AACA;AACA;AACE,EAAA,aAAaC,cAAcA,CAAChN,OAAO,GAAG,EAAE,EAAE;AACxC,IAAA,MAAMiN,OAAO,GAAGvH,SAAS,CAACmB,IAAI,CAAC;AAAE4B,MAAAA,OAAO,EAAE,CAAA,IAAA,EAAOzI,OAAO,CAACkN,KAAK,IAAI,IAAI,CAAA,aAAA,CAAe;AAAE9F,MAAAA,IAAI,EAAE;AAAU,KAAC,CAAC;IAEzG,IAAI;AACF;MACA,MAAM+F,QAAQ,GAAG,MAAMhK,aAAa,CAACuB,WAAW,CAAC,0BAA0B,EAAE;AAC3EuH,QAAAA,MAAM,EAAE,MAAM;AACdtF,QAAAA,IAAI,EAAEuF,IAAI,CAACC,SAAS,CAAC;UACnBiB,SAAS,EAAEpN,OAAO,CAACoN,SAAS;UAC5BC,WAAW,EAAErN,OAAO,CAACsN,UAAU;UAC/BC,UAAU,EAAEvN,OAAO,CAACwN,SAAS;UAC7BC,YAAY,EAAEzN,OAAO,CAAC0N,WAAW;AACjCC,UAAAA,QAAQ,EAAE3N,OAAO,CAAC4N,OAAO,IAAI;SAC9B;AACH,OAAC,CAAC;AAEFlI,MAAAA,SAAS,CAAC+D,MAAM,CAACwD,OAAO,EAAE;AACxBxE,QAAAA,OAAO,EAAE,cAAc;AACvBrB,QAAAA,IAAI,EAAE;AACR,OAAC,CAAC;;AAEF;MACA,MAAM,IAAIyG,OAAO,CAACC,OAAO,IAAIxE,UAAU,CAACwE,OAAO,EAAE,IAAI,CAAC,CAAC;AAEvDpI,MAAAA,SAAS,CAAC+D,MAAM,CAACwD,OAAO,EAAE;AACxBxE,QAAAA,OAAO,EAAE,mBAAmB;AAC5BrB,QAAAA,IAAI,EAAE,SAAS;QACfsB,MAAM,EAAEyE,QAAQ,CAACT;AACnB,OAAC,CAAC;MAEF,OAAO;AACLD,QAAAA,OAAO,EAAE,IAAI;QACb/D,MAAM,EAAEyE,QAAQ,CAACT,OAAO;QACxBqB,WAAW,EAAEZ,QAAQ,CAACa;OACvB;IACH,CAAC,CAAC,OAAOzI,GAAG,EAAE;AACZG,MAAAA,SAAS,CAAC+D,MAAM,CAACwD,OAAO,EAAE;AACxBxE,QAAAA,OAAO,EAAE,CAAA,QAAA,EAAWlD,GAAG,CAACkD,OAAO,CAAA,CAAE;AACjCrB,QAAAA,IAAI,EAAE;AACR,OAAC,CAAC;MACF,OAAO;AACLqF,QAAAA,OAAO,EAAE,KAAK;QACdwB,KAAK,EAAE1I,GAAG,CAACkD;OACZ;AACH,IAAA;AACF,EAAA;;AAEA;AACF;AACA;AACA;AACE,EAAA,aAAayF,cAAcA,CAAClO,OAAO,GAAG,EAAE,EAAE;AACxC,IAAA,OAAO,IAAI6N,OAAO,CAAEC,OAAO,IAAK;MAC9B5D,WAAW,CAACE,IAAI,CAAC;QACfmC,OAAO,EAAEvM,OAAO,CAACmO,IAAI,IAAI,CAAA,IAAA,EAAOvB,IAAI,CAACC,GAAG,EAAE,CAAA,CAAE;QAC5C5L,MAAM,EAAEjB,OAAO,CAACiB,MAAM;QACtB4J,SAAS,EAAE7K,OAAO,CAACkN,KAAK;QACxBb,YAAY,EAAErM,OAAO,CAACoO,SAAS;AAC/B5B,QAAAA,SAAS,EAAGR,OAAO,IAAK8B,OAAO,CAAC9B,OAAO,CAAC;AACxCR,QAAAA,QAAQ,EAAEA,MAAMsC,OAAO,CAAC;AAAErB,UAAAA,OAAO,EAAE,KAAK;AAAEwB,UAAAA,KAAK,EAAE;AAAS,SAAC,CAAC;AAC5DnB,QAAAA,OAAO,EAAGvH,GAAG,IAAKuI,OAAO,CAAC;AAAErB,UAAAA,OAAO,EAAE,KAAK;AAAEwB,UAAAA,KAAK,EAAE1I;SAAK;AAC1D,OAAC,CAAC;AACJ,IAAA,CAAC,CAAC;AACJ,EAAA;AACF;;AAEA;AACA;AACA;AACO,MAAM8I,UAAU,CAAC;AACtB;AACF;AACA;AACE,EAAA,aAAaC,UAAUA,CAAC5F,MAAM,EAAE6F,iBAAiB,EAAEC,YAAY,EAAE;IAC/D,IAAI;AACF;MACA,MAAMC,MAAM,GAAG,MAAMtL,aAAa,CAACuB,WAAW,CAAC,CAAA,+BAAA,EAAkCgE,MAAM,CAAA,CAAE,CAAC;MAE1F,IAAI,CAAC+F,MAAM,EAAE;QACX,OAAO;AAAEC,UAAAA,WAAW,EAAE,KAAK;AAAEC,UAAAA,OAAO,EAAE,KAAK;AAAEC,UAAAA,aAAa,EAAE;SAAG;AACjE,MAAA;;AAEA;AACA,MAAA,MAAMC,cAAc,GAAGJ,MAAM,CAACN,IAAI,IAAI,EAAE;AACxC,MAAA,MAAMW,kBAAkB,GAAG,CAAA,EAAGP,iBAAiB,CAAA,CAAA,EAAIC,YAAY,CAAA,CAAE;AACjE,MAAA,MAAMG,OAAO,GAAGE,cAAc,CAACE,IAAI,EAAE,KAAKD,kBAAkB,CAACC,IAAI,EAAE;MAEnE,OAAO;AACLL,QAAAA,WAAW,EAAED,MAAM,CAACG,aAAa,IAAI,CAAC;AACtCD,QAAAA,OAAO,EAAEA,OAAO;AAChBK,QAAAA,MAAM,EAAEP,MAAM,CAACO,MAAM,IAAI,SAAS;QAClCrC,SAAS,EAAE8B,MAAM,CAAC9B,SAAS,IAAIC,IAAI,CAACC,GAAG,EAAE;AACzC+B,QAAAA,aAAa,EAAEH,MAAM,CAACG,aAAa,IAAI;OACxC;IACH,CAAC,CAAC,OAAO5K,CAAC,EAAE;AACVQ,MAAAA,OAAO,CAACyJ,KAAK,CAAC,uBAAuB,EAAEjK,CAAC,CAAC;MACzC,OAAO;AAAE0K,QAAAA,WAAW,EAAE,KAAK;AAAEC,QAAAA,OAAO,EAAE,KAAK;AAAEC,QAAAA,aAAa,EAAE;OAAG;AACjE,IAAA;AACF,EAAA;AACF;;ACjjBA;AACA;AACA;AACA;;;AAKA;AACA;AACA;AACO,SAASK,aAAaA,GAAG;EAC9B,MAAM,CAACC,SAAS,EAAEC,YAAY,CAAC,GAAGC,cAAQ,CAAC,IAAI,CAAC;EAChD,MAAM,CAACC,QAAQ,EAAEC,WAAW,CAAC,GAAGF,cAAQ,CAAC,EAAE,CAAC;EAC5C,MAAM,CAACG,OAAO,EAAEC,UAAU,CAAC,GAAGJ,cAAQ,CAAC,KAAK,CAAC;EAC7C,MAAM,CAACnB,KAAK,EAAEwB,QAAQ,CAAC,GAAGL,cAAQ,CAAC,IAAI,CAAC;;AAExC;AACA,EAAA,MAAMM,cAAc,GAAGC,iBAAW,CAAC,YAAY;IAC7CH,UAAU,CAAC,IAAI,CAAC;IAChBC,QAAQ,CAAC,IAAI,CAAC;IACd,IAAI;AACF,MAAA,MAAMG,MAAM,GAAG,MAAM3M,aAAa,CAAC1C,YAAY,EAAE;AACjD4O,MAAAA,YAAY,CAACS,MAAM,CAACC,IAAI,CAAC;AACzB,MAAA,OAAOD,MAAM;IACf,CAAC,CAAC,OAAOrK,GAAG,EAAE;AACZkK,MAAAA,QAAQ,CAAClK,GAAG,CAACkD,OAAO,CAAC;AACrB,MAAA,MAAMlD,GAAG;AACX,IAAA,CAAC,SAAS;MACRiK,UAAU,CAAC,KAAK,CAAC;AACnB,IAAA;EACF,CAAC,EAAE,EAAE,CAAC;;AAEN;AACA,EAAA,MAAMM,aAAa,GAAGH,iBAAW,CAAC,YAAY;IAC5C,IAAI;AACF,MAAA,MAAMC,MAAM,GAAG,MAAM3M,aAAa,CAACvC,cAAc,EAAE;AACnD4O,MAAAA,WAAW,CAACM,MAAM,CAACC,IAAI,IAAI,EAAE,CAAC;AAC9B,MAAA,OAAOD,MAAM;IACf,CAAC,CAAC,OAAOrK,GAAG,EAAE;AACZkK,MAAAA,QAAQ,CAAClK,GAAG,CAACkD,OAAO,CAAC;AACrB,MAAA,MAAMlD,GAAG;AACX,IAAA;EACF,CAAC,EAAE,EAAE,CAAC;;AAEN;EACA,MAAMnE,iBAAiB,GAAGuO,iBAAW,CAAC,OAAOlP,OAAO,EAAEY,KAAK,KAAK;IAC9D,IAAI;MACF,MAAMuO,MAAM,GAAG,MAAM3M,aAAa,CAAC7B,iBAAiB,CAACX,OAAO,EAAEY,KAAK,CAAC;AACpE,MAAA,OAAOuO,MAAM,CAACC,IAAI,EAAEE,OAAO;IAC7B,CAAC,CAAC,OAAOxK,GAAG,EAAE;AACZkK,MAAAA,QAAQ,CAAClK,GAAG,CAACkD,OAAO,CAAC;AACrB,MAAA,MAAMlD,GAAG;AACX,IAAA;EACF,CAAC,EAAE,EAAE,CAAC;;AAEN;AACA,EAAA,MAAMhE,QAAQ,GAAGoO,iBAAW,CAAC,MAAOnO,YAAY,IAAK;IACnDgO,UAAU,CAAC,IAAI,CAAC;IAChB,IAAI;MACF,MAAMI,MAAM,GAAG,MAAM3M,aAAa,CAAC1B,QAAQ,CAACC,YAAY,CAAC;MACzD,MAAMsO,aAAa,EAAE;AACrB,MAAA,OAAOF,MAAM;IACf,CAAC,CAAC,OAAOrK,GAAG,EAAE;AACZkK,MAAAA,QAAQ,CAAClK,GAAG,CAACkD,OAAO,CAAC;AACrB,MAAA,MAAMlD,GAAG;AACX,IAAA,CAAC,SAAS;MACRiK,UAAU,CAAC,KAAK,CAAC;AACnB,IAAA;AACF,EAAA,CAAC,EAAE,CAACM,aAAa,CAAC,CAAC;AAEnBE,EAAAA,eAAS,CAAC,MAAM;AACdN,IAAAA,cAAc,EAAE;AAChBI,IAAAA,aAAa,EAAE;AACjB,EAAA,CAAC,EAAE,CAACJ,cAAc,EAAEI,aAAa,CAAC,CAAC;EAEnC,OAAO;IACLZ,SAAS;IACTG,QAAQ;IACRE,OAAO;IACPtB,KAAK;AACLgC,IAAAA,UAAU,EAAEf,SAAS,EAAEgB,WAAW,IAAI,CAAC;IACvCR,cAAc;IACdI,aAAa;IACb1O,iBAAiB;AACjBG,IAAAA;GACD;AACH;;AAEA;AACA;AACA;AACO,SAAS4O,iBAAiBA,GAAG;EAClC,MAAM,CAACC,QAAQ,EAAEC,WAAW,CAAC,GAAGjB,cAAQ,CAAC,EAAE,CAAC;EAC5C,MAAM,CAACkB,aAAa,EAAEC,gBAAgB,CAAC,GAAGnB,cAAQ,CAAC,EAAE,CAAC;EACtD,MAAM,CAACG,OAAO,EAAEC,UAAU,CAAC,GAAGJ,cAAQ,CAAC,KAAK,CAAC;EAC7C,MAAM,CAACnB,KAAK,EAAEwB,QAAQ,CAAC,GAAGL,cAAQ,CAAC,IAAI,CAAC;;AAExC;EACA,MAAMoB,aAAa,GAAGb,iBAAW,CAAC,OAAO/O,MAAM,GAAG,EAAE,KAAK;IACvD4O,UAAU,CAAC,IAAI,CAAC;IAChB,IAAI;MACF,MAAMI,MAAM,GAAG,MAAM3M,aAAa,CAACpC,iBAAiB,CAACD,MAAM,CAAC;AAC5DyP,MAAAA,WAAW,CAACT,MAAM,CAACC,IAAI,IAAI,EAAE,CAAC;AAC9B,MAAA,OAAOD,MAAM;IACf,CAAC,CAAC,OAAOrK,GAAG,EAAE;AACZkK,MAAAA,QAAQ,CAAClK,GAAG,CAACkD,OAAO,CAAC;AACrB,MAAA,MAAMlD,GAAG;AACX,IAAA,CAAC,SAAS;MACRiK,UAAU,CAAC,KAAK,CAAC;AACnB,IAAA;EACF,CAAC,EAAE,EAAE,CAAC;;AAEN;AACA,EAAA,MAAMiB,kBAAkB,GAAGd,iBAAW,CAAC,YAAY;IACjD,IAAI;AACF,MAAA,MAAMC,MAAM,GAAG,MAAM3M,aAAa,CAAC9B,gBAAgB,EAAE;AACrDoP,MAAAA,gBAAgB,CAACX,MAAM,CAACC,IAAI,IAAI,EAAE,CAAC;AACnC,MAAA,OAAOD,MAAM;IACf,CAAC,CAAC,OAAOrK,GAAG,EAAE;AACZkK,MAAAA,QAAQ,CAAClK,GAAG,CAACkD,OAAO,CAAC;AACrB,MAAA,MAAMlD,GAAG;AACX,IAAA;EACF,CAAC,EAAE,EAAE,CAAC;;AAEN;EACA,MAAMvE,SAAS,GAAG2O,iBAAW,CAAC,OAAO5O,SAAS,EAAEE,MAAM,KAAK;IACzDuO,UAAU,CAAC,IAAI,CAAC;IAChB,IAAI;MACF,MAAMI,MAAM,GAAG,MAAM3M,aAAa,CAACjC,SAAS,CAACD,SAAS,EAAEE,MAAM,CAAC;MAC/D,MAAMwP,kBAAkB,EAAE;AAC1B,MAAA,OAAOb,MAAM;IACf,CAAC,CAAC,OAAOrK,GAAG,EAAE;AACZkK,MAAAA,QAAQ,CAAClK,GAAG,CAACkD,OAAO,CAAC;AACrB,MAAA,MAAMlD,GAAG;AACX,IAAA,CAAC,SAAS;MACRiK,UAAU,CAAC,KAAK,CAAC;AACnB,IAAA;AACF,EAAA,CAAC,EAAE,CAACiB,kBAAkB,CAAC,CAAC;;AAExB;EACA,MAAMvP,MAAM,GAAGyO,iBAAW,CAAC,OAAO5O,SAAS,EAAEE,MAAM,KAAK;IACtDuO,UAAU,CAAC,IAAI,CAAC;IAChB,IAAI;MACF,MAAMI,MAAM,GAAG,MAAM3M,aAAa,CAAC/B,MAAM,CAACH,SAAS,EAAEE,MAAM,CAAC;MAC5D,MAAMwP,kBAAkB,EAAE;AAC1B,MAAA,OAAOb,MAAM;IACf,CAAC,CAAC,OAAOrK,GAAG,EAAE;AACZkK,MAAAA,QAAQ,CAAClK,GAAG,CAACkD,OAAO,CAAC;AACrB,MAAA,MAAMlD,GAAG;AACX,IAAA,CAAC,SAAS;MACRiK,UAAU,CAAC,KAAK,CAAC;AACnB,IAAA;AACF,EAAA,CAAC,EAAE,CAACiB,kBAAkB,CAAC,CAAC;AAExBT,EAAAA,eAAS,CAAC,MAAM;AACdQ,IAAAA,aAAa,EAAE;AACfC,IAAAA,kBAAkB,EAAE;AACtB,EAAA,CAAC,EAAE,CAACD,aAAa,EAAEC,kBAAkB,CAAC,CAAC;EAEvC,OAAO;IACLL,QAAQ;IACRE,aAAa;IACbf,OAAO;IACPtB,KAAK;IACLuC,aAAa;IACbC,kBAAkB;IAClBzP,SAAS;AACTE,IAAAA;GACD;AACH;;AC1KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,SAASwP,wBAAsBA,CAACd,MAAM,EAAE;AACpC,EAAA,IAAI,CAACA,MAAM,EAAE,OAAO,IAAI;AACxB,EAAA,IAAI,OAAOA,MAAM,KAAK,QAAQ,EAAE,OAAOA,MAAM;AAC7C,EAAA,OAAOA,MAAM,CAAClH,MAAM,IAAIkH,MAAM,CAAClD,OAAO,IAAIkD,MAAM,CAACe,SAAS,IAAIf,MAAM,CAACgB,IAAI,IAAI,IAAI;AACrF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,YAAYA,CAAC7Q,OAAO,GAAG,EAAE,EAAE;EACvC,MAAM;IACF+P,OAAO;AACPlH,IAAAA,OAAO,GAAG,SAAS;IACnBiI,QAAQ;AACRC,IAAAA,WAAW,GAAG,KAAK;AACnBC,IAAAA,eAAe,GAAG;AACtB,GAAC,GAAGhR,OAAO;;AAEX;EACA,MAAM,CAACiR,WAAW,EAAEC,cAAc,CAAC,GAAG9B,cAAQ,CAAC,IAAI,CAAC;EACpD,MAAM,CAAC+B,OAAO,EAAEC,UAAU,CAAC,GAAGhC,cAAQ,CAAC,IAAI,CAAC;EAC5C,MAAM,CAACiC,aAAa,EAAEC,gBAAgB,CAAC,GAAGlC,cAAQ,CAAC,EAAE,CAAC;EACtD,MAAM,CAACmC,UAAU,EAAEC,aAAa,CAAC,GAAGpC,cAAQ,CAAC,IAAI,CAAC;EAClD,MAAM,CAACG,OAAO,EAAEC,UAAU,CAAC,GAAGJ,cAAQ,CAAC,KAAK,CAAC;EAC7C,MAAM,CAACnB,KAAK,EAAEwB,QAAQ,CAAC,GAAGL,cAAQ,CAAC,IAAI,CAAC;EACxC,MAAM,CAACqC,SAAS,EAAEC,YAAY,CAAC,GAAGtC,cAAQ,CAAC,KAAK,CAAC;;AAEjD;AACA,EAAA,MAAMuC,MAAM,GAAGC,YAAM,CAAC,IAAI,CAAC;AAC3B,EAAA,MAAMC,OAAO,GAAGD,YAAM,CAAC,IAAI,CAAC;AAC5B,EAAA,MAAME,gBAAgB,GAAGF,YAAM,CAAC,IAAI,CAAC;AACrC,EAAA,MAAMG,MAAM,GAAGH,YAAM,CAAC,IAAI,CAAC;;AAE3B;AACJ;AACA;AACI,EAAA,MAAMI,SAAS,GAAGrC,iBAAW,CAAC,YAAY;AACtC,IAAA,MAAMsC,iBAAiB,GAAG/F,IAAI,CAACC,SAAS,CAAC;MAAEtD,OAAO;MAAEiI,QAAQ,EAAEA,QAAQ,IAAI;AAAG,KAAC,CAAC;AAC/E,IAAA,IAAIa,MAAM,CAACO,OAAO,IAAIL,OAAO,CAACK,OAAO,IAAIJ,gBAAgB,CAACI,OAAO,KAAKD,iBAAiB,EAAE;AACrF,MAAA;AACJ,IAAA;IAEA,IAAI;MACA,MAAME,GAAG,GAAGR,MAAM,CAACO,OAAO,KAAI,MAAM,OAAO,2BAA2B,CAAC,CAAA;MACvEP,MAAM,CAACO,OAAO,GAAGC,GAAG;AACpB,MAAA,IAAIJ,MAAM,CAACG,OAAO,EAAEE,OAAO,EAAE;AACzBL,QAAAA,MAAM,CAACG,OAAO,CAACE,OAAO,EAAE;QACxBL,MAAM,CAACG,OAAO,GAAG,IAAI;AACzB,MAAA;AACA,MAAA,IAAIL,OAAO,CAACK,OAAO,EAAEE,OAAO,EAAE;AAC1BP,QAAAA,OAAO,CAACK,OAAO,CAACE,OAAO,EAAE;AAC7B,MAAA;MACAV,YAAY,CAAC,KAAK,CAAC;AACnBG,MAAAA,OAAO,CAACK,OAAO,GAAG,IAAIC,GAAG,CAACE,cAAc,CAAC;QACrCxJ,OAAO;QACPiI,QAAQ;AACRwB,QAAAA,SAAS,EAAEA,MAAMZ,YAAY,CAAC,IAAI,CAAC;AACnCa,QAAAA,YAAY,EAAEA,MAAMb,YAAY,CAAC,KAAK;AAC1C,OAAC,CAAC;MACFI,gBAAgB,CAACI,OAAO,GAAGD,iBAAiB;IAChD,CAAC,CAAC,OAAO1M,GAAG,EAAE;MACV,MAAM,IAAIF,KAAK,CAAC,CAAA,gCAAA,EAAmCE,GAAG,CAACkD,OAAO,EAAE,CAAC;AACrE,IAAA;AACJ,EAAA,CAAC,EAAE,CAACI,OAAO,EAAEiI,QAAQ,CAAC,CAAC;;AAEvB;AACJ;AACA;AACI,EAAA,MAAM0B,gBAAgB,GAAG7C,iBAAW,CAAC,YAAY;IAC7CH,UAAU,CAAC,IAAI,CAAC;IAChBC,QAAQ,CAAC,IAAI,CAAC;IACd,IAAI;MACA,MAAMuC,SAAS,EAAE;AACjB,MAAA,MAAM1M,MAAM,GAAG,MAAMqM,MAAM,CAACO,OAAO,CAACO,cAAc,CAACZ,OAAO,CAACK,OAAO,CAAC;MACnEhB,cAAc,CAAC5L,MAAM,CAAC;AACtB,MAAA,OAAOA,MAAM;IACjB,CAAC,CAAC,OAAOC,GAAG,EAAE;AACVkK,MAAAA,QAAQ,CAAClK,GAAG,CAACkD,OAAO,CAAC;AACrB,MAAA,OAAO,IAAI;AACf,IAAA,CAAC,SAAS;MACN+G,UAAU,CAAC,KAAK,CAAC;AACrB,IAAA;AACJ,EAAA,CAAC,EAAE,CAACwC,SAAS,CAAC,CAAC;;AAEf;AACJ;AACA;AACI,EAAA,MAAMU,YAAY,GAAG/C,iBAAW,CAAC,MAAOgD,IAAI,IAAK;AAC7C,IAAA,MAAMC,UAAU,GAAGD,IAAI,IAAI5C,OAAO;AAClC,IAAA,IAAI,CAAC6C,UAAU,EAAE,OAAO,IAAI;IAE5B,IAAI;MACA,MAAMZ,SAAS,EAAE;AACjB,MAAA,MAAMpC,MAAM,GAAG,MAAM+B,MAAM,CAACO,OAAO,CAAC1R,UAAU,CAACoS,UAAU,EAAEf,OAAO,CAACK,OAAO,CAAC;MAC3Ed,UAAU,CAACxB,MAAM,CAAC;AAClB,MAAA,OAAOA,MAAM;IACjB,CAAC,CAAC,OAAOrK,GAAG,EAAE;AACVkK,MAAAA,QAAQ,CAAClK,GAAG,CAACkD,OAAO,CAAC;AACrB,MAAA,OAAO,IAAI;AACf,IAAA;AACJ,EAAA,CAAC,EAAE,CAACsH,OAAO,EAAEiC,SAAS,CAAC,CAAC;;AAExB;AACJ;AACA;AACI,EAAA,MAAMa,kBAAkB,GAAGlD,iBAAW,CAAC,MAAOgD,IAAI,IAAK;AACnD,IAAA,MAAMC,UAAU,GAAGD,IAAI,IAAI5C,OAAO;AAClC,IAAA,IAAI,CAAC6C,UAAU,EAAE,OAAO,EAAE;IAE1B,IAAI;MACA,MAAMZ,SAAS,EAAE;AACjB,MAAA,MAAMpC,MAAM,GAAG,MAAM+B,MAAM,CAACO,OAAO,CAACY,gBAAgB,CAACF,UAAU,EAAEf,OAAO,CAACK,OAAO,CAAC;MACjFZ,gBAAgB,CAAC1B,MAAM,CAAC;AACxB,MAAA,OAAOA,MAAM;IACjB,CAAC,CAAC,OAAOrK,GAAG,EAAE;AACVkK,MAAAA,QAAQ,CAAClK,GAAG,CAACkD,OAAO,CAAC;AACrB,MAAA,OAAO,EAAE;AACb,IAAA;AACJ,EAAA,CAAC,EAAE,CAACsH,OAAO,EAAEiC,SAAS,CAAC,CAAC;;AAExB;AACJ;AACA;AACI,EAAA,MAAMe,eAAe,GAAGpD,iBAAW,CAAC,YAAY;IAC5C,IAAI;MACA,MAAMqC,SAAS,EAAE;AACjB,MAAA,MAAMpC,MAAM,GAAG,MAAM+B,MAAM,CAACO,OAAO,CAACc,aAAa,CAACnB,OAAO,CAACK,OAAO,CAAC;MAClEV,aAAa,CAAC5B,MAAM,CAAC;AACrB,MAAA,OAAOA,MAAM;IACjB,CAAC,CAAC,OAAOrK,GAAG,EAAE;AACVkK,MAAAA,QAAQ,CAAClK,GAAG,CAACkD,OAAO,CAAC;AACrB,MAAA,OAAO,IAAI;AACf,IAAA;AACJ,EAAA,CAAC,EAAE,CAACuJ,SAAS,CAAC,CAAC;;AAEf;AACJ;AACA;EACI,MAAMiB,uBAAuB,GAAGtD,iBAAW,CAAC,OAAOgD,IAAI,EAAEO,IAAI,GAAG,EAAE,KAAK;AACnE,IAAA,MAAMN,UAAU,GAAGD,IAAI,IAAI5C,OAAO;AAClC,IAAA,IAAI,CAAC6C,UAAU,EAAE,OAAO,EAAE;IAE1B,IAAI;MACA,MAAMZ,SAAS,EAAE;AACjB,MAAA,OAAO,MAAML,MAAM,CAACO,OAAO,CAACvQ,qBAAqB,CAACiR,UAAU,EAAEM,IAAI,EAAErB,OAAO,CAACK,OAAO,CAAC;IACxF,CAAC,CAAC,OAAO3M,GAAG,EAAE;AACVkK,MAAAA,QAAQ,CAAClK,GAAG,CAACkD,OAAO,CAAC;AACrB,MAAA,OAAO,EAAE;AACb,IAAA;AACJ,EAAA,CAAC,EAAE,CAACsH,OAAO,EAAEiC,SAAS,CAAC,CAAC;;AAExB;AACJ;AACA;AACI,EAAA,MAAMmB,eAAe,GAAGxD,iBAAW,CAAC,YAAY;IAC5C,IAAI;MACA,MAAMqC,SAAS,EAAE;MACjB,OAAO,MAAML,MAAM,CAACO,OAAO,CAACiB,eAAe,CAACtB,OAAO,CAACK,OAAO,CAAC;IAChE,CAAC,CAAC,OAAO3M,GAAG,EAAE;AACVkK,MAAAA,QAAQ,CAAClK,GAAG,CAACkD,OAAO,CAAC;MACrB,OAAO;AAAE2K,QAAAA,KAAK,EAAE,KAAK;QAAEnF,KAAK,EAAE1I,GAAG,CAACkD;OAAS;AAC/C,IAAA;AACJ,EAAA,CAAC,EAAE,CAACuJ,SAAS,CAAC,CAAC;;AAEf;AACJ;AACA;AACA;EACI,MAAMqB,cAAc,GAAG1D,iBAAW,CAAC,OAAO2D,SAAS,EAAEX,IAAI,KAAK;AAC1D,IAAA,MAAMC,UAAU,GAAGD,IAAI,IAAI5C,OAAO;IAClC,IAAI,CAAC6C,UAAU,EAAE;AACb,MAAA,MAAM,IAAIvN,KAAK,CAAC,6BAA6B,CAAC;AAClD,IAAA;IACA,IAAI;MACA,MAAM2M,SAAS,EAAE;AACjB,MAAA,MAAMrB,SAAS,GAAG,MAAMgB,MAAM,CAACO,OAAO,CAACmB,cAAc,CAACT,UAAU,EAAEU,SAAS,EAAEzB,OAAO,CAACK,OAAO,CAAC;AAC7F;MACAQ,YAAY,CAACE,UAAU,CAAC,CAACW,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AACxC,MAAA,OAAO5C,SAAS;IACpB,CAAC,CAAC,OAAOpL,GAAG,EAAE;AACVkK,MAAAA,QAAQ,CAAClK,GAAG,CAACkD,OAAO,CAAC;AACrB,MAAA,MAAMlD,GAAG;AACb,IAAA;EACJ,CAAC,EAAE,CAACwK,OAAO,EAAEiC,SAAS,EAAEU,YAAY,CAAC,CAAC;;AAEtC;AACJ;AACA;AACA;AACA;AACI,EAAA,MAAMc,gBAAgB,GAAG7D,iBAAW,CAAC,MAAOgD,IAAI,IAAK;AACjD,IAAA,MAAMC,UAAU,GAAGD,IAAI,IAAI5C,OAAO;IAClC,IAAI,CAAC6C,UAAU,EAAE;AACb,MAAA,MAAM,IAAIvN,KAAK,CAAC,0CAA0C,CAAC;AAC/D,IAAA;IACA,IAAI;MACA,MAAM2M,SAAS,EAAE;AACjB,MAAA,IAAI,CAACD,MAAM,CAACG,OAAO,EAAE;AACjBH,QAAAA,MAAM,CAACG,OAAO,GAAG,IAAIP,MAAM,CAACO,OAAO,CAACuB,gBAAgB,CAAC5B,OAAO,CAACK,OAAO,CAAC;AACzE,MAAA;MACA,MAAMpL,EAAE,GAAGiL,MAAM,CAACG,OAAO,CAACwB,eAAe,CAACd,UAAU,EAAGe,IAAI,IAAK;AAC5DvC,QAAAA,UAAU,CAAC;UAAEwC,QAAQ,EAAED,IAAI,CAACC,QAAQ;AAAEC,UAAAA,GAAG,EAAEF,IAAI,CAACC,QAAQ,GAAG;AAAc,SAAC,CAAC;AAC/E,MAAA,CAAC,CAAC;AACF,MAAA,OAAO,MAAM;QACT,IAAI7B,MAAM,CAACG,OAAO,EAAEH,MAAM,CAACG,OAAO,CAAC4B,WAAW,CAAChN,EAAE,CAAC;MACtD,CAAC;IACL,CAAC,CAAC,OAAOvB,GAAG,EAAE;AACVkK,MAAAA,QAAQ,CAAClK,GAAG,CAACkD,OAAO,CAAC;AACrB,MAAA,MAAMlD,GAAG;AACb,IAAA;AACJ,EAAA,CAAC,EAAE,CAACwK,OAAO,EAAEiC,SAAS,CAAC,CAAC;;AAExB;AACJ;AACA;AACA;EACI,MAAM+B,oBAAoB,GAAGpE,iBAAW,CAAC,OAAOxB,IAAI,EAAE+E,IAAI,GAAG,EAAE,KAAK;AAChE,IAAA,MAAMc,YAAY,GAAGd,IAAI,CAACnD,OAAO,IAAIA,OAAO;IAC5C,IAAI,CAACiE,YAAY,EAAE;AACf,MAAA,MAAM,IAAI3O,KAAK,CAAC,uBAAuB,CAAC;AAC5C,IAAA;IAEA,IAAI;MACA,MAAM2M,SAAS,EAAE;AACjB,MAAA,MAAMiC,SAAS,GAAG,IAAItC,MAAM,CAACO,OAAO,CAACgC,eAAe,CAACrC,OAAO,CAACK,OAAO,CAAC;AACrE+B,MAAAA,SAAS,CAACE,OAAO,CAAChG,IAAI,CAAC;MACvB,IAAI+E,IAAI,CAACkB,WAAW,EAAE;AAClBH,QAAAA,SAAS,CAACI,cAAc,CAACnB,IAAI,CAACkB,WAAW,CAAC;AAC9C,MAAA;AACA,MAAA,OAAO,MAAMH,SAAS,CAACK,KAAK,CAACN,YAAY,CAAC;IAC9C,CAAC,CAAC,OAAOzO,GAAG,EAAE;AACVkK,MAAAA,QAAQ,CAAClK,GAAG,CAACkD,OAAO,CAAC;AACrB,MAAA,MAAMlD,GAAG;AACb,IAAA;AACJ,EAAA,CAAC,EAAE,CAACwK,OAAO,EAAEiC,SAAS,CAAC,CAAC;;AAExB;AACJ;AACA;AACI,EAAA,MAAMuC,kBAAkB,GAAG5E,iBAAW,CAAC,OAAO6E,QAAQ,EAAErG,IAAI,EAAE+E,IAAI,GAAG,EAAE,KAAK;IACxE,IAAI,CAACsB,QAAQ,EAAE;AACX,MAAA,MAAM,IAAInP,KAAK,CAAC,8BAA8B,CAAC;AACnD,IAAA;IAEA,MAAM2O,YAAY,GACdd,IAAI,CAACnD,OAAO,IACZA,OAAO,IACPyE,QAAQ,CAACC,SAAS,EAAEC,QAAQ,IAAI,IAChCF,QAAQ,CAACC,SAAS,EAAExN,QAAQ,IAAI;IAEpC,IAAI,CAAC+M,YAAY,EAAE;AACf,MAAA,MAAM,IAAI3O,KAAK,CAAC,wBAAwB,CAAC;AAC7C,IAAA;IAEA,IAAI;MACA,MAAM2M,SAAS,EAAE;AACjB,MAAA,MAAM2C,WAAW,GAAG,MAAMZ,oBAAoB,CAAC5F,IAAI,EAAE;AACjD,QAAA,GAAG+E,IAAI;AACPnD,QAAAA,OAAO,EAAEiE;AACb,OAAC,CAAC;AAEF,MAAA,IAAI,OAAOQ,QAAQ,CAACI,sBAAsB,KAAK,UAAU,EAAE;QACvD,MAAMhF,MAAM,GAAG,MAAM4E,QAAQ,CAACI,sBAAsB,CAACD,WAAW,EAAE;AAC9DE,UAAAA,aAAa,EAAE3B,IAAI,CAAC2B,aAAa,IAAI,KAAK;AAC1CC,UAAAA,mBAAmB,EAAE5B,IAAI,CAAC4B,mBAAmB,IAAI;AACrD,SAAC,CAAC;QACF,OAAO;AACHpM,UAAAA,MAAM,EAAEgI,wBAAsB,CAACd,MAAM,CAAC;UACtCzB,IAAI;AACJ4G,UAAAA,GAAG,EAAEnF;SACR;AACL,MAAA;AAEA,MAAA,IAAI,OAAO4E,QAAQ,CAACQ,eAAe,KAAK,UAAU,EAAE;AAChD,QAAA,MAAM,IAAI3P,KAAK,CAAC,wEAAwE,CAAC;AAC7F,MAAA;MAEA,MAAM4P,iBAAiB,GAAG,MAAMT,QAAQ,CAACQ,eAAe,CAACL,WAAW,CAAC;MACrE,MAAMjM,MAAM,GAAG,MAAMmJ,OAAO,CAACK,OAAO,CAACgD,eAAe,CAACD,iBAAiB,EAAE;AACpEJ,QAAAA,aAAa,EAAE3B,IAAI,CAAC2B,aAAa,IAAI,KAAK;AAC1CC,QAAAA,mBAAmB,EAAE5B,IAAI,CAAC4B,mBAAmB,IAAI;AACrD,OAAC,CAAC;MAEF,OAAO;QACHpM,MAAM;QACNyF,IAAI;AACJ4G,QAAAA,GAAG,EAAEE;OACR;IACL,CAAC,CAAC,OAAO1P,GAAG,EAAE;AACVkK,MAAAA,QAAQ,CAAClK,GAAG,CAACkD,OAAO,CAAC;AACrB,MAAA,MAAMlD,GAAG;AACb,IAAA;EACJ,CAAC,EAAE,CAACwK,OAAO,EAAEgE,oBAAoB,EAAE/B,SAAS,CAAC,CAAC;;AAE9C;AACJ;AACA;AACI,EAAA,MAAMmD,OAAO,GAAGxF,iBAAW,CAAC,YAAY;IACpCH,UAAU,CAAC,IAAI,CAAC;IAChBC,QAAQ,CAAC,IAAI,CAAC;IACd,IAAI;AACA,MAAA,MAAM5B,OAAO,CAACuH,GAAG,CAAC,CACd5C,gBAAgB,EAAE,EAClBzC,OAAO,GAAG2C,YAAY,EAAE,GAAG7E,OAAO,CAACC,OAAO,EAAE,EAC5CiC,OAAO,GAAG8C,kBAAkB,EAAE,GAAGhF,OAAO,CAACC,OAAO,EAAE,CACrD,CAAC;AACN,IAAA,CAAC,SAAS;MACN0B,UAAU,CAAC,KAAK,CAAC;AACrB,IAAA;EACJ,CAAC,EAAE,CAACgD,gBAAgB,EAAEE,YAAY,EAAEG,kBAAkB,EAAE9C,OAAO,CAAC,CAAC;;AAEjE;AACAC,EAAAA,eAAS,CAAC,MAAM;AACZmF,IAAAA,OAAO,EAAE;AACb,EAAA,CAAC,EAAE,CAACA,OAAO,CAAC,CAAC;;AAEb;AACAnF,EAAAA,eAAS,CAAC,MAAM;IACZ,IAAI,CAACe,WAAW,EAAE;AAElB,IAAA,MAAMsE,KAAK,GAAGC,WAAW,CAAC,MAAM;AAC5BH,MAAAA,OAAO,EAAE;IACb,CAAC,EAAEnE,eAAe,CAAC;AAEnB,IAAA,OAAO,MAAMuE,aAAa,CAACF,KAAK,CAAC;EACrC,CAAC,EAAE,CAACtE,WAAW,EAAEC,eAAe,EAAEmE,OAAO,CAAC,CAAC;;AAE3C;AACAnF,EAAAA,eAAS,CAAC,MAAM;AACZ,IAAA,OAAO,MAAM;AACT,MAAA,IAAI+B,MAAM,CAACG,OAAO,EAAEE,OAAO,EAAE;AACzBL,QAAAA,MAAM,CAACG,OAAO,CAACE,OAAO,EAAE;QACxBL,MAAM,CAACG,OAAO,GAAG,IAAI;AACzB,MAAA;AACA,MAAA,IAAIL,OAAO,CAACK,OAAO,EAAEE,OAAO,EAAE;AAC1BP,QAAAA,OAAO,CAACK,OAAO,CAACE,OAAO,EAAE;QACzBP,OAAO,CAACK,OAAO,GAAG,IAAI;QACtBJ,gBAAgB,CAACI,OAAO,GAAG,IAAI;AACnC,MAAA;IACJ,CAAC;EACL,CAAC,EAAE,EAAE,CAAC;EAEN,OAAO;AACH;IACAjB,WAAW;IACXE,OAAO;IACPE,aAAa;IACbE,UAAU;IACVhC,OAAO;IACPtB,KAAK;IACLwD,SAAS;AAET;IACAe,gBAAgB;IAChBE,YAAY;IACZG,kBAAkB;IAClBE,eAAe;IACfE,uBAAuB;IACvBE,eAAe;IACfE,cAAc;IACdG,gBAAgB;IAChBO,oBAAoB;IACpBQ,kBAAkB;IAClBY,OAAO;AAEP;IACA,IAAIK,UAAUA,GAAG;MAAE,OAAO3D,OAAO,CAACK,OAAO;IAAE,CAAC;IAC5C,IAAIC,GAAGA,GAAG;MAAE,OAAOR,MAAM,CAACO,OAAO;AAAE,IAAA;GACtC;AACL;;;;;;;;;;;;;;;;;;;;;;ACpYA,CAAA,IAAIuD,kBAAkB,GAAGC,MAAM,CAACC,GAAG,CAAC,4BAA4B,CAAC;AAC/DC,GAAAA,mBAAmB,GAAGF,MAAM,CAACC,GAAG,CAAC,gBAAgB,CAAC;AACpD,CAAA,SAASE,OAAOA,CAACzO,IAAI,EAAEtH,MAAM,EAAEgW,QAAQ,EAAE;GACvC,IAAIvK,GAAG,GAAG,IAAI;GACd,MAAM,KAAKuK,QAAQ,KAAKvK,GAAG,GAAG,EAAE,GAAGuK,QAAQ,CAAC;AAC5C,GAAA,MAAM,KAAKhW,MAAM,CAACyL,GAAG,KAAKA,GAAG,GAAG,EAAE,GAAGzL,MAAM,CAACyL,GAAG,CAAC;GAChD,IAAI,KAAK,IAAIzL,MAAM,EAAE;KACnBgW,QAAQ,GAAG,EAAE;AACb,KAAA,KAAK,IAAIC,QAAQ,IAAIjW,MAAM,EACzB,KAAK,KAAKiW,QAAQ,KAAKD,QAAQ,CAACC,QAAQ,CAAC,GAAGjW,MAAM,CAACiW,QAAQ,CAAC,CAAC;IAChE,MAAMD,QAAQ,GAAGhW,MAAM;GACxBA,MAAM,GAAGgW,QAAQ,CAACE,GAAG;GACrB,OAAO;KACLC,QAAQ,EAAER,kBAAkB;KAC5BrO,IAAI,EAAEA,IAAI;KACVmE,GAAG,EAAEA,GAAG;KACRyK,GAAG,EAAE,MAAM,KAAKlW,MAAM,GAAGA,MAAM,GAAG,IAAI;AACtCoW,KAAAA,KAAK,EAAEJ;IACR;AACH,CAAA;AACAK,CAAAA,0BAAAA,CAAAA,QAAgB,GAAGP,mBAAmB;AACtCO,CAAAA,0BAAAA,CAAAA,GAAW,GAAGN,OAAO;AACrBM,CAAAA,0BAAAA,CAAAA,IAAY,GAAGN,OAAO;;;;;;;;;;;;;;;;;;;;;;ACtBtB,CAAA,YAAY,KAAKO,OAAO,CAACC,GAAG,CAACC,QAAQ,IAClC,YAAY;GACX,SAASC,wBAAwBA,CAACnP,IAAI,EAAE;AACtC,KAAA,IAAI,IAAI,IAAIA,IAAI,EAAE,OAAO,IAAI;KAC7B,IAAI,UAAU,KAAK,OAAOA,IAAI,EAC5B,OAAOA,IAAI,CAAC6O,QAAQ,KAAKO,sBAAsB,GAC3C,IAAI,GACJpP,IAAI,CAACqP,WAAW,IAAIrP,IAAI,CAACsP,IAAI,IAAI,IAAI;AAC3C,KAAA,IAAI,QAAQ,KAAK,OAAOtP,IAAI,EAAE,OAAOA,IAAI;AACzC,KAAA,QAAQA,IAAI;AACV,OAAA,KAAKwO,mBAAmB;AACtB,SAAA,OAAO,UAAU;AACnB,OAAA,KAAKe,mBAAmB;AACtB,SAAA,OAAO,UAAU;AACnB,OAAA,KAAKC,sBAAsB;AACzB,SAAA,OAAO,YAAY;AACrB,OAAA,KAAKC,mBAAmB;AACtB,SAAA,OAAO,UAAU;AACnB,OAAA,KAAKC,wBAAwB;AAC3B,SAAA,OAAO,cAAc;AACvB,OAAA,KAAKC,mBAAmB;AACtB,SAAA,OAAO,UAAU;AACrB;KACA,IAAI,QAAQ,KAAK,OAAO3P,IAAI,EAC1B,QACG,QAAQ,KAAK,OAAOA,IAAI,CAAC4P,GAAG,IAC3BxS,OAAO,CAACyJ,KAAK,CACX,mHACF,CAAC,EACH7G,IAAI,CAAC6O,QAAQ;AAEb,OAAA,KAAKgB,iBAAiB;AACpB,SAAA,OAAO,QAAQ;AACjB,OAAA,KAAKC,kBAAkB;AACrB,SAAA,OAAO9P,IAAI,CAACqP,WAAW,IAAI,SAAS;AACtC,OAAA,KAAKU,mBAAmB;SACtB,OAAO,CAAC/P,IAAI,CAACgQ,QAAQ,CAACX,WAAW,IAAI,SAAS,IAAI,WAAW;AAC/D,OAAA,KAAKY,sBAAsB;AACzB,SAAA,IAAIC,SAAS,GAAGlQ,IAAI,CAACmQ,MAAM;SAC3BnQ,IAAI,GAAGA,IAAI,CAACqP,WAAW;SACvBrP,IAAI,KACAA,IAAI,GAAGkQ,SAAS,CAACb,WAAW,IAAIa,SAAS,CAACZ,IAAI,IAAI,EAAE,EACrDtP,IAAI,GAAG,EAAE,KAAKA,IAAI,GAAG,aAAa,GAAGA,IAAI,GAAG,GAAG,GAAG,YAAa,CAAC;AACnE,SAAA,OAAOA,IAAI;AACb,OAAA,KAAKoQ,eAAe;SAClB,OACGF,SAAS,GAAGlQ,IAAI,CAACqP,WAAW,IAAI,IAAI,EACrC,IAAI,KAAKa,SAAS,GACdA,SAAS,GACTf,wBAAwB,CAACnP,IAAI,CAACA,IAAI,CAAC,IAAI,MAAM;AAErD,OAAA,KAAKqQ,eAAe;SAClBH,SAAS,GAAGlQ,IAAI,CAACsQ,QAAQ;SACzBtQ,IAAI,GAAGA,IAAI,CAACuQ,KAAK;SACjB,IAAI;AACF,WAAA,OAAOpB,wBAAwB,CAACnP,IAAI,CAACkQ,SAAS,CAAC,CAAC;SAClD,CAAC,CAAC,OAAOM,CAAC,EAAE,CAAA;AAChB;AACF,KAAA,OAAO,IAAI;AACb,GAAA;GACA,SAASC,kBAAkBA,CAACxM,KAAK,EAAE;KACjC,OAAO,EAAE,GAAGA,KAAK;AACnB,GAAA;GACA,SAASyM,sBAAsBA,CAACzM,KAAK,EAAE;KACrC,IAAI;OACFwM,kBAAkB,CAACxM,KAAK,CAAC;OACzB,IAAI0M,wBAAwB,GAAG,CAAC,CAAC;MAClC,CAAC,OAAO/T,CAAC,EAAE;OACV+T,wBAAwB,GAAG,IAAE;AAC/B,KAAA;KACA,IAAIA,wBAAwB,EAAE;OAC5BA,wBAAwB,GAAGvT,OAAO;AAClC,OAAA,IAAIwT,qBAAqB,GAAGD,wBAAwB,CAAC9J,KAAK;OAC1D,IAAIgK,iCAAiC,GAClC,UAAU,KAAK,OAAOvC,MAAM,IAC3BA,MAAM,CAACwC,WAAW,IAClB7M,KAAK,CAACqK,MAAM,CAACwC,WAAW,CAAC,IAC3B7M,KAAK,CAACxL,WAAW,CAAC6W,IAAI,IACtB,QAAQ;OACVsB,qBAAqB,CAACG,IAAI,CACxBJ,wBAAwB,EACxB,0GAA0G,EAC1GE,iCACF,CAAC;OACD,OAAOJ,kBAAkB,CAACxM,KAAK,CAAC;AAClC,KAAA;AACF,GAAA;GACA,SAAS+M,WAAWA,CAAChR,IAAI,EAAE;AACzB,KAAA,IAAIA,IAAI,KAAKwO,mBAAmB,EAAE,OAAO,IAAI;AAC7C,KAAA,IACE,QAAQ,KAAK,OAAOxO,IAAI,IACxB,IAAI,KAAKA,IAAI,IACbA,IAAI,CAAC6O,QAAQ,KAAKwB,eAAe,EAEjC,OAAO,OAAO;KAChB,IAAI;AACF,OAAA,IAAIf,IAAI,GAAGH,wBAAwB,CAACnP,IAAI,CAAC;OACzC,OAAOsP,IAAI,GAAG,GAAG,GAAGA,IAAI,GAAG,GAAG,GAAG,OAAO;MACzC,CAAC,OAAOkB,CAAC,EAAE;AACV,OAAA,OAAO,OAAO;AAChB,KAAA;AACF,GAAA;GACA,SAASS,QAAQA,GAAG;AAClB,KAAA,IAAIC,UAAU,GAAGC,oBAAoB,CAACC,CAAC;KACvC,OAAO,IAAI,KAAKF,UAAU,GAAG,IAAI,GAAGA,UAAU,CAACD,QAAQ,EAAE;AAC3D,GAAA;GACA,SAASI,YAAYA,GAAG;KACtB,OAAOpT,KAAK,CAAC,uBAAuB,CAAC;AACvC,GAAA;GACA,SAASqT,WAAWA,CAAC5Y,MAAM,EAAE;KAC3B,IAAI6Y,cAAc,CAACR,IAAI,CAACrY,MAAM,EAAE,KAAK,CAAC,EAAE;OACtC,IAAI8Y,MAAM,GAAG5S,MAAM,CAAC6S,wBAAwB,CAAC/Y,MAAM,EAAE,KAAK,CAAC,CAACK,GAAG;OAC/D,IAAIyY,MAAM,IAAIA,MAAM,CAACE,cAAc,EAAE,OAAO,KAAE;AAChD,KAAA;AACA,KAAA,OAAO,MAAM,KAAKhZ,MAAM,CAACyL,GAAG;AAC9B,GAAA;AACA,GAAA,SAASwN,0BAA0BA,CAAC7C,KAAK,EAAEO,WAAW,EAAE;KACtD,SAASuC,qBAAqBA,GAAG;AAC/BC,OAAAA,0BAA0B,KACtBA,0BAA0B,GAAG,IAAE,EACjCzU,OAAO,CAACyJ,KAAK,CACX,yOAAyO,EACzOwI,WACF,CAAC,CAAC;AACN,KAAA;AACAuC,KAAAA,qBAAqB,CAACF,cAAc,GAAG,IAAE;AACzC9S,KAAAA,MAAM,CAACkT,cAAc,CAAChD,KAAK,EAAE,KAAK,EAAE;OAClC/V,GAAG,EAAE6Y,qBAAqB;OAC1BG,YAAY,EAAE;AAChB,MAAC,CAAC;AACJ,GAAA;GACA,SAASC,sCAAsCA,GAAG;KAChD,IAAIC,aAAa,GAAG9C,wBAAwB,CAAC,IAAI,CAACnP,IAAI,CAAC;AACvDkS,KAAAA,sBAAsB,CAACD,aAAa,CAAC,KACjCC,sBAAsB,CAACD,aAAa,CAAC,GAAG,IAAE,EAC5C7U,OAAO,CAACyJ,KAAK,CACX,6IACF,CAAC,CAAC;AACJoL,KAAAA,aAAa,GAAG,IAAI,CAACnD,KAAK,CAACF,GAAG;KAC9B,OAAO,MAAM,KAAKqD,aAAa,GAAGA,aAAa,GAAG,IAAI;AACxD,GAAA;AACA,GAAA,SAASE,YAAYA,CAACnS,IAAI,EAAEmE,GAAG,EAAE2K,KAAK,EAAEsD,KAAK,EAAEC,UAAU,EAAEC,SAAS,EAAE;AACpE,KAAA,IAAIC,OAAO,GAAGzD,KAAK,CAACF,GAAG;AACvB5O,KAAAA,IAAI,GAAG;OACL6O,QAAQ,EAAER,kBAAkB;OAC5BrO,IAAI,EAAEA,IAAI;OACVmE,GAAG,EAAEA,GAAG;OACR2K,KAAK,EAAEA,KAAK;AACZ0D,OAAAA,MAAM,EAAEJ;MACT;AACD,KAAA,IAAI,MAAM,MAAM,KAAKG,OAAO,GAAGA,OAAO,GAAG,IAAI,CAAC,GAC1C3T,MAAM,CAACkT,cAAc,CAAC9R,IAAI,EAAE,KAAK,EAAE;OACjCyS,UAAU,EAAE,KAAE;AACd1Z,OAAAA,GAAG,EAAEiZ;MACN,CAAC,GACFpT,MAAM,CAACkT,cAAc,CAAC9R,IAAI,EAAE,KAAK,EAAE;OAAEyS,UAAU,EAAE,KAAE;AAAExO,OAAAA,KAAK,EAAE;AAAK,MAAC,CAAC;AACvEjE,KAAAA,IAAI,CAAC0S,MAAM,GAAG,EAAE;KAChB9T,MAAM,CAACkT,cAAc,CAAC9R,IAAI,CAAC0S,MAAM,EAAE,WAAW,EAAE;OAC9CX,YAAY,EAAE,KAAE;OAChBU,UAAU,EAAE,KAAE;OACdE,QAAQ,EAAE,IAAE;AACZ1O,OAAAA,KAAK,EAAE;AACT,MAAC,CAAC;AACFrF,KAAAA,MAAM,CAACkT,cAAc,CAAC9R,IAAI,EAAE,YAAY,EAAE;OACxC+R,YAAY,EAAE,KAAE;OAChBU,UAAU,EAAE,KAAE;OACdE,QAAQ,EAAE,IAAE;AACZ1O,OAAAA,KAAK,EAAE;AACT,MAAC,CAAC;AACFrF,KAAAA,MAAM,CAACkT,cAAc,CAAC9R,IAAI,EAAE,aAAa,EAAE;OACzC+R,YAAY,EAAE,KAAE;OAChBU,UAAU,EAAE,KAAE;OACdE,QAAQ,EAAE,IAAE;AACZ1O,OAAAA,KAAK,EAAEoO;AACT,MAAC,CAAC;AACFzT,KAAAA,MAAM,CAACkT,cAAc,CAAC9R,IAAI,EAAE,YAAY,EAAE;OACxC+R,YAAY,EAAE,KAAE;OAChBU,UAAU,EAAE,KAAE;OACdE,QAAQ,EAAE,IAAE;AACZ1O,OAAAA,KAAK,EAAEqO;AACT,MAAC,CAAC;AACF1T,KAAAA,MAAM,CAACgU,MAAM,KAAKhU,MAAM,CAACgU,MAAM,CAAC5S,IAAI,CAAC8O,KAAK,CAAC,EAAElQ,MAAM,CAACgU,MAAM,CAAC5S,IAAI,CAAC,CAAC;AACjE,KAAA,OAAOA,IAAI;AACb,GAAA;AACA,GAAA,SAAS6S,UAAUA,CACjB7S,IAAI,EACJtH,MAAM,EACNgW,QAAQ,EACRoE,gBAAgB,EAChBT,UAAU,EACVC,SAAS,EACT;AACA,KAAA,IAAIS,QAAQ,GAAGra,MAAM,CAACqa,QAAQ;KAC9B,IAAI,MAAM,KAAKA,QAAQ,EACrB,IAAID,gBAAgB,EAAA;AAClB,OAAA,IAAIE,WAAW,CAACD,QAAQ,CAAC,EAAE;SACzB,KACED,gBAAgB,GAAG,CAAC,EACpBA,gBAAgB,GAAGC,QAAQ,CAAC1U,MAAM,EAClCyU,gBAAgB,EAAE,EAElBG,iBAAiB,CAACF,QAAQ,CAACD,gBAAgB,CAAC,CAAC;SAC/ClU,MAAM,CAACgU,MAAM,IAAIhU,MAAM,CAACgU,MAAM,CAACG,QAAQ,CAAC;AAC1C,OAAA,CAAC,MACC3V,OAAO,CAACyJ,KAAK,CACX,sJACF,CAAC;MAAC,MACDoM,iBAAiB,CAACF,QAAQ,CAAC;KAClC,IAAIxB,cAAc,CAACR,IAAI,CAACrY,MAAM,EAAE,KAAK,CAAC,EAAE;AACtCqa,OAAAA,QAAQ,GAAG5D,wBAAwB,CAACnP,IAAI,CAAC;AACzC,OAAA,IAAIkT,IAAI,GAAGtU,MAAM,CAACsU,IAAI,CAACxa,MAAM,CAAC,CAACwE,MAAM,CAAC,UAAUiW,CAAC,EAAE;SACjD,OAAO,KAAK,KAAKA,CAAC;AACpB,OAAA,CAAC,CAAC;AACFL,OAAAA,gBAAgB,GACd,CAAC,GAAGI,IAAI,CAAC7U,MAAM,GACX,iBAAiB,GAAG6U,IAAI,CAAC3O,IAAI,CAAC,SAAS,CAAC,GAAG,QAAQ,GACnD,gBAAgB;OACtB6O,qBAAqB,CAACL,QAAQ,GAAGD,gBAAgB,CAAC,KAC9CI,IAAI,GACJ,CAAC,GAAGA,IAAI,CAAC7U,MAAM,GAAG,GAAG,GAAG6U,IAAI,CAAC3O,IAAI,CAAC,SAAS,CAAC,GAAG,QAAQ,GAAG,IAAI,EAChEnH,OAAO,CAACyJ,KAAK,CACX,iOAAiO,EACjOiM,gBAAgB,EAChBC,QAAQ,EACRG,IAAI,EACJH,QACF,CAAC,EACAK,qBAAqB,CAACL,QAAQ,GAAGD,gBAAgB,CAAC,GAAG,IAAG,CAAC;AAC9D,KAAA;KACAC,QAAQ,GAAG,IAAI;AACf,KAAA,MAAM,KAAKrE,QAAQ,KAChBgC,sBAAsB,CAAChC,QAAQ,CAAC,EAAGqE,QAAQ,GAAG,EAAE,GAAGrE,QAAS,CAAC;AAChE4C,KAAAA,WAAW,CAAC5Y,MAAM,CAAC,KAChBgY,sBAAsB,CAAChY,MAAM,CAACyL,GAAG,CAAC,EAAG4O,QAAQ,GAAG,EAAE,GAAGra,MAAM,CAACyL,GAAI,CAAC;KACpE,IAAI,KAAK,IAAIzL,MAAM,EAAE;OACnBgW,QAAQ,GAAG,EAAE;AACb,OAAA,KAAK,IAAIC,QAAQ,IAAIjW,MAAM,EACzB,KAAK,KAAKiW,QAAQ,KAAKD,QAAQ,CAACC,QAAQ,CAAC,GAAGjW,MAAM,CAACiW,QAAQ,CAAC,CAAC;MAChE,MAAMD,QAAQ,GAAGhW,MAAM;KACxBqa,QAAQ,IACNpB,0BAA0B,CACxBjD,QAAQ,EACR,UAAU,KAAK,OAAO1O,IAAI,GACtBA,IAAI,CAACqP,WAAW,IAAIrP,IAAI,CAACsP,IAAI,IAAI,SAAS,GAC1CtP,IACN,CAAC;AACH,KAAA,OAAOmS,YAAY,CACjBnS,IAAI,EACJ+S,QAAQ,EACRrE,QAAQ,EACRuC,QAAQ,EAAE,EACVoB,UAAU,EACVC,SACF,CAAC;AACH,GAAA;GACA,SAASW,iBAAiBA,CAACnW,IAAI,EAAE;AAC/BuW,KAAAA,cAAc,CAACvW,IAAI,CAAC,GAChBA,IAAI,CAAC4V,MAAM,KAAK5V,IAAI,CAAC4V,MAAM,CAACY,SAAS,GAAG,CAAC,CAAC,GAC1C,QAAQ,KAAK,OAAOxW,IAAI,IACxB,IAAI,KAAKA,IAAI,IACbA,IAAI,CAAC+R,QAAQ,KAAKwB,eAAe,KAChC,WAAW,KAAKvT,IAAI,CAACwT,QAAQ,CAACpS,MAAM,GACjCmV,cAAc,CAACvW,IAAI,CAACwT,QAAQ,CAACrM,KAAK,CAAC,IACnCnH,IAAI,CAACwT,QAAQ,CAACrM,KAAK,CAACyO,MAAM,KACzB5V,IAAI,CAACwT,QAAQ,CAACrM,KAAK,CAACyO,MAAM,CAACY,SAAS,GAAG,CAAC,CAAC,GAC1CxW,IAAI,CAAC4V,MAAM,KAAK5V,IAAI,CAAC4V,MAAM,CAACY,SAAS,GAAG,CAAC,CAAC,CAAC;AACrD,GAAA;GACA,SAASD,cAAcA,CAACE,MAAM,EAAE;AAC9B,KAAA,OACE,QAAQ,KAAK,OAAOA,MAAM,IAC1B,IAAI,KAAKA,MAAM,IACfA,MAAM,CAAC1E,QAAQ,KAAKR,kBAAkB;AAE1C,GAAA;GACA,IAAImF,OAAK,GAAGC,KAAgB;AAC1BpF,KAAAA,kBAAkB,GAAGC,MAAM,CAACC,GAAG,CAAC,4BAA4B,CAAC;AAC7DsB,KAAAA,iBAAiB,GAAGvB,MAAM,CAACC,GAAG,CAAC,cAAc,CAAC;AAC9CC,KAAAA,mBAAmB,GAAGF,MAAM,CAACC,GAAG,CAAC,gBAAgB,CAAC;AAClDiB,KAAAA,sBAAsB,GAAGlB,MAAM,CAACC,GAAG,CAAC,mBAAmB,CAAC;AACxDgB,KAAAA,mBAAmB,GAAGjB,MAAM,CAACC,GAAG,CAAC,gBAAgB,CAAC;AAClDwB,KAAAA,mBAAmB,GAAGzB,MAAM,CAACC,GAAG,CAAC,gBAAgB,CAAC;AAClDuB,KAAAA,kBAAkB,GAAGxB,MAAM,CAACC,GAAG,CAAC,eAAe,CAAC;AAChD0B,KAAAA,sBAAsB,GAAG3B,MAAM,CAACC,GAAG,CAAC,mBAAmB,CAAC;AACxDkB,KAAAA,mBAAmB,GAAGnB,MAAM,CAACC,GAAG,CAAC,gBAAgB,CAAC;AAClDmB,KAAAA,wBAAwB,GAAGpB,MAAM,CAACC,GAAG,CAAC,qBAAqB,CAAC;AAC5D6B,KAAAA,eAAe,GAAG9B,MAAM,CAACC,GAAG,CAAC,YAAY,CAAC;AAC1C8B,KAAAA,eAAe,GAAG/B,MAAM,CAACC,GAAG,CAAC,YAAY,CAAC;AAC1CoB,KAAAA,mBAAmB,GAAGrB,MAAM,CAACC,GAAG,CAAC,gBAAgB,CAAC;AAClDa,KAAAA,sBAAsB,GAAGd,MAAM,CAACC,GAAG,CAAC,wBAAwB,CAAC;KAC7D4C,oBAAoB,GAClBqC,OAAK,CAACE,+DAA+D;AACvEnC,KAAAA,cAAc,GAAG3S,MAAM,CAAC+U,SAAS,CAACpC,cAAc;KAChDyB,WAAW,GAAGjW,KAAK,CAAC6W,OAAO;KAC3BC,UAAU,GAAGzW,OAAO,CAACyW,UAAU,GAC3BzW,OAAO,CAACyW,UAAU,GAClB,YAAY;AACV,OAAA,OAAO,IAAI;MACZ;AACPL,GAAAA,OAAK,GAAG;AACNM,KAAAA,wBAAwB,EAAE,UAAUC,iBAAiB,EAAE;OACrD,OAAOA,iBAAiB,EAAE;AAC5B,KAAA;IACD;AACD,GAAA,IAAIlC,0BAA0B;GAC9B,IAAIK,sBAAsB,GAAG,EAAE;AAC/B,GAAA,IAAI8B,sBAAsB,GAAGR,OAAK,CAACM,wBAAwB,CAACG,IAAI,CAC9DT,OAAK,EACLnC,YACF,CAAC,EAAE;GACH,IAAI6C,qBAAqB,GAAGL,UAAU,CAAC7C,WAAW,CAACK,YAAY,CAAC,CAAC;GACjE,IAAI+B,qBAAqB,GAAG,EAAE;GAC9BrE,6BAAAA,CAAAA,QAAgB,GAAGP,mBAAmB;GACtCO,6BAAAA,CAAAA,GAAW,GAAG,UAAU/O,IAAI,EAAEtH,MAAM,EAAEgW,QAAQ,EAAE;KAC9C,IAAIyF,gBAAgB,GAClB,GAAG,GAAGhD,oBAAoB,CAACiD,0BAA0B,EAAE;AACzD,KAAA,OAAOvB,UAAU,CACf7S,IAAI,EACJtH,MAAM,EACNgW,QAAQ,EACR,KAAE,EACFyF,gBAAgB,GACZlW,KAAK,CAAC,uBAAuB,CAAC,GAC9B+V,sBAAsB,EAC1BG,gBAAgB,GAAGN,UAAU,CAAC7C,WAAW,CAAChR,IAAI,CAAC,CAAC,GAAGkU,qBACrD,CAAC;IACF;GACDnF,6BAAAA,CAAAA,IAAY,GAAG,UAAU/O,IAAI,EAAEtH,MAAM,EAAEgW,QAAQ,EAAE;KAC/C,IAAIyF,gBAAgB,GAClB,GAAG,GAAGhD,oBAAoB,CAACiD,0BAA0B,EAAE;AACzD,KAAA,OAAOvB,UAAU,CACf7S,IAAI,EACJtH,MAAM,EACNgW,QAAQ,EACR,IAAE,EACFyF,gBAAgB,GACZlW,KAAK,CAAC,uBAAuB,CAAC,GAC9B+V,sBAAsB,EAC1BG,gBAAgB,GAAGN,UAAU,CAAC7C,WAAW,CAAChR,IAAI,CAAC,CAAC,GAAGkU,qBACrD,CAAC;IACF;AACH,CAAA,CAAC,EAAG;;;;AC7VN,IAAIlF,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;AACzCmF,EAAAA,YAAAA,CAAAA,OAAc,GAAGZ,iCAAAA,EAAgD;AACnE,CAAC,MAAM;AACLY,EAAAA,YAAAA,CAAAA,OAAc,GAAGZ,oCAAAA,EAAiD;AACpE;;;;;;;;;;;;;;;;;;;;;;;;CCGa,IAAIa,CAAC,GAACb,KAAgB;AAACN,GAAAA,CAAC,GAAC7E,MAAM,CAACC,GAAG,CAAC,eAAe,CAAC;AAACgG,GAAAA,CAAC,GAACjG,MAAM,CAACC,GAAG,CAAC,gBAAgB,CAAC;AAACiG,GAAAA,CAAC,GAAC5V,MAAM,CAAC+U,SAAS,CAACpC,cAAc;AAACkD,GAAAA,CAAC,GAACH,CAAC,CAACI,kDAAkD,CAACC,iBAAiB;AAACC,GAAAA,CAAC,GAAC;KAACzQ,GAAG,EAAC,IAAE;KAACyK,GAAG,EAAC,IAAE;KAACiG,MAAM,EAAC,IAAE;KAACC,QAAQ,EAAC;IAAG;AACnP,CAAA,SAASC,CAACA,CAACC,CAAC,EAACC,CAAC,EAACC,CAAC,EAAC;AAAC,GAAA,IAAIC,CAAC;KAACC,CAAC,GAAC,EAAE;KAACxY,CAAC,GAAC,IAAI;KAACyY,CAAC,GAAC,IAAI;GAAC,MAAM,KAAGH,CAAC,KAAGtY,CAAC,GAAC,EAAE,GAACsY,CAAC,CAAC;AAAC,GAAA,MAAM,KAAGD,CAAC,CAAC9Q,GAAG,KAAGvH,CAAC,GAAC,EAAE,GAACqY,CAAC,CAAC9Q,GAAG,CAAC;GAAC,MAAM,KAAG8Q,CAAC,CAACrG,GAAG,KAAGyG,CAAC,GAACJ,CAAC,CAACrG,GAAG,CAAC;AAAC,GAAA,KAAIuG,CAAC,IAAIF,CAAC,EAACT,CAAC,CAACzD,IAAI,CAACkE,CAAC,EAACE,CAAC,CAAC,IAAE,CAACP,CAAC,CAACrD,cAAc,CAAC4D,CAAC,CAAC,KAAGC,CAAC,CAACD,CAAC,CAAC,GAACF,CAAC,CAACE,CAAC,CAAC,CAAC;AAAC,GAAA,IAAGH,CAAC,IAAEA,CAAC,CAACM,YAAY,EAAC,KAAIH,CAAC,IAAIF,CAAC,GAACD,CAAC,CAACM,YAAY,EAACL,CAAC,EAAC,MAAM,KAAGG,CAAC,CAACD,CAAC,CAAC,KAAGC,CAAC,CAACD,CAAC,CAAC,GAACF,CAAC,CAACE,CAAC,CAAC,CAAC;GAAC,OAAM;KAACtG,QAAQ,EAACsE,CAAC;KAACnT,IAAI,EAACgV,CAAC;KAAC7Q,GAAG,EAACvH,CAAC;KAACgS,GAAG,EAACyG,CAAC;KAACvG,KAAK,EAACsG,CAAC;KAAC5C,MAAM,EAACiC,CAAC,CAAC3J;IAAQ;AAAA,CAAA;AAACiE,CAAAA,8BAAAA,CAAAA,QAAgB,GAACwF,CAAC;AAACxF,CAAAA,8BAAAA,CAAAA,GAAW,GAACgG,CAAC;AAAChG,CAAAA,8BAAAA,CAAAA,IAAY,GAACgG,CAAC;;;;;;;;;;;;;;;;;;;;;;ACE3W,CAAA,IAAI/F,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;AACzC,GAAA,CAAC,YAAW;;KAGd,IAAIsE,OAAK,GAAGC,KAAgB;;AAE5B;AACA;AACA;AACA;KACA,IAAIpF,kBAAkB,GAAGC,MAAM,CAACC,GAAG,CAAC,eAAe,CAAC;KACpD,IAAIsB,iBAAiB,GAAGvB,MAAM,CAACC,GAAG,CAAC,cAAc,CAAC;KAClD,IAAIC,mBAAmB,GAAGF,MAAM,CAACC,GAAG,CAAC,gBAAgB,CAAC;KACtD,IAAIiB,sBAAsB,GAAGlB,MAAM,CAACC,GAAG,CAAC,mBAAmB,CAAC;KAC5D,IAAIgB,mBAAmB,GAAGjB,MAAM,CAACC,GAAG,CAAC,gBAAgB,CAAC;KACtD,IAAIgH,mBAAmB,GAAGjH,MAAM,CAACC,GAAG,CAAC,gBAAgB,CAAC;KACtD,IAAIuB,kBAAkB,GAAGxB,MAAM,CAACC,GAAG,CAAC,eAAe,CAAC;KACpD,IAAI0B,sBAAsB,GAAG3B,MAAM,CAACC,GAAG,CAAC,mBAAmB,CAAC;KAC5D,IAAIkB,mBAAmB,GAAGnB,MAAM,CAACC,GAAG,CAAC,gBAAgB,CAAC;KACtD,IAAImB,wBAAwB,GAAGpB,MAAM,CAACC,GAAG,CAAC,qBAAqB,CAAC;KAChE,IAAI6B,eAAe,GAAG9B,MAAM,CAACC,GAAG,CAAC,YAAY,CAAC;KAC9C,IAAI8B,eAAe,GAAG/B,MAAM,CAACC,GAAG,CAAC,YAAY,CAAC;KAC9C,IAAIiH,oBAAoB,GAAGlH,MAAM,CAACC,GAAG,CAAC,iBAAiB,CAAC;AACxD,KAAA,IAAIkH,qBAAqB,GAAGnH,MAAM,CAACoH,QAAQ;KAC3C,IAAIC,oBAAoB,GAAG,YAAY;KACvC,SAASC,aAAaA,CAACC,aAAa,EAAE;OACpC,IAAIA,aAAa,KAAK,IAAI,IAAI,OAAOA,aAAa,KAAK,QAAQ,EAAE;AAC/D,SAAA,OAAO,IAAI;AACb,OAAA;AAEA,OAAA,IAAIC,aAAa,GAAGL,qBAAqB,IAAII,aAAa,CAACJ,qBAAqB,CAAC,IAAII,aAAa,CAACF,oBAAoB,CAAC;AAExH,OAAA,IAAI,OAAOG,aAAa,KAAK,UAAU,EAAE;AACvC,SAAA,OAAOA,aAAa;AACtB,OAAA;AAEA,OAAA,OAAO,IAAI;AACb,KAAA;AAEA,KAAA,IAAI3E,oBAAoB,GAAGqC,OAAK,CAACkB,kDAAkD;KAEnF,SAAS7N,KAAKA,CAACkP,MAAM,EAAE;OACrB;SACE;AACE,WAAA,KAAK,IAAIC,KAAK,GAAGC,SAAS,CAAC5X,MAAM,EAAE6X,IAAI,GAAG,IAAInZ,KAAK,CAACiZ,KAAK,GAAG,CAAC,GAAGA,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,EAAEG,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGH,KAAK,EAAEG,KAAK,EAAE,EAAE;aACjHD,IAAI,CAACC,KAAK,GAAG,CAAC,CAAC,GAAGF,SAAS,CAACE,KAAK,CAAC;AACpC,WAAA;AAEAC,WAAAA,YAAY,CAAC,OAAO,EAAEL,MAAM,EAAEG,IAAI,CAAC;AACrC,SAAA;AACF,OAAA;AACF,KAAA;KAEA,SAASE,YAAYA,CAACC,KAAK,EAAEN,MAAM,EAAEG,IAAI,EAAE;AACzC;AACA;OACA;AACE,SAAA,IAAII,sBAAsB,GAAGnF,oBAAoB,CAACmF,sBAAsB;AACxE,SAAA,IAAIC,KAAK,GAAGD,sBAAsB,CAACE,gBAAgB,EAAE;SAErD,IAAID,KAAK,KAAK,EAAE,EAAE;WAChBR,MAAM,IAAI,IAAI;WACdG,IAAI,GAAGA,IAAI,CAACO,MAAM,CAAC,CAACF,KAAK,CAAC,CAAC;SAC7B,CAAC;;SAGD,IAAIG,cAAc,GAAGR,IAAI,CAAC5R,GAAG,CAAC,UAAUqS,IAAI,EAAE;WAC5C,OAAOC,MAAM,CAACD,IAAI,CAAC;UACpB,CAAC,CAAC;;SAEHD,cAAc,CAACG,OAAO,CAAC,WAAW,GAAGd,MAAM,CAAC,CAAC;AAC7C;AACA;;AAEAe,SAAAA,QAAQ,CAACnD,SAAS,CAACoD,KAAK,CAAChG,IAAI,CAAC3T,OAAO,CAACiZ,KAAK,CAAC,EAAEjZ,OAAO,EAAEsZ,cAAc,CAAC;AACxE,OAAA;AACF,KAAA;;AAEA;;AAEA,KAAA,IAAIM,cAAc,GAAG,KAAK,CAAC;KAC3B,IAAIC,kBAAkB,GAAG,KAAK;AAC9B,KAAA,IAAIC,uBAAuB,GAAG,KAAK,CAAC;;AAEpC,KAAA,IAAIC,kBAAkB,GAAG,KAAK,CAAC;AAC/B;AACA;;AAEA,KAAA,IAAIC,kBAAkB,GAAG,KAAK,CAAC;;AAE/B,KAAA,IAAIC,sBAAsB;KAE1B;AACEA,OAAAA,sBAAsB,GAAG/I,MAAM,CAACC,GAAG,CAAC,wBAAwB,CAAC;AAC/D,KAAA;KAEA,SAAS+I,kBAAkBA,CAACtX,IAAI,EAAE;OAChC,IAAI,OAAOA,IAAI,KAAK,QAAQ,IAAI,OAAOA,IAAI,KAAK,UAAU,EAAE;AAC1D,SAAA,OAAO,IAAI;OACb,CAAC;;AAGD,OAAA,IAAIA,IAAI,KAAKwO,mBAAmB,IAAIxO,IAAI,KAAKuP,mBAAmB,IAAI6H,kBAAkB,IAAKpX,IAAI,KAAKwP,sBAAsB,IAAIxP,IAAI,KAAKyP,mBAAmB,IAAIzP,IAAI,KAAK0P,wBAAwB,IAAIyH,kBAAkB,IAAKnX,IAAI,KAAKwV,oBAAoB,IAAIwB,cAAc,IAAKC,kBAAkB,IAAKC,uBAAuB,EAAG;AAC7T,SAAA,OAAO,IAAI;AACb,OAAA;OAEA,IAAI,OAAOlX,IAAI,KAAK,QAAQ,IAAIA,IAAI,KAAK,IAAI,EAAE;AAC7C,SAAA,IAAIA,IAAI,CAAC6O,QAAQ,KAAKwB,eAAe,IAAIrQ,IAAI,CAAC6O,QAAQ,KAAKuB,eAAe,IAAIpQ,IAAI,CAAC6O,QAAQ,KAAK0G,mBAAmB,IAAIvV,IAAI,CAAC6O,QAAQ,KAAKiB,kBAAkB,IAAI9P,IAAI,CAAC6O,QAAQ,KAAKoB,sBAAsB;AAAI;AAC3M;AACA;AACA;SACAjQ,IAAI,CAAC6O,QAAQ,KAAKwI,sBAAsB,IAAIrX,IAAI,CAACuX,WAAW,KAAKC,SAAS,EAAE;AAC1E,WAAA,OAAO,IAAI;AACb,SAAA;AACF,OAAA;AAEA,OAAA,OAAO,KAAK;AACd,KAAA;KAEA,SAASC,cAAcA,CAACC,SAAS,EAAExH,SAAS,EAAEyH,WAAW,EAAE;AACzD,OAAA,IAAItI,WAAW,GAAGqI,SAAS,CAACrI,WAAW;OAEvC,IAAIA,WAAW,EAAE;AACf,SAAA,OAAOA,WAAW;AACpB,OAAA;OAEA,IAAIuI,YAAY,GAAG1H,SAAS,CAACb,WAAW,IAAIa,SAAS,CAACZ,IAAI,IAAI,EAAE;AAChE,OAAA,OAAOsI,YAAY,KAAK,EAAE,GAAGD,WAAW,GAAG,GAAG,GAAGC,YAAY,GAAG,GAAG,GAAGD,WAAW;KACnF,CAAC;;KAGD,SAASE,cAAcA,CAAC7X,IAAI,EAAE;AAC5B,OAAA,OAAOA,IAAI,CAACqP,WAAW,IAAI,SAAS;KACtC,CAAC;;KAGD,SAASF,wBAAwBA,CAACnP,IAAI,EAAE;OACtC,IAAIA,IAAI,IAAI,IAAI,EAAE;AAChB;AACA,SAAA,OAAO,IAAI;AACb,OAAA;OAEA;AACE,SAAA,IAAI,OAAOA,IAAI,CAAC4P,GAAG,KAAK,QAAQ,EAAE;AAChC/I,WAAAA,KAAK,CAAC,+DAA+D,GAAG,sDAAsD,CAAC;AACjI,SAAA;AACF,OAAA;AAEA,OAAA,IAAI,OAAO7G,IAAI,KAAK,UAAU,EAAE;SAC9B,OAAOA,IAAI,CAACqP,WAAW,IAAIrP,IAAI,CAACsP,IAAI,IAAI,IAAI;AAC9C,OAAA;AAEA,OAAA,IAAI,OAAOtP,IAAI,KAAK,QAAQ,EAAE;AAC5B,SAAA,OAAOA,IAAI;AACb,OAAA;AAEA,OAAA,QAAQA,IAAI;AACV,SAAA,KAAKwO,mBAAmB;AACtB,WAAA,OAAO,UAAU;AAEnB,SAAA,KAAKqB,iBAAiB;AACpB,WAAA,OAAO,QAAQ;AAEjB,SAAA,KAAKN,mBAAmB;AACtB,WAAA,OAAO,UAAU;AAEnB,SAAA,KAAKC,sBAAsB;AACzB,WAAA,OAAO,YAAY;AAErB,SAAA,KAAKC,mBAAmB;AACtB,WAAA,OAAO,UAAU;AAEnB,SAAA,KAAKC,wBAAwB;AAC3B,WAAA,OAAO,cAAc;AAEzB;AAEA,OAAA,IAAI,OAAO1P,IAAI,KAAK,QAAQ,EAAE;SAC5B,QAAQA,IAAI,CAAC6O,QAAQ;AACnB,WAAA,KAAKiB,kBAAkB;aACrB,IAAIgI,OAAO,GAAG9X,IAAI;AAClB,aAAA,OAAO6X,cAAc,CAACC,OAAO,CAAC,GAAG,WAAW;AAE9C,WAAA,KAAKvC,mBAAmB;aACtB,IAAInI,QAAQ,GAAGpN,IAAI;aACnB,OAAO6X,cAAc,CAACzK,QAAQ,CAAC4C,QAAQ,CAAC,GAAG,WAAW;AAExD,WAAA,KAAKC,sBAAsB;aACzB,OAAOwH,cAAc,CAACzX,IAAI,EAAEA,IAAI,CAACmQ,MAAM,EAAE,YAAY,CAAC;AAExD,WAAA,KAAKC,eAAe;AAClB,aAAA,IAAI2H,SAAS,GAAG/X,IAAI,CAACqP,WAAW,IAAI,IAAI;aAExC,IAAI0I,SAAS,KAAK,IAAI,EAAE;AACtB,eAAA,OAAOA,SAAS;AAClB,aAAA;aAEA,OAAO5I,wBAAwB,CAACnP,IAAI,CAACA,IAAI,CAAC,IAAI,MAAM;AAEtD,WAAA,KAAKqQ,eAAe;aAClB;eACE,IAAI2H,aAAa,GAAGhY,IAAI;AACxB,eAAA,IAAIiY,OAAO,GAAGD,aAAa,CAAC1H,QAAQ;AACpC,eAAA,IAAIlU,IAAI,GAAG4b,aAAa,CAACzH,KAAK;eAE9B,IAAI;AACF,iBAAA,OAAOpB,wBAAwB,CAAC/S,IAAI,CAAC6b,OAAO,CAAC,CAAC;gBAC/C,CAAC,OAAOzH,CAAC,EAAE;AACV,iBAAA,OAAO,IAAI;AACb,eAAA;AACF,aAAA;;AAEF;AACF;AACF,OAAA;AAEA,OAAA,OAAO,IAAI;AACb,KAAA;AAEA,KAAA,IAAI3R,MAAM,GAAGD,MAAM,CAACC,MAAM;;AAE1B;AACA;AACA;AACA;KACA,IAAIqZ,aAAa,GAAG,CAAC;AACrB,KAAA,IAAIC,OAAO;AACX,KAAA,IAAIC,QAAQ;AACZ,KAAA,IAAIC,QAAQ;AACZ,KAAA,IAAIC,SAAS;AACb,KAAA,IAAIC,SAAS;AACb,KAAA,IAAIC,kBAAkB;AACtB,KAAA,IAAIC,YAAY;KAEhB,SAASC,WAAWA,GAAG,CAAA;KAEvBA,WAAW,CAACC,kBAAkB,GAAG,IAAI;KACrC,SAASC,WAAWA,GAAG;OACrB;SACE,IAAIV,aAAa,KAAK,CAAC,EAAE;AACvB;WACAC,OAAO,GAAG/a,OAAO,CAACC,GAAG;WACrB+a,QAAQ,GAAGhb,OAAO,CAACmP,IAAI;WACvB8L,QAAQ,GAAGjb,OAAO,CAACgB,IAAI;WACvBka,SAAS,GAAGlb,OAAO,CAACyJ,KAAK;WACzB0R,SAAS,GAAGnb,OAAO,CAACyb,KAAK;WACzBL,kBAAkB,GAAGpb,OAAO,CAAC0b,cAAc;AAC3CL,WAAAA,YAAY,GAAGrb,OAAO,CAAC2b,QAAQ,CAAC;;WAEhC,IAAIjK,KAAK,GAAG;aACViD,YAAY,EAAE,IAAI;aAClBU,UAAU,EAAE,IAAI;aAChBxO,KAAK,EAAEyU,WAAW;AAClB/F,aAAAA,QAAQ,EAAE;AACZ,YAAC,CAAC;;AAEF/T,WAAAA,MAAM,CAACoa,gBAAgB,CAAC5b,OAAO,EAAE;aAC/BmP,IAAI,EAAEuC,KAAK;aACXzR,GAAG,EAAEyR,KAAK;aACV1Q,IAAI,EAAE0Q,KAAK;aACXjI,KAAK,EAAEiI,KAAK;aACZ+J,KAAK,EAAE/J,KAAK;aACZgK,cAAc,EAAEhK,KAAK;AACrBiK,aAAAA,QAAQ,EAAEjK;AACZ,YAAC,CAAC;AACF;AACF,SAAA;AAEAoJ,SAAAA,aAAa,EAAE;AACjB,OAAA;AACF,KAAA;KACA,SAASe,YAAYA,GAAG;OACtB;AACEf,SAAAA,aAAa,EAAE;SAEf,IAAIA,aAAa,KAAK,CAAC,EAAE;AACvB;WACA,IAAIpJ,KAAK,GAAG;aACViD,YAAY,EAAE,IAAI;aAClBU,UAAU,EAAE,IAAI;AAChBE,aAAAA,QAAQ,EAAE;AACZ,YAAC,CAAC;;AAEF/T,WAAAA,MAAM,CAACoa,gBAAgB,CAAC5b,OAAO,EAAE;AAC/BC,aAAAA,GAAG,EAAEwB,MAAM,CAAC,EAAE,EAAEiQ,KAAK,EAAE;AACrB7K,eAAAA,KAAK,EAAEkU;AACT,cAAC,CAAC;AACF5L,aAAAA,IAAI,EAAE1N,MAAM,CAAC,EAAE,EAAEiQ,KAAK,EAAE;AACtB7K,eAAAA,KAAK,EAAEmU;AACT,cAAC,CAAC;AACFha,aAAAA,IAAI,EAAES,MAAM,CAAC,EAAE,EAAEiQ,KAAK,EAAE;AACtB7K,eAAAA,KAAK,EAAEoU;AACT,cAAC,CAAC;AACFxR,aAAAA,KAAK,EAAEhI,MAAM,CAAC,EAAE,EAAEiQ,KAAK,EAAE;AACvB7K,eAAAA,KAAK,EAAEqU;AACT,cAAC,CAAC;AACFO,aAAAA,KAAK,EAAEha,MAAM,CAAC,EAAE,EAAEiQ,KAAK,EAAE;AACvB7K,eAAAA,KAAK,EAAEsU;AACT,cAAC,CAAC;AACFO,aAAAA,cAAc,EAAEja,MAAM,CAAC,EAAE,EAAEiQ,KAAK,EAAE;AAChC7K,eAAAA,KAAK,EAAEuU;AACT,cAAC,CAAC;AACFO,aAAAA,QAAQ,EAAEla,MAAM,CAAC,EAAE,EAAEiQ,KAAK,EAAE;AAC1B7K,eAAAA,KAAK,EAAEwU;cACR;AACH,YAAC,CAAC;AACF;AACF,SAAA;SAEA,IAAIP,aAAa,GAAG,CAAC,EAAE;AACrBrR,WAAAA,KAAK,CAAC,iCAAiC,GAAG,+CAA+C,CAAC;AAC5F,SAAA;AACF,OAAA;AACF,KAAA;AAEA,KAAA,IAAIqS,sBAAsB,GAAG/H,oBAAoB,CAAC+H,sBAAsB;AACxE,KAAA,IAAIC,MAAM;KACV,SAASC,6BAA6BA,CAAC9J,IAAI,EAAE+J,MAAM,EAAEC,OAAO,EAAE;OAC5D;SACE,IAAIH,MAAM,KAAK3B,SAAS,EAAE;AACxB;WACA,IAAI;aACF,MAAMvZ,KAAK,EAAE;YACd,CAAC,OAAOuS,CAAC,EAAE;AACV,aAAA,IAAI+I,KAAK,GAAG/I,CAAC,CAAC+F,KAAK,CAAC5O,IAAI,EAAE,CAAC4R,KAAK,CAAC,cAAc,CAAC;aAChDJ,MAAM,GAAGI,KAAK,IAAIA,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;AAClC,WAAA;SACF,CAAC;;AAGD,SAAA,OAAO,IAAI,GAAGJ,MAAM,GAAG7J,IAAI;AAC7B,OAAA;AACF,KAAA;KACA,IAAIkK,OAAO,GAAG,KAAK;AACnB,KAAA,IAAIC,mBAAmB;KAEvB;OACE,IAAIC,eAAe,GAAG,OAAOC,OAAO,KAAK,UAAU,GAAGA,OAAO,GAAGC,GAAG;AACnEH,OAAAA,mBAAmB,GAAG,IAAIC,eAAe,EAAE;AAC7C,KAAA;AAEA,KAAA,SAASG,4BAA4BA,CAACC,EAAE,EAAEC,SAAS,EAAE;AACnD;AACA,OAAA,IAAK,CAACD,EAAE,IAAIN,OAAO,EAAE;AACnB,SAAA,OAAO,EAAE;AACX,OAAA;OAEA;SACE,IAAIQ,KAAK,GAAGP,mBAAmB,CAAC1gB,GAAG,CAAC+gB,EAAE,CAAC;SAEvC,IAAIE,KAAK,KAAKxC,SAAS,EAAE;AACvB,WAAA,OAAOwC,KAAK;AACd,SAAA;AACF,OAAA;AAEA,OAAA,IAAIC,OAAO;OACXT,OAAO,GAAG,IAAI;AACd,OAAA,IAAIU,yBAAyB,GAAGjc,KAAK,CAACkc,iBAAiB,CAAC;;OAExDlc,KAAK,CAACkc,iBAAiB,GAAG3C,SAAS;AACnC,OAAA,IAAI4C,kBAAkB;OAEtB;AACEA,SAAAA,kBAAkB,GAAGlB,sBAAsB,CAACpO,OAAO,CAAC;AACpD;;SAEAoO,sBAAsB,CAACpO,OAAO,GAAG,IAAI;AACrC8N,SAAAA,WAAW,EAAE;AACf,OAAA;OAEA,IAAI;AACF;SACA,IAAImB,SAAS,EAAE;AACb;WACA,IAAIM,IAAI,GAAG,YAAY;aACrB,MAAMpc,KAAK,EAAE;AACf,WAAA,CAAC,CAAC;;WAGFW,MAAM,CAACkT,cAAc,CAACuI,IAAI,CAAC1G,SAAS,EAAE,OAAO,EAAE;aAC7C2G,GAAG,EAAE,YAAY;AACf;AACA;eACA,MAAMrc,KAAK,EAAE;AACf,aAAA;AACF,YAAC,CAAC;WAEF,IAAI,OAAOsc,OAAO,KAAK,QAAQ,IAAIA,OAAO,CAACR,SAAS,EAAE;AACpD;AACA;aACA,IAAI;AACFQ,eAAAA,OAAO,CAACR,SAAS,CAACM,IAAI,EAAE,EAAE,CAAC;cAC5B,CAAC,OAAO7J,CAAC,EAAE;eACVyJ,OAAO,GAAGzJ,CAAC;AACb,aAAA;aAEA+J,OAAO,CAACR,SAAS,CAACD,EAAE,EAAE,EAAE,EAAEO,IAAI,CAAC;AACjC,WAAA,CAAC,MAAM;aACL,IAAI;eACFA,IAAI,CAACtJ,IAAI,EAAE;cACZ,CAAC,OAAOP,CAAC,EAAE;eACVyJ,OAAO,GAAGzJ,CAAC;AACb,aAAA;AAEAsJ,aAAAA,EAAE,CAAC/I,IAAI,CAACsJ,IAAI,CAAC1G,SAAS,CAAC;AACzB,WAAA;AACF,SAAA,CAAC,MAAM;WACL,IAAI;aACF,MAAM1V,KAAK,EAAE;YACd,CAAC,OAAOuS,CAAC,EAAE;aACVyJ,OAAO,GAAGzJ,CAAC;AACb,WAAA;AAEAsJ,WAAAA,EAAE,EAAE;AACN,SAAA;QACD,CAAC,OAAOU,MAAM,EAAE;AACf;SACA,IAAIA,MAAM,IAAIP,OAAO,IAAI,OAAOO,MAAM,CAACjE,KAAK,KAAK,QAAQ,EAAE;AACzD;AACA;WACA,IAAIkE,WAAW,GAAGD,MAAM,CAACjE,KAAK,CAACmE,KAAK,CAAC,IAAI,CAAC;WAC1C,IAAIC,YAAY,GAAGV,OAAO,CAAC1D,KAAK,CAACmE,KAAK,CAAC,IAAI,CAAC;AAC5C,WAAA,IAAIE,CAAC,GAAGH,WAAW,CAACpc,MAAM,GAAG,CAAC;AAC9B,WAAA,IAAI2W,CAAC,GAAG2F,YAAY,CAACtc,MAAM,GAAG,CAAC;AAE/B,WAAA,OAAOuc,CAAC,IAAI,CAAC,IAAI5F,CAAC,IAAI,CAAC,IAAIyF,WAAW,CAACG,CAAC,CAAC,KAAKD,YAAY,CAAC3F,CAAC,CAAC,EAAE;AAC7D;AACA;AACA;AACA;AACA;AACA;AACAA,aAAAA,CAAC,EAAE;AACL,WAAA;AAEA,WAAA,OAAO4F,CAAC,IAAI,CAAC,IAAI5F,CAAC,IAAI,CAAC,EAAE4F,CAAC,EAAE,EAAE5F,CAAC,EAAE,EAAE;AACjC;AACA;aACA,IAAIyF,WAAW,CAACG,CAAC,CAAC,KAAKD,YAAY,CAAC3F,CAAC,CAAC,EAAE;AACtC;AACA;AACA;AACA;AACA;eACA,IAAI4F,CAAC,KAAK,CAAC,IAAI5F,CAAC,KAAK,CAAC,EAAE;iBACtB,GAAG;AACD4F,mBAAAA,CAAC,EAAE;mBACH5F,CAAC,EAAE,CAAC;AACJ;;AAEA,mBAAA,IAAIA,CAAC,GAAG,CAAC,IAAIyF,WAAW,CAACG,CAAC,CAAC,KAAKD,YAAY,CAAC3F,CAAC,CAAC,EAAE;AAC/C;AACA,qBAAA,IAAI6F,MAAM,GAAG,IAAI,GAAGJ,WAAW,CAACG,CAAC,CAAC,CAACle,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AAC/D;AACA;;qBAGA,IAAIod,EAAE,CAACzK,WAAW,IAAIwL,MAAM,CAACC,QAAQ,CAAC,aAAa,CAAC,EAAE;uBACpDD,MAAM,GAAGA,MAAM,CAACne,OAAO,CAAC,aAAa,EAAEod,EAAE,CAACzK,WAAW,CAAC;AACxD,qBAAA;qBAEA;AACE,uBAAA,IAAI,OAAOyK,EAAE,KAAK,UAAU,EAAE;AAC5BL,yBAAAA,mBAAmB,CAACa,GAAG,CAACR,EAAE,EAAEe,MAAM,CAAC;AACrC,uBAAA;qBACF,CAAC;;AAGD,qBAAA,OAAOA,MAAM;AACf,mBAAA;AACF,iBAAA,CAAC,QAAQD,CAAC,IAAI,CAAC,IAAI5F,CAAC,IAAI,CAAC;AAC3B,eAAA;eAEA;AACF,aAAA;AACF,WAAA;AACF,SAAA;AACF,OAAA,CAAC,SAAS;SACRwE,OAAO,GAAG,KAAK;SAEf;WACEN,sBAAsB,CAACpO,OAAO,GAAGsP,kBAAkB;AACnDnB,WAAAA,YAAY,EAAE;AAChB,SAAA;SAEAhb,KAAK,CAACkc,iBAAiB,GAAGD,yBAAyB;OACrD,CAAC;;AAGD,OAAA,IAAI5K,IAAI,GAAGwK,EAAE,GAAGA,EAAE,CAACzK,WAAW,IAAIyK,EAAE,CAACxK,IAAI,GAAG,EAAE;OAC9C,IAAIyL,cAAc,GAAGzL,IAAI,GAAG8J,6BAA6B,CAAC9J,IAAI,CAAC,GAAG,EAAE;OAEpE;AACE,SAAA,IAAI,OAAOwK,EAAE,KAAK,UAAU,EAAE;AAC5BL,WAAAA,mBAAmB,CAACa,GAAG,CAACR,EAAE,EAAEiB,cAAc,CAAC;AAC7C,SAAA;AACF,OAAA;AAEA,OAAA,OAAOA,cAAc;AACvB,KAAA;KACA,SAASC,8BAA8BA,CAAClB,EAAE,EAAET,MAAM,EAAEC,OAAO,EAAE;OAC3D;AACE,SAAA,OAAOO,4BAA4B,CAACC,EAAE,EAAE,KAAK,CAAC;AAChD,OAAA;AACF,KAAA;KAEA,SAASmB,eAAeA,CAACC,SAAS,EAAE;AAClC,OAAA,IAAIvH,SAAS,GAAGuH,SAAS,CAACvH,SAAS;OACnC,OAAO,CAAC,EAAEA,SAAS,IAAIA,SAAS,CAACwH,gBAAgB,CAAC;AACpD,KAAA;KAEA,SAASC,oCAAoCA,CAACpb,IAAI,EAAEqZ,MAAM,EAAEC,OAAO,EAAE;OAEnE,IAAItZ,IAAI,IAAI,IAAI,EAAE;AAChB,SAAA,OAAO,EAAE;AACX,OAAA;AAEA,OAAA,IAAI,OAAOA,IAAI,KAAK,UAAU,EAAE;SAC9B;WACE,OAAO6Z,4BAA4B,CAAC7Z,IAAI,EAAEib,eAAe,CAACjb,IAAI,CAAC,CAAC;AAClE,SAAA;AACF,OAAA;AAEA,OAAA,IAAI,OAAOA,IAAI,KAAK,QAAQ,EAAE;SAC5B,OAAOoZ,6BAA6B,CAACpZ,IAAI,CAAC;AAC5C,OAAA;AAEA,OAAA,QAAQA,IAAI;AACV,SAAA,KAAKyP,mBAAmB;WACtB,OAAO2J,6BAA6B,CAAC,UAAU,CAAC;AAElD,SAAA,KAAK1J,wBAAwB;WAC3B,OAAO0J,6BAA6B,CAAC,cAAc,CAAC;AACxD;AAEA,OAAA,IAAI,OAAOpZ,IAAI,KAAK,QAAQ,EAAE;SAC5B,QAAQA,IAAI,CAAC6O,QAAQ;AACnB,WAAA,KAAKoB,sBAAsB;AACzB,aAAA,OAAO+K,8BAA8B,CAAChb,IAAI,CAACmQ,MAAM,CAAC;AAEpD,WAAA,KAAKC,eAAe;AAClB;aACA,OAAOgL,oCAAoC,CAACpb,IAAI,CAACA,IAAI,EAAEqZ,MAAM,EAAEC,OAAO,CAAC;AAEzE,WAAA,KAAKjJ,eAAe;aAClB;eACE,IAAI2H,aAAa,GAAGhY,IAAI;AACxB,eAAA,IAAIiY,OAAO,GAAGD,aAAa,CAAC1H,QAAQ;AACpC,eAAA,IAAIlU,IAAI,GAAG4b,aAAa,CAACzH,KAAK;eAE9B,IAAI;AACF;iBACA,OAAO6K,oCAAoC,CAAChf,IAAI,CAAC6b,OAAO,CAAC,EAAEoB,MAAM,EAAEC,OAAO,CAAC;eAC7E,CAAC,CAAC,OAAO9I,CAAC,EAAE,CAAA;AACd,aAAA;AACJ;AACF,OAAA;AAEA,OAAA,OAAO,EAAE;AACX,KAAA;AAEA,KAAA,IAAIe,cAAc,GAAG3S,MAAM,CAAC+U,SAAS,CAACpC,cAAc;KAEpD,IAAI8J,kBAAkB,GAAG,EAAE;AAC3B,KAAA,IAAI/E,sBAAsB,GAAGnF,oBAAoB,CAACmF,sBAAsB;KAExE,SAASgF,6BAA6BA,CAACC,OAAO,EAAE;OAC9C;SACE,IAAIA,OAAO,EAAE;AACX,WAAA,IAAInJ,KAAK,GAAGmJ,OAAO,CAAC/I,MAAM;WAC1B,IAAI+D,KAAK,GAAG6E,oCAAoC,CAACG,OAAO,CAACvb,IAAI,EAAEub,OAAO,CAACC,OAAO,EAAEpJ,KAAK,GAAGA,KAAK,CAACpS,IAAI,GAAG,IAAI,CAAC;AAC1GsW,WAAAA,sBAAsB,CAACmF,kBAAkB,CAAClF,KAAK,CAAC;AAClD,SAAA,CAAC,MAAM;AACLD,WAAAA,sBAAsB,CAACmF,kBAAkB,CAAC,IAAI,CAAC;AACjD,SAAA;AACF,OAAA;AACF,KAAA;KAEA,SAASC,cAAcA,CAACC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,EAAE5J,aAAa,EAAEsJ,OAAO,EAAE;OAC3E;AACE;SACA,IAAIO,GAAG,GAAGhF,QAAQ,CAAC/F,IAAI,CAACkD,IAAI,CAAC1C,cAAc,CAAC;AAE5C,SAAA,KAAK,IAAIwK,YAAY,IAAIJ,SAAS,EAAE;AAClC,WAAA,IAAIG,GAAG,CAACH,SAAS,EAAEI,YAAY,CAAC,EAAE;AAChC,aAAA,IAAIC,OAAO,GAAG,MAAM,CAAC;AACrB;AACA;;aAEA,IAAI;AACF;AACA;eACA,IAAI,OAAOL,SAAS,CAACI,YAAY,CAAC,KAAK,UAAU,EAAE;AACjD;AACA,iBAAA,IAAI5d,GAAG,GAAGF,KAAK,CAAC,CAACgU,aAAa,IAAI,aAAa,IAAI,IAAI,GAAG4J,QAAQ,GAAG,SAAS,GAAGE,YAAY,GAAG,gBAAgB,GAAG,8EAA8E,GAAG,OAAOJ,SAAS,CAACI,YAAY,CAAC,GAAG,IAAI,GAAG,+FAA+F,CAAC;iBAC5U5d,GAAG,CAACmR,IAAI,GAAG,qBAAqB;AAChC,iBAAA,MAAMnR,GAAG;AACX,eAAA;AAEA6d,eAAAA,OAAO,GAAGL,SAAS,CAACI,YAAY,CAAC,CAACH,MAAM,EAAEG,YAAY,EAAE9J,aAAa,EAAE4J,QAAQ,EAAE,IAAI,EAAE,8CAA8C,CAAC;cACvI,CAAC,OAAOI,EAAE,EAAE;eACXD,OAAO,GAAGC,EAAE;AACd,aAAA;aAEA,IAAID,OAAO,IAAI,EAAEA,OAAO,YAAY/d,KAAK,CAAC,EAAE;eAC1Cqd,6BAA6B,CAACC,OAAO,CAAC;eAEtC1U,KAAK,CAAC,8BAA8B,GAAG,qCAAqC,GAAG,+DAA+D,GAAG,iEAAiE,GAAG,gEAAgE,GAAG,iCAAiC,EAAEoL,aAAa,IAAI,aAAa,EAAE4J,QAAQ,EAAEE,YAAY,EAAE,OAAOC,OAAO,CAAC;eAElYV,6BAA6B,CAAC,IAAI,CAAC;AACrC,aAAA;aAEA,IAAIU,OAAO,YAAY/d,KAAK,IAAI,EAAE+d,OAAO,CAAC3a,OAAO,IAAIga,kBAAkB,CAAC,EAAE;AACxE;AACA;AACAA,eAAAA,kBAAkB,CAACW,OAAO,CAAC3a,OAAO,CAAC,GAAG,IAAI;eAC1Cia,6BAA6B,CAACC,OAAO,CAAC;eAEtC1U,KAAK,CAAC,oBAAoB,EAAEgV,QAAQ,EAAEG,OAAO,CAAC3a,OAAO,CAAC;eAEtDia,6BAA6B,CAAC,IAAI,CAAC;AACrC,aAAA;AACF,WAAA;AACF,SAAA;AACF,OAAA;AACF,KAAA;AAEA,KAAA,IAAItI,WAAW,GAAGjW,KAAK,CAAC6W,OAAO,CAAC;;KAEhC,SAASA,OAAOA,CAACqB,CAAC,EAAE;OAClB,OAAOjC,WAAW,CAACiC,CAAC,CAAC;AACvB,KAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;KACA,SAASiH,QAAQA,CAACjY,KAAK,EAAE;OACvB;AACE;SACA,IAAIkY,cAAc,GAAG,OAAO7N,MAAM,KAAK,UAAU,IAAIA,MAAM,CAACwC,WAAW;AACvE,SAAA,IAAI9Q,IAAI,GAAGmc,cAAc,IAAIlY,KAAK,CAACqK,MAAM,CAACwC,WAAW,CAAC,IAAI7M,KAAK,CAACxL,WAAW,CAAC6W,IAAI,IAAI,QAAQ;AAC5F,SAAA,OAAOtP,IAAI;AACb,OAAA;KACF,CAAC;;KAGD,SAASoc,iBAAiBA,CAACnY,KAAK,EAAE;OAChC;SACE,IAAI;WACFwM,kBAAkB,CAACxM,KAAK,CAAC;AACzB,WAAA,OAAO,KAAK;UACb,CAAC,OAAOrH,CAAC,EAAE;AACV,WAAA,OAAO,IAAI;AACb,SAAA;AACF,OAAA;AACF,KAAA;KAEA,SAAS6T,kBAAkBA,CAACxM,KAAK,EAAE;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;OACA,OAAO,EAAE,GAAGA,KAAK;AACnB,KAAA;KACA,SAASyM,sBAAsBA,CAACzM,KAAK,EAAE;OACrC;AACE,SAAA,IAAImY,iBAAiB,CAACnY,KAAK,CAAC,EAAE;WAC5B4C,KAAK,CAAC,6CAA6C,GAAG,sEAAsE,EAAEqV,QAAQ,CAACjY,KAAK,CAAC,CAAC;AAE9I,WAAA,OAAOwM,kBAAkB,CAACxM,KAAK,CAAC,CAAC;AACnC,SAAA;AACF,OAAA;AACF,KAAA;AAEA,KAAA,IAAI0Q,iBAAiB,GAAGxD,oBAAoB,CAACwD,iBAAiB;KAC9D,IAAI0H,cAAc,GAAG;OACnBlY,GAAG,EAAE,IAAI;OACTyK,GAAG,EAAE,IAAI;OACTiG,MAAM,EAAE,IAAI;AACZC,OAAAA,QAAQ,EAAE;MACX;AACD,KAAA,IAAIjD,0BAA0B;AAC9B,KAAA,IAAIyK,0BAA0B;KAO9B,SAASC,WAAWA,CAAC7jB,MAAM,EAAE;OAC3B;SACE,IAAI6Y,cAAc,CAACR,IAAI,CAACrY,MAAM,EAAE,KAAK,CAAC,EAAE;WACtC,IAAI8Y,MAAM,GAAG5S,MAAM,CAAC6S,wBAAwB,CAAC/Y,MAAM,EAAE,KAAK,CAAC,CAACK,GAAG;AAE/D,WAAA,IAAIyY,MAAM,IAAIA,MAAM,CAACE,cAAc,EAAE;AACnC,aAAA,OAAO,KAAK;AACd,WAAA;AACF,SAAA;AACF,OAAA;AAEA,OAAA,OAAOhZ,MAAM,CAACkW,GAAG,KAAK4I,SAAS;AACjC,KAAA;KAEA,SAASlG,WAAWA,CAAC5Y,MAAM,EAAE;OAC3B;SACE,IAAI6Y,cAAc,CAACR,IAAI,CAACrY,MAAM,EAAE,KAAK,CAAC,EAAE;WACtC,IAAI8Y,MAAM,GAAG5S,MAAM,CAAC6S,wBAAwB,CAAC/Y,MAAM,EAAE,KAAK,CAAC,CAACK,GAAG;AAE/D,WAAA,IAAIyY,MAAM,IAAIA,MAAM,CAACE,cAAc,EAAE;AACnC,aAAA,OAAO,KAAK;AACd,WAAA;AACF,SAAA;AACF,OAAA;AAEA,OAAA,OAAOhZ,MAAM,CAACyL,GAAG,KAAKqT,SAAS;AACjC,KAAA;AAEA,KAAA,SAASgF,oCAAoCA,CAAC9jB,MAAM,EAAE+jB,IAAI,EAAE;OAC1D;SACE,IAAI,OAAO/jB,MAAM,CAACkW,GAAG,KAAK,QAAQ,IAAI+F,iBAAiB,CAAC7J,OAAO,IAAI2R,IAAoD,EAAE;AAS3H,OAAA;AACF,KAAA;AAEA,KAAA,SAAS9K,0BAA0BA,CAAC7C,KAAK,EAAEO,WAAW,EAAE;OACtD;SACE,IAAIuC,qBAAqB,GAAG,YAAY;WACtC,IAAI,CAACC,0BAA0B,EAAE;aAC/BA,0BAA0B,GAAG,IAAI;aAEjChL,KAAK,CAAC,2DAA2D,GAAG,gEAAgE,GAAG,sEAAsE,GAAG,gDAAgD,EAAEwI,WAAW,CAAC;AAChR,WAAA;UACD;SAEDuC,qBAAqB,CAACF,cAAc,GAAG,IAAI;AAC3C9S,SAAAA,MAAM,CAACkT,cAAc,CAAChD,KAAK,EAAE,KAAK,EAAE;WAClC/V,GAAG,EAAE6Y,qBAAqB;AAC1BG,WAAAA,YAAY,EAAE;AAChB,UAAC,CAAC;AACJ,OAAA;AACF,KAAA;AAEA,KAAA,SAAS2K,0BAA0BA,CAAC5N,KAAK,EAAEO,WAAW,EAAE;OACtD;SACE,IAAIsN,qBAAqB,GAAG,YAAY;WACtC,IAAI,CAACL,0BAA0B,EAAE;aAC/BA,0BAA0B,GAAG,IAAI;aAEjCzV,KAAK,CAAC,2DAA2D,GAAG,gEAAgE,GAAG,sEAAsE,GAAG,gDAAgD,EAAEwI,WAAW,CAAC;AAChR,WAAA;UACD;SAEDsN,qBAAqB,CAACjL,cAAc,GAAG,IAAI;AAC3C9S,SAAAA,MAAM,CAACkT,cAAc,CAAChD,KAAK,EAAE,KAAK,EAAE;WAClC/V,GAAG,EAAE4jB,qBAAqB;AAC1B5K,WAAAA,YAAY,EAAE;AAChB,UAAC,CAAC;AACJ,OAAA;AACF,KAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,KAAA,IAAII,YAAY,GAAG,UAAUnS,IAAI,EAAEmE,GAAG,EAAEyK,GAAG,EAAE6N,IAAI,EAAEpD,MAAM,EAAEjH,KAAK,EAAEtD,KAAK,EAAE;OACvE,IAAIyM,OAAO,GAAG;AACZ;SACA1M,QAAQ,EAAER,kBAAkB;AAC5B;SACArO,IAAI,EAAEA,IAAI;SACVmE,GAAG,EAAEA,GAAG;SACRyK,GAAG,EAAEA,GAAG;SACRE,KAAK,EAAEA,KAAK;AACZ;AACA0D,SAAAA,MAAM,EAAEJ;QACT;OAED;AACE;AACA;AACA;AACA;AACAmJ,SAAAA,OAAO,CAAC7I,MAAM,GAAG,EAAE,CAAC;AACpB;AACA;AACA;;SAEA9T,MAAM,CAACkT,cAAc,CAACyJ,OAAO,CAAC7I,MAAM,EAAE,WAAW,EAAE;WACjDX,YAAY,EAAE,KAAK;WACnBU,UAAU,EAAE,KAAK;WACjBE,QAAQ,EAAE,IAAI;AACd1O,WAAAA,KAAK,EAAE;UACR,CAAC,CAAC;;AAEHrF,SAAAA,MAAM,CAACkT,cAAc,CAACyJ,OAAO,EAAE,OAAO,EAAE;WACtCxJ,YAAY,EAAE,KAAK;WACnBU,UAAU,EAAE,KAAK;WACjBE,QAAQ,EAAE,KAAK;AACf1O,WAAAA,KAAK,EAAEwY;UACR,CAAC,CAAC;AACH;;AAEA7d,SAAAA,MAAM,CAACkT,cAAc,CAACyJ,OAAO,EAAE,SAAS,EAAE;WACxCxJ,YAAY,EAAE,KAAK;WACnBU,UAAU,EAAE,KAAK;WACjBE,QAAQ,EAAE,KAAK;AACf1O,WAAAA,KAAK,EAAEoV;AACT,UAAC,CAAC;SAEF,IAAIza,MAAM,CAACgU,MAAM,EAAE;AACjBhU,WAAAA,MAAM,CAACgU,MAAM,CAAC2I,OAAO,CAACzM,KAAK,CAAC;AAC5BlQ,WAAAA,MAAM,CAACgU,MAAM,CAAC2I,OAAO,CAAC;AACxB,SAAA;AACF,OAAA;AAEA,OAAA,OAAOA,OAAO;MACf;AACD;AACA;AACA;AACA;AACA;AACA;;KAEA,SAASqB,MAAMA,CAAC5c,IAAI,EAAEtH,MAAM,EAAEgW,QAAQ,EAAE2K,MAAM,EAAEoD,IAAI,EAAE;OACpD;SACE,IAAI9N,QAAQ,CAAC;;SAEb,IAAIG,KAAK,GAAG,EAAE;SACd,IAAI3K,GAAG,GAAG,IAAI;AACd,SAAA,IAAIyK,GAAG,GAAG,IAAI,CAAC;AACf;AACA;AACA;AACA;AACA;;SAEA,IAAIF,QAAQ,KAAK8I,SAAS,EAAE;WAC1B;aACE9G,sBAAsB,CAAChC,QAAQ,CAAC;AAClC,WAAA;WAEAvK,GAAG,GAAG,EAAE,GAAGuK,QAAQ;AACrB,SAAA;AAEA,SAAA,IAAI4C,WAAW,CAAC5Y,MAAM,CAAC,EAAE;WACvB;AACEgY,aAAAA,sBAAsB,CAAChY,MAAM,CAACyL,GAAG,CAAC;AACpC,WAAA;AAEAA,WAAAA,GAAG,GAAG,EAAE,GAAGzL,MAAM,CAACyL,GAAG;AACvB,SAAA;AAEA,SAAA,IAAIoY,WAAW,CAAC7jB,MAAM,CAAC,EAAE;WACvBkW,GAAG,GAAGlW,MAAM,CAACkW,GAAG;AAChB4N,WAAAA,oCAAoC,CAAC9jB,MAAM,EAAE+jB,IAAI,CAAC;SACpD,CAAC;;SAGD,KAAK9N,QAAQ,IAAIjW,MAAM,EAAE;AACvB,WAAA,IAAI6Y,cAAc,CAACR,IAAI,CAACrY,MAAM,EAAEiW,QAAQ,CAAC,IAAI,CAAC0N,cAAc,CAAC9K,cAAc,CAAC5C,QAAQ,CAAC,EAAE;aACrFG,KAAK,CAACH,QAAQ,CAAC,GAAGjW,MAAM,CAACiW,QAAQ,CAAC;AACpC,WAAA;SACF,CAAC;;AAGD,SAAA,IAAI3O,IAAI,IAAIA,IAAI,CAACsV,YAAY,EAAE;AAC7B,WAAA,IAAIA,YAAY,GAAGtV,IAAI,CAACsV,YAAY;WAEpC,KAAK3G,QAAQ,IAAI2G,YAAY,EAAE;AAC7B,aAAA,IAAIxG,KAAK,CAACH,QAAQ,CAAC,KAAK6I,SAAS,EAAE;eACjC1I,KAAK,CAACH,QAAQ,CAAC,GAAG2G,YAAY,CAAC3G,QAAQ,CAAC;AAC1C,aAAA;AACF,WAAA;AACF,SAAA;SAEA,IAAIxK,GAAG,IAAIyK,GAAG,EAAE;AACd,WAAA,IAAIS,WAAW,GAAG,OAAOrP,IAAI,KAAK,UAAU,GAAGA,IAAI,CAACqP,WAAW,IAAIrP,IAAI,CAACsP,IAAI,IAAI,SAAS,GAAGtP,IAAI;WAEhG,IAAImE,GAAG,EAAE;AACPwN,aAAAA,0BAA0B,CAAC7C,KAAK,EAAEO,WAAW,CAAC;AAChD,WAAA;WAEA,IAAIT,GAAG,EAAE;AACP8N,aAAAA,0BAA0B,CAAC5N,KAAK,EAAEO,WAAW,CAAC;AAChD,WAAA;AACF,SAAA;AAEA,SAAA,OAAO8C,YAAY,CAACnS,IAAI,EAAEmE,GAAG,EAAEyK,GAAG,EAAE6N,IAAI,EAAEpD,MAAM,EAAE1E,iBAAiB,CAAC7J,OAAO,EAAEgE,KAAK,CAAC;AACrF,OAAA;AACF,KAAA;AAEA,KAAA,IAAI+N,mBAAmB,GAAG1L,oBAAoB,CAACwD,iBAAiB;AAChE,KAAA,IAAImI,wBAAwB,GAAG3L,oBAAoB,CAACmF,sBAAsB;KAE1E,SAASyG,+BAA+BA,CAACxB,OAAO,EAAE;OAChD;SACE,IAAIA,OAAO,EAAE;AACX,WAAA,IAAInJ,KAAK,GAAGmJ,OAAO,CAAC/I,MAAM;WAC1B,IAAI+D,KAAK,GAAG6E,oCAAoC,CAACG,OAAO,CAACvb,IAAI,EAAEub,OAAO,CAACC,OAAO,EAAEpJ,KAAK,GAAGA,KAAK,CAACpS,IAAI,GAAG,IAAI,CAAC;AAC1G8c,WAAAA,wBAAwB,CAACrB,kBAAkB,CAAClF,KAAK,CAAC;AACpD,SAAA,CAAC,MAAM;AACLuG,WAAAA,wBAAwB,CAACrB,kBAAkB,CAAC,IAAI,CAAC;AACnD,SAAA;AACF,OAAA;AACF,KAAA;AAEA,KAAA,IAAIuB,6BAA6B;KAEjC;OACEA,6BAA6B,GAAG,KAAK;AACvC,KAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;KAGA,SAAS3J,cAAcA,CAACE,MAAM,EAAE;OAC9B;AACE,SAAA,OAAO,OAAOA,MAAM,KAAK,QAAQ,IAAIA,MAAM,KAAK,IAAI,IAAIA,MAAM,CAAC1E,QAAQ,KAAKR,kBAAkB;AAChG,OAAA;AACF,KAAA;KAEA,SAAS4O,2BAA2BA,GAAG;OACrC;SACE,IAAIJ,mBAAmB,CAAC/R,OAAO,EAAE;WAC/B,IAAIwE,IAAI,GAAGH,wBAAwB,CAAC0N,mBAAmB,CAAC/R,OAAO,CAAC9K,IAAI,CAAC;WAErE,IAAIsP,IAAI,EAAE;AACR,aAAA,OAAO,kCAAkC,GAAGA,IAAI,GAAG,IAAI;AACzD,WAAA;AACF,SAAA;AAEA,SAAA,OAAO,EAAE;AACX,OAAA;AACF,KAAA;KAEA,SAAS4N,0BAA0BA,CAAC7D,MAAM,EAAE;OAC1C;AAOE,SAAA,OAAO,EAAE;AACX,OAAA;AACF,KAAA;AACA;AACA;AACA;AACA;AACA;;KAGA,IAAI8D,qBAAqB,GAAG,EAAE;KAE9B,SAASC,4BAA4BA,CAACC,UAAU,EAAE;OAChD;AACE,SAAA,IAAI9Q,IAAI,GAAG0Q,2BAA2B,EAAE;SAExC,IAAI,CAAC1Q,IAAI,EAAE;AACT,WAAA,IAAI+Q,UAAU,GAAG,OAAOD,UAAU,KAAK,QAAQ,GAAGA,UAAU,GAAGA,UAAU,CAAChO,WAAW,IAAIgO,UAAU,CAAC/N,IAAI;WAExG,IAAIgO,UAAU,EAAE;AACd/Q,aAAAA,IAAI,GAAG,6CAA6C,GAAG+Q,UAAU,GAAG,IAAI;AAC1E,WAAA;AACF,SAAA;AAEA,SAAA,OAAO/Q,IAAI;AACb,OAAA;AACF,KAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,KAAA,SAASgR,mBAAmBA,CAAChC,OAAO,EAAE8B,UAAU,EAAE;OAChD;AACE,SAAA,IAAI,CAAC9B,OAAO,CAAC7I,MAAM,IAAI6I,OAAO,CAAC7I,MAAM,CAACY,SAAS,IAAIiI,OAAO,CAACpX,GAAG,IAAI,IAAI,EAAE;WACtE;AACF,SAAA;AAEAoX,SAAAA,OAAO,CAAC7I,MAAM,CAACY,SAAS,GAAG,IAAI;AAC/B,SAAA,IAAIkK,yBAAyB,GAAGJ,4BAA4B,CAACC,UAAU,CAAC;AAExE,SAAA,IAAIF,qBAAqB,CAACK,yBAAyB,CAAC,EAAE;WACpD;AACF,SAAA;AAEAL,SAAAA,qBAAqB,CAACK,yBAAyB,CAAC,GAAG,IAAI,CAAC;AACxD;AACA;;SAEA,IAAIC,UAAU,GAAG,EAAE;AAEnB,SAAA,IAAIlC,OAAO,IAAIA,OAAO,CAAC/I,MAAM,IAAI+I,OAAO,CAAC/I,MAAM,KAAKqK,mBAAmB,CAAC/R,OAAO,EAAE;AAC/E;AACA2S,WAAAA,UAAU,GAAG,8BAA8B,GAAGtO,wBAAwB,CAACoM,OAAO,CAAC/I,MAAM,CAACxS,IAAI,CAAC,GAAG,GAAG;AACnG,SAAA;SAEA+c,+BAA+B,CAACxB,OAAO,CAAC;SAExC1U,KAAK,CAAC,uDAAuD,GAAG,sEAAsE,EAAE2W,yBAAyB,EAAEC,UAAU,CAAC;SAE9KV,+BAA+B,CAAC,IAAI,CAAC;AACvC,OAAA;AACF,KAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,KAAA,SAAS9J,iBAAiBA,CAACnW,IAAI,EAAEugB,UAAU,EAAE;OAC3C;AACE,SAAA,IAAI,OAAOvgB,IAAI,KAAK,QAAQ,EAAE;WAC5B;AACF,SAAA;AAEA,SAAA,IAAI8W,OAAO,CAAC9W,IAAI,CAAC,EAAE;AACjB,WAAA,KAAK,IAAIW,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGX,IAAI,CAACuB,MAAM,EAAEZ,CAAC,EAAE,EAAE;AACpC,aAAA,IAAIigB,KAAK,GAAG5gB,IAAI,CAACW,CAAC,CAAC;AAEnB,aAAA,IAAI4V,cAAc,CAACqK,KAAK,CAAC,EAAE;AACzBH,eAAAA,mBAAmB,CAACG,KAAK,EAAEL,UAAU,CAAC;AACxC,aAAA;AACF,WAAA;AACF,SAAA,CAAC,MAAM,IAAIhK,cAAc,CAACvW,IAAI,CAAC,EAAE;AAC/B;WACA,IAAIA,IAAI,CAAC4V,MAAM,EAAE;AACf5V,aAAAA,IAAI,CAAC4V,MAAM,CAACY,SAAS,GAAG,IAAI;AAC9B,WAAA;UACD,MAAM,IAAIxW,IAAI,EAAE;AACf,WAAA,IAAI6gB,UAAU,GAAG/H,aAAa,CAAC9Y,IAAI,CAAC;AAEpC,WAAA,IAAI,OAAO6gB,UAAU,KAAK,UAAU,EAAE;AACpC;AACA;AACA,aAAA,IAAIA,UAAU,KAAK7gB,IAAI,CAAC8gB,OAAO,EAAE;eAC/B,IAAIlI,QAAQ,GAAGiI,UAAU,CAAC5M,IAAI,CAACjU,IAAI,CAAC;AACpC,eAAA,IAAI+gB,IAAI;eAER,OAAO,CAAC,CAACA,IAAI,GAAGnI,QAAQ,CAACoI,IAAI,EAAE,EAAEC,IAAI,EAAE;AACrC,iBAAA,IAAI1K,cAAc,CAACwK,IAAI,CAAC5Z,KAAK,CAAC,EAAE;AAC9BsZ,mBAAAA,mBAAmB,CAACM,IAAI,CAAC5Z,KAAK,EAAEoZ,UAAU,CAAC;AAC7C,iBAAA;AACF,eAAA;AACF,aAAA;AACF,WAAA;AACF,SAAA;AACF,OAAA;AACF,KAAA;AACA;AACA;AACA;AACA;AACA;AACA;;KAGA,SAASW,iBAAiBA,CAACzC,OAAO,EAAE;OAClC;AACE,SAAA,IAAIvb,IAAI,GAAGub,OAAO,CAACvb,IAAI;AAEvB,SAAA,IAAIA,IAAI,KAAK,IAAI,IAAIA,IAAI,KAAKwX,SAAS,IAAI,OAAOxX,IAAI,KAAK,QAAQ,EAAE;WACnE;AACF,SAAA;AAEA,SAAA,IAAIie,SAAS;AAEb,SAAA,IAAI,OAAOje,IAAI,KAAK,UAAU,EAAE;WAC9Bie,SAAS,GAAGje,IAAI,CAACie,SAAS;UAC3B,MAAM,IAAI,OAAOje,IAAI,KAAK,QAAQ,KAAKA,IAAI,CAAC6O,QAAQ,KAAKoB,sBAAsB;AAAI;AACpF;AACAjQ,SAAAA,IAAI,CAAC6O,QAAQ,KAAKuB,eAAe,CAAC,EAAE;WAClC6N,SAAS,GAAGje,IAAI,CAACie,SAAS;AAC5B,SAAA,CAAC,MAAM;WACL;AACF,SAAA;SAEA,IAAIA,SAAS,EAAE;AACb;AACA,WAAA,IAAI3O,IAAI,GAAGH,wBAAwB,CAACnP,IAAI,CAAC;AACzC0b,WAAAA,cAAc,CAACuC,SAAS,EAAE1C,OAAO,CAACzM,KAAK,EAAE,MAAM,EAAEQ,IAAI,EAAEiM,OAAO,CAAC;UAChE,MAAM,IAAIvb,IAAI,CAACke,SAAS,KAAK1G,SAAS,IAAI,CAACwF,6BAA6B,EAAE;WACzEA,6BAA6B,GAAG,IAAI,CAAC;;AAErC,WAAA,IAAImB,KAAK,GAAGhP,wBAAwB,CAACnP,IAAI,CAAC;AAE1C6G,WAAAA,KAAK,CAAC,qGAAqG,EAAEsX,KAAK,IAAI,SAAS,CAAC;AAClI,SAAA;AAEA,SAAA,IAAI,OAAOne,IAAI,CAACoe,eAAe,KAAK,UAAU,IAAI,CAACpe,IAAI,CAACoe,eAAe,CAACC,oBAAoB,EAAE;AAC5FxX,WAAAA,KAAK,CAAC,4DAA4D,GAAG,kEAAkE,CAAC;AAC1I,SAAA;AACF,OAAA;AACF,KAAA;AACA;AACA;AACA;AACA;;KAGA,SAASyX,qBAAqBA,CAACC,QAAQ,EAAE;OACvC;SACE,IAAIrL,IAAI,GAAGtU,MAAM,CAACsU,IAAI,CAACqL,QAAQ,CAACzP,KAAK,CAAC;AAEtC,SAAA,KAAK,IAAIrR,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGyV,IAAI,CAAC7U,MAAM,EAAEZ,CAAC,EAAE,EAAE;AACpC,WAAA,IAAI0G,GAAG,GAAG+O,IAAI,CAACzV,CAAC,CAAC;WAEjB,IAAI0G,GAAG,KAAK,UAAU,IAAIA,GAAG,KAAK,KAAK,EAAE;aACvC4Y,+BAA+B,CAACwB,QAAQ,CAAC;AAEzC1X,aAAAA,KAAK,CAAC,kDAAkD,GAAG,0DAA0D,EAAE1C,GAAG,CAAC;aAE3H4Y,+BAA+B,CAAC,IAAI,CAAC;aACrC;AACF,WAAA;AACF,SAAA;AAEA,SAAA,IAAIwB,QAAQ,CAAC3P,GAAG,KAAK,IAAI,EAAE;WACzBmO,+BAA+B,CAACwB,QAAQ,CAAC;WAEzC1X,KAAK,CAAC,uDAAuD,CAAC;WAE9DkW,+BAA+B,CAAC,IAAI,CAAC;AACvC,SAAA;AACF,OAAA;AACF,KAAA;KAEA,IAAI3J,qBAAqB,GAAG,EAAE;AAC9B,KAAA,SAASoL,iBAAiBA,CAACxe,IAAI,EAAE8O,KAAK,EAAE3K,GAAG,EAAE2O,gBAAgB,EAAEuG,MAAM,EAAEoD,IAAI,EAAE;OAC3E;AACE,SAAA,IAAIgC,SAAS,GAAGnH,kBAAkB,CAACtX,IAAI,CAAC,CAAC;AACzC;;SAEA,IAAI,CAACye,SAAS,EAAE;WACd,IAAIlS,IAAI,GAAG,EAAE;WAEb,IAAIvM,IAAI,KAAKwX,SAAS,IAAI,OAAOxX,IAAI,KAAK,QAAQ,IAAIA,IAAI,KAAK,IAAI,IAAIpB,MAAM,CAACsU,IAAI,CAAClT,IAAI,CAAC,CAAC3B,MAAM,KAAK,CAAC,EAAE;aACrGkO,IAAI,IAAI,4DAA4D,GAAG,wEAAwE;AACjJ,WAAA;AAEA,WAAA,IAAImS,UAAU,GAAGxB,0BAA0B,CAAO,CAAC;WAEnD,IAAIwB,UAAU,EAAE;aACdnS,IAAI,IAAImS,UAAU;AACpB,WAAA,CAAC,MAAM;aACLnS,IAAI,IAAI0Q,2BAA2B,EAAE;AACvC,WAAA;AAEA,WAAA,IAAI0B,UAAU;WAEd,IAAI3e,IAAI,KAAK,IAAI,EAAE;aACjB2e,UAAU,GAAG,MAAM;AACrB,WAAA,CAAC,MAAM,IAAI/K,OAAO,CAAC5T,IAAI,CAAC,EAAE;aACxB2e,UAAU,GAAG,OAAO;YACrB,MAAM,IAAI3e,IAAI,KAAKwX,SAAS,IAAIxX,IAAI,CAAC6O,QAAQ,KAAKR,kBAAkB,EAAE;AACrEsQ,aAAAA,UAAU,GAAG,GAAG,IAAIxP,wBAAwB,CAACnP,IAAI,CAACA,IAAI,CAAC,IAAI,SAAS,CAAC,GAAG,KAAK;aAC7EuM,IAAI,GAAG,oEAAoE;AAC7E,WAAA,CAAC,MAAM;aACLoS,UAAU,GAAG,OAAO3e,IAAI;AAC1B,WAAA;WAEA6G,KAAK,CAAC,uDAAuD,GAAG,0DAA0D,GAAG,4BAA4B,EAAE8X,UAAU,EAAEpS,IAAI,CAAC;AAC9K,SAAA;AAEA,SAAA,IAAIgP,OAAO,GAAGqB,MAAM,CAAC5c,IAAI,EAAE8O,KAAK,EAAE3K,GAAG,EAAEkV,MAAM,EAAEoD,IAAI,CAAC,CAAC;AACrD;;SAEA,IAAIlB,OAAO,IAAI,IAAI,EAAE;AACnB,WAAA,OAAOA,OAAO;SAChB,CAAC;AACD;AACA;AACA;AACA;;SAGA,IAAIkD,SAAS,EAAE;AACb,WAAA,IAAI1L,QAAQ,GAAGjE,KAAK,CAACiE,QAAQ;WAE7B,IAAIA,QAAQ,KAAKyE,SAAS,EAAE;aAC1B,IAAI1E,gBAAgB,EAAE;AACpB,eAAA,IAAIc,OAAO,CAACb,QAAQ,CAAC,EAAE;AACrB,iBAAA,KAAK,IAAItV,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGsV,QAAQ,CAAC1U,MAAM,EAAEZ,CAAC,EAAE,EAAE;mBACxCwV,iBAAiB,CAACF,QAAQ,CAACtV,CAAC,CAAC,EAAEuC,IAAI,CAAC;AACtC,iBAAA;iBAEA,IAAIpB,MAAM,CAACgU,MAAM,EAAE;AACjBhU,mBAAAA,MAAM,CAACgU,MAAM,CAACG,QAAQ,CAAC;AACzB,iBAAA;AACF,eAAA,CAAC,MAAM;AACLlM,iBAAAA,KAAK,CAAC,wDAAwD,GAAG,gEAAgE,GAAG,kCAAkC,CAAC;AACzK,eAAA;AACF,aAAA,CAAC,MAAM;AACLoM,eAAAA,iBAAiB,CAACF,QAAQ,EAAE/S,IAAI,CAAC;AACnC,aAAA;AACF,WAAA;AACF,SAAA;SAEA;WACE,IAAIuR,cAAc,CAACR,IAAI,CAACjC,KAAK,EAAE,KAAK,CAAC,EAAE;AACrC,aAAA,IAAImD,aAAa,GAAG9C,wBAAwB,CAACnP,IAAI,CAAC;AAClD,aAAA,IAAIkT,IAAI,GAAGtU,MAAM,CAACsU,IAAI,CAACpE,KAAK,CAAC,CAAC5R,MAAM,CAAC,UAAUiW,CAAC,EAAE;eAChD,OAAOA,CAAC,KAAK,KAAK;AACpB,aAAA,CAAC,CAAC;aACF,IAAIyL,aAAa,GAAG1L,IAAI,CAAC7U,MAAM,GAAG,CAAC,GAAG,iBAAiB,GAAG6U,IAAI,CAAC3O,IAAI,CAAC,SAAS,CAAC,GAAG,QAAQ,GAAG,gBAAgB;aAE5G,IAAI,CAAC6O,qBAAqB,CAACnB,aAAa,GAAG2M,aAAa,CAAC,EAAE;eACzD,IAAIC,YAAY,GAAG3L,IAAI,CAAC7U,MAAM,GAAG,CAAC,GAAG,GAAG,GAAG6U,IAAI,CAAC3O,IAAI,CAAC,SAAS,CAAC,GAAG,QAAQ,GAAG,IAAI;eAEjFsC,KAAK,CAAC,oEAAoE,GAAG,qBAAqB,GAAG,uBAAuB,GAAG,mEAAmE,GAAG,qBAAqB,GAAG,mCAAmC,EAAE+X,aAAa,EAAE3M,aAAa,EAAE4M,YAAY,EAAE5M,aAAa,CAAC;AAE5TmB,eAAAA,qBAAqB,CAACnB,aAAa,GAAG2M,aAAa,CAAC,GAAG,IAAI;AAC7D,aAAA;AACF,WAAA;AACF,SAAA;SAEA,IAAI5e,IAAI,KAAKwO,mBAAmB,EAAE;WAChC8P,qBAAqB,CAAC/C,OAAO,CAAC;AAChC,SAAA,CAAC,MAAM;WACLyC,iBAAiB,CAACzC,OAAO,CAAC;AAC5B,SAAA;AAEA,SAAA,OAAOA,OAAO;AAChB,OAAA;KACF,CAAC;AACD;AACA;AACA;;KAEA,SAASuD,uBAAuBA,CAAC9e,IAAI,EAAE8O,KAAK,EAAE3K,GAAG,EAAE;OACjD;SACE,OAAOqa,iBAAiB,CAACxe,IAAI,EAAE8O,KAAK,EAAE3K,GAAG,EAAE,IAAI,CAAC;AAClD,OAAA;AACF,KAAA;KACA,SAAS4a,wBAAwBA,CAAC/e,IAAI,EAAE8O,KAAK,EAAE3K,GAAG,EAAE;OAClD;SACE,OAAOqa,iBAAiB,CAACxe,IAAI,EAAE8O,KAAK,EAAE3K,GAAG,EAAE,KAAK,CAAC;AACnD,OAAA;AACF,KAAA;AAEA,KAAA,IAAI6a,GAAG,GAAID,wBAAwB,CAAE;AACrC;;KAEA,IAAIE,IAAI,GAAIH,uBAAuB;KAEnC/P,2BAAAA,CAAAA,QAAgB,GAAGP,mBAAmB;KACtCO,2BAAAA,CAAAA,GAAW,GAAGiQ,GAAG;KACjBjQ,2BAAAA,CAAAA,IAAY,GAAGkQ,IAAI;AACjB,GAAA,CAAC,GAAG;AACN,CAAA;;;;AClzCA,IAAIjQ,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;AACzCmF,EAAAA,UAAAA,CAAAA,OAAc,GAAGZ,qCAAAA,EAAoD;AACvE,CAAC,MAAM;AACLY,EAAAA,UAAAA,CAAAA,OAAc,GAAGZ,kCAAAA,EAAiD;AACpE;;;;ACNA;AACA;AACA;AACA;AACA;AACA;;AAIA;AACA;AACA;AACO,MAAMyL,cAAc,SAAS1mB,uBAAa,CAAC;AAChDC,EAAAA,WAAWA,CAACC,MAAM,GAAG,EAAE,EAAE;AACvB,IAAA,KAAK,CAAC,QAAQ,EAAEA,MAAM,CAAC;AACzB,EAAA;EAEAymB,uBAAuBA,CAACC,YAAY,EAAE;AACpC,IAAA,IAAI,CAAC,IAAI,CAACC,cAAc,EAAE;AACxB,MAAA,IAAIC,IAAI,GAAGF,YAAY,CAACG,SAAS,IAAI,UAAU;AAC/C,MAAA,MAAMC,UAAU,GAAG,eAAe,CAACC,IAAI,CAACH,IAAI,CAAC;AAC7C,MAAA,MAAMI,QAAQ,GAAG,OAAOC,MAAM,KAAK,WAAW;AAC9C,MAAA,IAAI,CAACH,UAAU,IAAIE,QAAQ,EAAE;AAC3B,QAAA,MAAME,OAAO,GAAGR,YAAY,CAACziB,UAAU,IAAI,0BAA0B;AACrE,QAAA,MAAMkjB,SAAS,GAAGjJ,MAAM,CAACgJ,OAAO,CAAC,CAACljB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AACrD,QAAA,MAAMojB,SAAS,GAAGlJ,MAAM,CAAC0I,IAAI,CAAC,CAAC5iB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AAClD4iB,QAAAA,IAAI,GAAGO,SAAS,IAAIC,SAAS,GAAG,CAAA,EAAGD,SAAS,CAAA,CAAA,EAAIC,SAAS,EAAE,GAAID,SAAS,IAAI,CAAA,CAAA,EAAIC,SAAS,CAAA,CAAG;AAC9F,MAAA;AACA,MAAA,MAAMA,SAAS,GAAGlJ,MAAM,CAAC0I,IAAI,CAAC,CAAC5iB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AAClD,MAAA,MAAMqjB,WAAW,GAAGnJ,MAAM,CAAC,IAAI,CAACoJ,UAAU,CAAC,CAACtjB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AAC/D,MAAA,IAAI,CAACujB,OAAO,GAAGH,SAAS,IAAIC,WAAW,GAAG,CAAA,EAAGD,SAAS,CAAA,CAAA,EAAIC,WAAW,CAAA,CAAE,GAAID,SAAS,IAAI,CAAA,CAAA,EAAIC,WAAW,CAAA,CAAG;AAC5G,IAAA,CAAC,MAAM;AACL,MAAA,IAAI,CAACE,OAAO,GAAGrJ,MAAM,CAAC,IAAI,CAACyI,cAAc,CAAC,CAAC3iB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AAChE,IAAA;AAEA,IAAA,IAAI,CAAC,IAAI,CAACwjB,cAAc,EAAE;AACxB,MAAA,IAAI,CAACC,OAAO,GAAGf,YAAY,CAACe,OAAO,IAAI,KAAK;AAC9C,IAAA,CAAC,MAAM;AACL,MAAA,IAAI,CAACA,OAAO,GAAG,IAAI,CAACD,cAAc;AACpC,IAAA;AACF,EAAA;AAEAE,EAAAA,sBAAsBA,CAACC,iBAAiB,EAAEznB,OAAO,GAAG,EAAE,EAAE;IACtD,IAAI,OAAOynB,iBAAiB,KAAK,QAAQ,IAAIA,iBAAiB,KAAK,IAAI,EAAE;MACvE,MAAM;QAAEjT,QAAQ;QAAE,GAAG5T;AAAO,OAAC,GAAG6mB,iBAAiB;MACjD,OAAO;QAAEjT,QAAQ;AAAE5T,QAAAA;AAAQ,OAAA;AAC7B,IAAA;IACA,OAAO;AAAE4T,MAAAA,QAAQ,EAAEiT,iBAAiB;AAAE7mB,MAAAA,MAAM,EAAEZ;AAAS,KAAA;AACzD,EAAA;EAEA0nB,aAAaA,CAAC/iB,IAAI,EAAE;IAClB,MAAM+hB,IAAI,GAAG,IAAI,CAACW,OAAO,CAACvjB,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC;AACxD,IAAA,OAAO,CAAA,EAAG4iB,IAAI,CAAA,EAAG/hB,IAAI,CAAA,CAAE;AACzB,EAAA;;AAEA;;AAEA;AACF;AACA;AACA;AACA;AACE,EAAA,MAAMgjB,UAAUA,CAACnT,QAAQ,EAAExU,OAAO,GAAG,EAAE,EAAE;IACvC,MAAM4nB,UAAU,GAAG,IAAI,CAACJ,sBAAsB,CAAChT,QAAQ,EAAExU,OAAO,CAAC;AACjE,IAAA,MAAM6nB,cAAc,GAAGD,UAAU,CAACpT,QAAQ;AAC1C,IAAA,MAAM5T,MAAM,GAAGgnB,UAAU,CAAChnB,MAAM;IAEhC,IAAIA,MAAM,CAACknB,MAAM,EAAE;AACjB;AACA,MAAA,MAAM/iB,GAAG,GAAG,IAAI,CAAC2iB,aAAa,CAAC,gBAAgB,CAAC;AAChD,MAAA,MAAMK,UAAU,GAAG,CAAA,EAAGhjB,GAAG,CAAA,UAAA,EAAa8iB,cAAc,CAAA,0BAAA,CAA4B;MAChF,MAAM1a,QAAQ,GAAG,MAAM,IAAI,CAAClN,IAAI,CAAC8nB,UAAU,CAAC;AAC5C,MAAA,MAAMlY,IAAI,GAAG1C,QAAQ,CAAC0C,IAAI,IAAI1C,QAAQ;MACtC,OAAO;AACL6a,QAAAA,OAAO,EAAEnY,IAAI,CAACoY,SAAS,IAAKpY,IAAI,CAACA,IAAI,IAAIA,IAAI,CAACA,IAAI,CAACoY;AACpD,OAAA;AACH,IAAA;;AAEA;AACA,IAAA,MAAMljB,GAAG,GAAG,IAAI,CAAC2iB,aAAa,CAAC,iBAAiB,CAAC;AACjD,IAAA,MAAMK,UAAU,GAAG,CAAA,EAAGhjB,GAAG,CAAA,UAAA,EAAa8iB,cAAc,CAAA,CAAE;IACtD,MAAM1a,QAAQ,GAAG,MAAM,IAAI,CAAChN,GAAG,CAAC4nB,UAAU,CAAC;AAC3C,IAAA,MAAMlY,IAAI,GAAG1C,QAAQ,CAAC0C,IAAI,IAAI1C,QAAQ;IACtC,OAAO;AACL6a,MAAAA,OAAO,EAAEnY,IAAI,CAACoY,SAAS,IAAKpY,IAAI,CAACA,IAAI,IAAIA,IAAI,CAACA,IAAI,CAACoY;AACpD,KAAA;AACH,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACE,MAAMC,cAAcA,CAAC1T,QAAQ,EAAE2T,IAAI,EAAEC,KAAK,EAAEpoB,OAAO,GAAG,EAAE,EAAE;AACxD,IAAA,IAAIqoB,gBAAgB;MAAEC,YAAY;MAAEC,aAAa;AAAET,MAAAA,MAAM,GAAG,KAAK;IACjE,IAAI,OAAOtT,QAAQ,KAAK,QAAQ,IAAIA,QAAQ,KAAK,IAAI,EAAE;MACrD6T,gBAAgB,GAAG7T,QAAQ,CAACA,QAAQ;MACpC8T,YAAY,GAAG9T,QAAQ,CAAC2T,IAAI;MAC5BI,aAAa,GAAG/T,QAAQ,CAAC4T,KAAK;AAC9BN,MAAAA,MAAM,GAAG,CAAC,CAACtT,QAAQ,CAACsT,MAAM;AAC5B,IAAA,CAAC,MAAM;AACLO,MAAAA,gBAAgB,GAAG7T,QAAQ;AAC3B8T,MAAAA,YAAY,GAAGH,IAAI;AACnBI,MAAAA,aAAa,GAAGH,KAAK;AACrBN,MAAAA,MAAM,GAAG,CAAC,CAAC9nB,OAAO,CAAC8nB,MAAM;AAC3B,IAAA;AAEA,IAAA,IAAI/iB,GAAG;AACP,IAAA,IAAI+iB,MAAM,EAAE;AACV/iB,MAAAA,GAAG,GAAG,IAAI,CAAC2iB,aAAa,CAAC,sBAAsB,CAAC;AAClD,IAAA,CAAC,MAAM;AACL3iB,MAAAA,GAAG,GAAG,IAAI,CAAC2iB,aAAa,CAAC,uBAAuB,CAAC;AACnD,IAAA;IACA,MAAMK,UAAU,GAAG,CAAA,EAAGhjB,GAAG,CAAA,UAAA,EAAasjB,gBAAgB,CAAA,MAAA,EAASC,YAAY,CAAA,OAAA,EAAUC,aAAa,CAAA,CAAE;IACpG,MAAMpb,QAAQ,GAAG,MAAM,IAAI,CAAClN,IAAI,CAAC8nB,UAAU,CAAC;AAC5C,IAAA,MAAMlY,IAAI,GAAG1C,QAAQ,CAAC0C,IAAI,IAAI1C,QAAQ;AACtC,IAAA,MAAMqb,UAAU,GAAG3Y,IAAI,CAACA,IAAI,IAAIA,IAAI;IAEpC,OAAO;AACL4Y,MAAAA,IAAI,EAAE;AACJ/R,QAAAA,IAAI,EAAE8R,UAAU,CAACE,QAAQ,IAAIF,UAAU,CAACG,YAAY,IAAKH,UAAU,CAACC,IAAI,IAAID,UAAU,CAACC,IAAI,CAACE,YAAa,IAAI;AAC9G,OAAA;MACD,GAAGH;AACJ,KAAA;AACH,EAAA;;AAEA;AACF;AACA;EACE,MAAMI,YAAYA,GAAG;IACnB,OAAO;AACL/Y,MAAAA,IAAI,EAAE,CACJ;AAAE/I,QAAAA,EAAE,EAAE,QAAQ;AAAE4P,QAAAA,IAAI,EAAE;AAAS,OAAC,EAChC;AAAE5P,QAAAA,EAAE,EAAE,OAAO;AAAE4P,QAAAA,IAAI,EAAE;AAAQ,OAAC,EAC9B;AAAE5P,QAAAA,EAAE,EAAE,WAAW;AAAE4P,QAAAA,IAAI,EAAE;AAAa,OAAA;AAEzC,KAAA;AACH,EAAA;;AAEA;;AAEA;AACF;AACA;AACA;AACA;AACE,EAAA,MAAMtW,WAAWA,CAACoU,QAAQ,EAAE2T,IAAI,EAAE;AAChC,IAAA,MAAMpjB,GAAG,GAAG,IAAI,CAAC2iB,aAAa,CAAC,sBAAsB,CAAC;IACtD,MAAMK,UAAU,GAAG,CAAA,EAAGhjB,GAAG,aAAayP,QAAQ,CAAA,MAAA,EAAS2T,IAAI,CAAA,CAAE;AAC7D,IAAA,OAAO,IAAI,CAACloB,IAAI,CAAC8nB,UAAU,CAAC;AAC9B,EAAA;;AAEA;AACF;AACA;AACA;EACE,MAAMznB,aAAaA,CAACkU,QAAQ,EAAE;IAC5B,MAAMzP,GAAG,GAAG,IAAI,CAAC2iB,aAAa,CAAC,CAAA,QAAA,EAAWlT,QAAQ,CAAA,CAAE,CAAC;AACrD,IAAA,OAAO,IAAI,CAACqU,MAAM,CAAC9jB,GAAG,CAAC;AACzB,EAAA;;AAEA;AACF;AACA;AACA;EACE,MAAM+jB,aAAaA,CAACtU,QAAQ,EAAE;AAC5B,IAAA,OAAO,IAAI,CAAClU,aAAa,CAACkU,QAAQ,CAAC;AACrC,EAAA;;AAEA;AACF;AACA;EACE,MAAMuU,gBAAgBA,GAAG;AACvB,IAAA,MAAMhkB,GAAG,GAAG,IAAI,CAAC2iB,aAAa,CAAC,WAAW,CAAC;IAC3C,MAAMva,QAAQ,GAAG,MAAM,IAAI,CAAChN,GAAG,CAAC4E,GAAG,CAAC;AACpC,IAAA,MAAMikB,QAAQ,GAAG7b,QAAQ,CAAC0C,IAAI,EAAEmZ,QAAQ,IAAI7b,QAAQ,CAAC6b,QAAQ,IAAI,EAAE;AAEnE,IAAA,MAAMC,SAAS,GAAGD,QAAQ,CAACtd,GAAG,CAAC6Q,CAAC,KAAK;MACnC/H,QAAQ,EAAE+H,CAAC,CAAC2M,QAAQ;MACpBC,KAAK,EAAE5M,CAAC,CAACmM,QAAQ,IAAInM,CAAC,CAACoM,YAAY,IAAI,KAAK;MAC5C,GAAGpM;AACL,KAAC,CAAC,CAAC;IACH,OAAO;AAAE1M,MAAAA,IAAI,EAAEoZ;AAAW,KAAA;AAC5B,EAAA;;AAEA;AACF;AACA;EACE,MAAMG,iBAAiBA,GAAG;IACxB,OAAO,IAAI,CAACL,gBAAgB,EAAE;AAChC,EAAA;;AAEA;AACF;AACA;AACA;EACE,MAAMM,eAAeA,CAAC7U,QAAQ,EAAE;IAC9B,MAAMzP,GAAG,GAAG,IAAI,CAAC2iB,aAAa,CAAC,CAAA,UAAA,EAAalT,QAAQ,CAAA,CAAE,CAAC;AACvD,IAAA,OAAO,IAAI,CAACrU,GAAG,CAAC4E,GAAG,CAAC;AACtB,EAAA;;AAEA;;AAEA;AACF;AACA;AACA;EACE,MAAMukB,gBAAgBA,CAACvZ,OAAO,EAAE;AAC9B,IAAA,OAAO,IAAI,CAAC9P,IAAI,CAAC,iBAAiB,EAAE;AAAE8P,MAAAA;AAAQ,KAAC,CAAC;AAClD,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACE,EAAA,MAAMwZ,qBAAqBA,CAACxZ,OAAO,EAAEY,SAAS,EAAElI,OAAO,EAAE;AACvD,IAAA,OAAO,IAAI,CAACxI,IAAI,CAAC,gBAAgB,EAAE;MAAE8P,OAAO;MAAEY,SAAS;AAAElI,MAAAA;AAAQ,KAAC,CAAC;AACrE,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACE,EAAA,MAAM+gB,eAAeA,CAACzZ,OAAO,EAAEY,SAAS,EAAElI,OAAO,EAAE;AACjD,IAAA,OAAO,IAAI,CAACxI,IAAI,CAAC,eAAe,EAAE;MAAE8P,OAAO;MAAEY,SAAS;AAAElI,MAAAA;AAAQ,KAAC,CAAC;AACpE,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACE,EAAA,MAAMghB,UAAUA,CAAC1Z,OAAO,EAAEY,SAAS,EAAElI,OAAO,EAAE;AAC5C,IAAA,OAAO,IAAI,CAACxI,IAAI,CAAC,cAAc,EAAE;MAAE8P,OAAO;MAAEY,SAAS;AAAElI,MAAAA;AAAQ,KAAC,CAAC;AACnE,EAAA;;AAEA;AACF;AACA;AACA;EACE,MAAMihB,YAAYA,CAAC3Z,OAAO,EAAE;AAC1B,IAAA,OAAO,IAAI,CAAC8Y,MAAM,CAAC,cAAc,EAAE;AAAE9Y,MAAAA;AAAQ,KAAC,CAAC;AACjD,EAAA;;AAEA;AACF;AACA;EACE,MAAM4Z,eAAeA,GAAG;AACtB,IAAA,OAAO,IAAI,CAACxpB,GAAG,CAAC,cAAc,CAAC;AACjC,EAAA;;AAEA;;AAEA;AACF;AACA;AACA;AACE,EAAA,MAAMypB,SAASA,CAAC5pB,OAAO,GAAG,EAAE,EAAE;AAC5B,IAAA,OAAO,IAAI,CAACG,GAAG,CAAC,UAAU,EAAEH,OAAO,CAAC;AACtC,EAAA;;AAEA;AACF;AACA;AACA;EACE,MAAM6pB,cAAcA,CAACC,KAAK,EAAE;AAC1B,IAAA,OAAO,IAAI,CAAC7pB,IAAI,CAAC,aAAa,EAAE;AAAE6pB,MAAAA;AAAM,KAAC,CAAC;AAC5C,EAAA;;AAEA;AACF;AACA;EACE,MAAMC,SAASA,GAAG;AAChB,IAAA,OAAO,IAAI,CAAC9pB,IAAI,CAAC,aAAa,CAAC;AACjC,EAAA;;AAEA;AACF;AACA;EACE,MAAM+pB,SAASA,GAAG;AAChB,IAAA,OAAO,IAAI,CAAC7pB,GAAG,CAAC,aAAa,CAAC;AAChC,EAAA;;AAEA;AACF;AACA;EACE,MAAM8pB,MAAMA,GAAG;AACb,IAAA,OAAO,IAAI,CAAChqB,IAAI,CAAC,SAAS,CAAC;AAC7B,EAAA;;AAEA;;AAEA;AACF;AACA;AACA;EACE,MAAMiqB,YAAYA,CAACA,YAAY,EAAE;AAC/B,IAAA,OAAO,IAAI,CAACjqB,IAAI,CAAC,gBAAgB,EAAE;AAAEkqB,MAAAA,aAAa,EAAED;AAAa,KAAC,CAAC;AACrE,EAAA;;AAEA;AACF;AACA;AACA;EACE,MAAME,WAAWA,CAACN,KAAK,EAAE;AACvB,IAAA,OAAO,IAAI,CAAC7pB,IAAI,CAAC,eAAe,EAAE;AAAE6pB,MAAAA;AAAM,KAAC,CAAC;AAC9C,EAAA;;AAEA;AACF;AACA;AACA;EACE,MAAMO,YAAYA,CAACP,KAAK,EAAE;AACxB,IAAA,OAAO,IAAI,CAAC7pB,IAAI,CAAC,aAAa,EAAE;AAAE6pB,MAAAA;AAAM,KAAC,CAAC;AAC5C,EAAA;;AAEA;;AAEA;AACF;AACA;EACE,MAAMQ,iBAAiBA,GAAG;AACxB,IAAA,OAAO,IAAI,CAACnqB,GAAG,CAAC,OAAO,CAAC;AAC1B,EAAA;;AAEA;AACF;AACA;AACA;EACE,MAAMoqB,sBAAsBA,CAACC,KAAK,EAAE;AAClC,IAAA,OAAO,IAAI,CAAC3B,MAAM,CAAC,CAAA,MAAA,EAAS2B,KAAK,EAAE,CAAC;AACtC,EAAA;AACF;;AAEA;MACaC,QAAQ,GAAG,IAAInE,cAAc,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtV1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA;AACA;AACA;AACA;AACO,MAAMoE,aAAa,SAAS9qB,uBAAa,CAAC;AAC/CC,EAAAA,WAAWA,CAACC,MAAM,GAAG,EAAE,EAAE;AACvB,IAAA,KAAK,CAAC,EAAE,EAAEA,MAAM,CAAC,CAAC;AAClB,IAAA,IAAI,CAAC6qB,cAAc,GAAG7qB,MAAM,CAAC6qB,cAAc;AAC3C,IAAA,IAAI,CAACC,WAAW,GAAG9qB,MAAM,CAAC8qB,WAAW;;AAErC;AACA,IAAA,IAAI,CAACC,SAAS,GAAG/qB,MAAM,CAACgrB,eAAe,IAAI,uBAAuB;AAClE,IAAA,IAAI,CAACC,gBAAgB,GAAGjrB,MAAM,CAACkrB,sBAAsB,IAAI,wBAAwB;AACjF,IAAA,IAAI,CAACC,kBAAkB,GAAGnrB,MAAM,CAACorB,iBAAiB,IAAI,kBAAkB;AAC1E,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACEC,EAAAA,SAASA,CAACrrB,MAAM,GAAG,EAAE,EAAE;IACrB,IAAIA,MAAM,CAACsrB,UAAU,EAAE;AACrB,MAAA,IAAI,CAACC,UAAU,CAACvrB,MAAM,CAACsrB,UAAU,CAAC;AACpC,IAAA;AACA,IAAA,IAAI,CAACE,kBAAkB,CAACxrB,MAAM,CAAC;AACjC,EAAA;;AAEA;AACF;AACA;AACA;EACEwrB,kBAAkBA,CAACxrB,MAAM,EAAE;IACzB,IAAIA,MAAM,CAAC6qB,cAAc,EAAE,IAAI,CAACA,cAAc,GAAG7qB,MAAM,CAAC6qB,cAAc;IACtE,IAAI7qB,MAAM,CAAC8qB,WAAW,EAAE,IAAI,CAACA,WAAW,GAAG9qB,MAAM,CAAC8qB,WAAW;AAC/D,EAAA;;AAEA;;AAEA;AACF;AACA;AACE,EAAA,MAAMW,QAAQA,CAACC,aAAa,EAAEC,SAAS,GAAG,WAAW,EAAE;AACrD,IAAA,OAAO,IAAI,CAACxrB,IAAI,CAAC,aAAa,EAAE;AAC9ByrB,MAAAA,cAAc,EAAEF,aAAa;AAC7BG,MAAAA,UAAU,EAAEF;AACd,KAAC,CAAC;AACJ,EAAA;;AAEA;AACF;AACA;EACE,MAAMG,WAAWA,CAACJ,aAAa,EAAE7a,SAAS,EAAElI,OAAO,EAAEgjB,SAAS,GAAG,WAAW,EAAE;IAC5E,MAAM7b,MAAM,GAAG,MAAM,IAAI,CAAC3P,IAAI,CAAC,cAAc,EAAE;AAC7CyrB,MAAAA,cAAc,EAAEF,aAAa;MAC7B7a,SAAS;MACTlI,OAAO;AACPkjB,MAAAA,UAAU,EAAEF;AACd,KAAC,CAAC;IAEF,IAAI7b,MAAM,CAACic,YAAY,EAAE;MACvB,IAAI,CAACC,SAAS,CAAClc,MAAM,CAACic,YAAY,EAAEjc,MAAM,CAACua,aAAa,CAAC;AAC3D,IAAA;AAEA,IAAA,OAAOva,MAAM;AACf,EAAA;;AAEA;AACF;AACA;AACE,EAAA,MAAMmc,QAAQA,CAACC,GAAG,EAAEC,QAAQ,EAAExgB,GAAG,GAAG,IAAI,EAAEygB,QAAQ,GAAG,IAAI,EAAE;IACzD,MAAMtc,MAAM,GAAG,MAAM,IAAI,CAAC3P,IAAI,CAAC,iBAAiB,EAAE;AAChD+rB,MAAAA,GAAG,EAAEA,GAAG,CAACjd,IAAI,EAAE;MACfkd,QAAQ;MACRxgB,GAAG;AACH0gB,MAAAA,SAAS,EAAED;AACb,KAAC,CAAC;IAEF,IAAItc,MAAM,CAACic,YAAY,EAAE;MACvB,IAAI,CAACC,SAAS,CAAClc,MAAM,CAACic,YAAY,EAAEjc,MAAM,CAACua,aAAa,CAAC;AAC3D,IAAA;AAEA,IAAA,OAAOva,MAAM;AACf,EAAA;;AAEA;AACF;AACA;EACE,MAAMwc,QAAQA,CAACvc,IAAI,EAAE;IACnB,MAAMD,MAAM,GAAG,MAAM,IAAI,CAAC3P,IAAI,CAAC,gBAAgB,EAAE;AAC/C0oB,MAAAA,YAAY,EAAE9Y,IAAI,CAAC4G,WAAW,IAAI5G,IAAI,CAACwc,QAAQ;AAC/ClD,MAAAA,KAAK,EAAEtZ,IAAI,CAACsZ,KAAK,IAAIvK,SAAS;MAC9BqN,QAAQ,EAAEpc,IAAI,CAACoc;AACjB,KAAC,CAAC;IAEF,IAAIrc,MAAM,CAACic,YAAY,EAAE;MACvB,IAAI,CAACC,SAAS,CAAClc,MAAM,CAACic,YAAY,EAAEjc,MAAM,CAACua,aAAa,CAAC;AAC3D,IAAA;AAEA,IAAA,OAAOva,MAAM;AACf,EAAA;;AAEA;AACF;AACA;EACE,MAAM0c,gBAAgBA,CAACpC,YAAY,EAAE;IACnC,MAAMta,MAAM,GAAG,MAAM,IAAI,CAAC3P,IAAI,CAAC,eAAe,EAAE;AAAEkqB,MAAAA,aAAa,EAAED;AAAa,KAAC,CAAC;IAEhF,IAAIta,MAAM,CAACic,YAAY,EAAE;MACvB,IAAI,CAACC,SAAS,CAAClc,MAAM,CAACic,YAAY,EAAEjc,MAAM,CAACua,aAAa,CAAC;AAC3D,IAAA;AAEA,IAAA,OAAOva,MAAM;AACf,EAAA;;AAEA;AACF;AACA;EACE,MAAMqa,MAAMA,GAAG;IACb,IAAI;AACF,MAAA,MAAM,IAAI,CAAChqB,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;IACrC,CAAC,CAAC,OAAO+D,CAAC,EAAE;AACV;AAAA,IAAA;IAEF,IAAI,CAACuoB,WAAW,EAAE;AACpB,EAAA;;AAEA;AACF;AACA;EACE,MAAMC,KAAKA,GAAG;AACZ,IAAA,OAAO,IAAI,CAACrsB,GAAG,CAAC,aAAa,CAAC;AAChC,EAAA;AAEA,EAAA,MAAMssB,MAAMA,CAACT,GAAG,EAAEC,QAAQ,EAAExgB,GAAG,EAAE;AAC/B,IAAA,OAAO,IAAI,CAACxL,IAAI,CAAC,eAAe,EAAE;MAAE+rB,GAAG;MAAEC,QAAQ;AAAExgB,MAAAA;AAAI,KAAC,CAAC;AAC3D,EAAA;;AAEA;;AAEA;AACF;AACA;AACEihB,EAAAA,eAAeA,GAAG;AAChB,IAAA,IAAI,OAAO3F,MAAM,KAAK,WAAW,EAAE,OAAO,IAAI;AAC9C,IAAA,OAAO4F,YAAY,CAACC,OAAO,CAAC,IAAI,CAAC7B,gBAAgB,CAAC;AACpD,EAAA;;AAEA;AACF;AACA;AACEe,EAAAA,SAASA,CAACe,WAAW,EAAE3C,YAAY,EAAE;AACnC,IAAA,IAAI,OAAOnD,MAAM,KAAK,WAAW,EAAE;;AAEnC;IACA4F,YAAY,CAACG,OAAO,CAAC,IAAI,CAACjC,SAAS,EAAEgC,WAAW,CAAC;AAEjD,IAAA,IAAI3C,YAAY,EAAE;MAChByC,YAAY,CAACG,OAAO,CAAC,IAAI,CAAC/B,gBAAgB,EAAEb,YAAY,CAAC;AAC3D,IAAA;IAEA,IAAI,CAACS,cAAc,GAAG;MAAEkC,WAAW;AAAE3C,MAAAA;AAAa,KAAC,CAAC;AACtD,EAAA;;AAEA;AACF;AACA;AACEqC,EAAAA,WAAWA,GAAG;AACZ,IAAA,IAAI,OAAOxF,MAAM,KAAK,WAAW,EAAE;AACnC4F,IAAAA,YAAY,CAACI,UAAU,CAAC,IAAI,CAAClC,SAAS,CAAC;AACvC8B,IAAAA,YAAY,CAACI,UAAU,CAAC,IAAI,CAAChC,gBAAgB,CAAC;AAC9C4B,IAAAA,YAAY,CAACI,UAAU,CAAC,IAAI,CAAC9B,kBAAkB,CAAC;AAClD,EAAA;;AAEA;AACF;AACA;AACE+B,EAAAA,eAAeA,GAAG;AAChB,IAAA,OAAO,CAAC,CAAC,IAAI,CAACC,QAAQ,EAAE;AAC1B,EAAA;;AAEA;;AAEA;AACF;AACA;AACEC,EAAAA,iBAAiBA,GAAG;AAClB,IAAA,IAAI,OAAOnG,MAAM,KAAK,WAAW,EAAE,OAAO,IAAI;AAC9C,IAAA,OAAO4F,YAAY,CAACC,OAAO,CAAC,IAAI,CAAC3B,kBAAkB,CAAC;AACtD,EAAA;;AAEA;AACF;AACA;EACEkC,iBAAiBA,CAACC,SAAS,EAAE;AAC3B,IAAA,IAAI,OAAOrG,MAAM,KAAK,WAAW,EAAE;IACnC4F,YAAY,CAACG,OAAO,CAAC,IAAI,CAAC7B,kBAAkB,EAAEmC,SAAS,CAAC;AAC1D,EAAA;AACF;;AAEA;MACaC,OAAO,GAAG,IAAI3C,aAAa,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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","x_google_ignoreList":[4,5,6,7,8,9]}