{"version":3,"file":"web.mjs","sources":["../node_modules/style-inject/dist/style-inject.es.js","../src/localStorageManager.js","../src/defaultConfig.js","../src/configLoader.js","../node_modules/marked/lib/marked.esm.js","../src/messageFormatter.js","../src/iframe-manager.js","../src/themeGenerator.js","../src/chatbot-core.js","../src/index.js"],"sourcesContent":["function styleInject(css, ref) {\n  if ( ref === void 0 ) ref = {};\n  var insertAt = ref.insertAt;\n\n  if (!css || typeof document === 'undefined') { return; }\n\n  var head = document.head || document.getElementsByTagName('head')[0];\n  var style = document.createElement('style');\n  style.type = 'text/css';\n\n  if (insertAt === 'top') {\n    if (head.firstChild) {\n      head.insertBefore(style, head.firstChild);\n    } else {\n      head.appendChild(style);\n    }\n  } else {\n    head.appendChild(style);\n  }\n\n  if (style.styleSheet) {\n    style.styleSheet.cssText = css;\n  } else {\n    style.appendChild(document.createTextNode(css));\n  }\n}\n\nexport default styleInject;\n","/**\r\n * LocalStorage Manager\r\n * Handles storing and retrieving chatbot data from localStorage\r\n * Manages: Config and Conversation State (visitor, session, history, usage limits)\r\n */\r\nclass LocalStorageManager {\r\n    constructor(chatbotId = null) {\r\n        this.chatbotId = chatbotId; // Store chatbotId for instance methods\r\n        this.keys = {\r\n            config: 'aptolix_chatbot_config',\r\n            state: 'aptolix_chatbot_state'\r\n        };\r\n    }\r\n\r\n    // ============================================\r\n    // HELPER METHODS\r\n    // ============================================\r\n\r\n    /**\r\n     * Get conversation state object\r\n     * @param {string} chatbotId - The chatbot ID (optional, uses instance chatbotId if not provided)\r\n     * @returns {Object|null} State object or null if not found\r\n     */\r\n    _getState(chatbotId = null) {\r\n        chatbotId = chatbotId || this.chatbotId;\r\n        if (!chatbotId) return null;\r\n        \r\n        try {\r\n            const key = `${this.keys.state}_${chatbotId}`;\r\n            const stored = localStorage.getItem(key);\r\n            \r\n            if (!stored) {\r\n                return null;\r\n            }\r\n\r\n            return JSON.parse(stored);\r\n        } catch (error) {\r\n            return null;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Save conversation state object\r\n     * @param {string} chatbotId - The chatbot ID (optional, uses instance chatbotId if not provided)\r\n     * @param {Object} state - State object to save\r\n     */\r\n    _saveState(chatbotId, state) {\r\n        // Handle both old signature (chatbotId, state) and new signature (state only)\r\n        if (typeof chatbotId === 'object' && state === undefined) {\r\n            state = chatbotId;\r\n            chatbotId = this.chatbotId;\r\n        }\r\n        if (!chatbotId) return;\r\n        \r\n        try {\r\n            const key = `${this.keys.state}_${chatbotId}`;\r\n            state.timestamp = Date.now();\r\n            state.version = __VERSION__;\r\n            localStorage.setItem(key, JSON.stringify(state));\r\n        } catch (error) {\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Check if stored data is from today\r\n     * @param {number} timestamp - Timestamp to check\r\n     * @returns {boolean}\r\n     */\r\n    _isToday(timestamp) {\r\n        const today = new Date();\r\n        const storedDate = new Date(timestamp);\r\n        return (\r\n            today.getFullYear() === storedDate.getFullYear() &&\r\n            today.getMonth() === storedDate.getMonth() &&\r\n            today.getDate() === storedDate.getDate()\r\n        );\r\n    }\r\n\r\n    /**\r\n     * Get start of today timestamp (00:00:00)\r\n     * @returns {number}\r\n     */\r\n    _getTodayStart() {\r\n        const today = new Date();\r\n        today.setHours(0, 0, 0, 0);\r\n        return today.getTime();\r\n    }\r\n\r\n    // ============================================\r\n    // 1. CONFIG MANAGEMENT\r\n    // ============================================\r\n\r\n    /**\r\n     * Save chatbot configuration\r\n     * @param {string} chatbotId - The chatbot ID\r\n     * @param {Object} config - Configuration object to store\r\n     */\r\n    saveConfig(chatbotId, config) {\r\n        try {\r\n            const key = `${this.keys.config}_${chatbotId}`;\r\n            const data = {\r\n                config: config,\r\n                timestamp: Date.now()\r\n            };\r\n            localStorage.setItem(key, JSON.stringify(data));\r\n        } catch (error) {\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Retrieve chatbot configuration\r\n     * @param {string} chatbotId - The chatbot ID\r\n     * @returns {Object|null} Configuration object or null if not found\r\n     */\r\n    getConfig(chatbotId) {\r\n        try {\r\n            const key = `${this.keys.config}_${chatbotId}`;\r\n            const stored = localStorage.getItem(key);\r\n            \r\n            if (!stored) {\r\n                return null;\r\n            }\r\n\r\n            const data = JSON.parse(stored);\r\n            return data.config;\r\n        } catch (error) {\r\n            return null;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Clear chatbot configuration\r\n     * @param {string} chatbotId - The chatbot ID\r\n     */\r\n    clearConfig(chatbotId) {\r\n        try {\r\n            const key = `${this.keys.config}_${chatbotId}`;\r\n            localStorage.removeItem(key);\r\n        } catch (error) {\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Check if config exists\r\n     * @param {string} chatbotId - The chatbot ID\r\n     * @returns {boolean}\r\n     */\r\n    hasConfig(chatbotId) {\r\n        const key = `${this.keys.config}_${chatbotId}`;\r\n        return localStorage.getItem(key) !== null;\r\n    }\r\n\r\n    // ============================================\r\n    // 2. VISITOR ID MANAGEMENT\r\n    // ============================================\r\n\r\n    /**\r\n     * Save visitor ID for a chatbot\r\n     * @param {string} chatbotId - The chatbot ID\r\n     * @param {string} visitorId - Unique visitor identifier\r\n     */\r\n    saveVisitorId(chatbotId, visitorId) {\r\n        try {\r\n            const state = this._getState(chatbotId) || {};\r\n            state.visitorId = visitorId;\r\n            this._saveState(chatbotId, state);\r\n        } catch (error) {\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Retrieve visitor ID for a chatbot\r\n     * @param {string} chatbotId - The chatbot ID\r\n     * @returns {string|null} Visitor ID or null if not found\r\n     */\r\n    getVisitorId(chatbotId) {\r\n        try {\r\n            const state = this._getState(chatbotId);\r\n            return state?.visitorId || null;\r\n        } catch (error) {\r\n            return null;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Clear visitor ID\r\n     * @param {string} chatbotId - The chatbot ID\r\n     */\r\n    clearVisitorId(chatbotId) {\r\n        try {\r\n            const state = this._getState(chatbotId);\r\n            if (state) {\r\n                delete state.visitorId;\r\n                this._saveState(chatbotId, state);\r\n            }\r\n        } catch (error) {\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Check if visitor ID exists\r\n     * @param {string} chatbotId - The chatbot ID\r\n     * @returns {boolean}\r\n     */\r\n    hasVisitorId(chatbotId) {\r\n        return this.getVisitorId(chatbotId) !== null;\r\n    }\r\n\r\n    // ============================================\r\n    // 3. SESSION ID MANAGEMENT\r\n    // ============================================\r\n\r\n    /**\r\n     * Save session ID for a chatbot\r\n     * @param {string} chatbotId - The chatbot ID\r\n     * @param {string} sessionId - Unique session identifier\r\n     */\r\n    saveSessionId(chatbotId, sessionId) {\r\n        try {\r\n            const state = this._getState(chatbotId) || {};\r\n            state.sessionId = sessionId;\r\n            this._saveState(chatbotId, state);\r\n        } catch (error) {\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Retrieve session ID for a chatbot\r\n     * @param {string} chatbotId - The chatbot ID\r\n     * @returns {string|null} Session ID or null if not found\r\n     */\r\n    getSessionId(chatbotId) {\r\n        try {\r\n            const state = this._getState(chatbotId);\r\n            return state?.sessionId || null;\r\n        } catch (error) {\r\n            return null;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Clear session ID\r\n     * @param {string} chatbotId - The chatbot ID\r\n     */\r\n    clearSessionId(chatbotId) {\r\n        try {\r\n            const state = this._getState(chatbotId);\r\n            if (state) {\r\n                delete state.sessionId;\r\n                this._saveState(chatbotId, state);\r\n            }\r\n        } catch (error) {\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Check if session ID exists\r\n     * @param {string} chatbotId - The chatbot ID\r\n     * @returns {boolean}\r\n     */\r\n    hasSessionId(chatbotId) {\r\n        return this.getSessionId(chatbotId) !== null;\r\n    }\r\n\r\n    // ============================================\r\n    // 4. CHAT HISTORY MANAGEMENT (with daily expiration)\r\n    // ============================================\r\n\r\n    /**\r\n     * Save chat history (expires next day)\r\n     * @param {string} chatbotId - The chatbot ID\r\n     * @param {string} sessionId - The session ID (not stored in history, validated against state.sessionId)\r\n     * @param {Array} messages - Array of message objects\r\n     */\r\n    saveChatHistory(chatbotId, sessionId, messages) {\r\n        try {\r\n            const state = this._getState(chatbotId) || {};\r\n            state.history = {\r\n                messages: messages,\r\n                timestamp: Date.now()\r\n            };\r\n            this._saveState(chatbotId, state);\r\n        } catch (error) {\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Retrieve chat history (returns null if expired)\r\n     * @param {string} chatbotId - The chatbot ID\r\n     * @param {string} sessionId - The session ID\r\n     * @returns {Array|null} Array of messages or null if not found/expired\r\n     */\r\n    getChatHistory(chatbotId, sessionId) {\r\n        try {\r\n            const state = this._getState(chatbotId);\r\n            \r\n            if (!state?.history) {\r\n                return null;\r\n            }\r\n\r\n            const { history } = state;\r\n            \r\n            // Check if history is for the current session\r\n            if (state.sessionId !== sessionId) {\r\n                return null;\r\n            }\r\n            \r\n            // Check if history is from today\r\n            if (!this._isToday(history.timestamp)) {\r\n                // History expired - clear it\r\n                this.clearChatHistory(chatbotId, sessionId);\r\n                return null;\r\n            }\r\n\r\n            return history.messages;\r\n        } catch (error) {\r\n            return null;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Clear chat history\r\n     * @param {string} chatbotId - The chatbot ID\r\n     * @param {string} sessionId - The session ID\r\n     */\r\n    clearChatHistory(chatbotId, sessionId) {\r\n        try {\r\n            const state = this._getState(chatbotId);\r\n            if (state?.history && state.sessionId === sessionId) {\r\n                delete state.history;\r\n                this._saveState(chatbotId, state);\r\n            }\r\n        } catch (error) {\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Check if chat history exists (and not expired)\r\n     * @param {string} chatbotId - The chatbot ID\r\n     * @param {string} sessionId - The session ID\r\n     * @returns {boolean}\r\n     */\r\n    hasChatHistory(chatbotId, sessionId) {\r\n        return this.getChatHistory(chatbotId, sessionId) !== null;\r\n    }\r\n\r\n    // ============================================\r\n    // 5. USAGE LIMIT REACHED MANAGEMENT (expires at limitReachedDate)\r\n    // ============================================\r\n\r\n    /**\r\n     * Set usage limit reached status with expiration date\r\n     * @param {string} chatbotId - The chatbot ID\r\n     * @param {string} visitorId - The visitor ID\r\n     * @param {string} limitReachedDate - UTC date string when limit expires\r\n     */\r\n    setUsageLimitReached(chatbotId, visitorId, limitReachedDate) {\r\n        try {\r\n            const state = this._getState(chatbotId) || {};\r\n            state.usageLimitReached = {\r\n                limitReachedDate: limitReachedDate,\r\n                timestamp: Date.now()\r\n            };\r\n            this._saveState(chatbotId, state);\r\n        } catch (error) {\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Get usage limit data (returns null if expired)\r\n     * @param {string} chatbotId - The chatbot ID\r\n     * @param {string} visitorId - The visitor ID\r\n     * @returns {Object|null} Object with limitReachedDate or null if expired/not found\r\n     */\r\n    getUsageLimitReached(chatbotId, visitorId) {\r\n        try {\r\n            const state = this._getState(chatbotId);\r\n            \r\n            if (!state?.usageLimitReached) {\r\n                return null;\r\n            }\r\n\r\n            const { usageLimitReached } = state;\r\n            let limitDate;\r\n            \r\n            // If the date string doesn't include time (just YYYY-MM-DD), \r\n            // set it to end of day (23:59:59.999 UTC) instead of start of day (00:00:00 UTC)\r\n            if (usageLimitReached.limitReachedDate.length === 10 && !usageLimitReached.limitReachedDate.includes('T')) {\r\n                // Parse date and add time to make it end of day\r\n                limitDate = new Date(usageLimitReached.limitReachedDate + 'T23:59:59.999Z');\r\n            } else {\r\n                limitDate = new Date(usageLimitReached.limitReachedDate);\r\n            }\r\n            \r\n            const now = new Date();\r\n            \r\n            // Check if limit date has passed (strictly greater than)\r\n            if (now > limitDate) {\r\n                // Limit expired - clear it\r\n                this.clearUsageLimitReached(chatbotId, visitorId);\r\n                return null;\r\n            }\r\n\r\n            return {\r\n                limitReachedDate: usageLimitReached.limitReachedDate,\r\n                timestamp: usageLimitReached.timestamp\r\n            };\r\n        } catch (error) {\r\n            return null;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Clear usage limit\r\n     * @param {string} chatbotId - The chatbot ID\r\n     * @param {string} visitorId - The visitor ID\r\n     */\r\n    clearUsageLimitReached(chatbotId, visitorId) {\r\n        try {\r\n            const state = this._getState(chatbotId);\r\n            if (state) {\r\n                delete state.usageLimitReached;\r\n                this._saveState(chatbotId, state);\r\n            }\r\n        } catch (error) {\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Check if usage limit is active (not expired)\r\n     * @param {string} chatbotId - The chatbot ID\r\n     * @param {string} visitorId - The visitor ID\r\n     * @returns {boolean}\r\n     */\r\n    hasUsageLimitReached(chatbotId, visitorId) {\r\n        return this.getUsageLimitReached(chatbotId, visitorId) !== null;\r\n    }\r\n\r\n    // ============================================\r\n    // UTILITY METHODS\r\n    // ============================================\r\n\r\n    /**\r\n     * Clear all data for a specific chatbot\r\n     * @param {string} chatbotId - The chatbot ID (optional, uses instance chatbotId if not provided)\r\n     * @param {string} visitorId - The visitor ID (optional, for compatibility)\r\n     * @param {string} sessionId - The session ID (optional, for compatibility)\r\n     */\r\n    clearAll(chatbotId = null, visitorId = null, sessionId = null) {\r\n        chatbotId = chatbotId || this.chatbotId;\r\n        if (!chatbotId) return;\r\n        \r\n        this.clearConfig(chatbotId);\r\n        \r\n        // Clear entire state\r\n        try {\r\n            const key = `${this.keys.state}_${chatbotId}`;\r\n            localStorage.removeItem(key);\r\n        } catch (error) {\r\n        }\r\n    }\r\n\r\n    // ============================================\r\n    // WRAPPER METHODS FOR CHATBOT-CORE (Instance-based API)\r\n    // ============================================\r\n\r\n    /**\r\n     * Get conversation history (wrapper for getChatHistory without sessionId requirement)\r\n     * @returns {Array|null} Array of messages or null if not found\r\n     */\r\n    getConversationHistory() {\r\n        if (!this.chatbotId) return null;\r\n        const state = this._getState(this.chatbotId);\r\n\r\n        if (!state?.history) {\r\n            return null;\r\n        }\r\n\r\n        if (!this._isToday(state.history.timestamp)) {\r\n            this.clearConversationHistory();\r\n            return null;\r\n        }\r\n\r\n        return state.history.messages || null;\r\n    }\r\n\r\n    /**\r\n     * Save conversation history (wrapper for saveChatHistory without sessionId)\r\n     * @param {Array} messages - Array of message objects\r\n     */\r\n    saveConversationHistory(messages) {\r\n        if (!this.chatbotId) return;\r\n        const state = this._getState(this.chatbotId) || {};\r\n        state.history = {\r\n            messages: messages,\r\n            timestamp: Date.now()\r\n        };\r\n        this._saveState(this.chatbotId, state);\r\n    }\r\n\r\n    /**\r\n     * Clear conversation history (wrapper for clearChatHistory without sessionId)\r\n     */\r\n    clearConversationHistory() {\r\n        if (!this.chatbotId) return;\r\n        const state = this._getState(this.chatbotId);\r\n        if (state?.history) {\r\n            delete state.history;\r\n            this._saveState(this.chatbotId, state);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Get rating for a conversation\r\n     * @param {string} conversationId - The conversation ID\r\n     * @returns {number|null} Rating value or null if not found\r\n     */\r\n    getRating(conversationId) {\r\n        if (!this.chatbotId) return null;\r\n        const state = this._getState(this.chatbotId);\r\n        return state?.ratings?.[conversationId] || null;\r\n    }\r\n\r\n    /**\r\n     * Save rating for a conversation\r\n     * @param {string} conversationId - The conversation ID\r\n     * @param {number} rating - Rating value (1-5)\r\n     */\r\n    saveRating(conversationId, rating) {\r\n        if (!this.chatbotId) return;\r\n        const state = this._getState(this.chatbotId) || {};\r\n        if (!state.ratings) {\r\n            state.ratings = {};\r\n        }\r\n        state.ratings[conversationId] = rating;\r\n        this._saveState(this.chatbotId, state);\r\n    }\r\n}\r\n\r\nexport default LocalStorageManager;\r\n","/**\r\n * Default configuration for Aptolix Chatbot\r\n * These values can be overridden during initialization\r\n */\r\n\r\nconst defaultConfig = {   \r\n    // Display Mode\r\n    mode: 'bubble', // 'bubble' or 'section' //\r\n    \r\n    // Chat Header\r\n    botname: 'AI Assistant', //\r\n    widgetIcon: \"💬\", //\r\n    botAvatar: `\r\n        <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <circle cx=\"20\" cy=\"20\" r=\"18\" fill=\"#9333ea\"/>\r\n            <rect x=\"12\" y=\"14\" width=\"6\" height=\"6\" rx=\"1\" fill=\"#fff\"/>\r\n            <rect x=\"22\" y=\"14\" width=\"6\" height=\"6\" rx=\"1\" fill=\"#fff\"/>\r\n            <rect x=\"13\" y=\"26\" width=\"14\" height=\"4\" rx=\"2\" fill=\"#fff\"/>\r\n        </svg>\r\n    `,\r\n    userAvatar: `\r\n        <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <circle cx=\"20\" cy=\"20\" r=\"20\" fill=\"#64748b\"/>\r\n            <circle cx=\"20\" cy=\"15\" r=\"6\" fill=\"#fff\"/>\r\n            <path d=\"M 8 35 Q 8 25 20 25 Q 32 25 32 35\" fill=\"#fff\"/>\r\n        </svg>\r\n    `,\r\n    username: 'You',\r\n    botaccentColor: '#4a57e2ff', //\r\n    subheading: '',\r\n    floatingWelcomeMessage: '',\r\n    floatingWelcomeDelay: 2, // seconds //\r\n    greetingMessage:'Welcome! Let me know if you have any questions.', //\r\n    allowDownloadTranscript: true, //\r\n    allowExpandChatWindow: true, //\r\n    allowFullPageChat: false,\r\n    \r\n    // Input Settings\r\n    inputCharLimit: 350,//\r\n    \r\n    // Menu Options\r\n    allowReset: true, // Show reset chat option in menu\r\n    \r\n    // Rating Feature\r\n    allowRating: true,\r\n    ratingThreshold: 3, // Show rating after this many bot messages\r\n    ratingInterval: 4, // Show rating again after this many more bot messages\r\n};\r\n\r\nexport default defaultConfig;\r\n","import LocalStorageManager from './localStorageManager.js';\r\nimport defaultConfig from './defaultConfig.js';\r\n\r\n/**\r\n * Validates if the widget icon is valid (SVG or text/emoji)\r\n * @param {string} iconValue - Icon value to validate\r\n * @returns {boolean} True if valid, false otherwise\r\n */\r\nfunction isValidWidgetIcon(iconValue) {\r\n    if (!iconValue || typeof iconValue !== 'string') {\r\n        return false;\r\n    }\r\n    \r\n    // Check if it's an SVG (contains '<svg' or other HTML tags)\r\n    if (iconValue.includes('<svg') || (iconValue.includes('<') && iconValue.includes('>'))) {\r\n        return true;\r\n    }\r\n    \r\n    // Check if it's text/emoji (any non-empty string that's not too long)\r\n    // Allow emojis, simple text, or icon characters\r\n    if (iconValue.trim().length > 0 && iconValue.length <= 100) {\r\n        return true;\r\n    }\r\n    \r\n    return false;\r\n}\r\n\r\n/**\r\n * Transform API response from snake_case to camelCase format\r\n * @param {Object} apiData - Raw API response with snake_case keys\r\n * @returns {Object} Transformed object with camelCase keys\r\n */\r\nfunction transformApiResponse(apiData) {\r\n    if (!apiData) return null;\r\n    \r\n    return {\r\n        botname: apiData.bot_name,\r\n        widgetIcon: apiData.widget_icon,\r\n        companyLogo: apiData.company_logo,\r\n        botAvatar: apiData.bot_avatar,\r\n        userAvatar: apiData.user_avatar,\r\n        username: apiData.username,\r\n        botaccentColor: apiData.accent_color,\r\n        subheading: apiData.subheading,\r\n        floatingWelcomeMessage: apiData.floating_welcome_message,\r\n        floatingWelcomeDelay: apiData.floating_welcome_delay,\r\n        greetingMessage: apiData.greeting_message,\r\n        allowDownloadTranscript: apiData.download_transcript,\r\n        allowExpandChatWindow: apiData.expand_chat_window,\r\n        allowFullPageChat: apiData.full_page_chat,\r\n        inputCharLimit: apiData.input_char_limit,\r\n        allowReset: apiData.allow_reset,\r\n        allowRating: apiData.allow_rating,\r\n        ratingThreshold: apiData.rating_threshold,\r\n        ratingInterval: apiData.rating_interval,\r\n    };\r\n}\r\n\r\n/**\r\n * Fetches chatbot appearance configuration from API\r\n * @param {string} apiHost - The API host URL\r\n * @param {string} chatbotId - The chatbot ID\r\n * @returns {Promise<Object|null>} Configuration object or null if failed\r\n */\r\nasync function fetchConfigFromAPI(apiHost, chatbotId) {\r\n    try {\r\n        const response = await fetch(`${apiHost}/chatbot/${chatbotId}/appearance`, {\r\n            method: 'GET',\r\n            headers: {\r\n                'Content-Type': 'application/json',\r\n            },\r\n        });\r\n\r\n        if (!response.ok) {\r\n            return null;\r\n        }\r\n\r\n        const data = await response.json();\r\n        // Transform snake_case API response to camelCase\r\n        return transformApiResponse(data);\r\n    } catch (error) {\r\n        return null;\r\n    }\r\n}\r\n\r\n/**\r\n * Loads chatbot configuration\r\n * Flow: Try API -> Save to localStorage -> If API fails, load from localStorage\r\n * \r\n * @param {string} apiHost - API host URL\r\n * @param {string} chatbotId - Chatbot identifier\r\n * @returns {Promise<Object|null>} Configuration object or null if not found\r\n */\r\nasync function loadConfig(apiHost, chatbotId) {\r\n    const storage = new LocalStorageManager();\r\n    \r\n    // Try to fetch from API\r\n    if (apiHost && chatbotId) {\r\n        const apiConfig = await fetchConfigFromAPI(apiHost, chatbotId);\r\n        \r\n        if (apiConfig) {\r\n            // Validate and use defaultConfig fallback if widgetIcon is invalid\r\n            if (!apiConfig.widgetIcon || !isValidWidgetIcon(apiConfig.widgetIcon)) {\r\n                apiConfig.widgetIcon = defaultConfig.widgetIcon;\r\n            }\r\n            \r\n            // API success - save to localStorage and return\r\n            storage.saveConfig(chatbotId, apiConfig);\r\n            return apiConfig;\r\n        } else {\r\n            // API failed - try to load from localStorage\r\n            const cachedConfig = storage.getConfig(chatbotId);\r\n            \r\n            if (cachedConfig) {\r\n                // Validate and use defaultConfig fallback if widgetIcon is invalid\r\n                if (!cachedConfig.widgetIcon || !isValidWidgetIcon(cachedConfig.widgetIcon)) {\r\n                    cachedConfig.widgetIcon = defaultConfig.widgetIcon;\r\n                }\r\n                return cachedConfig;\r\n            } else {\r\n                return null;\r\n            }\r\n        }\r\n    }\r\n    \r\n    return null;\r\n}\r\n\r\nexport { loadConfig };\r\n","/**\n * marked v16.2.1 - a markdown parser\n * Copyright (c) 2011-2025, Christopher Jeffrey. (MIT Licensed)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n\nfunction L(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var O=L();function H(l){O=l}var E={exec:()=>null};function h(l,e=\"\"){let t=typeof l==\"string\"?l:l.source,n={replace:(r,i)=>{let s=typeof i==\"string\"?i:i.source;return s=s.replace(m.caret,\"$1\"),t=t.replace(r,s),n},getRegex:()=>new RegExp(t,e)};return n}var m={codeRemoveIndent:/^(?: {1,4}| {0,3}\\t)/gm,outputLinkReplace:/\\\\([\\[\\]])/g,indentCodeCompensation:/^(\\s+)(?:```)/,beginningSpace:/^\\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\\n/g,tabCharGlobal:/\\t/g,multipleSpaceGlobal:/\\s+/g,blankLine:/^[ \\t]*$/,doubleBlankLine:/\\n[ \\t]*\\n[ \\t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \\t]?/gm,listReplaceTabs:/^\\t+/,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\\[[ xX]\\] /,listReplaceTask:/^\\[[ xX]\\] +/,anyLine:/\\n.*\\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\\||\\| *$/g,tableRowBlankLine:/\\n[ \\t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\\s|>)/i,endPreScriptTag:/^<\\/(pre|code|kbd|script)(\\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/,unicodeAlphaNumeric:/[\\p{L}\\p{N}]/u,escapeTest:/[&<>\"']/,escapeReplace:/[&<>\"']/g,escapeTestNoEncode:/[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/,escapeReplaceNoEncode:/[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,unescapeTest:/&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/ig,caret:/(^|[^\\[])\\^/g,percentDecode:/%25/g,findPipe:/\\|/g,splitPipe:/ \\|/,slashPipe:/\\\\\\|/g,carriageReturn:/\\r\\n|\\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\\S*/,endingNewline:/\\n$/,listItemRegex:l=>new RegExp(`^( {0,3}${l})((?:[\t ][^\\\\n]*)?(?:\\\\n|$))`),nextBulletRegex:l=>new RegExp(`^ {0,${Math.min(3,l-1)}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \t][^\\\\n]*)?(?:\\\\n|$))`),hrRegex:l=>new RegExp(`^ {0,${Math.min(3,l-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`),fencesBeginRegex:l=>new RegExp(`^ {0,${Math.min(3,l-1)}}(?:\\`\\`\\`|~~~)`),headingBeginRegex:l=>new RegExp(`^ {0,${Math.min(3,l-1)}}#`),htmlBeginRegex:l=>new RegExp(`^ {0,${Math.min(3,l-1)}}<(?:[a-z].*>|!--)`,\"i\")},xe=/^(?:[ \\t]*(?:\\n|$))+/,be=/^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\n|$))*)?)+/,Re=/^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/,C=/^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/,Oe=/^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/,j=/(?:[*+-]|\\d{1,9}[.)])/,se=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\\n(?!\\s*?\\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,ie=h(se).replace(/bull/g,j).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/\\|table/g,\"\").getRegex(),Te=h(se).replace(/bull/g,j).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/table/g,/ {0,3}\\|?(?:[:\\- ]*\\|)+[\\:\\- ]*\\n/).getRegex(),F=/^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/,we=/^[^\\n]+/,Q=/(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\])+/,ye=h(/^ {0,3}\\[(label)\\]: *(?:\\n[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/).replace(\"label\",Q).replace(\"title\",/(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/).getRegex(),Pe=h(/^( {0,3}bull)([ \\t][^\\n]+?)?(?:\\n|$)/).replace(/bull/g,j).getRegex(),v=\"address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul\",U=/<!--(?:-?>|[\\s\\S]*?(?:-->|$))/,Se=h(\"^ {0,3}(?:<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n+|$)|comment[^\\\\n]*(\\\\n+|$)|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)|<![A-Z][\\\\s\\\\S]*?(?:>\\\\n*|$)|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>\\\\n*|$)|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$)|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$)|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$))\",\"i\").replace(\"comment\",U).replace(\"tag\",v).replace(\"attribute\",/ +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/).getRegex(),oe=h(F).replace(\"hr\",C).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"|lheading\",\"\").replace(\"|table\",\"\").replace(\"blockquote\",\" {0,3}>\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)]) \").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",v).getRegex(),$e=h(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/).replace(\"paragraph\",oe).getRegex(),K={blockquote:$e,code:be,def:ye,fences:Re,heading:Oe,hr:C,html:Se,lheading:ie,list:Pe,newline:xe,paragraph:oe,table:E,text:we},re=h(\"^ *([^\\\\n ].*)\\\\n {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)\").replace(\"hr\",C).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"blockquote\",\" {0,3}>\").replace(\"code\",\"(?: {4}| {0,3}\t)[^\\\\n]\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)]) \").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",v).getRegex(),_e={...K,lheading:Te,table:re,paragraph:h(F).replace(\"hr\",C).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"|lheading\",\"\").replace(\"table\",re).replace(\"blockquote\",\" {0,3}>\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)]) \").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",v).getRegex()},Le={...K,html:h(`^ *(?:comment *(?:\\\\n|\\\\s*$)|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)|<tag(?:\"[^\"]*\"|'[^']*'|\\\\s[^'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))`).replace(\"comment\",U).replace(/tag/g,\"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b\").getRegex(),def:/^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,heading:/^(#{1,6})(.*)(?:\\n+|$)/,fences:E,lheading:/^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,paragraph:h(F).replace(\"hr\",C).replace(\"heading\",` *#{1,6} *[^\n]`).replace(\"lheading\",ie).replace(\"|table\",\"\").replace(\"blockquote\",\" {0,3}>\").replace(\"|fences\",\"\").replace(\"|list\",\"\").replace(\"|html\",\"\").replace(\"|tag\",\"\").getRegex()},Me=/^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,ze=/^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,ae=/^( {2,}|\\\\)\\n(?!\\s*$)/,Ae=/^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/,D=/[\\p{P}\\p{S}]/u,W=/[\\s\\p{P}\\p{S}]/u,le=/[^\\s\\p{P}\\p{S}]/u,Ee=h(/^((?![*_])punctSpace)/,\"u\").replace(/punctSpace/g,W).getRegex(),ue=/(?!~)[\\p{P}\\p{S}]/u,Ce=/(?!~)[\\s\\p{P}\\p{S}]/u,Ie=/(?:[^\\s\\p{P}\\p{S}]|~)/u,Be=/\\[[^\\[\\]]*?\\]\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)]|\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)])*\\))*\\)|`[^`]*?`|<(?! )[^<>]*?>/g,pe=/^(?:\\*+(?:((?!\\*)punct)|[^\\s*]))|^_+(?:((?!_)punct)|([^\\s_]))/,qe=h(pe,\"u\").replace(/punct/g,D).getRegex(),ve=h(pe,\"u\").replace(/punct/g,ue).getRegex(),ce=\"^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)|notPunctSpace(\\\\*+)(?=notPunctSpace)\",De=h(ce,\"gu\").replace(/notPunctSpace/g,le).replace(/punctSpace/g,W).replace(/punct/g,D).getRegex(),Ze=h(ce,\"gu\").replace(/notPunctSpace/g,Ie).replace(/punctSpace/g,Ce).replace(/punct/g,ue).getRegex(),Ge=h(\"^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)\",\"gu\").replace(/notPunctSpace/g,le).replace(/punctSpace/g,W).replace(/punct/g,D).getRegex(),He=h(/\\\\(punct)/,\"gu\").replace(/punct/g,D).getRegex(),Ne=h(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/).replace(\"scheme\",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace(\"email\",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),je=h(U).replace(\"(?:-->|$)\",\"-->\").getRegex(),Fe=h(\"^comment|^</[a-zA-Z][\\\\w:-]*\\\\s*>|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>|^<\\\\?[\\\\s\\\\S]*?\\\\?>|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>\").replace(\"comment\",je).replace(\"attribute\",/\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/).getRegex(),q=/(?:\\[(?:\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`[^`]*`|[^\\[\\]\\\\`])*?/,Qe=h(/^!?\\[(label)\\]\\(\\s*(href)(?:(?:[ \\t]*(?:\\n[ \\t]*)?)(title))?\\s*\\)/).replace(\"label\",q).replace(\"href\",/<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]*/).replace(\"title\",/\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/).getRegex(),he=h(/^!?\\[(label)\\]\\[(ref)\\]/).replace(\"label\",q).replace(\"ref\",Q).getRegex(),de=h(/^!?\\[(ref)\\](?:\\[\\])?/).replace(\"ref\",Q).getRegex(),Ue=h(\"reflink|nolink(?!\\\\()\",\"g\").replace(\"reflink\",he).replace(\"nolink\",de).getRegex(),X={_backpedal:E,anyPunctuation:He,autolink:Ne,blockSkip:Be,br:ae,code:ze,del:E,emStrongLDelim:qe,emStrongRDelimAst:De,emStrongRDelimUnd:Ge,escape:Me,link:Qe,nolink:de,punctuation:Ee,reflink:he,reflinkSearch:Ue,tag:Fe,text:Ae,url:E},Ke={...X,link:h(/^!?\\[(label)\\]\\((.*?)\\)/).replace(\"label\",q).getRegex(),reflink:h(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/).replace(\"label\",q).getRegex()},N={...X,emStrongRDelimAst:Ze,emStrongLDelim:ve,url:h(/^((?:ftp|https?):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/,\"i\").replace(\"email\",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,del:/^(~~?)(?=[^\\s~])((?:\\\\[\\s\\S]|[^\\\\])*?(?:\\\\[\\s\\S]|[^\\s~\\\\]))\\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|https?:\\/\\/|ftp:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/},We={...N,br:h(ae).replace(\"{2,}\",\"*\").getRegex(),text:h(N.text).replace(\"\\\\b_\",\"\\\\b_| {2,}\\\\n\").replace(/\\{2,\\}/g,\"*\").getRegex()},I={normal:K,gfm:_e,pedantic:Le},M={normal:X,gfm:N,breaks:We,pedantic:Ke};var Xe={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"},ke=l=>Xe[l];function w(l,e){if(e){if(m.escapeTest.test(l))return l.replace(m.escapeReplace,ke)}else if(m.escapeTestNoEncode.test(l))return l.replace(m.escapeReplaceNoEncode,ke);return l}function J(l){try{l=encodeURI(l).replace(m.percentDecode,\"%\")}catch{return null}return l}function V(l,e){let t=l.replace(m.findPipe,(i,s,o)=>{let a=!1,u=s;for(;--u>=0&&o[u]===\"\\\\\";)a=!a;return a?\"|\":\" |\"}),n=t.split(m.splitPipe),r=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),e)if(n.length>e)n.splice(e);else for(;n.length<e;)n.push(\"\");for(;r<n.length;r++)n[r]=n[r].trim().replace(m.slashPipe,\"|\");return n}function z(l,e,t){let n=l.length;if(n===0)return\"\";let r=0;for(;r<n;){let i=l.charAt(n-r-1);if(i===e&&!t)r++;else if(i!==e&&t)r++;else break}return l.slice(0,n-r)}function ge(l,e){if(l.indexOf(e[1])===-1)return-1;let t=0;for(let n=0;n<l.length;n++)if(l[n]===\"\\\\\")n++;else if(l[n]===e[0])t++;else if(l[n]===e[1]&&(t--,t<0))return n;return t>0?-2:-1}function fe(l,e,t,n,r){let i=e.href,s=e.title||null,o=l[1].replace(r.other.outputLinkReplace,\"$1\");n.state.inLink=!0;let a={type:l[0].charAt(0)===\"!\"?\"image\":\"link\",raw:t,href:i,title:s,text:o,tokens:n.inlineTokens(o)};return n.state.inLink=!1,a}function Je(l,e,t){let n=l.match(t.other.indentCodeCompensation);if(n===null)return e;let r=n[1];return e.split(`\n`).map(i=>{let s=i.match(t.other.beginningSpace);if(s===null)return i;let[o]=s;return o.length>=r.length?i.slice(r.length):i}).join(`\n`)}var y=class{options;rules;lexer;constructor(e){this.options=e||O}space(e){let t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:\"space\",raw:t[0]}}code(e){let t=this.rules.block.code.exec(e);if(t){let n=t[0].replace(this.rules.other.codeRemoveIndent,\"\");return{type:\"code\",raw:t[0],codeBlockStyle:\"indented\",text:this.options.pedantic?n:z(n,`\n`)}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let n=t[0],r=Je(n,t[3]||\"\",this.rules);return{type:\"code\",raw:n,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,\"$1\"):t[2],text:r}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let n=t[2].trim();if(this.rules.other.endingHash.test(n)){let r=z(n,\"#\");(this.options.pedantic||!r||this.rules.other.endingSpaceChar.test(r))&&(n=r.trim())}return{type:\"heading\",raw:t[0],depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(e){let t=this.rules.block.hr.exec(e);if(t)return{type:\"hr\",raw:z(t[0],`\n`)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let n=z(t[0],`\n`).split(`\n`),r=\"\",i=\"\",s=[];for(;n.length>0;){let o=!1,a=[],u;for(u=0;u<n.length;u++)if(this.rules.other.blockquoteStart.test(n[u]))a.push(n[u]),o=!0;else if(!o)a.push(n[u]);else break;n=n.slice(u);let p=a.join(`\n`),c=p.replace(this.rules.other.blockquoteSetextReplace,`\n    $1`).replace(this.rules.other.blockquoteSetextReplace2,\"\");r=r?`${r}\n${p}`:p,i=i?`${i}\n${c}`:c;let f=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(c,s,!0),this.lexer.state.top=f,n.length===0)break;let k=s.at(-1);if(k?.type===\"code\")break;if(k?.type===\"blockquote\"){let x=k,g=x.raw+`\n`+n.join(`\n`),T=this.blockquote(g);s[s.length-1]=T,r=r.substring(0,r.length-x.raw.length)+T.raw,i=i.substring(0,i.length-x.text.length)+T.text;break}else if(k?.type===\"list\"){let x=k,g=x.raw+`\n`+n.join(`\n`),T=this.list(g);s[s.length-1]=T,r=r.substring(0,r.length-k.raw.length)+T.raw,i=i.substring(0,i.length-x.raw.length)+T.raw,n=g.substring(s.at(-1).raw.length).split(`\n`);continue}}return{type:\"blockquote\",raw:r,tokens:s,text:i}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=t[1].trim(),r=n.length>1,i={type:\"list\",raw:\"\",ordered:r,start:r?+n.slice(0,-1):\"\",loose:!1,items:[]};n=r?`\\\\d{1,9}\\\\${n.slice(-1)}`:`\\\\${n}`,this.options.pedantic&&(n=r?n:\"[*+-]\");let s=this.rules.other.listItemRegex(n),o=!1;for(;e;){let u=!1,p=\"\",c=\"\";if(!(t=s.exec(e))||this.rules.block.hr.test(e))break;p=t[0],e=e.substring(p.length);let f=t[2].split(`\n`,1)[0].replace(this.rules.other.listReplaceTabs,Z=>\" \".repeat(3*Z.length)),k=e.split(`\n`,1)[0],x=!f.trim(),g=0;if(this.options.pedantic?(g=2,c=f.trimStart()):x?g=t[1].length+1:(g=t[2].search(this.rules.other.nonSpaceChar),g=g>4?1:g,c=f.slice(g),g+=t[1].length),x&&this.rules.other.blankLine.test(k)&&(p+=k+`\n`,e=e.substring(k.length+1),u=!0),!u){let Z=this.rules.other.nextBulletRegex(g),ee=this.rules.other.hrRegex(g),te=this.rules.other.fencesBeginRegex(g),ne=this.rules.other.headingBeginRegex(g),me=this.rules.other.htmlBeginRegex(g);for(;e;){let G=e.split(`\n`,1)[0],A;if(k=G,this.options.pedantic?(k=k.replace(this.rules.other.listReplaceNesting,\"  \"),A=k):A=k.replace(this.rules.other.tabCharGlobal,\"    \"),te.test(k)||ne.test(k)||me.test(k)||Z.test(k)||ee.test(k))break;if(A.search(this.rules.other.nonSpaceChar)>=g||!k.trim())c+=`\n`+A.slice(g);else{if(x||f.replace(this.rules.other.tabCharGlobal,\"    \").search(this.rules.other.nonSpaceChar)>=4||te.test(f)||ne.test(f)||ee.test(f))break;c+=`\n`+k}!x&&!k.trim()&&(x=!0),p+=G+`\n`,e=e.substring(G.length+1),f=A.slice(g)}}i.loose||(o?i.loose=!0:this.rules.other.doubleBlankLine.test(p)&&(o=!0));let T=null,Y;this.options.gfm&&(T=this.rules.other.listIsTask.exec(c),T&&(Y=T[0]!==\"[ ] \",c=c.replace(this.rules.other.listReplaceTask,\"\"))),i.items.push({type:\"list_item\",raw:p,task:!!T,checked:Y,loose:!1,text:c,tokens:[]}),i.raw+=p}let a=i.items.at(-1);if(a)a.raw=a.raw.trimEnd(),a.text=a.text.trimEnd();else return;i.raw=i.raw.trimEnd();for(let u=0;u<i.items.length;u++)if(this.lexer.state.top=!1,i.items[u].tokens=this.lexer.blockTokens(i.items[u].text,[]),!i.loose){let p=i.items[u].tokens.filter(f=>f.type===\"space\"),c=p.length>0&&p.some(f=>this.rules.other.anyLine.test(f.raw));i.loose=c}if(i.loose)for(let u=0;u<i.items.length;u++)i.items[u].loose=!0;return i}}html(e){let t=this.rules.block.html.exec(e);if(t)return{type:\"html\",block:!0,raw:t[0],pre:t[1]===\"pre\"||t[1]===\"script\"||t[1]===\"style\",text:t[0]}}def(e){let t=this.rules.block.def.exec(e);if(t){let n=t[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal,\" \"),r=t[2]?t[2].replace(this.rules.other.hrefBrackets,\"$1\").replace(this.rules.inline.anyPunctuation,\"$1\"):\"\",i=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,\"$1\"):t[3];return{type:\"def\",tag:n,raw:t[0],href:r,title:i}}}table(e){let t=this.rules.block.table.exec(e);if(!t||!this.rules.other.tableDelimiter.test(t[2]))return;let n=V(t[1]),r=t[2].replace(this.rules.other.tableAlignChars,\"\").split(\"|\"),i=t[3]?.trim()?t[3].replace(this.rules.other.tableRowBlankLine,\"\").split(`\n`):[],s={type:\"table\",raw:t[0],header:[],align:[],rows:[]};if(n.length===r.length){for(let o of r)this.rules.other.tableAlignRight.test(o)?s.align.push(\"right\"):this.rules.other.tableAlignCenter.test(o)?s.align.push(\"center\"):this.rules.other.tableAlignLeft.test(o)?s.align.push(\"left\"):s.align.push(null);for(let o=0;o<n.length;o++)s.header.push({text:n[o],tokens:this.lexer.inline(n[o]),header:!0,align:s.align[o]});for(let o of i)s.rows.push(V(o,s.header.length).map((a,u)=>({text:a,tokens:this.lexer.inline(a),header:!1,align:s.align[u]})));return s}}lheading(e){let t=this.rules.block.lheading.exec(e);if(t)return{type:\"heading\",raw:t[0],depth:t[2].charAt(0)===\"=\"?1:2,text:t[1],tokens:this.lexer.inline(t[1])}}paragraph(e){let t=this.rules.block.paragraph.exec(e);if(t){let n=t[1].charAt(t[1].length-1)===`\n`?t[1].slice(0,-1):t[1];return{type:\"paragraph\",raw:t[0],text:n,tokens:this.lexer.inline(n)}}}text(e){let t=this.rules.block.text.exec(e);if(t)return{type:\"text\",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){let t=this.rules.inline.escape.exec(e);if(t)return{type:\"escape\",raw:t[0],text:t[1]}}tag(e){let t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:\"html\",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){let t=this.rules.inline.link.exec(e);if(t){let n=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(n)){if(!this.rules.other.endAngleBracket.test(n))return;let s=z(n.slice(0,-1),\"\\\\\");if((n.length-s.length)%2===0)return}else{let s=ge(t[2],\"()\");if(s===-2)return;if(s>-1){let a=(t[0].indexOf(\"!\")===0?5:4)+t[1].length+s;t[2]=t[2].substring(0,s),t[0]=t[0].substring(0,a).trim(),t[3]=\"\"}}let r=t[2],i=\"\";if(this.options.pedantic){let s=this.rules.other.pedanticHrefTitle.exec(r);s&&(r=s[1],i=s[3])}else i=t[3]?t[3].slice(1,-1):\"\";return r=r.trim(),this.rules.other.startAngleBracket.test(r)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(n)?r=r.slice(1):r=r.slice(1,-1)),fe(t,{href:r&&r.replace(this.rules.inline.anyPunctuation,\"$1\"),title:i&&i.replace(this.rules.inline.anyPunctuation,\"$1\")},t[0],this.lexer,this.rules)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let r=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal,\" \"),i=t[r.toLowerCase()];if(!i){let s=n[0].charAt(0);return{type:\"text\",raw:s,text:s}}return fe(n,i,n[0],this.lexer,this.rules)}}emStrong(e,t,n=\"\"){let r=this.rules.inline.emStrongLDelim.exec(e);if(!r||r[3]&&n.match(this.rules.other.unicodeAlphaNumeric))return;if(!(r[1]||r[2]||\"\")||!n||this.rules.inline.punctuation.exec(n)){let s=[...r[0]].length-1,o,a,u=s,p=0,c=r[0][0]===\"*\"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(c.lastIndex=0,t=t.slice(-1*e.length+s);(r=c.exec(t))!=null;){if(o=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!o)continue;if(a=[...o].length,r[3]||r[4]){u+=a;continue}else if((r[5]||r[6])&&s%3&&!((s+a)%3)){p+=a;continue}if(u-=a,u>0)continue;a=Math.min(a,a+u+p);let f=[...r[0]][0].length,k=e.slice(0,s+r.index+f+a);if(Math.min(s,a)%2){let g=k.slice(1,-1);return{type:\"em\",raw:k,text:g,tokens:this.lexer.inlineTokens(g)}}let x=k.slice(2,-2);return{type:\"strong\",raw:k,text:x,tokens:this.lexer.inlineTokens(x)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let n=t[2].replace(this.rules.other.newLineCharGlobal,\" \"),r=this.rules.other.nonSpaceChar.test(n),i=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return r&&i&&(n=n.substring(1,n.length-1)),{type:\"codespan\",raw:t[0],text:n}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:\"br\",raw:t[0]}}del(e){let t=this.rules.inline.del.exec(e);if(t)return{type:\"del\",raw:t[0],text:t[2],tokens:this.lexer.inlineTokens(t[2])}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let n,r;return t[2]===\"@\"?(n=t[1],r=\"mailto:\"+n):(n=t[1],r=n),{type:\"link\",raw:t[0],text:n,href:r,tokens:[{type:\"text\",raw:n,text:n}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let n,r;if(t[2]===\"@\")n=t[0],r=\"mailto:\"+n;else{let i;do i=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??\"\";while(i!==t[0]);n=t[0],t[1]===\"www.\"?r=\"http://\"+t[0]:r=t[0]}return{type:\"link\",raw:t[0],text:n,href:r,tokens:[{type:\"text\",raw:n,text:n}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let n=this.lexer.state.inRawBlock;return{type:\"text\",raw:t[0],text:t[0],escaped:n}}}};var b=class l{tokens;options;state;tokenizer;inlineQueue;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||O,this.options.tokenizer=this.options.tokenizer||new y,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let t={other:m,block:I.normal,inline:M.normal};this.options.pedantic?(t.block=I.pedantic,t.inline=M.pedantic):this.options.gfm&&(t.block=I.gfm,this.options.breaks?t.inline=M.breaks:t.inline=M.gfm),this.tokenizer.rules=t}static get rules(){return{block:I,inline:M}}static lex(e,t){return new l(t).lex(e)}static lexInline(e,t){return new l(t).inlineTokens(e)}lex(e){e=e.replace(m.carriageReturn,`\n`),this.blockTokens(e,this.tokens);for(let t=0;t<this.inlineQueue.length;t++){let n=this.inlineQueue[t];this.inlineTokens(n.src,n.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,t=[],n=!1){for(this.options.pedantic&&(e=e.replace(m.tabCharGlobal,\"    \").replace(m.spaceLine,\"\"));e;){let r;if(this.options.extensions?.block?.some(s=>(r=s.call({lexer:this},e,t))?(e=e.substring(r.raw.length),t.push(r),!0):!1))continue;if(r=this.tokenizer.space(e)){e=e.substring(r.raw.length);let s=t.at(-1);r.raw.length===1&&s!==void 0?s.raw+=`\n`:t.push(r);continue}if(r=this.tokenizer.code(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type===\"paragraph\"||s?.type===\"text\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.text,this.inlineQueue.at(-1).src=s.text):t.push(r);continue}if(r=this.tokenizer.fences(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.heading(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.hr(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.blockquote(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.list(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.html(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.def(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type===\"paragraph\"||s?.type===\"text\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.raw,this.inlineQueue.at(-1).src=s.text):this.tokens.links[r.tag]||(this.tokens.links[r.tag]={href:r.href,title:r.title},t.push(r));continue}if(r=this.tokenizer.table(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.lheading(e)){e=e.substring(r.raw.length),t.push(r);continue}let i=e;if(this.options.extensions?.startBlock){let s=1/0,o=e.slice(1),a;this.options.extensions.startBlock.forEach(u=>{a=u.call({lexer:this},o),typeof a==\"number\"&&a>=0&&(s=Math.min(s,a))}),s<1/0&&s>=0&&(i=e.substring(0,s+1))}if(this.state.top&&(r=this.tokenizer.paragraph(i))){let s=t.at(-1);n&&s?.type===\"paragraph\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):t.push(r),n=i.length!==e.length,e=e.substring(r.raw.length);continue}if(r=this.tokenizer.text(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type===\"text\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):t.push(r);continue}if(e){let s=\"Infinite loop on byte: \"+e.charCodeAt(0);if(this.options.silent){console.error(s);break}else throw new Error(s)}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}inlineTokens(e,t=[]){let n=e,r=null;if(this.tokens.links){let o=Object.keys(this.tokens.links);if(o.length>0)for(;(r=this.tokenizer.rules.inline.reflinkSearch.exec(n))!=null;)o.includes(r[0].slice(r[0].lastIndexOf(\"[\")+1,-1))&&(n=n.slice(0,r.index)+\"[\"+\"a\".repeat(r[0].length-2)+\"]\"+n.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(r=this.tokenizer.rules.inline.anyPunctuation.exec(n))!=null;)n=n.slice(0,r.index)+\"++\"+n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);for(;(r=this.tokenizer.rules.inline.blockSkip.exec(n))!=null;)n=n.slice(0,r.index)+\"[\"+\"a\".repeat(r[0].length-2)+\"]\"+n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);let i=!1,s=\"\";for(;e;){i||(s=\"\"),i=!1;let o;if(this.options.extensions?.inline?.some(u=>(o=u.call({lexer:this},e,t))?(e=e.substring(o.raw.length),t.push(o),!0):!1))continue;if(o=this.tokenizer.escape(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.tag(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.link(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(o.raw.length);let u=t.at(-1);o.type===\"text\"&&u?.type===\"text\"?(u.raw+=o.raw,u.text+=o.text):t.push(o);continue}if(o=this.tokenizer.emStrong(e,n,s)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.codespan(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.br(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.del(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.autolink(e)){e=e.substring(o.raw.length),t.push(o);continue}if(!this.state.inLink&&(o=this.tokenizer.url(e))){e=e.substring(o.raw.length),t.push(o);continue}let a=e;if(this.options.extensions?.startInline){let u=1/0,p=e.slice(1),c;this.options.extensions.startInline.forEach(f=>{c=f.call({lexer:this},p),typeof c==\"number\"&&c>=0&&(u=Math.min(u,c))}),u<1/0&&u>=0&&(a=e.substring(0,u+1))}if(o=this.tokenizer.inlineText(a)){e=e.substring(o.raw.length),o.raw.slice(-1)!==\"_\"&&(s=o.raw.slice(-1)),i=!0;let u=t.at(-1);u?.type===\"text\"?(u.raw+=o.raw,u.text+=o.text):t.push(o);continue}if(e){let u=\"Infinite loop on byte: \"+e.charCodeAt(0);if(this.options.silent){console.error(u);break}else throw new Error(u)}}return t}};var P=class{options;parser;constructor(e){this.options=e||O}space(e){return\"\"}code({text:e,lang:t,escaped:n}){let r=(t||\"\").match(m.notSpaceStart)?.[0],i=e.replace(m.endingNewline,\"\")+`\n`;return r?'<pre><code class=\"language-'+w(r)+'\">'+(n?i:w(i,!0))+`</code></pre>\n`:\"<pre><code>\"+(n?i:w(i,!0))+`</code></pre>\n`}blockquote({tokens:e}){return`<blockquote>\n${this.parser.parse(e)}</blockquote>\n`}html({text:e}){return e}def(e){return\"\"}heading({tokens:e,depth:t}){return`<h${t}>${this.parser.parseInline(e)}</h${t}>\n`}hr(e){return`<hr>\n`}list(e){let t=e.ordered,n=e.start,r=\"\";for(let o=0;o<e.items.length;o++){let a=e.items[o];r+=this.listitem(a)}let i=t?\"ol\":\"ul\",s=t&&n!==1?' start=\"'+n+'\"':\"\";return\"<\"+i+s+`>\n`+r+\"</\"+i+`>\n`}listitem(e){let t=\"\";if(e.task){let n=this.checkbox({checked:!!e.checked});e.loose?e.tokens[0]?.type===\"paragraph\"?(e.tokens[0].text=n+\" \"+e.tokens[0].text,e.tokens[0].tokens&&e.tokens[0].tokens.length>0&&e.tokens[0].tokens[0].type===\"text\"&&(e.tokens[0].tokens[0].text=n+\" \"+w(e.tokens[0].tokens[0].text),e.tokens[0].tokens[0].escaped=!0)):e.tokens.unshift({type:\"text\",raw:n+\" \",text:n+\" \",escaped:!0}):t+=n+\" \"}return t+=this.parser.parse(e.tokens,!!e.loose),`<li>${t}</li>\n`}checkbox({checked:e}){return\"<input \"+(e?'checked=\"\" ':\"\")+'disabled=\"\" type=\"checkbox\">'}paragraph({tokens:e}){return`<p>${this.parser.parseInline(e)}</p>\n`}table(e){let t=\"\",n=\"\";for(let i=0;i<e.header.length;i++)n+=this.tablecell(e.header[i]);t+=this.tablerow({text:n});let r=\"\";for(let i=0;i<e.rows.length;i++){let s=e.rows[i];n=\"\";for(let o=0;o<s.length;o++)n+=this.tablecell(s[o]);r+=this.tablerow({text:n})}return r&&(r=`<tbody>${r}</tbody>`),`<table>\n<thead>\n`+t+`</thead>\n`+r+`</table>\n`}tablerow({text:e}){return`<tr>\n${e}</tr>\n`}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?\"th\":\"td\";return(e.align?`<${n} align=\"${e.align}\">`:`<${n}>`)+t+`</${n}>\n`}strong({tokens:e}){return`<strong>${this.parser.parseInline(e)}</strong>`}em({tokens:e}){return`<em>${this.parser.parseInline(e)}</em>`}codespan({text:e}){return`<code>${w(e,!0)}</code>`}br(e){return\"<br>\"}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,tokens:n}){let r=this.parser.parseInline(n),i=J(e);if(i===null)return r;e=i;let s='<a href=\"'+e+'\"';return t&&(s+=' title=\"'+w(t)+'\"'),s+=\">\"+r+\"</a>\",s}image({href:e,title:t,text:n,tokens:r}){r&&(n=this.parser.parseInline(r,this.parser.textRenderer));let i=J(e);if(i===null)return w(n);e=i;let s=`<img src=\"${e}\" alt=\"${n}\"`;return t&&(s+=` title=\"${w(t)}\"`),s+=\">\",s}text(e){return\"tokens\"in e&&e.tokens?this.parser.parseInline(e.tokens):\"escaped\"in e&&e.escaped?e.text:w(e.text)}};var S=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return\"\"+e}image({text:e}){return\"\"+e}br(){return\"\"}};var R=class l{options;renderer;textRenderer;constructor(e){this.options=e||O,this.options.renderer=this.options.renderer||new P,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new S}static parse(e,t){return new l(t).parse(e)}static parseInline(e,t){return new l(t).parseInline(e)}parse(e,t=!0){let n=\"\";for(let r=0;r<e.length;r++){let i=e[r];if(this.options.extensions?.renderers?.[i.type]){let o=i,a=this.options.extensions.renderers[o.type].call({parser:this},o);if(a!==!1||![\"space\",\"hr\",\"heading\",\"code\",\"table\",\"blockquote\",\"list\",\"html\",\"def\",\"paragraph\",\"text\"].includes(o.type)){n+=a||\"\";continue}}let s=i;switch(s.type){case\"space\":{n+=this.renderer.space(s);continue}case\"hr\":{n+=this.renderer.hr(s);continue}case\"heading\":{n+=this.renderer.heading(s);continue}case\"code\":{n+=this.renderer.code(s);continue}case\"table\":{n+=this.renderer.table(s);continue}case\"blockquote\":{n+=this.renderer.blockquote(s);continue}case\"list\":{n+=this.renderer.list(s);continue}case\"html\":{n+=this.renderer.html(s);continue}case\"def\":{n+=this.renderer.def(s);continue}case\"paragraph\":{n+=this.renderer.paragraph(s);continue}case\"text\":{let o=s,a=this.renderer.text(o);for(;r+1<e.length&&e[r+1].type===\"text\";)o=e[++r],a+=`\n`+this.renderer.text(o);t?n+=this.renderer.paragraph({type:\"paragraph\",raw:a,text:a,tokens:[{type:\"text\",raw:a,text:a,escaped:!0}]}):n+=a;continue}default:{let o='Token with \"'+s.type+'\" type was not found.';if(this.options.silent)return console.error(o),\"\";throw new Error(o)}}}return n}parseInline(e,t=this.renderer){let n=\"\";for(let r=0;r<e.length;r++){let i=e[r];if(this.options.extensions?.renderers?.[i.type]){let o=this.options.extensions.renderers[i.type].call({parser:this},i);if(o!==!1||![\"escape\",\"html\",\"link\",\"image\",\"strong\",\"em\",\"codespan\",\"br\",\"del\",\"text\"].includes(i.type)){n+=o||\"\";continue}}let s=i;switch(s.type){case\"escape\":{n+=t.text(s);break}case\"html\":{n+=t.html(s);break}case\"link\":{n+=t.link(s);break}case\"image\":{n+=t.image(s);break}case\"strong\":{n+=t.strong(s);break}case\"em\":{n+=t.em(s);break}case\"codespan\":{n+=t.codespan(s);break}case\"br\":{n+=t.br(s);break}case\"del\":{n+=t.del(s);break}case\"text\":{n+=t.text(s);break}default:{let o='Token with \"'+s.type+'\" type was not found.';if(this.options.silent)return console.error(o),\"\";throw new Error(o)}}}return n}};var $=class{options;block;constructor(e){this.options=e||O}static passThroughHooks=new Set([\"preprocess\",\"postprocess\",\"processAllTokens\"]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}provideLexer(){return this.block?b.lex:b.lexInline}provideParser(){return this.block?R.parse:R.parseInline}};var B=class{defaults=L();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=R;Renderer=P;TextRenderer=S;Lexer=b;Tokenizer=y;Hooks=$;constructor(...e){this.use(...e)}walkTokens(e,t){let n=[];for(let r of e)switch(n=n.concat(t.call(this,r)),r.type){case\"table\":{let i=r;for(let s of i.header)n=n.concat(this.walkTokens(s.tokens,t));for(let s of i.rows)for(let o of s)n=n.concat(this.walkTokens(o.tokens,t));break}case\"list\":{let i=r;n=n.concat(this.walkTokens(i.items,t));break}default:{let i=r;this.defaults.extensions?.childTokens?.[i.type]?this.defaults.extensions.childTokens[i.type].forEach(s=>{let o=i[s].flat(1/0);n=n.concat(this.walkTokens(o,t))}):i.tokens&&(n=n.concat(this.walkTokens(i.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(n=>{let r={...n};if(r.async=this.defaults.async||r.async||!1,n.extensions&&(n.extensions.forEach(i=>{if(!i.name)throw new Error(\"extension name required\");if(\"renderer\"in i){let s=t.renderers[i.name];s?t.renderers[i.name]=function(...o){let a=i.renderer.apply(this,o);return a===!1&&(a=s.apply(this,o)),a}:t.renderers[i.name]=i.renderer}if(\"tokenizer\"in i){if(!i.level||i.level!==\"block\"&&i.level!==\"inline\")throw new Error(\"extension level must be 'block' or 'inline'\");let s=t[i.level];s?s.unshift(i.tokenizer):t[i.level]=[i.tokenizer],i.start&&(i.level===\"block\"?t.startBlock?t.startBlock.push(i.start):t.startBlock=[i.start]:i.level===\"inline\"&&(t.startInline?t.startInline.push(i.start):t.startInline=[i.start]))}\"childTokens\"in i&&i.childTokens&&(t.childTokens[i.name]=i.childTokens)}),r.extensions=t),n.renderer){let i=this.defaults.renderer||new P(this.defaults);for(let s in n.renderer){if(!(s in i))throw new Error(`renderer '${s}' does not exist`);if([\"options\",\"parser\"].includes(s))continue;let o=s,a=n.renderer[o],u=i[o];i[o]=(...p)=>{let c=a.apply(i,p);return c===!1&&(c=u.apply(i,p)),c||\"\"}}r.renderer=i}if(n.tokenizer){let i=this.defaults.tokenizer||new y(this.defaults);for(let s in n.tokenizer){if(!(s in i))throw new Error(`tokenizer '${s}' does not exist`);if([\"options\",\"rules\",\"lexer\"].includes(s))continue;let o=s,a=n.tokenizer[o],u=i[o];i[o]=(...p)=>{let c=a.apply(i,p);return c===!1&&(c=u.apply(i,p)),c}}r.tokenizer=i}if(n.hooks){let i=this.defaults.hooks||new $;for(let s in n.hooks){if(!(s in i))throw new Error(`hook '${s}' does not exist`);if([\"options\",\"block\"].includes(s))continue;let o=s,a=n.hooks[o],u=i[o];$.passThroughHooks.has(s)?i[o]=p=>{if(this.defaults.async)return Promise.resolve(a.call(i,p)).then(f=>u.call(i,f));let c=a.call(i,p);return u.call(i,c)}:i[o]=(...p)=>{let c=a.apply(i,p);return c===!1&&(c=u.apply(i,p)),c}}r.hooks=i}if(n.walkTokens){let i=this.defaults.walkTokens,s=n.walkTokens;r.walkTokens=function(o){let a=[];return a.push(s.call(this,o)),i&&(a=a.concat(i.call(this,o))),a}}this.defaults={...this.defaults,...r}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return b.lex(e,t??this.defaults)}parser(e,t){return R.parse(e,t??this.defaults)}parseMarkdown(e){return(n,r)=>{let i={...r},s={...this.defaults,...i},o=this.onError(!!s.silent,!!s.async);if(this.defaults.async===!0&&i.async===!1)return o(new Error(\"marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.\"));if(typeof n>\"u\"||n===null)return o(new Error(\"marked(): input parameter is undefined or null\"));if(typeof n!=\"string\")return o(new Error(\"marked(): input parameter is of type \"+Object.prototype.toString.call(n)+\", string expected\"));s.hooks&&(s.hooks.options=s,s.hooks.block=e);let a=s.hooks?s.hooks.provideLexer():e?b.lex:b.lexInline,u=s.hooks?s.hooks.provideParser():e?R.parse:R.parseInline;if(s.async)return Promise.resolve(s.hooks?s.hooks.preprocess(n):n).then(p=>a(p,s)).then(p=>s.hooks?s.hooks.processAllTokens(p):p).then(p=>s.walkTokens?Promise.all(this.walkTokens(p,s.walkTokens)).then(()=>p):p).then(p=>u(p,s)).then(p=>s.hooks?s.hooks.postprocess(p):p).catch(o);try{s.hooks&&(n=s.hooks.preprocess(n));let p=a(n,s);s.hooks&&(p=s.hooks.processAllTokens(p)),s.walkTokens&&this.walkTokens(p,s.walkTokens);let c=u(p,s);return s.hooks&&(c=s.hooks.postprocess(c)),c}catch(p){return o(p)}}}onError(e,t){return n=>{if(n.message+=`\nPlease report this to https://github.com/markedjs/marked.`,e){let r=\"<p>An error occurred:</p><pre>\"+w(n.message+\"\",!0)+\"</pre>\";return t?Promise.resolve(r):r}if(t)return Promise.reject(n);throw n}}};var _=new B;function d(l,e){return _.parse(l,e)}d.options=d.setOptions=function(l){return _.setOptions(l),d.defaults=_.defaults,H(d.defaults),d};d.getDefaults=L;d.defaults=O;d.use=function(...l){return _.use(...l),d.defaults=_.defaults,H(d.defaults),d};d.walkTokens=function(l,e){return _.walkTokens(l,e)};d.parseInline=_.parseInline;d.Parser=R;d.parser=R.parse;d.Renderer=P;d.TextRenderer=S;d.Lexer=b;d.lexer=b.lex;d.Tokenizer=y;d.Hooks=$;d.parse=d;var Dt=d.options,Zt=d.setOptions,Gt=d.use,Ht=d.walkTokens,Nt=d.parseInline,jt=d,Ft=R.parse,Qt=b.lex;export{$ as Hooks,b as Lexer,B as Marked,R as Parser,P as Renderer,S as TextRenderer,y as Tokenizer,O as defaults,L as getDefaults,Qt as lexer,d as marked,Dt as options,jt as parse,Nt as parseInline,Ft as parser,Zt as setOptions,Gt as use,Ht as walkTokens};\n//# sourceMappingURL=marked.esm.js.map\n","import { marked } from \"marked\";\r\n\r\n/**\r\n * Aptolix Message Formatter\r\n * Standalone utility to render messages with consistent Aptolix formatting\r\n * Use this in any project to maintain the same message markup/format\r\n */\r\n\r\n/**\r\n * Format messages to HTML with Aptolix styling\r\n * @param {Array} messages - Array of {type: 'user'|'bot', text: string, timestamp: number, rating?: number}\r\n * @param {Object} options - Configuration options\r\n * @param {boolean} options.showExactTime - Show exact time instead of relative (e.g., \"2:30 PM\" vs \"5 mins ago\")\r\n * @returns {string} HTML string with formatted messages\r\n */\r\nexport function formatMessages(messages, options = {}) {\r\n    const {\r\n        botname = 'AI Assistant',\r\n        username = 'You',\r\n        botaccentColor = '#4a57e2ff',\r\n        botAvatar = getDefaultBotAvatar(),\r\n        userAvatar = getDefaultUserAvatar(),\r\n        showExactTime = false\r\n    } = options;\r\n\r\n    // Calculate colors based on accent\r\n    const isLight = isLightColor(botaccentColor);\r\n    const userMessageBg = botaccentColor;\r\n    const userMessageText = isLight ? '#1f2937' : '#ffffff';\r\n    const botMessageBg = lightenColor(botaccentColor, 0.85);\r\n    const botMessageText = '#4b5563';\r\n\r\n    const messagesHTML = messages.map(msg => {\r\n        const isUser = msg.type === 'user';\r\n        const avatarHTML = isUser ? userAvatar : botAvatar;\r\n        const senderName = isUser ? username : botname;\r\n        const messageBg = isUser ? userMessageBg : botMessageBg;\r\n        const messageTextColor = isUser ? userMessageText : botMessageText;\r\n        \r\n        // Parse markdown for bot messages (full markdown support for lists, paragraphs, etc.)\r\n        const messageContent = msg.type === 'bot' ? marked.parse(msg.text || '') : (msg.text || '');\r\n        const timeStr = showExactTime ? formatExactTime(msg.timestamp) : formatRelativeTime(msg.timestamp);\r\n\r\n        let messageHTML = `\r\n            <div class=\"message ${msg.type}\">\r\n                <div class=\"message-avatar\">\r\n                    ${avatarHTML}\r\n                    <div class=\"message-sender\">${senderName}</div>\r\n                </div>\r\n                <div class=\"message-content\">\r\n                    <div class=\"message-text\" style=\"background-color: ${messageBg}; color: ${messageTextColor};\">\r\n                        ${messageContent}\r\n                    </div>\r\n                    <span class=\"message-timestamp\" data-timestamp=\"${msg.timestamp}\">${timeStr}</span>\r\n                    ${msg.rating && msg.rating > 0 ? `\r\n                    <div class=\"message-rating\">\r\n                        <span class=\"rating-stars\">${'★'.repeat(msg.rating)}${'☆'.repeat(5 - msg.rating)}</span>\r\n                    </div>\r\n                    ` : ''}\r\n                </div>\r\n            </div>\r\n        `;\r\n\r\n        return messageHTML;\r\n    }).join('');\r\n    \r\n    return `<div class=\"aptolix-messages-wrapper\">${messagesHTML}</div>`;\r\n}\r\n\r\n// Helper functions\r\nfunction formatRelativeTime(timestamp) {\r\n    const now = Date.now();\r\n    const diff = Math.floor((now - timestamp) / 1000);\r\n    \r\n    if (diff < 10) return 'just now';\r\n    if (diff < 60) return `${diff} secs ago`;\r\n    if (diff < 3600) {\r\n        const mins = Math.floor(diff / 60);\r\n        return mins === 1 ? '1 min ago' : `${mins} mins ago`;\r\n    }\r\n    if (diff < 86400) {\r\n        const hours = Math.floor(diff / 3600);\r\n        return hours === 1 ? '1 hour ago' : `${hours} hours ago`;\r\n    }\r\n    const days = Math.floor(diff / 86400);\r\n    return days === 1 ? '1 day ago' : `${days} days ago`;\r\n}\r\n\r\nfunction formatExactTime(timestamp) {\r\n    const date = new Date(timestamp);\r\n    const now = new Date();\r\n    \r\n    // Check if it's today\r\n    const isToday = date.toDateString() === now.toDateString();\r\n    \r\n    // Check if it's yesterday\r\n    const yesterday = new Date(now);\r\n    yesterday.setDate(yesterday.getDate() - 1);\r\n    const isYesterday = date.toDateString() === yesterday.toDateString();\r\n    \r\n    // Format time as HH:MM AM/PM\r\n    const timeStr = date.toLocaleTimeString('en-US', { \r\n        hour: 'numeric', \r\n        minute: '2-digit',\r\n        hour12: true \r\n    });\r\n    \r\n    if (isToday) {\r\n        return `Today at ${timeStr}`;\r\n    } else if (isYesterday) {\r\n        return `Yesterday at ${timeStr}`;\r\n    } else {\r\n        // Format as \"MMM DD, YYYY at HH:MM AM/PM\"\r\n        const dateStr = date.toLocaleDateString('en-US', { \r\n            month: 'short', \r\n            day: 'numeric',\r\n            year: 'numeric'\r\n        });\r\n        return `${dateStr} at ${timeStr}`;\r\n    }\r\n}\r\n\r\nfunction isLightColor(color) {\r\n    const hexToRgb = (hex) => {\r\n        const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})?$/i.exec(hex);\r\n        return result ? {\r\n            r: parseInt(result[1], 16),\r\n            g: parseInt(result[2], 16),\r\n            b: parseInt(result[3], 16)\r\n        } : null;\r\n    };\r\n    \r\n    let r, g, b;\r\n    if (color.startsWith('#')) {\r\n        const rgb = hexToRgb(color);\r\n        if (!rgb) return false;\r\n        r = rgb.r; g = rgb.g; b = rgb.b;\r\n    } else if (color.startsWith('rgb')) {\r\n        const match = color.match(/\\d+/g);\r\n        [r, g, b] = match.map(Number);\r\n    } else {\r\n        return false;\r\n    }\r\n    \r\n    return (0.299 * r + 0.587 * g + 0.114 * b) / 255 > 0.5;\r\n}\r\n\r\nfunction lightenColor(color, percent) {\r\n    const hexToRgb = (hex) => {\r\n        const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})?$/i.exec(hex);\r\n        return result ? {\r\n            r: parseInt(result[1], 16),\r\n            g: parseInt(result[2], 16),\r\n            b: parseInt(result[3], 16)\r\n        } : null;\r\n    };\r\n    \r\n    const rgb = hexToRgb(color);\r\n    if (!rgb) return color;\r\n    \r\n    const r = Math.min(255, Math.round(rgb.r + (255 - rgb.r) * percent));\r\n    const g = Math.min(255, Math.round(rgb.g + (255 - rgb.g) * percent));\r\n    const b = Math.min(255, Math.round(rgb.b + (255 - rgb.b) * percent));\r\n    \r\n    return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\r\n}\r\n\r\nfunction getDefaultBotAvatar() {\r\n    return `<svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n        <circle cx=\"20\" cy=\"20\" r=\"18\" fill=\"#9333ea\"/>\r\n        <rect x=\"12\" y=\"14\" width=\"6\" height=\"6\" rx=\"1\" fill=\"#fff\"/>\r\n        <rect x=\"22\" y=\"14\" width=\"6\" height=\"6\" rx=\"1\" fill=\"#fff\"/>\r\n        <rect x=\"13\" y=\"26\" width=\"14\" height=\"4\" rx=\"2\" fill=\"#fff\"/>\r\n    </svg>`;\r\n}\r\n\r\nfunction getDefaultUserAvatar() {\r\n    return `<svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n        <circle cx=\"20\" cy=\"20\" r=\"20\" fill=\"#64748b\"/>\r\n        <circle cx=\"20\" cy=\"15\" r=\"6\" fill=\"#fff\"/>\r\n        <path d=\"M 8 35 Q 8 25 20 25 Q 32 25 32 35\" fill=\"#fff\"/>\r\n    </svg>`;\r\n}\r\n\r\nexport default formatMessages;\r\n","/**\r\n * Aptolix Chatbot - iframe Manager (Bubble Mode)\r\n * \r\n * This file manages the iframe for bubble mode.\r\n * It creates the bubble, hint, and iframe elements in the parent page,\r\n * handles postMessage communication with the iframe content,\r\n * and manages API requests.\r\n */\r\n\r\n// Message types for parent-iframe communication\r\nconst MESSAGE_TYPES = {\r\n    // Parent → iframe\r\n    INIT: 'APTOLIX_INIT',\r\n    SHOW: 'APTOLIX_SHOW',\r\n    HIDE: 'APTOLIX_HIDE',\r\n    \r\n    // iframe → Parent\r\n    READY: 'APTOLIX_READY',\r\n    HEIGHT_CHANGE: 'APTOLIX_HEIGHT_CHANGE',\r\n    CLOSE_REQUESTED: 'APTOLIX_CLOSE_REQUESTED'\r\n};\r\n\r\n/**\r\n * Create and manage bubble mode chatbot with iframe\r\n */\r\nexport async function createBubbleModeWithIframe(config, apiHost) {\r\n    const chatbotId = config.chatbotId;\r\n    let iframe = null;\r\n    let bubble = null;\r\n    let hintBubble = null;\r\n    let isIframeReady = false;\r\n    let isManualSizeControl = false; // Track if size is manually controlled via expand/collapse\r\n    \r\n    // Create bubble button\r\n    bubble = document.createElement('div');\r\n    bubble.id = `bubble-${chatbotId}`;\r\n    bubble.className = \"aptolix-chat-bubble\";\r\n    bubble.setAttribute('data-chatbot-id', chatbotId);\r\n    bubble.style.backgroundColor = config.botaccentColor;\r\n    \r\n    // Render widget icon (SVG or text/emoji)\r\n    const iconValue = typeof config.widgetIcon === 'string' ? config.widgetIcon : '';\r\n    if (iconValue && (iconValue.includes('<svg') || (iconValue.includes('<') && iconValue.includes('>')))) {\r\n        bubble.innerHTML = iconValue;\r\n    } else if (iconValue) {\r\n        bubble.innerText = iconValue;\r\n    }\r\n    \r\n    document.body.appendChild(bubble);\r\n\r\n    const welcomeMessage = typeof config.floatingWelcomeMessage === 'string'\r\n        ? config.floatingWelcomeMessage.trim()\r\n        : '';\r\n    let hintBubbleTimeout;\r\n\r\n    if (welcomeMessage) {\r\n        hintBubble = document.createElement('div');\r\n        hintBubble.id = `hint-${chatbotId}`;\r\n        hintBubble.className = \"aptolix-hint-bubble\";\r\n        hintBubble.setAttribute('data-chatbot-id', chatbotId);\r\n        hintBubble.style.display = \"none\";\r\n        hintBubble.style.position = \"fixed\";\r\n        hintBubble.style.right = \"40px\";\r\n        hintBubble.style.bottom = \"110px\";\r\n        hintBubble.style.zIndex = \"9999\";\r\n\r\n        const hintTextSpan = document.createElement('span');\r\n        hintTextSpan.textContent = welcomeMessage;\r\n\r\n        const hintCloseBtn = document.createElement('button');\r\n        hintCloseBtn.id = \"aptolix-hint-close\";\r\n        hintCloseBtn.title = \"Close\";\r\n        hintCloseBtn.setAttribute(\"aria-label\", \"Close\");\r\n        hintCloseBtn.innerHTML = \"&#10005;\";\r\n        hintCloseBtn.style.background = \"none\";\r\n        hintCloseBtn.style.border = \"none\";\r\n        hintCloseBtn.style.color = config.botaccentColor;\r\n        hintCloseBtn.style.fontSize = \"1.3em\";\r\n        hintCloseBtn.style.position = \"absolute\";\r\n        hintCloseBtn.style.top = \"8px\";\r\n        hintCloseBtn.style.right = \"12px\";\r\n        hintCloseBtn.style.cursor = \"pointer\";\r\n        hintCloseBtn.style.padding = \"0\";\r\n\r\n        hintCloseBtn.addEventListener(\"click\", () => {\r\n            hintBubble.style.display = \"none\";\r\n            sessionStorage.setItem(\"aptolixHintClosed\", \"true\");\r\n            clearTimeout(hintBubbleTimeout);\r\n        });\r\n\r\n        hintBubble.appendChild(hintTextSpan);\r\n        hintBubble.appendChild(hintCloseBtn);\r\n        document.body.appendChild(hintBubble);\r\n\r\n        hintBubbleTimeout = setTimeout(() => {\r\n            if (iframe && iframe.style.display === \"none\" && !sessionStorage.getItem(\"aptolixHintClosed\")) {\r\n                hintBubble.style.display = \"block\";\r\n            }\r\n        }, (Number(config.floatingWelcomeDelay) || 0) * 1000);\r\n    }\r\n    \r\n    // Create iframe container\r\n    iframe = document.createElement('iframe');\r\n    iframe.id = `iframe-${chatbotId}`;\r\n    iframe.className = \"aptolix-chat-iframe\";\r\n    iframe.setAttribute('data-chatbot-id', chatbotId);\r\n    \r\n    // Check if mobile\r\n    const isMobile = window.innerWidth <= 768;\r\n\r\n    // Size from the visible viewport (innerHeight/innerWidth), not 100vh/min().\r\n    // CSS min-height used to beat max-height and push the header off-screen.\r\n    const applyDefaultIframeSize = (frame, mobile) => {\r\n        const bottom = mobile ? 80 : 100;\r\n        const right = mobile ? 16 : 32;\r\n        const availableHeight = Math.max(window.innerHeight - bottom - 16, 0);\r\n        const availableWidth = Math.max(window.innerWidth - right * 2, 0);\r\n        frame.style.bottom = `${bottom}px`;\r\n        frame.style.right = `${right}px`;\r\n        frame.style.width = `${mobile ? availableWidth : Math.min(500, availableWidth)}px`;\r\n        frame.style.maxWidth = `${availableWidth}px`;\r\n        frame.style.height = `${mobile ? availableHeight : Math.min(650, availableHeight)}px`;\r\n        frame.style.maxHeight = `${availableHeight}px`;\r\n        frame.style.minHeight = `${Math.min(mobile ? 400 : 450, availableHeight)}px`;\r\n    };\r\n    \r\n    iframe.style.cssText = `\r\n        position: fixed;\r\n        border: none;\r\n        border-radius: 16px;\r\n        box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);\r\n        z-index: 9998;\r\n        display: none;\r\n        background: white;\r\n        transition: opacity 0.3s ease, transform 0.3s ease;\r\n    `;\r\n    applyDefaultIframeSize(iframe, isMobile);\r\n    \r\n    // Update iframe size on window resize\r\n    let resizeTimeout;\r\n    window.addEventListener('resize', () => {\r\n        clearTimeout(resizeTimeout);\r\n        resizeTimeout = setTimeout(() => {\r\n            // Keep an expanded window at its chosen size\r\n            if (isManualSizeControl) return;\r\n            applyDefaultIframeSize(iframe, window.innerWidth <= 768);\r\n        }, 100);\r\n    });\r\n    \r\n    // Get the correct chatbot-core URL\r\n    // In production, this should be the path to the built chatbot-core.mjs\r\n    const scriptUrl = new URL(import.meta.url);\r\n    const baseUrl = scriptUrl.origin + scriptUrl.pathname.substring(0, scriptUrl.pathname.lastIndexOf('/'));\r\n    const chatbotCoreUrl = baseUrl + '/chatbot-core.mjs';\r\n    \r\n    // Detect if parent is localhost (for LOCAL badge in iframe)\r\n    const parentHostname = window.location.hostname;\r\n    \r\n    // Create iframe content HTML that loads the iframe bundle\r\n    const iframeHTML = `\r\n        <!DOCTYPE html>\r\n        <html lang=\"en\">\r\n        <head>\r\n            <meta charset=\"UTF-8\">\r\n            <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n            <title>Aptolix Chat</title>\r\n            <style>\r\n                * {\r\n                    margin: 0;\r\n                    padding: 0;\r\n                    box-sizing: border-box;\r\n                }\r\n                body {\r\n                    margin: 0;\r\n                    padding: 0;\r\n                    overflow: hidden;\r\n                    font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\r\n                }\r\n            </style>\r\n        </head>\r\n        <body>\r\n            <script>\r\n                // Store parent hostname for LOCAL badge detection\r\n                window.__parentHostname__ = ${JSON.stringify(parentHostname)};\r\n            </script>\r\n            <script type=\"module\" src=\"${chatbotCoreUrl}\"></script>\r\n        </body>\r\n        </html>\r\n    `;\r\n    \r\n    // Write iframe content\r\n    iframe.srcdoc = iframeHTML;\r\n    document.body.appendChild(iframe);\r\n    \r\n    // Setup message listener for iframe communication\r\n    const messageHandler = async (event) => {\r\n        // Verify message is from our iframe\r\n        if (event.source !== iframe.contentWindow) return;\r\n        if (!event.data || event.data.source !== 'aptolix-chatbot-iframe') return;\r\n        \r\n        const { type, payload } = event.data;\r\n        \r\n        switch (type) {\r\n            case MESSAGE_TYPES.READY:\r\n                isIframeReady = true;\r\n                // Send initialization config to iframe\r\n                sendToIframe(MESSAGE_TYPES.INIT, {\r\n                    ...config,\r\n                    apiHost,\r\n                    chatbotId,\r\n                    conversationId: `${chatbotId}-${Date.now()}`\r\n                });\r\n                break;\r\n                \r\n            case 'APTOLIX_EXPAND_TOGGLE':\r\n                // Handle expand/collapse toggle\r\n                // Track manual size control based on requested expanded state\r\n                isManualSizeControl = !!payload.isExpanded;\r\n                const isMobileExpand = window.innerWidth <= 768;\r\n                \r\n                if (payload.isExpanded) {\r\n                    const bottom = isMobileExpand ? 70 : 100;\r\n                    const right = isMobileExpand ? 8 : 32;\r\n                    const availableHeight = Math.max(window.innerHeight - bottom - 16, 0);\r\n                    const availableWidth = Math.max(window.innerWidth - right * 2, 0);\r\n                    iframe.style.bottom = `${bottom}px`;\r\n                    iframe.style.right = `${right}px`;\r\n                    iframe.style.width = `${isMobileExpand ? availableWidth : Math.min(900, availableWidth)}px`;\r\n                    iframe.style.maxWidth = `${isMobileExpand ? availableWidth : Math.min(900, availableWidth)}px`;\r\n                    iframe.style.height = `${availableHeight}px`;\r\n                    iframe.style.maxHeight = `${availableHeight}px`;\r\n                    iframe.style.minHeight = `${availableHeight}px`;\r\n                } else {\r\n                    // Restore to normal size based on device\r\n                    applyDefaultIframeSize(iframe, isMobileExpand);\r\n                }\r\n                break;\r\n                \r\n            case MESSAGE_TYPES.CLOSE_REQUESTED:\r\n                // Hide iframe when close is clicked\r\n                iframe.style.display = 'none';\r\n                break;\r\n        }\r\n    };\r\n    \r\n    window.addEventListener('message', messageHandler);\r\n    \r\n    // Function to send messages to iframe\r\n    function sendToIframe(type, payload = {}) {\r\n        if (!iframe || !iframe.contentWindow) return;\r\n        \r\n        iframe.contentWindow.postMessage({\r\n            type,\r\n            payload\r\n        }, '*');\r\n    }\r\n    \r\n    // Bubble click handler - show iframe\r\n    bubble.addEventListener('click', () => {\r\n        if (iframe.style.display === 'none') {\r\n            iframe.style.display = 'block';\r\n            if (hintBubble) hintBubble.style.display = 'none';\r\n            clearTimeout(hintBubbleTimeout);\r\n            \r\n            // Send show message to iframe\r\n            sendToIframe(MESSAGE_TYPES.SHOW);\r\n        } else {\r\n            iframe.style.display = 'none';\r\n        }\r\n    });\r\n    \r\n    // Hide hint when iframe is shown\r\n    const hideHintOnShow = () => {\r\n        if (iframe.style.display === 'block' && hintBubble) {\r\n            hintBubble.style.display = 'none';\r\n            clearTimeout(hintBubbleTimeout);\r\n        }\r\n    };\r\n    \r\n    // Observe iframe display changes\r\n    const observer = new MutationObserver(hideHintOnShow);\r\n    observer.observe(iframe, { attributes: true, attributeFilter: ['style'] });\r\n    \r\n    // Return instance details for cleanup\r\n    return {\r\n        bubbleId: bubble.id,\r\n        hintBubbleId: hintBubble?.id || null,\r\n        iframeId: iframe.id,\r\n        destroy: () => {\r\n            window.removeEventListener('message', messageHandler);\r\n            observer.disconnect();\r\n            if (bubble) bubble.remove();\r\n            if (hintBubble) hintBubble.remove();\r\n            if (iframe) iframe.remove();\r\n            clearTimeout(hintBubbleTimeout);\r\n        }\r\n    };\r\n}\r\n","/**\r\n * ========================================================================\r\n * CENTRALIZED COLOR THEME GENERATOR\r\n * ========================================================================\r\n * This function generates a complete, consistent color palette based on\r\n * the primary accent color. All UI elements derive their colors from this\r\n * central theme to ensure visual harmony and easy debugging.\r\n * \r\n * HOW IT WORKS:\r\n * 1. Analyzes the primary color to determine if it's light or dark\r\n * 2. Generates complementary colors using lightening/darkening algorithms\r\n * 3. Creates high-contrast text colors based on background lightness\r\n * 4. Returns a structured theme object with colors for all UI elements\r\n * \r\n * THEME STRUCTURE:\r\n * - primary: The base accent color\r\n * - header: { background, text, button, border }\r\n * - messages: { userBackground, userText, botBackground, botText, link, timestamp }\r\n * - window: { background, border, shadow }\r\n * - input: { background, border, text, placeholder, buttonBackground, buttonText }\r\n * - footer: { text, link }\r\n * - bubble: { background, icon }\r\n * - hint: { background, text, border, closeButton }\r\n * - menu: { background, text, hover, border }\r\n * - rating: { star, text }\r\n * - utils: Helper functions for color manipulation\r\n * \r\n * DEBUGGING:\r\n * To debug color issues, log the entire theme object:\r\n * console.log('Theme:', theme);\r\n * \r\n * To adjust a specific color, modify the percentage in lightenColor/darkenColor calls\r\n * Example: lightenColor(primaryColor, 0.85) -> 85% lighter\r\n * \r\n * @param {string} primaryColor - The base accent color (hex format, e.g., '#4A90E2')\r\n * @returns {object} Complete color theme with all UI element colors\r\n */\r\nexport function generateTheme(primaryColor) {\r\n    // ===== Color Utility Functions =====\r\n    \r\n    // Convert hex to RGB (handles both 6 and 8 character hex codes)\r\n    const hexToRgb = (hex) => {\r\n        // Remove # if present and handle 8-char hex (with alpha)\r\n        const cleanHex = hex.replace('#', '').substring(0, 6);\r\n        const result = /^([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(cleanHex);\r\n        return result ? {\r\n            r: parseInt(result[1], 16),\r\n            g: parseInt(result[2], 16),\r\n            b: parseInt(result[3], 16)\r\n        } : null;\r\n    };\r\n    \r\n    // Determine if a color is light or dark (based on relative luminance)\r\n    const isLightColor = (color) => {\r\n        let r, g, b;\r\n        if (color.startsWith('#')) {\r\n            const rgb = hexToRgb(color);\r\n            if (!rgb) return false;\r\n            r = rgb.r;\r\n            g = rgb.g;\r\n            b = rgb.b;\r\n        } else if (color.startsWith('rgb')) {\r\n            const match = color.match(/\\d+/g);\r\n            [r, g, b] = match.map(Number);\r\n        } else {\r\n            return false;\r\n        }\r\n        \r\n        // Calculate relative luminance (perception-based)\r\n        const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\r\n        return luminance > 0.5;\r\n    };\r\n    \r\n    // Lighten a color by a percentage (0-1)\r\n    const lightenColor = (color, percent) => {\r\n        const rgb = hexToRgb(color);\r\n        if (!rgb) return color;\r\n        \r\n        const r = Math.min(255, Math.round(rgb.r + (255 - rgb.r) * percent));\r\n        const g = Math.min(255, Math.round(rgb.g + (255 - rgb.g) * percent));\r\n        const b = Math.min(255, Math.round(rgb.b + (255 - rgb.b) * percent));\r\n        \r\n        return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\r\n    };\r\n    \r\n    // Darken a color by a percentage (0-1)\r\n    const darkenColor = (color, percent) => {\r\n        const rgb = hexToRgb(color);\r\n        if (!rgb) return color;\r\n        \r\n        const r = Math.max(0, Math.round(rgb.r * (1 - percent)));\r\n        const g = Math.max(0, Math.round(rgb.g * (1 - percent)));\r\n        const b = Math.max(0, Math.round(rgb.b * (1 - percent)));\r\n        \r\n        return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\r\n    };\r\n    \r\n    // Add alpha transparency to a color\r\n    const addAlpha = (color, opacity) => {\r\n        const rgb = hexToRgb(color);\r\n        if (!rgb) return color;\r\n        return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${opacity})`;\r\n    };\r\n    \r\n    // ===== Theme Generation =====\r\n    \r\n    const isAccentLight = isLightColor(primaryColor);\r\n    \r\n    return {\r\n        // Primary color\r\n        primary: primaryColor,\r\n        \r\n        // Contrast detection\r\n        isLight: isAccentLight,\r\n        \r\n        // Header colors\r\n        header: {\r\n            background: primaryColor,\r\n            text: isAccentLight ? '#1f2937' : '#ffffff',\r\n            // Light accents already use a muted title — keep subtitle at full title color.\r\n            // Bright white titles can take a slight fade without losing the pair.\r\n            subtitle: isAccentLight ? '#1f2937' : addAlpha('#ffffff', 0.9),\r\n            button: isAccentLight ? '#374151' : '#ffffff',\r\n            border: lightenColor(primaryColor, 0.85)\r\n        },\r\n        \r\n        // Message colors\r\n        messages: {\r\n            userBackground: primaryColor,\r\n            userText: isAccentLight ? '#1f2937' : '#ffffff',\r\n            botBackground: lightenColor(primaryColor, 0.85),\r\n            botText: '#4b5563',\r\n            link: darkenColor(primaryColor, 0.1),\r\n            timestamp: '#9ca3af'\r\n        },\r\n        \r\n        // Window/Container colors\r\n        window: {\r\n            background: lightenColor(primaryColor, 0.95),\r\n            border: isAccentLight ? darkenColor(primaryColor, 0.2) : lightenColor(primaryColor, 0.3),\r\n            shadow: addAlpha(primaryColor, 0.15)\r\n        },\r\n        \r\n        // Input area colors\r\n        input: {\r\n            background: '#ffffff',\r\n            border: lightenColor(primaryColor, 0.85),\r\n            text: '#1f2937',\r\n            placeholder: '#9ca3af',\r\n            buttonBackground: primaryColor,\r\n            buttonText: isAccentLight ? '#1f2937' : '#ffffff'\r\n        },\r\n        \r\n        // Footer colors\r\n        footer: {\r\n            text: isAccentLight ? darkenColor(primaryColor, 0.3) : lightenColor(primaryColor, 0.2),\r\n            link: darkenColor(primaryColor, 0.1)\r\n        },\r\n        \r\n        // Chat bubble (floating button)\r\n        bubble: {\r\n            background: primaryColor,\r\n            icon: isAccentLight ? '#1f2937' : '#ffffff'\r\n        },\r\n        \r\n        // Hint bubble\r\n        hint: {\r\n            background: '#ffffff',\r\n            text: '#1f2937',\r\n            border: lightenColor(primaryColor, 0.85),\r\n            closeButton: primaryColor\r\n        },\r\n        \r\n        // Menu dropdown\r\n        menu: {\r\n            background: '#ffffff',\r\n            text: '#1f2937',\r\n            hover: lightenColor(primaryColor, 0.9),\r\n            border: '#e5e7eb'\r\n        },\r\n        \r\n        // Rating stars\r\n        rating: {\r\n            star: '#fbbf24',\r\n            text: '#6b7280'\r\n        },\r\n        \r\n        // Utility colors\r\n        utils: {\r\n            lighten: lightenColor,\r\n            darken: darkenColor,\r\n            addAlpha: addAlpha,\r\n            hexToRgb: hexToRgb\r\n        }\r\n    };\r\n}\r\n\r\n// Only named export is used across the codebase; default export removed for consistency\r\n","/**\r\n * Aptolix Chatbot - Core UI & Logic\r\n * \r\n * This file contains the core chatbot functionality.\r\n * Can run in two contexts:\r\n * 1. Inside iframe (bubble mode) - receives config via postMessage\r\n * 2. Directly in page (section mode) - receives config via direct init call\r\n */\r\n\r\nimport './chatbotstyle.css';\r\nimport LocalStorageManager from './localStorageManager.js';\r\nimport { formatMessages } from './messageFormatter.js';\r\nimport { generateTheme } from './themeGenerator.js';\r\n\r\n// Detect if running in iframe\r\nconst isInIframe = window.self !== window.top;\r\n\r\n// Track if initialized\r\nlet initialized = false;\r\nlet config = null;\r\nlet conversationId = null;\r\nlet visitorId = null;\r\nlet sessionId = null;\r\nlet messageHistory = [];\r\nlet localStorageManager = null;\r\nlet apiHost = null;\r\nlet botMessageCount = 0;\r\nlet lastRatedAtMessageCount = 0;\r\n\r\n// Message types for parent-iframe communication (only used in iframe mode)\r\nconst MESSAGE_TYPES = {\r\n    // Parent → iframe\r\n    INIT: 'APTOLIX_INIT',\r\n    SHOW: 'APTOLIX_SHOW',\r\n    HIDE: 'APTOLIX_HIDE',\r\n    \r\n    // iframe → Parent\r\n    READY: 'APTOLIX_READY',\r\n    HEIGHT_CHANGE: 'APTOLIX_HEIGHT_CHANGE',\r\n    CLOSE_REQUESTED: 'APTOLIX_CLOSE_REQUESTED'\r\n};\r\n\r\n/**\r\n * Send message to parent window (only in iframe mode)\r\n */\r\nfunction sendToParent(type, payload = {}) {\r\n    if (isInIframe && window.parent) {\r\n        window.parent.postMessage({\r\n            type,\r\n            payload,\r\n            source: 'aptolix-chatbot-iframe'\r\n        }, '*');\r\n    }\r\n}\r\n\r\nfunction toAvatarHtml(avatar) {\r\n    if (!avatar || typeof avatar !== 'string') return undefined;\r\n    const trimmed = avatar.trim();\r\n    if (/^https?:\\/\\//.test(trimmed)) {\r\n        return `<img src=\"${trimmed}\" alt=\"\" style=\"width:32px;height:32px;border-radius:50%;object-fit:cover;\" />`;\r\n    }\r\n    return avatar;\r\n}\r\n\r\nfunction getFormatOptions() {\r\n    return {\r\n        botAvatar: toAvatarHtml(config.botAvatar),\r\n        userAvatar: toAvatarHtml(config.userAvatar),\r\n        botname: config.botname,\r\n        username: config.username || 'You',\r\n        botaccentColor: config.botaccentColor\r\n    };\r\n}\r\n\r\nfunction countRateableBotMessages(history) {\r\n    return (history || []).filter((msg) => (\r\n        msg.type === 'bot' &&\r\n        !String(msg.messageId || '').startsWith('greeting-') &&\r\n        !String(msg.messageId || '').startsWith('error-')\r\n    )).length;\r\n}\r\n\r\nfunction getChatInputEls() {\r\n    return {\r\n        input: document.querySelector(`#aptolix-chat-inputbox-${config.chatbotId}`),\r\n        sendButton: document.querySelector(`#aptolix-chat-input-${config.chatbotId} button`),\r\n        messagesDiv: document.querySelector(`#aptolix-chat-messages-${config.chatbotId}`),\r\n        ratingEl: document.getElementById(`aptolix-rating-${config.chatbotId}`)\r\n    };\r\n}\r\n\r\nfunction formatLimitDate(limitReachedDate) {\r\n    if (!limitReachedDate) return '';\r\n    try {\r\n        const limitDate = (String(limitReachedDate).length === 10 && !String(limitReachedDate).includes('T'))\r\n            ? new Date(`${limitReachedDate}T23:59:59.999Z`)\r\n            : new Date(limitReachedDate);\r\n        if (Number.isNaN(limitDate.getTime())) return String(limitReachedDate);\r\n        return limitDate.toLocaleDateString(undefined, { year: 'numeric', month: 'long', day: 'numeric' });\r\n    } catch {\r\n        return String(limitReachedDate);\r\n    }\r\n}\r\n\r\nfunction setChatInputEnabled(enabled) {\r\n    const { input, sendButton } = getChatInputEls();\r\n    if (input) {\r\n        input.disabled = !enabled;\r\n        input.placeholder = enabled ? 'Type your message...' : 'Daily message limit reached';\r\n    }\r\n    if (sendButton) sendButton.disabled = !enabled;\r\n}\r\n\r\nfunction showLimitWarning(limitReachedDate) {\r\n    setChatInputEnabled(false);\r\n    const { messagesDiv } = getChatInputEls();\r\n    if (!messagesDiv || messagesDiv.querySelector('.aptolix-limit-warning')) return;\r\n\r\n    const warning = document.createElement('div');\r\n    warning.className = 'aptolix-limit-warning';\r\n    warning.textContent = `You've reached today's message limit. Please try again after ${formatLimitDate(limitReachedDate)}.`;\r\n    messagesDiv.appendChild(warning);\r\n    scrollToBottom();\r\n    notifyHeightChange();\r\n}\r\n\r\nfunction applyStoredUsageLimit() {\r\n    if (!visitorId || !localStorageManager) return false;\r\n    const limitData = localStorageManager.getUsageLimitReached(config.chatbotId, visitorId);\r\n    if (limitData?.limitReachedDate) {\r\n        showLimitWarning(limitData.limitReachedDate);\r\n        return true;\r\n    }\r\n    return false;\r\n}\r\n\r\nfunction showRatingPrompt() {\r\n    const { ratingEl } = getChatInputEls();\r\n    if (ratingEl) ratingEl.classList.add('show');\r\n}\r\n\r\nfunction hideRatingPrompt() {\r\n    const { ratingEl } = getChatInputEls();\r\n    if (ratingEl) ratingEl.classList.remove('show');\r\n}\r\n\r\nfunction checkAndShowRating() {\r\n    if (!config?.allowRating) return;\r\n    const threshold = Number(config.ratingThreshold) || 0;\r\n    const interval = Number(config.ratingInterval) || 0;\r\n    const reachedThreshold = botMessageCount >= threshold;\r\n    const reachedInterval = lastRatedAtMessageCount === 0\r\n        ? true\r\n        : botMessageCount >= lastRatedAtMessageCount + interval;\r\n    if (reachedThreshold && reachedInterval) {\r\n        showRatingPrompt();\r\n    }\r\n}\r\n\r\n/**\r\n * Initialize chatbot UI\r\n * Can be called directly (section mode) or via postMessage (bubble mode in iframe)\r\n */\r\nasync function initializeChatbot(initConfig, initApiHost) {\r\n    if (initialized) return;\r\n    \r\n    config = initConfig;\r\n    apiHost = initApiHost || config.apiHost;\r\n    conversationId = config.conversationId || `${config.chatbotId}-${Date.now()}`;\r\n    localStorageManager = new LocalStorageManager(config.chatbotId);\r\n    \r\n    // Get visitor ID and session ID from localStorage (will be null if not present)\r\n    // API will provide these IDs in the response and we'll save them\r\n    visitorId = localStorageManager.getVisitorId(config.chatbotId);\r\n    sessionId = localStorageManager.getSessionId(config.chatbotId);\r\n    \r\n    // Build UI\r\n    renderChatWindow();\r\n    \r\n    // Restore conversation history\r\n    await restoreConversationHistory();\r\n    \r\n    // Setup event listeners\r\n    setupEventListeners();\r\n    \r\n    // Show greeting if no history\r\n    if (messageHistory.length === 0) {\r\n        showGreeting();\r\n    }\r\n\r\n    botMessageCount = countRateableBotMessages(messageHistory);\r\n    if (!applyStoredUsageLimit()) {\r\n        checkAndShowRating();\r\n    }\r\n    \r\n    initialized = true;\r\n    \r\n    // Notify parent that chatbot is ready (only in iframe mode)\r\n    if (isInIframe) {\r\n        sendToParent(MESSAGE_TYPES.READY);\r\n    }\r\n    \r\n    // Send initial height (only in iframe mode)\r\n    if (isInIframe) {\r\n        notifyHeightChange();\r\n    }\r\n\r\n    // Return chatbotId so callers can track instance\r\n    return config.chatbotId;\r\n}\r\n\r\n/**\r\n * Render the chat window UI\r\n */\r\nfunction renderChatWindow() {\r\n    const theme = generateTheme(config.botaccentColor);\r\n    const chatbotId = config.chatbotId;\r\n    \r\n    // Determine logo HTML\r\n    let logoHTML = '';\r\n    if (config.companyLogo) {\r\n        const isLogoUrl = /^https?:\\/\\//.test(config.companyLogo);\r\n        logoHTML = isLogoUrl\r\n            ? `<img src=\"${config.companyLogo}\" alt=\"Company Logo\" class=\"aptolix-company-logo\" style=\"max-width:40px;max-height:40px;\" />`\r\n            : config.companyLogo;\r\n    }\r\n    \r\n    // Construct Aptolix link with UTM parameters\r\n    const utmSource = encodeURIComponent(window.location.hostname);\r\n    const utmMedium = encodeURIComponent('widget');\r\n    const utmCampaign = encodeURIComponent('refback');\r\n    const aptolixLink = `https://aptolix.com?utm_source=${utmSource}&utm_medium=${utmMedium}&utm_campaign=${utmCampaign}`;\r\n    \r\n    // Detect localhost for dev indicator\r\n    // In iframe mode, use parent's hostname; otherwise use current hostname\r\n    const hostname = isInIframe && window.__parentHostname__ ? window.__parentHostname__ : window.location.hostname;\r\n    const isLocalhost = hostname === 'localhost' || \r\n                       hostname === '127.0.0.1' || \r\n                       hostname.startsWith('192.168.') ||\r\n                       hostname.endsWith('.local');\r\n    const localBadge = isLocalhost ? `<span style=\"background: #ef4444; color: white; padding: 2px 8px; border-radius: 4px; font-size: 10px; font-weight: 700; margin-left: 8px; letter-spacing: 0.5px;\">LOCAL</span>` : '';\r\n    \r\n    // For bubble mode, don't add box-shadow (iframe already has it)\r\n    const boxShadowStyle = isInIframe ? '' : `box-shadow: 0 4px 20px ${theme.window.shadow};`;\r\n    \r\n    const chatWindowHTML = `\r\n        <div id=\"aptolix-chat-window-${chatbotId}\" class=\"aptolix-chat-window ${isInIframe ? 'bubble-mode' : 'section-mode'}\" style=\"background-color: ${theme.window.background}; border-color: ${theme.window.border}; ${boxShadowStyle}\">\r\n            <div id=\"aptolix-chat-header-${chatbotId}\" style=\"background-color: ${config.botaccentColor}; color: ${theme.header.text}; border-bottom: 2px solid ${theme.header.border};\">\r\n                <div class=\"aptolix-header-flex\">\r\n                    <div class=\"aptolix-header-title\">\r\n                        ${logoHTML ? `<div class=\"aptolix-company-logo-wrapper\">${logoHTML}</div>` : ''}\r\n                        <div class=\"aptolix-header-copy\">\r\n                            <strong class=\"aptolix-bot-name\">${config.botname}${localBadge}</strong>\r\n                            ${config.subheading ? `<span class=\"aptolix-header-subtitle\" style=\"color: ${theme.header.subtitle};\">${config.subheading}</span>` : ''}\r\n                        </div>\r\n                    </div>\r\n                    <div class=\"aptolix-header-actions\">\r\n                        ${(config.allowReset || config.allowDownloadTranscript) ? `<button id=\"aptolix-chat-menu-${chatbotId}\" title=\"More options\" aria-label=\"More options\" style=\"color: ${theme.header.button};\">⋮</button>` : ''}\r\n                        ${config.allowExpandChatWindow ? `<button id=\"aptolix-chat-expand-${chatbotId}\" title=\"Expand/Collapse\" aria-label=\"Expand/Collapse\" style=\"color: ${theme.header.button};\">\r\n                            <span id=\"aptolix-chat-expand-icon-${chatbotId}\">⤢</span>\r\n                        </button>` : ''}\r\n                        <button id=\"aptolix-chat-close-${chatbotId}\" title=\"Close chat\" aria-label=\"Close chat\" style=\"color: ${theme.header.button};\">×</button>\r\n                        ${(config.allowReset || config.allowDownloadTranscript) ? `<div id=\"aptolix-chat-menu-dropdown-${chatbotId}\" class=\"aptolix-menu-dropdown\" style=\"background-color: ${theme.menu.background}; border-color: ${theme.menu.border}; border: 1px solid ${theme.menu.border};\">\r\n                            ${config.allowReset ? `<button id=\"aptolix-chat-reset-${chatbotId}\" class=\"aptolix-menu-item\" title=\"Reset chat\" aria-label=\"Reset chat\" style=\"background-color: ${theme.menu.background}; color: ${theme.menu.text};\">\r\n                                <span class=\"aptolix-menu-icon\">⟲</span>\r\n                                <span class=\"aptolix-menu-text\">Reset Chat</span>\r\n                            </button>` : ''}\r\n                            ${config.allowDownloadTranscript ? `<button id=\"aptolix-chat-download-${chatbotId}\" class=\"aptolix-menu-item\" title=\"Download chat\" aria-label=\"Download chat\" style=\"background-color: ${theme.menu.background}; color: ${theme.menu.text};\">\r\n                                <span class=\"aptolix-menu-icon\">⤓</span>\r\n                                <span class=\"aptolix-menu-text\">Download Chat</span>\r\n                            </button>` : ''}\r\n                        </div>` : ''}\r\n                    </div>\r\n                </div>\r\n            </div>\r\n            <div id=\"aptolix-chat-messages-${chatbotId}\" style=\"background-color: ${theme.window.background}; position: relative;\">\r\n            </div>\r\n            <div id=\"aptolix-chat-input-${chatbotId}\" style=\"border-top: 2px solid ${theme.input.border};\">\r\n                <textarea id=\"aptolix-chat-inputbox-${chatbotId}\" rows=\"1\" placeholder=\"Type your message...\" style=\"resize:none; border-color: ${theme.input.border}; background-color: ${theme.window.background};\"></textarea>\r\n                <button style=\"background-color: ${config.botaccentColor}; color: ${theme.input.buttonText};\">Send</button>\r\n            </div>\r\n            <div class=\"aptolix-footer\">\r\n                <div class=\"aptolix-powered-by\" style=\"color: ${theme.footer.text};\">\r\n                    Powered by <a href=\"${aptolixLink}\" target=\"_blank\" rel=\"noopener\" class=\"aptolix-link\" style=\"color: ${config.botaccentColor};\">Aptolix</a>\r\n                </div>\r\n                ${config.allowRating ? `<span class=\"aptolix-footer-separator\">|</span>\r\n                <div class=\"aptolix-rating\" id=\"aptolix-rating-${chatbotId}\">\r\n                    <span class=\"aptolix-rating-label\">Rate this chat:</span>\r\n                    <div class=\"aptolix-stars\" id=\"aptolix-stars-${chatbotId}\">\r\n                        <span class=\"star\" data-rating=\"1\">☆</span>\r\n                        <span class=\"star\" data-rating=\"2\">☆</span>\r\n                        <span class=\"star\" data-rating=\"3\">☆</span>\r\n                        <span class=\"star\" data-rating=\"4\">☆</span>\r\n                        <span class=\"star\" data-rating=\"5\">☆</span>\r\n                    </div>\r\n                </div>` : ''}\r\n            </div>\r\n        </div>\r\n    `;\r\n    \r\n    // Inject HTML based on context\r\n    if (isInIframe) {\r\n        // In iframe: Replace entire body (safe because iframe has its own document)\r\n        document.body.innerHTML = chatWindowHTML;\r\n        \r\n        // Apply iframe-specific styles to html and body\r\n        document.documentElement.style.height = '100%';\r\n        document.documentElement.style.margin = '0';\r\n        document.documentElement.style.padding = '0';\r\n        \r\n        document.body.style.height = '100%';\r\n        document.body.style.margin = '0';\r\n        document.body.style.padding = '0';\r\n        document.body.style.overflow = 'hidden';\r\n        document.body.style.fontFamily = \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\";\r\n    } else {\r\n        // In section mode: Use target from config\r\n        let targetEl = document.body;\r\n        \r\n        if (config.target) {\r\n            const found = typeof config.target === \"string\" \r\n                ? document.querySelector(config.target) \r\n                : config.target;\r\n            if (found) targetEl = found;\r\n        }\r\n        \r\n        targetEl.insertAdjacentHTML('beforeend', chatWindowHTML);\r\n    }\r\n}\r\n\r\n/**\r\n * Setup all event listeners\r\n */\r\nfunction setupEventListeners() {\r\n    const chatbotId = config.chatbotId;\r\n    const theme = generateTheme(config.botaccentColor);\r\n    \r\n    const closeBtn = document.querySelector(`#aptolix-chat-close-${chatbotId}`);\r\n    const resetBtn = config.allowReset ? document.querySelector(`#aptolix-chat-reset-${chatbotId}`) : null;\r\n    const expandBtn = config.allowExpandChatWindow ? document.querySelector(`#aptolix-chat-expand-${chatbotId}`) : null;\r\n    const expandIcon = config.allowExpandChatWindow ? document.querySelector(`#aptolix-chat-expand-icon-${chatbotId}`) : null;\r\n    const input = document.querySelector(`#aptolix-chat-inputbox-${chatbotId}`);\r\n    const sendButton = document.querySelector(`#aptolix-chat-input-${chatbotId} button`);\r\n    const messagesDiv = document.querySelector(`#aptolix-chat-messages-${chatbotId}`);\r\n    const downloadBtn = config.allowDownloadTranscript ? document.querySelector(`#aptolix-chat-download-${chatbotId}`) : null;\r\n    const menuBtn = (config.allowReset || config.allowDownloadTranscript) ? document.querySelector(`#aptolix-chat-menu-${chatbotId}`) : null;\r\n    const menuDropdown = (config.allowReset || config.allowDownloadTranscript) ? document.querySelector(`#aptolix-chat-menu-dropdown-${chatbotId}`) : null;\r\n    \r\n    // Close button\r\n    if (closeBtn) {\r\n        closeBtn.addEventListener('click', () => {\r\n            if (isInIframe) {\r\n                // In iframe mode: notify parent to hide iframe\r\n                sendToParent(MESSAGE_TYPES.CLOSE_REQUESTED);\r\n            } else {\r\n                // In section mode: close button shouldn't exist, but if it does, hide container\r\n                const chatWindow = document.querySelector(`#aptolix-chat-window-${chatbotId}`);\r\n                if (chatWindow) chatWindow.style.display = 'none';\r\n            }\r\n        });\r\n    }\r\n    \r\n    // Reset button\r\n    if (resetBtn) {\r\n        resetBtn.addEventListener('click', async () => {\r\n            if (confirm('Are you sure you want to reset the chat? This will clear all messages.')) {\r\n                await resetChat();\r\n            }\r\n            if (menuDropdown) menuDropdown.style.display = 'none';\r\n        });\r\n    }\r\n    \r\n    // Expand button\r\n    if (expandBtn && expandIcon) {\r\n        let isExpanded = false;\r\n        expandBtn.addEventListener('click', () => {\r\n            isExpanded = !isExpanded;\r\n            const chatWindow = document.querySelector(`#aptolix-chat-window-${chatbotId}`);\r\n            \r\n            if (isExpanded) {\r\n                chatWindow.classList.add('expanded');\r\n                expandIcon.textContent = '⤡';\r\n            } else {\r\n                chatWindow.classList.remove('expanded');\r\n                expandIcon.textContent = '⤢';\r\n            }\r\n            \r\n            // In iframe mode, notify parent to resize iframe\r\n            if (isInIframe) {\r\n                sendToParent('APTOLIX_EXPAND_TOGGLE', { isExpanded });\r\n            }\r\n            \r\n            notifyHeightChange();\r\n        });\r\n    }\r\n    \r\n    // Download button\r\n    if (downloadBtn) {\r\n        downloadBtn.addEventListener('click', () => {\r\n            downloadTranscript();\r\n            if (menuDropdown) menuDropdown.style.display = 'none';\r\n        });\r\n    }\r\n    \r\n    // Menu button\r\n    if (menuBtn && menuDropdown) {\r\n        menuBtn.addEventListener('click', (e) => {\r\n            e.stopPropagation();\r\n            const isVisible = menuDropdown.style.display === 'block';\r\n            menuDropdown.style.display = isVisible ? 'none' : 'block';\r\n        });\r\n        \r\n        // Close menu when clicking outside\r\n        document.addEventListener('click', () => {\r\n            menuDropdown.style.display = 'none';\r\n        });\r\n        \r\n        // Apply hover effects\r\n        const menuItems = menuDropdown.querySelectorAll('.aptolix-menu-item');\r\n        menuItems.forEach(item => {\r\n            item.addEventListener('mouseenter', () => {\r\n                item.style.backgroundColor = theme.menu.hover;\r\n            });\r\n            item.addEventListener('mouseleave', () => {\r\n                item.style.backgroundColor = theme.menu.background;\r\n            });\r\n        });\r\n    }\r\n    \r\n    // Input focus/blur\r\n    if (input) {\r\n        input.addEventListener('focus', () => {\r\n            input.style.borderColor = theme.primary;\r\n        });\r\n        input.addEventListener('blur', () => {\r\n            input.style.borderColor = theme.input.border;\r\n        });\r\n        \r\n        // Handle input\r\n        input.addEventListener('keydown', (e) => {\r\n            if (e.key === 'Enter' && !e.shiftKey) {\r\n                e.preventDefault();\r\n                sendMessage();\r\n            }\r\n        });\r\n        \r\n        // Auto-resize textarea\r\n        input.addEventListener('input', () => {\r\n            input.style.height = 'auto';\r\n            input.style.height = input.scrollHeight + 'px';\r\n            notifyHeightChange();\r\n        });\r\n        \r\n        // Character limit\r\n        if (config.inputCharLimit) {\r\n            input.setAttribute('maxlength', config.inputCharLimit);\r\n        }\r\n    }\r\n    \r\n    // Send button\r\n    if (sendButton) {\r\n        sendButton.addEventListener('click', sendMessage);\r\n    }\r\n    \r\n    // Rating stars\r\n    if (config.allowRating) {\r\n        const stars = document.querySelectorAll(`#aptolix-stars-${chatbotId} .star`);\r\n        stars.forEach(star => {\r\n            star.addEventListener('click', () => {\r\n                const rating = parseInt(star.getAttribute('data-rating'));\r\n                submitRating(rating);\r\n            });\r\n            \r\n            star.addEventListener('mouseenter', () => {\r\n                const rating = parseInt(star.getAttribute('data-rating'));\r\n                highlightStars(rating);\r\n            });\r\n        });\r\n        \r\n        const starsContainer = document.querySelector(`#aptolix-stars-${chatbotId}`);\r\n        if (starsContainer) {\r\n            starsContainer.addEventListener('mouseleave', () => {\r\n                const submittedRating = localStorageManager.getRating(conversationId);\r\n                highlightStars(submittedRating || 0);\r\n            });\r\n        }\r\n    }\r\n}\r\n\r\n/**\r\n * Show greeting message\r\n */\r\nfunction showGreeting() {\r\n    if (!config.greetingMessage) return;\r\n    \r\n    const greetingMsg = {\r\n        text: config.greetingMessage,\r\n        type: 'bot',\r\n        timestamp: Date.now(),\r\n        messageId: `greeting-${Date.now()}`\r\n    };\r\n    \r\n    messageHistory.push(greetingMsg);\r\n    renderMessage(greetingMsg);\r\n}\r\n\r\n/**\r\n * Restore conversation history from localStorage\r\n */\r\nasync function restoreConversationHistory() {\r\n    const history = localStorageManager.getConversationHistory();\r\n    \r\n    if (history && history.length > 0) {\r\n        messageHistory = history;\r\n        renderAllMessages();\r\n    }\r\n}\r\n\r\n/**\r\n * Render all messages\r\n */\r\nfunction renderAllMessages() {\r\n    const messagesDiv = document.querySelector(`#aptolix-chat-messages-${config.chatbotId}`);\r\n    if (!messagesDiv) return;\r\n    \r\n    messagesDiv.innerHTML = formatMessages(messageHistory, getFormatOptions());\r\n    \r\n    scrollToBottom();\r\n    notifyHeightChange();\r\n}\r\n\r\n/**\r\n * Render a single message\r\n */\r\nfunction renderMessage(message) {\r\n    const messagesDiv = document.querySelector(`#aptolix-chat-messages-${config.chatbotId}`);\r\n    if (!messagesDiv) return;\r\n    \r\n    const messageHTML = formatMessages([message], getFormatOptions());\r\n    \r\n    messagesDiv.insertAdjacentHTML('beforeend', messageHTML);\r\n    scrollToBottom();\r\n    notifyHeightChange();\r\n}\r\n\r\n/**\r\n * Send message\r\n */\r\nasync function sendMessage() {\r\n    const input = document.querySelector(`#aptolix-chat-inputbox-${config.chatbotId}`);\r\n    if (!input || input.disabled) return;\r\n    \r\n    const text = input.value.trim();\r\n    if (!text) return;\r\n    \r\n    // Clear input\r\n    input.value = '';\r\n    input.style.height = 'auto';\r\n    \r\n    // Add user message\r\n    const userMsg = {\r\n        text: text,\r\n        type: 'user',\r\n        timestamp: Date.now(),\r\n        messageId: `user-${Date.now()}`\r\n    };\r\n    \r\n    messageHistory.push(userMsg);\r\n    renderMessage(userMsg);\r\n    localStorageManager.saveConversationHistory(messageHistory);\r\n    \r\n    // Show typing indicator\r\n    showTypingIndicator();\r\n    \r\n    // Make API call directly (works in both iframe and section mode)\r\n    try {\r\n        const response = await fetch(`${apiHost}/chatbot/${config.chatbotId}`, {\r\n            method: 'POST',\r\n            headers: { 'Content-Type': 'application/json' },\r\n            body: JSON.stringify({\r\n                message: text,\r\n                chatbot_id: config.chatbotId,\r\n                visitor_id: visitorId,\r\n                session_id: sessionId\r\n            })\r\n        });\r\n        \r\n        if (!response.ok) {\r\n            throw new Error(`API error: ${response.status}`);\r\n        }\r\n        \r\n        const data = await response.json();\r\n        handleApiResponse({ data });\r\n    } catch (error) {\r\n        handleApiResponse({ error: error.message });\r\n    }\r\n}\r\n\r\n/**\r\n * Handle API response from parent\r\n */\r\nfunction handleApiResponse(response) {\r\n    hideTypingIndicator();\r\n    \r\n    if (response.error) {\r\n        const errorMsg = {\r\n            text: `Error: ${response.error}`,\r\n            type: 'bot',\r\n            timestamp: Date.now(),\r\n            messageId: `error-${Date.now()}`\r\n        };\r\n        messageHistory.push(errorMsg);\r\n        renderMessage(errorMsg);\r\n        return;\r\n    }\r\n    \r\n    const data = response.data;\r\n    \r\n    // Save visitor ID and session ID from API response\r\n    if (data.visitor_id) {\r\n        visitorId = data.visitor_id;\r\n        localStorageManager.saveVisitorId(config.chatbotId, visitorId);\r\n    }\r\n    if (data.session_id) {\r\n        sessionId = data.session_id;\r\n        localStorageManager.saveSessionId(config.chatbotId, sessionId);\r\n    }\r\n\r\n    if (data.limitReachedDate) {\r\n        localStorageManager.setUsageLimitReached(config.chatbotId, visitorId, data.limitReachedDate);\r\n        showLimitWarning(data.limitReachedDate);\r\n        return;\r\n    }\r\n    \r\n    // Add bot response\r\n    const botMsg = {\r\n        text: data.response || data.message || 'No response',\r\n        type: 'bot',\r\n        timestamp: Date.now(),\r\n        messageId: data.message_id || `bot-${Date.now()}`\r\n    };\r\n    \r\n    messageHistory.push(botMsg);\r\n    renderMessage(botMsg);\r\n    localStorageManager.saveConversationHistory(messageHistory);\r\n\r\n    botMessageCount++;\r\n    checkAndShowRating();\r\n}\r\n\r\n/**\r\n * Show typing indicator\r\n */\r\nfunction showTypingIndicator() {\r\n    const messagesDiv = document.querySelector(`#aptolix-chat-messages-${config.chatbotId}`);\r\n    if (!messagesDiv) return;\r\n    \r\n    const theme = generateTheme(config.botaccentColor);\r\n    \r\n    const indicator = document.createElement('div');\r\n    indicator.id = 'aptolix-typing-indicator';\r\n    indicator.innerHTML = `\r\n        <div class=\"aptolix-messages-wrapper\">\r\n            <div class=\"message bot typing\">\r\n                <div class=\"message-avatar\">\r\n                    ${toAvatarHtml(config.botAvatar) || ''}\r\n                </div>\r\n                <div class=\"message-content\">\r\n                    <div class=\"message-text\" style=\"background-color: ${theme.messages.botBackground}; color: ${theme.messages.botText};\">\r\n                        <span class=\"typing-dots\">\r\n                            <span>.</span><span>.</span><span>.</span>\r\n                        </span>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    `;\r\n    \r\n    messagesDiv.appendChild(indicator);\r\n    scrollToBottom();\r\n    notifyHeightChange();\r\n}\r\n\r\n/**\r\n * Hide typing indicator\r\n */\r\nfunction hideTypingIndicator() {\r\n    const indicator = document.getElementById('aptolix-typing-indicator');\r\n    if (indicator) {\r\n        indicator.remove();\r\n        notifyHeightChange();\r\n    }\r\n}\r\n\r\n/**\r\n * Reset chat\r\n */\r\nasync function resetChat() {\r\n    messageHistory = [];\r\n    conversationId = `${config.chatbotId}-${Date.now()}`;\r\n    \r\n    // Clear session ID - API will provide new one on next message\r\n    // Visitor ID stays the same\r\n    sessionId = null;\r\n    localStorageManager.clearSessionId(config.chatbotId);\r\n    \r\n    localStorageManager.clearConversationHistory();\r\n    \r\n    const messagesDiv = document.querySelector(`#aptolix-chat-messages-${config.chatbotId}`);\r\n    if (messagesDiv) {\r\n        messagesDiv.innerHTML = '';\r\n    }\r\n\r\n    botMessageCount = 0;\r\n    lastRatedAtMessageCount = 0;\r\n    hideRatingPrompt();\r\n    \r\n    // Show greeting again\r\n    showGreeting();\r\n\r\n    if (!applyStoredUsageLimit()) {\r\n        setChatInputEnabled(true);\r\n    }\r\n    \r\n    notifyHeightChange();\r\n}\r\n\r\n/**\r\n * Download transcript\r\n */\r\nfunction downloadTranscript() {\r\n    let transcript = `Aptolix Chat Transcript - ${config.botname}\\n`;\r\n    transcript += `Date: ${new Date().toLocaleString()}\\n`;\r\n    transcript += `${'='.repeat(50)}\\n\\n`;\r\n    \r\n    messageHistory.forEach(msg => {\r\n        const timestamp = new Date(msg.timestamp).toLocaleString();\r\n        const sender = msg.type === 'user' ? (config.username || 'You') : config.botname;\r\n        transcript += `[${timestamp}] ${sender}:\\n${msg.text}\\n\\n`;\r\n    });\r\n    \r\n    const blob = new Blob([transcript], { type: 'text/plain' });\r\n    const url = URL.createObjectURL(blob);\r\n    const a = document.createElement('a');\r\n    a.href = url;\r\n    a.download = `chat-transcript-${Date.now()}.txt`;\r\n    a.click();\r\n    URL.revokeObjectURL(url);\r\n}\r\n\r\n/**\r\n * Submit rating\r\n */\r\nasync function submitRating(rating) {\r\n    localStorageManager.saveRating(conversationId, rating);\r\n    highlightStars(rating);\r\n    lastRatedAtMessageCount = botMessageCount;\r\n    hideRatingPrompt();\r\n\r\n    if (!visitorId || !sessionId) return;\r\n    \r\n    // Send rating to API directly (works in both iframe and section mode)\r\n    try {\r\n        await fetch(`${apiHost}/chatbot/${config.chatbotId}/rating`, {\r\n            method: 'POST',\r\n            headers: { 'Content-Type': 'application/json' },\r\n            body: JSON.stringify({\r\n                chatbot_id: config.chatbotId,\r\n                visitor_id: visitorId,\r\n                session_id: sessionId,\r\n                rating: rating\r\n            })\r\n        });\r\n    } catch (error) {\r\n        console.error('Failed to submit rating:', error);\r\n    }\r\n}\r\n\r\n/**\r\n * Highlight rating stars\r\n */\r\nfunction highlightStars(rating) {\r\n    const stars = document.querySelectorAll(`#aptolix-stars-${config.chatbotId} .star`);\r\n    stars.forEach((star, index) => {\r\n        star.textContent = index < rating ? '★' : '☆';\r\n    });\r\n}\r\n\r\n/**\r\n * Scroll to bottom\r\n */\r\nfunction scrollToBottom() {\r\n    const messagesDiv = document.querySelector(`#aptolix-chat-messages-${config.chatbotId}`);\r\n    if (messagesDiv) {\r\n        messagesDiv.scrollTop = messagesDiv.scrollHeight;\r\n    }\r\n}\r\n\r\n/**\r\n * Notify parent of height change\r\n */\r\nfunction notifyHeightChange() {\r\n    // Use requestAnimationFrame to ensure DOM has updated\r\n    requestAnimationFrame(() => {\r\n        const height = document.body.scrollHeight;\r\n        sendToParent(MESSAGE_TYPES.HEIGHT_CHANGE, { height });\r\n    });\r\n}\r\n\r\n/**\r\n * Listen for messages from parent (only in iframe mode)\r\n */\r\nif (isInIframe) {\r\n    window.addEventListener('message', (event) => {\r\n        // Only accept messages from parent\r\n        if (event.source !== window.parent) return;\r\n        \r\n        const { type, payload } = event.data;\r\n        \r\n        switch (type) {\r\n            case MESSAGE_TYPES.INIT:\r\n                initializeChatbot(payload, payload.apiHost);\r\n                break;\r\n                \r\n            case MESSAGE_TYPES.SHOW:\r\n                // Parent is showing the iframe - scroll to bottom when visible\r\n                setTimeout(() => scrollToBottom(), 50);\r\n                break;\r\n                \r\n            case MESSAGE_TYPES.HIDE:\r\n                // Parent is hiding the iframe\r\n                break;\r\n        }\r\n    });\r\n    \r\n    // Notify parent that iframe script is loaded\r\n    sendToParent(MESSAGE_TYPES.READY);\r\n}\r\n\r\n// Export init function for direct mode (section mode)\r\nexport { initializeChatbot };\r\n","﻿import './chatbotstyle.css';\nimport { loadConfig } from './configLoader.js';\nimport defaultConfig from './defaultConfig.js';\nimport { formatMessages } from './messageFormatter.js';\nimport { createBubbleModeWithIframe } from './iframe-manager.js';\nimport { initializeChatbot } from './chatbot-core.js';\n\nfunction optionalText(direct, fromApi) {\n    if (direct !== undefined && direct !== null) return String(direct).trim();\n    if (fromApi !== undefined && fromApi !== null) return String(fromApi).trim();\n    return '';\n}\n\n// Store all active instances for cleanup (keyed by chatbotId)\nconst activeInstances = new Map();\n\nconst AptolixChatbot = {\n    init: async ({ \n        apiHost, // mandatory\n        chatbotId, // mandatory\n        botname,\n        widgetIcon,\n        companyLogo,\n        companyLogoUrl,\n        botAvatar,\n        botavatarUrl,\n        botaccentColor,\n        floatingWelcomeMessage,\n        floatingWelcomeDelay,\n        subheading,\n        greetingMessage,\n        allowDownloadTranscript,\n        allowExpandChatWindow,\n        allowFullPageChat,\n        inputCharLimit,\n        allowReset,\n        allowRating,\n        ratingThreshold,\n        ratingInterval,\n        mode = \"bubble\",\n        target\n    }) => {\n        \n        // Validate mandatory parameters\n        if (!apiHost || !chatbotId) {\n            console.error('apiHost and chatbotId are mandatory parameters');\n            return;\n        }\n\n        // Check for duplicate chatbotId on the same page\n        if (activeInstances.has(chatbotId)) {\n            console.error(`Duplicate chatbot detected: Chatbot ID \"${chatbotId}\" is already initialized on this page.`);\n            \n            // Create a disabled UI showing error message\n            const errorWindow = document.createElement('div');\n            errorWindow.id = `window-${chatbotId}-error`;\n            errorWindow.className = 'aptolix-chat-window';\n            errorWindow.style.cssText = `\n                position: fixed;\n                bottom: 100px;\n                right: 32px;\n                width: 400px;\n                max-width: calc(100vw - 64px);\n                background: #fee;\n                border: 2px solid #f44;\n                border-radius: 16px;\n                padding: 20px;\n                box-shadow: 0 4px 20px rgba(244, 67, 54, 0.3);\n                z-index: 9998;\n                font-family: 'Inter', sans-serif;\n            `;\n            \n            errorWindow.innerHTML = `\n                <div style=\"text-align: center;\">\n                    <div style=\"font-size: 48px; margin-bottom: 10px;\">⚠️</div>\n                    <h3 style=\"margin: 0 0 10px 0; color: #c62828; font-size: 1.1rem;\">Duplicate Chatbot Detected</h3>\n                    <p style=\"margin: 0 0 15px 0; color: #666; font-size: 0.9rem; line-height: 1.5;\">\n                        A chatbot with ID <strong style=\"color: #c62828;\">${chatbotId}</strong> is already active on this page.\n                    </p>\n                    <p style=\"margin: 0; color: #888; font-size: 0.85rem; line-height: 1.4;\">\n                        <strong>Solution:</strong> Use different Chatbot IDs for multiple chatbots on the same page.\n                    </p>\n                    <button onclick=\"this.parentElement.parentElement.remove()\" style=\"\n                        margin-top: 15px;\n                        padding: 8px 16px;\n                        background: #c62828;\n                        color: white;\n                        border: none;\n                        border-radius: 6px;\n                        cursor: pointer;\n                        font-weight: 600;\n                    \">Close</button>\n                </div>\n            `;\n            \n            if (mode === 'bubble') {\n                document.body.appendChild(errorWindow);\n                // Auto-remove after 10 seconds\n                setTimeout(() => errorWindow.remove(), 10000);\n            } else if (mode === 'section' && target) {\n                const targetEl = typeof target === \"string\" ? document.querySelector(target) : target;\n                if (targetEl) {\n                    errorWindow.style.position = 'static';\n                    errorWindow.style.width = '100%';\n                    errorWindow.style.height = '100%';\n                    errorWindow.style.display = 'flex';\n                    errorWindow.style.alignItems = 'center';\n                    errorWindow.style.justifyContent = 'center';\n                    targetEl.appendChild(errorWindow);\n                }\n            }\n            \n            return null; // Don't initialize\n        }\n\n        // Reserve this chatbotId immediately to prevent race conditions\n        // (actual instance details will be updated at the end)\n        activeInstances.set(chatbotId, { initializing: true });\n\n        try {\n            // Load config from API with localStorage fallback\n            const apiConfig = await loadConfig(apiHost, chatbotId);\n            \n            // Merge config: Direct params > API config > Defaults\n            const config = {\n            botname: botname || (apiConfig?.botname) || defaultConfig.botname,\n            widgetIcon: widgetIcon || (apiConfig?.widgetIcon) || defaultConfig.widgetIcon,\n            companyLogo: companyLogo || (apiConfig?.companyLogo) || defaultConfig.companyLogo,\n            companyLogoUrl: companyLogoUrl || (apiConfig?.companyLogoUrl) || '',\n            botAvatar: botAvatar || (apiConfig?.botAvatar) || defaultConfig.botAvatar,\n            botavatarUrl: botavatarUrl || (apiConfig?.botavatarUrl) || '',\n            userAvatar: (apiConfig?.userAvatar) || defaultConfig.userAvatar,\n            username: (apiConfig?.username) || defaultConfig.username,\n            botaccentColor: botaccentColor || (apiConfig?.botaccentColor) || defaultConfig.botaccentColor,\n            subheading: optionalText(subheading, apiConfig?.subheading),\n            floatingWelcomeMessage: optionalText(floatingWelcomeMessage, apiConfig?.floatingWelcomeMessage),\n            floatingWelcomeDelay: floatingWelcomeDelay || (apiConfig?.floatingWelcomeDelay) || defaultConfig.floatingWelcomeDelay,\n            greetingMessage: greetingMessage || (apiConfig?.greetingMessage) || defaultConfig.greetingMessage,\n            allowDownloadTranscript: allowDownloadTranscript !== undefined ? allowDownloadTranscript : (apiConfig?.allowDownloadTranscript !== undefined ? apiConfig.allowDownloadTranscript : defaultConfig.allowDownloadTranscript),\n            allowExpandChatWindow: allowExpandChatWindow !== undefined ? allowExpandChatWindow : (apiConfig?.allowExpandChatWindow !== undefined ? apiConfig.allowExpandChatWindow : defaultConfig.allowExpandChatWindow),\n            allowFullPageChat: allowFullPageChat !== undefined ? allowFullPageChat : (apiConfig?.allowFullPageChat !== undefined ? apiConfig.allowFullPageChat : defaultConfig.allowFullPageChat),\n            inputCharLimit: inputCharLimit || (apiConfig?.inputCharLimit) || defaultConfig.inputCharLimit,\n            allowReset: allowReset !== undefined ? allowReset : (apiConfig?.allowReset !== undefined ? apiConfig.allowReset : defaultConfig.allowReset),\n            allowRating: allowRating !== undefined ? allowRating : (apiConfig?.allowRating !== undefined ? apiConfig.allowRating : defaultConfig.allowRating),\n            ratingThreshold: ratingThreshold || (apiConfig?.ratingThreshold) || defaultConfig.ratingThreshold,\n            ratingInterval: ratingInterval || (apiConfig?.ratingInterval) || defaultConfig.ratingInterval,\n            mode: mode || defaultConfig.mode,\n            target: target\n        };\n        \n        /**\n         * ========================================================================\n         * ASSET VALIDATION HELPERS\n         * ========================================================================\n         * These functions validate logos and avatars to ensure they are either:\n         * 1. Valid, loadable image URLs\n         * 2. Valid SVG markup\n         * If validation fails, silently falls back to default assets (no invalid content displayed)\n         */\n        \n        // Check if string matches URL pattern\n        const isUrlPattern = (str) => {\n            if (!str || typeof str !== 'string') return false;\n            return /^https?:\\/\\/.+/.test(str.trim());\n        };\n        \n        // Attempt to load image from URL with timeout\n        const canLoadImage = async (url) => {\n            return new Promise((resolve) => {\n                const img = new Image();\n                const timeout = setTimeout(() => {\n                    img.src = ''; // Cancel loading\n                    resolve(false);\n                }, 3000);\n                \n                img.onload = () => {\n                    clearTimeout(timeout);\n                    resolve(true);\n                };\n                \n                img.onerror = () => {\n                    clearTimeout(timeout);\n                    resolve(false);\n                };\n                \n                img.src = url;\n            });\n        };\n        \n        // Validate if a string is valid SVG markup\n        const isValidSvg = (svgString) => {\n            if (!svgString || typeof svgString !== 'string') return false;\n            \n            // Check if it starts with <svg and contains closing tag\n            const svgPattern = /^\\s*<svg[\\s\\S]*<\\/svg>\\s*$/i;\n            if (!svgPattern.test(svgString)) return false;\n            \n            // Try to parse as XML\n            try {\n                const parser = new DOMParser();\n                const doc = parser.parseFromString(svgString, 'image/svg+xml');\n                const parserError = doc.querySelector('parsererror');\n                return !parserError;\n            } catch (e) {\n                return false;\n            }\n        };\n        \n        // Validate company logo with fallback to default\n        const logoToValidate = companyLogo || (apiConfig?.companyLogo);\n        let validatedLogo = logoToValidate;\n        let logoLoadFailed = false;\n        if (logoToValidate && isUrlPattern(logoToValidate)) {\n            const loaded = await canLoadImage(logoToValidate);\n            if (!loaded) {\n                logoLoadFailed = true;\n            }\n        } else if (logoToValidate && !isValidSvg(logoToValidate)) {\n            logoLoadFailed = true;\n        }\n        config.companyLogo = logoLoadFailed ? null : validatedLogo;\n\n        // Validate bot avatar with placeholder on fail\n        const avatarToValidate = config.botAvatar;\n        let validatedAvatar = avatarToValidate;\n        let avatarLoadFailed = false;\n        if (avatarToValidate && isUrlPattern(avatarToValidate)) {\n            const loaded = await canLoadImage(avatarToValidate);\n            if (!loaded) {\n                avatarLoadFailed = true;\n            }\n        } else if (avatarToValidate && !isValidSvg(avatarToValidate)) {\n            avatarLoadFailed = true;\n        }\n        config.botAvatar = avatarLoadFailed ? null : validatedAvatar;\n        \n        // ===== MODE ROUTING: Bubble mode uses iframe, Section mode uses direct injection =====\n        if (config.mode === \"bubble\") {\n            // Use iframe for bubble mode (CSS isolation, better security)\n            const instance = await createBubbleModeWithIframe({ ...config, chatbotId, apiHost }, apiHost);\n            \n            // Store instance for cleanup\n            activeInstances.set(chatbotId, {\n                mode: 'bubble',\n                ...instance\n            });\n            \n            return; // Exit early - iframe manager handles everything\n        }\n        \n        // Section mode: delegate UI and logic to chatbot-core\n        const instanceId = await initializeChatbot({ ...config, chatbotId }, apiHost);\n\n        // Track instance for cleanup\n        activeInstances.set(chatbotId, {\n            chatWindowId: `aptolix-chat-window-${chatbotId}`,\n            mode: 'section'\n        });\n\n        return instanceId;\n        \n        } catch (error) {\n            // If initialization fails, remove from activeInstances to allow retry\n            activeInstances.delete(chatbotId);\n            console.error(`Failed to initialize chatbot ${chatbotId}:`, error);\n            throw error; // Re-throw to let caller handle it\n        }\n    },\n    initFull: function(options) {\n        let el = document.querySelector('aptolix-chatbot');\n        if (!el) {\n            return;\n        }\n        Object.entries(options).forEach(([key, value]) => {\n            el.setAttribute(key, value);\n        });\n    },\n    destroy: function(chatbotId = null) {\n        if (chatbotId) {\n            // Destroy specific chatbot by ID\n            const instance = activeInstances.get(chatbotId);\n            if (instance) {\n                // If bubble mode, call destroy method from iframe-manager\n                if (instance.mode === 'bubble' && instance.destroy) {\n                    instance.destroy();\n                }\n                // If section mode, remove chatWindow\n                else if (instance.chatWindowId) {\n                    const chatWindow = document.getElementById(instance.chatWindowId);\n                    if (chatWindow) chatWindow.remove();\n                }\n                activeInstances.delete(chatbotId);\n            }\n            \n            // Also remove any error windows for this chatbotId\n            const errorWindow = document.getElementById(`window-${chatbotId}-error`);\n            if (errorWindow) errorWindow.remove();\n        } else {\n            // Destroy all instances\n            activeInstances.forEach((instance, id) => {\n                if (instance.destroy) {\n                    instance.destroy();\n                }\n            });\n            // Clean up any remaining DOM elements\n            document.querySelectorAll('.aptolix-chat-bubble').forEach(el => el.remove());\n            document.querySelectorAll('.aptolix-hint-bubble').forEach(el => el.remove());\n            document.querySelectorAll('.aptolix-chat-iframe').forEach(el => el.remove());\n            document.querySelectorAll('.aptolix-chat-window').forEach(el => el.remove());\n            // Remove all error windows\n            document.querySelectorAll('[id$=\"-error\"]').forEach(el => {\n                if (el.id.startsWith('window-')) el.remove();\n            });\n            activeInstances.clear();\n        }\n    },\n    getActiveInstances: function() {\n        return Array.from(activeInstances.keys());\n    }\n};\n\n// Custom element for section embedding\nclass AptolixChatbotElement extends HTMLElement {\n    static get observedAttributes() {\n        return [\n            'apihost', 'chatbotid', 'botname', 'widgeticon', 'companylogo', 'companylogourl',\n            'botavatar', 'botavatarurl', 'botaccentcolor', 'floatingwelcomemessage',\n            'floatingwelcomedelay', 'subheading', 'greetingmessage', 'allowdownloadtranscript',\n            'allowexpandchatwindow', 'allowfullpagechat', 'inputcharlimit', 'target'\n        ];\n    }\n\n    connectedCallback() {\n        this.tryInit();\n    }\n\n    attributeChangedCallback() {\n        // Only react to changes after initial connection\n        if (!this._initialized) return;\n        \n        // Debounce to handle multiple attribute changes at once\n        clearTimeout(this._reinitTimeout);\n        this._reinitTimeout = setTimeout(() => {\n            const chatbotId = this.getAttribute('chatbotid');\n            if (chatbotId) {\n                AptolixChatbot.destroy(chatbotId);\n            }\n            this._initialized = false;\n            this.tryInit();\n        }, 100);\n    }\n\n    tryInit() {\n        const apiHost = this.getAttribute('apihost');\n        const chatbotId = this.getAttribute('chatbotid');\n        if (!apiHost || !chatbotId) return;\n\n        const botname = this.getAttribute('botname');\n        const widgetIcon = this.getAttribute('widgeticon');\n        const companyLogo = this.getAttribute('companylogo');\n        const companyLogoUrl = this.getAttribute('companylogourl');\n        const botAvatar = this.getAttribute('botavatar');\n        const botavatarUrl = this.getAttribute('botavatarurl');\n        const botaccentColor = this.getAttribute('botaccentcolor');\n        const floatingWelcomeMessage = this.getAttribute('floatingwelcomemessage');\n        const floatingWelcomeDelay = this.getAttribute('floatingwelcomedelay');\n        const subheading = this.getAttribute('subheading');\n        const greetingMessage = this.getAttribute('greetingmessage');\n        const allowDownloadTranscript = this.getAttribute('allowdownloadtranscript') === 'true';\n        const allowExpandChatWindow = this.getAttribute('allowexpandchatwindow') === 'true';\n        const allowFullPageChat = this.getAttribute('allowfullpagechat') === 'true';\n        const inputCharLimit = parseInt(this.getAttribute('inputcharlimit')) || undefined;\n        const targetAttr = this.getAttribute('target');\n        \n        let target = this;\n        if (targetAttr) {\n            const found = document.querySelector(targetAttr);\n            if (found) target = found;\n        }\n\n        if (this._initialized) return;\n        this._initialized = true;\n\n        AptolixChatbot.init({\n            apiHost,\n            chatbotId,\n            botname,\n            widgetIcon,\n            companyLogo,\n            companyLogoUrl,\n            botAvatar,\n            botavatarUrl,\n            botaccentColor,\n            floatingWelcomeMessage,\n            floatingWelcomeDelay,\n            subheading,\n            greetingMessage,\n            allowDownloadTranscript,\n            allowExpandChatWindow,\n            allowFullPageChat,\n            inputCharLimit,\n            mode: \"section\",\n            target\n        });\n    }\n}\n\n// Only define custom element if not already defined\nif (!customElements.get('aptolix-chatbot')) {\n    customElements.define('aptolix-chatbot', AptolixChatbotElement);\n}\n\n// Export as default so consumers use Chatbot.init and Chatbot.initFull\nexport default AptolixChatbot;\n\n// Export formatMessages for external use (e.g., in portals for consistent formatting)\nexport { formatMessages };\n\n\n\n\n\n"],"names":["css","ref","insertAt","document","head","getElementsByTagName","style","createElement","type","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","LocalStorageManager","constructor","chatbotId","this","keys","config","state","_getState","key","stored","localStorage","getItem","JSON","parse","error","_saveState","undefined","timestamp","Date","now","version","setItem","stringify","_isToday","today","storedDate","getFullYear","getMonth","getDate","_getTodayStart","setHours","getTime","saveConfig","data","getConfig","clearConfig","removeItem","hasConfig","saveVisitorId","visitorId","getVisitorId","clearVisitorId","hasVisitorId","saveSessionId","sessionId","getSessionId","clearSessionId","hasSessionId","saveChatHistory","messages","history","getChatHistory","clearChatHistory","hasChatHistory","setUsageLimitReached","limitReachedDate","usageLimitReached","getUsageLimitReached","limitDate","length","includes","clearUsageLimitReached","hasUsageLimitReached","clearAll","getConversationHistory","clearConversationHistory","saveConversationHistory","getRating","conversationId","ratings","saveRating","rating","defaultConfig","mode","botname","widgetIcon","botAvatar","userAvatar","username","botaccentColor","subheading","floatingWelcomeMessage","floatingWelcomeDelay","greetingMessage","allowDownloadTranscript","allowExpandChatWindow","allowFullPageChat","inputCharLimit","allowReset","allowRating","ratingThreshold","ratingInterval","isValidWidgetIcon","iconValue","trim","async","loadConfig","apiHost","storage","apiConfig","response","fetch","method","headers","ok","apiData","json","bot_name","widget_icon","companyLogo","company_logo","bot_avatar","user_avatar","accent_color","floating_welcome_message","floating_welcome_delay","greeting_message","download_transcript","expand_chat_window","full_page_chat","input_char_limit","allow_reset","allow_rating","rating_threshold","rating_interval","fetchConfigFromAPI","cachedConfig","L","breaks","extensions","gfm","hooks","pedantic","renderer","silent","tokenizer","walkTokens","O","H","l","E","exec","h","e","t","source","n","replace","r","i","s","m","caret","getRegex","RegExp","codeRemoveIndent","outputLinkReplace","indentCodeCompensation","beginningSpace","endingHash","startingSpaceChar","endingSpaceChar","nonSpaceChar","newLineCharGlobal","tabCharGlobal","multipleSpaceGlobal","blankLine","doubleBlankLine","blockquoteStart","blockquoteSetextReplace","blockquoteSetextReplace2","listReplaceTabs","listReplaceNesting","listIsTask","listReplaceTask","anyLine","hrefBrackets","tableDelimiter","tableAlignChars","tableRowBlankLine","tableAlignRight","tableAlignCenter","tableAlignLeft","startATag","endATag","startPreScriptTag","endPreScriptTag","startAngleBracket","endAngleBracket","pedanticHrefTitle","unicodeAlphaNumeric","escapeTest","escapeReplace","escapeTestNoEncode","escapeReplaceNoEncode","unescapeTest","percentDecode","findPipe","splitPipe","slashPipe","carriageReturn","spaceLine","notSpaceStart","endingNewline","listItemRegex","nextBulletRegex","Math","min","hrRegex","fencesBeginRegex","headingBeginRegex","htmlBeginRegex","C","j","se","ie","Te","F","Q","ye","Pe","v","U","Se","oe","K","blockquote","code","def","fences","heading","hr","html","lheading","list","newline","paragraph","table","text","re","_e","Le","ae","D","W","le","Ee","ue","pe","qe","ve","ce","De","Ze","Ge","He","Ne","je","Fe","q","Qe","he","de","X","_backpedal","anyPunctuation","autolink","blockSkip","br","del","emStrongLDelim","emStrongRDelimAst","emStrongRDelimUnd","escape","link","nolink","punctuation","reflink","reflinkSearch","tag","url","Ke","N","We","I","normal","M","Xe","ke","w","test","J","encodeURI","V","o","a","u","split","shift","at","pop","splice","push","z","charAt","slice","fe","href","title","other","inLink","raw","tokens","inlineTokens","y","options","rules","lexer","space","block","codeBlockStyle","match","map","join","Je","lang","inline","depth","p","c","f","top","blockTokens","k","x","g","T","substring","ordered","start","loose","items","Z","repeat","trimStart","search","ee","te","ne","me","A","G","Y","task","checked","trimEnd","filter","some","pre","toLowerCase","header","align","rows","inRawBlock","indexOf","ge","emStrong","lastIndex","index","codespan","inlineText","escaped","b","inlineQueue","links","Object","create","lex","lexInline","src","call","endsWith","startBlock","forEach","charCodeAt","console","Error","lastIndexOf","startInline","P","parser","parseInline","listitem","checkbox","unshift","tablecell","tablerow","strong","em","image","textRenderer","S","R","renderers","$","static","Set","preprocess","postprocess","processAllTokens","provideLexer","provideParser","_","defaults","setOptions","parseMarkdown","Parser","Renderer","TextRenderer","Lexer","Tokenizer","Hooks","use","concat","childTokens","flat","name","apply","level","passThroughHooks","has","Promise","resolve","then","onError","prototype","toString","all","catch","message","reject","d","formatMessages","getDefaultBotAvatar","getDefaultUserAvatar","showExactTime","isLight","color","hexToRgb","hex","result","parseInt","startsWith","rgb","Number","isLightColor","userMessageBg","userMessageText","botMessageBg","percent","round","padStart","lightenColor","msg","isUser","avatarHTML","senderName","messageBg","messageTextColor","messageContent","marked","timeStr","date","isToday","toDateString","yesterday","setDate","isYesterday","toLocaleTimeString","hour","minute","hour12","toLocaleDateString","month","day","year","formatExactTime","diff","floor","mins","hours","days","formatRelativeTime","getDefaults","MESSAGE_TYPES","generateTheme","primaryColor","cleanHex","darkenColor","max","addAlpha","opacity","isAccentLight","primary","background","subtitle","button","border","userBackground","userText","botBackground","botText","window","shadow","input","placeholder","buttonBackground","buttonText","footer","bubble","icon","hint","closeButton","menu","hover","star","utils","lighten","darken","isInIframe","self","initialized","messageHistory","localStorageManager","botMessageCount","lastRatedAtMessageCount","sendToParent","payload","parent","postMessage","toAvatarHtml","avatar","trimmed","getFormatOptions","getChatInputEls","querySelector","sendButton","messagesDiv","ratingEl","getElementById","setChatInputEnabled","enabled","disabled","showLimitWarning","warning","className","textContent","String","isNaN","formatLimitDate","scrollToBottom","notifyHeightChange","applyStoredUsageLimit","limitData","hideRatingPrompt","classList","remove","checkAndShowRating","threshold","interval","add","showRatingPrompt","initializeChatbot","initConfig","initApiHost","theme","logoHTML","utmSource","encodeURIComponent","location","hostname","utmMedium","utmCampaign","aptolixLink","__parentHostname__","localBadge","boxShadowStyle","chatWindowHTML","body","innerHTML","documentElement","height","margin","padding","overflow","fontFamily","targetEl","target","found","insertAdjacentHTML","renderChatWindow","renderAllMessages","restoreConversationHistory","closeBtn","resetBtn","expandBtn","expandIcon","downloadBtn","menuBtn","menuDropdown","addEventListener","chatWindow","display","confirm","showGreeting","resetChat","isExpanded","transcript","toLocaleString","sender","blob","Blob","URL","createObjectURL","download","click","revokeObjectURL","downloadTranscript","stopPropagation","isVisible","querySelectorAll","item","backgroundColor","borderColor","shiftKey","preventDefault","sendMessage","scrollHeight","setAttribute","highlightStars","chatbot_id","visitor_id","session_id","submitRating","getAttribute","starsContainer","setupEventListeners","messageId","greetingMsg","renderMessage","messageHTML","value","userMsg","indicator","id","showTypingIndicator","status","handleApiResponse","hideTypingIndicator","errorMsg","botMsg","message_id","scrollTop","requestAnimationFrame","optionalText","direct","fromApi","event","setTimeout","activeInstances","Map","AptolixChatbot","init","companyLogoUrl","botavatarUrl","errorWindow","position","width","alignItems","justifyContent","set","initializing","isUrlPattern","str","canLoadImage","img","Image","timeout","onload","clearTimeout","onerror","isValidSvg","svgString","doc","DOMParser","parseFromString","logoToValidate","validatedLogo","logoLoadFailed","avatarToValidate","validatedAvatar","avatarLoadFailed","instance","iframe","hintBubble","isManualSizeControl","innerText","welcomeMessage","hintBubbleTimeout","right","bottom","zIndex","hintTextSpan","hintCloseBtn","fontSize","cursor","sessionStorage","isMobile","innerWidth","applyDefaultIframeSize","frame","mobile","availableHeight","innerHeight","availableWidth","maxWidth","maxHeight","minHeight","resizeTimeout","scriptUrl","chatbotCoreUrl","origin","pathname","parentHostname","iframeHTML","srcdoc","messageHandler","contentWindow","sendToIframe","isMobileExpand","observer","MutationObserver","observe","attributes","attributeFilter","bubbleId","hintBubbleId","iframeId","destroy","removeEventListener","disconnect","createBubbleModeWithIframe","instanceId","chatWindowId","delete","initFull","el","entries","get","clear","getActiveInstances","Array","from","AptolixChatbotElement","HTMLElement","observedAttributes","connectedCallback","tryInit","attributeChangedCallback","_initialized","_reinitTimeout","targetAttr","customElements","define"],"mappings":"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"}