ask-junkie 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-junkie.min.js","sources":["../src/utils/DOMUtils.js","../src/ui/ChatWidget.js","../src/ai/BaseProvider.js","../src/ai/GroqProvider.js","../src/ai/GeminiProvider.js","../src/ai/OpenAIProvider.js","../src/ai/OpenRouterProvider.js","../src/ai/AIProviderFactory.js","../src/analytics/FirebaseLogger.js","../src/utils/StorageManager.js","../src/core/EventEmitter.js","../src/core/AskJunkie.js","../src/index.js"],"sourcesContent":["/**\r\n * DOM Utility Functions\r\n */\r\n\r\n/**\r\n * Escape HTML to prevent XSS\r\n */\r\nexport function escapeHtml(text) {\r\n const div = document.createElement('div');\r\n div.textContent = text;\r\n return div.innerHTML;\r\n}\r\n\r\n/**\r\n * Create an element with attributes and children\r\n */\r\nexport function createElement(tag, attributes = {}, children = []) {\r\n const element = document.createElement(tag);\r\n\r\n Object.entries(attributes).forEach(([key, value]) => {\r\n if (key === 'className') {\r\n element.className = value;\r\n } else if (key === 'style' && typeof value === 'object') {\r\n Object.assign(element.style, value);\r\n } else if (key.startsWith('on') && typeof value === 'function') {\r\n element.addEventListener(key.substring(2).toLowerCase(), value);\r\n } else {\r\n element.setAttribute(key, value);\r\n }\r\n });\r\n\r\n children.forEach(child => {\r\n if (typeof child === 'string') {\r\n element.appendChild(document.createTextNode(child));\r\n } else if (child instanceof Node) {\r\n element.appendChild(child);\r\n }\r\n });\r\n\r\n return element;\r\n}\r\n\r\n/**\r\n * Parse markdown-style links [text](url) to HTML\r\n */\r\nexport function parseLinks(text) {\r\n return text.replace(\r\n /\\[([^\\]]+)\\]\\(([^)]+)\\)/g,\r\n '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\">$1</a>'\r\n );\r\n}\r\n\r\n/**\r\n * Parse markdown bold **text** to HTML\r\n */\r\nexport function parseBold(text) {\r\n return text.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>');\r\n}\r\n\r\n/**\r\n * Format bot response with basic markdown\r\n */\r\nexport function formatBotResponse(text) {\r\n let formatted = escapeHtml(text);\r\n formatted = parseLinks(formatted);\r\n formatted = parseBold(formatted);\r\n formatted = formatted.replace(/\\n/g, '<br>');\r\n return formatted;\r\n}\r\n","/**\r\n * Chat Widget UI Component\r\n * Renders and manages the chatbot interface\r\n */\r\n\r\nimport { escapeHtml, formatBotResponse, createElement } from '../utils/DOMUtils.js';\r\n\r\nexport class ChatWidget {\r\n constructor(config) {\r\n this.config = config;\r\n this.container = null;\r\n this.messagesContainer = null;\r\n this.input = null;\r\n this.isOpen = false;\r\n this.isDragging = false;\r\n this.dragOffset = { x: 0, y: 0 };\r\n }\r\n\r\n /**\r\n * Render the chat widget to the DOM\r\n */\r\n render() {\r\n // Create container\r\n this.container = createElement('div', {\r\n id: 'ask-junkie-widget',\r\n className: 'ask-junkie-container'\r\n });\r\n\r\n // Apply position\r\n this._applyPosition();\r\n\r\n // Create toggle button\r\n const toggleBtn = this._createToggleButton();\r\n this.container.appendChild(toggleBtn);\r\n\r\n // Create chat window\r\n const chatWindow = this._createChatWindow();\r\n this.container.appendChild(chatWindow);\r\n\r\n // Add to DOM\r\n document.body.appendChild(this.container);\r\n\r\n // Apply theme colors\r\n this._applyTheme();\r\n\r\n // Load existing chat history\r\n if (this.config.chatHistory?.length > 0) {\r\n this._loadHistory(this.config.chatHistory);\r\n }\r\n\r\n // Set up event listeners\r\n this._setupEventListeners();\r\n\r\n // Enable dragging if configured\r\n if (this.config.draggable) {\r\n this._enableDragging(toggleBtn);\r\n }\r\n\r\n // Enable resizing if configured\r\n if (this.config.resizable) {\r\n this._enableResizing();\r\n }\r\n\r\n // Open on load if configured\r\n if (this.config.openOnLoad) {\r\n setTimeout(() => this.open(), 500);\r\n }\r\n }\r\n\r\n /**\r\n * Create the toggle button\r\n */\r\n _createToggleButton() {\r\n const btn = createElement('button', {\r\n id: 'ask-junkie-toggle',\r\n className: 'ask-junkie-toggle',\r\n 'aria-label': 'Toggle Chat'\r\n });\r\n\r\n // Default icon URL (hosted on jsDelivr CDN from npm package)\r\n const defaultIconUrl = 'https://cdn.jsdelivr.net/npm/ask-junkie-sdk@latest/dist/junkie-icon.png';\r\n const iconUrl = this.config.toggleIcon || defaultIconUrl;\r\n\r\n btn.innerHTML = `\r\n <img class=\"icon-chat\" src=\"${iconUrl}\" alt=\"Chat\" onerror=\"this.style.display='none';this.nextElementSibling.style.display='block';\">\r\n <svg class=\"icon-chat-fallback\" viewBox=\"0 0 24 24\" width=\"28\" height=\"28\" fill=\"white\" style=\"display:none\">\r\n <path d=\"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z\"/>\r\n </svg>\r\n <svg class=\"icon-close\" viewBox=\"0 0 24 24\" width=\"28\" height=\"28\" fill=\"white\" style=\"display:none\">\r\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"/>\r\n </svg>\r\n `;\r\n\r\n return btn;\r\n }\r\n\r\n /**\r\n * Create the chat window\r\n */\r\n _createChatWindow() {\r\n const window = createElement('div', {\r\n id: 'ask-junkie-window',\r\n className: 'ask-junkie-window'\r\n });\r\n\r\n window.style.display = 'none';\r\n\r\n // Header\r\n const header = createElement('div', { className: 'ask-junkie-header' });\r\n const defaultAvatarUrl = 'https://cdn.jsdelivr.net/npm/ask-junkie-sdk@latest/dist/junkie-icon.png';\r\n const avatarUrl = this.config.botAvatar || defaultAvatarUrl;\r\n header.innerHTML = `\r\n <div class=\"ask-junkie-avatar\">\r\n <img src=\"${escapeHtml(avatarUrl)}\" alt=\"Bot\">\r\n </div>\r\n <div class=\"ask-junkie-info\">\r\n <span class=\"ask-junkie-name\">${escapeHtml(this.config.botName)}</span>\r\n <span class=\"ask-junkie-status\">Online • Ready to help</span>\r\n </div>\r\n <button class=\"ask-junkie-clear\" title=\"Clear chat\" style=\"display:none\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"currentColor\">\r\n <path d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\"/>\r\n </svg>\r\n </button>\r\n `;\r\n window.appendChild(header);\r\n\r\n // Messages container\r\n this.messagesContainer = createElement('div', {\r\n id: 'ask-junkie-messages',\r\n className: 'ask-junkie-messages'\r\n });\r\n\r\n // Add welcome message\r\n const welcomeMsg = createElement('div', {\r\n className: 'ask-junkie-message bot welcome'\r\n });\r\n welcomeMsg.innerHTML = `<div class=\"message-content\">${escapeHtml(this.config.welcomeMessage)}</div>`;\r\n this.messagesContainer.appendChild(welcomeMsg);\r\n\r\n window.appendChild(this.messagesContainer);\r\n\r\n // Input area\r\n const inputArea = createElement('div', { className: 'ask-junkie-input-area' });\r\n\r\n // Suggestions (animated or static based on config)\r\n if (this.config.suggestions?.length > 0) {\r\n if (this.config.animatedSuggestions) {\r\n // Animated marquee suggestions\r\n const suggestionsContainer = createElement('div', { className: 'ask-junkie-suggestions animated' });\r\n const marqueeWrapper = createElement('div', { className: 'ask-junkie-marquee-wrapper' });\r\n const marqueeContent = createElement('div', { className: 'ask-junkie-marquee-content' });\r\n\r\n // Double the suggestions for seamless loop\r\n const allSuggestions = [...this.config.suggestions, ...this.config.suggestions];\r\n\r\n allSuggestions.forEach(text => {\r\n const chip = createElement('button', {\r\n className: 'ask-junkie-chip',\r\n onClick: () => {\r\n this.input.value = text;\r\n this.input.focus();\r\n }\r\n }, [text]);\r\n marqueeContent.appendChild(chip);\r\n });\r\n\r\n marqueeWrapper.appendChild(marqueeContent);\r\n suggestionsContainer.appendChild(marqueeWrapper);\r\n\r\n // Pause animation on hover\r\n marqueeWrapper.addEventListener('mouseenter', () => {\r\n marqueeContent.style.animationPlayState = 'paused';\r\n });\r\n marqueeWrapper.addEventListener('mouseleave', () => {\r\n marqueeContent.style.animationPlayState = 'running';\r\n });\r\n\r\n inputArea.appendChild(suggestionsContainer);\r\n } else {\r\n // Static suggestions\r\n const suggestionsContainer = createElement('div', { className: 'ask-junkie-suggestions' });\r\n this.config.suggestions.forEach(text => {\r\n const chip = createElement('button', {\r\n className: 'ask-junkie-chip',\r\n onClick: () => {\r\n this.input.value = text;\r\n this.input.focus();\r\n }\r\n }, [text]);\r\n suggestionsContainer.appendChild(chip);\r\n });\r\n inputArea.appendChild(suggestionsContainer);\r\n }\r\n }\r\n\r\n // Input row\r\n const inputRow = createElement('div', { className: 'ask-junkie-input-row' });\r\n\r\n this.input = createElement('input', {\r\n type: 'text',\r\n id: 'ask-junkie-input',\r\n placeholder: 'Type your message...',\r\n autocomplete: 'off'\r\n });\r\n inputRow.appendChild(this.input);\r\n\r\n // Voice input button (if enabled)\r\n if (this.config.voiceInput && 'webkitSpeechRecognition' in window) {\r\n const micBtn = createElement('button', {\r\n className: 'ask-junkie-mic',\r\n title: 'Voice input',\r\n onClick: () => this._startVoiceInput()\r\n });\r\n micBtn.innerHTML = `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\"><path d=\"M12 14c1.66 0 3-1.34 3-3V5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3zm-1-9c0-.55.45-1 1-1s1 .45 1 1v6c0 .55-.45 1-1 1s-1-.45-1-1V5zm6 6c0 2.76-2.24 5-5 5s-5-2.24-5-5H5c0 3.53 2.61 6.43 6 6.92V21h2v-3.08c3.39-.49 6-3.39 6-6.92h-2z\"/></svg>`;\r\n inputRow.appendChild(micBtn);\r\n }\r\n\r\n // Send button\r\n const sendBtn = createElement('button', {\r\n className: 'ask-junkie-send',\r\n onClick: () => this._sendMessage()\r\n });\r\n sendBtn.innerHTML = `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"white\"><path d=\"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z\"/></svg>`;\r\n inputRow.appendChild(sendBtn);\r\n\r\n inputArea.appendChild(inputRow);\r\n window.appendChild(inputArea);\r\n\r\n return window;\r\n }\r\n\r\n /**\r\n * Set up event listeners\r\n */\r\n _setupEventListeners() {\r\n const toggleBtn = this.container.querySelector('#ask-junkie-toggle');\r\n const clearBtn = this.container.querySelector('.ask-junkie-clear');\r\n\r\n // Toggle button\r\n toggleBtn.addEventListener('click', () => {\r\n if (!this.isDragging) {\r\n this.toggle();\r\n }\r\n });\r\n\r\n // Input enter key\r\n this.input.addEventListener('keypress', (e) => {\r\n if (e.key === 'Enter') {\r\n this._sendMessage();\r\n }\r\n });\r\n\r\n // Clear button\r\n if (clearBtn) {\r\n clearBtn.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n if (confirm('Clear all chat history?')) {\r\n this._clearMessages();\r\n if (this.config.onClearHistory) {\r\n this.config.onClearHistory();\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Apply position from config\r\n */\r\n _applyPosition() {\r\n const pos = this.config.position || 'bottom-right';\r\n const [vertical, horizontal] = pos.split('-');\r\n\r\n this.container.style[vertical] = '24px';\r\n this.container.style[horizontal] = '24px';\r\n this.container.setAttribute('data-position', pos);\r\n }\r\n\r\n /**\r\n * Apply theme colors\r\n */\r\n _applyTheme() {\r\n const theme = this.config.theme;\r\n let gradient;\r\n\r\n if (theme.mode === 'solid') {\r\n gradient = theme.primary;\r\n } else {\r\n gradient = `linear-gradient(135deg, ${theme.primary}, ${theme.secondary})`;\r\n }\r\n\r\n // Apply to toggle button and header\r\n const toggleBtn = this.container.querySelector('.ask-junkie-toggle');\r\n const header = this.container.querySelector('.ask-junkie-header');\r\n const sendBtn = this.container.querySelector('.ask-junkie-send');\r\n\r\n if (toggleBtn) toggleBtn.style.background = gradient;\r\n if (header) header.style.background = gradient;\r\n if (sendBtn) sendBtn.style.background = gradient;\r\n\r\n // Set CSS variable for consistency\r\n this.container.style.setProperty('--ask-junkie-primary', theme.primary);\r\n this.container.style.setProperty('--ask-junkie-secondary', theme.secondary);\r\n }\r\n\r\n /**\r\n * Send a message\r\n */\r\n _sendMessage() {\r\n const message = this.input.value.trim();\r\n if (!message) return;\r\n\r\n // Add user message to UI\r\n this.addMessage(message, 'user');\r\n this.input.value = '';\r\n\r\n // Update clear button visibility\r\n this._updateClearButton();\r\n\r\n // Trigger callback\r\n if (this.config.onSendMessage) {\r\n this.config.onSendMessage(message);\r\n }\r\n }\r\n\r\n /**\r\n * Add a message to the chat\r\n */\r\n addMessage(text, sender = 'bot') {\r\n const msgDiv = createElement('div', {\r\n className: `ask-junkie-message ${sender}`\r\n });\r\n\r\n const content = createElement('div', { className: 'message-content' });\r\n\r\n if (sender === 'bot') {\r\n content.innerHTML = formatBotResponse(text);\r\n } else {\r\n content.textContent = text;\r\n }\r\n\r\n msgDiv.appendChild(content);\r\n this.messagesContainer.appendChild(msgDiv);\r\n this.messagesContainer.scrollTop = this.messagesContainer.scrollHeight;\r\n\r\n this._updateClearButton();\r\n }\r\n\r\n /**\r\n * Show typing indicator\r\n */\r\n showTyping() {\r\n const typing = createElement('div', {\r\n className: 'ask-junkie-message bot typing',\r\n id: 'ask-junkie-typing'\r\n });\r\n typing.innerHTML = `\r\n <div class=\"message-content\">\r\n <div class=\"typing-dots\">\r\n <span></span><span></span><span></span>\r\n </div>\r\n </div>\r\n `;\r\n this.messagesContainer.appendChild(typing);\r\n this.messagesContainer.scrollTop = this.messagesContainer.scrollHeight;\r\n }\r\n\r\n /**\r\n * Hide typing indicator\r\n */\r\n hideTyping() {\r\n const typing = document.getElementById('ask-junkie-typing');\r\n if (typing) typing.remove();\r\n }\r\n\r\n /**\r\n * Load chat history\r\n */\r\n _loadHistory(history) {\r\n history.forEach(msg => {\r\n const sender = msg.role === 'assistant' ? 'bot' : 'user';\r\n this.addMessage(msg.content, sender);\r\n });\r\n this._updateClearButton();\r\n }\r\n\r\n /**\r\n * Clear messages\r\n */\r\n _clearMessages() {\r\n const messages = this.messagesContainer.querySelectorAll('.ask-junkie-message:not(.welcome)');\r\n messages.forEach(m => m.remove());\r\n this._updateClearButton();\r\n }\r\n\r\n /**\r\n * Update clear button visibility\r\n */\r\n _updateClearButton() {\r\n const clearBtn = this.container.querySelector('.ask-junkie-clear');\r\n const hasMessages = this.messagesContainer.querySelectorAll('.ask-junkie-message:not(.welcome)').length > 0;\r\n if (clearBtn) {\r\n clearBtn.style.display = hasMessages ? 'flex' : 'none';\r\n }\r\n }\r\n\r\n /**\r\n * Start voice input\r\n */\r\n _startVoiceInput() {\r\n if (!('webkitSpeechRecognition' in window)) return;\r\n\r\n const recognition = new webkitSpeechRecognition();\r\n recognition.continuous = false;\r\n recognition.interimResults = false;\r\n\r\n const micBtn = this.container.querySelector('.ask-junkie-mic');\r\n if (micBtn) micBtn.classList.add('listening');\r\n\r\n recognition.onresult = (event) => {\r\n const transcript = event.results[0][0].transcript;\r\n this.input.value = transcript;\r\n this.input.focus();\r\n };\r\n\r\n recognition.onend = () => {\r\n if (micBtn) micBtn.classList.remove('listening');\r\n };\r\n\r\n recognition.start();\r\n }\r\n\r\n /**\r\n * Enable dragging\r\n */\r\n _enableDragging(toggleBtn) {\r\n let startX, startY, startLeft, startTop;\r\n\r\n const onMouseDown = (e) => {\r\n if (this.isOpen) return;\r\n\r\n startX = e.clientX || e.touches?.[0]?.clientX;\r\n startY = e.clientY || e.touches?.[0]?.clientY;\r\n\r\n const rect = this.container.getBoundingClientRect();\r\n startLeft = rect.left;\r\n startTop = rect.top;\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n document.addEventListener('touchmove', onMouseMove);\r\n document.addEventListener('touchend', onMouseUp);\r\n };\r\n\r\n const onMouseMove = (e) => {\r\n const clientX = e.clientX || e.touches?.[0]?.clientX;\r\n const clientY = e.clientY || e.touches?.[0]?.clientY;\r\n\r\n const deltaX = clientX - startX;\r\n const deltaY = clientY - startY;\r\n\r\n if (Math.abs(deltaX) > 5 || Math.abs(deltaY) > 5) {\r\n this.isDragging = true;\r\n }\r\n\r\n const newLeft = Math.max(0, Math.min(startLeft + deltaX, window.innerWidth - 70));\r\n const newTop = Math.max(0, Math.min(startTop + deltaY, window.innerHeight - 70));\r\n\r\n this.container.style.left = newLeft + 'px';\r\n this.container.style.top = newTop + 'px';\r\n this.container.style.right = 'auto';\r\n this.container.style.bottom = 'auto';\r\n };\r\n\r\n const onMouseUp = () => {\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n document.removeEventListener('touchmove', onMouseMove);\r\n document.removeEventListener('touchend', onMouseUp);\r\n\r\n setTimeout(() => { this.isDragging = false; }, 100);\r\n };\r\n\r\n toggleBtn.addEventListener('mousedown', onMouseDown);\r\n toggleBtn.addEventListener('touchstart', onMouseDown);\r\n }\r\n\r\n /**\r\n * Enable resizing of chat window\r\n */\r\n _enableResizing() {\r\n const chatWindow = this.container.querySelector('.ask-junkie-window');\r\n if (!chatWindow) return;\r\n\r\n // Create resize handle\r\n const resizeHandle = createElement('div', { className: 'ask-junkie-resize-handle' });\r\n resizeHandle.innerHTML = `<svg viewBox=\"0 0 24 24\" width=\"12\" height=\"12\" fill=\"currentColor\"><path d=\"M22,22H20V20H22V22M22,18H20V16H22V18M18,22H16V20H18V22M18,18H16V16H18V18M14,22H12V20H14V22M22,14H20V12H22V14Z\"/></svg>`;\r\n chatWindow.appendChild(resizeHandle);\r\n\r\n // Load saved size from localStorage\r\n const savedSize = localStorage.getItem('ask_junkie_chat_size');\r\n if (savedSize) {\r\n try {\r\n const { width, height } = JSON.parse(savedSize);\r\n chatWindow.style.width = width + 'px';\r\n chatWindow.style.height = height + 'px';\r\n } catch (e) {\r\n // Ignore parse errors\r\n }\r\n }\r\n\r\n let isResizing = false;\r\n let startX, startY, startWidth, startHeight;\r\n\r\n const onMouseDown = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n isResizing = true;\r\n\r\n startX = e.clientX || e.touches?.[0]?.clientX;\r\n startY = e.clientY || e.touches?.[0]?.clientY;\r\n startWidth = chatWindow.offsetWidth;\r\n startHeight = chatWindow.offsetHeight;\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n document.addEventListener('touchmove', onMouseMove);\r\n document.addEventListener('touchend', onMouseUp);\r\n };\r\n\r\n const onMouseMove = (e) => {\r\n if (!isResizing) return;\r\n\r\n const clientX = e.clientX || e.touches?.[0]?.clientX;\r\n const clientY = e.clientY || e.touches?.[0]?.clientY;\r\n\r\n // Calculate new dimensions (resizing from top-left corner)\r\n const deltaX = startX - clientX;\r\n const deltaY = startY - clientY;\r\n\r\n const newWidth = Math.max(280, Math.min(startWidth + deltaX, window.innerWidth - 40));\r\n const newHeight = Math.max(350, Math.min(startHeight + deltaY, window.innerHeight - 100));\r\n\r\n chatWindow.style.width = newWidth + 'px';\r\n chatWindow.style.height = newHeight + 'px';\r\n };\r\n\r\n const onMouseUp = () => {\r\n if (isResizing) {\r\n // Save size to localStorage\r\n localStorage.setItem('ask_junkie_chat_size', JSON.stringify({\r\n width: chatWindow.offsetWidth,\r\n height: chatWindow.offsetHeight\r\n }));\r\n }\r\n isResizing = false;\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n document.removeEventListener('touchmove', onMouseMove);\r\n document.removeEventListener('touchend', onMouseUp);\r\n };\r\n\r\n resizeHandle.addEventListener('mousedown', onMouseDown);\r\n resizeHandle.addEventListener('touchstart', onMouseDown);\r\n }\r\n\r\n // ===== PUBLIC METHODS =====\r\n\r\n open() {\r\n this.isOpen = true;\r\n const window = this.container.querySelector('.ask-junkie-window');\r\n const chatIcon = this.container.querySelector('.icon-chat');\r\n const closeIcon = this.container.querySelector('.icon-close');\r\n\r\n window.style.display = 'flex';\r\n chatIcon.style.display = 'none';\r\n closeIcon.style.display = 'block';\r\n this.input.focus();\r\n\r\n if (this.config.onOpen) this.config.onOpen();\r\n }\r\n\r\n close() {\r\n this.isOpen = false;\r\n const window = this.container.querySelector('.ask-junkie-window');\r\n const chatIcon = this.container.querySelector('.icon-chat');\r\n const closeIcon = this.container.querySelector('.icon-close');\r\n\r\n window.style.display = 'none';\r\n chatIcon.style.display = 'block';\r\n closeIcon.style.display = 'none';\r\n\r\n if (this.config.onClose) this.config.onClose();\r\n }\r\n\r\n toggle() {\r\n if (this.isOpen) {\r\n this.close();\r\n } else {\r\n this.open();\r\n }\r\n }\r\n\r\n destroy() {\r\n if (this.container) {\r\n this.container.remove();\r\n this.container = null;\r\n }\r\n }\r\n}\r\n","/**\r\n * Base AI Provider Interface\r\n * All AI providers extend this class\r\n */\r\n\r\nexport class BaseProvider {\r\n constructor(apiKey, model = null, proxyUrl = null) {\r\n this.apiKey = apiKey;\r\n this.model = model || this.getDefaultModel();\r\n this.proxyUrl = proxyUrl;\r\n }\r\n\r\n /**\r\n * Get the default model for this provider\r\n */\r\n getDefaultModel() {\r\n throw new Error('getDefaultModel must be implemented by subclass');\r\n }\r\n\r\n /**\r\n * Get the API endpoint URL\r\n */\r\n getEndpoint() {\r\n throw new Error('getEndpoint must be implemented by subclass');\r\n }\r\n\r\n /**\r\n * Send a message to the AI provider\r\n * @param {string} message - User message\r\n * @param {string} context - System context/prompt\r\n * @param {Array} history - Conversation history\r\n * @returns {Promise<string>} AI response\r\n */\r\n async sendMessage(message, context, history = []) {\r\n throw new Error('sendMessage must be implemented by subclass');\r\n }\r\n\r\n /**\r\n * Make HTTP request (supports proxy mode)\r\n */\r\n async _fetch(url, options) {\r\n const targetUrl = this.proxyUrl || url;\r\n\r\n if (this.proxyUrl) {\r\n // Proxy mode - send the original URL and options to proxy\r\n return fetch(this.proxyUrl, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n targetUrl: url,\r\n ...options\r\n })\r\n });\r\n }\r\n\r\n return fetch(url, options);\r\n }\r\n\r\n /**\r\n * Format conversation history for chat API\r\n */\r\n _formatHistory(history) {\r\n return history.map(msg => ({\r\n role: msg.role === 'assistant' ? 'assistant' : 'user',\r\n content: msg.content\r\n }));\r\n }\r\n}\r\n","/**\r\n * Groq AI Provider\r\n * Fast LLM inference using Groq Cloud\r\n */\r\n\r\nimport { BaseProvider } from './BaseProvider.js';\r\n\r\nexport class GroqProvider extends BaseProvider {\r\n getDefaultModel() {\r\n return 'openai/gpt-oss-120b';\r\n }\r\n\r\n getEndpoint() {\r\n return 'https://api.groq.com/openai/v1/chat/completions';\r\n }\r\n\r\n async sendMessage(message, context, history = []) {\r\n const messages = [\r\n { role: 'system', content: context },\r\n ...this._formatHistory(history),\r\n { role: 'user', content: message }\r\n ];\r\n\r\n const response = await this._fetch(this.getEndpoint(), {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': `Bearer ${this.apiKey}`\r\n },\r\n body: JSON.stringify({\r\n model: this.model,\r\n messages: messages,\r\n temperature: 0.7,\r\n max_tokens: 1000\r\n })\r\n });\r\n\r\n if (!response.ok) {\r\n const error = await response.json().catch(() => ({}));\r\n throw new Error(error.error?.message || `Groq API error: ${response.status}`);\r\n }\r\n\r\n const data = await response.json();\r\n\r\n if (data.choices?.[0]?.message?.content) {\r\n return data.choices[0].message.content;\r\n }\r\n\r\n throw new Error('Invalid response from Groq API');\r\n }\r\n}\r\n","/**\r\n * Google Gemini AI Provider\r\n */\r\n\r\nimport { BaseProvider } from './BaseProvider.js';\r\n\r\nexport class GeminiProvider extends BaseProvider {\r\n getDefaultModel() {\r\n return 'gemini-1.5-flash';\r\n }\r\n\r\n getEndpoint() {\r\n return `https://generativelanguage.googleapis.com/v1beta/models/${this.model}:generateContent`;\r\n }\r\n\r\n async sendMessage(message, context, history = []) {\r\n // Build conversation text\r\n let fullPrompt = context + '\\n\\n';\r\n\r\n history.forEach(msg => {\r\n const role = msg.role === 'user' ? 'User' : 'Assistant';\r\n fullPrompt += `${role}: ${msg.content}\\n`;\r\n });\r\n\r\n fullPrompt += `User: ${message}`;\r\n\r\n const url = `${this.getEndpoint()}?key=${this.apiKey}`;\r\n\r\n const response = await this._fetch(url, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify({\r\n contents: [{\r\n parts: [{ text: fullPrompt }]\r\n }],\r\n generationConfig: {\r\n temperature: 0.7,\r\n maxOutputTokens: 1000\r\n }\r\n })\r\n });\r\n\r\n if (!response.ok) {\r\n const error = await response.json().catch(() => ({}));\r\n throw new Error(error.error?.message || `Gemini API error: ${response.status}`);\r\n }\r\n\r\n const data = await response.json();\r\n\r\n if (data.candidates?.[0]?.content?.parts?.[0]?.text) {\r\n return data.candidates[0].content.parts[0].text;\r\n }\r\n\r\n throw new Error('Invalid response from Gemini API');\r\n }\r\n}\r\n","/**\r\n * OpenAI Provider\r\n * GPT-3.5 and GPT-4 models\r\n */\r\n\r\nimport { BaseProvider } from './BaseProvider.js';\r\n\r\nexport class OpenAIProvider extends BaseProvider {\r\n getDefaultModel() {\r\n return 'gpt-3.5-turbo';\r\n }\r\n\r\n getEndpoint() {\r\n return 'https://api.openai.com/v1/chat/completions';\r\n }\r\n\r\n async sendMessage(message, context, history = []) {\r\n const messages = [\r\n { role: 'system', content: context },\r\n ...this._formatHistory(history),\r\n { role: 'user', content: message }\r\n ];\r\n\r\n const response = await this._fetch(this.getEndpoint(), {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': `Bearer ${this.apiKey}`\r\n },\r\n body: JSON.stringify({\r\n model: this.model,\r\n messages: messages,\r\n temperature: 0.7,\r\n max_tokens: 1000\r\n })\r\n });\r\n\r\n if (!response.ok) {\r\n const error = await response.json().catch(() => ({}));\r\n throw new Error(error.error?.message || `OpenAI API error: ${response.status}`);\r\n }\r\n\r\n const data = await response.json();\r\n\r\n if (data.choices?.[0]?.message?.content) {\r\n return data.choices[0].message.content;\r\n }\r\n\r\n throw new Error('Invalid response from OpenAI API');\r\n }\r\n}\r\n","/**\r\n * OpenRouter Provider\r\n * Access multiple AI models through one API\r\n */\r\n\r\nimport { BaseProvider } from './BaseProvider.js';\r\n\r\nexport class OpenRouterProvider extends BaseProvider {\r\n getDefaultModel() {\r\n return 'meta-llama/llama-3-8b-instruct';\r\n }\r\n\r\n getEndpoint() {\r\n return 'https://openrouter.ai/api/v1/chat/completions';\r\n }\r\n\r\n async sendMessage(message, context, history = []) {\r\n const messages = [\r\n { role: 'system', content: context },\r\n ...this._formatHistory(history),\r\n { role: 'user', content: message }\r\n ];\r\n\r\n const response = await this._fetch(this.getEndpoint(), {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': `Bearer ${this.apiKey}`,\r\n 'HTTP-Referer': window.location.origin,\r\n 'X-Title': document.title || 'Ask Junkie Chatbot'\r\n },\r\n body: JSON.stringify({\r\n model: this.model,\r\n messages: messages,\r\n temperature: 0.7,\r\n max_tokens: 1000\r\n })\r\n });\r\n\r\n if (!response.ok) {\r\n const error = await response.json().catch(() => ({}));\r\n throw new Error(error.error?.message || `OpenRouter API error: ${response.status}`);\r\n }\r\n\r\n const data = await response.json();\r\n\r\n if (data.choices?.[0]?.message?.content) {\r\n return data.choices[0].message.content;\r\n }\r\n\r\n throw new Error('Invalid response from OpenRouter API');\r\n }\r\n}\r\n","/**\r\n * AI Provider Factory\r\n * Creates the appropriate AI provider based on configuration\r\n */\r\n\r\nimport { GroqProvider } from './GroqProvider.js';\r\nimport { GeminiProvider } from './GeminiProvider.js';\r\nimport { OpenAIProvider } from './OpenAIProvider.js';\r\nimport { OpenRouterProvider } from './OpenRouterProvider.js';\r\n\r\nexport class AIProviderFactory {\r\n static providers = {\r\n groq: GroqProvider,\r\n gemini: GeminiProvider,\r\n openai: OpenAIProvider,\r\n openrouter: OpenRouterProvider\r\n };\r\n\r\n /**\r\n * Create an AI provider instance\r\n * @param {string} providerName - Provider name (groq, gemini, openai, openrouter)\r\n * @param {string} apiKey - API key for the provider\r\n * @param {string|null} model - Optional model override\r\n * @param {string|null} proxyUrl - Optional proxy URL\r\n */\r\n static create(providerName, apiKey, model = null, proxyUrl = null) {\r\n const Provider = AIProviderFactory.providers[providerName.toLowerCase()];\r\n\r\n if (!Provider) {\r\n console.warn(`[AskJunkie] Unknown provider \"${providerName}\", falling back to Groq`);\r\n return new GroqProvider(apiKey, model, proxyUrl);\r\n }\r\n\r\n return new Provider(apiKey, model, proxyUrl);\r\n }\r\n\r\n /**\r\n * Get list of supported providers\r\n */\r\n static getSupportedProviders() {\r\n return Object.keys(AIProviderFactory.providers);\r\n }\r\n}\r\n","/**\r\n * Firebase Analytics Logger\r\n * Logs chat interactions to Firebase Firestore for centralized analytics\r\n */\r\n\r\nexport class FirebaseLogger {\r\n static FIREBASE_API_KEY = 'AIzaSyDPDWA7s6dauaPup9DFz0hMrQvDYPtEWwo';\r\n static FIREBASE_PROJECT_ID = 'ai-chatbot-fe4a2';\r\n\r\n constructor(config = {}) {\r\n this.enabled = config.enabled !== false;\r\n this.siteId = config.siteId || this._getSiteId();\r\n this.userId = config.userId || null; // User ID from sdkKeys lookup\r\n this.registered = false;\r\n }\r\n\r\n /**\r\n * Get a sanitized site ID from hostname\r\n */\r\n _getSiteId() {\r\n return window.location.hostname.replace(/[^a-zA-Z0-9.-]/g, '_');\r\n }\r\n\r\n /**\r\n * Get Firestore REST API endpoint\r\n */\r\n _getEndpoint(path) {\r\n return `https://firestore.googleapis.com/v1/projects/${FirebaseLogger.FIREBASE_PROJECT_ID}/databases/(default)/documents/${path}?key=${FirebaseLogger.FIREBASE_API_KEY}`;\r\n }\r\n\r\n /**\r\n * Get the base path for this API key's data\r\n * Uses new nested structure: users/{userId}/apiKeys/{keyId}\r\n */\r\n _getBasePath() {\r\n if (this.userId && this.siteId) {\r\n return `users/${this.userId}/apiKeys/${this.siteId}`;\r\n }\r\n // Fallback to old structure for backwards compatibility\r\n return `sites/${this.siteId}`;\r\n }\r\n\r\n /**\r\n * Register or update site analytics info\r\n * For new user-based path, we SKIP this to avoid overwriting dashboard data\r\n * Only used for legacy sites/ path\r\n */\r\n async registerSite() {\r\n if (this.registered) return;\r\n\r\n // Skip registration for new user-based path - dashboard already created the document\r\n // Only the chats subcollection should be written to\r\n if (this.userId && this.siteId) {\r\n console.log('[AskJunkie] Skipping site registration for SDK-managed key');\r\n this.registered = true;\r\n return;\r\n }\r\n\r\n // Legacy path: sites/{siteId} - still needs registration\r\n try {\r\n const url = this._getEndpoint(this._getBasePath());\r\n\r\n await fetch(url, {\r\n method: 'PATCH',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n fields: {\r\n domain: { stringValue: window.location.hostname },\r\n site_name: { stringValue: document.title || 'Unknown' },\r\n site_url: { stringValue: window.location.origin },\r\n sdk_version: { stringValue: '1.1.6' },\r\n platform: { stringValue: 'JavaScript SDK' },\r\n last_active: { stringValue: new Date().toISOString() }\r\n }\r\n })\r\n });\r\n\r\n this.registered = true;\r\n } catch (error) {\r\n console.warn('[AskJunkie] Failed to register site:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Log a chat interaction\r\n */\r\n async logChat(data) {\r\n if (!this.enabled) return;\r\n\r\n // Ensure site is registered first\r\n await this.registerSite();\r\n\r\n try {\r\n const url = this._getEndpoint(`${this._getBasePath()}/chats`);\r\n\r\n await fetch(url, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n fields: {\r\n session_id: { stringValue: data.sessionId || 'unknown' },\r\n user_message: { stringValue: data.userMessage || '' },\r\n ai_response: { stringValue: data.aiResponse || '' },\r\n page_url: { stringValue: data.pageUrl || window.location.href },\r\n timestamp: { stringValue: new Date().toISOString() },\r\n user_agent: { stringValue: navigator.userAgent || '' }\r\n }\r\n })\r\n });\r\n } catch (error) {\r\n console.warn('[AskJunkie] Failed to log chat:', error);\r\n }\r\n }\r\n}\r\n\r\n","/**\r\n * Storage Manager\r\n * Handles localStorage operations with prefix and session management\r\n */\r\n\r\nexport class StorageManager {\r\n constructor(prefix = 'ask_junkie_') {\r\n this.prefix = prefix;\r\n this.sessionId = null;\r\n }\r\n\r\n /**\r\n * Get a value from storage\r\n */\r\n get(key) {\r\n try {\r\n const item = localStorage.getItem(this.prefix + key);\r\n return item ? JSON.parse(item) : null;\r\n } catch (e) {\r\n console.warn('[AskJunkie] Storage get error:', e);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Set a value in storage\r\n */\r\n set(key, value) {\r\n try {\r\n localStorage.setItem(this.prefix + key, JSON.stringify(value));\r\n return true;\r\n } catch (e) {\r\n console.warn('[AskJunkie] Storage set error:', e);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Remove a value from storage\r\n */\r\n remove(key) {\r\n try {\r\n localStorage.removeItem(this.prefix + key);\r\n } catch (e) {\r\n console.warn('[AskJunkie] Storage remove error:', e);\r\n }\r\n }\r\n\r\n /**\r\n * Get or create a unique session ID\r\n */\r\n getSessionId() {\r\n if (this.sessionId) return this.sessionId;\r\n\r\n this.sessionId = this.get('session_id');\r\n\r\n if (!this.sessionId) {\r\n this.sessionId = 'sess_' +\r\n Math.random().toString(36).substring(2, 10) +\r\n '_' + Date.now().toString(36);\r\n this.set('session_id', this.sessionId);\r\n }\r\n\r\n return this.sessionId;\r\n }\r\n\r\n /**\r\n * Check if storage is available\r\n */\r\n isAvailable() {\r\n try {\r\n const test = '__storage_test__';\r\n localStorage.setItem(test, test);\r\n localStorage.removeItem(test);\r\n return true;\r\n } catch (e) {\r\n return false;\r\n }\r\n }\r\n}\r\n","/**\r\n * Simple Event Emitter for SDK events\r\n */\r\n\r\nexport class EventEmitter {\r\n constructor() {\r\n this.events = {};\r\n }\r\n\r\n /**\r\n * Subscribe to an event\r\n */\r\n on(event, callback) {\r\n if (!this.events[event]) {\r\n this.events[event] = [];\r\n }\r\n this.events[event].push(callback);\r\n return () => this.off(event, callback);\r\n }\r\n\r\n /**\r\n * Unsubscribe from an event\r\n */\r\n off(event, callback) {\r\n if (!this.events[event]) return;\r\n this.events[event] = this.events[event].filter(cb => cb !== callback);\r\n }\r\n\r\n /**\r\n * Emit an event\r\n */\r\n emit(event, data) {\r\n if (!this.events[event]) return;\r\n this.events[event].forEach(callback => {\r\n try {\r\n callback(data);\r\n } catch (error) {\r\n console.error(`[AskJunkie] Event handler error for \"${event}\":`, error);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Subscribe to an event once\r\n */\r\n once(event, callback) {\r\n const unsubscribe = this.on(event, (data) => {\r\n unsubscribe();\r\n callback(data);\r\n });\r\n }\r\n}\r\n","/**\r\n * Ask Junkie SDK - Main SDK Class\r\n * Handles initialization, configuration, and orchestration\r\n */\r\n\r\nimport { ChatWidget } from '../ui/ChatWidget.js';\r\nimport { AIProviderFactory } from '../ai/AIProviderFactory.js';\r\nimport { FirebaseLogger } from '../analytics/FirebaseLogger.js';\r\nimport { StorageManager } from '../utils/StorageManager.js';\r\nimport { EventEmitter } from './EventEmitter.js';\r\n\r\nclass AskJunkie {\r\n static instance = null;\r\n static VERSION = '1.1.1';\r\n\r\n constructor() {\r\n this.config = null;\r\n this.widget = null;\r\n this.aiProvider = null;\r\n this.analytics = null;\r\n this.storage = null;\r\n this.events = new EventEmitter();\r\n this.chatHistory = [];\r\n this.isInitialized = false;\r\n this.siteId = null;\r\n }\r\n\r\n /**\r\n * Initialize the SDK with configuration\r\n * @param {Object} config - Configuration options\r\n */\r\n static async init(config = {}) {\r\n if (AskJunkie.instance && AskJunkie.instance.isInitialized) {\r\n console.warn('[AskJunkie] Already initialized. Call destroy() first to reinitialize.');\r\n return AskJunkie.instance;\r\n }\r\n\r\n AskJunkie.instance = new AskJunkie();\r\n\r\n // Check if using sdkKey mode (fetches settings from dashboard)\r\n if (config.sdkKey) {\r\n await AskJunkie.instance._initializeWithSdkKey(config.sdkKey, config);\r\n } else {\r\n AskJunkie.instance._initialize(config);\r\n }\r\n\r\n return AskJunkie.instance;\r\n }\r\n\r\n /**\r\n * Initialize using SDK key - fetches settings from Firebase dashboard\r\n */\r\n async _initializeWithSdkKey(sdkKey, overrides = {}) {\r\n console.log('[AskJunkie] Initializing with SDK key...');\r\n\r\n try {\r\n // Fetch settings from Firebase\r\n const settings = await this._fetchSettingsFromDashboard(sdkKey);\r\n\r\n if (!settings) {\r\n console.error('[AskJunkie] Invalid SDK key or site not found.');\r\n return;\r\n }\r\n\r\n // Merge fetched settings with any overrides\r\n const config = {\r\n apiKey: settings.providerApiKey,\r\n provider: settings.provider,\r\n model: settings.model,\r\n botName: settings.botName,\r\n welcomeMessage: settings.welcomeMessage,\r\n suggestions: settings.suggestions,\r\n animatedSuggestions: settings.animatedSuggestions,\r\n position: settings.position,\r\n draggable: settings.draggable,\r\n resizable: settings.resizable,\r\n voiceInput: settings.speechToText, // Map speechToText to voiceInput\r\n enabled: settings.enabled,\r\n theme: settings.theme,\r\n context: settings.context,\r\n analytics: {\r\n enabled: true,\r\n siteId: this.siteId,\r\n userId: this.userId // Pass userId for new nested path\r\n },\r\n ...overrides,\r\n _sdkKey: sdkKey\r\n };\r\n\r\n this._initialize(config);\r\n\r\n } catch (error) {\r\n console.error('[AskJunkie] Error fetching settings:', error);\r\n if (overrides.onError) {\r\n overrides.onError(error);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Fetch settings from Firebase dashboard\r\n */\r\n async _fetchSettingsFromDashboard(sdkKey) {\r\n const FIREBASE_PROJECT = 'ai-chatbot-fe4a2';\r\n const API_URL = `https://firestore.googleapis.com/v1/projects/${FIREBASE_PROJECT}/databases/(default)/documents`;\r\n\r\n try {\r\n // Step 1: Get the key lookup from sdkKeys collection\r\n // Document ID is the SDK key itself\r\n const lookupUrl = `${API_URL}/sdkKeys/${sdkKey}`;\r\n const lookupResponse = await fetch(lookupUrl);\r\n\r\n if (!lookupResponse.ok) {\r\n console.error('[AskJunkie] SDK key not found in lookup');\r\n return null;\r\n }\r\n\r\n const lookupData = await lookupResponse.json();\r\n\r\n if (!lookupData.fields) {\r\n console.error('[AskJunkie] SDK key not found');\r\n return null;\r\n }\r\n\r\n const userId = lookupData.fields.userId.stringValue;\r\n const keyId = lookupData.fields.keyId.stringValue;\r\n const status = lookupData.fields.status?.stringValue;\r\n\r\n this.siteId = keyId;\r\n this.userId = userId;\r\n\r\n // Check if key is active\r\n if (status !== 'active') {\r\n console.error('[AskJunkie] SDK key is not active');\r\n return null;\r\n }\r\n\r\n // Step 2: Fetch the full API key document with settings\r\n const keyUrl = `${API_URL}/users/${userId}/apiKeys/${keyId}`;\r\n const keyResponse = await fetch(keyUrl);\r\n\r\n if (!keyResponse.ok) {\r\n console.error('[AskJunkie] Could not fetch API key details');\r\n return null;\r\n }\r\n\r\n const keyData = await keyResponse.json();\r\n\r\n if (!keyData.fields) {\r\n console.error('[AskJunkie] API key document not found');\r\n return null;\r\n }\r\n\r\n // Settings are embedded in the API key document\r\n if (!keyData.fields.settings) {\r\n console.warn('[AskJunkie] No settings configured in dashboard. Using defaults.');\r\n return this._getDefaultSettings();\r\n }\r\n\r\n // Parse Firestore format to plain object\r\n return this._parseFirestoreSettings(keyData.fields.settings.mapValue.fields);\r\n\r\n } catch (error) {\r\n console.error('[AskJunkie] Error fetching from Firebase:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get default settings for SDK\r\n */\r\n _getDefaultSettings() {\r\n return {\r\n enabled: true,\r\n botName: 'AI Assistant',\r\n welcomeMessage: \"Hi! 👋 I'm your AI assistant. How can I help you today?\",\r\n suggestions: [],\r\n animatedSuggestions: true,\r\n speechToText: true,\r\n provider: 'groq',\r\n providerApiKey: '', // User must provide in overrides\r\n model: 'llama-3.3-70b-versatile',\r\n position: 'bottom-right',\r\n draggable: true,\r\n resizable: false,\r\n theme: {\r\n mode: 'gradient',\r\n preset: 1,\r\n primary: '#6366f1',\r\n secondary: '#ec4899'\r\n },\r\n context: {\r\n siteName: document.title || 'Website',\r\n siteDescription: '',\r\n customInfo: '',\r\n restrictions: ''\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Parse Firestore document format to plain object\r\n */\r\n _parseFirestoreSettings(fields) {\r\n const getString = (field) => field?.stringValue || '';\r\n const getNumber = (field) => field?.integerValue || field?.doubleValue || 0;\r\n const getBool = (field) => field?.booleanValue || false;\r\n const getArray = (field) => {\r\n if (!field?.arrayValue?.values) return [];\r\n return field.arrayValue.values.map(v => v.stringValue || '');\r\n };\r\n\r\n const themeFields = fields.theme?.mapValue?.fields || {};\r\n const contextFields = fields.context?.mapValue?.fields || {};\r\n\r\n return {\r\n enabled: fields.enabled?.booleanValue !== false, // Default true if not set\r\n botName: getString(fields.botName) || 'AI Assistant',\r\n welcomeMessage: getString(fields.welcomeMessage) || \"Hi! 👋 I'm your AI assistant.\",\r\n suggestions: getArray(fields.suggestions),\r\n animatedSuggestions: fields.animatedSuggestions?.booleanValue !== false, // Default true\r\n speechToText: fields.speechToText?.booleanValue !== false, // Default true\r\n provider: getString(fields.provider) || 'groq',\r\n providerApiKey: getString(fields.providerApiKey),\r\n model: getString(fields.model),\r\n position: getString(fields.position) || 'bottom-right',\r\n draggable: getBool(fields.draggable),\r\n resizable: getBool(fields.resizable),\r\n theme: {\r\n mode: getString(themeFields.mode) || 'gradient',\r\n preset: getNumber(themeFields.preset) || 1,\r\n primary: getString(themeFields.primary) || '#6366f1',\r\n secondary: getString(themeFields.secondary) || '#ec4899'\r\n },\r\n context: {\r\n siteName: getString(contextFields.siteName),\r\n siteDescription: getString(contextFields.siteDescription),\r\n customInfo: getString(contextFields.customInfo),\r\n restrictions: getString(contextFields.restrictions)\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Internal initialization logic\r\n */\r\n _initialize(config) {\r\n // Merge with defaults\r\n this.config = this._mergeConfig(config);\r\n\r\n // Check if chatbot is enabled\r\n if (this.config.enabled === false) {\r\n console.log('[AskJunkie] Chatbot is disabled in settings. Widget will not render.');\r\n this.isInitialized = true;\r\n return;\r\n }\r\n\r\n // Validate required config\r\n if (!this.config.apiKey && !this.config._sdkKey) {\r\n console.error('[AskJunkie] API key or SDK key is required.');\r\n return;\r\n }\r\n\r\n // Initialize storage manager\r\n this.storage = new StorageManager(this.config.storagePrefix);\r\n\r\n // Load chat history from storage\r\n this.chatHistory = this.storage.get('chat_history') || [];\r\n\r\n // Initialize AI provider\r\n this.aiProvider = AIProviderFactory.create(\r\n this.config.provider,\r\n this.config.apiKey,\r\n this.config.model,\r\n this.config.proxyUrl\r\n );\r\n\r\n // Initialize Firebase analytics (if enabled)\r\n if (this.config.analytics.enabled) {\r\n this.analytics = new FirebaseLogger(this.config.analytics);\r\n }\r\n\r\n // Create and render the chat widget\r\n this.widget = new ChatWidget({\r\n ...this.config,\r\n onSendMessage: (message) => this._handleUserMessage(message),\r\n onClearHistory: () => this._clearHistory(),\r\n chatHistory: this.chatHistory\r\n });\r\n\r\n this.widget.render();\r\n\r\n this.isInitialized = true;\r\n this.events.emit('ready');\r\n\r\n if (this.config.onReady) {\r\n this.config.onReady();\r\n }\r\n\r\n console.log(`[AskJunkie] SDK v${AskJunkie.VERSION} initialized successfully`);\r\n }\r\n\r\n /**\r\n * Merge user config with defaults\r\n */\r\n _mergeConfig(userConfig) {\r\n const defaults = {\r\n // Required\r\n apiKey: null,\r\n\r\n // Master enable flag\r\n enabled: true,\r\n\r\n // AI Provider\r\n provider: 'groq',\r\n model: null, // Will use provider default\r\n\r\n // Appearance\r\n botName: 'AI Assistant',\r\n botAvatar: null, // URL to custom avatar\r\n welcomeMessage: \"Hi! 👋 I'm your AI assistant. How can I help you today?\",\r\n position: 'bottom-right',\r\n theme: {\r\n mode: 'gradient',\r\n preset: 1,\r\n primary: '#6366f1',\r\n secondary: '#ec4899'\r\n },\r\n\r\n // Behavior\r\n draggable: false,\r\n resizable: false,\r\n persistChat: true,\r\n voiceInput: true,\r\n suggestions: [],\r\n animatedSuggestions: true,\r\n openOnLoad: false,\r\n\r\n // Context for AI\r\n context: {\r\n siteName: document.title || 'Website',\r\n siteDescription: '',\r\n customInfo: '',\r\n restrictions: ''\r\n },\r\n\r\n // Analytics\r\n analytics: {\r\n enabled: true,\r\n siteId: window.location.hostname.replace(/[^a-zA-Z0-9.-]/g, '_')\r\n },\r\n\r\n // Proxy mode (optional)\r\n proxyUrl: null,\r\n\r\n // Storage prefix\r\n storagePrefix: 'ask_junkie_',\r\n\r\n // Event callbacks\r\n onReady: null,\r\n onMessage: null,\r\n onOpen: null,\r\n onClose: null,\r\n onError: null\r\n };\r\n\r\n // Deep merge theme object\r\n const theme = { ...defaults.theme, ...(userConfig.theme || {}) };\r\n const context = { ...defaults.context, ...(userConfig.context || {}) };\r\n const analytics = { ...defaults.analytics, ...(userConfig.analytics || {}) };\r\n\r\n return {\r\n ...defaults,\r\n ...userConfig,\r\n theme,\r\n context,\r\n analytics\r\n };\r\n }\r\n\r\n /**\r\n * Handle user message submission\r\n */\r\n async _handleUserMessage(message) {\r\n if (!message.trim()) return;\r\n\r\n // Add user message to history\r\n this.chatHistory.push({\r\n role: 'user',\r\n content: message,\r\n timestamp: new Date().toISOString()\r\n });\r\n\r\n // Show typing indicator\r\n this.widget.showTyping();\r\n\r\n try {\r\n // Build context string\r\n const contextString = this._buildContext();\r\n\r\n // Get AI response\r\n const response = await this.aiProvider.sendMessage(\r\n message,\r\n contextString,\r\n this.chatHistory.slice(-10) // Send last 10 messages for context\r\n );\r\n\r\n // Add bot response to history\r\n this.chatHistory.push({\r\n role: 'assistant',\r\n content: response,\r\n timestamp: new Date().toISOString()\r\n });\r\n\r\n // Display response\r\n this.widget.hideTyping();\r\n this.widget.addMessage(response, 'bot');\r\n\r\n // Save to storage\r\n if (this.config.persistChat) {\r\n this.storage.set('chat_history', this.chatHistory.slice(-50));\r\n }\r\n\r\n // Log to analytics\r\n if (this.analytics) {\r\n this.analytics.logChat({\r\n userMessage: message,\r\n aiResponse: response,\r\n pageUrl: window.location.href,\r\n sessionId: this.storage.getSessionId()\r\n });\r\n }\r\n\r\n // Fire callback\r\n if (this.config.onMessage) {\r\n this.config.onMessage(response, true);\r\n }\r\n\r\n this.events.emit('message', { message: response, isBot: true });\r\n\r\n } catch (error) {\r\n this.widget.hideTyping();\r\n const errorMessage = 'Sorry, I encountered an error. Please try again.';\r\n this.widget.addMessage(errorMessage, 'bot');\r\n\r\n console.error('[AskJunkie] Error:', error);\r\n\r\n if (this.config.onError) {\r\n this.config.onError(error);\r\n }\r\n\r\n this.events.emit('error', error);\r\n }\r\n }\r\n\r\n /**\r\n * Build AI context from configuration\r\n */\r\n _buildContext() {\r\n const ctx = this.config.context;\r\n let context = '';\r\n\r\n context += `You are \"${this.config.botName}\", a friendly and helpful AI assistant for \"${ctx.siteName}\". `;\r\n context += `Your personality is warm, professional, and knowledgeable. `;\r\n\r\n context += `IMPORTANT IDENTITY RULES: `;\r\n context += `1. Your name is ${this.config.botName}. `;\r\n context += `2. If asked who created you, politely say you're an AI assistant designed to help with website inquiries. `;\r\n context += `3. Stay focused on helping users with questions about this website. `;\r\n\r\n if (ctx.siteDescription) {\r\n context += `\\n\\nABOUT THIS WEBSITE: ${ctx.siteDescription} `;\r\n }\r\n\r\n if (ctx.customInfo) {\r\n context += `\\n\\nADDITIONAL INFORMATION: ${ctx.customInfo} `;\r\n }\r\n\r\n if (ctx.restrictions) {\r\n context += `\\n\\n🚫 RESTRICTIONS (follow strictly): ${ctx.restrictions} `;\r\n }\r\n\r\n context += `\\n\\nRESPONSE FORMATTING: `;\r\n context += `1. Be professional and courteous. `;\r\n context += `2. Use clear paragraphs with line breaks. `;\r\n context += `3. For lists, use numbered points or bullets. `;\r\n context += `4. For links, use markdown format: [Link Text](URL). `;\r\n context += `5. Use **bold** for important terms. `;\r\n context += `6. Keep responses helpful but concise. `;\r\n\r\n return context;\r\n }\r\n\r\n /**\r\n * Clear chat history\r\n */\r\n _clearHistory() {\r\n this.chatHistory = [];\r\n this.storage.remove('chat_history');\r\n this.events.emit('clear');\r\n }\r\n\r\n // ===== PUBLIC API =====\r\n\r\n /**\r\n * Open the chat widget\r\n */\r\n static open() {\r\n if (AskJunkie.instance?.widget) {\r\n AskJunkie.instance.widget.open();\r\n }\r\n }\r\n\r\n /**\r\n * Close the chat widget\r\n */\r\n static close() {\r\n if (AskJunkie.instance?.widget) {\r\n AskJunkie.instance.widget.close();\r\n }\r\n }\r\n\r\n /**\r\n * Toggle the chat widget\r\n */\r\n static toggle() {\r\n if (AskJunkie.instance?.widget) {\r\n AskJunkie.instance.widget.toggle();\r\n }\r\n }\r\n\r\n /**\r\n * Send a message programmatically\r\n */\r\n static sendMessage(text) {\r\n if (AskJunkie.instance) {\r\n AskJunkie.instance.widget.addMessage(text, 'user');\r\n AskJunkie.instance._handleUserMessage(text);\r\n }\r\n }\r\n\r\n /**\r\n * Update context dynamically\r\n */\r\n static setContext(newContext) {\r\n if (AskJunkie.instance) {\r\n AskJunkie.instance.config.context = {\r\n ...AskJunkie.instance.config.context,\r\n ...newContext\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Subscribe to events\r\n */\r\n static on(event, callback) {\r\n if (AskJunkie.instance) {\r\n AskJunkie.instance.events.on(event, callback);\r\n }\r\n }\r\n\r\n /**\r\n * Destroy the SDK instance\r\n */\r\n static destroy() {\r\n if (AskJunkie.instance) {\r\n if (AskJunkie.instance.widget) {\r\n AskJunkie.instance.widget.destroy();\r\n }\r\n AskJunkie.instance.isInitialized = false;\r\n AskJunkie.instance = null;\r\n console.log('[AskJunkie] Destroyed');\r\n }\r\n }\r\n\r\n /**\r\n * Get SDK version\r\n */\r\n static getVersion() {\r\n return AskJunkie.VERSION;\r\n }\r\n}\r\n\r\nexport default AskJunkie;\r\n","/**\r\n * Ask Junkie SDK - Main Entry Point\r\n * Universal AI Chatbot for any website\r\n * \r\n * @author Junkies Coder\r\n * @version 1.0.0\r\n */\r\n\r\nimport AskJunkie from './core/AskJunkie.js';\r\nimport './ui/styles.css';\r\n\r\n// Export for ES modules\r\nexport default AskJunkie;\r\nexport { AskJunkie };\r\n\r\n// Auto-attach to window for script tag usage\r\nif (typeof window !== 'undefined') {\r\n window.AskJunkie = AskJunkie;\r\n}\r\n"],"names":[],"mappings":";;;;;;IAAA;IACA;IACA;AACA;IACA;IACA;IACA;IACO,SAAS,UAAU,CAAC,IAAI,EAAE;IACjC,IAAI,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC;IAC3B,IAAI,OAAO,GAAG,CAAC,SAAS,CAAC;IACzB,CAAC;AACD;IACA;IACA;IACA;IACO,SAAS,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,EAAE,EAAE,QAAQ,GAAG,EAAE,EAAE;IACnE,IAAI,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;AAChD;IACA,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK;IACzD,QAAQ,IAAI,GAAG,KAAK,WAAW,EAAE;IACjC,YAAY,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC;IACtC,QAAQ,CAAC,MAAM,IAAI,GAAG,KAAK,OAAO,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;IACjE,YAAY,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAChD,QAAQ,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;IACxE,YAAY,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,CAAC;IAC5E,QAAQ,CAAC,MAAM;IACf,YAAY,OAAO,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7C,QAAQ,CAAC;IACT,IAAI,CAAC,CAAC,CAAC;AACP;IACA,IAAI,QAAQ,CAAC,OAAO,CAAC,KAAK,IAAI;IAC9B,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;IACvC,YAAY,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;IAChE,QAAQ,CAAC,MAAM,IAAI,KAAK,YAAY,IAAI,EAAE;IAC1C,YAAY,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACvC,QAAQ,CAAC;IACT,IAAI,CAAC,CAAC,CAAC;AACP;IACA,IAAI,OAAO,OAAO,CAAC;IACnB,CAAC;AACD;IACA;IACA;IACA;IACO,SAAS,UAAU,CAAC,IAAI,EAAE;IACjC,IAAI,OAAO,IAAI,CAAC,OAAO;IACvB,QAAQ,0BAA0B;IAClC,QAAQ,+DAA+D;IACvE,KAAK,CAAC;IACN,CAAC;AACD;IACA;IACA;IACA;IACO,SAAS,SAAS,CAAC,IAAI,EAAE;IAChC,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,CAAC;IACnE,CAAC;AACD;IACA;IACA;IACA;IACO,SAAS,iBAAiB,CAAC,IAAI,EAAE;IACxC,IAAI,IAAI,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACrC,IAAI,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACjD,IAAI,OAAO,SAAS,CAAC;IACrB;;ICpEA;IACA;IACA;IACA;AACA;AAEA;IACO,MAAM,UAAU,CAAC;IACxB,IAAI,WAAW,CAAC,MAAM,EAAE;IACxB,QAAQ,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IAC7B,QAAQ,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IAC9B,QAAQ,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;IACtC,QAAQ,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IAC1B,QAAQ,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IAC5B,QAAQ,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAChC,QAAQ,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACzC,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,MAAM,GAAG;IACb;IACA,QAAQ,IAAI,CAAC,SAAS,GAAG,aAAa,CAAC,KAAK,EAAE;IAC9C,YAAY,EAAE,EAAE,mBAAmB;IACnC,YAAY,SAAS,EAAE,sBAAsB;IAC7C,SAAS,CAAC,CAAC;AACX;IACA;IACA,QAAQ,IAAI,CAAC,cAAc,EAAE,CAAC;AAC9B;IACA;IACA,QAAQ,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;IACrD,QAAQ,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;AAC9C;IACA;IACA,QAAQ,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;IACpD,QAAQ,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;AAC/C;IACA;IACA,QAAQ,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAClD;IACA;IACA,QAAQ,IAAI,CAAC,WAAW,EAAE,CAAC;AAC3B;IACA;IACA,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,CAAC,EAAE;IACjD,YAAY,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACvD,QAAQ,CAAC;AACT;IACA;IACA,QAAQ,IAAI,CAAC,oBAAoB,EAAE,CAAC;AACpC;IACA;IACA,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;IACnC,YAAY,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IAC5C,QAAQ,CAAC;AACT;IACA;IACA,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;IACnC,YAAY,IAAI,CAAC,eAAe,EAAE,CAAC;IACnC,QAAQ,CAAC;AACT;IACA;IACA,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;IACpC,YAAY,UAAU,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;IAC/C,QAAQ,CAAC;IACT,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,mBAAmB,GAAG;IAC1B,QAAQ,MAAM,GAAG,GAAG,aAAa,CAAC,QAAQ,EAAE;IAC5C,YAAY,EAAE,EAAE,mBAAmB;IACnC,YAAY,SAAS,EAAE,mBAAmB;IAC1C,YAAY,YAAY,EAAE,aAAa;IACvC,SAAS,CAAC,CAAC;AACX;IACA;IACA,QAAQ,MAAM,cAAc,GAAG,yEAAyE,CAAC;IACzG,QAAQ,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,cAAc,CAAC;AACjE;IACA,QAAQ,GAAG,CAAC,SAAS,GAAG,CAAC;AACzB,wCAAwC,EAAE,OAAO,CAAC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,CAAC,CAAC;AACV;IACA,QAAQ,OAAO,GAAG,CAAC;IACnB,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,iBAAiB,GAAG;IACxB,QAAQ,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE;IAC5C,YAAY,EAAE,EAAE,mBAAmB;IACnC,YAAY,SAAS,EAAE,mBAAmB;IAC1C,SAAS,CAAC,CAAC;AACX;IACA,QAAQ,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACtC;IACA;IACA,QAAQ,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC,CAAC;IAChF,QAAQ,MAAM,gBAAgB,GAAG,yEAAyE,CAAC;IAC3G,QAAQ,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,gBAAgB,CAAC;IACpE,QAAQ,MAAM,CAAC,SAAS,GAAG,CAAC;AAC5B;AACA,0BAA0B,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;AAClD;AACA;AACA,8CAA8C,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,CAAC,CAAC;IACV,QAAQ,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AACnC;IACA;IACA,QAAQ,IAAI,CAAC,iBAAiB,GAAG,aAAa,CAAC,KAAK,EAAE;IACtD,YAAY,EAAE,EAAE,qBAAqB;IACrC,YAAY,SAAS,EAAE,qBAAqB;IAC5C,SAAS,CAAC,CAAC;AACX;IACA;IACA,QAAQ,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,EAAE;IAChD,YAAY,SAAS,EAAE,gCAAgC;IACvD,SAAS,CAAC,CAAC;IACX,QAAQ,UAAU,CAAC,SAAS,GAAG,CAAC,6BAA6B,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;IAC9G,QAAQ,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;AACvD;IACA,QAAQ,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AACnD;IACA;IACA,QAAQ,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,uBAAuB,EAAE,CAAC,CAAC;AACvF;IACA;IACA,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,CAAC,EAAE;IACjD,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE;IACjD;IACA,gBAAgB,MAAM,oBAAoB,GAAG,aAAa,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,iCAAiC,EAAE,CAAC,CAAC;IACpH,gBAAgB,MAAM,cAAc,GAAG,aAAa,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,4BAA4B,EAAE,CAAC,CAAC;IACzG,gBAAgB,MAAM,cAAc,GAAG,aAAa,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,4BAA4B,EAAE,CAAC,CAAC;AACzG;IACA;IACA,gBAAgB,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAChG;IACA,gBAAgB,cAAc,CAAC,OAAO,CAAC,IAAI,IAAI;IAC/C,oBAAoB,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,EAAE;IACzD,wBAAwB,SAAS,EAAE,iBAAiB;IACpD,wBAAwB,OAAO,EAAE,MAAM;IACvC,4BAA4B,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;IACpD,4BAA4B,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAC/C,wBAAwB,CAAC;IACzB,qBAAqB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/B,oBAAoB,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACrD,gBAAgB,CAAC,CAAC,CAAC;AACnB;IACA,gBAAgB,cAAc,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAC3D,gBAAgB,oBAAoB,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;AACjE;IACA;IACA,gBAAgB,cAAc,CAAC,gBAAgB,CAAC,YAAY,EAAE,MAAM;IACpE,oBAAoB,cAAc,CAAC,KAAK,CAAC,kBAAkB,GAAG,QAAQ,CAAC;IACvE,gBAAgB,CAAC,CAAC,CAAC;IACnB,gBAAgB,cAAc,CAAC,gBAAgB,CAAC,YAAY,EAAE,MAAM;IACpE,oBAAoB,cAAc,CAAC,KAAK,CAAC,kBAAkB,GAAG,SAAS,CAAC;IACxE,gBAAgB,CAAC,CAAC,CAAC;AACnB;IACA,gBAAgB,SAAS,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;IAC5D,YAAY,CAAC,MAAM;IACnB;IACA,gBAAgB,MAAM,oBAAoB,GAAG,aAAa,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,wBAAwB,EAAE,CAAC,CAAC;IAC3G,gBAAgB,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,IAAI;IACxD,oBAAoB,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,EAAE;IACzD,wBAAwB,SAAS,EAAE,iBAAiB;IACpD,wBAAwB,OAAO,EAAE,MAAM;IACvC,4BAA4B,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;IACpD,4BAA4B,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAC/C,wBAAwB,CAAC;IACzB,qBAAqB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/B,oBAAoB,oBAAoB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC3D,gBAAgB,CAAC,CAAC,CAAC;IACnB,gBAAgB,SAAS,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;IAC5D,YAAY,CAAC;IACb,QAAQ,CAAC;AACT;IACA;IACA,QAAQ,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,sBAAsB,EAAE,CAAC,CAAC;AACrF;IACA,QAAQ,IAAI,CAAC,KAAK,GAAG,aAAa,CAAC,OAAO,EAAE;IAC5C,YAAY,IAAI,EAAE,MAAM;IACxB,YAAY,EAAE,EAAE,kBAAkB;IAClC,YAAY,WAAW,EAAE,sBAAsB;IAC/C,YAAY,YAAY,EAAE,KAAK;IAC/B,SAAS,CAAC,CAAC;IACX,QAAQ,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACzC;IACA;IACA,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,yBAAyB,IAAI,MAAM,EAAE;IAC3E,YAAY,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,EAAE;IACnD,gBAAgB,SAAS,EAAE,gBAAgB;IAC3C,gBAAgB,KAAK,EAAE,aAAa;IACpC,gBAAgB,OAAO,EAAE,MAAM,IAAI,CAAC,gBAAgB,EAAE;IACtD,aAAa,CAAC,CAAC;IACf,YAAY,MAAM,CAAC,SAAS,GAAG,CAAC,kUAAkU,CAAC,CAAC;IACpW,YAAY,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC;AACT;IACA;IACA,QAAQ,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,EAAE;IAChD,YAAY,SAAS,EAAE,iBAAiB;IACxC,YAAY,OAAO,EAAE,MAAM,IAAI,CAAC,YAAY,EAAE;IAC9C,SAAS,CAAC,CAAC;IACX,QAAQ,OAAO,CAAC,SAAS,GAAG,CAAC,oHAAoH,CAAC,CAAC;IACnJ,QAAQ,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AACtC;IACA,QAAQ,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACxC,QAAQ,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;AACtC;IACA,QAAQ,OAAO,MAAM,CAAC;IACtB,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,oBAAoB,GAAG;IAC3B,QAAQ,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAC7E,QAAQ,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC;AAC3E;IACA;IACA,QAAQ,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM;IAClD,YAAY,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;IAClC,gBAAgB,IAAI,CAAC,MAAM,EAAE,CAAC;IAC9B,YAAY,CAAC;IACb,QAAQ,CAAC,CAAC,CAAC;AACX;IACA;IACA,QAAQ,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,UAAU,EAAE,CAAC,CAAC,KAAK;IACvD,YAAY,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE;IACnC,gBAAgB,IAAI,CAAC,YAAY,EAAE,CAAC;IACpC,YAAY,CAAC;IACb,QAAQ,CAAC,CAAC,CAAC;AACX;IACA;IACA,QAAQ,IAAI,QAAQ,EAAE;IACtB,YAAY,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK;IACtD,gBAAgB,CAAC,CAAC,eAAe,EAAE,CAAC;IACpC,gBAAgB,IAAI,OAAO,CAAC,yBAAyB,CAAC,EAAE;IACxD,oBAAoB,IAAI,CAAC,cAAc,EAAE,CAAC;IAC1C,oBAAoB,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;IACpD,wBAAwB,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;IACrD,oBAAoB,CAAC;IACrB,gBAAgB,CAAC;IACjB,YAAY,CAAC,CAAC,CAAC;IACf,QAAQ,CAAC;IACT,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,cAAc,GAAG;IACrB,QAAQ,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,cAAc,CAAC;IAC3D,QAAQ,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACtD;IACA,QAAQ,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC;IAChD,QAAQ,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC;IAClD,QAAQ,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;IAC1D,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,WAAW,GAAG;IAClB,QAAQ,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IACxC,QAAQ,IAAI,QAAQ,CAAC;AACrB;IACA,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE;IACpC,YAAY,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC;IACrC,QAAQ,CAAC,MAAM;IACf,YAAY,QAAQ,GAAG,CAAC,wBAAwB,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACvF,QAAQ,CAAC;AACT;IACA;IACA,QAAQ,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAC7E,QAAQ,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAC1E,QAAQ,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC;AACzE;IACA,QAAQ,IAAI,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC;IAC7D,QAAQ,IAAI,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC;IACvD,QAAQ,IAAI,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC;AACzD;IACA;IACA,QAAQ,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,sBAAsB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAChF,QAAQ,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,wBAAwB,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACpF,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,YAAY,GAAG;IACnB,QAAQ,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAChD,QAAQ,IAAI,CAAC,OAAO,EAAE,OAAO;AAC7B;IACA;IACA,QAAQ,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACzC,QAAQ,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;AAC9B;IACA;IACA,QAAQ,IAAI,CAAC,kBAAkB,EAAE,CAAC;AAClC;IACA;IACA,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE;IACvC,YAAY,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/C,QAAQ,CAAC;IACT,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,EAAE;IACrC,QAAQ,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE;IAC5C,YAAY,SAAS,EAAE,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;IACrD,SAAS,CAAC,CAAC;AACX;IACA,QAAQ,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,CAAC;AAC/E;IACA,QAAQ,IAAI,MAAM,KAAK,KAAK,EAAE;IAC9B,YAAY,OAAO,CAAC,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACxD,QAAQ,CAAC,MAAM;IACf,YAAY,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC;AACT;IACA,QAAQ,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACpC,QAAQ,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACnD,QAAQ,IAAI,CAAC,iBAAiB,CAAC,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC;AAC/E;IACA,QAAQ,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAClC,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,UAAU,GAAG;IACjB,QAAQ,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE;IAC5C,YAAY,SAAS,EAAE,+BAA+B;IACtD,YAAY,EAAE,EAAE,mBAAmB;IACnC,SAAS,CAAC,CAAC;IACX,QAAQ,MAAM,CAAC,SAAS,GAAG,CAAC;AAC5B;AACA;AACA;AACA;AACA;AACA,QAAQ,CAAC,CAAC;IACV,QAAQ,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACnD,QAAQ,IAAI,CAAC,iBAAiB,CAAC,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC;IAC/E,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,UAAU,GAAG;IACjB,QAAQ,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;IACpE,QAAQ,IAAI,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACpC,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,YAAY,CAAC,OAAO,EAAE;IAC1B,QAAQ,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IAC/B,YAAY,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,KAAK,WAAW,GAAG,KAAK,GAAG,MAAM,CAAC;IACrE,YAAY,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACjD,QAAQ,CAAC,CAAC,CAAC;IACX,QAAQ,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAClC,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,cAAc,GAAG;IACrB,QAAQ,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,mCAAmC,CAAC,CAAC;IACtG,QAAQ,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1C,QAAQ,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAClC,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,kBAAkB,GAAG;IACzB,QAAQ,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC;IAC3E,QAAQ,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,mCAAmC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACpH,QAAQ,IAAI,QAAQ,EAAE;IACtB,YAAY,QAAQ,CAAC,KAAK,CAAC,OAAO,GAAG,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;IACnE,QAAQ,CAAC;IACT,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,gBAAgB,GAAG;IACvB,QAAQ,IAAI,EAAE,yBAAyB,IAAI,MAAM,CAAC,EAAE,OAAO;AAC3D;IACA,QAAQ,MAAM,WAAW,GAAG,IAAI,uBAAuB,EAAE,CAAC;IAC1D,QAAQ,WAAW,CAAC,UAAU,GAAG,KAAK,CAAC;IACvC,QAAQ,WAAW,CAAC,cAAc,GAAG,KAAK,CAAC;AAC3C;IACA,QAAQ,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;IACvE,QAAQ,IAAI,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACtD;IACA,QAAQ,WAAW,CAAC,QAAQ,GAAG,CAAC,KAAK,KAAK;IAC1C,YAAY,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAC9D,YAAY,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC;IAC1C,YAAY,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAC/B,QAAQ,CAAC,CAAC;AACV;IACA,QAAQ,WAAW,CAAC,KAAK,GAAG,MAAM;IAClC,YAAY,IAAI,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC7D,QAAQ,CAAC,CAAC;AACV;IACA,QAAQ,WAAW,CAAC,KAAK,EAAE,CAAC;IAC5B,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,eAAe,CAAC,SAAS,EAAE;IAC/B,QAAQ,IAAI,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC;AAChD;IACA,QAAQ,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK;IACnC,YAAY,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;AACpC;IACA,YAAY,MAAM,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC;IAC1D,YAAY,MAAM,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC;AAC1D;IACA,YAAY,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,qBAAqB,EAAE,CAAC;IAChE,YAAY,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC;IAClC,YAAY,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC;AAChC;IACA,YAAY,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAChE,YAAY,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC5D,YAAY,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAChE,YAAY,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAC7D,QAAQ,CAAC,CAAC;AACV;IACA,QAAQ,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK;IACnC,YAAY,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC;IACjE,YAAY,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC;AACjE;IACA,YAAY,MAAM,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IAC5C,YAAY,MAAM,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAC5C;IACA,YAAY,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;IAC9D,gBAAgB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACvC,YAAY,CAAC;AACb;IACA,YAAY,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,MAAM,EAAE,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC;IAC9F,YAAY,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,MAAM,EAAE,MAAM,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC,CAAC;AAC7F;IACA,YAAY,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC;IACvD,YAAY,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,GAAG,MAAM,GAAG,IAAI,CAAC;IACrD,YAAY,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;IAChD,YAAY,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;IACjD,QAAQ,CAAC,CAAC;AACV;IACA,QAAQ,MAAM,SAAS,GAAG,MAAM;IAChC,YAAY,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACnE,YAAY,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC/D,YAAY,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACnE,YAAY,QAAQ,CAAC,mBAAmB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;AAChE;IACA,YAAY,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAChE,QAAQ,CAAC,CAAC;AACV;IACA,QAAQ,SAAS,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAC7D,QAAQ,SAAS,CAAC,gBAAgB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IAC9D,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,eAAe,GAAG;IACtB,QAAQ,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAC9E,QAAQ,IAAI,CAAC,UAAU,EAAE,OAAO;AAChC;IACA;IACA,QAAQ,MAAM,YAAY,GAAG,aAAa,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,0BAA0B,EAAE,CAAC,CAAC;IAC7F,QAAQ,YAAY,CAAC,SAAS,GAAG,CAAC,mMAAmM,CAAC,CAAC;IACvO,QAAQ,UAAU,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;AAC7C;IACA;IACA,QAAQ,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACvE,QAAQ,IAAI,SAAS,EAAE;IACvB,YAAY,IAAI;IAChB,gBAAgB,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAChE,gBAAgB,UAAU,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC;IACtD,gBAAgB,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACxD,YAAY,CAAC,CAAC,OAAO,CAAC,EAAE;IACxB;IACA,YAAY,CAAC;IACb,QAAQ,CAAC;AACT;IACA,QAAQ,IAAI,UAAU,GAAG,KAAK,CAAC;IAC/B,QAAQ,IAAI,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC;AACpD;IACA,QAAQ,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK;IACnC,YAAY,CAAC,CAAC,cAAc,EAAE,CAAC;IAC/B,YAAY,CAAC,CAAC,eAAe,EAAE,CAAC;IAChC,YAAY,UAAU,GAAG,IAAI,CAAC;AAC9B;IACA,YAAY,MAAM,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC;IAC1D,YAAY,MAAM,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC;IAC1D,YAAY,UAAU,GAAG,UAAU,CAAC,WAAW,CAAC;IAChD,YAAY,WAAW,GAAG,UAAU,CAAC,YAAY,CAAC;AAClD;IACA,YAAY,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAChE,YAAY,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC5D,YAAY,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAChE,YAAY,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAC7D,QAAQ,CAAC,CAAC;AACV;IACA,QAAQ,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK;IACnC,YAAY,IAAI,CAAC,UAAU,EAAE,OAAO;AACpC;IACA,YAAY,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC;IACjE,YAAY,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC;AACjE;IACA;IACA,YAAY,MAAM,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC5C,YAAY,MAAM,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAC5C;IACA,YAAY,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,MAAM,EAAE,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC;IAClG,YAAY,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,MAAM,EAAE,MAAM,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC;AACtG;IACA,YAAY,UAAU,CAAC,KAAK,CAAC,KAAK,GAAG,QAAQ,GAAG,IAAI,CAAC;IACrD,YAAY,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IACvD,QAAQ,CAAC,CAAC;AACV;IACA,QAAQ,MAAM,SAAS,GAAG,MAAM;IAChC,YAAY,IAAI,UAAU,EAAE;IAC5B;IACA,gBAAgB,YAAY,CAAC,OAAO,CAAC,sBAAsB,EAAE,IAAI,CAAC,SAAS,CAAC;IAC5E,oBAAoB,KAAK,EAAE,UAAU,CAAC,WAAW;IACjD,oBAAoB,MAAM,EAAE,UAAU,CAAC,YAAY;IACnD,iBAAiB,CAAC,CAAC,CAAC;IACpB,YAAY,CAAC;IACb,YAAY,UAAU,GAAG,KAAK,CAAC;IAC/B,YAAY,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACnE,YAAY,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC/D,YAAY,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACnE,YAAY,QAAQ,CAAC,mBAAmB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAChE,QAAQ,CAAC,CAAC;AACV;IACA,QAAQ,YAAY,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAChE,QAAQ,YAAY,CAAC,gBAAgB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IACjE,IAAI,CAAC;AACL;IACA;AACA;IACA,IAAI,IAAI,GAAG;IACX,QAAQ,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAC1E,QAAQ,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;IACpE,QAAQ,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;AACtE;IACA,QAAQ,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;IACtC,QAAQ,QAAQ,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;IACxC,QAAQ,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;IAC1C,QAAQ,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;AAC3B;IACA,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;IACrD,IAAI,CAAC;AACL;IACA,IAAI,KAAK,GAAG;IACZ,QAAQ,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IAC5B,QAAQ,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAC1E,QAAQ,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;IACpE,QAAQ,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;AACtE;IACA,QAAQ,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;IACtC,QAAQ,QAAQ,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;IACzC,QAAQ,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACzC;IACA,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IACvD,IAAI,CAAC;AACL;IACA,IAAI,MAAM,GAAG;IACb,QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE;IACzB,YAAY,IAAI,CAAC,KAAK,EAAE,CAAC;IACzB,QAAQ,CAAC,MAAM;IACf,YAAY,IAAI,CAAC,IAAI,EAAE,CAAC;IACxB,QAAQ,CAAC;IACT,IAAI,CAAC;AACL;IACA,IAAI,OAAO,GAAG;IACd,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE;IAC5B,YAAY,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;IACpC,YAAY,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC;IACT,IAAI,CAAC;IACL;;IClmBA;IACA;IACA;IACA;AACA;IACO,MAAM,YAAY,CAAC;IAC1B,IAAI,WAAW,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI,EAAE,QAAQ,GAAG,IAAI,EAAE;IACvD,QAAQ,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IAC7B,QAAQ,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;IACrD,QAAQ,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACjC,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,eAAe,GAAG;IACtB,QAAQ,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IAC3E,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,WAAW,GAAG;IAClB,QAAQ,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACvE,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,IAAI,MAAM,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,EAAE;IACtD,QAAQ,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACvE,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,MAAM,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE;IAC/B,QAA0B,IAAI,CAAC,QAAQ,IAAI,IAAI;AAC/C;IACA,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE;IAC3B;IACA,YAAY,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE;IACxC,gBAAgB,MAAM,EAAE,MAAM;IAC9B,gBAAgB,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;IAC/D,gBAAgB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;IACrC,oBAAoB,SAAS,EAAE,GAAG;IAClC,oBAAoB,GAAG,OAAO;IAC9B,iBAAiB,CAAC;IAClB,aAAa,CAAC,CAAC;IACf,QAAQ,CAAC;AACT;IACA,QAAQ,OAAO,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,cAAc,CAAC,OAAO,EAAE;IAC5B,QAAQ,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK;IACnC,YAAY,IAAI,EAAE,GAAG,CAAC,IAAI,KAAK,WAAW,GAAG,WAAW,GAAG,MAAM;IACjE,YAAY,OAAO,EAAE,GAAG,CAAC,OAAO;IAChC,SAAS,CAAC,CAAC,CAAC;IACZ,IAAI,CAAC;IACL;;ICnEA;IACA;IACA;IACA;AACA;AAEA;IACO,MAAM,YAAY,SAAS,YAAY,CAAC;IAC/C,IAAI,eAAe,GAAG;IACtB,QAAQ,OAAO,qBAAqB,CAAC;IACrC,IAAI,CAAC;AACL;IACA,IAAI,WAAW,GAAG;IAClB,QAAQ,OAAO,iDAAiD,CAAC;IACjE,IAAI,CAAC;AACL;IACA,IAAI,MAAM,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,EAAE;IACtD,QAAQ,MAAM,QAAQ,GAAG;IACzB,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE;IAChD,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;IAC3C,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;IAC9C,SAAS,CAAC;AACV;IACA,QAAQ,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;IAC/D,YAAY,MAAM,EAAE,MAAM;IAC1B,YAAY,OAAO,EAAE;IACrB,gBAAgB,cAAc,EAAE,kBAAkB;IAClD,gBAAgB,eAAe,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACxD,aAAa;IACb,YAAY,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;IACjC,gBAAgB,KAAK,EAAE,IAAI,CAAC,KAAK;IACjC,gBAAgB,QAAQ,EAAE,QAAQ;IAClC,gBAAgB,WAAW,EAAE,GAAG;IAChC,gBAAgB,UAAU,EAAE,IAAI;IAChC,aAAa,CAAC;IACd,SAAS,CAAC,CAAC;AACX;IACA,QAAQ,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;IAC1B,YAAY,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAClE,YAAY,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1F,QAAQ,CAAC;AACT;IACA,QAAQ,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;AAC3C;IACA,QAAQ,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE;IACjD,YAAY,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACnD,QAAQ,CAAC;AACT;IACA,QAAQ,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAC1D,IAAI,CAAC;IACL;;IClDA;IACA;IACA;AACA;AAEA;IACO,MAAM,cAAc,SAAS,YAAY,CAAC;IACjD,IAAI,eAAe,GAAG;IACtB,QAAQ,OAAO,kBAAkB,CAAC;IAClC,IAAI,CAAC;AACL;IACA,IAAI,WAAW,GAAG;IAClB,QAAQ,OAAO,CAAC,wDAAwD,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACvG,IAAI,CAAC;AACL;IACA,IAAI,MAAM,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,EAAE;IACtD;IACA,QAAQ,IAAI,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;AAC1C;IACA,QAAQ,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IAC/B,YAAY,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,KAAK,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC;IACpE,YAAY,UAAU,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACtD,QAAQ,CAAC,CAAC,CAAC;AACX;IACA,QAAQ,UAAU,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AACzC;IACA,QAAQ,MAAM,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/D;IACA,QAAQ,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;IAChD,YAAY,MAAM,EAAE,MAAM;IAC1B,YAAY,OAAO,EAAE;IACrB,gBAAgB,cAAc,EAAE,kBAAkB;IAClD,aAAa;IACb,YAAY,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;IACjC,gBAAgB,QAAQ,EAAE,CAAC;IAC3B,oBAAoB,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IACjD,iBAAiB,CAAC;IAClB,gBAAgB,gBAAgB,EAAE;IAClC,oBAAoB,WAAW,EAAE,GAAG;IACpC,oBAAoB,eAAe,EAAE,IAAI;IACzC,iBAAiB;IACjB,aAAa,CAAC;IACd,SAAS,CAAC,CAAC;AACX;IACA,QAAQ,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;IAC1B,YAAY,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAClE,YAAY,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,CAAC,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC5F,QAAQ,CAAC;AACT;IACA,QAAQ,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;AAC3C;IACA,QAAQ,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE;IAC7D,YAAY,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5D,QAAQ,CAAC;AACT;IACA,QAAQ,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAC5D,IAAI,CAAC;IACL;;ICzDA;IACA;IACA;IACA;AACA;AAEA;IACO,MAAM,cAAc,SAAS,YAAY,CAAC;IACjD,IAAI,eAAe,GAAG;IACtB,QAAQ,OAAO,eAAe,CAAC;IAC/B,IAAI,CAAC;AACL;IACA,IAAI,WAAW,GAAG;IAClB,QAAQ,OAAO,4CAA4C,CAAC;IAC5D,IAAI,CAAC;AACL;IACA,IAAI,MAAM,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,EAAE;IACtD,QAAQ,MAAM,QAAQ,GAAG;IACzB,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE;IAChD,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;IAC3C,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;IAC9C,SAAS,CAAC;AACV;IACA,QAAQ,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;IAC/D,YAAY,MAAM,EAAE,MAAM;IAC1B,YAAY,OAAO,EAAE;IACrB,gBAAgB,cAAc,EAAE,kBAAkB;IAClD,gBAAgB,eAAe,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACxD,aAAa;IACb,YAAY,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;IACjC,gBAAgB,KAAK,EAAE,IAAI,CAAC,KAAK;IACjC,gBAAgB,QAAQ,EAAE,QAAQ;IAClC,gBAAgB,WAAW,EAAE,GAAG;IAChC,gBAAgB,UAAU,EAAE,IAAI;IAChC,aAAa,CAAC;IACd,SAAS,CAAC,CAAC;AACX;IACA,QAAQ,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;IAC1B,YAAY,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAClE,YAAY,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,CAAC,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC5F,QAAQ,CAAC;AACT;IACA,QAAQ,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;AAC3C;IACA,QAAQ,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE;IACjD,YAAY,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACnD,QAAQ,CAAC;AACT;IACA,QAAQ,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAC5D,IAAI,CAAC;IACL;;IClDA;IACA;IACA;IACA;AACA;AAEA;IACO,MAAM,kBAAkB,SAAS,YAAY,CAAC;IACrD,IAAI,eAAe,GAAG;IACtB,QAAQ,OAAO,gCAAgC,CAAC;IAChD,IAAI,CAAC;AACL;IACA,IAAI,WAAW,GAAG;IAClB,QAAQ,OAAO,+CAA+C,CAAC;IAC/D,IAAI,CAAC;AACL;IACA,IAAI,MAAM,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,EAAE;IACtD,QAAQ,MAAM,QAAQ,GAAG;IACzB,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE;IAChD,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;IAC3C,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;IAC9C,SAAS,CAAC;AACV;IACA,QAAQ,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;IAC/D,YAAY,MAAM,EAAE,MAAM;IAC1B,YAAY,OAAO,EAAE;IACrB,gBAAgB,cAAc,EAAE,kBAAkB;IAClD,gBAAgB,eAAe,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACxD,gBAAgB,cAAc,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;IACtD,gBAAgB,SAAS,EAAE,QAAQ,CAAC,KAAK,IAAI,oBAAoB;IACjE,aAAa;IACb,YAAY,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;IACjC,gBAAgB,KAAK,EAAE,IAAI,CAAC,KAAK;IACjC,gBAAgB,QAAQ,EAAE,QAAQ;IAClC,gBAAgB,WAAW,EAAE,GAAG;IAChC,gBAAgB,UAAU,EAAE,IAAI;IAChC,aAAa,CAAC;IACd,SAAS,CAAC,CAAC;AACX;IACA,QAAQ,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;IAC1B,YAAY,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAClE,YAAY,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,CAAC,sBAAsB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAChG,QAAQ,CAAC;AACT;IACA,QAAQ,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;AAC3C;IACA,QAAQ,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE;IACjD,YAAY,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACnD,QAAQ,CAAC;AACT;IACA,QAAQ,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAChE,IAAI,CAAC;IACL;;ICpDA;IACA;IACA;IACA;AACA;AAKA;IACO,MAAM,iBAAiB,CAAC;IAC/B,IAAI,OAAO,SAAS,GAAG;IACvB,QAAQ,IAAI,EAAE,YAAY;IAC1B,QAAQ,MAAM,EAAE,cAAc;IAC9B,QAAQ,MAAM,EAAE,cAAc;IAC9B,QAAQ,UAAU,EAAE,kBAAkB;IACtC,KAAK,CAAC;AACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,IAAI,OAAO,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,GAAG,IAAI,EAAE,QAAQ,GAAG,IAAI,EAAE;IACvE,QAAQ,MAAM,QAAQ,GAAG,iBAAiB,CAAC,SAAS,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC;AACjF;IACA,QAAQ,IAAI,CAAC,QAAQ,EAAE;IACvB,YAAY,OAAO,CAAC,IAAI,CAAC,CAAC,8BAA8B,EAAE,YAAY,CAAC,uBAAuB,CAAC,CAAC,CAAC;IACjG,YAAY,OAAO,IAAI,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC7D,QAAQ,CAAC;AACT;IACA,QAAQ,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IACrD,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,OAAO,qBAAqB,GAAG;IACnC,QAAQ,OAAO,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACxD,IAAI,CAAC;IACL;;IC1CA;IACA;IACA;IACA;AACA;IACO,MAAM,cAAc,CAAC;IAC5B,IAAI,OAAO,gBAAgB,GAAG,yCAAyC,CAAC;IACxE,IAAI,OAAO,mBAAmB,GAAG,kBAAkB,CAAC;AACpD;IACA,IAAI,WAAW,CAAC,MAAM,GAAG,EAAE,EAAE;IAC7B,QAAQ,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC;IAChD,QAAQ,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;IACzD,QAAQ,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC;IAC5C,QAAQ,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAChC,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,UAAU,GAAG;IACjB,QAAQ,OAAO,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;IACxE,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,YAAY,CAAC,IAAI,EAAE;IACvB,QAAQ,OAAO,CAAC,6CAA6C,EAAE,cAAc,CAAC,mBAAmB,CAAC,+BAA+B,EAAE,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACjL,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA;IACA,IAAI,YAAY,GAAG;IACnB,QAAQ,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE;IACxC,YAAY,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACjE,QAAQ,CAAC;IACT;IACA,QAAQ,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACtC,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA;IACA;IACA,IAAI,MAAM,YAAY,GAAG;IACzB,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,OAAO;AACpC;IACA;IACA;IACA,QAAQ,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE;IACxC,YAAY,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;IACtF,YAAY,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACnC,YAAY,OAAO;IACnB,QAAQ,CAAC;AACT;IACA;IACA,QAAQ,IAAI;IACZ,YAAY,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;AAC/D;IACA,YAAY,MAAM,KAAK,CAAC,GAAG,EAAE;IAC7B,gBAAgB,MAAM,EAAE,OAAO;IAC/B,gBAAgB,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;IAC/D,gBAAgB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;IACrC,oBAAoB,MAAM,EAAE;IAC5B,wBAAwB,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE;IACzE,wBAAwB,SAAS,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC,KAAK,IAAI,SAAS,EAAE;IAC/E,wBAAwB,QAAQ,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE;IACzE,wBAAwB,WAAW,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE;IAC7D,wBAAwB,QAAQ,EAAE,EAAE,WAAW,EAAE,gBAAgB,EAAE;IACnE,wBAAwB,WAAW,EAAE,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;IAC9E,qBAAqB;IACrB,iBAAiB,CAAC;IAClB,aAAa,CAAC,CAAC;AACf;IACA,YAAY,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,CAAC,OAAO,KAAK,EAAE;IACxB,YAAY,OAAO,CAAC,IAAI,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;IACxE,QAAQ,CAAC;IACT,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,MAAM,OAAO,CAAC,IAAI,EAAE;IACxB,QAAQ,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO;AAClC;IACA;IACA,QAAQ,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;AAClC;IACA,QAAQ,IAAI;IACZ,YAAY,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AAC1E;IACA,YAAY,MAAM,KAAK,CAAC,GAAG,EAAE;IAC7B,gBAAgB,MAAM,EAAE,MAAM;IAC9B,gBAAgB,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;IAC/D,gBAAgB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;IACrC,oBAAoB,MAAM,EAAE;IAC5B,wBAAwB,UAAU,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,SAAS,IAAI,SAAS,EAAE;IAChF,wBAAwB,YAAY,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE;IAC7E,wBAAwB,WAAW,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE,EAAE;IAC3E,wBAAwB,QAAQ,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE;IACvF,wBAAwB,SAAS,EAAE,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;IAC5E,wBAAwB,UAAU,EAAE,EAAE,WAAW,EAAE,SAAS,CAAC,SAAS,IAAI,EAAE,EAAE;IAC9E,qBAAqB;IACrB,iBAAiB,CAAC;IAClB,aAAa,CAAC,CAAC;IACf,QAAQ,CAAC,CAAC,OAAO,KAAK,EAAE;IACxB,YAAY,OAAO,CAAC,IAAI,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;IACnE,QAAQ,CAAC;IACT,IAAI,CAAC;IACL;;ICjHA;IACA;IACA;IACA;AACA;IACO,MAAM,cAAc,CAAC;IAC5B,IAAI,WAAW,CAAC,MAAM,GAAG,aAAa,EAAE;IACxC,QAAQ,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IAC7B,QAAQ,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IAC9B,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,GAAG,CAAC,GAAG,EAAE;IACb,QAAQ,IAAI;IACZ,YAAY,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IACjE,YAAY,OAAO,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAClD,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE;IACpB,YAAY,OAAO,CAAC,IAAI,CAAC,gCAAgC,EAAE,CAAC,CAAC,CAAC;IAC9D,YAAY,OAAO,IAAI,CAAC;IACxB,QAAQ,CAAC;IACT,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE;IACpB,QAAQ,IAAI;IACZ,YAAY,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3E,YAAY,OAAO,IAAI,CAAC;IACxB,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE;IACpB,YAAY,OAAO,CAAC,IAAI,CAAC,gCAAgC,EAAE,CAAC,CAAC,CAAC;IAC9D,YAAY,OAAO,KAAK,CAAC;IACzB,QAAQ,CAAC;IACT,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,MAAM,CAAC,GAAG,EAAE;IAChB,QAAQ,IAAI;IACZ,YAAY,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IACvD,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE;IACpB,YAAY,OAAO,CAAC,IAAI,CAAC,mCAAmC,EAAE,CAAC,CAAC,CAAC;IACjE,QAAQ,CAAC;IACT,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,YAAY,GAAG;IACnB,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,OAAO,IAAI,CAAC,SAAS,CAAC;AAClD;IACA,QAAQ,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAChD;IACA,QAAQ,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;IAC7B,YAAY,IAAI,CAAC,SAAS,GAAG,OAAO;IACpC,gBAAgB,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;IAC3D,gBAAgB,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC9C,YAAY,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACnD,QAAQ,CAAC;AACT;IACA,QAAQ,OAAO,IAAI,CAAC,SAAS,CAAC;IAC9B,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,WAAW,GAAG;IAClB,QAAQ,IAAI;IACZ,YAAY,MAAM,IAAI,GAAG,kBAAkB,CAAC;IAC5C,YAAY,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7C,YAAY,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC1C,YAAY,OAAO,IAAI,CAAC;IACxB,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE;IACpB,YAAY,OAAO,KAAK,CAAC;IACzB,QAAQ,CAAC;IACT,IAAI,CAAC;IACL;;IC/EA;IACA;IACA;AACA;IACO,MAAM,YAAY,CAAC;IAC1B,IAAI,WAAW,GAAG;IAClB,QAAQ,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IACzB,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE;IACxB,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;IACjC,YAAY,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IACpC,QAAQ,CAAC;IACT,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1C,QAAQ,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC/C,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE;IACzB,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO;IACxC,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,QAAQ,CAAC,CAAC;IAC9E,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;IACtB,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO;IACxC,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI;IAC/C,YAAY,IAAI;IAChB,gBAAgB,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/B,YAAY,CAAC,CAAC,OAAO,KAAK,EAAE;IAC5B,gBAAgB,OAAO,CAAC,KAAK,CAAC,CAAC,qCAAqC,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IACxF,YAAY,CAAC;IACb,QAAQ,CAAC,CAAC,CAAC;IACX,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE;IAC1B,QAAQ,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,KAAK;IACrD,YAAY,WAAW,EAAE,CAAC;IAC1B,YAAY,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC3B,QAAQ,CAAC,CAAC,CAAC;IACX,IAAI,CAAC;IACL;;ICnDA;IACA;IACA;IACA;AACA;AAMA;IACA,MAAM,SAAS,CAAC;IAChB,IAAI,OAAO,QAAQ,GAAG,IAAI,CAAC;IAC3B,IAAI,OAAO,OAAO,GAAG,OAAO,CAAC;AAC7B;IACA,IAAI,WAAW,GAAG;IAClB,QAAQ,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IAC/B,QAAQ,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IAC9B,QAAQ,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IAC5B,QAAQ,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;IACzC,QAAQ,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IAC9B,QAAQ,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IACnC,QAAQ,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA;IACA,IAAI,aAAa,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE;IACnC,QAAQ,IAAI,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE;IACpE,YAAY,OAAO,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;IACnG,YAAY,OAAO,SAAS,CAAC,QAAQ,CAAC;IACtC,QAAQ,CAAC;AACT;IACA,QAAQ,SAAS,CAAC,QAAQ,GAAG,IAAI,SAAS,EAAE,CAAC;AAC7C;IACA;IACA,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE;IAC3B,YAAY,MAAM,SAAS,CAAC,QAAQ,CAAC,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClF,QAAQ,CAAC,MAAM;IACf,YAAY,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACnD,QAAQ,CAAC;AACT;IACA,QAAQ,OAAO,SAAS,CAAC,QAAQ,CAAC;IAClC,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,MAAM,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,EAAE,EAAE;IACxD,QAAQ,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;AAChE;IACA,QAAQ,IAAI;IACZ;IACA,YAAY,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,2BAA2B,CAAC,MAAM,CAAC,CAAC;AAC5E;IACA,YAAY,IAAI,CAAC,QAAQ,EAAE;IAC3B,gBAAgB,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;IAChF,gBAAgB,OAAO;IACvB,YAAY,CAAC;AACb;IACA;IACA,YAAY,MAAM,MAAM,GAAG;IAC3B,gBAAgB,MAAM,EAAE,QAAQ,CAAC,cAAc;IAC/C,gBAAgB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;IAC3C,gBAAgB,KAAK,EAAE,QAAQ,CAAC,KAAK;IACrC,gBAAgB,OAAO,EAAE,QAAQ,CAAC,OAAO;IACzC,gBAAgB,cAAc,EAAE,QAAQ,CAAC,cAAc;IACvD,gBAAgB,WAAW,EAAE,QAAQ,CAAC,WAAW;IACjD,gBAAgB,mBAAmB,EAAE,QAAQ,CAAC,mBAAmB;IACjE,gBAAgB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;IAC3C,gBAAgB,SAAS,EAAE,QAAQ,CAAC,SAAS;IAC7C,gBAAgB,SAAS,EAAE,QAAQ,CAAC,SAAS;IAC7C,gBAAgB,UAAU,EAAE,QAAQ,CAAC,YAAY;IACjD,gBAAgB,OAAO,EAAE,QAAQ,CAAC,OAAO;IACzC,gBAAgB,KAAK,EAAE,QAAQ,CAAC,KAAK;IACrC,gBAAgB,OAAO,EAAE,QAAQ,CAAC,OAAO;IACzC,gBAAgB,SAAS,EAAE;IAC3B,oBAAoB,OAAO,EAAE,IAAI;IACjC,oBAAoB,MAAM,EAAE,IAAI,CAAC,MAAM;IACvC,oBAAoB,MAAM,EAAE,IAAI,CAAC,MAAM;IACvC,iBAAiB;IACjB,gBAAgB,GAAG,SAAS;IAC5B,gBAAgB,OAAO,EAAE,MAAM;IAC/B,aAAa,CAAC;AACd;IACA,YAAY,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AACrC;IACA,QAAQ,CAAC,CAAC,OAAO,KAAK,EAAE;IACxB,YAAY,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;IACzE,YAAY,IAAI,SAAS,CAAC,OAAO,EAAE;IACnC,gBAAgB,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACzC,YAAY,CAAC;IACb,QAAQ,CAAC;IACT,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,MAAM,2BAA2B,CAAC,MAAM,EAAE;IAC9C,QAAQ,MAAM,gBAAgB,GAAG,kBAAkB,CAAC;IACpD,QAAQ,MAAM,OAAO,GAAG,CAAC,6CAA6C,EAAE,gBAAgB,CAAC,8BAA8B,CAAC,CAAC;AACzH;IACA,QAAQ,IAAI;IACZ;IACA;IACA,YAAY,MAAM,SAAS,GAAG,CAAC,EAAE,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7D,YAAY,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;AAC1D;IACA,YAAY,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE;IACpC,gBAAgB,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;IACzE,gBAAgB,OAAO,IAAI,CAAC;IAC5B,YAAY,CAAC;AACb;IACA,YAAY,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;AAC3D;IACA,YAAY,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;IACpC,gBAAgB,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC/D,gBAAgB,OAAO,IAAI,CAAC;IAC5B,YAAY,CAAC;AACb;IACA,YAAY,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC;IAChE,YAAY,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC;IAC9D,YAAY,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC;AACjE;IACA,YAAY,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IAChC,YAAY,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;AACjC;IACA;IACA,YAAY,IAAI,MAAM,KAAK,QAAQ,EAAE;IACrC,gBAAgB,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACnE,gBAAgB,OAAO,IAAI,CAAC;IAC5B,YAAY,CAAC;AACb;IACA;IACA,YAAY,MAAM,MAAM,GAAG,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IACzE,YAAY,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;AACpD;IACA,YAAY,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE;IACjC,gBAAgB,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAC7E,gBAAgB,OAAO,IAAI,CAAC;IAC5B,YAAY,CAAC;AACb;IACA,YAAY,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;AACrD;IACA,YAAY,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;IACjC,gBAAgB,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACxE,gBAAgB,OAAO,IAAI,CAAC;IAC5B,YAAY,CAAC;AACb;IACA;IACA,YAAY,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE;IAC1C,gBAAgB,OAAO,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;IACjG,gBAAgB,OAAO,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAClD,YAAY,CAAC;AACb;IACA;IACA,YAAY,OAAO,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACzF;IACA,QAAQ,CAAC,CAAC,OAAO,KAAK,EAAE;IACxB,YAAY,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,KAAK,CAAC,CAAC;IAC9E,YAAY,OAAO,IAAI,CAAC;IACxB,QAAQ,CAAC;IACT,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,mBAAmB,GAAG;IAC1B,QAAQ,OAAO;IACf,YAAY,OAAO,EAAE,IAAI;IACzB,YAAY,OAAO,EAAE,cAAc;IACnC,YAAY,cAAc,EAAE,yDAAyD;IACrF,YAAY,WAAW,EAAE,EAAE;IAC3B,YAAY,mBAAmB,EAAE,IAAI;IACrC,YAAY,YAAY,EAAE,IAAI;IAC9B,YAAY,QAAQ,EAAE,MAAM;IAC5B,YAAY,cAAc,EAAE,EAAE;IAC9B,YAAY,KAAK,EAAE,yBAAyB;IAC5C,YAAY,QAAQ,EAAE,cAAc;IACpC,YAAY,SAAS,EAAE,IAAI;IAC3B,YAAY,SAAS,EAAE,KAAK;IAC5B,YAAY,KAAK,EAAE;IACnB,gBAAgB,IAAI,EAAE,UAAU;IAChC,gBAAgB,MAAM,EAAE,CAAC;IACzB,gBAAgB,OAAO,EAAE,SAAS;IAClC,gBAAgB,SAAS,EAAE,SAAS;IACpC,aAAa;IACb,YAAY,OAAO,EAAE;IACrB,gBAAgB,QAAQ,EAAE,QAAQ,CAAC,KAAK,IAAI,SAAS;IACrD,gBAAgB,eAAe,EAAE,EAAE;IACnC,gBAAgB,UAAU,EAAE,EAAE;IAC9B,gBAAgB,YAAY,EAAE,EAAE;IAChC,aAAa;IACb,SAAS,CAAC;IACV,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,uBAAuB,CAAC,MAAM,EAAE;IACpC,QAAQ,MAAM,SAAS,GAAG,CAAC,KAAK,KAAK,KAAK,EAAE,WAAW,IAAI,EAAE,CAAC;IAC9D,QAAQ,MAAM,SAAS,GAAG,CAAC,KAAK,KAAK,KAAK,EAAE,YAAY,IAAI,KAAK,EAAE,WAAW,IAAI,CAAC,CAAC;IACpF,QAAQ,MAAM,OAAO,GAAG,CAAC,KAAK,KAAK,KAAK,EAAE,YAAY,IAAI,KAAK,CAAC;IAChE,QAAQ,MAAM,QAAQ,GAAG,CAAC,KAAK,KAAK;IACpC,YAAY,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACtD,YAAY,OAAO,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACzE,QAAQ,CAAC,CAAC;AACV;IACA,QAAQ,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,IAAI,EAAE,CAAC;IACjE,QAAQ,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,EAAE,CAAC;AACrE;IACA,QAAQ,OAAO;IACf,YAAY,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,YAAY,KAAK,KAAK;IAC3D,YAAY,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,cAAc;IAChE,YAAY,cAAc,EAAE,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,+BAA+B;IAC/F,YAAY,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC;IACrD,YAAY,mBAAmB,EAAE,MAAM,CAAC,mBAAmB,EAAE,YAAY,KAAK,KAAK;IACnF,YAAY,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,YAAY,KAAK,KAAK;IACrE,YAAY,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM;IAC1D,YAAY,cAAc,EAAE,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC;IAC5D,YAAY,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;IAC1C,YAAY,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,cAAc;IAClE,YAAY,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;IAChD,YAAY,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;IAChD,YAAY,KAAK,EAAE;IACnB,gBAAgB,IAAI,EAAE,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,UAAU;IAC/D,gBAAgB,MAAM,EAAE,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;IAC1D,gBAAgB,OAAO,EAAE,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,SAAS;IACpE,gBAAgB,SAAS,EAAE,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,SAAS;IACxE,aAAa;IACb,YAAY,OAAO,EAAE;IACrB,gBAAgB,QAAQ,EAAE,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC;IAC3D,gBAAgB,eAAe,EAAE,SAAS,CAAC,aAAa,CAAC,eAAe,CAAC;IACzE,gBAAgB,UAAU,EAAE,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC;IAC/D,gBAAgB,YAAY,EAAE,SAAS,CAAC,aAAa,CAAC,YAAY,CAAC;IACnE,aAAa;IACb,SAAS,CAAC;IACV,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,WAAW,CAAC,MAAM,EAAE;IACxB;IACA,QAAQ,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;AAChD;IACA;IACA,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE;IAC3C,YAAY,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IAChG,YAAY,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IACtC,YAAY,OAAO;IACnB,QAAQ,CAAC;AACT;IACA;IACA,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;IACzD,YAAY,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACzE,YAAY,OAAO;IACnB,QAAQ,CAAC;AACT;IACA;IACA,QAAQ,IAAI,CAAC,OAAO,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;AACrE;IACA;IACA,QAAQ,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;AAClE;IACA;IACA,QAAQ,IAAI,CAAC,UAAU,GAAG,iBAAiB,CAAC,MAAM;IAClD,YAAY,IAAI,CAAC,MAAM,CAAC,QAAQ;IAChC,YAAY,IAAI,CAAC,MAAM,CAAC,MAAM;IAC9B,YAAY,IAAI,CAAC,MAAM,CAAC,KAAK;IAC7B,YAAY,IAAI,CAAC,MAAM,CAAC,QAAQ;IAChC,SAAS,CAAC;AACV;IACA;IACA,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE;IAC3C,YAAY,IAAI,CAAC,SAAS,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACvE,QAAQ,CAAC;AACT;IACA;IACA,QAAQ,IAAI,CAAC,MAAM,GAAG,IAAI,UAAU,CAAC;IACrC,YAAY,GAAG,IAAI,CAAC,MAAM;IAC1B,YAAY,aAAa,EAAE,CAAC,OAAO,KAAK,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;IACxE,YAAY,cAAc,EAAE,MAAM,IAAI,CAAC,aAAa,EAAE;IACtD,YAAY,WAAW,EAAE,IAAI,CAAC,WAAW;IACzC,SAAS,CAAC,CAAC;AACX;IACA,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;AAC7B;IACA,QAAQ,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAClC,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAClC;IACA,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;IACjC,YAAY,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IAClC,QAAQ,CAAC;AACT;IACA,QAAQ,OAAO,CAAC,GAAG,CAAC,CAAC,iBAAiB,EAAE,SAAS,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC,CAAC;IACtF,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,YAAY,CAAC,UAAU,EAAE;IAC7B,QAAQ,MAAM,QAAQ,GAAG;IACzB;IACA,YAAY,MAAM,EAAE,IAAI;AACxB;IACA;IACA,YAAY,OAAO,EAAE,IAAI;AACzB;IACA;IACA,YAAY,QAAQ,EAAE,MAAM;IAC5B,YAAY,KAAK,EAAE,IAAI;AACvB;IACA;IACA,YAAY,OAAO,EAAE,cAAc;IACnC,YAAY,SAAS,EAAE,IAAI;IAC3B,YAAY,cAAc,EAAE,yDAAyD;IACrF,YAAY,QAAQ,EAAE,cAAc;IACpC,YAAY,KAAK,EAAE;IACnB,gBAAgB,IAAI,EAAE,UAAU;IAChC,gBAAgB,MAAM,EAAE,CAAC;IACzB,gBAAgB,OAAO,EAAE,SAAS;IAClC,gBAAgB,SAAS,EAAE,SAAS;IACpC,aAAa;AACb;IACA;IACA,YAAY,SAAS,EAAE,KAAK;IAC5B,YAAY,SAAS,EAAE,KAAK;IAC5B,YAAY,WAAW,EAAE,IAAI;IAC7B,YAAY,UAAU,EAAE,IAAI;IAC5B,YAAY,WAAW,EAAE,EAAE;IAC3B,YAAY,mBAAmB,EAAE,IAAI;IACrC,YAAY,UAAU,EAAE,KAAK;AAC7B;IACA;IACA,YAAY,OAAO,EAAE;IACrB,gBAAgB,QAAQ,EAAE,QAAQ,CAAC,KAAK,IAAI,SAAS;IACrD,gBAAgB,eAAe,EAAE,EAAE;IACnC,gBAAgB,UAAU,EAAE,EAAE;IAC9B,gBAAgB,YAAY,EAAE,EAAE;IAChC,aAAa;AACb;IACA;IACA,YAAY,SAAS,EAAE;IACvB,gBAAgB,OAAO,EAAE,IAAI;IAC7B,gBAAgB,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC;IAChF,aAAa;AACb;IACA;IACA,YAAY,QAAQ,EAAE,IAAI;AAC1B;IACA;IACA,YAAY,aAAa,EAAE,aAAa;AACxC;IACA;IACA,YAAY,OAAO,EAAE,IAAI;IACzB,YAAY,SAAS,EAAE,IAAI;IAC3B,YAAY,MAAM,EAAE,IAAI;IACxB,YAAY,OAAO,EAAE,IAAI;IACzB,YAAY,OAAO,EAAE,IAAI;IACzB,SAAS,CAAC;AACV;IACA;IACA,QAAQ,MAAM,KAAK,GAAG,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,IAAI,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;IACzE,QAAQ,MAAM,OAAO,GAAG,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,IAAI,UAAU,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;IAC/E,QAAQ,MAAM,SAAS,GAAG,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE,IAAI,UAAU,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,CAAC;AACrF;IACA,QAAQ,OAAO;IACf,YAAY,GAAG,QAAQ;IACvB,YAAY,GAAG,UAAU;IACzB,YAAY,KAAK;IACjB,YAAY,OAAO;IACnB,YAAY,SAAS;IACrB,SAAS,CAAC;IACV,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,MAAM,kBAAkB,CAAC,OAAO,EAAE;IACtC,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,OAAO;AACpC;IACA;IACA,QAAQ,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IAC9B,YAAY,IAAI,EAAE,MAAM;IACxB,YAAY,OAAO,EAAE,OAAO;IAC5B,YAAY,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;IAC/C,SAAS,CAAC,CAAC;AACX;IACA;IACA,QAAQ,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;AACjC;IACA,QAAQ,IAAI;IACZ;IACA,YAAY,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;AACvD;IACA;IACA,YAAY,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW;IAC9D,gBAAgB,OAAO;IACvB,gBAAgB,aAAa;IAC7B,gBAAgB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;IAC3C,aAAa,CAAC;AACd;IACA;IACA,YAAY,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IAClC,gBAAgB,IAAI,EAAE,WAAW;IACjC,gBAAgB,OAAO,EAAE,QAAQ;IACjC,gBAAgB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;IACnD,aAAa,CAAC,CAAC;AACf;IACA;IACA,YAAY,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;IACrC,YAAY,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AACpD;IACA;IACA,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;IACzC,gBAAgB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9E,YAAY,CAAC;AACb;IACA;IACA,YAAY,IAAI,IAAI,CAAC,SAAS,EAAE;IAChC,gBAAgB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;IACvC,oBAAoB,WAAW,EAAE,OAAO;IACxC,oBAAoB,UAAU,EAAE,QAAQ;IACxC,oBAAoB,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;IACjD,oBAAoB,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;IAC1D,iBAAiB,CAAC,CAAC;IACnB,YAAY,CAAC;AACb;IACA;IACA,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;IACvC,gBAAgB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACtD,YAAY,CAAC;AACb;IACA,YAAY,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5E;IACA,QAAQ,CAAC,CAAC,OAAO,KAAK,EAAE;IACxB,YAAY,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;IACrC,YAAY,MAAM,YAAY,GAAG,kDAAkD,CAAC;IACpF,YAAY,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;AACxD;IACA,YAAY,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;AACvD;IACA,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;IACrC,gBAAgB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3C,YAAY,CAAC;AACb;IACA,YAAY,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC7C,QAAQ,CAAC;IACT,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,aAAa,GAAG;IACpB,QAAQ,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;IACxC,QAAQ,IAAI,OAAO,GAAG,EAAE,CAAC;AACzB;IACA,QAAQ,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,4CAA4C,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACnH,QAAQ,OAAO,IAAI,CAAC,2DAA2D,CAAC,CAAC;AACjF;IACA,QAAQ,OAAO,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAChD,QAAQ,OAAO,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC9D,QAAQ,OAAO,IAAI,CAAC,0GAA0G,CAAC,CAAC;IAChI,QAAQ,OAAO,IAAI,CAAC,oEAAoE,CAAC,CAAC;AAC1F;IACA,QAAQ,IAAI,GAAG,CAAC,eAAe,EAAE;IACjC,YAAY,OAAO,IAAI,CAAC,wBAAwB,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACzE,QAAQ,CAAC;AACT;IACA,QAAQ,IAAI,GAAG,CAAC,UAAU,EAAE;IAC5B,YAAY,OAAO,IAAI,CAAC,4BAA4B,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACxE,QAAQ,CAAC;AACT;IACA,QAAQ,IAAI,GAAG,CAAC,YAAY,EAAE;IAC9B,YAAY,OAAO,IAAI,CAAC,uCAAuC,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrF,QAAQ,CAAC;AACT;IACA,QAAQ,OAAO,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAC/C,QAAQ,OAAO,IAAI,CAAC,kCAAkC,CAAC,CAAC;IACxD,QAAQ,OAAO,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAChE,QAAQ,OAAO,IAAI,CAAC,8CAA8C,CAAC,CAAC;IACpE,QAAQ,OAAO,IAAI,CAAC,qDAAqD,CAAC,CAAC;IAC3E,QAAQ,OAAO,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAC3D,QAAQ,OAAO,IAAI,CAAC,uCAAuC,CAAC,CAAC;AAC7D;IACA,QAAQ,OAAO,OAAO,CAAC;IACvB,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,aAAa,GAAG;IACpB,QAAQ,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IAC9B,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAC5C,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC;AACL;IACA;AACA;IACA;IACA;IACA;IACA,IAAI,OAAO,IAAI,GAAG;IAClB,QAAQ,IAAI,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE;IACxC,YAAY,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC7C,QAAQ,CAAC;IACT,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,OAAO,KAAK,GAAG;IACnB,QAAQ,IAAI,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE;IACxC,YAAY,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC9C,QAAQ,CAAC;IACT,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,OAAO,MAAM,GAAG;IACpB,QAAQ,IAAI,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE;IACxC,YAAY,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;IAC/C,QAAQ,CAAC;IACT,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,OAAO,WAAW,CAAC,IAAI,EAAE;IAC7B,QAAQ,IAAI,SAAS,CAAC,QAAQ,EAAE;IAChC,YAAY,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/D,YAAY,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACxD,QAAQ,CAAC;IACT,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,OAAO,UAAU,CAAC,UAAU,EAAE;IAClC,QAAQ,IAAI,SAAS,CAAC,QAAQ,EAAE;IAChC,YAAY,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,GAAG;IAChD,gBAAgB,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO;IACpD,gBAAgB,GAAG,UAAU;IAC7B,aAAa,CAAC;IACd,QAAQ,CAAC;IACT,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE;IAC/B,QAAQ,IAAI,SAAS,CAAC,QAAQ,EAAE;IAChC,YAAY,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC1D,QAAQ,CAAC;IACT,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,OAAO,OAAO,GAAG;IACrB,QAAQ,IAAI,SAAS,CAAC,QAAQ,EAAE;IAChC,YAAY,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE;IAC3C,gBAAgB,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IACpD,YAAY,CAAC;IACb,YAAY,SAAS,CAAC,QAAQ,CAAC,aAAa,GAAG,KAAK,CAAC;IACrD,YAAY,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC;IACtC,YAAY,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACjD,QAAQ,CAAC;IACT,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,OAAO,UAAU,GAAG;IACxB,QAAQ,OAAO,SAAS,CAAC,OAAO,CAAC;IACjC,IAAI,CAAC;IACL;;ICtkBA;IACA;IACA;IACA;IACA;IACA;IACA;AACA;AAOA;IACA;IACA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;IACnC,IAAI,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;IACjC;;;;;;;;;;;"}
Binary file
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "ask-junkie",
3
+ "version": "1.0.0",
4
+ "description": "Ask Junkie - AI Chatbot SDK for any website. Add an intelligent AI chatbot to React, Next.js, Vue, or vanilla HTML sites.",
5
+ "main": "dist/ask-junkie.min.js",
6
+ "module": "dist/ask-junkie.esm.js",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "dist/",
10
+ "src/"
11
+ ],
12
+ "scripts": {
13
+ "dev": "rollup -c -w",
14
+ "build": "rollup -c",
15
+ "build:prod": "NODE_ENV=production rollup -c",
16
+ "test": "echo \"Tests coming soon\" && exit 0"
17
+ },
18
+ "keywords": [
19
+ "chatbot",
20
+ "ai",
21
+ "widget",
22
+ "groq",
23
+ "gemini",
24
+ "openai",
25
+ "llama",
26
+ "react",
27
+ "nextjs",
28
+ "vue",
29
+ "javascript"
30
+ ],
31
+ "author": "Junkies Coder <info@junkiescoder.com>",
32
+ "license": "MIT",
33
+ "homepage": "https://junkiescoder.com/ask-junkie-sdk",
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "https://github.com/junkiescoder/ask-junkie-sdk.git"
37
+ },
38
+ "devDependencies": {
39
+ "@rollup/plugin-terser": "^0.4.4",
40
+ "rollup": "^4.9.0",
41
+ "rollup-plugin-css-only": "^4.5.2"
42
+ }
43
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * AI Provider Factory
3
+ * Creates the appropriate AI provider based on configuration
4
+ */
5
+
6
+ import { GroqProvider } from './GroqProvider.js';
7
+ import { GeminiProvider } from './GeminiProvider.js';
8
+ import { OpenAIProvider } from './OpenAIProvider.js';
9
+ import { OpenRouterProvider } from './OpenRouterProvider.js';
10
+
11
+ export class AIProviderFactory {
12
+ static providers = {
13
+ groq: GroqProvider,
14
+ gemini: GeminiProvider,
15
+ openai: OpenAIProvider,
16
+ openrouter: OpenRouterProvider
17
+ };
18
+
19
+ /**
20
+ * Create an AI provider instance
21
+ * @param {string} providerName - Provider name (groq, gemini, openai, openrouter)
22
+ * @param {string} apiKey - API key for the provider
23
+ * @param {string|null} model - Optional model override
24
+ * @param {string|null} proxyUrl - Optional proxy URL
25
+ */
26
+ static create(providerName, apiKey, model = null, proxyUrl = null) {
27
+ const Provider = AIProviderFactory.providers[providerName.toLowerCase()];
28
+
29
+ if (!Provider) {
30
+ console.warn(`[AskJunkie] Unknown provider "${providerName}", falling back to Groq`);
31
+ return new GroqProvider(apiKey, model, proxyUrl);
32
+ }
33
+
34
+ return new Provider(apiKey, model, proxyUrl);
35
+ }
36
+
37
+ /**
38
+ * Get list of supported providers
39
+ */
40
+ static getSupportedProviders() {
41
+ return Object.keys(AIProviderFactory.providers);
42
+ }
43
+ }
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Base AI Provider Interface
3
+ * All AI providers extend this class
4
+ */
5
+
6
+ export class BaseProvider {
7
+ constructor(apiKey, model = null, proxyUrl = null) {
8
+ this.apiKey = apiKey;
9
+ this.model = model || this.getDefaultModel();
10
+ this.proxyUrl = proxyUrl;
11
+ }
12
+
13
+ /**
14
+ * Get the default model for this provider
15
+ */
16
+ getDefaultModel() {
17
+ throw new Error('getDefaultModel must be implemented by subclass');
18
+ }
19
+
20
+ /**
21
+ * Get the API endpoint URL
22
+ */
23
+ getEndpoint() {
24
+ throw new Error('getEndpoint must be implemented by subclass');
25
+ }
26
+
27
+ /**
28
+ * Send a message to the AI provider
29
+ * @param {string} message - User message
30
+ * @param {string} context - System context/prompt
31
+ * @param {Array} history - Conversation history
32
+ * @returns {Promise<string>} AI response
33
+ */
34
+ async sendMessage(message, context, history = []) {
35
+ throw new Error('sendMessage must be implemented by subclass');
36
+ }
37
+
38
+ /**
39
+ * Make HTTP request (supports proxy mode)
40
+ */
41
+ async _fetch(url, options) {
42
+ const targetUrl = this.proxyUrl || url;
43
+
44
+ if (this.proxyUrl) {
45
+ // Proxy mode - send the original URL and options to proxy
46
+ return fetch(this.proxyUrl, {
47
+ method: 'POST',
48
+ headers: { 'Content-Type': 'application/json' },
49
+ body: JSON.stringify({
50
+ targetUrl: url,
51
+ ...options
52
+ })
53
+ });
54
+ }
55
+
56
+ return fetch(url, options);
57
+ }
58
+
59
+ /**
60
+ * Format conversation history for chat API
61
+ */
62
+ _formatHistory(history) {
63
+ return history.map(msg => ({
64
+ role: msg.role === 'assistant' ? 'assistant' : 'user',
65
+ content: msg.content
66
+ }));
67
+ }
68
+ }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Google Gemini AI Provider
3
+ */
4
+
5
+ import { BaseProvider } from './BaseProvider.js';
6
+
7
+ export class GeminiProvider extends BaseProvider {
8
+ getDefaultModel() {
9
+ return 'gemini-1.5-flash';
10
+ }
11
+
12
+ getEndpoint() {
13
+ return `https://generativelanguage.googleapis.com/v1beta/models/${this.model}:generateContent`;
14
+ }
15
+
16
+ async sendMessage(message, context, history = []) {
17
+ // Build conversation text
18
+ let fullPrompt = context + '\n\n';
19
+
20
+ history.forEach(msg => {
21
+ const role = msg.role === 'user' ? 'User' : 'Assistant';
22
+ fullPrompt += `${role}: ${msg.content}\n`;
23
+ });
24
+
25
+ fullPrompt += `User: ${message}`;
26
+
27
+ const url = `${this.getEndpoint()}?key=${this.apiKey}`;
28
+
29
+ const response = await this._fetch(url, {
30
+ method: 'POST',
31
+ headers: {
32
+ 'Content-Type': 'application/json'
33
+ },
34
+ body: JSON.stringify({
35
+ contents: [{
36
+ parts: [{ text: fullPrompt }]
37
+ }],
38
+ generationConfig: {
39
+ temperature: 0.7,
40
+ maxOutputTokens: 1000
41
+ }
42
+ })
43
+ });
44
+
45
+ if (!response.ok) {
46
+ const error = await response.json().catch(() => ({}));
47
+ throw new Error(error.error?.message || `Gemini API error: ${response.status}`);
48
+ }
49
+
50
+ const data = await response.json();
51
+
52
+ if (data.candidates?.[0]?.content?.parts?.[0]?.text) {
53
+ return data.candidates[0].content.parts[0].text;
54
+ }
55
+
56
+ throw new Error('Invalid response from Gemini API');
57
+ }
58
+ }
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Groq AI Provider
3
+ * Fast LLM inference using Groq Cloud
4
+ */
5
+
6
+ import { BaseProvider } from './BaseProvider.js';
7
+
8
+ export class GroqProvider extends BaseProvider {
9
+ getDefaultModel() {
10
+ return 'openai/gpt-oss-120b';
11
+ }
12
+
13
+ getEndpoint() {
14
+ return 'https://api.groq.com/openai/v1/chat/completions';
15
+ }
16
+
17
+ async sendMessage(message, context, history = []) {
18
+ const messages = [
19
+ { role: 'system', content: context },
20
+ ...this._formatHistory(history),
21
+ { role: 'user', content: message }
22
+ ];
23
+
24
+ const response = await this._fetch(this.getEndpoint(), {
25
+ method: 'POST',
26
+ headers: {
27
+ 'Content-Type': 'application/json',
28
+ 'Authorization': `Bearer ${this.apiKey}`
29
+ },
30
+ body: JSON.stringify({
31
+ model: this.model,
32
+ messages: messages,
33
+ temperature: 0.7,
34
+ max_tokens: 1000
35
+ })
36
+ });
37
+
38
+ if (!response.ok) {
39
+ const error = await response.json().catch(() => ({}));
40
+ throw new Error(error.error?.message || `Groq API error: ${response.status}`);
41
+ }
42
+
43
+ const data = await response.json();
44
+
45
+ if (data.choices?.[0]?.message?.content) {
46
+ return data.choices[0].message.content;
47
+ }
48
+
49
+ throw new Error('Invalid response from Groq API');
50
+ }
51
+ }
@@ -0,0 +1,51 @@
1
+ /**
2
+ * OpenAI Provider
3
+ * GPT-3.5 and GPT-4 models
4
+ */
5
+
6
+ import { BaseProvider } from './BaseProvider.js';
7
+
8
+ export class OpenAIProvider extends BaseProvider {
9
+ getDefaultModel() {
10
+ return 'gpt-3.5-turbo';
11
+ }
12
+
13
+ getEndpoint() {
14
+ return 'https://api.openai.com/v1/chat/completions';
15
+ }
16
+
17
+ async sendMessage(message, context, history = []) {
18
+ const messages = [
19
+ { role: 'system', content: context },
20
+ ...this._formatHistory(history),
21
+ { role: 'user', content: message }
22
+ ];
23
+
24
+ const response = await this._fetch(this.getEndpoint(), {
25
+ method: 'POST',
26
+ headers: {
27
+ 'Content-Type': 'application/json',
28
+ 'Authorization': `Bearer ${this.apiKey}`
29
+ },
30
+ body: JSON.stringify({
31
+ model: this.model,
32
+ messages: messages,
33
+ temperature: 0.7,
34
+ max_tokens: 1000
35
+ })
36
+ });
37
+
38
+ if (!response.ok) {
39
+ const error = await response.json().catch(() => ({}));
40
+ throw new Error(error.error?.message || `OpenAI API error: ${response.status}`);
41
+ }
42
+
43
+ const data = await response.json();
44
+
45
+ if (data.choices?.[0]?.message?.content) {
46
+ return data.choices[0].message.content;
47
+ }
48
+
49
+ throw new Error('Invalid response from OpenAI API');
50
+ }
51
+ }