@jeanmemory/react
Version:
React SDK for Jean Memory - Build personalized AI chatbots in 5 lines of code
1 lines • 61.9 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../config.ts","../mcp.ts","../provider.tsx","../node_modules/lucide-react/dist/esm/shared/src/utils.js","../node_modules/lucide-react/dist/esm/defaultAttributes.js","../node_modules/lucide-react/dist/esm/Icon.js","../node_modules/lucide-react/dist/esm/createLucideIcon.js","../node_modules/lucide-react/dist/esm/icons/bot.js","../node_modules/lucide-react/dist/esm/icons/log-out.js","../node_modules/lucide-react/dist/esm/icons/moon.js","../node_modules/lucide-react/dist/esm/icons/send.js","../node_modules/lucide-react/dist/esm/icons/sun.js","../node_modules/lucide-react/dist/esm/icons/trash-2.js","../node_modules/lucide-react/dist/esm/icons/user.js","../node_modules/lucide-react/dist/esm/icons/x.js","../JeanChat.tsx","../SignInWithJean.tsx","../useJeanMCP.tsx"],"sourcesContent":["/**\n * Jean Memory React SDK - Configuration\n * Centralized API endpoints\n */\nexport const JEAN_API_BASE = 'https://jean-memory-api-virginia.onrender.com';\nexport const JEAN_OAUTH_BASE = 'https://jeanmemory.com';\n","/**\n * Jean Memory React SDK - MCP Utility\n * Shared logic for making MCP requests\n */\nimport { JEAN_API_BASE } from './config';\n\ninterface MCPRequest {\n jsonrpc: string;\n id: number;\n method: string;\n params: {\n name: string;\n arguments: any;\n };\n}\n\nexport interface MCPResponse {\n jsonrpc: string;\n id: number;\n result?: {\n content: Array<{\n type: string;\n text: string;\n }>;\n };\n error?: {\n code: number;\n message: string;\n };\n}\n\nlet requestId = 0;\n\nexport async function makeMCPRequest(\n user: { user_id: string },\n apiKey: string,\n toolName: string,\n arguments_: any,\n clientName: string = 'react-sdk'\n): Promise<MCPResponse> {\n const id = ++requestId;\n\n const mcpRequest: MCPRequest = {\n jsonrpc: '2.0',\n id,\n method: 'tools/call',\n params: {\n name: toolName,\n arguments: arguments_\n }\n };\n\n const response = await fetch(`${JEAN_API_BASE}/mcp/${clientName}/messages/${user.user_id}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-User-Id': user.user_id,\n 'X-Client-Name': clientName,\n 'X-API-Key': apiKey\n },\n body: JSON.stringify(mcpRequest)\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new Error(`MCP request failed: ${response.statusText} - ${errorBody}`);\n }\n\n return response.json();\n}\n","/**\n * Jean Memory React SDK - Provider Component\n * Manages authentication state and API client\n */\nimport React, { createContext, useContext, useState, useEffect, ReactNode } from 'react';\nimport { JEAN_API_BASE } from './config';\nimport { makeMCPRequest } from './mcp';\n\nconst JEAN_API_BASE_OLD = 'https://jean-memory-api-virginia.onrender.com';\n\nexport interface JeanUser {\n user_id: string;\n email: string;\n name?: string;\n access_token: string;\n}\n\nexport interface JeanMessage {\n id: string;\n role: 'user' | 'assistant';\n content: string;\n timestamp: Date;\n}\n\ninterface JeanContextValue {\n // Essential state\n isAuthenticated: boolean;\n isLoading: boolean;\n user: JeanUser | null;\n messages: JeanMessage[];\n error: string | null;\n \n // Essential methods\n signIn: () => void;\n signOut: () => void;\n sendMessage: (message: string, options?: MessageOptions) => Promise<void>;\n storeDocument: (title: string, content: string) => Promise<void>;\n connect: (service: 'notion' | 'slack' | 'gdrive') => void;\n clearConversation: () => void;\n setUser: (user: JeanUser) => void;\n \n // Tools for direct memory access\n tools: {\n add_memory: (content: string) => Promise<any>;\n search_memory: (query: string) => Promise<any>;\n };\n}\n\nexport interface MessageOptions {\n speed?: 'fast' | 'balanced' | 'comprehensive';\n tool?: 'jean_memory' | 'search_memory';\n format?: 'simple' | 'enhanced';\n}\n\nconst JeanContext = createContext<JeanContextValue | null>(null);\n\n// Generate code verifier and challenge for PKCE\nfunction generatePKCE() {\n const verifier = generateRandomString(128);\n const encoder = new TextEncoder();\n const data = encoder.encode(verifier);\n \n return crypto.subtle.digest('SHA-256', data).then(digest => {\n const challenge = btoa(String.fromCharCode(...new Uint8Array(digest)))\n .replace(/=/g, '')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_');\n return { verifier, challenge };\n });\n}\n\nfunction generateRandomString(length: number): string {\n const charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~';\n const values = crypto.getRandomValues(new Uint8Array(length));\n return Array.from(values)\n .map(x => charset[x % charset.length])\n .join('');\n}\n\ninterface JeanProviderProps {\n apiKey: string;\n children: ReactNode;\n}\n\nexport function JeanProvider({ apiKey, children }: JeanProviderProps) {\n const [user, setUser] = useState<JeanUser | null>(null);\n const [messages, setMessages] = useState<JeanMessage[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [rawError, setRawError] = useState<string | null>(null);\n\n // Validate API key on mount\n useEffect(() => {\n if (!apiKey) {\n setRawError('API key is required');\n return;\n }\n \n if (!apiKey.startsWith('jean_sk_')) {\n setRawError('Invalid API key format');\n return;\n }\n\n // API key will be validated on first request\n console.log('✅ Jean Memory SDK initialized');\n }, [apiKey]);\n\n // Load user from localStorage on mount\n useEffect(() => {\n const storedUser = localStorage.getItem('jean_user');\n if (storedUser) {\n try {\n setUser(JSON.parse(storedUser));\n } catch (e) {\n localStorage.removeItem('jean_user');\n }\n }\n }, []);\n\n const sendMessage = async (message: string, options: MessageOptions = {}) => {\n if (!user) {\n throw new Error('User not authenticated');\n }\n\n setIsLoading(true);\n setRawError(null);\n\n try {\n // Add user message to conversation\n const userMessage: JeanMessage = {\n id: Date.now().toString(),\n role: 'user',\n content: message,\n timestamp: new Date()\n };\n setMessages(prev => [...prev, userMessage]);\n\n const response = await makeMCPRequest(\n user,\n apiKey,\n options.tool || 'jean_memory',\n {\n user_message: message,\n is_new_conversation: messages.length <= 1,\n needs_context: true\n }\n );\n\n if (response.error) {\n throw new Error(response.error.message);\n }\n \n const assistantMessage: JeanMessage = {\n id: (Date.now() + 1).toString(),\n role: 'assistant',\n content: response.result?.content?.[0]?.text || 'I understood and saved that information.',\n timestamp: new Date()\n };\n setMessages(prev => [...prev, assistantMessage]);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to send message';\n setRawError(errorMessage);\n throw err;\n } finally {\n setIsLoading(false);\n }\n };\n\n const storeDocument = async (title: string, content: string): Promise<void> => {\n if (!user) {\n throw new Error(\"User not authenticated\");\n }\n const response = await makeMCPRequest(user, apiKey, 'store_document', {\n title,\n content,\n document_type: 'markdown'\n });\n if (response.error) {\n throw new Error(response.error.message);\n }\n };\n\n const connect = (service: 'notion' | 'slack' | 'gdrive') => {\n if (!user) {\n throw new Error('User not authenticated');\n }\n \n // Open OAuth flow for external service integration\n const integrationUrl = `${JEAN_API_BASE}/api/v1/integrations/${service}/connect?user_token=${user.access_token}`;\n \n // Open in new window for better UX\n const popup = window.open(\n integrationUrl,\n `connect-${service}`,\n 'width=600,height=700,scrollbars=yes,resizable=yes'\n );\n \n // Listen for completion\n const checkClosed = setInterval(() => {\n if (popup?.closed) {\n clearInterval(checkClosed);\n console.log(`${service} integration window closed`);\n // Could refresh integrations list here\n }\n }, 1000);\n };\n\n\n const signIn = async () => {\n setIsLoading(true);\n \n try {\n // Generate PKCE parameters\n const { verifier, challenge } = await generatePKCE();\n const state = generateRandomString(32);\n \n // Store for callback\n sessionStorage.setItem('jean_oauth_state', state);\n sessionStorage.setItem('jean_oauth_verifier', verifier);\n \n // Build OAuth URL\n const params = new URLSearchParams({\n response_type: 'code',\n client_id: apiKey || 'default_client',\n redirect_uri: window.location.origin + window.location.pathname,\n state,\n code_challenge: challenge,\n code_challenge_method: 'S256',\n scope: 'read write'\n });\n \n // Redirect to OAuth provider\n window.location.href = `${JEAN_API_BASE}/oauth/authorize?${params.toString()}`;\n } catch (error) {\n setIsLoading(false);\n const errorMessage = error instanceof Error ? error.message : 'Sign in failed';\n setRawError(errorMessage);\n }\n };\n\n const handleSetUser = (newUser: JeanUser) => {\n setUser(newUser);\n localStorage.setItem('jean_user', JSON.stringify(newUser));\n };\n\n const signOut = () => {\n setUser(null);\n setMessages([]);\n localStorage.removeItem('jean_user');\n };\n\n const clearConversation = () => {\n setMessages([]);\n };\n\n // Direct memory tools\n const tools = {\n add_memory: async (content: string) => {\n if (!user) {\n throw new Error('User not authenticated');\n }\n \n const response = await makeMCPRequest(\n user,\n apiKey,\n 'add_memory',\n { content }\n );\n \n if (response.error) {\n throw new Error(response.error.message);\n }\n \n return response.result;\n },\n \n search_memory: async (query: string) => {\n if (!user) {\n throw new Error('User not authenticated');\n }\n \n const response = await makeMCPRequest(\n user,\n apiKey,\n 'search_memory',\n { query }\n );\n \n if (response.error) {\n throw new Error(response.error.message);\n }\n \n return response.result;\n }\n };\n\n const contextValue: JeanContextValue = {\n // Essential state\n isAuthenticated: !!user,\n isLoading,\n user,\n messages,\n error: rawError,\n \n // Essential methods\n signIn,\n signOut,\n sendMessage,\n storeDocument,\n connect,\n clearConversation,\n setUser: handleSetUser,\n \n // Tools\n tools\n };\n\n return (\n <JeanContext.Provider value={contextValue}>\n {children}\n </JeanContext.Provider>\n );\n}\n\nexport function useJean() {\n const context = useContext(JeanContext);\n if (!context) {\n throw new Error('useJean must be used within a JeanProvider');\n }\n return context;\n}","/**\n * @license lucide-react v0.395.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && array.indexOf(className) === index;\n}).join(\" \");\n\nexport { mergeClasses, toKebabCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.395.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.395.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => {\n return createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n );\n }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.395.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(`lucide-${toKebabCase(iconName)}`, className),\n ...props\n })\n );\n Component.displayName = `${iconName}`;\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.395.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Bot = createLucideIcon(\"Bot\", [\n [\"path\", { d: \"M12 8V4H8\", key: \"hb8ula\" }],\n [\"rect\", { width: \"16\", height: \"12\", x: \"4\", y: \"8\", rx: \"2\", key: \"enze0r\" }],\n [\"path\", { d: \"M2 14h2\", key: \"vft8re\" }],\n [\"path\", { d: \"M20 14h2\", key: \"4cs60a\" }],\n [\"path\", { d: \"M15 13v2\", key: \"1xurst\" }],\n [\"path\", { d: \"M9 13v2\", key: \"rq6x2g\" }]\n]);\n\nexport { Bot as default };\n//# sourceMappingURL=bot.js.map\n","/**\n * @license lucide-react v0.395.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst LogOut = createLucideIcon(\"LogOut\", [\n [\"path\", { d: \"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\", key: \"1uf3rs\" }],\n [\"polyline\", { points: \"16 17 21 12 16 7\", key: \"1gabdz\" }],\n [\"line\", { x1: \"21\", x2: \"9\", y1: \"12\", y2: \"12\", key: \"1uyos4\" }]\n]);\n\nexport { LogOut as default };\n//# sourceMappingURL=log-out.js.map\n","/**\n * @license lucide-react v0.395.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Moon = createLucideIcon(\"Moon\", [\n [\"path\", { d: \"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z\", key: \"a7tn18\" }]\n]);\n\nexport { Moon as default };\n//# sourceMappingURL=moon.js.map\n","/**\n * @license lucide-react v0.395.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Send = createLucideIcon(\"Send\", [\n [\"path\", { d: \"m22 2-7 20-4-9-9-4Z\", key: \"1q3vgg\" }],\n [\"path\", { d: \"M22 2 11 13\", key: \"nzbqef\" }]\n]);\n\nexport { Send as default };\n//# sourceMappingURL=send.js.map\n","/**\n * @license lucide-react v0.395.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Sun = createLucideIcon(\"Sun\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"4\", key: \"4exip2\" }],\n [\"path\", { d: \"M12 2v2\", key: \"tus03m\" }],\n [\"path\", { d: \"M12 20v2\", key: \"1lh1kg\" }],\n [\"path\", { d: \"m4.93 4.93 1.41 1.41\", key: \"149t6j\" }],\n [\"path\", { d: \"m17.66 17.66 1.41 1.41\", key: \"ptbguv\" }],\n [\"path\", { d: \"M2 12h2\", key: \"1t8f8n\" }],\n [\"path\", { d: \"M20 12h2\", key: \"1q8mjw\" }],\n [\"path\", { d: \"m6.34 17.66-1.41 1.41\", key: \"1m8zz5\" }],\n [\"path\", { d: \"m19.07 4.93-1.41 1.41\", key: \"1shlcs\" }]\n]);\n\nexport { Sun as default };\n//# sourceMappingURL=sun.js.map\n","/**\n * @license lucide-react v0.395.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Trash2 = createLucideIcon(\"Trash2\", [\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\", key: \"4alrt4\" }],\n [\"path\", { d: \"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\", key: \"v07s0e\" }],\n [\"line\", { x1: \"10\", x2: \"10\", y1: \"11\", y2: \"17\", key: \"1uufr5\" }],\n [\"line\", { x1: \"14\", x2: \"14\", y1: \"11\", y2: \"17\", key: \"xtxkd\" }]\n]);\n\nexport { Trash2 as default };\n//# sourceMappingURL=trash-2.js.map\n","/**\n * @license lucide-react v0.395.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst User = createLucideIcon(\"User\", [\n [\"path\", { d: \"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\", key: \"975kel\" }],\n [\"circle\", { cx: \"12\", cy: \"7\", r: \"4\", key: \"17ys0d\" }]\n]);\n\nexport { User as default };\n//# sourceMappingURL=user.js.map\n","/**\n * @license lucide-react v0.395.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst X = createLucideIcon(\"X\", [\n [\"path\", { d: \"M18 6 6 18\", key: \"1bl5f8\" }],\n [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n]);\n\nexport { X as default };\n//# sourceMappingURL=x.js.map\n","/**\n * Jean Memory React SDK - Chat Component\n * Complete chat interface with authentication\n */\nimport React, { useState, useRef, useEffect } from 'react';\nimport { useJean } from './provider';\nimport { SignInWithJean } from './SignInWithJean';\nimport { User, Bot, Send, LogOut, Trash2, X, Sun, Moon } from 'lucide-react';\n\ninterface JeanChatProps {\n className?: string;\n showHeader?: boolean;\n placeholder?: string;\n}\n\nexport function JeanChat({ \n className = '', \n showHeader = true,\n placeholder = 'Type your message...'\n}: JeanChatProps) {\n const agent = useJean();\n const [input, setInput] = useState('');\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const [isDark, setIsDark] = useState(false);\n\n const scrollToBottom = () => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n };\n\n useEffect(() => {\n scrollToBottom();\n }, [agent.messages]);\n\n useEffect(() => {\n if (typeof window !== 'undefined') {\n const storedTheme = localStorage.getItem('jean-chat-theme');\n if (storedTheme === 'dark') {\n setIsDark(true);\n }\n }\n }, []);\n\n useEffect(() => {\n if (isDark) {\n document.documentElement.classList.add('dark');\n localStorage.setItem('jean-chat-theme', 'dark');\n } else {\n document.documentElement.classList.remove('dark');\n localStorage.setItem('jean-chat-theme', 'light');\n }\n }, [isDark]);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!input.trim() || agent.isLoading) return;\n\n const message = input.trim();\n setInput('');\n\n try {\n await agent.sendMessage(message);\n } catch (err) {\n console.error('Failed to send message:', err);\n }\n };\n\n if (!agent.isAuthenticated) {\n return (\n <div className={`flex items-center justify-center h-full ${className} bg-gray-50 dark:bg-gray-900`}>\n <div className=\"text-center p-8 max-w-md w-full\">\n <div className=\"w-16 h-16 mx-auto mb-6 rounded-2xl bg-white dark:bg-gray-800 flex items-center justify-center border border-gray-200 dark:border-gray-700\">\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M12 2L13.09 8.26L20 9L13.09 15.74L12 22L10.91 15.74L4 9L10.91 8.26L12 2Z\" \n stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"\n className=\"text-gray-600 dark:text-gray-400\"/>\n </svg>\n </div>\n <h3 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">Connect with Jean Memory</h3>\n <p className=\"text-gray-600 dark:text-gray-400 text-sm mb-6\">\n Access your personalized AI assistant with persistent memory across all your applications.\n </p>\n <button \n onClick={agent.signIn}\n className=\"inline-flex items-center justify-center gap-2.5 px-5 py-2.5 bg-black text-white font-medium text-sm border border-transparent rounded-lg hover:bg-gray-800 transition-all focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-gray-900 dark:bg-white dark:text-black dark:hover:bg-gray-200 dark:focus:ring-gray-300 shadow-md hover:shadow-lg disabled:opacity-60 disabled:cursor-not-allowed\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M12 2L13.09 8.26L20 9L13.09 15.74L12 22L10.91 15.74L4 9L10.91 8.26L12 2Z\" \n stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n <span>Sign In with Jean</span>\n </button>\n </div>\n </div>\n );\n }\n\n return (\n <div className={`flex flex-col h-full bg-white dark:bg-gray-900 text-gray-900 dark:text-white ${className}`}>\n {showHeader && (\n <div className=\"flex justify-between items-center px-4 py-3 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800\">\n <div className=\"flex items-center space-x-3\">\n <div className=\"w-10 h-10 rounded-full bg-gradient-to-br from-blue-400 to-purple-500 flex items-center justify-center\">\n <Bot size={20} className=\"text-white\" />\n </div>\n <div>\n <h3 className=\"font-semibold\">Jean Memory Assistant</h3>\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">Connected as {agent.user?.email}</p>\n </div>\n </div>\n <div className=\"flex items-center space-x-2\">\n <button\n onClick={() => setIsDark(!isDark)}\n className=\"p-2 text-gray-500 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 rounded-full transition-colors\"\n >\n {isDark ? <Sun size={16} /> : <Moon size={16} />}\n </button>\n <button\n onClick={() => window.location.reload()}\n disabled={agent.messages.length === 0}\n className=\"p-2 text-gray-500 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 rounded-full disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n title=\"Clear Conversation\"\n >\n <Trash2 size={16} />\n </button>\n <button\n onClick={agent.signOut}\n className=\"p-2 text-red-500 hover:bg-red-100 dark:hover:bg-red-900/50 rounded-full transition-colors\"\n title=\"Sign Out\"\n >\n <LogOut size={16} />\n </button>\n </div>\n </div>\n )}\n\n {/* Messages */}\n <div className=\"flex-1 overflow-y-auto p-6 space-y-6\">\n {agent.messages.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center h-full text-center text-gray-500 dark:text-gray-400\">\n <div className=\"w-20 h-20 rounded-full bg-gray-100 dark:bg-gray-800 flex items-center justify-center mb-4\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"text-gray-400 dark:text-gray-500\">\n <path d=\"M12 2L13.09 8.26L20 9L13.09 15.74L12 22L10.91 15.74L4 9L10.91 8.26L12 2Z\"></path>\n </svg>\n </div>\n <h3 className=\"text-lg font-medium text-gray-800 dark:text-gray-200 mb-1\">Start a conversation</h3>\n <p className=\"text-sm max-w-sm\">\n Ask me anything! I have access to your personal context and can help with a wide range of topics.\n </p>\n </div>\n ) : (\n <>\n {agent.messages.map((message: any) => (\n <div\n key={message.id}\n className={`flex items-start gap-3 ${message.role === 'user' ? 'justify-end' : 'justify-start'}`}\n >\n {message.role !== 'user' && (\n <div className=\"w-8 h-8 rounded-full bg-gradient-to-br from-blue-400 to-purple-500 flex items-center justify-center flex-shrink-0\">\n <Bot size={18} className=\"text-white\" />\n </div>\n )}\n <div className={`max-w-[80%]`}>\n <div\n className={`px-4 py-2.5 rounded-2xl ${\n message.role === 'user'\n ? 'bg-blue-600 text-white rounded-br-lg'\n : 'bg-gray-100 dark:bg-gray-800 text-gray-900 dark:text-gray-100 rounded-bl-lg'\n }`}\n >\n <p className=\"text-sm whitespace-pre-wrap leading-relaxed\">\n {message.content}\n </p>\n </div>\n <div className={`mt-1.5 px-1 ${\n message.role === 'user' ? 'text-right' : 'text-left'\n }`}>\n <span className=\"text-xs text-gray-400 dark:text-gray-500\">\n {message.timestamp.toLocaleTimeString([], { \n hour: 'numeric', \n minute: '2-digit' \n })}\n </span>\n </div>\n </div>\n {message.role === 'user' && (\n <div className=\"w-8 h-8 rounded-full bg-gray-200 dark:bg-gray-700 flex items-center justify-center flex-shrink-0\">\n <User size={18} className=\"text-gray-600 dark:text-gray-300\" />\n </div>\n )}\n </div>\n ))}\n \n {agent.isLoading && (\n <div className=\"flex items-start gap-3 justify-start\">\n <div className=\"w-8 h-8 rounded-full bg-gradient-to-br from-blue-400 to-purple-500 flex items-center justify-center flex-shrink-0\">\n <Bot size={18} className=\"text-white\" />\n </div>\n <div className=\"bg-gray-100 dark:bg-gray-800 text-gray-900 dark:text-gray-100 px-4 py-2.5 rounded-2xl rounded-bl-lg\">\n <div className=\"flex items-center space-x-2\">\n <div className=\"flex space-x-1\">\n <div className=\"w-2 h-2 bg-gray-400 rounded-full animate-bounce\"></div>\n <div className=\"w-2 h-2 bg-gray-400 rounded-full animate-bounce\" style={{ animationDelay: '0.1s' }}></div>\n <div className=\"w-2 h-2 bg-gray-400 rounded-full animate-bounce\" style={{ animationDelay: '0.2s' }}></div>\n </div>\n </div>\n </div>\n </div>\n )}\n <div ref={messagesEndRef} />\n </>\n )}\n </div>\n\n <div className=\"border-t border-gray-200 dark:border-gray-700 p-4 bg-gray-50 dark:bg-gray-800\">\n {agent.error && (\n <div className=\"mb-3 p-3 bg-red-100 dark:bg-red-900/30 border border-red-200 dark:border-red-800/50 rounded-lg flex items-start space-x-3\">\n <div className=\"text-red-600 dark:text-red-400 mt-0.5\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line>\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line>\n </svg>\n </div>\n <div className=\"flex-1\">\n <p className=\"text-red-700 dark:text-red-300 text-sm font-medium\">Error</p>\n <p className=\"text-red-600 dark:text-red-400 text-sm\">{agent.error}</p>\n </div>\n <button \n onClick={() => window.location.reload()} \n className=\"p-1 text-red-600 dark:text-red-400 hover:bg-red-200 dark:hover:bg-red-900/50 rounded-full\"\n >\n <X size={16}/>\n </button>\n </div>\n )}\n <form onSubmit={handleSubmit} className=\"relative\">\n <textarea\n value={input}\n onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) => setInput(e.target.value)}\n onKeyDown={(e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSubmit(e as any);\n }\n }}\n placeholder={placeholder}\n disabled={agent.isLoading}\n className=\"w-full px-4 py-3 pr-12 bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-2xl focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent disabled:opacity-50 resize-none text-sm\"\n rows={1}\n />\n <button\n type=\"submit\"\n disabled={agent.isLoading || !input.trim()}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 w-8 h-8 bg-blue-600 text-white rounded-full hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center transition-colors\"\n >\n {agent.isLoading ? (\n <div className=\"w-4 h-4 border-2 border-white border-t-transparent rounded-full animate-spin\"></div>\n ) : (\n <Send size={16} />\n )}\n </button>\n </form>\n </div>\n </div>\n );\n}","/**\n * Jean Memory React SDK - Sign In With Jean Component\n * OAuth 2.1 PKCE authentication flow\n */\nimport React, { useEffect, useState } from 'react';\nimport { JEAN_API_BASE, JEAN_OAUTH_BASE } from './config';\n\ninterface SignInWithJeanProps {\n onSuccess: (user: any) => void;\n onError?: (error: Error) => void;\n apiKey?: string;\n className?: string;\n children?: React.ReactNode;\n}\n\n// Generate code verifier and challenge for PKCE\nfunction generatePKCE() {\n const verifier = generateRandomString(128);\n const encoder = new TextEncoder();\n const data = encoder.encode(verifier);\n \n return crypto.subtle.digest('SHA-256', data).then(digest => {\n const challenge = btoa(String.fromCharCode(...new Uint8Array(digest)))\n .replace(/=/g, '')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_');\n return { verifier, challenge };\n });\n}\n\nfunction generateRandomString(length: number): string {\n const charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~';\n const values = crypto.getRandomValues(new Uint8Array(length));\n return Array.from(values)\n .map(x => charset[x % charset.length])\n .join('');\n}\n\nexport function SignInWithJean({ \n onSuccess, \n onError, \n apiKey,\n className = '', \n children \n}: SignInWithJeanProps) {\n const [isLoading, setIsLoading] = useState(false);\n\n useEffect(() => {\n // Handle OAuth callback\n const params = new URLSearchParams(window.location.search);\n const code = params.get('code');\n const state = params.get('state');\n \n if (code && state) {\n handleOAuthCallback(code, state);\n }\n }, []);\n\n const handleOAuthCallback = async (code: string, state: string) => {\n try {\n // Retrieve PKCE verifier from sessionStorage\n const storedState = sessionStorage.getItem('jean_oauth_state');\n const verifier = sessionStorage.getItem('jean_oauth_verifier');\n \n if (state !== storedState) {\n throw new Error('State mismatch - possible CSRF attack');\n }\n \n if (!verifier) {\n throw new Error('Missing PKCE verifier');\n }\n\n // Exchange code for token\n const response = await fetch(`${JEAN_API_BASE}/oauth/token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n grant_type: 'authorization_code',\n code,\n redirect_uri: window.location.origin + window.location.pathname,\n code_verifier: verifier,\n client_id: apiKey || 'default_client'\n })\n });\n\n if (!response.ok) {\n throw new Error('Failed to exchange code for token');\n }\n\n const data = await response.json();\n \n // Get user info\n const userResponse = await fetch(`${JEAN_API_BASE}/api/v1/user/me`, {\n headers: {\n 'Authorization': `Bearer ${data.access_token}`\n }\n });\n\n if (!userResponse.ok) {\n throw new Error('Failed to get user info');\n }\n\n const user = await userResponse.json();\n user.access_token = data.access_token;\n\n // Clean up\n sessionStorage.removeItem('jean_oauth_state');\n sessionStorage.removeItem('jean_oauth_verifier');\n \n // Remove OAuth params from URL\n const url = new URL(window.location.href);\n url.searchParams.delete('code');\n url.searchParams.delete('state');\n window.history.replaceState({}, '', url.toString());\n\n onSuccess(user);\n } catch (error) {\n console.error('OAuth callback error:', error);\n if (onError) {\n onError(error instanceof Error ? error : new Error('OAuth callback failed'));\n }\n }\n };\n\n const handleSignIn = async () => {\n setIsLoading(true);\n \n try {\n // Generate PKCE parameters\n const { verifier, challenge } = await generatePKCE();\n const state = generateRandomString(32);\n \n // Store for callback\n sessionStorage.setItem('jean_oauth_state', state);\n sessionStorage.setItem('jean_oauth_verifier', verifier);\n \n // Build OAuth URL\n const params = new URLSearchParams({\n response_type: 'code',\n client_id: apiKey || 'default_client',\n redirect_uri: window.location.origin + window.location.pathname,\n state,\n code_challenge: challenge,\n code_challenge_method: 'S256',\n scope: 'read write'\n });\n \n // Redirect to OAuth provider\n window.location.href = `${JEAN_OAUTH_BASE}/oauth/authorize?${params.toString()}`;\n } catch (error) {\n setIsLoading(false);\n console.error('Sign in error:', error);\n if (onError) {\n onError(error instanceof Error ? error : new Error('Sign in failed'));\n }\n }\n };\n\n return (\n <button\n onClick={handleSignIn}\n disabled={isLoading}\n className={`inline-flex items-center justify-center gap-2.5 px-5 py-2.5 bg-black text-white font-medium text-sm border border-transparent rounded-lg hover:bg-gray-800 transition-all focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-gray-900 dark:bg-white dark:text-black dark:hover:bg-gray-200 dark:focus:ring-gray-300 shadow-md hover:shadow-lg disabled:opacity-60 disabled:cursor-not-allowed ${className}`}\n >\n {isLoading ? (\n <>\n <div className=\"w-4 h-4 border-2 border-white dark:border-black border-t-transparent rounded-full animate-spin\"></div>\n <span>Signing in...</span>\n </>\n ) : children || (\n <>\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M12 2L13.09 8.26L20 9L13.09 15.74L12 22L10.91 15.74L4 9L10.91 8.26L12 2Z\" \n stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n <span>Sign In with Jean</span>\n </>\n )}\n </button>\n );\n}","/**\n * Jean Memory React SDK - Advanced MCP Hook\n * Direct access to MCP tools for advanced users\n * Uses the jean_memory MCP tool directly (same as Claude Desktop/Cursor)\n */\nimport { useCallback } from 'react';\nimport { JEAN_API_BASE } from './config';\nimport { makeMCPRequest } from './mcp';\n\ninterface JeanUser {\n user_id: string;\n email: string;\n access_token: string;\n}\n\ninterface MCPRequest {\n jsonrpc: string;\n id: number;\n method: string;\n params: {\n name: string;\n arguments: any;\n };\n}\n\ninterface MCPResponse {\n jsonrpc: string;\n id: number;\n result?: {\n content: Array<{\n type: string;\n text: string;\n }>;\n };\n error?: {\n code: number;\n message: string;\n };\n}\n\ninterface UseJeanMCPOptions {\n apiKey: string;\n clientName?: string;\n}\n\ninterface UseJeanMCPReturn {\n callJeanMemory: (user: JeanUser, message: string, isNewConversation?: boolean) => Promise<string>;\n addMemory: (user: JeanUser, content: string) => Promise<string>;\n searchMemory: (user: JeanUser, query: string) => Promise<string>;\n storeDocument: (user: JeanUser, title: string, content: string, type?: string) => Promise<string>;\n}\n\n/**\n * Advanced hook for direct MCP tool access\n * Use this when you need fine-grained control over Jean Memory tools\n */\nexport function useJeanMCP({ apiKey, clientName = 'react-app' }: UseJeanMCPOptions): UseJeanMCPReturn {\n const callJeanMemory = useCallback(\n async (\n user: JeanUser,\n message: string,\n isNewConversation: boolean = false\n ): Promise<string> => {\n const response = await makeMCPRequest(\n user,\n apiKey,\n 'jean_memory',\n {\n user_message: message,\n is_new_conversation: isNewConversation,\n needs_context: true\n },\n clientName\n );\n if (response.error) {\n throw new Error(`MCP Error: ${response.error.message}`);\n }\n return response.result?.content?.[0]?.text || 'No response from tool';\n },\n [apiKey, clientName]\n );\n\n const addMemory = useCallback(\n async (user: JeanUser, content: string): Promise<string> => {\n const response = await makeMCPRequest(\n user,\n apiKey,\n 'add_memories',\n { text: content },\n clientName\n );\n if (response.error) {\n throw new Error(`MCP Error: ${response.error.message}`);\n }\n return response.result?.content?.[0]?.text || 'No response from tool';\n },\n [apiKey, clientName]\n );\n\n const searchMemory = useCallback(\n async (user: JeanUser, query: string): Promise<string> => {\n const response = await makeMCPRequest(\n user,\n apiKey,\n 'search_memory',\n { query },\n clientName\n );\n if (response.error) {\n throw new Error(`MCP Error: ${response.error.message}`);\n }\n return response.result?.content?.[0]?.text || 'No response from tool';\n },\n [apiKey, clientName]\n );\n\n const storeDocument = useCallback(\n async (\n user: JeanUser,\n title: string,\n content: string,\n type: string = 'markdown'\n ): Promise<string> => {\n const response = await makeMCPRequest(\n user,\n apiKey,\n 'store_document',\n {\n title,\n content,\n document_type: type\n },\n clientName\n );\n if (response.error) {\n throw new Error(`MCP Error: ${response.error.message}`);\n }\n return response.result?.content?.[0]?.text || 'No response from tool';\n },\n [apiKey, clientName]\n );\n\n return {\n callJeanMemory,\n addMemory,\n searchMemory,\n storeDocument\n };\n}"],"names":["createContext","generatePKCE","generateRandomString","useState","useEffect","useContext","forwardRef","createElement","useRef","jsx","jsxs","Fragment","useCallback"],"mappings":";;;;AAIO,MAAM,gBAAgB;AACtB,MAAM,kBAAkB;AC0B/B,IAAI,YAAY;AAEhB,eAAsB,eACpB,MACA,QACA,UACA,YACA,aAAqB,aACC;AACtB,QAAM,KAAK,EAAE;AAEb,QAAM,aAAyB;AAAA,IAC7B,SAAS;AAAA,IACT;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,WAAW;AAAA,IAAA;AAAA,EACb;AAGF,QAAM,WAAW,MAAM,MAAM,GAAG,aAAa,QAAQ,UAAU,aAAa,KAAK,OAAO,IAAI;AAAA,IAC1F,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,aAAa,KAAK;AAAA,MAClB,iBAAiB;AAAA,MACjB,aAAa;AAAA,IAAA;AAAA,IAEf,MAAM,KAAK,UAAU,UAAU;AAAA,EAAA,CAChC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,YAAY,MAAM,SAAS,KAAA;AACjC,UAAM,IAAI,MAAM,uBAAuB,SAAS,UAAU,MAAM,SAAS,EAAE;AAAA,EAC7E;AAEA,SAAO,SAAS,KAAA;AAClB;ACfA,MAAM,cAAcA,MAAAA,cAAuC,IAAI;AAG/D,SAASC,iBAAe;AACtB,QAAM,WAAWC,uBAAqB,GAAG;AACzC,QAAM,UAAU,IAAI,YAAA;AACpB,QAAM,OAAO,QAAQ,OAAO,QAAQ;AAEpC,SAAO,OAAO,OAAO,OAAO,WAAW,IAAI,EAAE,KAAK,CAAA,WAAU;AAC1D,UAAM,YAAY,KAAK,OAAO,aAAa,GAAG,IAAI,WAAW,MAAM,CAAC,CAAC,EAClE,QAAQ,MAAM,EAAE,EAChB,QAAQ,OAAO,GAAG,EAClB,QAAQ,OAAO,GAAG;AACrB,WAAO,EAAE,UAAU,UAAA;AAAA,EACrB,CAAC;AACH;AAEA,SAASA,uBAAqB,QAAwB;AACpD,QAAM,UAAU;AAChB,QAAM,SAAS,OAAO,gBAAgB,IAAI,WAAW,MAAM,CAAC;AAC5D,SAAO,MAAM,KAAK,MAAM,EACrB,IAAI,CAAA,MAAK,QAAQ,IAAI,QAAQ,MAAM,CAAC,EACpC,KAAK,EAAE;AACZ;AAOO,SAAS,aAAa,EAAE,QAAQ,YAA+B;AACpE,QAAM,CAAC,MAAM,OAAO,IAAIC,MAAAA,SAA0B,IAAI;AACtD,QAAM,CAAC,UAAU,WAAW,IAAIA,MAAAA,SAAwB,CAAA,CAAE;AAC1D,QAAM,CAAC,WAAW,YAAY,IAAIA,MAAAA,SAAS,KAAK;AAChD,QAAM,CAAC,UAAU,WAAW,IAAIA,MAAAA,SAAwB,IAAI;AAG5DC,QAAAA,UAAU,MAAM;AACd,QAAI,CAAC,QAAQ;AACX,kBAAY,qBAAqB;AACjC;AAAA,IACF;AAEA,QAAI,CAAC,OAAO,WAAW,UAAU,GAAG;AAClC,kBAAY,wBAAwB;AACpC;AAAA,IACF;AAGA,YAAQ,IAAI,+BAA+B;AAAA,EAC7C,GAAG,CAAC,MAAM,CAAC;AAGXA,QAAAA,UAAU,MAAM;AACd,UAAM,aAAa,aAAa,QAAQ,WAAW;AACnD,QAAI,YAAY;AACd,UAAI;AACF,gBAAQ,KAAK,MAAM,UAAU,CAAC;AAAA,MAChC,SAAS,GAAG;AACV,qBAAa,WAAW,WAAW;AAAA,MACrC;AAAA,IACF;AAAA,EACF,GAAG,CAAA,CAAE;AAEL,QAAM,cAAc,OAAO,SAAiB,UAA0B,CAAA,MAAO;AAC3E,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,wBAAwB;AAAA,IAC1C;AAEA,iBAAa,IAAI;AACjB,gBAAY,IAAI;AAEhB,QAAI;AAEF,YAAM,cAA2B;AAAA,QAC/B,IAAI,KAAK,IAAA,EAAM,SAAA;AAAA,QACf,MAAM;AAAA,QACN,SAAS;AAAA,QACT,+BAAe,KAAA;AAAA,MAAK;AAEtB,kBAAY,CAAA,SAAQ,CAAC,GAAG,MAAM,WAAW,CAAC;AAE1C,YAAM,WAAW,MAAM;AAAA,QACrB;AAAA,QACA;AAAA,QACA,QAAQ,QAAQ;AAAA,QAChB;AAAA,UACE,cAAc;AAAA,UACd,qBAAqB,SAAS,UAAU;AAAA,UACxC,eAAe;AAAA,QAAA;AAAA,MACjB;AAGF,UAAI,SAAS,OAAO;AAClB,cAAM,IAAI,MAAM,SAAS,MAAM,OAAO;AAAA,MACxC;AAEA,YAAM,mBAAgC;AAAA,QACpC,KAAK,KAAK,IAAA,IAAQ,GAAG,SAAA;AAAA,QACrB,MAAM;AAAA,QACN,SAAS,SAAS,QAAQ,UAAU,CAAC,GAAG,QAAQ;AAAA,QAChD,+BAAe,KAAA;AAAA,MAAK;AAEtB,kBAAY,CAAA,SAAQ,CAAC,GAAG,MAAM,gBAAgB,CAAC;AAAA,IACjD,SAAS,KAAK;AACZ,YAAM,eAAe,eAAe,QAAQ,IAAI,UAAU;AAC1D,kBAAY,YAAY;AACxB,YAAM;AAAA,IACR,UAAA;AACE,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,gBAAgB,OAAO,OAAe,YAAmC;AAC7E,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,wBAAwB;AAAA,IAC1C;AACA,UAAM,WAAW,MAAM,eAAe,MAAM,QAAQ,kBAAkB;AAAA,MACpE;AAAA,MACA;AAAA,MACA,eAAe;AAAA,IAAA,CAChB;AACD,QAAI,SAAS,OAAO;AAClB,YAAM,IAAI,MAAM,SAAS,MAAM,OAAO;AAAA,IACxC;AAAA,EACF;AAEA,QAAM,UAAU,CAAC,YAA2C;AAC1D,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,wBAAwB;AAAA,IAC1C;AAGA,UAAM,iBAAiB,GAAG,aAAa,wBAAwB,OAAO,uBAAuB,KAAK,YAAY;AAG9G,UAAM,QAAQ,OAAO;AAAA,MACnB;AAAA,MACA,WAAW,OAAO;AAAA,MAClB;AAAA,IAAA;AAIF,UAAM,cAAc,YAAY,MAAM;AACpC,UAAI,OAAO,QAAQ;AACjB,sBAAc,WAAW;AACzB,gBAAQ,IAAI,GAAG,OAAO,4BAA4B;AAAA,MAEpD;AAAA,IACF,GAAG,GAAI;AAAA,EACT;AAGA,QAAM,SAAS,YAAY;AACzB,iBAAa,IAAI;AAEjB,QAAI;AAEF,YAAM,EAAE,UAAU,UAAA,IAAc,MAAMH,eAAA;AACtC,YAAM,QAAQC,uBAAqB,EAAE;AAGrC,qBAAe,QAAQ,oBAAoB,KAAK;AAChD,qBAAe,QAAQ,uBAAuB,QAAQ;AAGtD,YAAM,SAAS,IAAI,gBAAgB;AAAA,QACjC,eAAe;AAAA,QACf,WAAW,UAAU;AAAA,QACrB,cAAc,OAAO,SAAS,SAAS,OAAO,SAAS;AAAA,QACvD;AAAA,QACA,gBAAgB;AAAA,QAChB,uBAAuB;AAAA,QACvB,OAAO;AAAA,MAAA,CACR;AAGD,aAAO,SAAS,OAAO,GAAG,aAAa,oBAAoB,OAAO,UAAU;AAAA,IAC9E,SAAS,OAAO;AACd,mBAAa,KAAK;AAClB,YAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU;AAC9D,kBAAY,YAAY;AAAA,IAC1B;AAAA,EACF;AAEA,QAAM,gBAAgB,CAAC,YAAsB;AAC3C,YAAQ,OAAO;AACf,iBAAa,QAAQ,aAAa,KAAK,UAAU,OAAO,CAAC;AAAA,EAC3D;AAEA,QAAM,UAAU,MAAM;AACpB,YAAQ,IAAI;AACZ,gBAAY,CAAA,CAAE;AACd,iBAAa,WAAW,WAAW;AAAA,EACrC;AAEA,QAAM,oBAAoB,MAAM;AAC9B,gBAAY,CAAA,CAAE;AAAA,EAChB;AAGA,QAAM,QAAQ;AAAA,IACZ,YAAY,OAAO,YAAoB;AACrC,UAAI,CAAC,MAAM;AACT,cAAM,IAAI,MAAM,wBAAwB;AAAA,MAC1C;AAEA,YAAM,WAAW,MAAM;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACA,EAAE,QAAA;AAAA,MAAQ;AAGZ,UAAI,SAAS,OAAO;AAClB,cAAM,IAAI,MAAM,SAAS,MAAM,OAAO;AAAA,MACxC;AAEA,aAAO,SAAS;AAAA,IAClB;AAAA,IAEA,eAAe,OAAO,UAAkB;AACtC,UAAI,CAAC,MAAM;AACT,cAAM,IAAI,MAAM,wBAAwB;AAAA,MAC1C;AAEA,YAAM,WAAW,MAAM;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACA,EAAE,MAAA;AAAA,MAAM;AAGV,UAAI,SAAS,OAAO;AAClB,cAAM,IAAI,MAAM,SAAS,MAAM,OAAO;AAAA,MACxC;AAEA,aAAO,SAAS;AAAA,IAClB;AAAA,EAAA;AAGF,QAAM,eAAiC;AAAA;AAAA,IAErC,iBAAiB,CAAC,CAAC;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA;AAAA,IAGP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA;AAAA,IAGT;AAAA,EAAA;AAGF,wCACG,YAAY,UAAZ,EAAqB,OAAO,cAC1B,UACH;AAEJ;AAEO,SAAS,UAAU;AACxB,QAAM,UAAUG,MAAAA,WAAW,WAAW;AACtC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACA,SAAO;AACT;ACzUA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,MAAM,cAAc,CAAC,WAAW,OAAO,QAAQ,sBAAsB,OAAO,EAAE,YAAW;AACzF,MAAM,eAAe,IAAI,YAAY,QAAQ,OAAO,CAAC,WAAW,OAAO,UAAU;AAC/E,SAAO,QAAQ,SAAS,KAAK,MAAM,QAAQ,SAAS,MAAM;AAC5D,CAAC,EAAE,KAAK,GAAG;ACVX;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,IAAI,oBAAoB;AAAA,EACtB,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,eAAe;AAAA,EACf,gBAAgB;AAClB;ACjBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA,MAAM,OAAOC,MAAAA;AAAAA,EACX,CAAC;AAAA,IACC,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,cAAc;AAAA,IACd;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACP,GAAK,QAAQ;AACT,WAAOC,MAAAA;AAAAA,MACL;AAAA,MACA;AAAA,QACE;AAAA,QACA,GAAG;AAAA,QACH,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,aAAa,sBAAsB,OAAO,WAAW,IAAI,KAAK,OAAO,IAAI,IAAI;AAAA,QAC7E,WAAW,aAAa,UAAU,SAAS;AAAA,QAC3C,GAAG;AAAA,MACX;AAAA,MACM;AAAA,QACE,GAAG,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,MAAMA,MAAAA,cAAc,KAAK,KAAK,CAAC;AAAA,QAC3D,GAAG,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC,QAAQ;AAAA,MACzD;AAAA,IACA;AAAA,EACE;AACF;ACxCA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA,MAAM,mBAAmB,CAAC,UAAU,aAAa;AAC/C,QAAM,YAAYD,MAAAA;AAAAA,IAChB,CAAC,EAAE,WAAW,GAAG,MAAK,GAAI,QAAQC,MAAAA,cAAc,MAAM;AAAA,MACpD;AAAA,MACA;AAAA,MACA,WAAW,aAAa,UAAU,YAAY,QAAQ,CAAC,IAAI,SAAS;AAAA,MACpE,GAAG;AAAA,IACT,CAAK;AAAA,EACL;AACE,YAAU,cAAc,GAAG,QAAQ;AACnC,SAAO;AACT;ACtBA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAM,MAAM,iBAAiB,OAAO;AAAA,EAClC,CAAC,QAAQ,EAAE,GAAG,aAAa,KAAK,SAAQ,CAAE;AAAA,EAC1C,CAAC,QAAQ,EAAE,OAAO,MAAM,QAAQ,MAAM,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,KAAK,SAAQ,CAAE;AAAA,EAC9E,CAAC,QAAQ,EAAE,GAAG,WAAW,KAAK,SAAQ,CAAE;AAAA,EACxC,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAQ,CAAE;AAAA,EACzC,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAQ,CAAE;AAAA,EACzC,CAAC,QAAQ,EAAE,GAAG,WAAW,KAAK,SAAQ,CAAE;AAC1C,CAAC;AChBD;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAM,SAAS,iBAAiB,UAAU;AAAA,EACxC,CAAC,QAAQ,EAAE,GAAG,2CAA2C,KAAK,SAAQ,CAAE;AAAA,EACxE,CAAC,YAAY,EAAE,QAAQ,oBAAoB,KAAK,SAAQ,CAAE;AAAA,EAC1D,CAAC,QAAQ,EAAE,IAAI,MAAM,IAAI,KAAK,IAAI,MAAM,IAAI,MAAM,KAAK,SAAQ,CAAE;AACnE,CAAC;ACbD;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAM,OAAO,iBAAiB,QAAQ;AAAA,EACpC,CAAC,QAAQ,EAAE,GAAG,sCAAsC,KAAK,SAAQ,CAAE;AACrE,CAAC;ACXD;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAM,OAAO,iBAAiB,QAAQ;AAAA,EACpC,CAAC,QAAQ,EAAE,GAAG,uBAAuB,KAAK,SAAQ,CAAE;AAAA,EACpD,CAAC,QAAQ,EAAE,GAAG,eAAe,KAAK,SAAQ,CAAE;AAC9C,CAAC;ACZD;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAM,MAAM,iBAAiB,OAAO;AAAA,EAClC,CAAC,UAAU,EAAE,IAAI,MAAM,IAAI,MAAM,GAAG,KAAK,KAAK,UAAU;AAAA,EACxD,CAAC,QAAQ,EAAE,GAAG,WAAW,KAAK,SAAQ,CAAE;AAAA,EACxC,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAQ,CAAE;AAAA,EACzC,CAAC,QAAQ,EAAE,GAAG,wBAAwB,KAAK,SAAQ,CAAE;AAAA,EACrD,CAAC,QAAQ,EAAE,GAAG,0BAA0B,KAAK,SAAQ,CAAE;AAAA,EACvD,CAAC,QAAQ,EAAE,GAAG,WAAW,KAAK,SAAQ,CAAE;AAAA,EACxC,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAQ,CAAE;AAAA,EACzC,CAAC,QAAQ,EAAE,GAAG,yBAAyB,KAAK,SAAQ,CAAE;AAAA,EACtD,CAAC,QAAQ,EAAE,GAAG,yBAAyB,KAAK,SAAQ,CAAE;AACxD,CAAC;ACnBD;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAM,SAAS,iBAAiB,UAAU;AAAA,EACxC,CAAC,QAAQ,EAAE,GAAG,WAAW,KAAK,SAAQ,CAAE;AAAA,EACxC,CAAC,QAAQ,EAAE,GAAG,yCAAyC,KAAK,SAAQ,CAAE;AAAA,EACtE,CAAC,QAAQ,EAAE,GAAG,sCAAsC,KAAK,SAAQ,CAAE;AAAA,EACnE,CAAC,QAAQ,EAAE,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,SAAQ,CAAE;AAAA,EAClE,CAAC,QAAQ,EAAE,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,QAAO,CAAE;AACnE,CAAC;ACfD;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAM,OAAO,iBAAiB,QAAQ;AAAA,EACpC,CAAC,QAAQ,EAAE,GAAG,6CAA6C,KAAK,SAAQ,CAAE;AAAA,EAC1E,CAAC,UAAU,EAAE,IAAI,MAAM,IAAI,KAAK,GAAG,KAAK,KAAK,SAAQ,CAAE;AACzD,CAAC;ACZD;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAM,IAAI,iBAAiB,KAAK;AAAA,EAC9B,CAAC,QAAQ,EAAE,GAAG,cAAc,KAAK,SAAQ,CAAE;AAAA,EAC3C,CAAC,QAAQ,EAAE,GAAG,cAAc,KAAK,SAAQ,CAAE;AAC7C,CAAC;ACGM,SAAS,SAAS;AAAA,EACvB,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,cAAc;AAChB,GAAkB;AAChB,QAAM,QAAQ,QAAA;AACd,QAAM,CAAC,OAAO,QAAQ,IAAIJ,MAAAA,SAAS,EAAE;AACrC,QAAM,iBAAiBK,MAAAA,OAAuB,IAAI;AAClD,QAAM,CAAC,QAAQ,SAAS,IAAIL,MAAAA,SAAS,KAAK;AAE1C,QAAM,iBAAiB,MAAM;AAC3B,mBAAe,SAAS,eAAe,EAAE,UAAU,UAAU;AAAA,EAC/D;AAEAC,QAAAA,UAAU,MAAM;AACd,mBAAA;AAAA,EACF,GAAG,CAAC,MAAM,QAAQ,CAAC;AAEnBA,QAAAA,UAAU,MAAM;AACd,QAAI,OAAO,WAAW,aAAa;AACjC,YAAM,cAAc,aAAa,QAAQ,iBAAiB;AAC1D,UAAI,gBAAgB,QAAQ;AAC1B,kBAAU,IAAI;AAAA,MAChB;AAAA,IACF;AAAA,EACF,GAAG,CAAA,CAAE;AAELA,QAAAA,UAAU,MAAM;AACd,QAAI,QAAQ;AACV,eAAS,gBAAgB,UAAU,IAAI,MAAM;AAC7C,mBAAa,QAAQ,mBAAmB,MAAM;AAAA,IAChD,OAAO;AACL,eAAS,gBAAgB,UAAU,OAAO,MAAM;AAChD,mBAAa,QAAQ,mBAAmB,OAAO;AAAA,IACjD;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,eAAe,OAAO,MAAuB;AACjD,MAAE,eAAA;AACF,QAAI,CAAC,MAAM,UAAU,MAAM,UAAW;AAEtC,UAAM,UAAU,MAAM,KAAA;AACtB,aAAS,EAAE;AAEX,QAAI;AACF,YAAM,MAAM,YAAY,OAAO;AAAA,IACjC,SAAS,KAAK;AACZ,cAAQ,MAAM,2BAA2B,GAAG;AAAA,IAC9C;AAAA,EACF;AAEA,MAAI,CAAC,MAAM,iBAAiB;AAC1B,WACEK,2BAAAA,IAAC,SAAI,WAAW,2CAA2C,SAAS,gCAClE,UAAAC,2BAAAA,KAAC,OAAA,EAAI,WAAU,mCACb,UAAA;AAAA,MAAAD,2BAAAA,IAAC,OAAA,EAAI,WAAU,6IACb,UAAAA,2BAAAA,IAAC,OAAA,EAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACnD,UAAAA,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UAAK,GAAE;AAAA,UACF,QAAO;AAAA,UAAe,aAAY;AAAA,UAAI,eAAc;AAAA,UAAQ,gBAAe;AAAA,UAC3E,WAAU;AAAA,QAAA;AAAA,MAAA,GAClB,EAAA,CACF;AAAA,MACAA,2BAAAA,IAAC,MAAA,EAAG,WAAU,4DAA2D,UAAA,4BAAwB;AAAA,MACjGA,2BAAAA,IAAC,KAAA,EAAE,WAAU,iDAAgD,UAAA,8FAE7D;AAAA,MACAC,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS,MAAM;AAAA,UACf,WAAU;AAAA,UAEV,UAAA;AAAA,YAAAD,2BAAAA,IAAC,OAAA,EAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACnD,UAAAA,2BAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBAAK,GAAE;AAAA,gBACF,QAAO;AAAA,gBAAe,aAAY;AAAA,gBAAI,eAAc;AAAA,gBAAQ,gBAAe;AAAA,cAAA;AAAA,YAAA,GACnF;AAAA,YACAA,2BAAAA,IAAC,UAAK,UAAA,oBAAA,CAAiB;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACzB,EAAA,CACF,EAAA,CACF;AAAA,EAEJ;AAEA,SACEC,2BAAAA,KAAC,OAAA,EAAI,WAAW,gFAAgF,SAAS,IACtG,UAAA;AAAA,IAAA,cACCA,2BAAAA,KAAC,OAAA,EAAI,WAAU,yHACb,UAAA;AAAA,MAAAA,2BAAAA,KAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,QAAAD,2BAAAA,IAAC,OAAA,EAAI,WAAU,yGACb,UAAAA,2BAAAA,IAAC,OAAI,MAAM,IAAI,WAAU,aAAA,CAAa,EAAA,CACxC;AAAA,wCACC,OAAA,EACC,UAAA;AAAA,UAAAA,2BAAAA,IAAC,MAAA,EAAG,WAAU,iBAAgB,UAAA,yBAAqB;AAAA,UACnDC,2BAAAA,KAAC,KAAA,EAAE,WAAU,4CAA2C,UAAA;AAAA,YAAA;AAAA,YAAc,MAAM,MAAM;AAAA,UAAA,EAAA,CAAM;AAAA,QAAA,EAAA,CAC1F;AAAA,MAAA,GACF;AAAA,MACAA,2BAAAA,KAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,QAAAD,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAM,UAAU,CAAC,MAAM;AAAA,YAChC,WAAU;AAAA,YAET,UAAA,wCAAU,KAAA,EAAI,MAAM,IAAI,IAAKA,2BAAAA,IAAC,MAAA,EAAK,MAAM,GAAA,CAAI;AAAA,UAAA;AAAA,QAAA;AAAA,QAEhDA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAM,OAAO,SAAS,OAAA;AAAA,YAC/B,UAAU,MAAM,SAAS,WAAW;AAAA,YACpC,WAAU;AAAA,YACV,OAAM;AAAA,YAEN,UAAAA,2BAAAA,IAAC,QAAA,EAAO,MAAM,GAAA,CAAI;AAAA,UAAA;AAAA,QAAA;AAAA,QAEpBA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAM;AAAA,YACf,WAAU;AAAA,YACV,OAAM;AAAA,YAEN,UAAAA,2BAAAA,IAAC,QAAA,EAAO,MAAM,GAAA,CAAI;AAAA,UAAA;AAAA,QAAA;AAAA,MACpB,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IAIFA,2BAAAA,IAAC,OAAA,EAAI,WAAU,wCACZ,UAAA,MAAM,SAAS,WAAW,IACzBC,2BAAAA,KAAC,OAAA,EAAI,WAAU,iGACb,UAAA;AAAA,MAAAD,2BAAAA,IAAC,OAAA,EAAI,WAAU,6FACZ,UAAAA,2BAAAA,IAAC,OAAA,EAAI,OAAM,8BAA6B,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,WAAU,oCAC7L,UAAAA,2BAAAA,IAAC,QAAA,EAAK,GAAE,2EAAA,CAA2E,GACrF,GACF;AAAA,MACAA,2BAAAA,IAAC,MAAA,EAAG,WAAU,6DAA4D,UAAA,wBAAoB;AAAA,MAC9FA,2BAAAA,IAAC,KAAA,EAAE,WAAU,oBAAmB,UAAA,oGAAA,CAEhC;AAAA,IAAA,EAAA,CACF,IAEAC,2BAAAA,KAAAC,WAAAA,UAAA,EACG,UAAA;AAAA,MAAA,MAAM,SAAS,IAAI,CAAC,YACnBD,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UAEC,WAAW,0BAA0B,QAAQ,SAAS,SAAS,gBAAgB,eAAe;AAAA,UAE7F,UAAA;AAAA,YAAA,QAAQ,SAAS,UAChBD,2BAAAA,IAAC,OAAA,EAAI,WAAU,qHACb,UAAAA,2BAAAA,IAAC,KAAA,EAAI,MAAM,IAAI,WAAU,aAAA,CAAa,GACxC;AAAA,YAEFC,2BAAAA,KAAC,OAAA,EAAI,WAAW,eACd,UAAA;AAAA,cAAAD,2BAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAW,2BACT,QAAQ,SAAS,SACb,yCACA,6EACN;AAAA,kBAEA,UAAAA,2BAAAA,IAAC,KAAA,EAAE,WAAU,+CACV,kBAAQ,QAAA,CACX;AAAA,gBAAA;AAAA,cAAA;AAAA,6CAEA,OAAA,EAAI,WAAW,eACf,QAAQ,SAAS,SAAS,eAAe,WAC3C,IACE,UAAAA,2BAAAA,IAAC,UAAK,WAAU,4CACb,kBAAQ,UAAU,mBAAmB,IAAI;AAAA,gBACxC,MAAM;AAAA,gBACN,QAAQ;AAAA,cAAA,CACT,GACH,EAAA,CACF;AAAA,YAAA,GACF;AAAA,YACE,QAAQ,SAAS,UACjBA,2BAAAA,IAAC,OAAA,EAAI,WAAU,oGACb,UAAAA,2BAAAA,IAAC,MAAA,EAAK,MAAM,IAAI,WAAU,oCAAmC,EAAA,CAC/D;AAAA,UAAA;AAAA,QAAA;AAAA,QAlCG,QAAQ;AAAA,MAAA,CAqChB;AAAA,MAEA,MAAM,aACLC,gCAAC,OAAA,EAAI,WAAU,wCACb,UAAA;AAAA,QAAAD,2BAAAA,IAAC,OAAA,EAAI,WAAU,qHACb,UAAAA,2BAAAA,IAAC,OAAI,MAAM,IAAI,WAAU,aAAA,CAAa,EAAA,CACxC;AAAA,QACAA,2BAAAA,IAAC,OAAA,EAAI,WAAU,uGACb,UAAAA,2BAAAA,IAAC,OAAA,EAAI,WAAU,+BACb,UAAAC,gCAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,UAAAD,2BAAAA,IAAC,OAAA,EAAI,WAAU,kDAAA,CAAkD;AAAA,UACjEA,+BAAC,SAAI,WAAU,mDAAkD,OAAO,EAAE,gBAAgB,UAAU;AAAA,UACpGA,+BAAC,SAAI,WAAU,mDAAkD,OAAO,EAAE,gBAAgB,SAAO,CAAG;AAAA,QAAA,EAAA,CACtG,GACF,EAAA,CACF;AAAA,MAAA,GACF;AAAA,MAEFA,2BAAAA,IAAC,OAAA,EAAI,KAAK,eAAA,CAAgB;AAAA,IAAA,EAAA,CAC5B,EAAA,CAEJ;AAAA,IAEAC,2BAAAA,KAAC,OAAA,EAAI,WAAU,iFACZ,UAAA;AAAA,MAAA,MAAM,SACLA,gCAAC,OAAA,EAAI,WAAU,6HACb,UAAA;AAAA,QAAAD,2BAAAA,IAAC,OAAA,EAAI,WAAU,yCACb,UAAAC,2BAAAA,KAAC,SAAI,OAAM,8BAA6B,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SACxK,UAAA;AAAA,UAAAD,+BAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK;AAAA,UAC/BA,2BAAAA,IAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK,IAAG,KAAA,CAAK;AAAA,UACrCA,2BAAAA,IAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,SAAQ,IAAG,KAAA,CAAK;AAAA,QAAA,EAAA,CAC3C,EAAA,CACF;AAAA,QACAC,2BAAAA,KAAC,OAAA,EAAI,WAAU,UACb,UAAA;AAAA,UAAAD,2BAAAA,IAAC,KAAA,EAAE,WAAU,sDAAqD,UAAA,SAAK;AAAA,UACvEA,2BAAAA,IAAC,KAAA,EAAE,WAAU,0CAA0C,gBAAM,MAAA,CAAM;AAAA,QAAA,GACrE;AAAA,QACAA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAM,OAAO,SAAS,OAAA;AAAA,YAC/B,WAAU;AAAA,YAEV,UAAAA,2BAAAA,IAAC,GAAA,EAAE,MAAM,GAAA,CAAG;AAAA,UAAA;AAAA,QAAA;AAAA,MACd,GACF;AAAA,MAEFC,2BAAAA,KAAC,QAAA,EAAK,UAAU,cAAc,WAAU,YACtC,UAAA;AAAA,QAAAD,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAO;AAAA,YACP,UAAU,CAAC,MAA8C,SAAS,EAAE,OAAO,KAAK;AAAA,YAChF,WAAW,CAAC,MAAgD;AAC1D,kBAAI,EAAE,QAAQ,WAAW,CAAC,EAAE,UAAU;AACpC,kBAAE,eAAA;AACF,6BAAa,CAAQ;AAAA,cACvB;AAAA,YACF;AAAA,YACA;AAAA,YACA,UAAU,MAAM;AAAA,YAChB,WAAU;AAAA,YACV,MAAM;AAAA,UAAA;AAAA,QAAA;AAAA,QAERA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAU,MAAM,aAAa,CAAC,MAAM,KAAA;AAAA,YACpC,WAAU;AAAA,YAET,UAAA,MAAM,YACLA,2BAAAA,IAAC,OAAA,EAAI,WAAU,gFAA+E,IAE9FA,2BAAAA,IAAC,MAAA,EAAK,MAAM,GAAA,CAAI;AAAA,UAAA;AAAA,QAAA;AAAA,MAEpB,EAAA,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;ACzPA,SAAS,eAAe;AACtB,QAAM,WAAW,qBAAqB,GAAG;AACzC,QAAM,UAAU,IAAI,YAAA;AACpB,QAAM,OAAO,QAAQ,OAAO,QAAQ;AAEpC,SAAO,OAAO,OAAO,OAAO,WAAW,IAAI,EAAE,KAAK,CAAA,WAAU;AAC1D,UAAM,YAAY,KAAK,OAAO,aAAa,GAAG,IAAI,WAAW,MAAM,CAAC,CAAC,EAClE,QAAQ,MAAM,EAAE,EAChB,QAAQ,OAAO,GAAG,EAClB,QAAQ,OAAO,GAAG;AACrB,WAAO,EAAE,UAAU,UAAA;AAAA,EACrB,CAAC;AACH;AAEA,SAAS,qBAAqB,QAAwB;AACpD,QAAM,UAAU;AAChB,QAAM,SAAS,OAAO,gBAAgB,IAAI,WAAW,MAAM,CAAC;AAC5D,SAAO,MAAM,KAAK,MAAM,EACrB,IAAI,CAAA,MAAK,QAAQ,IAAI,QAAQ,MAAM,CAAC,EACpC,KAAK,EAAE;AACZ;AAEO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AACF,GAAwB;AACtB,QAAM,CAAC,WAAW,YAAY,IAAIN,MAAAA,SAAS,KAAK;AAEhDC,QAAAA,UAAU,MAAM;AAEd,UAAM,SAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM;AACzD,UAAM,OAAO,OAAO,IAAI,MAAM;AAC9B,UAAM,QAAQ,OAAO,IAAI,OAAO;AAEhC,QAAI,QAAQ,OAAO;AACjB,0BAAoB,MAAM,KAAK;AAAA,IACjC;AAAA,EACF,GAAG,CAAA,CAAE;AAEL,QAAM,sBAAsB,OAAO,MAAc,UAAkB;AACjE,QAAI;AAEF,YAAM,cAAc,eAAe,QAAQ,kBAAkB;AAC7D,YAAM,WAAW,eAAe,QAAQ,qBAAqB;AAE7D,UAAI,UAAU,aAAa;AACzB,cAAM,IAAI,MAAM,uCAAuC;AAAA,MACzD;AAEA,UAAI,CAAC,UAAU;AACb,cAAM,IAAI,MAAM,uBAAuB;AAAA,MACzC;AAGA,YAAM,WAAW,MAAM,MAAM,GAAG,aAAa,gBAAgB;AAAA,QAC3D,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAAA;AAAA,QAElB,MAAM,KAAK,UAAU;AAAA,UACnB,YAAY;AAAA,UACZ;AAAA,UACA,cAAc,OAAO,SAAS,SAAS,OAAO,SAAS;AAAA,UACvD,eAAe;AAAA,UACf,WAAW,UAAU;AAAA,QAAA,CACtB;AAAA,MAAA,CACF;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI,MAAM,mCAAmC;AAAA,MACrD;AAEA,YAAM,OAAO,MAAM,SAAS,KAAA;AAG5B,YAAM,eAAe,MAAM,MAAM,GAAG,aAAa,mBAAmB;AAAA,QAClE,SAAS;AAAA,UACP,iBAAiB,UAAU,KAAK,YAAY;AAAA,QAAA;AAAA,MAC9C,CACD;AAED,UAAI,CAAC,aAAa,IAAI;AACpB,cAAM,IAAI,MAAM,yBAAyB;AAAA,MAC3C;AAEA,YAAM,OAAO,MAAM,aAAa,KAAA;AAChC,WAAK,eAAe,KAAK;AAGzB,qBAAe,WAAW,kBAAkB;AAC5C,qBAAe,WAAW,qBAAqB;AAG/C,YAAM,MAAM,IAAI,IAAI,OAAO,SAAS,IAAI;AACxC,UAAI,aAAa,OAAO,MAAM;AAC9B,UAAI,aAAa,OAAO,OAAO;AAC/B,aAAO,QAAQ,aAAa,CAAA,GAAI,IAAI,IAAI,UAAU;AAElD,gBAAU,IAAI;AAAA,IAChB,SAAS,OAAO;AACd,cAAQ,MAAM,yBAAyB,KAAK;AAC5C,UAAI,SAAS;AACX,gBAAQ,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,uBAAuB,CAAC;AAAA,MAC7E;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAe,YAAY;AAC/B,iBAAa,IAAI;AAEjB,QAAI;AAEF,YAAM,EAAE,UAAU,UAAA,IAAc,MAAM,aAAA;AACtC,YAAM,QAAQ,qBAAqB,EAAE;AAGrC,qBAAe,QAAQ,oBAAoB,KAAK;AAChD,qBAAe,QAAQ,uBAAuB,QAAQ;AAGtD,YAAM,SAAS,IAAI,gBAAgB;AAAA,QACjC,eAAe;AAAA,QACf,WAAW,UAAU;AAAA,QACrB,cAAc,OAAO,SAAS,SAAS,OAAO,SAAS;AAAA,QACvD;AAAA,QACA,gBAAgB;AAAA,QAChB,uBAAuB;AAAA,QACvB,OAAO;AAAA,MAAA,CACR;AAGD,aAAO,SAAS,OAAO,GAAG,eAAe,oBAAoB,OAAO,UAAU;AAAA,IAChF,SAAS,OAAO;AACd,mBAAa,KAAK;AAClB,cAAQ,MAAM,kBAAkB,KAAK;AACrC,UAAI,SAAS;AACX,gBAAQ,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,gBAAgB,CAAC;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AAEA,SACEK,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,SAAS;AAAA,MACT,UAAU;AAAA,MACV,WAAW,6YAA6Y,SAAS;AAAA,MAEha,sBACCC,2BAAAA,KAAAC,WAAAA,UAAA,EACE,UAAA;AAAA,QAAAF,2BAAAA,IAAC,OAAA,EAAI,WAAU,iGAAA,CAAiG;AAAA,QAChHA,2BAAAA,IAAC,UAAK,UAAA,gBAAA,CAAa;AAAA,MAAA,EAAA,CACrB,IACE,YACFC,2BAAAA,KAAAC,WAAAA,UAAA,EACE,UAAA;AAAA,QAAAF,2BAAAA,IAAC,OAAA,EAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACnD,UAAAA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YAAK,GAAE;AAAA,YACF,QAAO;AAAA,YAAe,aAAY;AAAA,YAAI,eAAc;AAAA,YAAQ,gBAAe;AAAA,UAAA;AAAA,QAAA,GACnF;AAAA,QACAA,2BAAAA,IAAC,UAAK,UAAA,oBAAA,CAAiB;AAAA,MAAA,EAAA,CACzB;AAAA,IAAA;AAAA,EAAA;AAIR;AC9HO,SAAS,WAAW,EAAE,QAAQ,aAAa,eAAoD;AACpG,QAAM,iBAAiBG,MAAAA;AAAAA,IACrB,OACE,MACA,SACA,oBAA6B,UACT;AACpB,YAAM,WAAW,MAAM;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACE,cAAc;AAAA,UACd,qBAAqB;AAAA,UACrB,eAAe;AAAA,QAAA;AAAA,QAEjB;AAAA,MAAA;AAEF,UAAI,SAAS,OAAO;AAClB,cAAM,IAAI,MAAM,cAAc,SAAS,MAAM,OAAO,EAAE;AAAA,MACxD;AACA,aAAO,SAAS,QAAQ,UAAU,CAAC,GAAG,QAAQ;AAAA,IAChD;AAAA,IACA,CAAC,QAAQ,UAAU;AAAA,EAAA;AAGrB,QAAM,YAAYA,MAAAA;AAAAA,IAChB,OAAO,MAAgB,YAAqC;AAC1D,YAAM,WAAW,MAAM;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACA,EAAE,MAAM,QAAA;AAAA,QACR;AAAA,MAAA;AAEF,UAAI,SAAS,OAAO;AAClB,cAAM,IAAI,MAAM,cAAc,SAAS,MAAM,OAAO,EAAE;AAAA,MACxD;AACA,aAAO,SAAS,QAAQ,UAAU,CAAC,GAAG,QAAQ;AAAA,IAChD;AAAA,IACA,CAAC,QAAQ,UAAU;AAAA,EAAA;AAGrB,QAAM,eAAeA,MAAAA;AAAAA,IACnB,OAAO,MAAgB,UAAmC;AACxD,YAAM,WAAW,MAAM;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACA,EAAE,MAAA;AAAA,QACF;AAAA,MAAA;AAEF,UAAI,SAAS,OAAO;AAClB,cAAM,IAAI,MAAM,cAAc,SAAS,MAAM,OAAO,EAAE;AAAA,MACxD;AACA,aAAO,SAAS,QAAQ,UAAU,CAAC,GAAG,QAAQ;AAAA,IAChD;AAAA,IACA,CAAC,QAAQ,UAAU;AAAA,EAAA;AAGrB,QAAM,gBAAgBA,MAAAA;AAAAA,IACpB,OACE,MACA,OACA,SACA,OAAe,eACK;AACpB,YAAM,WAAW,MAAM;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACE;AAAA,UACA;AAAA,UACA,eAAe;AAAA,QAAA;AAAA,QAEjB;AAAA,MAAA;AAEF,UAAI,SAAS,OAAO;AAClB,cAAM,IAAI,MAAM,cAAc,SAAS,MAAM,OAAO,EAAE;AAAA,MACxD;AACA,aAAO,SAAS,QAAQ,UAAU,CAAC,GAAG,QAAQ;AAAA,IAChD;AAAA,IACA,CAAC,QAAQ,UAAU;AAAA,EAAA;AAGrB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;;;;;;","x_google_ignoreList":[3,4,5,6,7,8,9,10,11,12,13,14]}