diff --git a/packages/chrome-qwen-bridge/extension/background/service-worker.js b/packages/chrome-qwen-bridge/extension/background/service-worker.js index 95fc80cb..c16f7a6f 100644 --- a/packages/chrome-qwen-bridge/extension/background/service-worker.js +++ b/packages/chrome-qwen-bridge/extension/background/service-worker.js @@ -12,6 +12,117 @@ let isConnected = false; let qwenCliStatus = 'disconnected'; let pendingRequests = new Map(); let requestId = 0; +// Cache the latest available commands so late listeners (e.g. sidepanel opened later) +// can fetch them via GET_STATUS. +let lastAvailableCommands = []; +// Cache latest MCP tools list (from notifications/tools/list_changed) +let lastMcpTools = []; +// Static list of internal Chrome browser MCP tools exposed by this extension +const INTERNAL_MCP_TOOLS = [ + { + name: 'browser_read_page', + description: + 'Read content of the current active tab (url, title, text, links, images).', + }, + { + name: 'browser_capture_screenshot', + description: + 'Capture a screenshot (PNG) of the current visible tab (base64).', + }, + { + name: 'browser_get_network_logs', + description: + 'Get recent Network.* events from Chrome debugger for the active tab.', + }, + { + name: 'browser_get_console_logs', + description: 'Get recent console logs from the active tab.', + }, +]; + +// Heuristic: detect if user intent asks to read current page +function shouldTriggerReadPage(text) { + if (!text) return false; + const t = String(text).toLowerCase(); + const keywords = [ + 'read this page', + 'read the page', + 'read current page', + 'read page', + '读取当前页面', + '读取页面', + '读取网页', + '读这个页面', + ]; + return keywords.some((k) => t.includes(k)); +} + +// Heuristic: detect if user intent asks for console logs +function shouldTriggerConsoleLogs(text) { + if (!text) return false; + const t = String(text).toLowerCase(); + const keywords = [ + 'console log', + 'console logs', + 'get console', + 'show console', + 'browser console', + 'console 日志', + 'console日志', + '控制台日志', + '获取控制台', + '查看控制台', + '读取日志', + '日志信息', + '获取日志', + '查看日志', + 'log信息', + '错误日志', + 'error log', + ]; + return keywords.some((k) => t.includes(k)); +} + +// Heuristic: detect if user intent asks for screenshot +function shouldTriggerScreenshot(text) { + if (!text) return false; + const t = String(text).toLowerCase(); + const keywords = [ + 'screenshot', + 'capture screen', + 'take screenshot', + 'screen capture', + '截图', + '截屏', + '屏幕截图', + '页面截图', + ]; + return keywords.some((k) => t.includes(k)); +} + +// Heuristic: detect if user intent asks for network logs +function shouldTriggerNetworkLogs(text) { + if (!text) return false; + const t = String(text).toLowerCase(); + const keywords = [ + 'network log', + 'network logs', + 'network request', + 'api call', + 'http request', + '网络日志', + '网络请求', + 'api请求', + '请求日志', + '接口请求', + '接口日志', + 'xhr', + 'fetch', + '请求记录', + '网络记录', + ]; + return keywords.some((k) => t.includes(k)); +} // Connection management function connectToNativeHost() { @@ -34,11 +145,25 @@ function connectToNativeHost() { nativePort.onMessage.addListener((message) => { // 简化日志输出,直接显示 data 内容 if (message.type === 'event' && message.data) { - console.log('[Native Event]', message.data.type, message.data.update || message.data); + console.log( + '[Native Event]', + message.data.type, + message.data.update || message.data, + ); } else if (message.type === 'response') { - console.log('[Native Response]', 'id:', message.id, message.success ? '✓' : '✗', message.data || message.error); + console.log( + '[Native Response]', + 'id:', + message.id, + message.success ? '✓' : '✗', + message.data || message.error, + ); } else { - console.log('[Native Message]', message.type, message.data || message); + console.log( + '[Native Message]', + message.type, + message.data || message, + ); } handleNativeMessage(message); }); @@ -61,10 +186,12 @@ function connectToNativeHost() { pendingRequests.clear(); // Notify popup of disconnection - chrome.runtime.sendMessage({ - type: 'STATUS_UPDATE', - status: 'disconnected' - }).catch(() => {}); // Ignore errors if popup is closed + chrome.runtime + .sendMessage({ + type: 'STATUS_UPDATE', + status: 'disconnected', + }) + .catch(() => {}); // Ignore errors if popup is closed }); // Send initial handshake @@ -112,13 +239,15 @@ function handleNativeMessage(message) { qwenCliStatus = hostQwenStatus === 'running' ? 'running' : 'connected'; // Notify popup of connection - chrome.runtime.sendMessage({ - type: 'STATUS_UPDATE', - status: qwenCliStatus, - capabilities: message.capabilities, - qwenInstalled: message.qwenInstalled, - qwenVersion: message.qwenVersion - }).catch(() => {}); + chrome.runtime + .sendMessage({ + type: 'STATUS_UPDATE', + status: qwenCliStatus, + capabilities: message.capabilities, + qwenInstalled: message.qwenInstalled, + qwenVersion: message.qwenVersion, + }) + .catch(() => {}); } else if (message.type === 'browser_request') { // Handle browser requests from Qwen CLI via Native Host handleBrowserRequest(message); @@ -131,8 +260,8 @@ function handleNativeMessage(message) { requestId: message.requestId, sessionId: message.sessionId, toolCall: message.toolCall, - options: message.options - } + options: message.options, + }, }); } else if (message.type === 'response' && message.id !== undefined) { // Handle response to a specific request @@ -145,6 +274,21 @@ function handleNativeMessage(message) { } pendingRequests.delete(message.id); } + + // Heuristic: when a prompt completes, native returns a response with a stop reason. + // We use that as the end-of-stream signal so the UI can finalize the assistant message. + try { + if ( + message?.data && + (message.data.stopReason || + message.data.stop_reason || + message.data.status === 'done') + ) { + broadcastToUI({ type: 'streamEnd' }); + } + } catch (_) { + // ignore + } } else if (message.type === 'event') { // Handle events from Qwen CLI handleQwenEvent(message); @@ -163,16 +307,24 @@ async function sendToNativeHost(message) { nativePort.postMessage({ ...message, - id + id, }); // Set timeout for request + // Default 30s, but ACP session creation and MCP discovery can take longer + let timeoutMs = 30000; + if (message && message.type === 'start_qwen') timeoutMs = 180000; // 3 minutes for startup + MCP discovery + if ( + message && + (message.type === 'qwen_prompt' || message.type === 'qwen_request') + ) + timeoutMs = 180000; setTimeout(() => { if (pendingRequests.has(id)) { pendingRequests.delete(id); reject(new Error('Request timeout')); } - }, 30000); // 30 second timeout + }, timeoutMs); }); } @@ -182,6 +334,14 @@ async function handleBrowserRequest(message) { console.log('Browser request:', requestType, params); try { + // Notify UI tool start + try { + broadcastToUI({ + type: 'toolProgress', + data: { name: requestType, stage: 'start' }, + }); + } catch (_) {} + let data; switch (requestType) { @@ -209,15 +369,36 @@ async function handleBrowserRequest(message) { nativePort.postMessage({ type: 'browser_response', browserRequestId, - data + data, }); + + // Notify UI tool end (success) + try { + broadcastToUI({ + type: 'toolProgress', + data: { name: requestType, stage: 'end', ok: true }, + }); + } catch (_) {} } catch (error) { console.error('Browser request error:', error); nativePort.postMessage({ type: 'browser_response', browserRequestId, - error: error.message + error: error.message, }); + + // Notify UI tool end (failure) + try { + broadcastToUI({ + type: 'toolProgress', + data: { + name: requestType, + stage: 'end', + ok: false, + error: String(error?.message || error), + }, + }); + } catch (_) {} } } @@ -231,10 +412,13 @@ async function getBrowserPageContent() { } // Check if we can access this page - if (tab.url && (tab.url.startsWith('chrome://') || + if ( + tab.url && + (tab.url.startsWith('chrome://') || tab.url.startsWith('chrome-extension://') || tab.url.startsWith('edge://') || - tab.url.startsWith('about:'))) { + tab.url.startsWith('about:')) + ) { throw new Error('Cannot access browser internal page'); } @@ -242,7 +426,7 @@ async function getBrowserPageContent() { try { await chrome.scripting.executeScript({ target: { tabId: tab.id }, - files: ['content/content-script.js'] + files: ['content/content-script.js'], }); } catch (injectError) { console.log('Script injection skipped:', injectError.message); @@ -252,14 +436,18 @@ async function getBrowserPageContent() { return new Promise((resolve, reject) => { chrome.tabs.sendMessage(tab.id, { type: 'EXTRACT_DATA' }, (response) => { if (chrome.runtime.lastError) { - reject(new Error(chrome.runtime.lastError.message + '. Try refreshing the page.')); + reject( + new Error( + chrome.runtime.lastError.message + '. Try refreshing the page.', + ), + ); } else if (response && response.success) { resolve({ url: tab.url, title: tab.title, content: response.data?.content || { text: '', markdown: '' }, links: response.data?.links || [], - images: response.data?.images || [] + images: response.data?.images || [], }); } else { reject(new Error(response?.error || 'Failed to extract page data')); @@ -298,10 +486,13 @@ async function getBrowserConsoleLogs() { } // Check if we can access this page - if (tab.url && (tab.url.startsWith('chrome://') || + if ( + tab.url && + (tab.url.startsWith('chrome://') || tab.url.startsWith('chrome-extension://') || tab.url.startsWith('edge://') || - tab.url.startsWith('about:'))) { + tab.url.startsWith('about:')) + ) { throw new Error('Cannot access browser internal page'); } @@ -309,7 +500,7 @@ async function getBrowserConsoleLogs() { try { await chrome.scripting.executeScript({ target: { tabId: tab.id }, - files: ['content/content-script.js'] + files: ['content/content-script.js'], }); } catch (injectError) { console.log('Script injection skipped:', injectError.message); @@ -317,15 +508,19 @@ async function getBrowserConsoleLogs() { // Request console logs from content script return new Promise((resolve, reject) => { - chrome.tabs.sendMessage(tab.id, { type: 'GET_CONSOLE_LOGS' }, (response) => { - if (chrome.runtime.lastError) { - reject(new Error(chrome.runtime.lastError.message)); - } else if (response && response.success) { - resolve({ logs: response.data || [] }); - } else { - reject(new Error(response?.error || 'Failed to get console logs')); - } - }); + chrome.tabs.sendMessage( + tab.id, + { type: 'GET_CONSOLE_LOGS' }, + (response) => { + if (chrome.runtime.lastError) { + reject(new Error(chrome.runtime.lastError.message)); + } else if (response && response.success) { + resolve({ logs: response.data || [] }); + } else { + reject(new Error(response?.error || 'Failed to get console logs')); + } + }, + ); }); } @@ -336,7 +531,11 @@ function handleQwenEvent(event) { // 简化日志:显示事件类型和关键信息 if (eventData?.type === 'session_update') { const update = eventData.update; - console.log('[Qwen]', update?.sessionUpdate, update?.content?.text?.slice(0, 50) || update); + console.log( + '[Qwen]', + update?.sessionUpdate, + update?.content?.text?.slice(0, 50) || update, + ); } else { console.log('[Qwen]', eventData?.type, eventData); } @@ -349,46 +548,74 @@ function handleQwenEvent(event) { // Stream chunk broadcastToUI({ type: 'streamChunk', - data: { chunk: update.content?.text || '' } + data: { chunk: update.content?.text || '' }, + }); + } else if (update?.sessionUpdate === 'available_commands_update') { + // Cache and forward available commands list to UI for visibility/debugging + lastAvailableCommands = Array.isArray(update.availableCommands) + ? update.availableCommands + : []; + broadcastToUI({ + type: 'availableCommands', + data: { availableCommands: lastAvailableCommands }, }); } else if (update?.sessionUpdate === 'user_message_chunk') { - // User message (usually echo) - broadcastToUI({ - type: 'message', - data: { - role: 'user', - content: update.content?.text || '', - timestamp: Date.now() - } - }); - } else if (update?.sessionUpdate === 'tool_call' || update?.sessionUpdate === 'tool_call_update') { + // Ignore echo of the user's own message to avoid duplicates in UI. + // The sidepanel already appends the user message on submit. + // If needed in the future, we can gate this by a feature flag. + return; + } else if ( + update?.sessionUpdate === 'tool_call' || + update?.sessionUpdate === 'tool_call_update' + ) { // Tool call broadcastToUI({ type: 'toolCall', - data: update + data: update, }); } else if (update?.sessionUpdate === 'plan') { // Plan update broadcastToUI({ type: 'plan', - data: { entries: update.entries } + data: { entries: update.entries }, }); } } else if (eventData?.type === 'qwen_stopped') { qwenCliStatus = 'stopped'; broadcastToUI({ type: 'STATUS_UPDATE', - status: 'stopped' + status: 'stopped', }); + } else if (eventData?.type === 'auth_update') { + const authUri = eventData.authUri; + // Forward auth update to UI and try to open auth URL + broadcastToUI({ type: 'authUpdate', data: { authUri } }); + if (authUri) { + try { + chrome.tabs.create({ url: authUri }); + } catch (_) {} + } + } else if (eventData?.type === 'tools_list_changed') { + // Forward MCP tools list to UI and cache it + lastMcpTools = Array.isArray(eventData.tools) ? eventData.tools : []; + broadcastToUI({ type: 'mcpTools', data: { tools: lastMcpTools } }); + } else if (eventData?.type === 'host_info') { + console.log('[Host] Info', eventData); + broadcastToUI({ type: 'hostInfo', data: eventData }); + } else if (eventData?.type === 'cli_stderr') { + console.log('[Qwen STDERR]', eventData.line); + broadcastToUI({ type: 'hostLog', data: { line: eventData.line } }); } // Also forward raw event for compatibility chrome.tabs.query({}, (tabs) => { - tabs.forEach(tab => { - chrome.tabs.sendMessage(tab.id, { - type: 'QWEN_EVENT', - event: eventData - }).catch(() => {}); + tabs.forEach((tab) => { + chrome.tabs + .sendMessage(tab.id, { + type: 'QWEN_EVENT', + event: eventData, + }) + .catch(() => {}); }); }); } @@ -406,9 +633,20 @@ chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { // Connect to native host connectToNativeHost() .then(() => { - sendResponse({ success: true, status: qwenCliStatus }); + sendResponse({ + success: true, + status: qwenCliStatus, + internalTools: INTERNAL_MCP_TOOLS, + }); + // Broadcast internal tools so UI can render tools panel + try { + broadcastToUI({ + type: 'internalMcpTools', + data: { tools: INTERNAL_MCP_TOOLS }, + }); + } catch (_) {} }) - .catch(error => { + .catch((error) => { sendResponse({ success: false, error: error.message }); }); return true; // Will respond asynchronously @@ -418,7 +656,10 @@ chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { // Get current connection status sendResponse({ connected: isConnected, - status: qwenCliStatus + status: qwenCliStatus, + availableCommands: lastAvailableCommands, + mcpTools: lastMcpTools, + internalTools: INTERNAL_MCP_TOOLS, }); return false; } @@ -441,26 +682,250 @@ chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { // Start Qwen CLI if not running if (qwenCliStatus !== 'running') { - broadcastToUI({ type: 'streamStart' }); - await sendToNativeHost({ - type: 'start_qwen', - cwd: request.data?.cwd || '/' - }); - qwenCliStatus = 'running'; + try { + await sendToNativeHost({ + type: 'start_qwen', + cwd: request.data?.cwd || '/', + }); + qwenCliStatus = 'running'; + } catch (startError) { + // If CLI is already running (but session might still be initializing), + // treat it as running and continue + if ( + startError.message && + startError.message.includes('already running') + ) { + console.log('Qwen CLI already running, continuing...'); + qwenCliStatus = 'running'; + } else { + throw startError; + } + } } - // Send the prompt - await sendToNativeHost({ - type: 'qwen_prompt', - text: text - }); + // Fallback: if user intent asks to read page (and MCP might not be available), + // directly read the page via content script and send to Qwen for analysis. + try { + if (shouldTriggerReadPage(text)) { + broadcastToUI({ + type: 'toolProgress', + data: { name: 'read_page', stage: 'start' }, + }); + const data = await getBrowserPageContent(); + // start stream for qwen_request path + broadcastToUI({ type: 'streamStart' }); + await sendToNativeHost({ + type: 'qwen_request', + action: 'analyze_page', + data: data, + userPrompt: text, // Include user's full request for context + }); + // do not send original prompt to avoid duplication + broadcastToUI({ + type: 'toolProgress', + data: { name: 'read_page', stage: 'end', ok: true }, + }); + sendResponse({ success: true }); + return; + } + } catch (e) { + console.warn('Fallback read_page failed:', e); + broadcastToUI({ + type: 'toolProgress', + data: { + name: 'read_page', + stage: 'end', + ok: false, + error: String((e && e.message) || e), + }, + }); + // continue to send prompt normally + } + // Fallback: get console logs + try { + const shouldGetConsole = shouldTriggerConsoleLogs(text); + console.log( + '[Fallback] shouldTriggerConsoleLogs:', + shouldGetConsole, + 'text:', + text, + ); + if (shouldGetConsole) { + console.log('[Fallback] Triggering console logs...'); + broadcastToUI({ + type: 'toolProgress', + data: { name: 'console_logs', stage: 'start' }, + }); + const data = await getBrowserConsoleLogs(); + console.log('[Fallback] Console logs data:', data); + const logs = data.logs || []; + const formatted = logs + .slice(-50) + .map((log) => `[${log.type}] ${log.message}`) + .join('\n'); + broadcastToUI({ type: 'streamStart' }); + await sendToNativeHost({ + type: 'qwen_request', + action: 'process_text', + data: { + text: `Console logs (last ${Math.min(logs.length, 50)} entries):\n${formatted || '(no logs captured)'}`, + context: 'console logs from browser', + }, + userPrompt: text, // Include user's full request + }); + broadcastToUI({ + type: 'toolProgress', + data: { name: 'console_logs', stage: 'end', ok: true }, + }); + sendResponse({ success: true }); + return; + } + } catch (e) { + console.error('[Fallback] Console logs failed:', e); + broadcastToUI({ + type: 'toolProgress', + data: { + name: 'console_logs', + stage: 'end', + ok: false, + error: String((e && e.message) || e), + }, + }); + } + + // Fallback: capture screenshot + try { + if (shouldTriggerScreenshot(text)) { + broadcastToUI({ + type: 'toolProgress', + data: { name: 'screenshot', stage: 'start' }, + }); + const screenshot = await getBrowserScreenshot(); + const tabs = await chrome.tabs.query({ + active: true, + currentWindow: true, + }); + broadcastToUI({ type: 'streamStart' }); + await sendToNativeHost({ + type: 'qwen_request', + action: 'analyze_screenshot', + data: { + dataUrl: screenshot.dataUrl, + url: tabs[0]?.url || 'unknown', + }, + userPrompt: text, // Include user's full request + }); + broadcastToUI({ + type: 'toolProgress', + data: { name: 'screenshot', stage: 'end', ok: true }, + }); + sendResponse({ success: true }); + return; + } + } catch (e) { + console.warn('Fallback screenshot failed:', e); + broadcastToUI({ + type: 'toolProgress', + data: { + name: 'screenshot', + stage: 'end', + ok: false, + error: String((e && e.message) || e), + }, + }); + } + + // Fallback: get network logs + try { + const shouldGetNetwork = shouldTriggerNetworkLogs(text); + console.log( + '[Fallback] shouldTriggerNetworkLogs:', + shouldGetNetwork, + 'text:', + text, + ); + if (shouldGetNetwork) { + console.log('[Fallback] Triggering network logs...'); + broadcastToUI({ + type: 'toolProgress', + data: { name: 'network_logs', stage: 'start' }, + }); + const logs = await getNetworkLogs(null); + console.log('[Fallback] Network logs count:', logs?.length); + const summary = logs.slice(-50).map((log) => ({ + method: log.method, + url: log.params?.request?.url || log.params?.documentURL, + status: log.params?.response?.status, + timestamp: log.timestamp, + })); + broadcastToUI({ type: 'streamStart' }); + await sendToNativeHost({ + type: 'qwen_request', + action: 'process_text', + data: { + text: `Network logs (last ${summary.length} entries):\n${JSON.stringify(summary, null, 2)}`, + context: 'network request logs from browser', + }, + userPrompt: text, // Include user's full request + }); + broadcastToUI({ + type: 'toolProgress', + data: { name: 'network_logs', stage: 'end', ok: true }, + }); + sendResponse({ success: true }); + return; + } + } catch (e) { + console.error('[Fallback] Network logs failed:', e); + broadcastToUI({ + type: 'toolProgress', + data: { + name: 'network_logs', + stage: 'end', + ok: false, + error: String((e && e.message) || e), + }, + }); + } + + // Send the prompt with retry logic for session initialization + // Notify UI that a new stream is starting right before sending prompt + broadcastToUI({ type: 'streamStart' }); + + // Helper to send prompt with retries (session might still be initializing) + const sendPromptWithRetry = async (maxRetries = 3, delayMs = 2000) => { + for (let attempt = 1; attempt <= maxRetries; attempt++) { + try { + await sendToNativeHost({ + type: 'qwen_prompt', + text: text, + }); + return; // Success + } catch (err) { + const isSessionError = + err.message && + (err.message.includes('No active session') || + err.message.includes('session')); + if (isSessionError && attempt < maxRetries) { + console.log( + `Session not ready, retry ${attempt}/${maxRetries} in ${delayMs}ms...`, + ); + await new Promise((r) => setTimeout(r, delayMs)); + } else { + throw err; + } + } + } + }; + + await sendPromptWithRetry(); sendResponse({ success: true }); } catch (error) { console.error('sendMessage error:', error); broadcastToUI({ type: 'error', - data: { message: error.message } + data: { message: error.message }, }); sendResponse({ success: false, error: error.message }); } @@ -477,7 +942,7 @@ chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { broadcastToUI({ type: 'streamEnd' }); sendResponse({ success: true }); }) - .catch(error => { + .catch((error) => { sendResponse({ success: false, error: error.message }); }); return true; @@ -488,10 +953,10 @@ chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { sendToNativeHost({ type: 'permission_response', requestId: request.data?.requestId, - optionId: request.data?.optionId + optionId: request.data?.optionId, }) - .then(() => sendResponse({ success: true })) - .catch(error => sendResponse({ success: false, error: error.message })); + .then(() => sendResponse({ success: true })) + .catch((error) => sendResponse({ success: false, error: error.message })); return true; } @@ -502,13 +967,16 @@ chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { const tab = tabs[0]; // Check if we can inject content script (skip chrome:// and other protected pages) - if (tab.url && (tab.url.startsWith('chrome://') || + if ( + tab.url && + (tab.url.startsWith('chrome://') || tab.url.startsWith('chrome-extension://') || tab.url.startsWith('edge://') || - tab.url.startsWith('about:'))) { + tab.url.startsWith('about:')) + ) { sendResponse({ success: false, - error: 'Cannot access this page (browser internal page)' + error: 'Cannot access this page (browser internal page)', }); return; } @@ -517,29 +985,35 @@ chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { try { await chrome.scripting.executeScript({ target: { tabId: tab.id }, - files: ['content/content-script.js'] + files: ['content/content-script.js'], }); } catch (injectError) { // Script might already be injected or page doesn't allow injection console.log('Script injection skipped:', injectError.message); } - chrome.tabs.sendMessage(tab.id, { - type: 'EXTRACT_DATA' - }, (response) => { - if (chrome.runtime.lastError) { - sendResponse({ - success: false, - error: chrome.runtime.lastError.message + '. Try refreshing the page.' - }); - } else { - sendResponse(response); - } - }); + chrome.tabs.sendMessage( + tab.id, + { + type: 'EXTRACT_DATA', + }, + (response) => { + if (chrome.runtime.lastError) { + sendResponse({ + success: false, + error: + chrome.runtime.lastError.message + + '. Try refreshing the page.', + }); + } else { + sendResponse(response); + } + }, + ); } else { sendResponse({ success: false, - error: 'No active tab found' + error: 'No active tab found', }); } }); @@ -548,17 +1022,57 @@ chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { if (request.type === 'SEND_TO_QWEN') { // Send data to Qwen CLI via native host - sendToNativeHost({ - type: 'qwen_request', - action: request.action, - data: request.data - }) - .then(response => { - sendResponse({ success: true, data: response }); - }) - .catch(error => { - sendResponse({ success: false, error: error.message }); - }); + const send = async () => { + try { + // Ensure native host connection + if (!isConnected) { + await connectToNativeHost(); + } + + // Ensure CLI is running + if (qwenCliStatus !== 'running') { + await sendToNativeHost({ + type: 'start_qwen', + cwd: request.data?.cwd || '/', + }); + qwenCliStatus = 'running'; + } + + // Inform UI that a stream is starting + try { + broadcastToUI({ type: 'streamStart' }); + } catch (_) {} + + const response = await sendToNativeHost({ + type: 'qwen_request', + action: request.action, + data: request.data, + }); + sendResponse({ success: true, data: response }); + } catch (error) { + try { + broadcastToUI({ + type: 'toolProgress', + data: { + name: request.action || 'request', + stage: 'end', + ok: false, + error: String(error?.message || error), + }, + }); + broadcastToUI({ + type: 'error', + data: { message: String(error?.message || error) }, + }); + } catch (_) {} + const errMsg = + error && error && error.message + ? error && error.message + : String(error); + sendResponse({ success: false, error: errMsg }); + } + }; + send(); return true; // Will respond asynchronously } @@ -566,30 +1080,30 @@ chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { // Request native host to start Qwen CLI sendToNativeHost({ type: 'start_qwen', - config: request.config || {} + config: request.config || {}, }) - .then(response => { - qwenCliStatus = 'running'; - sendResponse({ success: true, data: response }); - }) - .catch(error => { - sendResponse({ success: false, error: error.message }); - }); + .then((response) => { + qwenCliStatus = 'running'; + sendResponse({ success: true, data: response }); + }) + .catch((error) => { + sendResponse({ success: false, error: error.message }); + }); return true; // Will respond asynchronously } if (request.type === 'STOP_QWEN_CLI') { // Request native host to stop Qwen CLI sendToNativeHost({ - type: 'stop_qwen' + type: 'stop_qwen', }) - .then(response => { - qwenCliStatus = 'stopped'; - sendResponse({ success: true, data: response }); - }) - .catch(error => { - sendResponse({ success: false, error: error.message }); - }); + .then((response) => { + qwenCliStatus = 'stopped'; + sendResponse({ success: true, data: response }); + }) + .catch((error) => { + sendResponse({ success: false, error: error.message }); + }); return true; // Will respond asynchronously } @@ -599,12 +1113,12 @@ chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { if (chrome.runtime.lastError) { sendResponse({ success: false, - error: chrome.runtime.lastError.message + error: chrome.runtime.lastError.message, }); } else { sendResponse({ success: true, - data: dataUrl + data: dataUrl, }); } }); @@ -614,10 +1128,22 @@ chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { if (request.type === 'GET_NETWORK_LOGS') { // Get network logs (requires debugger API) getNetworkLogs(sender.tab?.id) - .then(logs => { + .then((logs) => { sendResponse({ success: true, data: logs }); }) - .catch(error => { + .catch((error) => { + sendResponse({ success: false, error: error.message }); + }); + return true; // Will respond asynchronously + } + + if (request.type === 'GET_CONSOLE_LOGS') { + // Get console logs via content script + getBrowserConsoleLogs() + .then((res) => { + sendResponse({ success: true, data: res.logs || [] }); + }) + .catch((error) => { sendResponse({ success: false, error: error.message }); }); return true; // Will respond asynchronously @@ -650,7 +1176,7 @@ async function getNetworkLogs(tabId) { target.logs.push({ method, params, - timestamp: Date.now() + timestamp: Date.now(), }); } } @@ -678,17 +1204,69 @@ chrome.runtime.onInstalled.addListener((details) => { console.log('Extension installed for the first time'); // Users can access options from popup menu } + + // Ensure clicking the action icon opens the side panel (Chrome API) + try { + if ( + chrome.sidePanel && + typeof chrome.sidePanel.setPanelBehavior === 'function' + ) { + // Open side panel when the action icon is clicked + // This is the recommended way in recent Chrome versions + chrome.sidePanel.setPanelBehavior({ openPanelOnActionClick: true }); + } + } catch (e) { + console.warn('Failed to set side panel behavior:', e); + } }); // Open side panel when extension icon is clicked chrome.action.onClicked.addListener((tab) => { - chrome.sidePanel.open({ windowId: tab.windowId }); + try { + const openForWindow = (winId) => { + try { + chrome.sidePanel.open({ windowId: winId }); + } catch (e) { + console.error('Failed to open side panel:', e); + } + }; + if (tab && typeof tab.windowId === 'number') { + openForWindow(tab.windowId); + } else { + // Fallback: get current window and open + chrome.windows.getCurrent({}, (win) => { + if (win && typeof win.id === 'number') { + openForWindow(win.id); + } else { + console.error('No active window to open side panel'); + } + }); + } + } catch (e) { + console.error('onClicked handler error:', e); + } }); +// Also configure side panel behavior on startup (in addition to onInstalled) +try { + if ( + chrome.sidePanel && + typeof chrome.sidePanel.setPanelBehavior === 'function' + ) { + chrome.runtime.onStartup.addListener(() => { + try { + chrome.sidePanel.setPanelBehavior({ openPanelOnActionClick: true }); + } catch (e) { + console.warn('setPanelBehavior onStartup failed:', e); + } + }); + } +} catch (_) {} + // Export for testing if (typeof module !== 'undefined' && module.exports) { module.exports = { connectToNativeHost, - sendToNativeHost + sendToNativeHost, }; -} \ No newline at end of file +} diff --git a/packages/chrome-qwen-bridge/extension/sidepanel/sidepanel-app.js b/packages/chrome-qwen-bridge/extension/sidepanel/sidepanel-app.js index 7629ae65..029fe4ea 100644 --- a/packages/chrome-qwen-bridge/extension/sidepanel/sidepanel-app.js +++ b/packages/chrome-qwen-bridge/extension/sidepanel/sidepanel-app.js @@ -26563,6 +26563,12 @@ const [isWaitingForResponse, setIsWaitingForResponse] = (0, import_react4.useState)(false); const [loadingMessage, setLoadingMessage] = (0, import_react4.useState)(null); const [streamingContent, setStreamingContent] = (0, import_react4.useState)(""); + const [availableCommands, setAvailableCommands] = (0, import_react4.useState)([]); + const [mcpTools, setMcpTools] = (0, import_react4.useState)([]); + const [internalTools, setInternalTools] = (0, import_react4.useState)([]); + const [showToolsPanel, setShowToolsPanel] = (0, import_react4.useState)(false); + const [authUri, setAuthUri] = (0, import_react4.useState)(null); + const [isComposing, setIsComposing] = (0, import_react4.useState)(false); const [permissionRequest, setPermissionRequest] = (0, import_react4.useState)(null); const messagesEndRef = (0, import_react4.useRef)(null); const messagesContainerRef = (0, import_react4.useRef)(null); @@ -26577,6 +26583,65 @@ case "STATUS_UPDATE": setIsConnected(message.status !== "disconnected"); break; + case "hostInfo": { + console.log("[HostInfo]", message.data); + break; + } + case "hostLog": { + const line = message.data?.line; + if (line) console.log("[HostLog]", line); + break; + } + case "authUpdate": { + const uri = message.data?.authUri; + if (uri) setAuthUri(uri); + break; + } + case "availableCommands": { + const cmds = message.data?.availableCommands || []; + setAvailableCommands(cmds); + console.log("[App] Available commands:", cmds); + break; + } + case "mcpTools": { + const tools = message.data?.tools || []; + setMcpTools(tools); + console.log("[App] MCP tools:", tools); + break; + } + case "internalMcpTools": { + const tools = message.data?.tools || []; + setInternalTools(tools); + console.log("[App] Internal MCP tools:", tools); + break; + } + case "toolProgress": { + const payload = message.data || {}; + const name = payload.name || ""; + const stage = payload.stage || ""; + const ok = payload.ok; + const pretty = (n) => { + switch (n) { + case "read_page": + return "Read Page"; + case "capture_screenshot": + return "Capture Screenshot"; + case "get_network_logs": + return "Get Network Logs"; + case "get_console_logs": + return "Get Console Logs"; + default: + return n; + } + }; + if (stage === "start") { + setMessages((prev) => [...prev, { role: "assistant", content: `Running tool: ${pretty(name)}\u2026`, timestamp: Date.now() }]); + } else if (stage === "end") { + const endText = ok === false ? `Tool failed: ${pretty(name)}${payload.error ? ` \u2014 ${payload.error}` : ""}` : `Tool finished: ${pretty(name)}`; + setMessages((prev) => [...prev, { role: "assistant", content: endText, timestamp: Date.now() }]); + } + break; + } case "streamStart": setIsStreaming(true); setIsWaitingForResponse(false); @@ -26636,6 +26701,15 @@ const response = await vscode.postMessage({ type: "GET_STATUS" }); if (response) { setIsConnected(response.connected || false); + if (Array.isArray(response.availableCommands)) { + setAvailableCommands(response.availableCommands); + } + if (Array.isArray(response.mcpTools)) { + setMcpTools(response.mcpTools); + } + if (Array.isArray(response.internalTools)) { + setInternalTools(response.internalTools); + } } }; checkStatus(); @@ -26677,6 +26751,47 @@ setTimeout(() => setLoadingMessage(null), 3e3); } }, [vscode]); + const handleReadPage = (0, import_react4.useCallback)(async () => { + try { + setIsWaitingForResponse(true); + setLoadingMessage("Reading page..."); + const extract = await vscode.postMessage({ type: "EXTRACT_PAGE_DATA" }); + if (!extract || !extract.success) { + setIsWaitingForResponse(false); + setLoadingMessage(null); + setMessages((prev) => [...prev, { role: "assistant", content: `Read Page failed: ${extract?.error || "unknown error"}`, timestamp: Date.now() }]); + return; + } + await vscode.postMessage({ type: "SEND_TO_QWEN", action: "analyze_page", data: extract.data }); + } catch (err) { + setIsWaitingForResponse(false); + setLoadingMessage(null); + setMessages((prev) => [...prev, { role: "assistant", content: `Read Page error: ${err?.message || String(err)}`, timestamp: Date.now() }]); + } + }, [vscode]); + const handleGetNetworkLogs = (0, import_react4.useCallback)(async () => { + try { + setIsWaitingForResponse(true); + setLoadingMessage("Collecting network logs..."); + const resp = await vscode.postMessage({ type: "GET_NETWORK_LOGS" }); + if (!resp || !resp.success) { + setIsWaitingForResponse(false); + setLoadingMessage(null); + setMessages((prev) => [...prev, { role: "assistant", content: `Get Network Logs failed: ${resp?.error || "unknown error"}`, timestamp: Date.now() }]); + return; + } + const logs = resp.data || resp.logs || []; + const summary = Array.isArray(logs) ? logs.slice(-50) : []; + const text2 = `Network logs (last ${summary.length} entries): +` + JSON.stringify(summary.map((l) => ({ method: l.method, url: l.params?.request?.url || l.params?.documentURL, status: l.params?.response?.status, timestamp: l.timestamp })), null, 2); + setMessages((prev) => [...prev, { role: "assistant", content: "Running tool: Get Network Logs\u2026", timestamp: Date.now() }]); + await vscode.postMessage({ type: "SEND_TO_QWEN", action: "ai_analyze", data: { pageData: { content: { text: text2 } }, prompt: "Please analyze these network logs, list failed or slow requests and possible causes." } }); + } catch (err) { + setIsWaitingForResponse(false); + setLoadingMessage(null); + setMessages((prev) => [...prev, { role: "assistant", content: `Get Network Logs error: ${err?.message || String(err)}`, timestamp: Date.now() }]); + } + }, [vscode]); const handlePermissionResponse = (0, import_react4.useCallback)((optionId) => { if (!permissionRequest) return; console.log("[App] Sending permission response:", optionId, "for requestId:", permissionRequest.requestId); @@ -26695,7 +26810,34 @@ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("h1", { className: "text-sm font-medium", children: "Qwen Code" }), /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "flex items-center gap-2", children: [ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: `w-2 h-2 rounded-full ${isConnected ? "bg-green-500" : "bg-gray-500"}` }), - /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: "text-xs text-gray-400", children: isConnected ? "Connected" : "Disconnected" }) + /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: "text-xs text-gray-400", children: isConnected ? `Connected (${mcpTools.length + internalTools.length} tools)` : "Disconnected" }), + isConnected && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)( + "button", + { + className: "text-xs px-2 py-0.5 rounded bg-gray-700 hover:bg-gray-600", + onClick: handleReadPage, + title: "Read current page", + children: "Read Page" + } + ), + isConnected && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)( + "button", + { + className: "text-xs px-2 py-0.5 rounded bg-gray-700 hover:bg-gray-600", + onClick: handleGetNetworkLogs, + title: "Get network logs", + children: "Network Logs" + } + ), + isConnected && mcpTools.length + internalTools.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)( + "button", + { + className: "text-xs px-2 py-0.5 rounded bg-gray-700 hover:bg-gray-600", + onClick: () => setShowToolsPanel((v) => !v), + title: "Show available tools", + children: "Tools" + } + ) ] }) ] }), /* @__PURE__ */ (0, import_jsx_runtime18.jsx)( @@ -26739,6 +26881,7 @@ } ), isWaitingForResponse && loadingMessage && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(WaitingMessage, { loadingMessage }), + isStreaming && !streamingContent && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(WaitingMessage, { loadingMessage: loadingMessage || "Thinking..." }), /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { ref: messagesEndRef }) ] }) } @@ -26750,17 +26893,15 @@ inputFieldRef, isStreaming, isWaitingForResponse, - isComposing: false, + isComposing, editMode: "default", thinkingEnabled: false, activeFileName: null, activeSelection: null, skipAutoActiveContext: true, onInputChange: setInputText, - onCompositionStart: () => { - }, - onCompositionEnd: () => { - }, + onCompositionStart: () => setIsComposing(true), + onCompositionEnd: () => setIsComposing(false), onKeyDown: () => { }, onSubmit: handleSubmit, @@ -26801,14 +26942,61 @@ onResponse: handlePermissionResponse, onClose: () => setPermissionRequest(null) } - ) + ), + authUri && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "absolute left-3 right-3 top-10 z-50 bg-[#2a2d2e] border border-yellow-600 text-yellow-200 rounded p-2 text-[12px] flex items-center justify-between gap-2", children: [ + /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { children: "Authentication required. Click to sign in." }), + /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "flex items-center gap-2", children: [ + /* @__PURE__ */ (0, import_jsx_runtime18.jsx)( + "button", + { + className: "px-2 py-0.5 rounded bg-yellow-700 hover:bg-yellow-600 text-white", + onClick: () => { + try { + chrome.tabs.create({ url: authUri }); + } catch (_) { + } + }, + children: "Open Link" + } + ), + /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("button", { className: "px-2 py-0.5 rounded bg-gray-700 hover:bg-gray-600", onClick: () => setAuthUri(null), children: "Dismiss" }) + ] }) + ] }), + showToolsPanel && mcpTools.length + internalTools.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "absolute right-3 top-10 z-50 max-w-[80%] w-[360px] max-h-[50vh] overflow-auto bg-[#2a2d2e] text-[13px] text-gray-200 border border-gray-700 rounded shadow-lg p-2", children: [ + /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "flex items-center justify-between mb-2", children: [ + /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "font-semibold", children: [ + "Available Tools (", + mcpTools.length + internalTools.length, + ")" + ] }), + /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("button", { className: "text-gray-400 hover:text-gray-200", onClick: () => setShowToolsPanel(false), children: "\xD7" }) + ] }), + /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "text-[11px] text-gray-400 mb-1", children: "Internal (chrome-browser)" }), + /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("ul", { className: "space-y-1 mb-2", children: internalTools.map((t, i) => { + const name = t && (t.name || t.tool?.name) || String(t); + const desc = t && (t.description || t.tool?.description) || ""; + return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("li", { className: "px-2 py-1 rounded hover:bg-[#3a3d3e]", children: [ + /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "font-mono text-xs text-[#a6e22e] break-all", children: name }), + desc && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "text-[11px] text-gray-400 break-words", children: desc }) + ] }, `internal-${i}`); + }) }), + /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "text-[11px] text-gray-400 mb-1", children: "Discovered (MCP)" }), + /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("ul", { className: "space-y-1", children: mcpTools.map((t, i) => { + const name = t && (t.name || t.tool?.name) || String(t); + const desc = t && (t.description || t.tool?.description) || ""; + return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("li", { className: "px-2 py-1 rounded hover:bg-[#3a3d3e]", children: [ + /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "font-mono text-xs text-[#a6e22e] break-all", children: name }), + desc && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "text-[11px] text-gray-400 break-words", children: desc }) + ] }, `discovered-${i}`); + }) }) + ] }) ] }); }; // src/sidepanel/styles/tailwind.css (function() { const style = document.createElement("style"); - style.textContent = '/**\n * @license\n * Copyright 2025 Qwen Team\n * SPDX-License-Identifier: Apache-2.0\n */\n\n*, ::before, ::after {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n\n::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n\n/*! tailwindcss v3.4.18 | MIT License | https://tailwindcss.com\n */\n\n/*\n1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\n2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)\n*/\n\n*,\n::before,\n::after {\n box-sizing: border-box; /* 1 */\n border-width: 0; /* 2 */\n border-style: solid; /* 2 */\n border-color: #e5e7eb; /* 2 */\n}\n\n::before,\n::after {\n --tw-content: \'\';\n}\n\n/*\n1. Use a consistent sensible line-height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n3. Use a more readable tab size.\n4. Use the user\'s configured `sans` font-family by default.\n5. Use the user\'s configured `sans` font-feature-settings by default.\n6. Use the user\'s configured `sans` font-variation-settings by default.\n7. Disable tap highlights on iOS\n*/\n\nhtml,\n:host {\n line-height: 1.5; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n -moz-tab-size: 4; /* 3 */\n -o-tab-size: 4;\n tab-size: 4; /* 3 */\n font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; /* 4 */\n font-feature-settings: normal; /* 5 */\n font-variation-settings: normal; /* 6 */\n -webkit-tap-highlight-color: transparent; /* 7 */\n}\n\n/*\n1. Remove the margin in all browsers.\n2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.\n*/\n\nbody {\n margin: 0; /* 1 */\n line-height: inherit; /* 2 */\n}\n\n/*\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n3. Ensure horizontal rules are visible by default.\n*/\n\nhr {\n height: 0; /* 1 */\n color: inherit; /* 2 */\n border-top-width: 1px; /* 3 */\n}\n\n/*\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\n\n/*\nRemove the default font size and weight for headings.\n*/\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\n\n/*\nReset links to optimize for opt-in styling instead of opt-out.\n*/\n\na {\n color: inherit;\n text-decoration: inherit;\n}\n\n/*\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/*\n1. Use the user\'s configured `mono` font-family by default.\n2. Use the user\'s configured `mono` font-feature-settings by default.\n3. Use the user\'s configured `mono` font-variation-settings by default.\n4. Correct the odd `em` font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; /* 1 */\n font-feature-settings: normal; /* 2 */\n font-variation-settings: normal; /* 3 */\n font-size: 1em; /* 4 */\n}\n\n/*\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n font-size: 80%;\n}\n\n/*\nPrevent `sub` and `sup` elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/*\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n3. Remove gaps between table borders by default.\n*/\n\ntable {\n text-indent: 0; /* 1 */\n border-color: inherit; /* 2 */\n border-collapse: collapse; /* 3 */\n}\n\n/*\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n3. Remove default padding in all browsers.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-feature-settings: inherit; /* 1 */\n font-variation-settings: inherit; /* 1 */\n font-size: 100%; /* 1 */\n font-weight: inherit; /* 1 */\n line-height: inherit; /* 1 */\n letter-spacing: inherit; /* 1 */\n color: inherit; /* 1 */\n margin: 0; /* 2 */\n padding: 0; /* 3 */\n}\n\n/*\nRemove the inheritance of text transform in Edge and Firefox.\n*/\n\nbutton,\nselect {\n text-transform: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Remove default button styles.\n*/\n\nbutton,\ninput:where([type=\'button\']),\ninput:where([type=\'reset\']),\ninput:where([type=\'submit\']) {\n -webkit-appearance: button; /* 1 */\n background-color: transparent; /* 2 */\n background-image: none; /* 2 */\n}\n\n/*\nUse the modern Firefox focus style for all focusable elements.\n*/\n\n:-moz-focusring {\n outline: auto;\n}\n\n/*\nRemove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n\n:-moz-ui-invalid {\n box-shadow: none;\n}\n\n/*\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n vertical-align: baseline;\n}\n\n/*\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n\n/*\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type=\'search\'] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/*\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to `inherit` in Safari.\n*/\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n display: list-item;\n}\n\n/*\nRemoves the default spacing and border for appropriate elements.\n*/\n\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\n\nfieldset {\n margin: 0;\n padding: 0;\n}\n\nlegend {\n padding: 0;\n}\n\nol,\nul,\nmenu {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/*\nReset default styling for dialogs.\n*/\n\ndialog {\n padding: 0;\n}\n\n/*\nPrevent resizing textareas horizontally by default.\n*/\n\ntextarea {\n resize: vertical;\n}\n\n/*\n1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n2. Set the default placeholder color to the user\'s configured gray 400 color.\n*/\n\ninput::-moz-placeholder, textarea::-moz-placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n\n/*\nSet the default cursor for buttons.\n*/\n\nbutton,\n[role="button"] {\n cursor: pointer;\n}\n\n/*\nMake sure disabled buttons don\'t get the pointer cursor.\n*/\n\n:disabled {\n cursor: default;\n}\n\n/*\n1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)\n2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\n This can trigger a poorly considered lint error in some tools but is included by design.\n*/\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block; /* 1 */\n vertical-align: middle; /* 2 */\n}\n\n/*\nConstrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\n*/\n\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n\n/* Make elements with the HTML hidden attribute stay hidden by default */\n\n[hidden]:where(:not([hidden="until-found"])) {\n display: none;\n}\n.container {\n width: 100%;\n}\n@media (min-width: 640px) {\n\n .container {\n max-width: 640px;\n }\n}\n@media (min-width: 768px) {\n\n .container {\n max-width: 768px;\n }\n}\n@media (min-width: 1024px) {\n\n .container {\n max-width: 1024px;\n }\n}\n@media (min-width: 1280px) {\n\n .container {\n max-width: 1280px;\n }\n}\n@media (min-width: 1536px) {\n\n .container {\n max-width: 1536px;\n }\n}\n/* Composer: root container anchored to bottom*/\n/* Composer: form wrapper */\n.composer-form {\n position: relative;\n z-index: 1;\n margin-left: auto;\n margin-right: auto;\n display: flex;\n max-width: 680px;\n flex-direction: column;\n border-radius: 8px;\n border-width: 1px;\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 200ms;\n background: var(--app-input-secondary-background);\n border-color: var(--app-input-border);\n color: var(--app-input-foreground);\n}\n.composer-form:focus-within {\n /* match existing highlight behavior */\n border-color: var(--app-input-highlight);\n box-shadow: 0 1px 2px\n color-mix(in srgb, var(--app-input-highlight), transparent 80%);\n }\n/* Composer: input editable area */\n.composer-input {\n /* Use plain CSS for font-family inheritance; Tailwind has no `font-inherit` utility */\n position: relative;\n max-height: 200px;\n min-height: 1.5em;\n flex: 1 1 0%;\n -webkit-user-select: text;\n -moz-user-select: text;\n user-select: text;\n align-self: stretch;\n overflow-y: auto;\n overflow-x: hidden;\n white-space: pre-wrap;\n overflow-wrap: break-word;\n border-radius: 0px;\n border-width: 0px;\n background-color: transparent;\n padding-top: 0.625rem;\n padding-bottom: 0.625rem;\n padding-left: 0.875rem;\n padding-right: 0.875rem;\n outline: 2px solid transparent;\n outline-offset: 2px;\n font-family: inherit;\n font-size: var(--vscode-chat-font-size, 13px);\n color: var(--app-input-foreground);\n }\n/* Show placeholder when truly empty OR when flagged as empty via data attribute.\n The data attribute is needed because some browsers insert a
in\n contentEditable, which breaks :empty matching. */\n.composer-input:empty:before,\n .composer-input[data-empty=\'true\']::before {\n content: attr(data-placeholder);\n color: var(--app-input-placeholder-foreground);\n pointer-events: none;\n position: absolute;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: calc(100% - 28px);\n }\n.composer-input:focus {\n outline: none;\n }\n.composer-input:disabled,\n .composer-input[contenteditable=\'false\'] {\n color: #999;\n cursor: not-allowed;\n }\n/* Composer: actions row (more compact) */\n.composer-actions {\n z-index: 1;\n display: flex;\n min-width: 0px;\n align-items: center;\n gap: 0.25rem;\n padding: 5px;\n color: var(--app-secondary-foreground);\n border-top: 0.5px solid var(--app-input-border);\n}\n/* Text button (icon + label) */\n.btn-text-compact {\n display: inline-flex;\n min-width: 0px;\n flex-shrink: 1;\n cursor: pointer;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n align-items: center;\n gap: 0.25rem;\n border-radius: 2px;\n border-width: 0px;\n background-color: transparent;\n padding-left: 0.25rem;\n padding-right: 0.25rem;\n padding-top: 0.125rem;\n padding-bottom: 0.125rem;\n font-size: 0.85em;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n color: var(--app-secondary-foreground);\n}\n.btn-text-compact--primary {\n color: var(--app-secondary-foreground);\n /* color: var(--app-primary-foreground); */\n }\n.btn-text-compact:hover {\n background-color: var(--app-ghost-button-hover-background);\n }\n.btn-text-compact:active:not(:disabled) {\n filter: brightness(1.1);\n }\n.btn-text-compact > svg {\n height: 1em;\n width: 1em;\n flex-shrink: 0;\n }\n.btn-text-compact > span {\n display: inline-block;\n min-width: 0;\n max-width: 200px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n vertical-align: middle;\n }\n@media screen and (max-width: 300px) {\n .btn-text-compact > svg {\n display: none;\n }\n }\n/* Icon-only button, compact square (26x26) */\n.btn-icon-compact {\n display: inline-flex;\n height: 26px;\n width: 26px;\n flex-shrink: 0;\n cursor: pointer;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n border-width: 1px;\n border-color: transparent;\n background-color: transparent;\n padding: 0px;\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n color: var(--app-secondary-foreground);\n}\n.btn-icon-compact:hover {\n background-color: var(--app-ghost-button-hover-background);\n }\n.btn-icon-compact > svg {\n height: 1rem;\n width: 1rem;\n}\n/* Active/primary state for icon button (e.g., Thinking on) */\n.btn-icon-compact--active {\n background-color: var(--app-qwen-clay-button-orange);\n color: var(--app-qwen-ivory);\n }\n.btn-icon-compact--active > svg {\n stroke: var(--app-qwen-ivory);\n fill: var(--app-qwen-ivory);\n }\n.composer-overlay {\n position: absolute;\n inset: 0px;\n z-index: 0;\n border-radius: 8px;\n background: var(--app-input-background);\n}\n/* Optional: send button variant */\n.btn-send-compact {\n display: inline-flex;\n height: 26px;\n width: 26px;\n flex-shrink: 0;\n cursor: pointer;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n border-width: 1px;\n border-color: transparent;\n background-color: transparent;\n padding: 0px;\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n color: var(--app-secondary-foreground);\n}\n.btn-send-compact:hover {\n background-color: var(--app-ghost-button-hover-background);\n }\n.btn-send-compact > svg {\n height: 1rem;\n width: 1rem;\n}\n.btn-send-compact {\n margin-left: auto;\n}\n.btn-send-compact:hover {\n --tw-brightness: brightness(1.1);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.btn-send-compact:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n.btn-send-compact {\n background-color: var(--app-qwen-clay-button-orange);\n color: var(--app-qwen-ivory);\n }\n/*\n * File path styling inside tool call content\n * Applies to: .toolcall-content-wrapper .file-link-path\n * - Use monospace editor font\n * - Slightly smaller size\n * - Link color\n * - Tighten top alignment and allow aggressive breaking for long paths\n */\n.toolcall-content-wrapper .file-link-path {\n /* Tailwind utilities where possible */\n min-width: 0px;\n word-break: break-all;\n padding-top: 1px;\n font-size: 0.85em;\n /* Not covered by Tailwind defaults: use CSS vars / properties */\n font-family: var(--app-monospace-font-family);\n color: var(--app-link-color);\n overflow-wrap: anywhere;\n }\n.pointer-events-none {\n pointer-events: none;\n}\n.\\!visible {\n visibility: visible !important;\n}\n.visible {\n visibility: visible;\n}\n.invisible {\n visibility: hidden;\n}\n.collapse {\n visibility: collapse;\n}\n.fixed {\n position: fixed;\n}\n.absolute {\n position: absolute;\n}\n.relative {\n position: relative;\n}\n.inset-0 {\n inset: 0px;\n}\n.inset-x-0 {\n left: 0px;\n right: 0px;\n}\n.bottom-0 {\n bottom: 0px;\n}\n.bottom-auto {\n bottom: auto;\n}\n.bottom-full {\n bottom: 100%;\n}\n.left-0 {\n left: 0px;\n}\n.left-1\\/2 {\n left: 50%;\n}\n.left-\\[12px\\] {\n left: 12px;\n}\n.left-\\[3px\\] {\n left: 3px;\n}\n.right-0 {\n right: 0px;\n}\n.top-0 {\n top: 0px;\n}\n.top-\\[-0\\.1em\\] {\n top: -0.1em;\n}\n.top-\\[10px\\] {\n top: 10px;\n}\n.top-\\[24px\\] {\n top: 24px;\n}\n.top-\\[3px\\] {\n top: 3px;\n}\n.z-\\[1000\\] {\n z-index: 1000;\n}\n.z-\\[1\\] {\n z-index: 1;\n}\n.z-\\[999\\] {\n z-index: 999;\n}\n.m-0 {\n margin: 0px;\n}\n.m-\\[2px\\] {\n margin: 2px;\n}\n.mx-1 {\n margin-left: 0.25rem;\n margin-right: 0.25rem;\n}\n.mx-2 {\n margin-left: 0.5rem;\n margin-right: 0.5rem;\n}\n.mx-auto {\n margin-left: auto;\n margin-right: auto;\n}\n.my-1 {\n margin-top: 0.25rem;\n margin-bottom: 0.25rem;\n}\n.my-medium {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.mb-0\\.5 {\n margin-bottom: 0.125rem;\n}\n.mb-2 {\n margin-bottom: 0.5rem;\n}\n.mb-\\[2px\\] {\n margin-bottom: 2px;\n}\n.ml-3 {\n margin-left: 0.75rem;\n}\n.mr-1\\.5 {\n margin-right: 0.375rem;\n}\n.mr-2 {\n margin-right: 0.5rem;\n}\n.mt-1 {\n margin-top: 0.25rem;\n}\n.mt-\\[2px\\] {\n margin-top: 2px;\n}\n.box-border {\n box-sizing: border-box;\n}\n.block {\n display: block;\n}\n.inline-block {\n display: inline-block;\n}\n.inline {\n display: inline;\n}\n.flex {\n display: flex;\n}\n.inline-flex {\n display: inline-flex;\n}\n.grid {\n display: grid;\n}\n.hidden {\n display: none;\n}\n.h-1 {\n height: 0.25rem;\n}\n.h-1\\.5 {\n height: 0.375rem;\n}\n.h-2 {\n height: 0.5rem;\n}\n.h-4 {\n height: 1rem;\n}\n.h-5 {\n height: 1.25rem;\n}\n.h-\\[60px\\] {\n height: 60px;\n}\n.h-\\[80px\\] {\n height: 80px;\n}\n.h-\\[calc\\(100\\%-24px\\)\\] {\n height: calc(100% - 24px);\n}\n.h-full {\n height: 100%;\n}\n.h-screen {\n height: 100vh;\n}\n.max-h-\\[300px\\] {\n max-height: 300px;\n}\n.max-h-\\[50vh\\] {\n max-height: 50vh;\n}\n.max-h-\\[min\\(500px\\2c 50vh\\)\\] {\n max-height: min(500px,50vh);\n}\n.min-h-0 {\n min-height: 0px;\n}\n.w-1\\.5 {\n width: 0.375rem;\n}\n.w-2 {\n width: 0.5rem;\n}\n.w-2\\.5 {\n width: 0.625rem;\n}\n.w-4 {\n width: 1rem;\n}\n.w-\\[60px\\] {\n width: 60px;\n}\n.w-\\[80px\\] {\n width: 80px;\n}\n.w-\\[min\\(400px\\2c calc\\(100vw-32px\\)\\)\\] {\n width: min(400px,calc(100vw - 32px));\n}\n.w-full {\n width: 100%;\n}\n.w-px {\n width: 1px;\n}\n.min-w-0 {\n min-width: 0px;\n}\n.min-w-1 {\n min-width: 0.25rem;\n}\n.min-w-\\[10px\\] {\n min-width: 10px;\n}\n.max-w-\\[300px\\] {\n max-width: 300px;\n}\n.max-w-\\[400px\\] {\n max-width: 400px;\n}\n.max-w-\\[50\\%\\] {\n max-width: 50%;\n}\n.max-w-full {\n max-width: 100%;\n}\n.max-w-md {\n max-width: 28rem;\n}\n.max-w-sm {\n max-width: 24rem;\n}\n.flex-1 {\n flex: 1 1 0%;\n}\n.flex-shrink-0 {\n flex-shrink: 0;\n}\n.shrink-0 {\n flex-shrink: 0;\n}\n.-translate-x-1\\/2 {\n --tw-translate-x: -50%;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.-translate-y-1\\/2 {\n --tw-translate-y: -50%;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.-rotate-45 {\n --tw-rotate: -45deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.transform {\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n@keyframes fadeIn {\n\n 0% {\n opacity: 0;\n }\n\n 100% {\n opacity: 1;\n }\n}\n.animate-\\[fadeIn_0\\.2s_ease-in\\] {\n animation: fadeIn 0.2s ease-in;\n}\n.animate-\\[typingPulse_1\\.4s_infinite_ease-in-out\\] {\n animation: typingPulse 1.4s infinite ease-in-out;\n}\n@keyframes completion-menu-enter {\n\n 0% {\n opacity: 0;\n transform: translateY(4px);\n }\n\n 100% {\n opacity: 1;\n transform: translateY(0);\n }\n}\n.animate-completion-menu-enter {\n animation: completion-menu-enter 0.15s ease-out;\n}\n@keyframes slideUp {\n\n 0% {\n transform: translateY(100%);\n }\n\n 100% {\n transform: translateY(0);\n }\n}\n.animate-slide-up {\n animation: slideUp 0.3s ease-out;\n}\n.cursor-\\[inherit\\] {\n cursor: inherit;\n}\n.cursor-pointer {\n cursor: pointer;\n}\n.cursor-text {\n cursor: text;\n}\n.select-none {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n.select-text {\n -webkit-user-select: text;\n -moz-user-select: text;\n user-select: text;\n}\n.list-none {\n list-style-type: none;\n}\n.appearance-none {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n.grid-cols-\\[80px_1fr\\] {\n grid-template-columns: 80px 1fr;\n}\n.grid-cols-\\[auto_1fr\\] {\n grid-template-columns: auto 1fr;\n}\n.flex-row {\n flex-direction: row;\n}\n.flex-col {\n flex-direction: column;\n}\n.items-start {\n align-items: flex-start;\n}\n.items-center {\n align-items: center;\n}\n.items-baseline {\n align-items: baseline;\n}\n.justify-center {\n justify-content: center;\n}\n.justify-between {\n justify-content: space-between;\n}\n.gap-0 {\n gap: 0px;\n}\n.gap-1 {\n gap: 0.25rem;\n}\n.gap-1\\.5 {\n gap: 0.375rem;\n}\n.gap-2 {\n gap: 0.5rem;\n}\n.gap-3 {\n gap: 0.75rem;\n}\n.gap-6 {\n gap: 1.5rem;\n}\n.gap-8 {\n gap: 2rem;\n}\n.gap-\\[2px\\] {\n gap: 2px;\n}\n.gap-\\[var\\(--app-list-gap\\)\\] {\n gap: var(--app-list-gap);\n}\n.gap-medium {\n gap: 8px;\n}\n.space-y-4 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(1rem * var(--tw-space-y-reverse));\n}\n.overflow-hidden {\n overflow: hidden;\n}\n.overflow-x-auto {\n overflow-x: auto;\n}\n.overflow-y-auto {\n overflow-y: auto;\n}\n.overflow-y-hidden {\n overflow-y: hidden;\n}\n.truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.text-ellipsis {\n text-overflow: ellipsis;\n}\n.whitespace-normal {\n white-space: normal;\n}\n.whitespace-nowrap {\n white-space: nowrap;\n}\n.whitespace-pre-wrap {\n white-space: pre-wrap;\n}\n.break-words {\n overflow-wrap: break-word;\n}\n.rounded {\n border-radius: 0.25rem;\n}\n.rounded-\\[2px\\] {\n border-radius: 2px;\n}\n.rounded-\\[4px\\] {\n border-radius: 4px;\n}\n.rounded-\\[var\\(--app-list-border-radius\\)\\] {\n border-radius: var(--app-list-border-radius);\n}\n.rounded-\\[var\\(--corner-radius-small\\)\\] {\n border-radius: var(--corner-radius-small);\n}\n.rounded-full {\n border-radius: 9999px;\n}\n.rounded-large {\n border-radius: 8px;\n}\n.rounded-lg {\n border-radius: 0.5rem;\n}\n.rounded-md {\n border-radius: 0.375rem;\n}\n.rounded-medium {\n border-radius: 6px;\n}\n.rounded-sm {\n border-radius: 0.125rem;\n}\n.rounded-small {\n border-radius: 4px;\n}\n.border {\n border-width: 1px;\n}\n.border-0 {\n border-width: 0px;\n}\n.border-b {\n border-bottom-width: 1px;\n}\n.border-b-2 {\n border-bottom-width: 2px;\n}\n.border-l-2 {\n border-left-width: 2px;\n}\n.border-t {\n border-top-width: 1px;\n}\n.border-none {\n border-style: none;\n}\n.border-\\[\\#74c991\\] {\n --tw-border-opacity: 1;\n border-color: rgb(116 201 145 / var(--tw-border-opacity, 1));\n}\n.border-\\[var\\(--app-input-border\\)\\] {\n border-color: var(--app-input-border);\n}\n.border-\\[var\\(--app-primary-border-color\\)\\] {\n border-color: var(--app-primary-border-color);\n}\n.border-gray-700 {\n --tw-border-opacity: 1;\n border-color: rgb(55 65 81 / var(--tw-border-opacity, 1));\n}\n.bg-\\[\\#1e1e1e\\] {\n --tw-bg-opacity: 1;\n background-color: rgb(30 30 30 / var(--tw-bg-opacity, 1));\n}\n.bg-\\[\\#2196f3\\] {\n --tw-bg-opacity: 1;\n background-color: rgb(33 150 243 / var(--tw-bg-opacity, 1));\n}\n.bg-\\[\\#4caf50\\] {\n --tw-bg-opacity: 1;\n background-color: rgb(76 175 80 / var(--tw-bg-opacity, 1));\n}\n.bg-\\[\\#4f46e5\\] {\n --tw-bg-opacity: 1;\n background-color: rgb(79 70 229 / var(--tw-bg-opacity, 1));\n}\n.bg-\\[\\#f44336\\] {\n --tw-bg-opacity: 1;\n background-color: rgb(244 67 54 / var(--tw-bg-opacity, 1));\n}\n.bg-\\[\\#ffc107\\] {\n --tw-bg-opacity: 1;\n background-color: rgb(255 193 7 / var(--tw-bg-opacity, 1));\n}\n.bg-\\[var\\(--app-header-background\\)\\] {\n background-color: var(--app-header-background);\n}\n.bg-\\[var\\(--app-input-background\\)\\] {\n background-color: var(--app-input-background);\n}\n.bg-\\[var\\(--app-list-active-background\\)\\] {\n background-color: var(--app-list-active-background);\n}\n.bg-\\[var\\(--app-menu-background\\)\\] {\n background-color: var(--app-menu-background);\n}\n.bg-\\[var\\(--app-primary-background\\)\\] {\n background-color: var(--app-primary-background);\n}\n.bg-\\[var\\(--app-primary-border-color\\)\\] {\n background-color: var(--app-primary-border-color);\n}\n.bg-\\[var\\(--app-secondary-foreground\\)\\] {\n background-color: var(--app-secondary-foreground);\n}\n.bg-gray-200 {\n --tw-bg-opacity: 1;\n background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(107 114 128 / var(--tw-bg-opacity, 1));\n}\n.bg-indigo-600 {\n --tw-bg-opacity: 1;\n background-color: rgb(79 70 229 / var(--tw-bg-opacity, 1));\n}\n.bg-transparent {\n background-color: transparent;\n}\n.bg-gradient-to-b {\n background-image: linear-gradient(to bottom, var(--tw-gradient-stops));\n}\n.from-transparent {\n --tw-gradient-from: transparent var(--tw-gradient-from-position);\n --tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\n}\n.to-\\[var\\(--app-primary-background\\)\\] {\n --tw-gradient-to: var(--app-primary-background) var(--tw-gradient-to-position);\n}\n.object-contain {\n -o-object-fit: contain;\n object-fit: contain;\n}\n.p-0 {\n padding: 0px;\n}\n.p-1 {\n padding: 0.25rem;\n}\n.p-2 {\n padding: 0.5rem;\n}\n.p-3 {\n padding: 0.75rem;\n}\n.p-4 {\n padding: 1rem;\n}\n.p-5 {\n padding: 1.25rem;\n}\n.p-\\[var\\(--app-list-item-padding\\)\\] {\n padding: var(--app-list-item-padding);\n}\n.p-\\[var\\(--app-list-padding\\)\\] {\n padding: var(--app-list-padding);\n}\n.p-large {\n padding: 12px;\n}\n.p-medium {\n padding: 8px;\n}\n.px-2 {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n.px-2\\.5 {\n padding-left: 0.625rem;\n padding-right: 0.625rem;\n}\n.px-3 {\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n}\n.px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n.py-0 {\n padding-top: 0px;\n padding-bottom: 0px;\n}\n.py-0\\.5 {\n padding-top: 0.125rem;\n padding-bottom: 0.125rem;\n}\n.py-1 {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n}\n.py-1\\.5 {\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n}\n.py-2 {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n.py-3 {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n}\n.pb-1 {\n padding-bottom: 0.25rem;\n}\n.pb-2 {\n padding-bottom: 0.5rem;\n}\n.pb-4 {\n padding-bottom: 1rem;\n}\n.pl-6 {\n padding-left: 1.5rem;\n}\n.pl-\\[30px\\] {\n padding-left: 30px;\n}\n.pr-2 {\n padding-right: 0.5rem;\n}\n.pt-\\[2px\\] {\n padding-top: 2px;\n}\n.text-left {\n text-align: left;\n}\n.text-center {\n text-align: center;\n}\n.align-middle {\n vertical-align: middle;\n}\n.font-mono {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;\n}\n.text-2xl {\n font-size: 1.5rem;\n line-height: 2rem;\n}\n.text-\\[0\\.85em\\] {\n font-size: 0.85em;\n}\n.text-\\[0\\.9em\\] {\n font-size: 0.9em;\n}\n.text-\\[1\\.1em\\] {\n font-size: 1.1em;\n}\n.text-\\[11px\\] {\n font-size: 11px;\n}\n.text-\\[13px\\] {\n font-size: 13px;\n}\n.text-\\[14px\\] {\n font-size: 14px;\n}\n.text-\\[15px\\] {\n font-size: 15px;\n}\n.text-\\[16px\\] {\n font-size: 16px;\n}\n.text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n.text-xs {\n font-size: 0.75rem;\n line-height: 1rem;\n}\n.font-\\[600\\] {\n font-weight: 600;\n}\n.font-\\[var\\(--vscode-chat-font-family\\)\\] {\n font-weight: var(--vscode-chat-font-family);\n}\n.font-bold {\n font-weight: 700;\n}\n.font-medium {\n font-weight: 500;\n}\n.font-normal {\n font-weight: 400;\n}\n.font-semibold {\n font-weight: 600;\n}\n.italic {\n font-style: italic;\n}\n.leading-\\[1\\.5\\] {\n line-height: 1.5;\n}\n.leading-none {\n line-height: 1;\n}\n.leading-normal {\n line-height: 1.5;\n}\n.leading-relaxed {\n line-height: 1.625;\n}\n.text-\\[\\#c74e39\\] {\n --tw-text-opacity: 1;\n color: rgb(199 78 57 / var(--tw-text-opacity, 1));\n}\n.text-\\[\\#e1c08d\\] {\n --tw-text-opacity: 1;\n color: rgb(225 192 141 / var(--tw-text-opacity, 1));\n}\n.text-\\[var\\(--app-list-active-foreground\\)\\] {\n color: var(--app-list-active-foreground);\n}\n.text-\\[var\\(--app-menu-foreground\\)\\] {\n color: var(--app-menu-foreground);\n}\n.text-\\[var\\(--app-monospace-font-size\\)\\] {\n color: var(--app-monospace-font-size);\n}\n.text-\\[var\\(--app-primary-foreground\\)\\] {\n color: var(--app-primary-foreground);\n}\n.text-\\[var\\(--app-secondary-foreground\\)\\] {\n color: var(--app-secondary-foreground);\n}\n.text-\\[var\\(--vscode-chat-font-size\\2c 13px\\)\\] {\n color: var(--vscode-chat-font-size,13px);\n}\n.text-\\[var\\(--vscode-symbolIcon-fileForeground\\2c \\#cccccc\\)\\] {\n color: var(--vscode-symbolIcon-fileForeground,#cccccc);\n}\n.text-gray-400 {\n --tw-text-opacity: 1;\n color: rgb(156 163 175 / var(--tw-text-opacity, 1));\n}\n.text-white {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.line-through {\n text-decoration-line: line-through;\n}\n.no-underline {\n text-decoration-line: none;\n}\n.opacity-50 {\n opacity: 0.5;\n}\n.opacity-60 {\n opacity: 0.6;\n}\n.opacity-70 {\n opacity: 0.7;\n}\n.opacity-80 {\n opacity: 0.8;\n}\n.opacity-85 {\n opacity: 0.85;\n}\n.opacity-90 {\n opacity: 0.9;\n}\n.shadow-\\[0_4px_16px_rgba\\(0\\2c 0\\2c 0\\2c 0\\.1\\)\\] {\n --tw-shadow: 0 4px 16px rgba(0,0,0,0.1);\n --tw-shadow-colored: 0 4px 16px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.shadow-\\[inset_0_0_0_1px_var\\(--app-transparent-inner-border\\)\\] {\n --tw-shadow: inset 0 0 0 1px var(--app-transparent-inner-border);\n --tw-shadow-colored: inset 0 0 0 1px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.shadow-sm {\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.outline-none {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.ring {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n.filter {\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.transition {\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-colors {\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.duration-100 {\n transition-duration: 100ms;\n}\n.duration-150 {\n transition-duration: 150ms;\n}\n.duration-200 {\n transition-duration: 200ms;\n}\n.ease-in-out {\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n}\n/* Multi-line clamp with ellipsis (Chromium-based webview supported) */\n.q-line-clamp-3 {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 3;\n overflow: hidden;\n }\n.\\[animation-delay\\:0\\.2s\\] {\n animation-delay: 0.2s;\n}\n.\\[animation-delay\\:0\\.4s\\] {\n animation-delay: 0.4s;\n}\n.\\[animation-delay\\:0s\\] {\n animation-delay: 0s;\n}\n\n/* ===========================\n Reusable Component Classes\n =========================== */\n\n/* ===========================\n Utilities\n =========================== */\n\n.placeholder\\:text-\\[var\\(--app-input-placeholder-foreground\\)\\]::-moz-placeholder {\n color: var(--app-input-placeholder-foreground);\n}\n\n.placeholder\\:text-\\[var\\(--app-input-placeholder-foreground\\)\\]::placeholder {\n color: var(--app-input-placeholder-foreground);\n}\n\n.placeholder\\:opacity-60::-moz-placeholder {\n opacity: 0.6;\n}\n\n.placeholder\\:opacity-60::placeholder {\n opacity: 0.6;\n}\n\n.placeholder\\:opacity-70::-moz-placeholder {\n opacity: 0.7;\n}\n\n.placeholder\\:opacity-70::placeholder {\n opacity: 0.7;\n}\n\n.before\\:absolute::before {\n content: var(--tw-content);\n position: absolute;\n}\n\n.before\\:left-\\[8px\\]::before {\n content: var(--tw-content);\n left: 8px;\n}\n\n.before\\:top-2::before {\n content: var(--tw-content);\n top: 0.5rem;\n}\n\n.before\\:z-\\[1\\]::before {\n content: var(--tw-content);\n z-index: 1;\n}\n\n@keyframes pulse {\n\n 50% {\n content: var(--tw-content);\n opacity: .5;\n }\n}\n\n.before\\:animate-pulse-slow::before {\n content: var(--tw-content);\n animation: pulse 1.5s infinite;\n}\n\n.before\\:text-\\[10px\\]::before {\n content: var(--tw-content);\n font-size: 10px;\n}\n\n.before\\:opacity-70::before {\n content: var(--tw-content);\n opacity: 0.7;\n}\n\n.before\\:content-\\[\\"\\\\\\\\25cf\\"\\]::before {\n --tw-content: "\\\\25cf";\n content: var(--tw-content);\n}\n\n.hover\\:relative:hover {\n position: relative;\n}\n\n.hover\\:border-0:hover {\n border-width: 0px;\n}\n\n.hover\\:bg-\\[\\#4338ca\\]:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(67 56 202 / var(--tw-bg-opacity, 1));\n}\n\n.hover\\:bg-\\[var\\(--app-button-background\\)\\]:hover {\n background-color: var(--app-button-background);\n}\n\n.hover\\:bg-\\[var\\(--app-ghost-button-hover-background\\)\\]:hover {\n background-color: var(--app-ghost-button-hover-background);\n}\n\n.hover\\:bg-\\[var\\(--app-list-hover-background\\)\\]:hover {\n background-color: var(--app-list-hover-background);\n}\n\n.hover\\:bg-indigo-700:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(67 56 202 / var(--tw-bg-opacity, 1));\n}\n\n.hover\\:font-bold:hover {\n font-weight: 700;\n}\n\n.hover\\:text-\\[var\\(--app-button-foreground\\)\\]:hover {\n color: var(--app-button-foreground);\n}\n\n.hover\\:text-\\[var\\(--app-primary-foreground\\)\\]:hover {\n color: var(--app-primary-foreground);\n}\n\n.hover\\:underline:hover {\n text-decoration-line: underline;\n}\n\n.hover\\:no-underline:hover {\n text-decoration-line: none;\n}\n\n.focus\\:rounded-\\[2px\\]:focus {\n border-radius: 2px;\n}\n\n.focus\\:bg-\\[var\\(--app-ghost-button-hover-background\\)\\]:focus {\n background-color: var(--app-ghost-button-hover-background);\n}\n\n.focus\\:outline:focus {\n outline-style: solid;\n}\n\n.focus\\:outline-1:focus {\n outline-width: 1px;\n}\n\n.focus\\:outline-offset-2:focus {\n outline-offset: 2px;\n}\n\n.focus\\:outline-\\[var\\(--vscode-focusBorder\\)\\]:focus {\n outline-color: var(--vscode-focusBorder);\n}\n\n.active\\:opacity-80:active {\n opacity: 0.8;\n}\n\n@media (min-width: 640px) {\n\n .sm\\:inline {\n display: inline;\n }\n}\n\n@media (min-width: 768px) {\n\n .md\\:p-10 {\n padding: 2.5rem;\n }\n}\n\n@media (prefers-color-scheme: dark) {\n\n .dark\\:opacity-60 {\n opacity: 0.6;\n }\n}\n\n.\\[\\&\\:not\\(\\:first-child\\)\\]\\:mt-2:not(:first-child) {\n margin-top: 0.5rem;\n}\n\n.\\[\\&\\>svg\\]\\:h-5>svg {\n height: 1.25rem;\n}\n\n.\\[\\&\\>svg\\]\\:w-5>svg {\n width: 1.25rem;\n}\n'; + style.textContent = '/**\n * @license\n * Copyright 2025 Qwen Team\n * SPDX-License-Identifier: Apache-2.0\n */\n\n*, ::before, ::after {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n\n::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n\n/*! tailwindcss v3.4.18 | MIT License | https://tailwindcss.com\n */\n\n/*\n1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\n2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)\n*/\n\n*,\n::before,\n::after {\n box-sizing: border-box; /* 1 */\n border-width: 0; /* 2 */\n border-style: solid; /* 2 */\n border-color: #e5e7eb; /* 2 */\n}\n\n::before,\n::after {\n --tw-content: \'\';\n}\n\n/*\n1. Use a consistent sensible line-height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n3. Use a more readable tab size.\n4. Use the user\'s configured `sans` font-family by default.\n5. Use the user\'s configured `sans` font-feature-settings by default.\n6. Use the user\'s configured `sans` font-variation-settings by default.\n7. Disable tap highlights on iOS\n*/\n\nhtml,\n:host {\n line-height: 1.5; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n -moz-tab-size: 4; /* 3 */\n -o-tab-size: 4;\n tab-size: 4; /* 3 */\n font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; /* 4 */\n font-feature-settings: normal; /* 5 */\n font-variation-settings: normal; /* 6 */\n -webkit-tap-highlight-color: transparent; /* 7 */\n}\n\n/*\n1. Remove the margin in all browsers.\n2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.\n*/\n\nbody {\n margin: 0; /* 1 */\n line-height: inherit; /* 2 */\n}\n\n/*\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n3. Ensure horizontal rules are visible by default.\n*/\n\nhr {\n height: 0; /* 1 */\n color: inherit; /* 2 */\n border-top-width: 1px; /* 3 */\n}\n\n/*\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\n\n/*\nRemove the default font size and weight for headings.\n*/\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\n\n/*\nReset links to optimize for opt-in styling instead of opt-out.\n*/\n\na {\n color: inherit;\n text-decoration: inherit;\n}\n\n/*\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/*\n1. Use the user\'s configured `mono` font-family by default.\n2. Use the user\'s configured `mono` font-feature-settings by default.\n3. Use the user\'s configured `mono` font-variation-settings by default.\n4. Correct the odd `em` font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; /* 1 */\n font-feature-settings: normal; /* 2 */\n font-variation-settings: normal; /* 3 */\n font-size: 1em; /* 4 */\n}\n\n/*\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n font-size: 80%;\n}\n\n/*\nPrevent `sub` and `sup` elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/*\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n3. Remove gaps between table borders by default.\n*/\n\ntable {\n text-indent: 0; /* 1 */\n border-color: inherit; /* 2 */\n border-collapse: collapse; /* 3 */\n}\n\n/*\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n3. Remove default padding in all browsers.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-feature-settings: inherit; /* 1 */\n font-variation-settings: inherit; /* 1 */\n font-size: 100%; /* 1 */\n font-weight: inherit; /* 1 */\n line-height: inherit; /* 1 */\n letter-spacing: inherit; /* 1 */\n color: inherit; /* 1 */\n margin: 0; /* 2 */\n padding: 0; /* 3 */\n}\n\n/*\nRemove the inheritance of text transform in Edge and Firefox.\n*/\n\nbutton,\nselect {\n text-transform: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Remove default button styles.\n*/\n\nbutton,\ninput:where([type=\'button\']),\ninput:where([type=\'reset\']),\ninput:where([type=\'submit\']) {\n -webkit-appearance: button; /* 1 */\n background-color: transparent; /* 2 */\n background-image: none; /* 2 */\n}\n\n/*\nUse the modern Firefox focus style for all focusable elements.\n*/\n\n:-moz-focusring {\n outline: auto;\n}\n\n/*\nRemove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n\n:-moz-ui-invalid {\n box-shadow: none;\n}\n\n/*\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n vertical-align: baseline;\n}\n\n/*\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n\n/*\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type=\'search\'] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/*\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to `inherit` in Safari.\n*/\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n display: list-item;\n}\n\n/*\nRemoves the default spacing and border for appropriate elements.\n*/\n\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\n\nfieldset {\n margin: 0;\n padding: 0;\n}\n\nlegend {\n padding: 0;\n}\n\nol,\nul,\nmenu {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/*\nReset default styling for dialogs.\n*/\n\ndialog {\n padding: 0;\n}\n\n/*\nPrevent resizing textareas horizontally by default.\n*/\n\ntextarea {\n resize: vertical;\n}\n\n/*\n1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n2. Set the default placeholder color to the user\'s configured gray 400 color.\n*/\n\ninput::-moz-placeholder, textarea::-moz-placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n\n/*\nSet the default cursor for buttons.\n*/\n\nbutton,\n[role="button"] {\n cursor: pointer;\n}\n\n/*\nMake sure disabled buttons don\'t get the pointer cursor.\n*/\n\n:disabled {\n cursor: default;\n}\n\n/*\n1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)\n2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\n This can trigger a poorly considered lint error in some tools but is included by design.\n*/\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block; /* 1 */\n vertical-align: middle; /* 2 */\n}\n\n/*\nConstrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\n*/\n\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n\n/* Make elements with the HTML hidden attribute stay hidden by default */\n\n[hidden]:where(:not([hidden="until-found"])) {\n display: none;\n}\n.container {\n width: 100%;\n}\n@media (min-width: 640px) {\n\n .container {\n max-width: 640px;\n }\n}\n@media (min-width: 768px) {\n\n .container {\n max-width: 768px;\n }\n}\n@media (min-width: 1024px) {\n\n .container {\n max-width: 1024px;\n }\n}\n@media (min-width: 1280px) {\n\n .container {\n max-width: 1280px;\n }\n}\n@media (min-width: 1536px) {\n\n .container {\n max-width: 1536px;\n }\n}\n/* Composer: root container anchored to bottom*/\n/* Composer: form wrapper */\n.composer-form {\n position: relative;\n z-index: 1;\n margin-left: auto;\n margin-right: auto;\n display: flex;\n max-width: 680px;\n flex-direction: column;\n border-radius: 8px;\n border-width: 1px;\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 200ms;\n background: var(--app-input-secondary-background);\n border-color: var(--app-input-border);\n color: var(--app-input-foreground);\n}\n.composer-form:focus-within {\n /* match existing highlight behavior */\n border-color: var(--app-input-highlight);\n box-shadow: 0 1px 2px\n color-mix(in srgb, var(--app-input-highlight), transparent 80%);\n }\n/* Composer: input editable area */\n.composer-input {\n /* Use plain CSS for font-family inheritance; Tailwind has no `font-inherit` utility */\n position: relative;\n max-height: 200px;\n min-height: 1.5em;\n flex: 1 1 0%;\n -webkit-user-select: text;\n -moz-user-select: text;\n user-select: text;\n align-self: stretch;\n overflow-y: auto;\n overflow-x: hidden;\n white-space: pre-wrap;\n overflow-wrap: break-word;\n border-radius: 0px;\n border-width: 0px;\n background-color: transparent;\n padding-top: 0.625rem;\n padding-bottom: 0.625rem;\n padding-left: 0.875rem;\n padding-right: 0.875rem;\n outline: 2px solid transparent;\n outline-offset: 2px;\n font-family: inherit;\n font-size: var(--vscode-chat-font-size, 13px);\n color: var(--app-input-foreground);\n }\n/* Show placeholder when truly empty OR when flagged as empty via data attribute.\n The data attribute is needed because some browsers insert a
in\n contentEditable, which breaks :empty matching. */\n.composer-input:empty:before,\n .composer-input[data-empty=\'true\']::before {\n content: attr(data-placeholder);\n color: var(--app-input-placeholder-foreground);\n pointer-events: none;\n position: absolute;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: calc(100% - 28px);\n }\n.composer-input:focus {\n outline: none;\n }\n.composer-input:disabled,\n .composer-input[contenteditable=\'false\'] {\n color: #999;\n cursor: not-allowed;\n }\n/* Composer: actions row (more compact) */\n.composer-actions {\n z-index: 1;\n display: flex;\n min-width: 0px;\n align-items: center;\n gap: 0.25rem;\n padding: 5px;\n color: var(--app-secondary-foreground);\n border-top: 0.5px solid var(--app-input-border);\n}\n/* Text button (icon + label) */\n.btn-text-compact {\n display: inline-flex;\n min-width: 0px;\n flex-shrink: 1;\n cursor: pointer;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n align-items: center;\n gap: 0.25rem;\n border-radius: 2px;\n border-width: 0px;\n background-color: transparent;\n padding-left: 0.25rem;\n padding-right: 0.25rem;\n padding-top: 0.125rem;\n padding-bottom: 0.125rem;\n font-size: 0.85em;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n color: var(--app-secondary-foreground);\n}\n.btn-text-compact--primary {\n color: var(--app-secondary-foreground);\n /* color: var(--app-primary-foreground); */\n }\n.btn-text-compact:hover {\n background-color: var(--app-ghost-button-hover-background);\n }\n.btn-text-compact:active:not(:disabled) {\n filter: brightness(1.1);\n }\n.btn-text-compact > svg {\n height: 1em;\n width: 1em;\n flex-shrink: 0;\n }\n.btn-text-compact > span {\n display: inline-block;\n min-width: 0;\n max-width: 200px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n vertical-align: middle;\n }\n@media screen and (max-width: 300px) {\n .btn-text-compact > svg {\n display: none;\n }\n }\n/* Icon-only button, compact square (26x26) */\n.btn-icon-compact {\n display: inline-flex;\n height: 26px;\n width: 26px;\n flex-shrink: 0;\n cursor: pointer;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n border-width: 1px;\n border-color: transparent;\n background-color: transparent;\n padding: 0px;\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n color: var(--app-secondary-foreground);\n}\n.btn-icon-compact:hover {\n background-color: var(--app-ghost-button-hover-background);\n }\n.btn-icon-compact > svg {\n height: 1rem;\n width: 1rem;\n}\n/* Active/primary state for icon button (e.g., Thinking on) */\n.btn-icon-compact--active {\n background-color: var(--app-qwen-clay-button-orange);\n color: var(--app-qwen-ivory);\n }\n.btn-icon-compact--active > svg {\n stroke: var(--app-qwen-ivory);\n fill: var(--app-qwen-ivory);\n }\n.composer-overlay {\n position: absolute;\n inset: 0px;\n z-index: 0;\n border-radius: 8px;\n background: var(--app-input-background);\n}\n/* Optional: send button variant */\n.btn-send-compact {\n display: inline-flex;\n height: 26px;\n width: 26px;\n flex-shrink: 0;\n cursor: pointer;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n border-width: 1px;\n border-color: transparent;\n background-color: transparent;\n padding: 0px;\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n color: var(--app-secondary-foreground);\n}\n.btn-send-compact:hover {\n background-color: var(--app-ghost-button-hover-background);\n }\n.btn-send-compact > svg {\n height: 1rem;\n width: 1rem;\n}\n.btn-send-compact {\n margin-left: auto;\n}\n.btn-send-compact:hover {\n --tw-brightness: brightness(1.1);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.btn-send-compact:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n.btn-send-compact {\n background-color: var(--app-qwen-clay-button-orange);\n color: var(--app-qwen-ivory);\n }\n/*\n * File path styling inside tool call content\n * Applies to: .toolcall-content-wrapper .file-link-path\n * - Use monospace editor font\n * - Slightly smaller size\n * - Link color\n * - Tighten top alignment and allow aggressive breaking for long paths\n */\n.toolcall-content-wrapper .file-link-path {\n /* Tailwind utilities where possible */\n min-width: 0px;\n word-break: break-all;\n padding-top: 1px;\n font-size: 0.85em;\n /* Not covered by Tailwind defaults: use CSS vars / properties */\n font-family: var(--app-monospace-font-family);\n color: var(--app-link-color);\n overflow-wrap: anywhere;\n }\n.pointer-events-none {\n pointer-events: none;\n}\n.\\!visible {\n visibility: visible !important;\n}\n.visible {\n visibility: visible;\n}\n.invisible {\n visibility: hidden;\n}\n.collapse {\n visibility: collapse;\n}\n.fixed {\n position: fixed;\n}\n.absolute {\n position: absolute;\n}\n.relative {\n position: relative;\n}\n.inset-0 {\n inset: 0px;\n}\n.inset-x-0 {\n left: 0px;\n right: 0px;\n}\n.bottom-0 {\n bottom: 0px;\n}\n.bottom-auto {\n bottom: auto;\n}\n.bottom-full {\n bottom: 100%;\n}\n.left-0 {\n left: 0px;\n}\n.left-1\\/2 {\n left: 50%;\n}\n.left-3 {\n left: 0.75rem;\n}\n.left-\\[12px\\] {\n left: 12px;\n}\n.left-\\[3px\\] {\n left: 3px;\n}\n.right-0 {\n right: 0px;\n}\n.right-3 {\n right: 0.75rem;\n}\n.top-0 {\n top: 0px;\n}\n.top-10 {\n top: 2.5rem;\n}\n.top-\\[-0\\.1em\\] {\n top: -0.1em;\n}\n.top-\\[10px\\] {\n top: 10px;\n}\n.top-\\[24px\\] {\n top: 24px;\n}\n.top-\\[3px\\] {\n top: 3px;\n}\n.z-50 {\n z-index: 50;\n}\n.z-\\[1000\\] {\n z-index: 1000;\n}\n.z-\\[1\\] {\n z-index: 1;\n}\n.z-\\[999\\] {\n z-index: 999;\n}\n.m-0 {\n margin: 0px;\n}\n.m-\\[2px\\] {\n margin: 2px;\n}\n.mx-1 {\n margin-left: 0.25rem;\n margin-right: 0.25rem;\n}\n.mx-2 {\n margin-left: 0.5rem;\n margin-right: 0.5rem;\n}\n.mx-auto {\n margin-left: auto;\n margin-right: auto;\n}\n.my-1 {\n margin-top: 0.25rem;\n margin-bottom: 0.25rem;\n}\n.my-medium {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.mb-0\\.5 {\n margin-bottom: 0.125rem;\n}\n.mb-1 {\n margin-bottom: 0.25rem;\n}\n.mb-2 {\n margin-bottom: 0.5rem;\n}\n.mb-\\[2px\\] {\n margin-bottom: 2px;\n}\n.ml-3 {\n margin-left: 0.75rem;\n}\n.mr-1\\.5 {\n margin-right: 0.375rem;\n}\n.mr-2 {\n margin-right: 0.5rem;\n}\n.mt-1 {\n margin-top: 0.25rem;\n}\n.mt-\\[2px\\] {\n margin-top: 2px;\n}\n.box-border {\n box-sizing: border-box;\n}\n.block {\n display: block;\n}\n.inline-block {\n display: inline-block;\n}\n.inline {\n display: inline;\n}\n.flex {\n display: flex;\n}\n.inline-flex {\n display: inline-flex;\n}\n.grid {\n display: grid;\n}\n.hidden {\n display: none;\n}\n.h-1 {\n height: 0.25rem;\n}\n.h-1\\.5 {\n height: 0.375rem;\n}\n.h-2 {\n height: 0.5rem;\n}\n.h-4 {\n height: 1rem;\n}\n.h-5 {\n height: 1.25rem;\n}\n.h-\\[60px\\] {\n height: 60px;\n}\n.h-\\[80px\\] {\n height: 80px;\n}\n.h-\\[calc\\(100\\%-24px\\)\\] {\n height: calc(100% - 24px);\n}\n.h-full {\n height: 100%;\n}\n.h-screen {\n height: 100vh;\n}\n.max-h-\\[300px\\] {\n max-height: 300px;\n}\n.max-h-\\[50vh\\] {\n max-height: 50vh;\n}\n.max-h-\\[min\\(500px\\2c 50vh\\)\\] {\n max-height: min(500px,50vh);\n}\n.min-h-0 {\n min-height: 0px;\n}\n.w-1\\.5 {\n width: 0.375rem;\n}\n.w-2 {\n width: 0.5rem;\n}\n.w-2\\.5 {\n width: 0.625rem;\n}\n.w-4 {\n width: 1rem;\n}\n.w-\\[360px\\] {\n width: 360px;\n}\n.w-\\[60px\\] {\n width: 60px;\n}\n.w-\\[80px\\] {\n width: 80px;\n}\n.w-\\[min\\(400px\\2c calc\\(100vw-32px\\)\\)\\] {\n width: min(400px,calc(100vw - 32px));\n}\n.w-full {\n width: 100%;\n}\n.w-px {\n width: 1px;\n}\n.min-w-0 {\n min-width: 0px;\n}\n.min-w-1 {\n min-width: 0.25rem;\n}\n.min-w-\\[10px\\] {\n min-width: 10px;\n}\n.max-w-\\[300px\\] {\n max-width: 300px;\n}\n.max-w-\\[400px\\] {\n max-width: 400px;\n}\n.max-w-\\[50\\%\\] {\n max-width: 50%;\n}\n.max-w-\\[80\\%\\] {\n max-width: 80%;\n}\n.max-w-full {\n max-width: 100%;\n}\n.max-w-md {\n max-width: 28rem;\n}\n.max-w-sm {\n max-width: 24rem;\n}\n.flex-1 {\n flex: 1 1 0%;\n}\n.flex-shrink-0 {\n flex-shrink: 0;\n}\n.shrink-0 {\n flex-shrink: 0;\n}\n.-translate-x-1\\/2 {\n --tw-translate-x: -50%;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.-translate-y-1\\/2 {\n --tw-translate-y: -50%;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.-rotate-45 {\n --tw-rotate: -45deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.transform {\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n@keyframes fadeIn {\n\n 0% {\n opacity: 0;\n }\n\n 100% {\n opacity: 1;\n }\n}\n.animate-\\[fadeIn_0\\.2s_ease-in\\] {\n animation: fadeIn 0.2s ease-in;\n}\n.animate-\\[typingPulse_1\\.4s_infinite_ease-in-out\\] {\n animation: typingPulse 1.4s infinite ease-in-out;\n}\n@keyframes completion-menu-enter {\n\n 0% {\n opacity: 0;\n transform: translateY(4px);\n }\n\n 100% {\n opacity: 1;\n transform: translateY(0);\n }\n}\n.animate-completion-menu-enter {\n animation: completion-menu-enter 0.15s ease-out;\n}\n@keyframes slideUp {\n\n 0% {\n transform: translateY(100%);\n }\n\n 100% {\n transform: translateY(0);\n }\n}\n.animate-slide-up {\n animation: slideUp 0.3s ease-out;\n}\n.cursor-\\[inherit\\] {\n cursor: inherit;\n}\n.cursor-pointer {\n cursor: pointer;\n}\n.cursor-text {\n cursor: text;\n}\n.select-none {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n.select-text {\n -webkit-user-select: text;\n -moz-user-select: text;\n user-select: text;\n}\n.list-none {\n list-style-type: none;\n}\n.appearance-none {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n.grid-cols-\\[80px_1fr\\] {\n grid-template-columns: 80px 1fr;\n}\n.grid-cols-\\[auto_1fr\\] {\n grid-template-columns: auto 1fr;\n}\n.flex-row {\n flex-direction: row;\n}\n.flex-col {\n flex-direction: column;\n}\n.items-start {\n align-items: flex-start;\n}\n.items-center {\n align-items: center;\n}\n.items-baseline {\n align-items: baseline;\n}\n.justify-center {\n justify-content: center;\n}\n.justify-between {\n justify-content: space-between;\n}\n.gap-0 {\n gap: 0px;\n}\n.gap-1 {\n gap: 0.25rem;\n}\n.gap-1\\.5 {\n gap: 0.375rem;\n}\n.gap-2 {\n gap: 0.5rem;\n}\n.gap-3 {\n gap: 0.75rem;\n}\n.gap-6 {\n gap: 1.5rem;\n}\n.gap-8 {\n gap: 2rem;\n}\n.gap-\\[2px\\] {\n gap: 2px;\n}\n.gap-\\[var\\(--app-list-gap\\)\\] {\n gap: var(--app-list-gap);\n}\n.gap-medium {\n gap: 8px;\n}\n.space-y-1 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(0.25rem * var(--tw-space-y-reverse));\n}\n.space-y-4 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(1rem * var(--tw-space-y-reverse));\n}\n.overflow-auto {\n overflow: auto;\n}\n.overflow-hidden {\n overflow: hidden;\n}\n.overflow-x-auto {\n overflow-x: auto;\n}\n.overflow-y-auto {\n overflow-y: auto;\n}\n.overflow-y-hidden {\n overflow-y: hidden;\n}\n.truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.text-ellipsis {\n text-overflow: ellipsis;\n}\n.whitespace-normal {\n white-space: normal;\n}\n.whitespace-nowrap {\n white-space: nowrap;\n}\n.whitespace-pre-wrap {\n white-space: pre-wrap;\n}\n.break-words {\n overflow-wrap: break-word;\n}\n.break-all {\n word-break: break-all;\n}\n.rounded {\n border-radius: 0.25rem;\n}\n.rounded-\\[2px\\] {\n border-radius: 2px;\n}\n.rounded-\\[4px\\] {\n border-radius: 4px;\n}\n.rounded-\\[var\\(--app-list-border-radius\\)\\] {\n border-radius: var(--app-list-border-radius);\n}\n.rounded-\\[var\\(--corner-radius-small\\)\\] {\n border-radius: var(--corner-radius-small);\n}\n.rounded-full {\n border-radius: 9999px;\n}\n.rounded-large {\n border-radius: 8px;\n}\n.rounded-lg {\n border-radius: 0.5rem;\n}\n.rounded-md {\n border-radius: 0.375rem;\n}\n.rounded-medium {\n border-radius: 6px;\n}\n.rounded-sm {\n border-radius: 0.125rem;\n}\n.rounded-small {\n border-radius: 4px;\n}\n.border {\n border-width: 1px;\n}\n.border-0 {\n border-width: 0px;\n}\n.border-b {\n border-bottom-width: 1px;\n}\n.border-b-2 {\n border-bottom-width: 2px;\n}\n.border-l-2 {\n border-left-width: 2px;\n}\n.border-t {\n border-top-width: 1px;\n}\n.border-none {\n border-style: none;\n}\n.border-\\[\\#74c991\\] {\n --tw-border-opacity: 1;\n border-color: rgb(116 201 145 / var(--tw-border-opacity, 1));\n}\n.border-\\[var\\(--app-input-border\\)\\] {\n border-color: var(--app-input-border);\n}\n.border-\\[var\\(--app-primary-border-color\\)\\] {\n border-color: var(--app-primary-border-color);\n}\n.border-gray-700 {\n --tw-border-opacity: 1;\n border-color: rgb(55 65 81 / var(--tw-border-opacity, 1));\n}\n.border-yellow-600 {\n --tw-border-opacity: 1;\n border-color: rgb(202 138 4 / var(--tw-border-opacity, 1));\n}\n.bg-\\[\\#1e1e1e\\] {\n --tw-bg-opacity: 1;\n background-color: rgb(30 30 30 / var(--tw-bg-opacity, 1));\n}\n.bg-\\[\\#2196f3\\] {\n --tw-bg-opacity: 1;\n background-color: rgb(33 150 243 / var(--tw-bg-opacity, 1));\n}\n.bg-\\[\\#2a2d2e\\] {\n --tw-bg-opacity: 1;\n background-color: rgb(42 45 46 / var(--tw-bg-opacity, 1));\n}\n.bg-\\[\\#4caf50\\] {\n --tw-bg-opacity: 1;\n background-color: rgb(76 175 80 / var(--tw-bg-opacity, 1));\n}\n.bg-\\[\\#4f46e5\\] {\n --tw-bg-opacity: 1;\n background-color: rgb(79 70 229 / var(--tw-bg-opacity, 1));\n}\n.bg-\\[\\#f44336\\] {\n --tw-bg-opacity: 1;\n background-color: rgb(244 67 54 / var(--tw-bg-opacity, 1));\n}\n.bg-\\[\\#ffc107\\] {\n --tw-bg-opacity: 1;\n background-color: rgb(255 193 7 / var(--tw-bg-opacity, 1));\n}\n.bg-\\[var\\(--app-header-background\\)\\] {\n background-color: var(--app-header-background);\n}\n.bg-\\[var\\(--app-input-background\\)\\] {\n background-color: var(--app-input-background);\n}\n.bg-\\[var\\(--app-list-active-background\\)\\] {\n background-color: var(--app-list-active-background);\n}\n.bg-\\[var\\(--app-menu-background\\)\\] {\n background-color: var(--app-menu-background);\n}\n.bg-\\[var\\(--app-primary-background\\)\\] {\n background-color: var(--app-primary-background);\n}\n.bg-\\[var\\(--app-primary-border-color\\)\\] {\n background-color: var(--app-primary-border-color);\n}\n.bg-\\[var\\(--app-secondary-foreground\\)\\] {\n background-color: var(--app-secondary-foreground);\n}\n.bg-gray-200 {\n --tw-bg-opacity: 1;\n background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(107 114 128 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-700 {\n --tw-bg-opacity: 1;\n background-color: rgb(55 65 81 / var(--tw-bg-opacity, 1));\n}\n.bg-indigo-600 {\n --tw-bg-opacity: 1;\n background-color: rgb(79 70 229 / var(--tw-bg-opacity, 1));\n}\n.bg-transparent {\n background-color: transparent;\n}\n.bg-yellow-700 {\n --tw-bg-opacity: 1;\n background-color: rgb(161 98 7 / var(--tw-bg-opacity, 1));\n}\n.bg-gradient-to-b {\n background-image: linear-gradient(to bottom, var(--tw-gradient-stops));\n}\n.from-transparent {\n --tw-gradient-from: transparent var(--tw-gradient-from-position);\n --tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\n}\n.to-\\[var\\(--app-primary-background\\)\\] {\n --tw-gradient-to: var(--app-primary-background) var(--tw-gradient-to-position);\n}\n.object-contain {\n -o-object-fit: contain;\n object-fit: contain;\n}\n.p-0 {\n padding: 0px;\n}\n.p-1 {\n padding: 0.25rem;\n}\n.p-2 {\n padding: 0.5rem;\n}\n.p-3 {\n padding: 0.75rem;\n}\n.p-4 {\n padding: 1rem;\n}\n.p-5 {\n padding: 1.25rem;\n}\n.p-\\[var\\(--app-list-item-padding\\)\\] {\n padding: var(--app-list-item-padding);\n}\n.p-\\[var\\(--app-list-padding\\)\\] {\n padding: var(--app-list-padding);\n}\n.p-large {\n padding: 12px;\n}\n.p-medium {\n padding: 8px;\n}\n.px-2 {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n.px-2\\.5 {\n padding-left: 0.625rem;\n padding-right: 0.625rem;\n}\n.px-3 {\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n}\n.px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n.py-0 {\n padding-top: 0px;\n padding-bottom: 0px;\n}\n.py-0\\.5 {\n padding-top: 0.125rem;\n padding-bottom: 0.125rem;\n}\n.py-1 {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n}\n.py-1\\.5 {\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n}\n.py-2 {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n.py-3 {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n}\n.pb-1 {\n padding-bottom: 0.25rem;\n}\n.pb-2 {\n padding-bottom: 0.5rem;\n}\n.pb-4 {\n padding-bottom: 1rem;\n}\n.pl-6 {\n padding-left: 1.5rem;\n}\n.pl-\\[30px\\] {\n padding-left: 30px;\n}\n.pr-2 {\n padding-right: 0.5rem;\n}\n.pt-\\[2px\\] {\n padding-top: 2px;\n}\n.text-left {\n text-align: left;\n}\n.text-center {\n text-align: center;\n}\n.align-middle {\n vertical-align: middle;\n}\n.font-mono {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;\n}\n.text-2xl {\n font-size: 1.5rem;\n line-height: 2rem;\n}\n.text-\\[0\\.85em\\] {\n font-size: 0.85em;\n}\n.text-\\[0\\.9em\\] {\n font-size: 0.9em;\n}\n.text-\\[1\\.1em\\] {\n font-size: 1.1em;\n}\n.text-\\[11px\\] {\n font-size: 11px;\n}\n.text-\\[12px\\] {\n font-size: 12px;\n}\n.text-\\[13px\\] {\n font-size: 13px;\n}\n.text-\\[14px\\] {\n font-size: 14px;\n}\n.text-\\[15px\\] {\n font-size: 15px;\n}\n.text-\\[16px\\] {\n font-size: 16px;\n}\n.text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n.text-xs {\n font-size: 0.75rem;\n line-height: 1rem;\n}\n.font-\\[600\\] {\n font-weight: 600;\n}\n.font-\\[var\\(--vscode-chat-font-family\\)\\] {\n font-weight: var(--vscode-chat-font-family);\n}\n.font-bold {\n font-weight: 700;\n}\n.font-medium {\n font-weight: 500;\n}\n.font-normal {\n font-weight: 400;\n}\n.font-semibold {\n font-weight: 600;\n}\n.italic {\n font-style: italic;\n}\n.leading-\\[1\\.5\\] {\n line-height: 1.5;\n}\n.leading-none {\n line-height: 1;\n}\n.leading-normal {\n line-height: 1.5;\n}\n.leading-relaxed {\n line-height: 1.625;\n}\n.text-\\[\\#a6e22e\\] {\n --tw-text-opacity: 1;\n color: rgb(166 226 46 / var(--tw-text-opacity, 1));\n}\n.text-\\[\\#c74e39\\] {\n --tw-text-opacity: 1;\n color: rgb(199 78 57 / var(--tw-text-opacity, 1));\n}\n.text-\\[\\#e1c08d\\] {\n --tw-text-opacity: 1;\n color: rgb(225 192 141 / var(--tw-text-opacity, 1));\n}\n.text-\\[var\\(--app-list-active-foreground\\)\\] {\n color: var(--app-list-active-foreground);\n}\n.text-\\[var\\(--app-menu-foreground\\)\\] {\n color: var(--app-menu-foreground);\n}\n.text-\\[var\\(--app-monospace-font-size\\)\\] {\n color: var(--app-monospace-font-size);\n}\n.text-\\[var\\(--app-primary-foreground\\)\\] {\n color: var(--app-primary-foreground);\n}\n.text-\\[var\\(--app-secondary-foreground\\)\\] {\n color: var(--app-secondary-foreground);\n}\n.text-\\[var\\(--vscode-chat-font-size\\2c 13px\\)\\] {\n color: var(--vscode-chat-font-size,13px);\n}\n.text-\\[var\\(--vscode-symbolIcon-fileForeground\\2c \\#cccccc\\)\\] {\n color: var(--vscode-symbolIcon-fileForeground,#cccccc);\n}\n.text-gray-200 {\n --tw-text-opacity: 1;\n color: rgb(229 231 235 / var(--tw-text-opacity, 1));\n}\n.text-gray-400 {\n --tw-text-opacity: 1;\n color: rgb(156 163 175 / var(--tw-text-opacity, 1));\n}\n.text-white {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.text-yellow-200 {\n --tw-text-opacity: 1;\n color: rgb(254 240 138 / var(--tw-text-opacity, 1));\n}\n.line-through {\n text-decoration-line: line-through;\n}\n.no-underline {\n text-decoration-line: none;\n}\n.opacity-50 {\n opacity: 0.5;\n}\n.opacity-60 {\n opacity: 0.6;\n}\n.opacity-70 {\n opacity: 0.7;\n}\n.opacity-80 {\n opacity: 0.8;\n}\n.opacity-85 {\n opacity: 0.85;\n}\n.opacity-90 {\n opacity: 0.9;\n}\n.shadow-\\[0_4px_16px_rgba\\(0\\2c 0\\2c 0\\2c 0\\.1\\)\\] {\n --tw-shadow: 0 4px 16px rgba(0,0,0,0.1);\n --tw-shadow-colored: 0 4px 16px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.shadow-\\[inset_0_0_0_1px_var\\(--app-transparent-inner-border\\)\\] {\n --tw-shadow: inset 0 0 0 1px var(--app-transparent-inner-border);\n --tw-shadow-colored: inset 0 0 0 1px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.shadow-lg {\n --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.shadow-sm {\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.outline-none {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.ring {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n.filter {\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.transition {\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-colors {\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.duration-100 {\n transition-duration: 100ms;\n}\n.duration-150 {\n transition-duration: 150ms;\n}\n.duration-200 {\n transition-duration: 200ms;\n}\n.ease-in-out {\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n}\n/* Multi-line clamp with ellipsis (Chromium-based webview supported) */\n.q-line-clamp-3 {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 3;\n overflow: hidden;\n }\n.\\[animation-delay\\:0\\.2s\\] {\n animation-delay: 0.2s;\n}\n.\\[animation-delay\\:0\\.4s\\] {\n animation-delay: 0.4s;\n}\n.\\[animation-delay\\:0s\\] {\n animation-delay: 0s;\n}\n\n/* ===========================\n Reusable Component Classes\n =========================== */\n\n/* ===========================\n Utilities\n =========================== */\n\n.placeholder\\:text-\\[var\\(--app-input-placeholder-foreground\\)\\]::-moz-placeholder {\n color: var(--app-input-placeholder-foreground);\n}\n\n.placeholder\\:text-\\[var\\(--app-input-placeholder-foreground\\)\\]::placeholder {\n color: var(--app-input-placeholder-foreground);\n}\n\n.placeholder\\:opacity-60::-moz-placeholder {\n opacity: 0.6;\n}\n\n.placeholder\\:opacity-60::placeholder {\n opacity: 0.6;\n}\n\n.placeholder\\:opacity-70::-moz-placeholder {\n opacity: 0.7;\n}\n\n.placeholder\\:opacity-70::placeholder {\n opacity: 0.7;\n}\n\n.before\\:absolute::before {\n content: var(--tw-content);\n position: absolute;\n}\n\n.before\\:left-\\[8px\\]::before {\n content: var(--tw-content);\n left: 8px;\n}\n\n.before\\:top-2::before {\n content: var(--tw-content);\n top: 0.5rem;\n}\n\n.before\\:z-\\[1\\]::before {\n content: var(--tw-content);\n z-index: 1;\n}\n\n@keyframes pulse {\n\n 50% {\n content: var(--tw-content);\n opacity: .5;\n }\n}\n\n.before\\:animate-pulse-slow::before {\n content: var(--tw-content);\n animation: pulse 1.5s infinite;\n}\n\n.before\\:text-\\[10px\\]::before {\n content: var(--tw-content);\n font-size: 10px;\n}\n\n.before\\:opacity-70::before {\n content: var(--tw-content);\n opacity: 0.7;\n}\n\n.before\\:content-\\[\\"\\\\\\\\25cf\\"\\]::before {\n --tw-content: "\\\\25cf";\n content: var(--tw-content);\n}\n\n.hover\\:relative:hover {\n position: relative;\n}\n\n.hover\\:border-0:hover {\n border-width: 0px;\n}\n\n.hover\\:bg-\\[\\#3a3d3e\\]:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(58 61 62 / var(--tw-bg-opacity, 1));\n}\n\n.hover\\:bg-\\[\\#4338ca\\]:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(67 56 202 / var(--tw-bg-opacity, 1));\n}\n\n.hover\\:bg-\\[var\\(--app-button-background\\)\\]:hover {\n background-color: var(--app-button-background);\n}\n\n.hover\\:bg-\\[var\\(--app-ghost-button-hover-background\\)\\]:hover {\n background-color: var(--app-ghost-button-hover-background);\n}\n\n.hover\\:bg-\\[var\\(--app-list-hover-background\\)\\]:hover {\n background-color: var(--app-list-hover-background);\n}\n\n.hover\\:bg-gray-600:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(75 85 99 / var(--tw-bg-opacity, 1));\n}\n\n.hover\\:bg-indigo-700:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(67 56 202 / var(--tw-bg-opacity, 1));\n}\n\n.hover\\:bg-yellow-600:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(202 138 4 / var(--tw-bg-opacity, 1));\n}\n\n.hover\\:font-bold:hover {\n font-weight: 700;\n}\n\n.hover\\:text-\\[var\\(--app-button-foreground\\)\\]:hover {\n color: var(--app-button-foreground);\n}\n\n.hover\\:text-\\[var\\(--app-primary-foreground\\)\\]:hover {\n color: var(--app-primary-foreground);\n}\n\n.hover\\:text-gray-200:hover {\n --tw-text-opacity: 1;\n color: rgb(229 231 235 / var(--tw-text-opacity, 1));\n}\n\n.hover\\:underline:hover {\n text-decoration-line: underline;\n}\n\n.hover\\:no-underline:hover {\n text-decoration-line: none;\n}\n\n.focus\\:rounded-\\[2px\\]:focus {\n border-radius: 2px;\n}\n\n.focus\\:bg-\\[var\\(--app-ghost-button-hover-background\\)\\]:focus {\n background-color: var(--app-ghost-button-hover-background);\n}\n\n.focus\\:outline:focus {\n outline-style: solid;\n}\n\n.focus\\:outline-1:focus {\n outline-width: 1px;\n}\n\n.focus\\:outline-offset-2:focus {\n outline-offset: 2px;\n}\n\n.focus\\:outline-\\[var\\(--vscode-focusBorder\\)\\]:focus {\n outline-color: var(--vscode-focusBorder);\n}\n\n.active\\:opacity-80:active {\n opacity: 0.8;\n}\n\n@media (min-width: 640px) {\n\n .sm\\:inline {\n display: inline;\n }\n}\n\n@media (min-width: 768px) {\n\n .md\\:p-10 {\n padding: 2.5rem;\n }\n}\n\n@media (prefers-color-scheme: dark) {\n\n .dark\\:opacity-60 {\n opacity: 0.6;\n }\n}\n\n.\\[\\&\\:not\\(\\:first-child\\)\\]\\:mt-2:not(:first-child) {\n margin-top: 0.5rem;\n}\n\n.\\[\\&\\>svg\\]\\:h-5>svg {\n height: 1.25rem;\n}\n\n.\\[\\&\\>svg\\]\\:w-5>svg {\n width: 1.25rem;\n}\n'; document.head.appendChild(style); })(); diff --git a/packages/chrome-qwen-bridge/extension/sidepanel/sidepanel-app.js.map b/packages/chrome-qwen-bridge/extension/sidepanel/sidepanel-app.js.map index 49c8e094..8dc4de76 100644 --- a/packages/chrome-qwen-bridge/extension/sidepanel/sidepanel-app.js.map +++ b/packages/chrome-qwen-bridge/extension/sidepanel/sidepanel-app.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../../../node_modules/scheduler/cjs/scheduler.development.js", "../../../../node_modules/scheduler/index.js", "../../../../node_modules/react/cjs/react.development.js", "../../../../node_modules/react/index.js", "../../../../node_modules/react-dom/cjs/react-dom.development.js", "../../../../node_modules/react-dom/index.js", "../../../../node_modules/react-dom/cjs/react-dom-client.development.js", "../../../../node_modules/react-dom/client.js", "../../../../node_modules/react/cjs/react-jsx-runtime.development.js", "../../../../node_modules/react/jsx-runtime.js", "../../src/sidepanel/index.tsx", "../../src/sidepanel/App.tsx", "../../src/sidepanel/hooks/useVSCode.ts", "../../src/sidepanel/components/icons/FileIcons.tsx", "../../src/sidepanel/components/icons/NavigationIcons.tsx", "../../src/sidepanel/components/icons/EditIcons.tsx", "../../src/sidepanel/components/icons/StatusIcons.tsx", "../../src/sidepanel/components/icons/SpecialIcons.tsx", "../../src/sidepanel/components/icons/StopIcon.tsx", "../../src/sidepanel/components/layout/CompletionMenu.tsx", "../../src/sidepanel/types/approvalModeTypes.ts", "../../src/sidepanel/components/layout/InputForm.tsx", "../../src/sidepanel/utils/resourceUrl.ts", "../../src/sidepanel/components/layout/EmptyState.tsx", "../../../../node_modules/markdown-it/lib/common/utils.mjs", "../../../../node_modules/mdurl/index.mjs", "../../../../node_modules/mdurl/lib/decode.mjs", "../../../../node_modules/mdurl/lib/encode.mjs", "../../../../node_modules/mdurl/lib/format.mjs", "../../../../node_modules/mdurl/lib/parse.mjs", "../../../../node_modules/uc.micro/index.mjs", "../../../../node_modules/uc.micro/properties/Any/regex.mjs", "../../../../node_modules/uc.micro/categories/Cc/regex.mjs", "../../../../node_modules/uc.micro/categories/Cf/regex.mjs", "../../../../node_modules/uc.micro/categories/P/regex.mjs", "../../../../node_modules/uc.micro/categories/S/regex.mjs", "../../../../node_modules/uc.micro/categories/Z/regex.mjs", "https://raw.githubusercontent.com/fb55/entities/61afd4701eaa736978b13c7351cd3de9a96b04bc/src/generated/decode-data-html.ts", "https://raw.githubusercontent.com/fb55/entities/61afd4701eaa736978b13c7351cd3de9a96b04bc/src/generated/decode-data-xml.ts", "https://raw.githubusercontent.com/fb55/entities/61afd4701eaa736978b13c7351cd3de9a96b04bc/src/decode_codepoint.ts", "https://raw.githubusercontent.com/fb55/entities/61afd4701eaa736978b13c7351cd3de9a96b04bc/src/decode.ts", "https://raw.githubusercontent.com/fb55/entities/61afd4701eaa736978b13c7351cd3de9a96b04bc/src/generated/encode-html.ts", "https://raw.githubusercontent.com/fb55/entities/61afd4701eaa736978b13c7351cd3de9a96b04bc/src/escape.ts", "https://raw.githubusercontent.com/fb55/entities/61afd4701eaa736978b13c7351cd3de9a96b04bc/src/index.ts", "../../../../node_modules/markdown-it/lib/helpers/index.mjs", "../../../../node_modules/markdown-it/lib/helpers/parse_link_label.mjs", "../../../../node_modules/markdown-it/lib/helpers/parse_link_destination.mjs", "../../../../node_modules/markdown-it/lib/helpers/parse_link_title.mjs", "../../../../node_modules/markdown-it/lib/renderer.mjs", "../../../../node_modules/markdown-it/lib/ruler.mjs", "../../../../node_modules/markdown-it/lib/token.mjs", "../../../../node_modules/markdown-it/lib/rules_core/state_core.mjs", "../../../../node_modules/markdown-it/lib/rules_core/normalize.mjs", "../../../../node_modules/markdown-it/lib/rules_core/block.mjs", "../../../../node_modules/markdown-it/lib/rules_core/inline.mjs", "../../../../node_modules/markdown-it/lib/rules_core/linkify.mjs", "../../../../node_modules/markdown-it/lib/rules_core/replacements.mjs", "../../../../node_modules/markdown-it/lib/rules_core/smartquotes.mjs", "../../../../node_modules/markdown-it/lib/rules_core/text_join.mjs", "../../../../node_modules/markdown-it/lib/parser_core.mjs", "../../../../node_modules/markdown-it/lib/rules_block/state_block.mjs", "../../../../node_modules/markdown-it/lib/rules_block/table.mjs", "../../../../node_modules/markdown-it/lib/rules_block/code.mjs", "../../../../node_modules/markdown-it/lib/rules_block/fence.mjs", "../../../../node_modules/markdown-it/lib/rules_block/blockquote.mjs", "../../../../node_modules/markdown-it/lib/rules_block/hr.mjs", "../../../../node_modules/markdown-it/lib/rules_block/list.mjs", "../../../../node_modules/markdown-it/lib/rules_block/reference.mjs", "../../../../node_modules/markdown-it/lib/common/html_blocks.mjs", "../../../../node_modules/markdown-it/lib/common/html_re.mjs", "../../../../node_modules/markdown-it/lib/rules_block/html_block.mjs", "../../../../node_modules/markdown-it/lib/rules_block/heading.mjs", "../../../../node_modules/markdown-it/lib/rules_block/lheading.mjs", "../../../../node_modules/markdown-it/lib/rules_block/paragraph.mjs", "../../../../node_modules/markdown-it/lib/parser_block.mjs", "../../../../node_modules/markdown-it/lib/rules_inline/state_inline.mjs", "../../../../node_modules/markdown-it/lib/rules_inline/text.mjs", "../../../../node_modules/markdown-it/lib/rules_inline/linkify.mjs", "../../../../node_modules/markdown-it/lib/rules_inline/newline.mjs", "../../../../node_modules/markdown-it/lib/rules_inline/escape.mjs", "../../../../node_modules/markdown-it/lib/rules_inline/backticks.mjs", "../../../../node_modules/markdown-it/lib/rules_inline/strikethrough.mjs", "../../../../node_modules/markdown-it/lib/rules_inline/emphasis.mjs", "../../../../node_modules/markdown-it/lib/rules_inline/link.mjs", "../../../../node_modules/markdown-it/lib/rules_inline/image.mjs", "../../../../node_modules/markdown-it/lib/rules_inline/autolink.mjs", "../../../../node_modules/markdown-it/lib/rules_inline/html_inline.mjs", "../../../../node_modules/markdown-it/lib/rules_inline/entity.mjs", "../../../../node_modules/markdown-it/lib/rules_inline/balance_pairs.mjs", "../../../../node_modules/markdown-it/lib/rules_inline/fragments_join.mjs", "../../../../node_modules/markdown-it/lib/parser_inline.mjs", "../../../../node_modules/linkify-it/lib/re.mjs", "../../../../node_modules/linkify-it/index.mjs", "../../../../node_modules/punycode.js/punycode.es6.js", "../../../../node_modules/markdown-it/lib/presets/default.mjs", "../../../../node_modules/markdown-it/lib/presets/zero.mjs", "../../../../node_modules/markdown-it/lib/presets/commonmark.mjs", "../../../../node_modules/markdown-it/lib/index.mjs", "../../src/sidepanel/components/messages/MarkdownRenderer/MarkdownRenderer.css", "../../src/sidepanel/components/messages/MarkdownRenderer/MarkdownRenderer.tsx", "../../src/sidepanel/components/messages/MessageContent.tsx", "../../src/sidepanel/components/messages/UserMessage.tsx", "../../src/sidepanel/components/messages/Assistant/AssistantMessage.css", "../../src/sidepanel/components/messages/Assistant/AssistantMessage.tsx", "../../src/sidepanel/components/messages/ThinkingMessage.tsx", "../../src/sidepanel/components/messages/Waiting/WaitingMessage.tsx", "../../src/sidepanel/components/messages/Waiting/WaitingMessage.css", "../../src/sidepanel/constants/loadingMessages.ts", "../../src/sidepanel/components/messages/Waiting/InterruptedMessage.tsx", "../../src/sidepanel/components/PermissionDrawer/PermissionDrawer.tsx", "../../src/sidepanel/styles/tailwind.css", "../../src/sidepanel/styles/App.css", "../../src/sidepanel/styles/styles.css"], - "sourcesContent": ["/**\n * @license React\n * scheduler.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 performWorkUntilDeadline() {\n needsPaint = !1;\n if (isMessageLoopRunning) {\n var currentTime = exports.unstable_now();\n startTime = currentTime;\n var hasMoreWork = !0;\n try {\n a: {\n isHostCallbackScheduled = !1;\n isHostTimeoutScheduled &&\n ((isHostTimeoutScheduled = !1),\n localClearTimeout(taskTimeoutID),\n (taskTimeoutID = -1));\n isPerformingWork = !0;\n var previousPriorityLevel = currentPriorityLevel;\n try {\n b: {\n advanceTimers(currentTime);\n for (\n currentTask = peek(taskQueue);\n null !== currentTask &&\n !(\n currentTask.expirationTime > currentTime &&\n shouldYieldToHost()\n );\n\n ) {\n var callback = currentTask.callback;\n if (\"function\" === typeof callback) {\n currentTask.callback = null;\n currentPriorityLevel = currentTask.priorityLevel;\n var continuationCallback = callback(\n currentTask.expirationTime <= currentTime\n );\n currentTime = exports.unstable_now();\n if (\"function\" === typeof continuationCallback) {\n currentTask.callback = continuationCallback;\n advanceTimers(currentTime);\n hasMoreWork = !0;\n break b;\n }\n currentTask === peek(taskQueue) && pop(taskQueue);\n advanceTimers(currentTime);\n } else pop(taskQueue);\n currentTask = peek(taskQueue);\n }\n if (null !== currentTask) hasMoreWork = !0;\n else {\n var firstTimer = peek(timerQueue);\n null !== firstTimer &&\n requestHostTimeout(\n handleTimeout,\n firstTimer.startTime - currentTime\n );\n hasMoreWork = !1;\n }\n }\n break a;\n } finally {\n (currentTask = null),\n (currentPriorityLevel = previousPriorityLevel),\n (isPerformingWork = !1);\n }\n hasMoreWork = void 0;\n }\n } finally {\n hasMoreWork\n ? schedulePerformWorkUntilDeadline()\n : (isMessageLoopRunning = !1);\n }\n }\n }\n function push(heap, node) {\n var index = heap.length;\n heap.push(node);\n a: for (; 0 < index; ) {\n var parentIndex = (index - 1) >>> 1,\n parent = heap[parentIndex];\n if (0 < compare(parent, node))\n (heap[parentIndex] = node),\n (heap[index] = parent),\n (index = parentIndex);\n else break a;\n }\n }\n function peek(heap) {\n return 0 === heap.length ? null : heap[0];\n }\n function pop(heap) {\n if (0 === heap.length) return null;\n var first = heap[0],\n last = heap.pop();\n if (last !== first) {\n heap[0] = last;\n a: for (\n var index = 0, length = heap.length, halfLength = length >>> 1;\n index < halfLength;\n\n ) {\n var leftIndex = 2 * (index + 1) - 1,\n left = heap[leftIndex],\n rightIndex = leftIndex + 1,\n right = heap[rightIndex];\n if (0 > compare(left, last))\n rightIndex < length && 0 > compare(right, left)\n ? ((heap[index] = right),\n (heap[rightIndex] = last),\n (index = rightIndex))\n : ((heap[index] = left),\n (heap[leftIndex] = last),\n (index = leftIndex));\n else if (rightIndex < length && 0 > compare(right, last))\n (heap[index] = right),\n (heap[rightIndex] = last),\n (index = rightIndex);\n else break a;\n }\n }\n return first;\n }\n function compare(a, b) {\n var diff = a.sortIndex - b.sortIndex;\n return 0 !== diff ? diff : a.id - b.id;\n }\n function advanceTimers(currentTime) {\n for (var timer = peek(timerQueue); null !== timer; ) {\n if (null === timer.callback) pop(timerQueue);\n else if (timer.startTime <= currentTime)\n pop(timerQueue),\n (timer.sortIndex = timer.expirationTime),\n push(taskQueue, timer);\n else break;\n timer = peek(timerQueue);\n }\n }\n function handleTimeout(currentTime) {\n isHostTimeoutScheduled = !1;\n advanceTimers(currentTime);\n if (!isHostCallbackScheduled)\n if (null !== peek(taskQueue))\n (isHostCallbackScheduled = !0),\n isMessageLoopRunning ||\n ((isMessageLoopRunning = !0), schedulePerformWorkUntilDeadline());\n else {\n var firstTimer = peek(timerQueue);\n null !== firstTimer &&\n requestHostTimeout(\n handleTimeout,\n firstTimer.startTime - currentTime\n );\n }\n }\n function shouldYieldToHost() {\n return needsPaint\n ? !0\n : exports.unstable_now() - startTime < frameInterval\n ? !1\n : !0;\n }\n function requestHostTimeout(callback, ms) {\n taskTimeoutID = localSetTimeout(function () {\n callback(exports.unstable_now());\n }, ms);\n }\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());\n exports.unstable_now = void 0;\n if (\n \"object\" === typeof performance &&\n \"function\" === typeof performance.now\n ) {\n var localPerformance = performance;\n exports.unstable_now = function () {\n return localPerformance.now();\n };\n } else {\n var localDate = Date,\n initialTime = localDate.now();\n exports.unstable_now = function () {\n return localDate.now() - initialTime;\n };\n }\n var taskQueue = [],\n timerQueue = [],\n taskIdCounter = 1,\n currentTask = null,\n currentPriorityLevel = 3,\n isPerformingWork = !1,\n isHostCallbackScheduled = !1,\n isHostTimeoutScheduled = !1,\n needsPaint = !1,\n localSetTimeout = \"function\" === typeof setTimeout ? setTimeout : null,\n localClearTimeout =\n \"function\" === typeof clearTimeout ? clearTimeout : null,\n localSetImmediate =\n \"undefined\" !== typeof setImmediate ? setImmediate : null,\n isMessageLoopRunning = !1,\n taskTimeoutID = -1,\n frameInterval = 5,\n startTime = -1;\n if (\"function\" === typeof localSetImmediate)\n var schedulePerformWorkUntilDeadline = function () {\n localSetImmediate(performWorkUntilDeadline);\n };\n else if (\"undefined\" !== typeof MessageChannel) {\n var channel = new MessageChannel(),\n port = channel.port2;\n channel.port1.onmessage = performWorkUntilDeadline;\n schedulePerformWorkUntilDeadline = function () {\n port.postMessage(null);\n };\n } else\n schedulePerformWorkUntilDeadline = function () {\n localSetTimeout(performWorkUntilDeadline, 0);\n };\n exports.unstable_IdlePriority = 5;\n exports.unstable_ImmediatePriority = 1;\n exports.unstable_LowPriority = 4;\n exports.unstable_NormalPriority = 3;\n exports.unstable_Profiling = null;\n exports.unstable_UserBlockingPriority = 2;\n exports.unstable_cancelCallback = function (task) {\n task.callback = null;\n };\n exports.unstable_forceFrameRate = function (fps) {\n 0 > fps || 125 < fps\n ? console.error(\n \"forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported\"\n )\n : (frameInterval = 0 < fps ? Math.floor(1e3 / fps) : 5);\n };\n exports.unstable_getCurrentPriorityLevel = function () {\n return currentPriorityLevel;\n };\n exports.unstable_next = function (eventHandler) {\n switch (currentPriorityLevel) {\n case 1:\n case 2:\n case 3:\n var priorityLevel = 3;\n break;\n default:\n priorityLevel = currentPriorityLevel;\n }\n var previousPriorityLevel = currentPriorityLevel;\n currentPriorityLevel = priorityLevel;\n try {\n return eventHandler();\n } finally {\n currentPriorityLevel = previousPriorityLevel;\n }\n };\n exports.unstable_requestPaint = function () {\n needsPaint = !0;\n };\n exports.unstable_runWithPriority = function (priorityLevel, eventHandler) {\n switch (priorityLevel) {\n case 1:\n case 2:\n case 3:\n case 4:\n case 5:\n break;\n default:\n priorityLevel = 3;\n }\n var previousPriorityLevel = currentPriorityLevel;\n currentPriorityLevel = priorityLevel;\n try {\n return eventHandler();\n } finally {\n currentPriorityLevel = previousPriorityLevel;\n }\n };\n exports.unstable_scheduleCallback = function (\n priorityLevel,\n callback,\n options\n ) {\n var currentTime = exports.unstable_now();\n \"object\" === typeof options && null !== options\n ? ((options = options.delay),\n (options =\n \"number\" === typeof options && 0 < options\n ? currentTime + options\n : currentTime))\n : (options = currentTime);\n switch (priorityLevel) {\n case 1:\n var timeout = -1;\n break;\n case 2:\n timeout = 250;\n break;\n case 5:\n timeout = 1073741823;\n break;\n case 4:\n timeout = 1e4;\n break;\n default:\n timeout = 5e3;\n }\n timeout = options + timeout;\n priorityLevel = {\n id: taskIdCounter++,\n callback: callback,\n priorityLevel: priorityLevel,\n startTime: options,\n expirationTime: timeout,\n sortIndex: -1\n };\n options > currentTime\n ? ((priorityLevel.sortIndex = options),\n push(timerQueue, priorityLevel),\n null === peek(taskQueue) &&\n priorityLevel === peek(timerQueue) &&\n (isHostTimeoutScheduled\n ? (localClearTimeout(taskTimeoutID), (taskTimeoutID = -1))\n : (isHostTimeoutScheduled = !0),\n requestHostTimeout(handleTimeout, options - currentTime)))\n : ((priorityLevel.sortIndex = timeout),\n push(taskQueue, priorityLevel),\n isHostCallbackScheduled ||\n isPerformingWork ||\n ((isHostCallbackScheduled = !0),\n isMessageLoopRunning ||\n ((isMessageLoopRunning = !0),\n schedulePerformWorkUntilDeadline())));\n return priorityLevel;\n };\n exports.unstable_shouldYield = shouldYieldToHost;\n exports.unstable_wrapCallback = function (callback) {\n var parentPriorityLevel = currentPriorityLevel;\n return function () {\n var previousPriorityLevel = currentPriorityLevel;\n currentPriorityLevel = parentPriorityLevel;\n try {\n return callback.apply(this, arguments);\n } finally {\n currentPriorityLevel = previousPriorityLevel;\n }\n };\n };\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());\n })();\n", "'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/scheduler.production.js');\n} else {\n module.exports = require('./cjs/scheduler.development.js');\n}\n", "/**\n * @license React\n * react.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 defineDeprecationWarning(methodName, info) {\n Object.defineProperty(Component.prototype, methodName, {\n get: function () {\n console.warn(\n \"%s(...) is deprecated in plain JavaScript React classes. %s\",\n info[0],\n info[1]\n );\n }\n });\n }\n function getIteratorFn(maybeIterable) {\n if (null === maybeIterable || \"object\" !== typeof maybeIterable)\n return null;\n maybeIterable =\n (MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL]) ||\n maybeIterable[\"@@iterator\"];\n return \"function\" === typeof maybeIterable ? maybeIterable : null;\n }\n function warnNoop(publicInstance, callerName) {\n publicInstance =\n ((publicInstance = publicInstance.constructor) &&\n (publicInstance.displayName || publicInstance.name)) ||\n \"ReactClass\";\n var warningKey = publicInstance + \".\" + callerName;\n didWarnStateUpdateForUnmountedComponent[warningKey] ||\n (console.error(\n \"Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.\",\n callerName,\n publicInstance\n ),\n (didWarnStateUpdateForUnmountedComponent[warningKey] = !0));\n }\n function Component(props, context, updater) {\n this.props = props;\n this.context = context;\n this.refs = emptyObject;\n this.updater = updater || ReactNoopUpdateQueue;\n }\n function ComponentDummy() {}\n function PureComponent(props, context, updater) {\n this.props = props;\n this.context = context;\n this.refs = emptyObject;\n this.updater = updater || ReactNoopUpdateQueue;\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 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\") + \".Provider\";\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 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(\n type,\n key,\n self,\n source,\n owner,\n props,\n debugStack,\n debugTask\n ) {\n self = 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 !== self ? self : 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 cloneAndReplaceKey(oldElement, newKey) {\n newKey = ReactElement(\n oldElement.type,\n newKey,\n void 0,\n void 0,\n oldElement._owner,\n oldElement.props,\n oldElement._debugStack,\n oldElement._debugTask\n );\n oldElement._store &&\n (newKey._store.validated = oldElement._store.validated);\n return newKey;\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n function escape(key) {\n var escaperLookup = { \"=\": \"=0\", \":\": \"=2\" };\n return (\n \"$\" +\n key.replace(/[=:]/g, function (match) {\n return escaperLookup[match];\n })\n );\n }\n function getElementKey(element, index) {\n return \"object\" === typeof element &&\n null !== element &&\n null != element.key\n ? (checkKeyStringCoercion(element.key), escape(\"\" + element.key))\n : index.toString(36);\n }\n function noop$1() {}\n function resolveThenable(thenable) {\n switch (thenable.status) {\n case \"fulfilled\":\n return thenable.value;\n case \"rejected\":\n throw thenable.reason;\n default:\n switch (\n (\"string\" === typeof thenable.status\n ? thenable.then(noop$1, noop$1)\n : ((thenable.status = \"pending\"),\n thenable.then(\n function (fulfilledValue) {\n \"pending\" === thenable.status &&\n ((thenable.status = \"fulfilled\"),\n (thenable.value = fulfilledValue));\n },\n function (error) {\n \"pending\" === thenable.status &&\n ((thenable.status = \"rejected\"),\n (thenable.reason = error));\n }\n )),\n thenable.status)\n ) {\n case \"fulfilled\":\n return thenable.value;\n case \"rejected\":\n throw thenable.reason;\n }\n }\n throw thenable;\n }\n function mapIntoArray(children, array, escapedPrefix, nameSoFar, callback) {\n var type = typeof children;\n if (\"undefined\" === type || \"boolean\" === type) children = null;\n var invokeCallback = !1;\n if (null === children) invokeCallback = !0;\n else\n switch (type) {\n case \"bigint\":\n case \"string\":\n case \"number\":\n invokeCallback = !0;\n break;\n case \"object\":\n switch (children.$$typeof) {\n case REACT_ELEMENT_TYPE:\n case REACT_PORTAL_TYPE:\n invokeCallback = !0;\n break;\n case REACT_LAZY_TYPE:\n return (\n (invokeCallback = children._init),\n mapIntoArray(\n invokeCallback(children._payload),\n array,\n escapedPrefix,\n nameSoFar,\n callback\n )\n );\n }\n }\n if (invokeCallback) {\n invokeCallback = children;\n callback = callback(invokeCallback);\n var childKey =\n \"\" === nameSoFar ? \".\" + getElementKey(invokeCallback, 0) : nameSoFar;\n isArrayImpl(callback)\n ? ((escapedPrefix = \"\"),\n null != childKey &&\n (escapedPrefix =\n childKey.replace(userProvidedKeyEscapeRegex, \"$&/\") + \"/\"),\n mapIntoArray(callback, array, escapedPrefix, \"\", function (c) {\n return c;\n }))\n : null != callback &&\n (isValidElement(callback) &&\n (null != callback.key &&\n ((invokeCallback && invokeCallback.key === callback.key) ||\n checkKeyStringCoercion(callback.key)),\n (escapedPrefix = cloneAndReplaceKey(\n callback,\n escapedPrefix +\n (null == callback.key ||\n (invokeCallback && invokeCallback.key === callback.key)\n ? \"\"\n : (\"\" + callback.key).replace(\n userProvidedKeyEscapeRegex,\n \"$&/\"\n ) + \"/\") +\n childKey\n )),\n \"\" !== nameSoFar &&\n null != invokeCallback &&\n isValidElement(invokeCallback) &&\n null == invokeCallback.key &&\n invokeCallback._store &&\n !invokeCallback._store.validated &&\n (escapedPrefix._store.validated = 2),\n (callback = escapedPrefix)),\n array.push(callback));\n return 1;\n }\n invokeCallback = 0;\n childKey = \"\" === nameSoFar ? \".\" : nameSoFar + \":\";\n if (isArrayImpl(children))\n for (var i = 0; i < children.length; i++)\n (nameSoFar = children[i]),\n (type = childKey + getElementKey(nameSoFar, i)),\n (invokeCallback += mapIntoArray(\n nameSoFar,\n array,\n escapedPrefix,\n type,\n callback\n ));\n else if (((i = getIteratorFn(children)), \"function\" === typeof i))\n for (\n i === children.entries &&\n (didWarnAboutMaps ||\n console.warn(\n \"Using Maps as children is not supported. Use an array of keyed ReactElements instead.\"\n ),\n (didWarnAboutMaps = !0)),\n children = i.call(children),\n i = 0;\n !(nameSoFar = children.next()).done;\n\n )\n (nameSoFar = nameSoFar.value),\n (type = childKey + getElementKey(nameSoFar, i++)),\n (invokeCallback += mapIntoArray(\n nameSoFar,\n array,\n escapedPrefix,\n type,\n callback\n ));\n else if (\"object\" === type) {\n if (\"function\" === typeof children.then)\n return mapIntoArray(\n resolveThenable(children),\n array,\n escapedPrefix,\n nameSoFar,\n callback\n );\n array = String(children);\n throw Error(\n \"Objects are not valid as a React child (found: \" +\n (\"[object Object]\" === array\n ? \"object with keys {\" + Object.keys(children).join(\", \") + \"}\"\n : array) +\n \"). If you meant to render a collection of children, use an array instead.\"\n );\n }\n return invokeCallback;\n }\n function mapChildren(children, func, context) {\n if (null == children) return children;\n var result = [],\n count = 0;\n mapIntoArray(children, result, \"\", \"\", function (child) {\n return func.call(context, child, count++);\n });\n return result;\n }\n function lazyInitializer(payload) {\n if (-1 === payload._status) {\n var ctor = payload._result;\n ctor = ctor();\n ctor.then(\n function (moduleObject) {\n if (0 === payload._status || -1 === payload._status)\n (payload._status = 1), (payload._result = moduleObject);\n },\n function (error) {\n if (0 === payload._status || -1 === payload._status)\n (payload._status = 2), (payload._result = error);\n }\n );\n -1 === payload._status &&\n ((payload._status = 0), (payload._result = ctor));\n }\n if (1 === payload._status)\n return (\n (ctor = payload._result),\n void 0 === ctor &&\n console.error(\n \"lazy: Expected the result of a dynamic import() call. Instead received: %s\\n\\nYour code should look like: \\n const MyComponent = lazy(() => import('./MyComponent'))\\n\\nDid you accidentally put curly braces around the import?\",\n ctor\n ),\n \"default\" in ctor ||\n console.error(\n \"lazy: Expected the result of a dynamic import() call. Instead received: %s\\n\\nYour code should look like: \\n const MyComponent = lazy(() => import('./MyComponent'))\",\n ctor\n ),\n ctor.default\n );\n throw payload._result;\n }\n function resolveDispatcher() {\n var dispatcher = ReactSharedInternals.H;\n null === dispatcher &&\n console.error(\n \"Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\\n1. You might have mismatching versions of React and the renderer (such as React DOM)\\n2. You might be breaking the Rules of Hooks\\n3. You might have more than one copy of React in the same app\\nSee https://react.dev/link/invalid-hook-call for tips about how to debug and fix this problem.\"\n );\n return dispatcher;\n }\n function noop() {}\n function enqueueTask(task) {\n if (null === enqueueTaskImpl)\n try {\n var requireString = (\"require\" + Math.random()).slice(0, 7);\n enqueueTaskImpl = (module && module[requireString]).call(\n module,\n \"timers\"\n ).setImmediate;\n } catch (_err) {\n enqueueTaskImpl = function (callback) {\n !1 === didWarnAboutMessageChannel &&\n ((didWarnAboutMessageChannel = !0),\n \"undefined\" === typeof MessageChannel &&\n console.error(\n \"This browser does not have a MessageChannel implementation, so enqueuing tasks via await act(async () => ...) will fail. Please file an issue at https://github.com/facebook/react/issues if you encounter this warning.\"\n ));\n var channel = new MessageChannel();\n channel.port1.onmessage = callback;\n channel.port2.postMessage(void 0);\n };\n }\n return enqueueTaskImpl(task);\n }\n function aggregateErrors(errors) {\n return 1 < errors.length && \"function\" === typeof AggregateError\n ? new AggregateError(errors)\n : errors[0];\n }\n function popActScope(prevActQueue, prevActScopeDepth) {\n prevActScopeDepth !== actScopeDepth - 1 &&\n console.error(\n \"You seem to have overlapping act() calls, this is not supported. Be sure to await previous act() calls before making a new one. \"\n );\n actScopeDepth = prevActScopeDepth;\n }\n function recursivelyFlushAsyncActWork(returnValue, resolve, reject) {\n var queue = ReactSharedInternals.actQueue;\n if (null !== queue)\n if (0 !== queue.length)\n try {\n flushActQueue(queue);\n enqueueTask(function () {\n return recursivelyFlushAsyncActWork(returnValue, resolve, reject);\n });\n return;\n } catch (error) {\n ReactSharedInternals.thrownErrors.push(error);\n }\n else ReactSharedInternals.actQueue = null;\n 0 < ReactSharedInternals.thrownErrors.length\n ? ((queue = aggregateErrors(ReactSharedInternals.thrownErrors)),\n (ReactSharedInternals.thrownErrors.length = 0),\n reject(queue))\n : resolve(returnValue);\n }\n function flushActQueue(queue) {\n if (!isFlushing) {\n isFlushing = !0;\n var i = 0;\n try {\n for (; i < queue.length; i++) {\n var callback = queue[i];\n do {\n ReactSharedInternals.didUsePromise = !1;\n var continuation = callback(!1);\n if (null !== continuation) {\n if (ReactSharedInternals.didUsePromise) {\n queue[i] = callback;\n queue.splice(0, i);\n return;\n }\n callback = continuation;\n } else break;\n } while (1);\n }\n queue.length = 0;\n } catch (error) {\n queue.splice(0, i + 1), ReactSharedInternals.thrownErrors.push(error);\n } finally {\n isFlushing = !1;\n }\n }\n }\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());\n var 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 Symbol.for(\"react.provider\");\n var 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 MAYBE_ITERATOR_SYMBOL = Symbol.iterator,\n didWarnStateUpdateForUnmountedComponent = {},\n ReactNoopUpdateQueue = {\n isMounted: function () {\n return !1;\n },\n enqueueForceUpdate: function (publicInstance) {\n warnNoop(publicInstance, \"forceUpdate\");\n },\n enqueueReplaceState: function (publicInstance) {\n warnNoop(publicInstance, \"replaceState\");\n },\n enqueueSetState: function (publicInstance) {\n warnNoop(publicInstance, \"setState\");\n }\n },\n assign = Object.assign,\n emptyObject = {};\n Object.freeze(emptyObject);\n Component.prototype.isReactComponent = {};\n Component.prototype.setState = function (partialState, callback) {\n if (\n \"object\" !== typeof partialState &&\n \"function\" !== typeof partialState &&\n null != partialState\n )\n throw Error(\n \"takes an object of state variables to update or a function which returns an object of state variables.\"\n );\n this.updater.enqueueSetState(this, partialState, callback, \"setState\");\n };\n Component.prototype.forceUpdate = function (callback) {\n this.updater.enqueueForceUpdate(this, callback, \"forceUpdate\");\n };\n var deprecatedAPIs = {\n isMounted: [\n \"isMounted\",\n \"Instead, make sure to clean up subscriptions and pending requests in componentWillUnmount to prevent memory leaks.\"\n ],\n replaceState: [\n \"replaceState\",\n \"Refactor your code to use setState instead (see https://github.com/facebook/react/issues/3236).\"\n ]\n },\n fnName;\n for (fnName in deprecatedAPIs)\n deprecatedAPIs.hasOwnProperty(fnName) &&\n defineDeprecationWarning(fnName, deprecatedAPIs[fnName]);\n ComponentDummy.prototype = Component.prototype;\n deprecatedAPIs = PureComponent.prototype = new ComponentDummy();\n deprecatedAPIs.constructor = PureComponent;\n assign(deprecatedAPIs, Component.prototype);\n deprecatedAPIs.isPureReactComponent = !0;\n var isArrayImpl = Array.isArray,\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals = {\n H: null,\n A: null,\n T: null,\n S: null,\n V: null,\n actQueue: null,\n isBatchingLegacy: !1,\n didScheduleLegacyUpdate: !1,\n didUsePromise: !1,\n thrownErrors: [],\n getCurrentStack: null,\n recentlyCreatedOwnerStacks: 0\n },\n hasOwnProperty = Object.prototype.hasOwnProperty,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n deprecatedAPIs = {\n \"react-stack-bottom-frame\": function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown, didWarnAboutOldJSXRuntime;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = deprecatedAPIs[\n \"react-stack-bottom-frame\"\n ].bind(deprecatedAPIs, UnknownOwner)();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutMaps = !1,\n userProvidedKeyEscapeRegex = /\\/+/g,\n reportGlobalError =\n \"function\" === typeof reportError\n ? reportError\n : function (error) {\n if (\n \"object\" === typeof window &&\n \"function\" === typeof window.ErrorEvent\n ) {\n var event = new window.ErrorEvent(\"error\", {\n bubbles: !0,\n cancelable: !0,\n message:\n \"object\" === typeof error &&\n null !== error &&\n \"string\" === typeof error.message\n ? String(error.message)\n : String(error),\n error: error\n });\n if (!window.dispatchEvent(event)) return;\n } else if (\n \"object\" === typeof process &&\n \"function\" === typeof process.emit\n ) {\n process.emit(\"uncaughtException\", error);\n return;\n }\n console.error(error);\n },\n didWarnAboutMessageChannel = !1,\n enqueueTaskImpl = null,\n actScopeDepth = 0,\n didWarnNoAwaitAct = !1,\n isFlushing = !1,\n queueSeveralMicrotasks =\n \"function\" === typeof queueMicrotask\n ? function (callback) {\n queueMicrotask(function () {\n return queueMicrotask(callback);\n });\n }\n : enqueueTask;\n deprecatedAPIs = Object.freeze({\n __proto__: null,\n c: function (size) {\n return resolveDispatcher().useMemoCache(size);\n }\n });\n exports.Children = {\n map: mapChildren,\n forEach: function (children, forEachFunc, forEachContext) {\n mapChildren(\n children,\n function () {\n forEachFunc.apply(this, arguments);\n },\n forEachContext\n );\n },\n count: function (children) {\n var n = 0;\n mapChildren(children, function () {\n n++;\n });\n return n;\n },\n toArray: function (children) {\n return (\n mapChildren(children, function (child) {\n return child;\n }) || []\n );\n },\n only: function (children) {\n if (!isValidElement(children))\n throw Error(\n \"React.Children.only expected to receive a single React element child.\"\n );\n return children;\n }\n };\n exports.Component = Component;\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.Profiler = REACT_PROFILER_TYPE;\n exports.PureComponent = PureComponent;\n exports.StrictMode = REACT_STRICT_MODE_TYPE;\n exports.Suspense = REACT_SUSPENSE_TYPE;\n exports.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE =\n ReactSharedInternals;\n exports.__COMPILER_RUNTIME = deprecatedAPIs;\n exports.act = function (callback) {\n var prevActQueue = ReactSharedInternals.actQueue,\n prevActScopeDepth = actScopeDepth;\n actScopeDepth++;\n var queue = (ReactSharedInternals.actQueue =\n null !== prevActQueue ? prevActQueue : []),\n didAwaitActCall = !1;\n try {\n var result = callback();\n } catch (error) {\n ReactSharedInternals.thrownErrors.push(error);\n }\n if (0 < ReactSharedInternals.thrownErrors.length)\n throw (\n (popActScope(prevActQueue, prevActScopeDepth),\n (callback = aggregateErrors(ReactSharedInternals.thrownErrors)),\n (ReactSharedInternals.thrownErrors.length = 0),\n callback)\n );\n if (\n null !== result &&\n \"object\" === typeof result &&\n \"function\" === typeof result.then\n ) {\n var thenable = result;\n queueSeveralMicrotasks(function () {\n didAwaitActCall ||\n didWarnNoAwaitAct ||\n ((didWarnNoAwaitAct = !0),\n console.error(\n \"You called act(async () => ...) without await. This could lead to unexpected testing behaviour, interleaving multiple act calls and mixing their scopes. You should - await act(async () => ...);\"\n ));\n });\n return {\n then: function (resolve, reject) {\n didAwaitActCall = !0;\n thenable.then(\n function (returnValue) {\n popActScope(prevActQueue, prevActScopeDepth);\n if (0 === prevActScopeDepth) {\n try {\n flushActQueue(queue),\n enqueueTask(function () {\n return recursivelyFlushAsyncActWork(\n returnValue,\n resolve,\n reject\n );\n });\n } catch (error$0) {\n ReactSharedInternals.thrownErrors.push(error$0);\n }\n if (0 < ReactSharedInternals.thrownErrors.length) {\n var _thrownError = aggregateErrors(\n ReactSharedInternals.thrownErrors\n );\n ReactSharedInternals.thrownErrors.length = 0;\n reject(_thrownError);\n }\n } else resolve(returnValue);\n },\n function (error) {\n popActScope(prevActQueue, prevActScopeDepth);\n 0 < ReactSharedInternals.thrownErrors.length\n ? ((error = aggregateErrors(\n ReactSharedInternals.thrownErrors\n )),\n (ReactSharedInternals.thrownErrors.length = 0),\n reject(error))\n : reject(error);\n }\n );\n }\n };\n }\n var returnValue$jscomp$0 = result;\n popActScope(prevActQueue, prevActScopeDepth);\n 0 === prevActScopeDepth &&\n (flushActQueue(queue),\n 0 !== queue.length &&\n queueSeveralMicrotasks(function () {\n didAwaitActCall ||\n didWarnNoAwaitAct ||\n ((didWarnNoAwaitAct = !0),\n console.error(\n \"A component suspended inside an `act` scope, but the `act` call was not awaited. When testing React components that depend on asynchronous data, you must await the result:\\n\\nawait act(() => ...)\"\n ));\n }),\n (ReactSharedInternals.actQueue = null));\n if (0 < ReactSharedInternals.thrownErrors.length)\n throw (\n ((callback = aggregateErrors(ReactSharedInternals.thrownErrors)),\n (ReactSharedInternals.thrownErrors.length = 0),\n callback)\n );\n return {\n then: function (resolve, reject) {\n didAwaitActCall = !0;\n 0 === prevActScopeDepth\n ? ((ReactSharedInternals.actQueue = queue),\n enqueueTask(function () {\n return recursivelyFlushAsyncActWork(\n returnValue$jscomp$0,\n resolve,\n reject\n );\n }))\n : resolve(returnValue$jscomp$0);\n }\n };\n };\n exports.cache = function (fn) {\n return function () {\n return fn.apply(null, arguments);\n };\n };\n exports.captureOwnerStack = function () {\n var getCurrentStack = ReactSharedInternals.getCurrentStack;\n return null === getCurrentStack ? null : getCurrentStack();\n };\n exports.cloneElement = function (element, config, children) {\n if (null === element || void 0 === element)\n throw Error(\n \"The argument must be a React element, but you passed \" +\n element +\n \".\"\n );\n var props = assign({}, element.props),\n key = element.key,\n owner = element._owner;\n if (null != config) {\n var JSCompiler_inline_result;\n a: {\n if (\n hasOwnProperty.call(config, \"ref\") &&\n (JSCompiler_inline_result = Object.getOwnPropertyDescriptor(\n config,\n \"ref\"\n ).get) &&\n JSCompiler_inline_result.isReactWarning\n ) {\n JSCompiler_inline_result = !1;\n break a;\n }\n JSCompiler_inline_result = void 0 !== config.ref;\n }\n JSCompiler_inline_result && (owner = getOwner());\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (key = \"\" + config.key));\n for (propName in config)\n !hasOwnProperty.call(config, propName) ||\n \"key\" === propName ||\n \"__self\" === propName ||\n \"__source\" === propName ||\n (\"ref\" === propName && void 0 === config.ref) ||\n (props[propName] = config[propName]);\n }\n var propName = arguments.length - 2;\n if (1 === propName) props.children = children;\n else if (1 < propName) {\n JSCompiler_inline_result = Array(propName);\n for (var i = 0; i < propName; i++)\n JSCompiler_inline_result[i] = arguments[i + 2];\n props.children = JSCompiler_inline_result;\n }\n props = ReactElement(\n element.type,\n key,\n void 0,\n void 0,\n owner,\n props,\n element._debugStack,\n element._debugTask\n );\n for (key = 2; key < arguments.length; key++)\n (owner = arguments[key]),\n isValidElement(owner) && owner._store && (owner._store.validated = 1);\n return props;\n };\n exports.createContext = function (defaultValue) {\n defaultValue = {\n $$typeof: REACT_CONTEXT_TYPE,\n _currentValue: defaultValue,\n _currentValue2: defaultValue,\n _threadCount: 0,\n Provider: null,\n Consumer: null\n };\n defaultValue.Provider = defaultValue;\n defaultValue.Consumer = {\n $$typeof: REACT_CONSUMER_TYPE,\n _context: defaultValue\n };\n defaultValue._currentRenderer = null;\n defaultValue._currentRenderer2 = null;\n return defaultValue;\n };\n exports.createElement = function (type, config, children) {\n for (var i = 2; i < arguments.length; i++) {\n var node = arguments[i];\n isValidElement(node) && node._store && (node._store.validated = 1);\n }\n i = {};\n node = null;\n if (null != config)\n for (propName in (didWarnAboutOldJSXRuntime ||\n !(\"__self\" in config) ||\n \"key\" in config ||\n ((didWarnAboutOldJSXRuntime = !0),\n console.warn(\n \"Your app (or one of its dependencies) is using an outdated JSX transform. Update to the modern JSX transform for faster performance: https://react.dev/link/new-jsx-transform\"\n )),\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (node = \"\" + config.key)),\n config))\n hasOwnProperty.call(config, propName) &&\n \"key\" !== propName &&\n \"__self\" !== propName &&\n \"__source\" !== propName &&\n (i[propName] = config[propName]);\n var childrenLength = arguments.length - 2;\n if (1 === childrenLength) i.children = children;\n else if (1 < childrenLength) {\n for (\n var childArray = Array(childrenLength), _i = 0;\n _i < childrenLength;\n _i++\n )\n childArray[_i] = arguments[_i + 2];\n Object.freeze && Object.freeze(childArray);\n i.children = childArray;\n }\n if (type && type.defaultProps)\n for (propName in ((childrenLength = type.defaultProps), childrenLength))\n void 0 === i[propName] && (i[propName] = childrenLength[propName]);\n node &&\n defineKeyPropWarningGetter(\n i,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n var propName = 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return ReactElement(\n type,\n node,\n void 0,\n void 0,\n getOwner(),\n i,\n propName ? Error(\"react-stack-top-frame\") : unknownOwnerDebugStack,\n propName ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.createRef = function () {\n var refObject = { current: null };\n Object.seal(refObject);\n return refObject;\n };\n exports.forwardRef = function (render) {\n null != render && render.$$typeof === REACT_MEMO_TYPE\n ? console.error(\n \"forwardRef requires a render function but received a `memo` component. Instead of forwardRef(memo(...)), use memo(forwardRef(...)).\"\n )\n : \"function\" !== typeof render\n ? console.error(\n \"forwardRef requires a render function but was given %s.\",\n null === render ? \"null\" : typeof render\n )\n : 0 !== render.length &&\n 2 !== render.length &&\n console.error(\n \"forwardRef render functions accept exactly two parameters: props and ref. %s\",\n 1 === render.length\n ? \"Did you forget to use the ref parameter?\"\n : \"Any additional parameter will be undefined.\"\n );\n null != render &&\n null != render.defaultProps &&\n console.error(\n \"forwardRef render functions do not support defaultProps. Did you accidentally pass a React component?\"\n );\n var elementType = { $$typeof: REACT_FORWARD_REF_TYPE, render: render },\n ownName;\n Object.defineProperty(elementType, \"displayName\", {\n enumerable: !1,\n configurable: !0,\n get: function () {\n return ownName;\n },\n set: function (name) {\n ownName = name;\n render.name ||\n render.displayName ||\n (Object.defineProperty(render, \"name\", { value: name }),\n (render.displayName = name));\n }\n });\n return elementType;\n };\n exports.isValidElement = isValidElement;\n exports.lazy = function (ctor) {\n return {\n $$typeof: REACT_LAZY_TYPE,\n _payload: { _status: -1, _result: ctor },\n _init: lazyInitializer\n };\n };\n exports.memo = function (type, compare) {\n null == type &&\n console.error(\n \"memo: The first argument must be a component. Instead received: %s\",\n null === type ? \"null\" : typeof type\n );\n compare = {\n $$typeof: REACT_MEMO_TYPE,\n type: type,\n compare: void 0 === compare ? null : compare\n };\n var ownName;\n Object.defineProperty(compare, \"displayName\", {\n enumerable: !1,\n configurable: !0,\n get: function () {\n return ownName;\n },\n set: function (name) {\n ownName = name;\n type.name ||\n type.displayName ||\n (Object.defineProperty(type, \"name\", { value: name }),\n (type.displayName = name));\n }\n });\n return compare;\n };\n exports.startTransition = function (scope) {\n var prevTransition = ReactSharedInternals.T,\n currentTransition = {};\n ReactSharedInternals.T = currentTransition;\n currentTransition._updatedFibers = new Set();\n try {\n var returnValue = scope(),\n onStartTransitionFinish = ReactSharedInternals.S;\n null !== onStartTransitionFinish &&\n onStartTransitionFinish(currentTransition, returnValue);\n \"object\" === typeof returnValue &&\n null !== returnValue &&\n \"function\" === typeof returnValue.then &&\n returnValue.then(noop, reportGlobalError);\n } catch (error) {\n reportGlobalError(error);\n } finally {\n null === prevTransition &&\n currentTransition._updatedFibers &&\n ((scope = currentTransition._updatedFibers.size),\n currentTransition._updatedFibers.clear(),\n 10 < scope &&\n console.warn(\n \"Detected a large number of updates inside startTransition. If this is due to a subscription please re-write it to use React provided hooks. Otherwise concurrent mode guarantees are off the table.\"\n )),\n (ReactSharedInternals.T = prevTransition);\n }\n };\n exports.unstable_useCacheRefresh = function () {\n return resolveDispatcher().useCacheRefresh();\n };\n exports.use = function (usable) {\n return resolveDispatcher().use(usable);\n };\n exports.useActionState = function (action, initialState, permalink) {\n return resolveDispatcher().useActionState(\n action,\n initialState,\n permalink\n );\n };\n exports.useCallback = function (callback, deps) {\n return resolveDispatcher().useCallback(callback, deps);\n };\n exports.useContext = function (Context) {\n var dispatcher = resolveDispatcher();\n Context.$$typeof === REACT_CONSUMER_TYPE &&\n console.error(\n \"Calling useContext(Context.Consumer) is not supported and will cause bugs. Did you mean to call useContext(Context) instead?\"\n );\n return dispatcher.useContext(Context);\n };\n exports.useDebugValue = function (value, formatterFn) {\n return resolveDispatcher().useDebugValue(value, formatterFn);\n };\n exports.useDeferredValue = function (value, initialValue) {\n return resolveDispatcher().useDeferredValue(value, initialValue);\n };\n exports.useEffect = function (create, createDeps, update) {\n null == create &&\n console.warn(\n \"React Hook useEffect requires an effect callback. Did you forget to pass a callback to the hook?\"\n );\n var dispatcher = resolveDispatcher();\n if (\"function\" === typeof update)\n throw Error(\n \"useEffect CRUD overload is not enabled in this build of React.\"\n );\n return dispatcher.useEffect(create, createDeps);\n };\n exports.useId = function () {\n return resolveDispatcher().useId();\n };\n exports.useImperativeHandle = function (ref, create, deps) {\n return resolveDispatcher().useImperativeHandle(ref, create, deps);\n };\n exports.useInsertionEffect = function (create, deps) {\n null == create &&\n console.warn(\n \"React Hook useInsertionEffect requires an effect callback. Did you forget to pass a callback to the hook?\"\n );\n return resolveDispatcher().useInsertionEffect(create, deps);\n };\n exports.useLayoutEffect = function (create, deps) {\n null == create &&\n console.warn(\n \"React Hook useLayoutEffect requires an effect callback. Did you forget to pass a callback to the hook?\"\n );\n return resolveDispatcher().useLayoutEffect(create, deps);\n };\n exports.useMemo = function (create, deps) {\n return resolveDispatcher().useMemo(create, deps);\n };\n exports.useOptimistic = function (passthrough, reducer) {\n return resolveDispatcher().useOptimistic(passthrough, reducer);\n };\n exports.useReducer = function (reducer, initialArg, init) {\n return resolveDispatcher().useReducer(reducer, initialArg, init);\n };\n exports.useRef = function (initialValue) {\n return resolveDispatcher().useRef(initialValue);\n };\n exports.useState = function (initialState) {\n return resolveDispatcher().useState(initialState);\n };\n exports.useSyncExternalStore = function (\n subscribe,\n getSnapshot,\n getServerSnapshot\n ) {\n return resolveDispatcher().useSyncExternalStore(\n subscribe,\n getSnapshot,\n getServerSnapshot\n );\n };\n exports.useTransition = function () {\n return resolveDispatcher().useTransition();\n };\n exports.version = \"19.1.0\";\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());\n })();\n", "'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react.production.js');\n} else {\n module.exports = require('./cjs/react.development.js');\n}\n", "/**\n * @license React\n * react-dom.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 noop() {}\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function createPortal$1(children, containerInfo, implementation) {\n var key =\n 3 < arguments.length && void 0 !== arguments[3] ? arguments[3] : null;\n try {\n testStringCoercion(key);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n JSCompiler_inline_result &&\n (console.error(\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n key[Symbol.toStringTag]) ||\n key.constructor.name ||\n \"Object\"\n ),\n testStringCoercion(key));\n return {\n $$typeof: REACT_PORTAL_TYPE,\n key: null == key ? null : \"\" + key,\n children: children,\n containerInfo: containerInfo,\n implementation: implementation\n };\n }\n function getCrossOriginStringAs(as, input) {\n if (\"font\" === as) return \"\";\n if (\"string\" === typeof input)\n return \"use-credentials\" === input ? input : \"\";\n }\n function getValueDescriptorExpectingObjectForWarning(thing) {\n return null === thing\n ? \"`null`\"\n : void 0 === thing\n ? \"`undefined`\"\n : \"\" === thing\n ? \"an empty string\"\n : 'something with type \"' + typeof thing + '\"';\n }\n function getValueDescriptorExpectingEnumForWarning(thing) {\n return null === thing\n ? \"`null`\"\n : void 0 === thing\n ? \"`undefined`\"\n : \"\" === thing\n ? \"an empty string\"\n : \"string\" === typeof thing\n ? JSON.stringify(thing)\n : \"number\" === typeof thing\n ? \"`\" + thing + \"`\"\n : 'something with type \"' + typeof thing + '\"';\n }\n function resolveDispatcher() {\n var dispatcher = ReactSharedInternals.H;\n null === dispatcher &&\n console.error(\n \"Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\\n1. You might have mismatching versions of React and the renderer (such as React DOM)\\n2. You might be breaking the Rules of Hooks\\n3. You might have more than one copy of React in the same app\\nSee https://react.dev/link/invalid-hook-call for tips about how to debug and fix this problem.\"\n );\n return dispatcher;\n }\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());\n var React = require(\"react\"),\n Internals = {\n d: {\n f: noop,\n r: function () {\n throw Error(\n \"Invalid form element. requestFormReset must be passed a form that was rendered by React.\"\n );\n },\n D: noop,\n C: noop,\n L: noop,\n m: noop,\n X: noop,\n S: noop,\n M: noop\n },\n p: 0,\n findDOMNode: null\n },\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;\n (\"function\" === typeof Map &&\n null != Map.prototype &&\n \"function\" === typeof Map.prototype.forEach &&\n \"function\" === typeof Set &&\n null != Set.prototype &&\n \"function\" === typeof Set.prototype.clear &&\n \"function\" === typeof Set.prototype.forEach) ||\n console.error(\n \"React depends on Map and Set built-in types. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills\"\n );\n exports.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE =\n Internals;\n exports.createPortal = function (children, container) {\n var key =\n 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : null;\n if (\n !container ||\n (1 !== container.nodeType &&\n 9 !== container.nodeType &&\n 11 !== container.nodeType)\n )\n throw Error(\"Target container is not a DOM element.\");\n return createPortal$1(children, container, null, key);\n };\n exports.flushSync = function (fn) {\n var previousTransition = ReactSharedInternals.T,\n previousUpdatePriority = Internals.p;\n try {\n if (((ReactSharedInternals.T = null), (Internals.p = 2), fn))\n return fn();\n } finally {\n (ReactSharedInternals.T = previousTransition),\n (Internals.p = previousUpdatePriority),\n Internals.d.f() &&\n console.error(\n \"flushSync was called from inside a lifecycle method. React cannot flush when React is already rendering. Consider moving this call to a scheduler task or micro task.\"\n );\n }\n };\n exports.preconnect = function (href, options) {\n \"string\" === typeof href && href\n ? null != options && \"object\" !== typeof options\n ? console.error(\n \"ReactDOM.preconnect(): Expected the `options` argument (second) to be an object but encountered %s instead. The only supported option at this time is `crossOrigin` which accepts a string.\",\n getValueDescriptorExpectingEnumForWarning(options)\n )\n : null != options &&\n \"string\" !== typeof options.crossOrigin &&\n console.error(\n \"ReactDOM.preconnect(): Expected the `crossOrigin` option (second argument) to be a string but encountered %s instead. Try removing this option or passing a string value instead.\",\n getValueDescriptorExpectingObjectForWarning(options.crossOrigin)\n )\n : console.error(\n \"ReactDOM.preconnect(): Expected the `href` argument (first) to be a non-empty string but encountered %s instead.\",\n getValueDescriptorExpectingObjectForWarning(href)\n );\n \"string\" === typeof href &&\n (options\n ? ((options = options.crossOrigin),\n (options =\n \"string\" === typeof options\n ? \"use-credentials\" === options\n ? options\n : \"\"\n : void 0))\n : (options = null),\n Internals.d.C(href, options));\n };\n exports.prefetchDNS = function (href) {\n if (\"string\" !== typeof href || !href)\n console.error(\n \"ReactDOM.prefetchDNS(): Expected the `href` argument (first) to be a non-empty string but encountered %s instead.\",\n getValueDescriptorExpectingObjectForWarning(href)\n );\n else if (1 < arguments.length) {\n var options = arguments[1];\n \"object\" === typeof options && options.hasOwnProperty(\"crossOrigin\")\n ? console.error(\n \"ReactDOM.prefetchDNS(): Expected only one argument, `href`, but encountered %s as a second argument instead. This argument is reserved for future options and is currently disallowed. It looks like the you are attempting to set a crossOrigin property for this DNS lookup hint. Browsers do not perform DNS queries using CORS and setting this attribute on the resource hint has no effect. Try calling ReactDOM.prefetchDNS() with just a single string argument, `href`.\",\n getValueDescriptorExpectingEnumForWarning(options)\n )\n : console.error(\n \"ReactDOM.prefetchDNS(): Expected only one argument, `href`, but encountered %s as a second argument instead. This argument is reserved for future options and is currently disallowed. Try calling ReactDOM.prefetchDNS() with just a single string argument, `href`.\",\n getValueDescriptorExpectingEnumForWarning(options)\n );\n }\n \"string\" === typeof href && Internals.d.D(href);\n };\n exports.preinit = function (href, options) {\n \"string\" === typeof href && href\n ? null == options || \"object\" !== typeof options\n ? console.error(\n \"ReactDOM.preinit(): Expected the `options` argument (second) to be an object with an `as` property describing the type of resource to be preinitialized but encountered %s instead.\",\n getValueDescriptorExpectingEnumForWarning(options)\n )\n : \"style\" !== options.as &&\n \"script\" !== options.as &&\n console.error(\n 'ReactDOM.preinit(): Expected the `as` property in the `options` argument (second) to contain a valid value describing the type of resource to be preinitialized but encountered %s instead. Valid values for `as` are \"style\" and \"script\".',\n getValueDescriptorExpectingEnumForWarning(options.as)\n )\n : console.error(\n \"ReactDOM.preinit(): Expected the `href` argument (first) to be a non-empty string but encountered %s instead.\",\n getValueDescriptorExpectingObjectForWarning(href)\n );\n if (\n \"string\" === typeof href &&\n options &&\n \"string\" === typeof options.as\n ) {\n var as = options.as,\n crossOrigin = getCrossOriginStringAs(as, options.crossOrigin),\n integrity =\n \"string\" === typeof options.integrity ? options.integrity : void 0,\n fetchPriority =\n \"string\" === typeof options.fetchPriority\n ? options.fetchPriority\n : void 0;\n \"style\" === as\n ? Internals.d.S(\n href,\n \"string\" === typeof options.precedence\n ? options.precedence\n : void 0,\n {\n crossOrigin: crossOrigin,\n integrity: integrity,\n fetchPriority: fetchPriority\n }\n )\n : \"script\" === as &&\n Internals.d.X(href, {\n crossOrigin: crossOrigin,\n integrity: integrity,\n fetchPriority: fetchPriority,\n nonce: \"string\" === typeof options.nonce ? options.nonce : void 0\n });\n }\n };\n exports.preinitModule = function (href, options) {\n var encountered = \"\";\n (\"string\" === typeof href && href) ||\n (encountered +=\n \" The `href` argument encountered was \" +\n getValueDescriptorExpectingObjectForWarning(href) +\n \".\");\n void 0 !== options && \"object\" !== typeof options\n ? (encountered +=\n \" The `options` argument encountered was \" +\n getValueDescriptorExpectingObjectForWarning(options) +\n \".\")\n : options &&\n \"as\" in options &&\n \"script\" !== options.as &&\n (encountered +=\n \" The `as` option encountered was \" +\n getValueDescriptorExpectingEnumForWarning(options.as) +\n \".\");\n if (encountered)\n console.error(\n \"ReactDOM.preinitModule(): Expected up to two arguments, a non-empty `href` string and, optionally, an `options` object with a valid `as` property.%s\",\n encountered\n );\n else\n switch (\n ((encountered =\n options && \"string\" === typeof options.as ? options.as : \"script\"),\n encountered)\n ) {\n case \"script\":\n break;\n default:\n (encountered =\n getValueDescriptorExpectingEnumForWarning(encountered)),\n console.error(\n 'ReactDOM.preinitModule(): Currently the only supported \"as\" type for this function is \"script\" but received \"%s\" instead. This warning was generated for `href` \"%s\". In the future other module types will be supported, aligning with the import-attributes proposal. Learn more here: (https://github.com/tc39/proposal-import-attributes)',\n encountered,\n href\n );\n }\n if (\"string\" === typeof href)\n if (\"object\" === typeof options && null !== options) {\n if (null == options.as || \"script\" === options.as)\n (encountered = getCrossOriginStringAs(\n options.as,\n options.crossOrigin\n )),\n Internals.d.M(href, {\n crossOrigin: encountered,\n integrity:\n \"string\" === typeof options.integrity\n ? options.integrity\n : void 0,\n nonce:\n \"string\" === typeof options.nonce ? options.nonce : void 0\n });\n } else null == options && Internals.d.M(href);\n };\n exports.preload = function (href, options) {\n var encountered = \"\";\n (\"string\" === typeof href && href) ||\n (encountered +=\n \" The `href` argument encountered was \" +\n getValueDescriptorExpectingObjectForWarning(href) +\n \".\");\n null == options || \"object\" !== typeof options\n ? (encountered +=\n \" The `options` argument encountered was \" +\n getValueDescriptorExpectingObjectForWarning(options) +\n \".\")\n : (\"string\" === typeof options.as && options.as) ||\n (encountered +=\n \" The `as` option encountered was \" +\n getValueDescriptorExpectingObjectForWarning(options.as) +\n \".\");\n encountered &&\n console.error(\n 'ReactDOM.preload(): Expected two arguments, a non-empty `href` string and an `options` object with an `as` property valid for a `` tag.%s',\n encountered\n );\n if (\n \"string\" === typeof href &&\n \"object\" === typeof options &&\n null !== options &&\n \"string\" === typeof options.as\n ) {\n encountered = options.as;\n var crossOrigin = getCrossOriginStringAs(\n encountered,\n options.crossOrigin\n );\n Internals.d.L(href, encountered, {\n crossOrigin: crossOrigin,\n integrity:\n \"string\" === typeof options.integrity ? options.integrity : void 0,\n nonce: \"string\" === typeof options.nonce ? options.nonce : void 0,\n type: \"string\" === typeof options.type ? options.type : void 0,\n fetchPriority:\n \"string\" === typeof options.fetchPriority\n ? options.fetchPriority\n : void 0,\n referrerPolicy:\n \"string\" === typeof options.referrerPolicy\n ? options.referrerPolicy\n : void 0,\n imageSrcSet:\n \"string\" === typeof options.imageSrcSet\n ? options.imageSrcSet\n : void 0,\n imageSizes:\n \"string\" === typeof options.imageSizes\n ? options.imageSizes\n : void 0,\n media: \"string\" === typeof options.media ? options.media : void 0\n });\n }\n };\n exports.preloadModule = function (href, options) {\n var encountered = \"\";\n (\"string\" === typeof href && href) ||\n (encountered +=\n \" The `href` argument encountered was \" +\n getValueDescriptorExpectingObjectForWarning(href) +\n \".\");\n void 0 !== options && \"object\" !== typeof options\n ? (encountered +=\n \" The `options` argument encountered was \" +\n getValueDescriptorExpectingObjectForWarning(options) +\n \".\")\n : options &&\n \"as\" in options &&\n \"string\" !== typeof options.as &&\n (encountered +=\n \" The `as` option encountered was \" +\n getValueDescriptorExpectingObjectForWarning(options.as) +\n \".\");\n encountered &&\n console.error(\n 'ReactDOM.preloadModule(): Expected two arguments, a non-empty `href` string and, optionally, an `options` object with an `as` property valid for a `` tag.%s',\n encountered\n );\n \"string\" === typeof href &&\n (options\n ? ((encountered = getCrossOriginStringAs(\n options.as,\n options.crossOrigin\n )),\n Internals.d.m(href, {\n as:\n \"string\" === typeof options.as && \"script\" !== options.as\n ? options.as\n : void 0,\n crossOrigin: encountered,\n integrity:\n \"string\" === typeof options.integrity\n ? options.integrity\n : void 0\n }))\n : Internals.d.m(href));\n };\n exports.requestFormReset = function (form) {\n Internals.d.r(form);\n };\n exports.unstable_batchedUpdates = function (fn, a) {\n return fn(a);\n };\n exports.useFormState = function (action, initialState, permalink) {\n return resolveDispatcher().useFormState(action, initialState, permalink);\n };\n exports.useFormStatus = function () {\n return resolveDispatcher().useHostTransitionStatus();\n };\n exports.version = \"19.1.0\";\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());\n })();\n", "'use strict';\n\nfunction checkDCE() {\n /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n if (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n ) {\n return;\n }\n if (process.env.NODE_ENV !== 'production') {\n // This branch is unreachable because this function is only called\n // in production, but the condition is true only in development.\n // Therefore if the branch is still here, dead code elimination wasn't\n // properly applied.\n // Don't change the message. React DevTools relies on it. Also make sure\n // this message doesn't occur elsewhere in this function, or it will cause\n // a false positive.\n throw new Error('^_^');\n }\n try {\n // Verify that the code above has been dead code eliminated (DCE'd).\n __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n } catch (err) {\n // DevTools shouldn't crash React, no matter what.\n // We should still report in case we break this code.\n console.error(err);\n }\n}\n\nif (process.env.NODE_ENV === 'production') {\n // DCE check should happen before ReactDOM bundle executes so that\n // DevTools can report bad minification during injection.\n checkDCE();\n module.exports = require('./cjs/react-dom.production.js');\n} else {\n module.exports = require('./cjs/react-dom.development.js');\n}\n", "/**\n * @license React\n * react-dom-client.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/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function findHook(fiber, id) {\n for (fiber = fiber.memoizedState; null !== fiber && 0 < id; )\n (fiber = fiber.next), id--;\n return fiber;\n }\n function copyWithSetImpl(obj, path, index, value) {\n if (index >= path.length) return value;\n var key = path[index],\n updated = isArrayImpl(obj) ? obj.slice() : assign({}, obj);\n updated[key] = copyWithSetImpl(obj[key], path, index + 1, value);\n return updated;\n }\n function copyWithRename(obj, oldPath, newPath) {\n if (oldPath.length !== newPath.length)\n console.warn(\"copyWithRename() expects paths of the same length\");\n else {\n for (var i = 0; i < newPath.length - 1; i++)\n if (oldPath[i] !== newPath[i]) {\n console.warn(\n \"copyWithRename() expects paths to be the same except for the deepest key\"\n );\n return;\n }\n return copyWithRenameImpl(obj, oldPath, newPath, 0);\n }\n }\n function copyWithRenameImpl(obj, oldPath, newPath, index) {\n var oldKey = oldPath[index],\n updated = isArrayImpl(obj) ? obj.slice() : assign({}, obj);\n index + 1 === oldPath.length\n ? ((updated[newPath[index]] = updated[oldKey]),\n isArrayImpl(updated)\n ? updated.splice(oldKey, 1)\n : delete updated[oldKey])\n : (updated[oldKey] = copyWithRenameImpl(\n obj[oldKey],\n oldPath,\n newPath,\n index + 1\n ));\n return updated;\n }\n function copyWithDeleteImpl(obj, path, index) {\n var key = path[index],\n updated = isArrayImpl(obj) ? obj.slice() : assign({}, obj);\n if (index + 1 === path.length)\n return (\n isArrayImpl(updated) ? updated.splice(key, 1) : delete updated[key],\n updated\n );\n updated[key] = copyWithDeleteImpl(obj[key], path, index + 1);\n return updated;\n }\n function shouldSuspendImpl() {\n return !1;\n }\n function shouldErrorImpl() {\n return null;\n }\n function warnForMissingKey() {}\n function warnInvalidHookAccess() {\n console.error(\n \"Do not call Hooks inside useEffect(...), useMemo(...), or other built-in Hooks. You can only call Hooks at the top level of your React function. For more information, see https://react.dev/link/rules-of-hooks\"\n );\n }\n function warnInvalidContextAccess() {\n console.error(\n \"Context can only be read while React is rendering. In classes, you can read it in the render method or getDerivedStateFromProps. In function components, you can read it directly in the function body, but not inside Hooks like useReducer() or useMemo().\"\n );\n }\n function noop$2() {}\n function setToSortedString(set) {\n var array = [];\n set.forEach(function (value) {\n array.push(value);\n });\n return array.sort().join(\", \");\n }\n function createFiber(tag, pendingProps, key, mode) {\n return new FiberNode(tag, pendingProps, key, mode);\n }\n function scheduleRoot(root, element) {\n root.context === emptyContextObject &&\n (updateContainerImpl(root.current, 2, element, root, null, null),\n flushSyncWork$1());\n }\n function scheduleRefresh(root, update) {\n if (null !== resolveFamily) {\n var staleFamilies = update.staleFamilies;\n update = update.updatedFamilies;\n flushPendingEffects();\n scheduleFibersWithFamiliesRecursively(\n root.current,\n update,\n staleFamilies\n );\n flushSyncWork$1();\n }\n }\n function setRefreshHandler(handler) {\n resolveFamily = handler;\n }\n function isValidContainer(node) {\n return !(\n !node ||\n (1 !== node.nodeType && 9 !== node.nodeType && 11 !== node.nodeType)\n );\n }\n function getNearestMountedFiber(fiber) {\n var node = fiber,\n nearestMounted = fiber;\n if (fiber.alternate) for (; node.return; ) node = node.return;\n else {\n fiber = node;\n do\n (node = fiber),\n 0 !== (node.flags & 4098) && (nearestMounted = node.return),\n (fiber = node.return);\n while (fiber);\n }\n return 3 === node.tag ? nearestMounted : null;\n }\n function getSuspenseInstanceFromFiber(fiber) {\n if (13 === fiber.tag) {\n var suspenseState = fiber.memoizedState;\n null === suspenseState &&\n ((fiber = fiber.alternate),\n null !== fiber && (suspenseState = fiber.memoizedState));\n if (null !== suspenseState) return suspenseState.dehydrated;\n }\n return null;\n }\n function assertIsMounted(fiber) {\n if (getNearestMountedFiber(fiber) !== fiber)\n throw Error(\"Unable to find node on an unmounted component.\");\n }\n function findCurrentFiberUsingSlowPath(fiber) {\n var alternate = fiber.alternate;\n if (!alternate) {\n alternate = getNearestMountedFiber(fiber);\n if (null === alternate)\n throw Error(\"Unable to find node on an unmounted component.\");\n return alternate !== fiber ? null : fiber;\n }\n for (var a = fiber, b = alternate; ; ) {\n var parentA = a.return;\n if (null === parentA) break;\n var parentB = parentA.alternate;\n if (null === parentB) {\n b = parentA.return;\n if (null !== b) {\n a = b;\n continue;\n }\n break;\n }\n if (parentA.child === parentB.child) {\n for (parentB = parentA.child; parentB; ) {\n if (parentB === a) return assertIsMounted(parentA), fiber;\n if (parentB === b) return assertIsMounted(parentA), alternate;\n parentB = parentB.sibling;\n }\n throw Error(\"Unable to find node on an unmounted component.\");\n }\n if (a.return !== b.return) (a = parentA), (b = parentB);\n else {\n for (var didFindChild = !1, _child = parentA.child; _child; ) {\n if (_child === a) {\n didFindChild = !0;\n a = parentA;\n b = parentB;\n break;\n }\n if (_child === b) {\n didFindChild = !0;\n b = parentA;\n a = parentB;\n break;\n }\n _child = _child.sibling;\n }\n if (!didFindChild) {\n for (_child = parentB.child; _child; ) {\n if (_child === a) {\n didFindChild = !0;\n a = parentB;\n b = parentA;\n break;\n }\n if (_child === b) {\n didFindChild = !0;\n b = parentB;\n a = parentA;\n break;\n }\n _child = _child.sibling;\n }\n if (!didFindChild)\n throw Error(\n \"Child was not found in either parent set. This indicates a bug in React related to the return pointer. Please file an issue.\"\n );\n }\n }\n if (a.alternate !== b)\n throw Error(\n \"Return fibers should always be each others' alternates. This error is likely caused by a bug in React. Please file an issue.\"\n );\n }\n if (3 !== a.tag)\n throw Error(\"Unable to find node on an unmounted component.\");\n return a.stateNode.current === a ? fiber : alternate;\n }\n function findCurrentHostFiberImpl(node) {\n var tag = node.tag;\n if (5 === tag || 26 === tag || 27 === tag || 6 === tag) return node;\n for (node = node.child; null !== node; ) {\n tag = findCurrentHostFiberImpl(node);\n if (null !== tag) return tag;\n node = node.sibling;\n }\n return null;\n }\n function getIteratorFn(maybeIterable) {\n if (null === maybeIterable || \"object\" !== typeof maybeIterable)\n return null;\n maybeIterable =\n (MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL]) ||\n maybeIterable[\"@@iterator\"];\n return \"function\" === typeof maybeIterable ? maybeIterable : null;\n }\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\") + \".Provider\";\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 getComponentNameFromOwner(owner) {\n return \"number\" === typeof owner.tag\n ? getComponentNameFromFiber(owner)\n : \"string\" === typeof owner.name\n ? owner.name\n : null;\n }\n function getComponentNameFromFiber(fiber) {\n var type = fiber.type;\n switch (fiber.tag) {\n case 31:\n return \"Activity\";\n case 24:\n return \"Cache\";\n case 9:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case 10:\n return (type.displayName || \"Context\") + \".Provider\";\n case 18:\n return \"DehydratedFragment\";\n case 11:\n return (\n (fiber = type.render),\n (fiber = fiber.displayName || fiber.name || \"\"),\n type.displayName ||\n (\"\" !== fiber ? \"ForwardRef(\" + fiber + \")\" : \"ForwardRef\")\n );\n case 7:\n return \"Fragment\";\n case 26:\n case 27:\n case 5:\n return type;\n case 4:\n return \"Portal\";\n case 3:\n return \"Root\";\n case 6:\n return \"Text\";\n case 16:\n return getComponentNameFromType(type);\n case 8:\n return type === REACT_STRICT_MODE_TYPE ? \"StrictMode\" : \"Mode\";\n case 22:\n return \"Offscreen\";\n case 12:\n return \"Profiler\";\n case 21:\n return \"Scope\";\n case 13:\n return \"Suspense\";\n case 19:\n return \"SuspenseList\";\n case 25:\n return \"TracingMarker\";\n case 1:\n case 0:\n case 14:\n case 15:\n if (\"function\" === typeof type)\n return type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n break;\n case 29:\n type = fiber._debugInfo;\n if (null != type)\n for (var i = type.length - 1; 0 <= i; i--)\n if (\"string\" === typeof type[i].name) return type[i].name;\n if (null !== fiber.return)\n return getComponentNameFromFiber(fiber.return);\n }\n return null;\n }\n function createCursor(defaultValue) {\n return { current: defaultValue };\n }\n function pop(cursor, fiber) {\n 0 > index$jscomp$0\n ? console.error(\"Unexpected pop.\")\n : (fiber !== fiberStack[index$jscomp$0] &&\n console.error(\"Unexpected Fiber popped.\"),\n (cursor.current = valueStack[index$jscomp$0]),\n (valueStack[index$jscomp$0] = null),\n (fiberStack[index$jscomp$0] = null),\n index$jscomp$0--);\n }\n function push(cursor, value, fiber) {\n index$jscomp$0++;\n valueStack[index$jscomp$0] = cursor.current;\n fiberStack[index$jscomp$0] = fiber;\n cursor.current = value;\n }\n function requiredContext(c) {\n null === c &&\n console.error(\n \"Expected host context to exist. This error is likely caused by a bug in React. Please file an issue.\"\n );\n return c;\n }\n function pushHostContainer(fiber, nextRootInstance) {\n push(rootInstanceStackCursor, nextRootInstance, fiber);\n push(contextFiberStackCursor, fiber, fiber);\n push(contextStackCursor, null, fiber);\n var nextRootContext = nextRootInstance.nodeType;\n switch (nextRootContext) {\n case 9:\n case 11:\n nextRootContext = 9 === nextRootContext ? \"#document\" : \"#fragment\";\n nextRootInstance = (nextRootInstance =\n nextRootInstance.documentElement)\n ? (nextRootInstance = nextRootInstance.namespaceURI)\n ? getOwnHostContext(nextRootInstance)\n : HostContextNamespaceNone\n : HostContextNamespaceNone;\n break;\n default:\n if (\n ((nextRootContext = nextRootInstance.tagName),\n (nextRootInstance = nextRootInstance.namespaceURI))\n )\n (nextRootInstance = getOwnHostContext(nextRootInstance)),\n (nextRootInstance = getChildHostContextProd(\n nextRootInstance,\n nextRootContext\n ));\n else\n switch (nextRootContext) {\n case \"svg\":\n nextRootInstance = HostContextNamespaceSvg;\n break;\n case \"math\":\n nextRootInstance = HostContextNamespaceMath;\n break;\n default:\n nextRootInstance = HostContextNamespaceNone;\n }\n }\n nextRootContext = nextRootContext.toLowerCase();\n nextRootContext = updatedAncestorInfoDev(null, nextRootContext);\n nextRootContext = {\n context: nextRootInstance,\n ancestorInfo: nextRootContext\n };\n pop(contextStackCursor, fiber);\n push(contextStackCursor, nextRootContext, fiber);\n }\n function popHostContainer(fiber) {\n pop(contextStackCursor, fiber);\n pop(contextFiberStackCursor, fiber);\n pop(rootInstanceStackCursor, fiber);\n }\n function getHostContext() {\n return requiredContext(contextStackCursor.current);\n }\n function pushHostContext(fiber) {\n null !== fiber.memoizedState &&\n push(hostTransitionProviderCursor, fiber, fiber);\n var context = requiredContext(contextStackCursor.current);\n var type = fiber.type;\n var nextContext = getChildHostContextProd(context.context, type);\n type = updatedAncestorInfoDev(context.ancestorInfo, type);\n nextContext = { context: nextContext, ancestorInfo: type };\n context !== nextContext &&\n (push(contextFiberStackCursor, fiber, fiber),\n push(contextStackCursor, nextContext, fiber));\n }\n function popHostContext(fiber) {\n contextFiberStackCursor.current === fiber &&\n (pop(contextStackCursor, fiber), pop(contextFiberStackCursor, fiber));\n hostTransitionProviderCursor.current === fiber &&\n (pop(hostTransitionProviderCursor, fiber),\n (HostTransitionContext._currentValue = NotPendingTransition));\n }\n function typeName(value) {\n return (\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\"\n );\n }\n function willCoercionThrow(value) {\n try {\n return testStringCoercion(value), !1;\n } catch (e) {\n return !0;\n }\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkAttributeStringCoercion(value, attributeName) {\n if (willCoercionThrow(value))\n return (\n console.error(\n \"The provided `%s` attribute is an unsupported type %s. This value must be coerced to a string before using it here.\",\n attributeName,\n typeName(value)\n ),\n testStringCoercion(value)\n );\n }\n function checkCSSPropertyStringCoercion(value, propName) {\n if (willCoercionThrow(value))\n return (\n console.error(\n \"The provided `%s` CSS property is an unsupported type %s. This value must be coerced to a string before using it here.\",\n propName,\n typeName(value)\n ),\n testStringCoercion(value)\n );\n }\n function checkFormFieldValueStringCoercion(value) {\n if (willCoercionThrow(value))\n return (\n console.error(\n \"Form field values (value, checked, defaultValue, or defaultChecked props) must be strings, not %s. This value must be coerced to a string before using it here.\",\n typeName(value)\n ),\n testStringCoercion(value)\n );\n }\n function injectInternals(internals) {\n if (\"undefined\" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) return !1;\n var hook = __REACT_DEVTOOLS_GLOBAL_HOOK__;\n if (hook.isDisabled) return !0;\n if (!hook.supportsFiber)\n return (\n console.error(\n \"The installed version of React DevTools is too old and will not work with the current version of React. Please update React DevTools. https://react.dev/link/react-devtools\"\n ),\n !0\n );\n try {\n (rendererID = hook.inject(internals)), (injectedHook = hook);\n } catch (err) {\n console.error(\"React instrumentation encountered an error: %s.\", err);\n }\n return hook.checkDCE ? !0 : !1;\n }\n function setIsStrictModeForDevtools(newIsStrictMode) {\n \"function\" === typeof log$1 &&\n unstable_setDisableYieldValue(newIsStrictMode);\n if (injectedHook && \"function\" === typeof injectedHook.setStrictMode)\n try {\n injectedHook.setStrictMode(rendererID, newIsStrictMode);\n } catch (err) {\n hasLoggedError ||\n ((hasLoggedError = !0),\n console.error(\n \"React instrumentation encountered an error: %s\",\n err\n ));\n }\n }\n function injectProfilingHooks(profilingHooks) {\n injectedProfilingHooks = profilingHooks;\n }\n function markCommitStopped() {\n null !== injectedProfilingHooks &&\n \"function\" === typeof injectedProfilingHooks.markCommitStopped &&\n injectedProfilingHooks.markCommitStopped();\n }\n function markComponentRenderStarted(fiber) {\n null !== injectedProfilingHooks &&\n \"function\" ===\n typeof injectedProfilingHooks.markComponentRenderStarted &&\n injectedProfilingHooks.markComponentRenderStarted(fiber);\n }\n function markComponentRenderStopped() {\n null !== injectedProfilingHooks &&\n \"function\" ===\n typeof injectedProfilingHooks.markComponentRenderStopped &&\n injectedProfilingHooks.markComponentRenderStopped();\n }\n function markRenderStarted(lanes) {\n null !== injectedProfilingHooks &&\n \"function\" === typeof injectedProfilingHooks.markRenderStarted &&\n injectedProfilingHooks.markRenderStarted(lanes);\n }\n function markRenderStopped() {\n null !== injectedProfilingHooks &&\n \"function\" === typeof injectedProfilingHooks.markRenderStopped &&\n injectedProfilingHooks.markRenderStopped();\n }\n function markStateUpdateScheduled(fiber, lane) {\n null !== injectedProfilingHooks &&\n \"function\" === typeof injectedProfilingHooks.markStateUpdateScheduled &&\n injectedProfilingHooks.markStateUpdateScheduled(fiber, lane);\n }\n function clz32Fallback(x) {\n x >>>= 0;\n return 0 === x ? 32 : (31 - ((log(x) / LN2) | 0)) | 0;\n }\n function getLabelForLane(lane) {\n if (lane & 1) return \"SyncHydrationLane\";\n if (lane & 2) return \"Sync\";\n if (lane & 4) return \"InputContinuousHydration\";\n if (lane & 8) return \"InputContinuous\";\n if (lane & 16) return \"DefaultHydration\";\n if (lane & 32) return \"Default\";\n if (lane & 128) return \"TransitionHydration\";\n if (lane & 4194048) return \"Transition\";\n if (lane & 62914560) return \"Retry\";\n if (lane & 67108864) return \"SelectiveHydration\";\n if (lane & 134217728) return \"IdleHydration\";\n if (lane & 268435456) return \"Idle\";\n if (lane & 536870912) return \"Offscreen\";\n if (lane & 1073741824) return \"Deferred\";\n }\n function getHighestPriorityLanes(lanes) {\n var pendingSyncLanes = lanes & 42;\n if (0 !== pendingSyncLanes) return pendingSyncLanes;\n switch (lanes & -lanes) {\n case 1:\n return 1;\n case 2:\n return 2;\n case 4:\n return 4;\n case 8:\n return 8;\n case 16:\n return 16;\n case 32:\n return 32;\n case 64:\n return 64;\n case 128:\n return 128;\n case 256:\n case 512:\n case 1024:\n case 2048:\n case 4096:\n case 8192:\n case 16384:\n case 32768:\n case 65536:\n case 131072:\n case 262144:\n case 524288:\n case 1048576:\n case 2097152:\n return lanes & 4194048;\n case 4194304:\n case 8388608:\n case 16777216:\n case 33554432:\n return lanes & 62914560;\n case 67108864:\n return 67108864;\n case 134217728:\n return 134217728;\n case 268435456:\n return 268435456;\n case 536870912:\n return 536870912;\n case 1073741824:\n return 0;\n default:\n return (\n console.error(\n \"Should have found matching lanes. This is a bug in React.\"\n ),\n lanes\n );\n }\n }\n function getNextLanes(root, wipLanes, rootHasPendingCommit) {\n var pendingLanes = root.pendingLanes;\n if (0 === pendingLanes) return 0;\n var nextLanes = 0,\n suspendedLanes = root.suspendedLanes,\n pingedLanes = root.pingedLanes;\n root = root.warmLanes;\n var nonIdlePendingLanes = pendingLanes & 134217727;\n 0 !== nonIdlePendingLanes\n ? ((pendingLanes = nonIdlePendingLanes & ~suspendedLanes),\n 0 !== pendingLanes\n ? (nextLanes = getHighestPriorityLanes(pendingLanes))\n : ((pingedLanes &= nonIdlePendingLanes),\n 0 !== pingedLanes\n ? (nextLanes = getHighestPriorityLanes(pingedLanes))\n : rootHasPendingCommit ||\n ((rootHasPendingCommit = nonIdlePendingLanes & ~root),\n 0 !== rootHasPendingCommit &&\n (nextLanes =\n getHighestPriorityLanes(rootHasPendingCommit)))))\n : ((nonIdlePendingLanes = pendingLanes & ~suspendedLanes),\n 0 !== nonIdlePendingLanes\n ? (nextLanes = getHighestPriorityLanes(nonIdlePendingLanes))\n : 0 !== pingedLanes\n ? (nextLanes = getHighestPriorityLanes(pingedLanes))\n : rootHasPendingCommit ||\n ((rootHasPendingCommit = pendingLanes & ~root),\n 0 !== rootHasPendingCommit &&\n (nextLanes = getHighestPriorityLanes(rootHasPendingCommit))));\n return 0 === nextLanes\n ? 0\n : 0 !== wipLanes &&\n wipLanes !== nextLanes &&\n 0 === (wipLanes & suspendedLanes) &&\n ((suspendedLanes = nextLanes & -nextLanes),\n (rootHasPendingCommit = wipLanes & -wipLanes),\n suspendedLanes >= rootHasPendingCommit ||\n (32 === suspendedLanes && 0 !== (rootHasPendingCommit & 4194048)))\n ? wipLanes\n : nextLanes;\n }\n function checkIfRootIsPrerendering(root, renderLanes) {\n return (\n 0 ===\n (root.pendingLanes &\n ~(root.suspendedLanes & ~root.pingedLanes) &\n renderLanes)\n );\n }\n function computeExpirationTime(lane, currentTime) {\n switch (lane) {\n case 1:\n case 2:\n case 4:\n case 8:\n case 64:\n return currentTime + 250;\n case 16:\n case 32:\n case 128:\n case 256:\n case 512:\n case 1024:\n case 2048:\n case 4096:\n case 8192:\n case 16384:\n case 32768:\n case 65536:\n case 131072:\n case 262144:\n case 524288:\n case 1048576:\n case 2097152:\n return currentTime + 5e3;\n case 4194304:\n case 8388608:\n case 16777216:\n case 33554432:\n return -1;\n case 67108864:\n case 134217728:\n case 268435456:\n case 536870912:\n case 1073741824:\n return -1;\n default:\n return (\n console.error(\n \"Should have found matching lanes. This is a bug in React.\"\n ),\n -1\n );\n }\n }\n function claimNextTransitionLane() {\n var lane = nextTransitionLane;\n nextTransitionLane <<= 1;\n 0 === (nextTransitionLane & 4194048) && (nextTransitionLane = 256);\n return lane;\n }\n function claimNextRetryLane() {\n var lane = nextRetryLane;\n nextRetryLane <<= 1;\n 0 === (nextRetryLane & 62914560) && (nextRetryLane = 4194304);\n return lane;\n }\n function createLaneMap(initial) {\n for (var laneMap = [], i = 0; 31 > i; i++) laneMap.push(initial);\n return laneMap;\n }\n function markRootUpdated$1(root, updateLane) {\n root.pendingLanes |= updateLane;\n 268435456 !== updateLane &&\n ((root.suspendedLanes = 0),\n (root.pingedLanes = 0),\n (root.warmLanes = 0));\n }\n function markRootFinished(\n root,\n finishedLanes,\n remainingLanes,\n spawnedLane,\n updatedLanes,\n suspendedRetryLanes\n ) {\n var previouslyPendingLanes = root.pendingLanes;\n root.pendingLanes = remainingLanes;\n root.suspendedLanes = 0;\n root.pingedLanes = 0;\n root.warmLanes = 0;\n root.expiredLanes &= remainingLanes;\n root.entangledLanes &= remainingLanes;\n root.errorRecoveryDisabledLanes &= remainingLanes;\n root.shellSuspendCounter = 0;\n var entanglements = root.entanglements,\n expirationTimes = root.expirationTimes,\n hiddenUpdates = root.hiddenUpdates;\n for (\n remainingLanes = previouslyPendingLanes & ~remainingLanes;\n 0 < remainingLanes;\n\n ) {\n var index = 31 - clz32(remainingLanes),\n lane = 1 << index;\n entanglements[index] = 0;\n expirationTimes[index] = -1;\n var hiddenUpdatesForLane = hiddenUpdates[index];\n if (null !== hiddenUpdatesForLane)\n for (\n hiddenUpdates[index] = null, index = 0;\n index < hiddenUpdatesForLane.length;\n index++\n ) {\n var update = hiddenUpdatesForLane[index];\n null !== update && (update.lane &= -536870913);\n }\n remainingLanes &= ~lane;\n }\n 0 !== spawnedLane && markSpawnedDeferredLane(root, spawnedLane, 0);\n 0 !== suspendedRetryLanes &&\n 0 === updatedLanes &&\n 0 !== root.tag &&\n (root.suspendedLanes |=\n suspendedRetryLanes & ~(previouslyPendingLanes & ~finishedLanes));\n }\n function markSpawnedDeferredLane(root, spawnedLane, entangledLanes) {\n root.pendingLanes |= spawnedLane;\n root.suspendedLanes &= ~spawnedLane;\n var spawnedLaneIndex = 31 - clz32(spawnedLane);\n root.entangledLanes |= spawnedLane;\n root.entanglements[spawnedLaneIndex] =\n root.entanglements[spawnedLaneIndex] |\n 1073741824 |\n (entangledLanes & 4194090);\n }\n function markRootEntangled(root, entangledLanes) {\n var rootEntangledLanes = (root.entangledLanes |= entangledLanes);\n for (root = root.entanglements; rootEntangledLanes; ) {\n var index = 31 - clz32(rootEntangledLanes),\n lane = 1 << index;\n (lane & entangledLanes) | (root[index] & entangledLanes) &&\n (root[index] |= entangledLanes);\n rootEntangledLanes &= ~lane;\n }\n }\n function getBumpedLaneForHydrationByLane(lane) {\n switch (lane) {\n case 2:\n lane = 1;\n break;\n case 8:\n lane = 4;\n break;\n case 32:\n lane = 16;\n break;\n case 256:\n case 512:\n case 1024:\n case 2048:\n case 4096:\n case 8192:\n case 16384:\n case 32768:\n case 65536:\n case 131072:\n case 262144:\n case 524288:\n case 1048576:\n case 2097152:\n case 4194304:\n case 8388608:\n case 16777216:\n case 33554432:\n lane = 128;\n break;\n case 268435456:\n lane = 134217728;\n break;\n default:\n lane = 0;\n }\n return lane;\n }\n function addFiberToLanesMap(root, fiber, lanes) {\n if (isDevToolsPresent)\n for (root = root.pendingUpdatersLaneMap; 0 < lanes; ) {\n var index = 31 - clz32(lanes),\n lane = 1 << index;\n root[index].add(fiber);\n lanes &= ~lane;\n }\n }\n function movePendingFibersToMemoized(root, lanes) {\n if (isDevToolsPresent)\n for (\n var pendingUpdatersLaneMap = root.pendingUpdatersLaneMap,\n memoizedUpdaters = root.memoizedUpdaters;\n 0 < lanes;\n\n ) {\n var index = 31 - clz32(lanes);\n root = 1 << index;\n index = pendingUpdatersLaneMap[index];\n 0 < index.size &&\n (index.forEach(function (fiber) {\n var alternate = fiber.alternate;\n (null !== alternate && memoizedUpdaters.has(alternate)) ||\n memoizedUpdaters.add(fiber);\n }),\n index.clear());\n lanes &= ~root;\n }\n }\n function lanesToEventPriority(lanes) {\n lanes &= -lanes;\n return 0 !== DiscreteEventPriority && DiscreteEventPriority < lanes\n ? 0 !== ContinuousEventPriority && ContinuousEventPriority < lanes\n ? 0 !== (lanes & 134217727)\n ? DefaultEventPriority\n : IdleEventPriority\n : ContinuousEventPriority\n : DiscreteEventPriority;\n }\n function resolveUpdatePriority() {\n var updatePriority = ReactDOMSharedInternals.p;\n if (0 !== updatePriority) return updatePriority;\n updatePriority = window.event;\n return void 0 === updatePriority\n ? DefaultEventPriority\n : getEventPriority(updatePriority.type);\n }\n function runWithPriority(priority, fn) {\n var previousPriority = ReactDOMSharedInternals.p;\n try {\n return (ReactDOMSharedInternals.p = priority), fn();\n } finally {\n ReactDOMSharedInternals.p = previousPriority;\n }\n }\n function detachDeletedInstance(node) {\n delete node[internalInstanceKey];\n delete node[internalPropsKey];\n delete node[internalEventHandlersKey];\n delete node[internalEventHandlerListenersKey];\n delete node[internalEventHandlesSetKey];\n }\n function getClosestInstanceFromNode(targetNode) {\n var targetInst = targetNode[internalInstanceKey];\n if (targetInst) return targetInst;\n for (var parentNode = targetNode.parentNode; parentNode; ) {\n if (\n (targetInst =\n parentNode[internalContainerInstanceKey] ||\n parentNode[internalInstanceKey])\n ) {\n parentNode = targetInst.alternate;\n if (\n null !== targetInst.child ||\n (null !== parentNode && null !== parentNode.child)\n )\n for (\n targetNode = getParentSuspenseInstance(targetNode);\n null !== targetNode;\n\n ) {\n if ((parentNode = targetNode[internalInstanceKey]))\n return parentNode;\n targetNode = getParentSuspenseInstance(targetNode);\n }\n return targetInst;\n }\n targetNode = parentNode;\n parentNode = targetNode.parentNode;\n }\n return null;\n }\n function getInstanceFromNode(node) {\n if (\n (node = node[internalInstanceKey] || node[internalContainerInstanceKey])\n ) {\n var tag = node.tag;\n if (\n 5 === tag ||\n 6 === tag ||\n 13 === tag ||\n 26 === tag ||\n 27 === tag ||\n 3 === tag\n )\n return node;\n }\n return null;\n }\n function getNodeFromInstance(inst) {\n var tag = inst.tag;\n if (5 === tag || 26 === tag || 27 === tag || 6 === tag)\n return inst.stateNode;\n throw Error(\"getNodeFromInstance: Invalid argument.\");\n }\n function getResourcesFromRoot(root) {\n var resources = root[internalRootNodeResourcesKey];\n resources ||\n (resources = root[internalRootNodeResourcesKey] =\n { hoistableStyles: new Map(), hoistableScripts: new Map() });\n return resources;\n }\n function markNodeAsHoistable(node) {\n node[internalHoistableMarker] = !0;\n }\n function registerTwoPhaseEvent(registrationName, dependencies) {\n registerDirectEvent(registrationName, dependencies);\n registerDirectEvent(registrationName + \"Capture\", dependencies);\n }\n function registerDirectEvent(registrationName, dependencies) {\n registrationNameDependencies[registrationName] &&\n console.error(\n \"EventRegistry: More than one plugin attempted to publish the same registration name, `%s`.\",\n registrationName\n );\n registrationNameDependencies[registrationName] = dependencies;\n var lowerCasedName = registrationName.toLowerCase();\n possibleRegistrationNames[lowerCasedName] = registrationName;\n \"onDoubleClick\" === registrationName &&\n (possibleRegistrationNames.ondblclick = registrationName);\n for (\n registrationName = 0;\n registrationName < dependencies.length;\n registrationName++\n )\n allNativeEvents.add(dependencies[registrationName]);\n }\n function checkControlledValueProps(tagName, props) {\n hasReadOnlyValue[props.type] ||\n props.onChange ||\n props.onInput ||\n props.readOnly ||\n props.disabled ||\n null == props.value ||\n (\"select\" === tagName\n ? console.error(\n \"You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set `onChange`.\"\n )\n : console.error(\n \"You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`.\"\n ));\n props.onChange ||\n props.readOnly ||\n props.disabled ||\n null == props.checked ||\n console.error(\n \"You provided a `checked` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultChecked`. Otherwise, set either `onChange` or `readOnly`.\"\n );\n }\n function isAttributeNameSafe(attributeName) {\n if (hasOwnProperty.call(validatedAttributeNameCache, attributeName))\n return !0;\n if (hasOwnProperty.call(illegalAttributeNameCache, attributeName))\n return !1;\n if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName))\n return (validatedAttributeNameCache[attributeName] = !0);\n illegalAttributeNameCache[attributeName] = !0;\n console.error(\"Invalid attribute name: `%s`\", attributeName);\n return !1;\n }\n function getValueForAttributeOnCustomComponent(node, name, expected) {\n if (isAttributeNameSafe(name)) {\n if (!node.hasAttribute(name)) {\n switch (typeof expected) {\n case \"symbol\":\n case \"object\":\n return expected;\n case \"function\":\n return expected;\n case \"boolean\":\n if (!1 === expected) return expected;\n }\n return void 0 === expected ? void 0 : null;\n }\n node = node.getAttribute(name);\n if (\"\" === node && !0 === expected) return !0;\n checkAttributeStringCoercion(expected, name);\n return node === \"\" + expected ? expected : node;\n }\n }\n function setValueForAttribute(node, name, value) {\n if (isAttributeNameSafe(name))\n if (null === value) node.removeAttribute(name);\n else {\n switch (typeof value) {\n case \"undefined\":\n case \"function\":\n case \"symbol\":\n node.removeAttribute(name);\n return;\n case \"boolean\":\n var prefix = name.toLowerCase().slice(0, 5);\n if (\"data-\" !== prefix && \"aria-\" !== prefix) {\n node.removeAttribute(name);\n return;\n }\n }\n checkAttributeStringCoercion(value, name);\n node.setAttribute(name, \"\" + value);\n }\n }\n function setValueForKnownAttribute(node, name, value) {\n if (null === value) node.removeAttribute(name);\n else {\n switch (typeof value) {\n case \"undefined\":\n case \"function\":\n case \"symbol\":\n case \"boolean\":\n node.removeAttribute(name);\n return;\n }\n checkAttributeStringCoercion(value, name);\n node.setAttribute(name, \"\" + value);\n }\n }\n function setValueForNamespacedAttribute(node, namespace, name, value) {\n if (null === value) node.removeAttribute(name);\n else {\n switch (typeof value) {\n case \"undefined\":\n case \"function\":\n case \"symbol\":\n case \"boolean\":\n node.removeAttribute(name);\n return;\n }\n checkAttributeStringCoercion(value, name);\n node.setAttributeNS(namespace, name, \"\" + value);\n }\n }\n function disabledLog() {}\n function disableLogs() {\n if (0 === disabledDepth) {\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;\n var props = {\n configurable: !0,\n enumerable: !0,\n value: disabledLog,\n writable: !0\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 }\n disabledDepth++;\n }\n function reenableLogs() {\n disabledDepth--;\n if (0 === disabledDepth) {\n var props = { configurable: !0, enumerable: !0, writable: !0 };\n Object.defineProperties(console, {\n log: assign({}, props, { value: prevLog }),\n info: assign({}, props, { value: prevInfo }),\n warn: assign({}, props, { value: prevWarn }),\n error: assign({}, props, { value: prevError }),\n group: assign({}, props, { value: prevGroup }),\n groupCollapsed: assign({}, props, { value: prevGroupCollapsed }),\n groupEnd: assign({}, props, { value: prevGroupEnd })\n });\n }\n 0 > disabledDepth &&\n console.error(\n \"disabledDepth fell below zero. This is a bug in React. Please file an issue.\"\n );\n }\n function describeBuiltInComponentFrame(name) {\n if (void 0 === prefix)\n try {\n throw Error();\n } catch (x) {\n var match = x.stack.trim().match(/\\n( *(at )?)/);\n prefix = (match && match[1]) || \"\";\n suffix =\n -1 < x.stack.indexOf(\"\\n at\")\n ? \" ()\"\n : -1 < x.stack.indexOf(\"@\")\n ? \"@unknown:0:0\"\n : \"\";\n }\n return \"\\n\" + prefix + name + suffix;\n }\n function describeNativeComponentFrame(fn, construct) {\n if (!fn || reentry) return \"\";\n var frame = componentFrameCache.get(fn);\n if (void 0 !== frame) return frame;\n reentry = !0;\n frame = Error.prepareStackTrace;\n Error.prepareStackTrace = void 0;\n var previousDispatcher = null;\n previousDispatcher = ReactSharedInternals.H;\n ReactSharedInternals.H = null;\n disableLogs();\n try {\n var RunInRootFrame = {\n DetermineComponentFrameRoot: function () {\n try {\n if (construct) {\n var Fake = function () {\n throw Error();\n };\n Object.defineProperty(Fake.prototype, \"props\", {\n set: function () {\n throw Error();\n }\n });\n if (\"object\" === typeof Reflect && Reflect.construct) {\n try {\n Reflect.construct(Fake, []);\n } catch (x) {\n var control = x;\n }\n Reflect.construct(fn, [], Fake);\n } else {\n try {\n Fake.call();\n } catch (x$0) {\n control = x$0;\n }\n fn.call(Fake.prototype);\n }\n } else {\n try {\n throw Error();\n } catch (x$1) {\n control = x$1;\n }\n (Fake = fn()) &&\n \"function\" === typeof Fake.catch &&\n Fake.catch(function () {});\n }\n } catch (sample) {\n if (sample && control && \"string\" === typeof sample.stack)\n return [sample.stack, control.stack];\n }\n return [null, null];\n }\n };\n RunInRootFrame.DetermineComponentFrameRoot.displayName =\n \"DetermineComponentFrameRoot\";\n var namePropDescriptor = Object.getOwnPropertyDescriptor(\n RunInRootFrame.DetermineComponentFrameRoot,\n \"name\"\n );\n namePropDescriptor &&\n namePropDescriptor.configurable &&\n Object.defineProperty(\n RunInRootFrame.DetermineComponentFrameRoot,\n \"name\",\n { value: \"DetermineComponentFrameRoot\" }\n );\n var _RunInRootFrame$Deter =\n RunInRootFrame.DetermineComponentFrameRoot(),\n sampleStack = _RunInRootFrame$Deter[0],\n controlStack = _RunInRootFrame$Deter[1];\n if (sampleStack && controlStack) {\n var sampleLines = sampleStack.split(\"\\n\"),\n controlLines = controlStack.split(\"\\n\");\n for (\n _RunInRootFrame$Deter = namePropDescriptor = 0;\n namePropDescriptor < sampleLines.length &&\n !sampleLines[namePropDescriptor].includes(\n \"DetermineComponentFrameRoot\"\n );\n\n )\n namePropDescriptor++;\n for (\n ;\n _RunInRootFrame$Deter < controlLines.length &&\n !controlLines[_RunInRootFrame$Deter].includes(\n \"DetermineComponentFrameRoot\"\n );\n\n )\n _RunInRootFrame$Deter++;\n if (\n namePropDescriptor === sampleLines.length ||\n _RunInRootFrame$Deter === controlLines.length\n )\n for (\n namePropDescriptor = sampleLines.length - 1,\n _RunInRootFrame$Deter = controlLines.length - 1;\n 1 <= namePropDescriptor &&\n 0 <= _RunInRootFrame$Deter &&\n sampleLines[namePropDescriptor] !==\n controlLines[_RunInRootFrame$Deter];\n\n )\n _RunInRootFrame$Deter--;\n for (\n ;\n 1 <= namePropDescriptor && 0 <= _RunInRootFrame$Deter;\n namePropDescriptor--, _RunInRootFrame$Deter--\n )\n if (\n sampleLines[namePropDescriptor] !==\n controlLines[_RunInRootFrame$Deter]\n ) {\n if (1 !== namePropDescriptor || 1 !== _RunInRootFrame$Deter) {\n do\n if (\n (namePropDescriptor--,\n _RunInRootFrame$Deter--,\n 0 > _RunInRootFrame$Deter ||\n sampleLines[namePropDescriptor] !==\n controlLines[_RunInRootFrame$Deter])\n ) {\n var _frame =\n \"\\n\" +\n sampleLines[namePropDescriptor].replace(\n \" at new \",\n \" at \"\n );\n fn.displayName &&\n _frame.includes(\"\") &&\n (_frame = _frame.replace(\"\", fn.displayName));\n \"function\" === typeof fn &&\n componentFrameCache.set(fn, _frame);\n return _frame;\n }\n while (1 <= namePropDescriptor && 0 <= _RunInRootFrame$Deter);\n }\n break;\n }\n }\n } finally {\n (reentry = !1),\n (ReactSharedInternals.H = previousDispatcher),\n reenableLogs(),\n (Error.prepareStackTrace = frame);\n }\n sampleLines = (sampleLines = fn ? fn.displayName || fn.name : \"\")\n ? describeBuiltInComponentFrame(sampleLines)\n : \"\";\n \"function\" === typeof fn && componentFrameCache.set(fn, sampleLines);\n return sampleLines;\n }\n function formatOwnerStack(error) {\n var prevPrepareStackTrace = Error.prepareStackTrace;\n Error.prepareStackTrace = void 0;\n error = error.stack;\n Error.prepareStackTrace = prevPrepareStackTrace;\n error.startsWith(\"Error: react-stack-top-frame\\n\") &&\n (error = error.slice(29));\n prevPrepareStackTrace = error.indexOf(\"\\n\");\n -1 !== prevPrepareStackTrace &&\n (error = error.slice(prevPrepareStackTrace + 1));\n prevPrepareStackTrace = error.indexOf(\"react-stack-bottom-frame\");\n -1 !== prevPrepareStackTrace &&\n (prevPrepareStackTrace = error.lastIndexOf(\n \"\\n\",\n prevPrepareStackTrace\n ));\n if (-1 !== prevPrepareStackTrace)\n error = error.slice(0, prevPrepareStackTrace);\n else return \"\";\n return error;\n }\n function describeFiber(fiber) {\n switch (fiber.tag) {\n case 26:\n case 27:\n case 5:\n return describeBuiltInComponentFrame(fiber.type);\n case 16:\n return describeBuiltInComponentFrame(\"Lazy\");\n case 13:\n return describeBuiltInComponentFrame(\"Suspense\");\n case 19:\n return describeBuiltInComponentFrame(\"SuspenseList\");\n case 0:\n case 15:\n return describeNativeComponentFrame(fiber.type, !1);\n case 11:\n return describeNativeComponentFrame(fiber.type.render, !1);\n case 1:\n return describeNativeComponentFrame(fiber.type, !0);\n case 31:\n return describeBuiltInComponentFrame(\"Activity\");\n default:\n return \"\";\n }\n }\n function getStackByFiberInDevAndProd(workInProgress) {\n try {\n var info = \"\";\n do {\n info += describeFiber(workInProgress);\n var debugInfo = workInProgress._debugInfo;\n if (debugInfo)\n for (var i = debugInfo.length - 1; 0 <= i; i--) {\n var entry = debugInfo[i];\n if (\"string\" === typeof entry.name) {\n var JSCompiler_temp_const = info,\n env = entry.env;\n var JSCompiler_inline_result = describeBuiltInComponentFrame(\n entry.name + (env ? \" [\" + env + \"]\" : \"\")\n );\n info = JSCompiler_temp_const + JSCompiler_inline_result;\n }\n }\n workInProgress = workInProgress.return;\n } while (workInProgress);\n return info;\n } catch (x) {\n return \"\\nError generating stack: \" + x.message + \"\\n\" + x.stack;\n }\n }\n function describeFunctionComponentFrameWithoutLineNumber(fn) {\n return (fn = fn ? fn.displayName || fn.name : \"\")\n ? describeBuiltInComponentFrame(fn)\n : \"\";\n }\n function getCurrentFiberOwnerNameInDevOrNull() {\n if (null === current) return null;\n var owner = current._debugOwner;\n return null != owner ? getComponentNameFromOwner(owner) : null;\n }\n function getCurrentFiberStackInDev() {\n if (null === current) return \"\";\n var workInProgress = current;\n try {\n var info = \"\";\n 6 === workInProgress.tag && (workInProgress = workInProgress.return);\n switch (workInProgress.tag) {\n case 26:\n case 27:\n case 5:\n info += describeBuiltInComponentFrame(workInProgress.type);\n break;\n case 13:\n info += describeBuiltInComponentFrame(\"Suspense\");\n break;\n case 19:\n info += describeBuiltInComponentFrame(\"SuspenseList\");\n break;\n case 31:\n info += describeBuiltInComponentFrame(\"Activity\");\n break;\n case 30:\n case 0:\n case 15:\n case 1:\n workInProgress._debugOwner ||\n \"\" !== info ||\n (info += describeFunctionComponentFrameWithoutLineNumber(\n workInProgress.type\n ));\n break;\n case 11:\n workInProgress._debugOwner ||\n \"\" !== info ||\n (info += describeFunctionComponentFrameWithoutLineNumber(\n workInProgress.type.render\n ));\n }\n for (; workInProgress; )\n if (\"number\" === typeof workInProgress.tag) {\n var fiber = workInProgress;\n workInProgress = fiber._debugOwner;\n var debugStack = fiber._debugStack;\n workInProgress &&\n debugStack &&\n (\"string\" !== typeof debugStack &&\n (fiber._debugStack = debugStack = formatOwnerStack(debugStack)),\n \"\" !== debugStack && (info += \"\\n\" + debugStack));\n } else if (null != workInProgress.debugStack) {\n var ownerStack = workInProgress.debugStack;\n (workInProgress = workInProgress.owner) &&\n ownerStack &&\n (info += \"\\n\" + formatOwnerStack(ownerStack));\n } else break;\n var JSCompiler_inline_result = info;\n } catch (x) {\n JSCompiler_inline_result =\n \"\\nError generating stack: \" + x.message + \"\\n\" + x.stack;\n }\n return JSCompiler_inline_result;\n }\n function runWithFiberInDEV(fiber, callback, arg0, arg1, arg2, arg3, arg4) {\n var previousFiber = current;\n setCurrentFiber(fiber);\n try {\n return null !== fiber && fiber._debugTask\n ? fiber._debugTask.run(\n callback.bind(null, arg0, arg1, arg2, arg3, arg4)\n )\n : callback(arg0, arg1, arg2, arg3, arg4);\n } finally {\n setCurrentFiber(previousFiber);\n }\n throw Error(\n \"runWithFiberInDEV should never be called in production. This is a bug in React.\"\n );\n }\n function setCurrentFiber(fiber) {\n ReactSharedInternals.getCurrentStack =\n null === fiber ? null : getCurrentFiberStackInDev;\n isRendering = !1;\n current = fiber;\n }\n function getToStringValue(value) {\n switch (typeof value) {\n case \"bigint\":\n case \"boolean\":\n case \"number\":\n case \"string\":\n case \"undefined\":\n return value;\n case \"object\":\n return checkFormFieldValueStringCoercion(value), value;\n default:\n return \"\";\n }\n }\n function isCheckable(elem) {\n var type = elem.type;\n return (\n (elem = elem.nodeName) &&\n \"input\" === elem.toLowerCase() &&\n (\"checkbox\" === type || \"radio\" === type)\n );\n }\n function trackValueOnNode(node) {\n var valueField = isCheckable(node) ? \"checked\" : \"value\",\n descriptor = Object.getOwnPropertyDescriptor(\n node.constructor.prototype,\n valueField\n );\n checkFormFieldValueStringCoercion(node[valueField]);\n var currentValue = \"\" + node[valueField];\n if (\n !node.hasOwnProperty(valueField) &&\n \"undefined\" !== typeof descriptor &&\n \"function\" === typeof descriptor.get &&\n \"function\" === typeof descriptor.set\n ) {\n var get = descriptor.get,\n set = descriptor.set;\n Object.defineProperty(node, valueField, {\n configurable: !0,\n get: function () {\n return get.call(this);\n },\n set: function (value) {\n checkFormFieldValueStringCoercion(value);\n currentValue = \"\" + value;\n set.call(this, value);\n }\n });\n Object.defineProperty(node, valueField, {\n enumerable: descriptor.enumerable\n });\n return {\n getValue: function () {\n return currentValue;\n },\n setValue: function (value) {\n checkFormFieldValueStringCoercion(value);\n currentValue = \"\" + value;\n },\n stopTracking: function () {\n node._valueTracker = null;\n delete node[valueField];\n }\n };\n }\n }\n function track(node) {\n node._valueTracker || (node._valueTracker = trackValueOnNode(node));\n }\n function updateValueIfChanged(node) {\n if (!node) return !1;\n var tracker = node._valueTracker;\n if (!tracker) return !0;\n var lastValue = tracker.getValue();\n var value = \"\";\n node &&\n (value = isCheckable(node)\n ? node.checked\n ? \"true\"\n : \"false\"\n : node.value);\n node = value;\n return node !== lastValue ? (tracker.setValue(node), !0) : !1;\n }\n function getActiveElement(doc) {\n doc = doc || (\"undefined\" !== typeof document ? document : void 0);\n if (\"undefined\" === typeof doc) return null;\n try {\n return doc.activeElement || doc.body;\n } catch (e) {\n return doc.body;\n }\n }\n function escapeSelectorAttributeValueInsideDoubleQuotes(value) {\n return value.replace(\n escapeSelectorAttributeValueInsideDoubleQuotesRegex,\n function (ch) {\n return \"\\\\\" + ch.charCodeAt(0).toString(16) + \" \";\n }\n );\n }\n function validateInputProps(element, props) {\n void 0 === props.checked ||\n void 0 === props.defaultChecked ||\n didWarnCheckedDefaultChecked ||\n (console.error(\n \"%s contains an input of type %s with both checked and defaultChecked props. Input elements must be either controlled or uncontrolled (specify either the checked prop, or the defaultChecked prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://react.dev/link/controlled-components\",\n getCurrentFiberOwnerNameInDevOrNull() || \"A component\",\n props.type\n ),\n (didWarnCheckedDefaultChecked = !0));\n void 0 === props.value ||\n void 0 === props.defaultValue ||\n didWarnValueDefaultValue$1 ||\n (console.error(\n \"%s contains an input of type %s with both value and defaultValue props. Input elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://react.dev/link/controlled-components\",\n getCurrentFiberOwnerNameInDevOrNull() || \"A component\",\n props.type\n ),\n (didWarnValueDefaultValue$1 = !0));\n }\n function updateInput(\n element,\n value,\n defaultValue,\n lastDefaultValue,\n checked,\n defaultChecked,\n type,\n name\n ) {\n element.name = \"\";\n null != type &&\n \"function\" !== typeof type &&\n \"symbol\" !== typeof type &&\n \"boolean\" !== typeof type\n ? (checkAttributeStringCoercion(type, \"type\"), (element.type = type))\n : element.removeAttribute(\"type\");\n if (null != value)\n if (\"number\" === type) {\n if ((0 === value && \"\" === element.value) || element.value != value)\n element.value = \"\" + getToStringValue(value);\n } else\n element.value !== \"\" + getToStringValue(value) &&\n (element.value = \"\" + getToStringValue(value));\n else\n (\"submit\" !== type && \"reset\" !== type) ||\n element.removeAttribute(\"value\");\n null != value\n ? setDefaultValue(element, type, getToStringValue(value))\n : null != defaultValue\n ? setDefaultValue(element, type, getToStringValue(defaultValue))\n : null != lastDefaultValue && element.removeAttribute(\"value\");\n null == checked &&\n null != defaultChecked &&\n (element.defaultChecked = !!defaultChecked);\n null != checked &&\n (element.checked =\n checked &&\n \"function\" !== typeof checked &&\n \"symbol\" !== typeof checked);\n null != name &&\n \"function\" !== typeof name &&\n \"symbol\" !== typeof name &&\n \"boolean\" !== typeof name\n ? (checkAttributeStringCoercion(name, \"name\"),\n (element.name = \"\" + getToStringValue(name)))\n : element.removeAttribute(\"name\");\n }\n function initInput(\n element,\n value,\n defaultValue,\n checked,\n defaultChecked,\n type,\n name,\n isHydrating\n ) {\n null != type &&\n \"function\" !== typeof type &&\n \"symbol\" !== typeof type &&\n \"boolean\" !== typeof type &&\n (checkAttributeStringCoercion(type, \"type\"), (element.type = type));\n if (null != value || null != defaultValue) {\n if (\n !(\n (\"submit\" !== type && \"reset\" !== type) ||\n (void 0 !== value && null !== value)\n )\n )\n return;\n defaultValue =\n null != defaultValue ? \"\" + getToStringValue(defaultValue) : \"\";\n value = null != value ? \"\" + getToStringValue(value) : defaultValue;\n isHydrating || value === element.value || (element.value = value);\n element.defaultValue = value;\n }\n checked = null != checked ? checked : defaultChecked;\n checked =\n \"function\" !== typeof checked &&\n \"symbol\" !== typeof checked &&\n !!checked;\n element.checked = isHydrating ? element.checked : !!checked;\n element.defaultChecked = !!checked;\n null != name &&\n \"function\" !== typeof name &&\n \"symbol\" !== typeof name &&\n \"boolean\" !== typeof name &&\n (checkAttributeStringCoercion(name, \"name\"), (element.name = name));\n }\n function setDefaultValue(node, type, value) {\n (\"number\" === type && getActiveElement(node.ownerDocument) === node) ||\n node.defaultValue === \"\" + value ||\n (node.defaultValue = \"\" + value);\n }\n function validateOptionProps(element, props) {\n null == props.value &&\n (\"object\" === typeof props.children && null !== props.children\n ? React.Children.forEach(props.children, function (child) {\n null == child ||\n \"string\" === typeof child ||\n \"number\" === typeof child ||\n \"bigint\" === typeof child ||\n didWarnInvalidChild ||\n ((didWarnInvalidChild = !0),\n console.error(\n \"Cannot infer the option value of complex children. Pass a `value` prop or use a plain string as children to