{"version":3,"file":"panel.cjs","sources":["../../src/debug/panel.ts"],"sourcesContent":["import { CloseCode } from \"@colyseus/shared-types\";\nimport { disconnectIcon, envelopeDown, envelopeUp, infoIcon, jitterIcon, logoIcon, messageIcon, resizeIcon, sizedIcon, treeViewIcon } from \"./icons.ts\";\nimport { applyPanelPosition, formatBytes, getBorderColor, getDebugRoot, getPanelStack, isPanelsHidden, preferences, PREDICT_CONTAINER_ID, repositionDebugPanels, roomDebugInfo, setCompactRevealed } from \"./core.ts\";\nimport { isCoarsePointer, isCompact, onReflow } from \"./layout.ts\";\nimport { createMenu } from \"./menu.ts\";\nimport { openSendMessagesModal } from \"./send-message.ts\";\nimport { openStateInspectorModal } from \"./state-inspector.ts\";\n\n\nexport function initialize() {\n    if (isPanelsHidden()) return;\n\n    var container = document.createElement('div');\n    container.id = 'debug-logo-container';\n    container.className = 'cds-surface';\n    container.style.position = 'fixed';\n    container.style.zIndex = '1000';\n    container.style.width = '21px';\n    container.style.height = '21px';\n    container.style.backgroundColor = 'rgba(0, 0, 0, 0.7)';\n    container.style.border = '3px solid ' + getBorderColor(preferences.latencySimulation.delay, 0.7);\n    container.style.borderRadius = '50%';\n    container.style.padding = '10px';\n    container.style.boxSizing = 'content-box';\n    container.style.display = 'flex';\n    container.style.justifyContent = 'center';\n    container.style.alignItems = 'center';\n    container.style.boxShadow = '0 2px 8px rgba(0, 0, 0, 0.3)';\n    container.style.transition = 'border-color 0.3s ease, background-color 0.3s ease, transform 0.12s ease';\n    container.style.cursor = 'pointer';\n\n    // Apply initial position\n    applyPanelPosition();\n\n    // container on hover effect\n    container.addEventListener('mouseenter', function() {\n        container.style.backgroundColor = 'rgba(0, 0, 0, 0.9)';\n        container.style.borderColor = getBorderColor(preferences.latencySimulation.delay, 0.9);\n    });\n    container.addEventListener('mouseleave', function() {\n        container.style.backgroundColor = 'rgba(0, 0, 0, 0.7)';\n        container.style.borderColor = getBorderColor(preferences.latencySimulation.delay, 0.7);\n    });\n\n    var icon = document.createElement('div');\n    icon.style.width = '100%';\n    icon.style.height = '100%';\n    icon.style.display = 'flex';\n    icon.style.justifyContent = 'center';\n    icon.style.alignItems = 'center';\n\n    // Use insertAdjacentHTML for better Safari compatibility with SVG\n    icon.insertAdjacentHTML('beforeend', logoIcon);\n\n    container.appendChild(icon);\n    getDebugRoot().appendChild(container);\n\n    // Create menu first\n    createMenu(container);\n\n    // Apply initial position after menu is created\n    applyPanelPosition();\n\n    watchPanelShape();\n    bindTooltipDismiss();\n}\n\n\n\n// Helper function to create debug panel for a room\nexport function createDebugPanel(uniquePanelId, debugInfo) {\n    // Check if panel already exists\n    var existingPanel = getDebugRoot().getElementById('debug-panel-' + uniquePanelId);\n    if (existingPanel) {\n        return existingPanel;\n    }\n\n    var panel = document.createElement('div');\n    panel.id = 'debug-panel-' + uniquePanelId;\n    panel.className = 'cds-surface';\n    // A flex child of the panel stack — the stack owns position and z-index.\n    panel.style.backgroundColor = 'rgba(0, 0, 0, 0.85)';\n    panel.style.color = '#fff';\n    panel.style.padding = '8px';\n    panel.style.borderRadius = '6px';\n    panel.style.fontFamily = 'monospace';\n    panel.style.fontSize = '11px';\n    panel.style.minWidth = '180px';\n    panel.style.pointerEvents = 'auto'; // the desktop stack is pointer-events:none\n    panel.style.flexShrink = '0'; // never squash inside the scrollable compact drawer\n    panel.style.boxShadow = '0 4px 12px rgba(0, 0, 0, 0.5)';\n    panel.style.display = isPanelsHidden() ? 'none' : 'block';\n\n    var title = document.createElement('div');\n    title.id = 'debug-title-' + uniquePanelId;\n    title.className = 'debug-title'; // `[id^=\"debug-title-\"]` would also catch debug-title-text-*\n    title.style.fontWeight = 'bold';\n    title.style.borderBottom = '1px solid rgba(255, 255, 255, 0.15)';\n    title.style.paddingBottom = '4px';\n    title.style.display = 'flex';\n    title.style.alignItems = 'center';\n    title.style.justifyContent = 'space-between';\n    title.style.gap = '8px';\n    title.style.position = 'relative';\n    title.innerHTML = '<span id=\"debug-title-text-' + uniquePanelId + '\"><span class=\"debug-room-name\"></span><span class=\"debug-info-icon\" style=\"display: inline-flex; align-items: center; margin-left: 4px; cursor: pointer; opacity: 0.6; vertical-align: middle;\">' + resizeIcon(infoIcon, 10) + '</span></span><span style=\"display:flex;align-items:center;gap:8px;font-weight:normal\"><span id=\"debug-ping-' + uniquePanelId + '\" style=\"font-size: 10px; color: #888;\" title=\"Ping time\">--</span><span class=\"debug-chevron\" style=\"color:#888;display:none\">▾</span></span>';\n\n    // Create tooltip for info button (will be shown on hover)\n    var tooltip = document.createElement('div');\n    tooltip.id = 'debug-tooltip-' + uniquePanelId;\n    tooltip.style.position = 'absolute';\n    tooltip.style.top = '100%';\n    tooltip.style.left = '0';\n    tooltip.style.marginTop = '4px';\n    tooltip.style.padding = '6px 8px';\n    tooltip.style.backgroundColor = 'rgba(0, 0, 0, 0.95)';\n    tooltip.style.color = '#fff';\n    tooltip.style.borderRadius = '4px';\n    tooltip.style.fontSize = '10px';\n    tooltip.style.fontFamily = 'monospace';\n    tooltip.style.zIndex = '1000';\n    tooltip.style.display = 'none';\n    tooltip.style.boxShadow = '0 2px 8px rgba(0, 0, 0, 0.5)';\n    tooltip.style.lineHeight = '1.4';\n    tooltip.innerHTML = '<div><strong>Room ID:</strong> ' + debugInfo.roomId + '</div><div><strong>Session ID:</strong> N/A</div>';\n\n    var content = document.createElement('div');\n    content.id = 'debug-content-' + uniquePanelId;\n\n    // Create action buttons container at the bottom\n    var actionsContainer = document.createElement('div');\n    actionsContainer.id = 'debug-actions-' + uniquePanelId;\n    actionsContainer.style.display = 'flex';\n    actionsContainer.style.gap = '4px';\n    actionsContainer.style.marginTop = '8px';\n    actionsContainer.style.paddingTop = '6px';\n    actionsContainer.style.borderTop = '1px solid rgba(255, 255, 255, 0.15)';\n    actionsContainer.style.position = 'relative';\n\n    // Helper function to create action button\n    function createActionButton(id, icon, label, onClick) {\n        var btn = document.createElement('button');\n        btn.id = id;\n        btn.className = 'cds-hit';\n        btn.style.display = 'flex';\n        btn.style.alignItems = 'center';\n        btn.style.justifyContent = 'center';\n        btn.style.gap = '4px';\n        btn.style.padding = '4px 8px';\n        btn.style.border = '1px solid rgba(255, 255, 255, 0.2)';\n        btn.style.borderRadius = '4px';\n        btn.style.background = 'rgba(255, 255, 255, 0.05)';\n        btn.style.color = '#fff';\n        btn.style.fontSize = '9px';\n        btn.style.cursor = 'pointer';\n        btn.style.transition = 'background 0.2s, border-color 0.2s';\n        btn.innerHTML = sizedIcon(icon, 12) + '<span>' + label + '</span>';\n\n        btn.addEventListener('mouseenter', function() {\n            btn.style.background = 'rgba(255, 255, 255, 0.15)';\n            btn.style.borderColor = 'rgba(255, 255, 255, 0.3)';\n        });\n        btn.addEventListener('mouseleave', function() {\n            btn.style.background = 'rgba(255, 255, 255, 0.05)';\n            btn.style.borderColor = 'rgba(255, 255, 255, 0.2)';\n        });\n        btn.addEventListener('click', function(e) {\n            e.stopPropagation();\n            onClick();\n        });\n\n        return btn;\n    }\n\n    // Create action buttons\n    var stateBtn = createActionButton(\n        'debug-state-btn-' + uniquePanelId,\n        treeViewIcon,\n        'State',\n        function() { openStateInspectorModal(uniquePanelId); }\n    );\n\n    var messageBtn = createActionButton(\n        'debug-message-btn-' + uniquePanelId,\n        messageIcon,\n        'Send',\n        function() { openSendMessagesModal(uniquePanelId); }\n    );\n    messageBtn.style.display = 'none'; // Hidden by default, shown when message types available\n\n    // Create disconnect button (red, simulates abnormal websocket close)\n    var disconnectBtn = createActionButton(\n        'debug-disconnect-btn-' + uniquePanelId,\n        disconnectIcon,\n        'Drop',\n        function() {\n            var info = roomDebugInfo.get(uniquePanelId);\n            if (info && info.room && info.room.connection) {\n                // Simulate connection closure\n                info.room.connection.close(CloseCode.MAY_TRY_RECONNECT);\n            }\n        }\n    );\n\n    // Track button state for hover effects\n    var isReconnecting = false;\n\n    // Helper to apply normal (red) button style\n    function applyNormalStyle() {\n        disconnectBtn.style.background = 'rgba(239, 68, 68, 0.2)';\n        disconnectBtn.style.borderColor = 'rgba(239, 68, 68, 0.5)';\n        disconnectBtn.style.color = '#ef4444';\n        disconnectBtn.style.animation = '';\n        disconnectBtn.style.pointerEvents = 'auto';\n        disconnectBtn.style.opacity = '1';\n        var labelSpan = disconnectBtn.querySelector('span:last-child') as HTMLElement;\n        if (labelSpan) labelSpan.textContent = 'Drop';\n    }\n\n    // Helper to apply reconnecting (orange/pulsing) button style\n    function applyReconnectingStyle() {\n        disconnectBtn.style.background = 'rgba(251, 146, 60, 0.3)';\n        disconnectBtn.style.borderColor = 'rgba(251, 146, 60, 0.6)';\n        disconnectBtn.style.color = '#fb923c';\n        disconnectBtn.style.animation = 'debug-pulse 1.5s ease-in-out infinite';\n        disconnectBtn.style.pointerEvents = 'none';\n        disconnectBtn.style.opacity = '0.8';\n        var labelSpan = disconnectBtn.querySelector('span:last-child') as HTMLElement;\n        if (labelSpan) labelSpan.textContent = 'Reconnecting...';\n    }\n\n    // Apply initial style (the debug-pulse keyframes live in the base sheet)\n    applyNormalStyle();\n\n    // Register onDrop callback to show reconnecting state\n    if (debugInfo.room) {\n        debugInfo.room.onDrop(function() {\n            isReconnecting = true;\n            applyReconnectingStyle();\n        });\n\n        // Register onReconnect callback to restore normal state\n        debugInfo.room.onReconnect(function() {\n            isReconnecting = false;\n            applyNormalStyle();\n        });\n    }\n\n    // Hover effects (only when not reconnecting)\n    disconnectBtn.addEventListener('mouseenter', function() {\n        if (!isReconnecting) {\n            disconnectBtn.style.background = 'rgba(239, 68, 68, 0.35)';\n            disconnectBtn.style.borderColor = 'rgba(239, 68, 68, 0.7)';\n        }\n    });\n    disconnectBtn.addEventListener('mouseleave', function() {\n        if (!isReconnecting) {\n            disconnectBtn.style.background = 'rgba(239, 68, 68, 0.2)';\n            disconnectBtn.style.borderColor = 'rgba(239, 68, 68, 0.5)';\n        }\n    });\n\n    title.appendChild(tooltip);\n    var infoIconEl = title.querySelector('.debug-info-icon') as HTMLElement;\n    var tooltipTimeout: any = null;\n    var showTooltip = function() {\n        if (tooltipTimeout) { clearTimeout(tooltipTimeout); tooltipTimeout = null; }\n        tooltip.style.display = 'block';\n    };\n    var hideTooltip = function() {\n        tooltipTimeout = setTimeout(function() {\n            tooltip.style.display = 'none';\n        }, 100);\n    };\n    tooltip.style.pointerEvents = 'auto';\n\n    if (infoIconEl) {\n        // On touch, `mouseenter` fires on tap and no `mouseleave` ever follows, so a\n        // hover tooltip sticks open forever. Room/session ids are worth surfacing on\n        // a phone, so tap toggles it rather than suppressing it. The click stops here\n        // — that is what keeps the outside-tap dismissal from immediately undoing it.\n        infoIconEl.addEventListener('click', function(e) {\n            e.stopPropagation();\n            if (!isCoarsePointer()) { return; }\n            tooltip.style.display = (tooltip.style.display === 'block') ? 'none' : 'block';\n        });\n        infoIconEl.addEventListener('mouseenter', function() {\n            if (!isCoarsePointer()) { showTooltip(); }\n        });\n        infoIconEl.addEventListener('mouseleave', function() {\n            if (!isCoarsePointer()) { hideTooltip(); }\n        });\n        tooltip.addEventListener('mouseenter', showTooltip);\n        tooltip.addEventListener('mouseleave', function() {\n            if (!isCoarsePointer()) { hideTooltip(); }\n        });\n    }\n\n    actionsContainer.appendChild(stateBtn);\n    actionsContainer.appendChild(messageBtn);\n    actionsContainer.appendChild(disconnectBtn);\n\n    // Collapsible body: on a phone each room reduces to its title row (a chip) and\n    // opens on tap. `content` stays the same element, so updateDebugPanel()'s\n    // per-second innerHTML rewrite is unaffected.\n    var body = document.createElement('div');\n    body.id = 'debug-body-' + uniquePanelId;\n    body.style.marginTop = '6px';\n    body.appendChild(content);\n    body.appendChild(actionsContainer);\n\n    panel.appendChild(title);\n    panel.appendChild(body);\n\n    // Deliberately does not stop propagation: the click still needs to reach the\n    // document listeners that close the menu and dismiss open tooltips.\n    title.addEventListener('click', function() {\n        if (!isCompact()) { return; } // desktop: always expanded, header inert\n        setPanelExpanded(panel, panel.dataset.expanded !== '1');\n    });\n\n    setPanelExpanded(panel, true);\n\n    // Creation order — oldest nearest the logo. In compact the Predict card is the\n    // drawer's last child, so rooms have to go in ahead of it.\n    var stack = getPanelStack();\n    stack.insertBefore(panel, stack.querySelector('#' + PREDICT_CONTAINER_ID));\n\n    return panel;\n}\n\n\n// Chip ⇄ full panel. The chevron only makes sense where the header is tappable.\nfunction setPanelExpanded(panel: HTMLElement, expanded: boolean) {\n    var body = panel.querySelector('[id^=\"debug-body-\"]') as HTMLElement;\n    var title = panel.querySelector('.debug-title') as HTMLElement;\n    var chevron = panel.querySelector('.debug-chevron') as HTMLElement;\n    var compact = isCompact();\n\n    panel.dataset.expanded = expanded ? '1' : '0';\n    if (body) { body.style.display = expanded ? 'block' : 'none'; }\n    if (title) {\n        title.style.cursor = compact ? 'pointer' : 'default';\n        title.style.borderBottomColor = expanded ? 'rgba(255, 255, 255, 0.15)' : 'transparent';\n        title.style.paddingBottom = expanded ? '4px' : '0';\n    }\n    if (chevron) {\n        chevron.style.display = compact ? 'inline' : 'none';\n        chevron.textContent = expanded ? '▾' : '▸';\n    }\n}\n\n\n// Any tap outside an open info tooltip closes it. The icon that opens one stops the\n// click there, so this never fires for the very tap that opened the tooltip.\nfunction bindTooltipDismiss() {\n    document.addEventListener('click', function() {\n        var tooltips = getDebugRoot().querySelectorAll('[id^=\"debug-tooltip-\"]') as NodeListOf<HTMLElement>;\n        tooltips.forEach(function(tooltip) { tooltip.style.display = 'none'; });\n    });\n}\n\n\n// Reshape the panels only when the breakpoint actually flips. reflow() also fires on\n// every plain resize — including the mobile URL bar sliding away mid-scroll — and\n// re-running this each time would reopen a panel the user just collapsed, or re-hide\n// the drawer they just revealed.\nfunction watchPanelShape() {\n    var wasCompact = isCompact();\n    onReflow(function(state) {\n        if (state.compact === wasCompact) { return; }\n        wasCompact = state.compact;\n        // Entering compact hands the screen back to the game until the logo is tapped.\n        if (state.compact) { setCompactRevealed(false); }\n        // Reopen everything: the chevron only exists in compact, so a panel collapsed\n        // there would have no way back once the header goes inert on desktop.\n        var panels = getDebugRoot().querySelectorAll('[id^=\"debug-panel-\"]') as NodeListOf<HTMLElement>;\n        panels.forEach(function(panel) { setPanelExpanded(panel, true); });\n    });\n}\n\n\n// Update debug panel content\nexport function updateDebugPanel(uniquePanelId, debugInfo) {\n    var root = getDebugRoot();\n    var contentId = 'debug-content-' + uniquePanelId;\n    var panelId = 'debug-panel-' + uniquePanelId;\n    var titleId = 'debug-title-' + uniquePanelId;\n    var content = root.getElementById(contentId);\n    var panel = root.getElementById(panelId);\n    var title = root.getElementById(titleId);\n\n    if (!content || !panel) {\n        // Only create if panel doesn't exist\n        if (!panel) {\n            createDebugPanel(uniquePanelId, debugInfo);\n            content = root.getElementById(contentId);\n            title = root.getElementById(titleId);\n            repositionDebugPanels();\n        } else {\n            content = root.getElementById(contentId);\n            title = root.getElementById(titleId);\n        }\n    }\n\n    // Update title with room name only (roomId and sessionId are in tooltip)\n    var titleTextEl = root.getElementById('debug-title-text-' + uniquePanelId);\n    var roomNameEl = titleTextEl?.querySelector('.debug-room-name');\n    if (roomNameEl) roomNameEl.textContent = debugInfo.roomName;\n    root.getElementById('debug-tooltip-' + uniquePanelId).innerHTML = '<div><strong>Room ID:</strong> ' + debugInfo.roomId + '</div><div><strong>Session ID:</strong> ' + debugInfo.sessionId + '</div>';\n\n    // Update ping in header\n    var pingDisplay = debugInfo.pingMs !== null ? debugInfo.pingMs + 'ms' : '--';\n    var pingColor = debugInfo.pingMs !== null ? (debugInfo.pingMs < 100 ? '#22c55e' : debugInfo.pingMs < 200 ? '#eab308' : '#ef4444') : '#888';\n    var pingElement = root.getElementById('debug-ping-' + uniquePanelId);\n    if (pingElement) {\n        pingElement.textContent = pingDisplay;\n        pingElement.style.color = pingColor;\n    }\n\n    // Connection jitter (RoomClock.jitter) — only TIMED rooms advertise a patch\n    // cadence, so non-input/NULL_CLOCK rooms (patchInterval 0) hide the row. Rendered\n    // as its own stat row below — not in the header, which stays latency-only.\n    var clock = debugInfo.room && debugInfo.room.clock;\n    var hasJitter = !!(clock && typeof clock.jitter === 'function' && typeof clock.patchInterval === 'function' && clock.patchInterval() > 0);\n    var jitterMs = hasJitter ? clock.jitter() : 0;\n    var jitterText = (jitterMs < 10 ? jitterMs.toFixed(1) : jitterMs.toFixed(0)) + 'ms';\n\n    var jitterAccent = '#a78bfa'; // violet — signature color for the jitter stat (icon + graph)\n\n    var html = '<div style=\"line-height: 1.3;\">';\n    html += '<div style=\"font-size: 10px; display: flex; gap: 8px;\">';\n    html += '<div style=\"flex: 1;\">';\n    html += '<div style=\"margin-bottom: 4px;\"><div style=\"display: flex; align-items: center; gap: 6px;\"><span style=\"display: inline-flex; align-items: center; width: 18px; height: 18px; color: #FF9800;\">' + envelopeUp + '</span><span style=\"color: #FF9800;\">' + formatBytes(debugInfo.bytesSentPerSec) + '/s</span></div><div style=\"margin-left: 24px; opacity: 0.7; font-size: 9px;\">' + debugInfo.messagesSentPerSec.toFixed(0) + ' messages</div></div>';\n    html += '<div' + (hasJitter ? ' style=\"margin-bottom: 4px;\"' : '') + '><div style=\"display: flex; align-items: center; gap: 6px;\"><span style=\"display: inline-flex; align-items: center; width: 18px; height: 18px; color: #2196F3;\">' + envelopeDown + '</span><span style=\"color: #2196F3;\">' + formatBytes(debugInfo.bytesReceivedPerSec) + '/s</span></div><div style=\"margin-left: 24px; opacity: 0.7; font-size: 9px;\">' + debugInfo.messagesReceivedPerSec.toFixed(0) + ' messages</div></div>';\n    // Jitter: third stat row, same shape as sent/received (icon + label, value below).\n    if (hasJitter) {\n        html += '<div><div style=\"display: flex; align-items: center; gap: 6px;\"><span style=\"display: inline-flex; align-items: center; width: 18px; height: 18px; color: ' + jitterAccent + ';\">' + jitterIcon + '</span><span style=\"color: ' + jitterAccent + ';\">jitter</span></div><div style=\"margin-left: 24px; opacity: 0.7; font-size: 9px;\">±' + jitterText + '</div></div>';\n    }\n    html += '</div>';\n    html += '<div style=\"display: flex; flex-direction: column; gap: 4px; align-items: flex-end;\">';\n    html += '<canvas id=\"graph-sent-' + uniquePanelId + '\" width=\"80\" height=\"30\" style=\"display: block;\"></canvas>';\n    html += '<canvas id=\"graph-received-' + uniquePanelId + '\" width=\"80\" height=\"30\" style=\"display: block;\"></canvas>';\n    if (hasJitter) {\n        html += '<canvas id=\"graph-jitter-' + uniquePanelId + '\" width=\"80\" height=\"30\" style=\"display: block;\"></canvas>';\n    }\n    html += '</div>';\n    html += '</div>';\n    html += '</div>';\n\n    content.innerHTML = html;\n\n    // Draw graphs after a short delay to ensure canvas elements are rendered\n    setTimeout(function() {\n        drawGraph('graph-sent-' + uniquePanelId, debugInfo.bytesSentHistory, '#FF9800');\n        drawGraph('graph-received-' + uniquePanelId, debugInfo.bytesReceivedHistory, '#2196F3');\n        if (hasJitter) drawGraph('graph-jitter-' + uniquePanelId, debugInfo.jitterHistory, jitterAccent);\n    }, 10);\n}\n\n\n// Draw graph on canvas\nexport function drawGraph(canvasId, data, color) {\n    var canvas = getDebugRoot().getElementById(canvasId) as HTMLCanvasElement;\n    if (!canvas) return;\n\n    var ctx = canvas.getContext('2d') as CanvasRenderingContext2D;\n    var width = canvas.width;\n    var height = canvas.height;\n\n    // Clear canvas\n    ctx.clearRect(0, 0, width, height);\n\n    if (!data || data.length === 0) return;\n\n    // Find min and max values\n    var maxValue = Math.max.apply(Math, data);\n    var minValue = Math.min.apply(Math, data);\n    var range = maxValue - minValue || 1; // Avoid division by zero\n\n    // Padding\n    var padding = 2;\n    var graphWidth = width - padding * 2;\n    var graphHeight = height - padding * 2;\n\n    // Draw grid lines\n    ctx.strokeStyle = 'rgba(255, 255, 255, 0.1)';\n    ctx.lineWidth = 0.5;\n    for (var i = 0; i <= 4; i++) {\n        var y = padding + (graphHeight / 4) * i;\n        ctx.beginPath();\n        ctx.moveTo(padding, y);\n        ctx.lineTo(width - padding, y);\n        ctx.stroke();\n    }\n\n    // Draw the line\n    ctx.strokeStyle = color;\n    ctx.lineWidth = 1.5;\n    ctx.beginPath();\n\n    for (var i = 0; i < data.length; i++) {\n        var x = padding + (graphWidth / (data.length - 1 || 1)) * i;\n        var normalizedValue = (data[i] - minValue) / range;\n        var y = padding + graphHeight - (normalizedValue * graphHeight);\n\n        if (i === 0) {\n            ctx.moveTo(x, y);\n        } else {\n            ctx.lineTo(x, y);\n        }\n    }\n\n    ctx.stroke();\n\n    // Fill area under the line\n    if (data.length > 0) {\n        ctx.lineTo(width - padding, height - padding);\n        ctx.lineTo(padding, height - padding);\n        ctx.closePath();\n        ctx.fillStyle = color;\n        ctx.globalAlpha = 0.2;\n        ctx.fill();\n        ctx.globalAlpha = 1.0;\n    }\n}\n\n\n// Calculate per-second rates\nexport function calculateRates(debugInfo) {\n    var now = Date.now();\n    var elapsed = (now - debugInfo.lastUpdate) / 1000; // seconds\n\n    if (elapsed > 0) {\n        debugInfo.bytesSentPerSec = debugInfo.bytesSentDelta / elapsed;\n        debugInfo.bytesReceivedPerSec = debugInfo.bytesReceivedDelta / elapsed;\n        debugInfo.messagesSentPerSec = debugInfo.messagesSentDelta / elapsed;\n        debugInfo.messagesReceivedPerSec = debugInfo.messagesReceivedDelta / elapsed;\n\n        // Add to history\n        debugInfo.bytesSentHistory.push(debugInfo.bytesSentPerSec);\n        debugInfo.bytesReceivedHistory.push(debugInfo.bytesReceivedPerSec);\n        // debugInfo.historyTimestamps.push(now);\n\n        // Snapshot the clock's jitter EMA into the history ring (TIMED rooms only).\n        var jitterClock = debugInfo.room && debugInfo.room.clock;\n        if (jitterClock && typeof jitterClock.jitter === 'function' && typeof jitterClock.patchInterval === 'function' && jitterClock.patchInterval() > 0) {\n            debugInfo.jitterHistory.push(jitterClock.jitter());\n        }\n\n        // Limit history length\n        var maxLen = debugInfo.maxHistoryLength || 60;\n        if (debugInfo.bytesSentHistory.length > maxLen) {\n            debugInfo.bytesSentHistory.shift();\n            debugInfo.bytesReceivedHistory.shift();\n            // debugInfo.historyTimestamps.shift();\n        }\n        if (debugInfo.jitterHistory.length > maxLen) {\n            debugInfo.jitterHistory.shift();\n        }\n\n        // Reset deltas\n        debugInfo.bytesSentDelta = 0;\n        debugInfo.bytesReceivedDelta = 0;\n        debugInfo.messagesSentDelta = 0;\n        debugInfo.messagesReceivedDelta = 0;\n        debugInfo.lastUpdate = now;\n    }\n\n    // Update panel\n    updateDebugPanel(debugInfo.uniquePanelId, debugInfo);\n}\n"],"names":["isPanelsHidden","getBorderColor","preferences","applyPanelPosition","logoIcon","getDebugRoot","createMenu","resizeIcon","infoIcon","sizedIcon","treeViewIcon","openStateInspectorModal","messageIcon","openSendMessagesModal","disconnectIcon","roomDebugInfo","CloseCode","isCoarsePointer","isCompact","getPanelStack","PREDICT_CONTAINER_ID","onReflow","setCompactRevealed","repositionDebugPanels","envelopeUp","formatBytes","envelopeDown","jitterIcon"],"mappings":";;;;;;;;;;;;;;;;SASgB,UAAU,GAAA;AACtB,IAAA,IAAIA,mBAAc,EAAE;QAAE;IAEtB,IAAI,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC7C,IAAA,SAAS,CAAC,EAAE,GAAG,sBAAsB;AACrC,IAAA,SAAS,CAAC,SAAS,GAAG,aAAa;AACnC,IAAA,SAAS,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO;AAClC,IAAA,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;AAC/B,IAAA,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;AAC9B,IAAA,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;AAC/B,IAAA,SAAS,CAAC,KAAK,CAAC,eAAe,GAAG,oBAAoB;AACtD,IAAA,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,YAAY,GAAGC,mBAAc,CAACC,gBAAW,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC;AAChG,IAAA,SAAS,CAAC,KAAK,CAAC,YAAY,GAAG,KAAK;AACpC,IAAA,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;AAChC,IAAA,SAAS,CAAC,KAAK,CAAC,SAAS,GAAG,aAAa;AACzC,IAAA,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;AAChC,IAAA,SAAS,CAAC,KAAK,CAAC,cAAc,GAAG,QAAQ;AACzC,IAAA,SAAS,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ;AACrC,IAAA,SAAS,CAAC,KAAK,CAAC,SAAS,GAAG,8BAA8B;AAC1D,IAAA,SAAS,CAAC,KAAK,CAAC,UAAU,GAAG,0EAA0E;AACvG,IAAA,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS;;AAGlC,IAAAC,uBAAkB,EAAE;;AAGpB,IAAA,SAAS,CAAC,gBAAgB,CAAC,YAAY,EAAE,YAAA;AACrC,QAAA,SAAS,CAAC,KAAK,CAAC,eAAe,GAAG,oBAAoB;AACtD,QAAA,SAAS,CAAC,KAAK,CAAC,WAAW,GAAGF,mBAAc,CAACC,gBAAW,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC;AAC1F,IAAA,CAAC,CAAC;AACF,IAAA,SAAS,CAAC,gBAAgB,CAAC,YAAY,EAAE,YAAA;AACrC,QAAA,SAAS,CAAC,KAAK,CAAC,eAAe,GAAG,oBAAoB;AACtD,QAAA,SAAS,CAAC,KAAK,CAAC,WAAW,GAAGD,mBAAc,CAACC,gBAAW,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC;AAC1F,IAAA,CAAC,CAAC;IAEF,IAAI,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACxC,IAAA,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;AACzB,IAAA,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;AAC1B,IAAA,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;AAC3B,IAAA,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,QAAQ;AACpC,IAAA,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ;;AAGhC,IAAA,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAEE,cAAQ,CAAC;AAE9C,IAAA,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC;AAC3B,IAAAC,iBAAY,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC;;IAGrCC,eAAU,CAAC,SAAS,CAAC;;AAGrB,IAAAH,uBAAkB,EAAE;AAEpB,IAAA,eAAe,EAAE;AACjB,IAAA,kBAAkB,EAAE;AACxB;AAIA;AACM,SAAU,gBAAgB,CAAC,aAAa,EAAE,SAAS,EAAA;;IAErD,IAAI,aAAa,GAAGE,iBAAY,EAAE,CAAC,cAAc,CAAC,cAAc,GAAG,aAAa,CAAC;IACjF,IAAI,aAAa,EAAE;AACf,QAAA,OAAO,aAAa;IACxB;IAEA,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACzC,IAAA,KAAK,CAAC,EAAE,GAAG,cAAc,GAAG,aAAa;AACzC,IAAA,KAAK,CAAC,SAAS,GAAG,aAAa;;AAE/B,IAAA,KAAK,CAAC,KAAK,CAAC,eAAe,GAAG,qBAAqB;AACnD,IAAA,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;AAC1B,IAAA,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK;AAC3B,IAAA,KAAK,CAAC,KAAK,CAAC,YAAY,GAAG,KAAK;AAChC,IAAA,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,WAAW;AACpC,IAAA,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,MAAM;AAC7B,IAAA,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO;IAC9B,KAAK,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC;IACnC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC;AAC7B,IAAA,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,+BAA+B;AACvD,IAAA,KAAK,CAAC,KAAK,CAAC,OAAO,GAAGL,mBAAc,EAAE,GAAG,MAAM,GAAG,OAAO;IAEzD,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACzC,IAAA,KAAK,CAAC,EAAE,GAAG,cAAc,GAAG,aAAa;AACzC,IAAA,KAAK,CAAC,SAAS,GAAG,aAAa,CAAC;AAChC,IAAA,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM;AAC/B,IAAA,KAAK,CAAC,KAAK,CAAC,YAAY,GAAG,qCAAqC;AAChE,IAAA,KAAK,CAAC,KAAK,CAAC,aAAa,GAAG,KAAK;AACjC,IAAA,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;AAC5B,IAAA,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ;AACjC,IAAA,KAAK,CAAC,KAAK,CAAC,cAAc,GAAG,eAAe;AAC5C,IAAA,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK;AACvB,IAAA,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;IACjC,KAAK,CAAC,SAAS,GAAG,6BAA6B,GAAG,aAAa,GAAG,mMAAmM,GAAGO,gBAAU,CAACC,cAAQ,EAAE,EAAE,CAAC,GAAG,8GAA8G,GAAG,aAAa,GAAG,gJAAgJ;;IAGpjB,IAAI,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC3C,IAAA,OAAO,CAAC,EAAE,GAAG,gBAAgB,GAAG,aAAa;AAC7C,IAAA,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;AACnC,IAAA,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,MAAM;AAC1B,IAAA,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG;AACxB,IAAA,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK;AAC/B,IAAA,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,SAAS;AACjC,IAAA,OAAO,CAAC,KAAK,CAAC,eAAe,GAAG,qBAAqB;AACrD,IAAA,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;AAC5B,IAAA,OAAO,CAAC,KAAK,CAAC,YAAY,GAAG,KAAK;AAClC,IAAA,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,MAAM;AAC/B,IAAA,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,WAAW;AACtC,IAAA,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;AAC7B,IAAA,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;AAC9B,IAAA,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,8BAA8B;AACxD,IAAA,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK;IAChC,OAAO,CAAC,SAAS,GAAG,iCAAiC,GAAG,SAAS,CAAC,MAAM,GAAG,mDAAmD;IAE9H,IAAI,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC3C,IAAA,OAAO,CAAC,EAAE,GAAG,gBAAgB,GAAG,aAAa;;IAG7C,IAAI,gBAAgB,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACpD,IAAA,gBAAgB,CAAC,EAAE,GAAG,gBAAgB,GAAG,aAAa;AACtD,IAAA,gBAAgB,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;AACvC,IAAA,gBAAgB,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK;AAClC,IAAA,gBAAgB,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK;AACxC,IAAA,gBAAgB,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK;AACzC,IAAA,gBAAgB,CAAC,KAAK,CAAC,SAAS,GAAG,qCAAqC;AACxE,IAAA,gBAAgB,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;;IAG5C,SAAS,kBAAkB,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAA;QAChD,IAAI,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AAC1C,QAAA,GAAG,CAAC,EAAE,GAAG,EAAE;AACX,QAAA,GAAG,CAAC,SAAS,GAAG,SAAS;AACzB,QAAA,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;AAC1B,QAAA,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ;AAC/B,QAAA,GAAG,CAAC,KAAK,CAAC,cAAc,GAAG,QAAQ;AACnC,QAAA,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK;AACrB,QAAA,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,SAAS;AAC7B,QAAA,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,oCAAoC;AACvD,QAAA,GAAG,CAAC,KAAK,CAAC,YAAY,GAAG,KAAK;AAC9B,QAAA,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,2BAA2B;AAClD,QAAA,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;AACxB,QAAA,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK;AAC1B,QAAA,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS;AAC5B,QAAA,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,oCAAoC;AAC3D,QAAA,GAAG,CAAC,SAAS,GAAGC,eAAS,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS;AAElE,QAAA,GAAG,CAAC,gBAAgB,CAAC,YAAY,EAAE,YAAA;AAC/B,YAAA,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,2BAA2B;AAClD,YAAA,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,0BAA0B;AACtD,QAAA,CAAC,CAAC;AACF,QAAA,GAAG,CAAC,gBAAgB,CAAC,YAAY,EAAE,YAAA;AAC/B,YAAA,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,2BAA2B;AAClD,YAAA,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,0BAA0B;AACtD,QAAA,CAAC,CAAC;AACF,QAAA,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAS,CAAC,EAAA;YACpC,CAAC,CAAC,eAAe,EAAE;AACnB,YAAA,OAAO,EAAE;AACb,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,GAAG;IACd;;IAGA,IAAI,QAAQ,GAAG,kBAAkB,CAC7B,kBAAkB,GAAG,aAAa,EAClCC,kBAAY,EACZ,OAAO,EACP,YAAA,EAAaC,sCAAuB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CACzD;IAED,IAAI,UAAU,GAAG,kBAAkB,CAC/B,oBAAoB,GAAG,aAAa,EACpCC,iBAAW,EACX,MAAM,EACN,YAAA,EAAaC,iCAAqB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CACvD;IACD,UAAU,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;;IAGlC,IAAI,aAAa,GAAG,kBAAkB,CAClC,uBAAuB,GAAG,aAAa,EACvCC,oBAAc,EACd,MAAM,EACN,YAAA;QACI,IAAI,IAAI,GAAGC,kBAAa,CAAC,GAAG,CAAC,aAAa,CAAC;AAC3C,QAAA,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;;YAE3C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAACC,qBAAS,CAAC,iBAAiB,CAAC;QAC3D;AACJ,IAAA,CAAC,CACJ;;IAGD,IAAI,cAAc,GAAG,KAAK;;AAG1B,IAAA,SAAS,gBAAgB,GAAA;AACrB,QAAA,aAAa,CAAC,KAAK,CAAC,UAAU,GAAG,wBAAwB;AACzD,QAAA,aAAa,CAAC,KAAK,CAAC,WAAW,GAAG,wBAAwB;AAC1D,QAAA,aAAa,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS;AACrC,QAAA,aAAa,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE;AAClC,QAAA,aAAa,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM;AAC1C,QAAA,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;QACjC,IAAI,SAAS,GAAG,aAAa,CAAC,aAAa,CAAC,iBAAiB,CAAgB;AAC7E,QAAA,IAAI,SAAS;AAAE,YAAA,SAAS,CAAC,WAAW,GAAG,MAAM;IACjD;;AAGA,IAAA,SAAS,sBAAsB,GAAA;AAC3B,QAAA,aAAa,CAAC,KAAK,CAAC,UAAU,GAAG,yBAAyB;AAC1D,QAAA,aAAa,CAAC,KAAK,CAAC,WAAW,GAAG,yBAAyB;AAC3D,QAAA,aAAa,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS;AACrC,QAAA,aAAa,CAAC,KAAK,CAAC,SAAS,GAAG,uCAAuC;AACvE,QAAA,aAAa,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM;AAC1C,QAAA,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK;QACnC,IAAI,SAAS,GAAG,aAAa,CAAC,aAAa,CAAC,iBAAiB,CAAgB;AAC7E,QAAA,IAAI,SAAS;AAAE,YAAA,SAAS,CAAC,WAAW,GAAG,iBAAiB;IAC5D;;AAGA,IAAA,gBAAgB,EAAE;;AAGlB,IAAA,IAAI,SAAS,CAAC,IAAI,EAAE;AAChB,QAAA,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,YAAA;YAClB,cAAc,GAAG,IAAI;AACrB,YAAA,sBAAsB,EAAE;AAC5B,QAAA,CAAC,CAAC;;AAGF,QAAA,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,YAAA;YACvB,cAAc,GAAG,KAAK;AACtB,YAAA,gBAAgB,EAAE;AACtB,QAAA,CAAC,CAAC;IACN;;AAGA,IAAA,aAAa,CAAC,gBAAgB,CAAC,YAAY,EAAE,YAAA;QACzC,IAAI,CAAC,cAAc,EAAE;AACjB,YAAA,aAAa,CAAC,KAAK,CAAC,UAAU,GAAG,yBAAyB;AAC1D,YAAA,aAAa,CAAC,KAAK,CAAC,WAAW,GAAG,wBAAwB;QAC9D;AACJ,IAAA,CAAC,CAAC;AACF,IAAA,aAAa,CAAC,gBAAgB,CAAC,YAAY,EAAE,YAAA;QACzC,IAAI,CAAC,cAAc,EAAE;AACjB,YAAA,aAAa,CAAC,KAAK,CAAC,UAAU,GAAG,wBAAwB;AACzD,YAAA,aAAa,CAAC,KAAK,CAAC,WAAW,GAAG,wBAAwB;QAC9D;AACJ,IAAA,CAAC,CAAC;AAEF,IAAA,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC;IAC1B,IAAI,UAAU,GAAG,KAAK,CAAC,aAAa,CAAC,kBAAkB,CAAgB;IACvE,IAAI,cAAc,GAAQ,IAAI;AAC9B,IAAA,IAAI,WAAW,GAAG,YAAA;QACd,IAAI,cAAc,EAAE;YAAE,YAAY,CAAC,cAAc,CAAC;YAAE,cAAc,GAAG,IAAI;QAAE;AAC3E,QAAA,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO;AACnC,IAAA,CAAC;AACD,IAAA,IAAI,WAAW,GAAG,YAAA;QACd,cAAc,GAAG,UAAU,CAAC,YAAA;AACxB,YAAA,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;QAClC,CAAC,EAAE,GAAG,CAAC;AACX,IAAA,CAAC;AACD,IAAA,OAAO,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM;IAEpC,IAAI,UAAU,EAAE;;;;;AAKZ,QAAA,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAS,CAAC,EAAA;YAC3C,CAAC,CAAC,eAAe,EAAE;AACnB,YAAA,IAAI,CAACC,sBAAe,EAAE,EAAE;gBAAE;YAAQ;YAClC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,KAAK,OAAO,IAAI,MAAM,GAAG,OAAO;AAClF,QAAA,CAAC,CAAC;AACF,QAAA,UAAU,CAAC,gBAAgB,CAAC,YAAY,EAAE,YAAA;AACtC,YAAA,IAAI,CAACA,sBAAe,EAAE,EAAE;AAAE,gBAAA,WAAW,EAAE;YAAE;AAC7C,QAAA,CAAC,CAAC;AACF,QAAA,UAAU,CAAC,gBAAgB,CAAC,YAAY,EAAE,YAAA;AACtC,YAAA,IAAI,CAACA,sBAAe,EAAE,EAAE;AAAE,gBAAA,WAAW,EAAE;YAAE;AAC7C,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,CAAC,gBAAgB,CAAC,YAAY,EAAE,WAAW,CAAC;AACnD,QAAA,OAAO,CAAC,gBAAgB,CAAC,YAAY,EAAE,YAAA;AACnC,YAAA,IAAI,CAACA,sBAAe,EAAE,EAAE;AAAE,gBAAA,WAAW,EAAE;YAAE;AAC7C,QAAA,CAAC,CAAC;IACN;AAEA,IAAA,gBAAgB,CAAC,WAAW,CAAC,QAAQ,CAAC;AACtC,IAAA,gBAAgB,CAAC,WAAW,CAAC,UAAU,CAAC;AACxC,IAAA,gBAAgB,CAAC,WAAW,CAAC,aAAa,CAAC;;;;IAK3C,IAAI,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACxC,IAAA,IAAI,CAAC,EAAE,GAAG,aAAa,GAAG,aAAa;AACvC,IAAA,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK;AAC5B,IAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;AACzB,IAAA,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;AAElC,IAAA,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC;AACxB,IAAA,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;;;AAIvB,IAAA,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAA;AAC5B,QAAA,IAAI,CAACC,gBAAS,EAAE,EAAE;YAAE;AAAQ,QAAA,CAAC;QAC7B,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,GAAG,CAAC;AAC3D,IAAA,CAAC,CAAC;AAEF,IAAA,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC;;;AAI7B,IAAA,IAAI,KAAK,GAAGC,kBAAa,EAAE;AAC3B,IAAA,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,GAAGC,yBAAoB,CAAC,CAAC;AAE1E,IAAA,OAAO,KAAK;AAChB;AAGA;AACA,SAAS,gBAAgB,CAAC,KAAkB,EAAE,QAAiB,EAAA;IAC3D,IAAI,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC,qBAAqB,CAAgB;IACpE,IAAI,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC,cAAc,CAAgB;IAC9D,IAAI,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,gBAAgB,CAAgB;AAClE,IAAA,IAAI,OAAO,GAAGF,gBAAS,EAAE;AAEzB,IAAA,KAAK,CAAC,OAAO,CAAC,QAAQ,GAAG,QAAQ,GAAG,GAAG,GAAG,GAAG;IAC7C,IAAI,IAAI,EAAE;AAAE,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM;IAAE;IAC9D,IAAI,KAAK,EAAE;AACP,QAAA,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS;AACpD,QAAA,KAAK,CAAC,KAAK,CAAC,iBAAiB,GAAG,QAAQ,GAAG,2BAA2B,GAAG,aAAa;AACtF,QAAA,KAAK,CAAC,KAAK,CAAC,aAAa,GAAG,QAAQ,GAAG,KAAK,GAAG,GAAG;IACtD;IACA,IAAI,OAAO,EAAE;AACT,QAAA,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM;AACnD,QAAA,OAAO,CAAC,WAAW,GAAG,QAAQ,GAAG,GAAG,GAAG,GAAG;IAC9C;AACJ;AAGA;AACA;AACA,SAAS,kBAAkB,GAAA;AACvB,IAAA,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAA;QAC/B,IAAI,QAAQ,GAAGb,iBAAY,EAAE,CAAC,gBAAgB,CAAC,wBAAwB,CAA4B;AACnG,QAAA,QAAQ,CAAC,OAAO,CAAC,UAAS,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAC3E,IAAA,CAAC,CAAC;AACN;AAGA;AACA;AACA;AACA;AACA,SAAS,eAAe,GAAA;AACpB,IAAA,IAAI,UAAU,GAAGa,gBAAS,EAAE;IAC5BG,eAAQ,CAAC,UAAS,KAAK,EAAA;AACnB,QAAA,IAAI,KAAK,CAAC,OAAO,KAAK,UAAU,EAAE;YAAE;QAAQ;AAC5C,QAAA,UAAU,GAAG,KAAK,CAAC,OAAO;;AAE1B,QAAA,IAAI,KAAK,CAAC,OAAO,EAAE;YAAEC,uBAAkB,CAAC,KAAK,CAAC;QAAE;;;QAGhD,IAAI,MAAM,GAAGjB,iBAAY,EAAE,CAAC,gBAAgB,CAAC,sBAAsB,CAA4B;AAC/F,QAAA,MAAM,CAAC,OAAO,CAAC,UAAS,KAAK,IAAI,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACtE,IAAA,CAAC,CAAC;AACN;AAGA;AACM,SAAU,gBAAgB,CAAC,aAAa,EAAE,SAAS,EAAA;AACrD,IAAA,IAAI,IAAI,GAAGA,iBAAY,EAAE;AACzB,IAAA,IAAI,SAAS,GAAG,gBAAgB,GAAG,aAAa;AAChD,IAAA,IAAI,OAAO,GAAG,cAAc,GAAG,aAAa;AAC5C,IAAA,IAAI,OAAO,GAAG,cAAc,GAAG,aAAa;IAC5C,IAAI,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;IAC5C,IAAI,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;IACxC,IAAI,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;AAExC,IAAA,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,EAAE;;QAEpB,IAAI,CAAC,KAAK,EAAE;AACR,YAAA,gBAAgB,CAAC,aAAa,EAAE,SAAS,CAAC;AAC1C,YAAA,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;AACxC,YAAA,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;AACpC,YAAAkB,0BAAqB,EAAE;QAC3B;aAAO;AACH,YAAA,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;AACxC,YAAA,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;QACxC;IACJ;;IAGA,IAAI,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,mBAAmB,GAAG,aAAa,CAAC;AAC1E,IAAA,IAAI,UAAU,GAAG,WAAW,KAAA,IAAA,IAAX,WAAW,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAX,WAAW,CAAE,aAAa,CAAC,kBAAkB,CAAC;AAC/D,IAAA,IAAI,UAAU;AAAE,QAAA,UAAU,CAAC,WAAW,GAAG,SAAS,CAAC,QAAQ;IAC3D,IAAI,CAAC,cAAc,CAAC,gBAAgB,GAAG,aAAa,CAAC,CAAC,SAAS,GAAG,iCAAiC,GAAG,SAAS,CAAC,MAAM,GAAG,0CAA0C,GAAG,SAAS,CAAC,SAAS,GAAG,QAAQ;;AAGpM,IAAA,IAAI,WAAW,GAAG,SAAS,CAAC,MAAM,KAAK,IAAI,GAAG,SAAS,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI;AAC5E,IAAA,IAAI,SAAS,GAAG,SAAS,CAAC,MAAM,KAAK,IAAI,IAAI,SAAS,CAAC,MAAM,GAAG,GAAG,GAAG,SAAS,GAAG,SAAS,CAAC,MAAM,GAAG,GAAG,GAAG,SAAS,GAAG,SAAS,IAAI,MAAM;IAC1I,IAAI,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,GAAG,aAAa,CAAC;IACpE,IAAI,WAAW,EAAE;AACb,QAAA,WAAW,CAAC,WAAW,GAAG,WAAW;AACrC,QAAA,WAAW,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS;IACvC;;;;IAKA,IAAI,KAAK,GAAG,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK;AAClD,IAAA,IAAI,SAAS,GAAG,CAAC,EAAE,KAAK,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,UAAU,IAAI,OAAO,KAAK,CAAC,aAAa,KAAK,UAAU,IAAI,KAAK,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;AACzI,IAAA,IAAI,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC;IAC7C,IAAI,UAAU,GAAG,CAAC,QAAQ,GAAG,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI;AAEnF,IAAA,IAAI,YAAY,GAAG,SAAS,CAAC;IAE7B,IAAI,IAAI,GAAG,iCAAiC;IAC5C,IAAI,IAAI,yDAAyD;IACjE,IAAI,IAAI,wBAAwB;IAChC,IAAI,IAAI,kMAAkM,GAAGC,gBAAU,GAAG,uCAAuC,GAAGC,gBAAW,CAAC,SAAS,CAAC,eAAe,CAAC,GAAG,+EAA+E,GAAG,SAAS,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,uBAAuB;AAChc,IAAA,IAAI,IAAI,MAAM,IAAI,SAAS,GAAG,8BAA8B,GAAG,EAAE,CAAC,GAAG,kKAAkK,GAAGC,kBAAY,GAAG,uCAAuC,GAAGD,gBAAW,CAAC,SAAS,CAAC,mBAAmB,CAAC,GAAG,+EAA+E,GAAG,SAAS,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,uBAAuB;;IAEve,IAAI,SAAS,EAAE;AACX,QAAA,IAAI,IAAI,4JAA4J,GAAG,YAAY,GAAG,KAAK,GAAGE,gBAAU,GAAG,6BAA6B,GAAG,YAAY,GAAG,uFAAuF,GAAG,UAAU,GAAG,cAAc;IACnX;IACA,IAAI,IAAI,QAAQ;IAChB,IAAI,IAAI,uFAAuF;AAC/F,IAAA,IAAI,IAAI,yBAAyB,GAAG,aAAa,GAAG,4DAA4D;AAChH,IAAA,IAAI,IAAI,6BAA6B,GAAG,aAAa,GAAG,4DAA4D;IACpH,IAAI,SAAS,EAAE;AACX,QAAA,IAAI,IAAI,2BAA2B,GAAG,aAAa,GAAG,4DAA4D;IACtH;IACA,IAAI,IAAI,QAAQ;IAChB,IAAI,IAAI,QAAQ;IAChB,IAAI,IAAI,QAAQ;AAEhB,IAAA,OAAO,CAAC,SAAS,GAAG,IAAI;;AAGxB,IAAA,UAAU,CAAC,YAAA;QACP,SAAS,CAAC,aAAa,GAAG,aAAa,EAAE,SAAS,CAAC,gBAAgB,EAAE,SAAS,CAAC;QAC/E,SAAS,CAAC,iBAAiB,GAAG,aAAa,EAAE,SAAS,CAAC,oBAAoB,EAAE,SAAS,CAAC;AACvF,QAAA,IAAI,SAAS;YAAE,SAAS,CAAC,eAAe,GAAG,aAAa,EAAE,SAAS,CAAC,aAAa,EAAE,YAAY,CAAC;IACpG,CAAC,EAAE,EAAE,CAAC;AACV;AAGA;SACgB,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAA;IAC3C,IAAI,MAAM,GAAGtB,iBAAY,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAsB;AACzE,IAAA,IAAI,CAAC,MAAM;QAAE;IAEb,IAAI,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAA6B;AAC7D,IAAA,IAAI,KAAK,GAAG,MAAM,CAAC,KAAK;AACxB,IAAA,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM;;IAG1B,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC;AAElC,IAAA,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE;;AAGhC,IAAA,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC;AACzC,IAAA,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC;IACzC,IAAI,KAAK,GAAG,QAAQ,GAAG,QAAQ,IAAI,CAAC,CAAC;;IAGrC,IAAI,OAAO,GAAG,CAAC;AACf,IAAA,IAAI,UAAU,GAAG,KAAK,GAAG,OAAO,GAAG,CAAC;AACpC,IAAA,IAAI,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,CAAC;;AAGtC,IAAA,GAAG,CAAC,WAAW,GAAG,0BAA0B;AAC5C,IAAA,GAAG,CAAC,SAAS,GAAG,GAAG;AACnB,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;QACzB,IAAI,CAAC,GAAG,OAAO,GAAG,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC;QACvC,GAAG,CAAC,SAAS,EAAE;AACf,QAAA,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACtB,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,OAAO,EAAE,CAAC,CAAC;QAC9B,GAAG,CAAC,MAAM,EAAE;IAChB;;AAGA,IAAA,GAAG,CAAC,WAAW,GAAG,KAAK;AACvB,IAAA,GAAG,CAAC,SAAS,GAAG,GAAG;IACnB,GAAG,CAAC,SAAS,EAAE;AAEf,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAClC,QAAA,IAAI,CAAC,GAAG,OAAO,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;AAC3D,QAAA,IAAI,eAAe,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,KAAK;QAClD,IAAI,CAAC,GAAG,OAAO,GAAG,WAAW,IAAI,eAAe,GAAG,WAAW,CAAC;AAE/D,QAAA,IAAI,CAAC,KAAK,CAAC,EAAE;AACT,YAAA,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;QACpB;aAAO;AACH,YAAA,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;QACpB;IACJ;IAEA,GAAG,CAAC,MAAM,EAAE;;AAGZ,IAAA,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;QACjB,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAC7C,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QACrC,GAAG,CAAC,SAAS,EAAE;AACf,QAAA,GAAG,CAAC,SAAS,GAAG,KAAK;AACrB,QAAA,GAAG,CAAC,WAAW,GAAG,GAAG;QACrB,GAAG,CAAC,IAAI,EAAE;AACV,QAAA,GAAG,CAAC,WAAW,GAAG,GAAG;IACzB;AACJ;AAGA;AACM,SAAU,cAAc,CAAC,SAAS,EAAA;AACpC,IAAA,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACpB,IAAA,IAAI,OAAO,GAAG,CAAC,GAAG,GAAG,SAAS,CAAC,UAAU,IAAI,IAAI,CAAC;AAElD,IAAA,IAAI,OAAO,GAAG,CAAC,EAAE;QACb,SAAS,CAAC,eAAe,GAAG,SAAS,CAAC,cAAc,GAAG,OAAO;QAC9D,SAAS,CAAC,mBAAmB,GAAG,SAAS,CAAC,kBAAkB,GAAG,OAAO;QACtE,SAAS,CAAC,kBAAkB,GAAG,SAAS,CAAC,iBAAiB,GAAG,OAAO;QACpE,SAAS,CAAC,sBAAsB,GAAG,SAAS,CAAC,qBAAqB,GAAG,OAAO;;QAG5E,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC;QAC1D,SAAS,CAAC,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC;;;QAIlE,IAAI,WAAW,GAAG,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK;QACxD,IAAI,WAAW,IAAI,OAAO,WAAW,CAAC,MAAM,KAAK,UAAU,IAAI,OAAO,WAAW,CAAC,aAAa,KAAK,UAAU,IAAI,WAAW,CAAC,aAAa,EAAE,GAAG,CAAC,EAAE;YAC/I,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QACtD;;AAGA,QAAA,IAAI,MAAM,GAAG,SAAS,CAAC,gBAAgB,IAAI,EAAE;QAC7C,IAAI,SAAS,CAAC,gBAAgB,CAAC,MAAM,GAAG,MAAM,EAAE;AAC5C,YAAA,SAAS,CAAC,gBAAgB,CAAC,KAAK,EAAE;AAClC,YAAA,SAAS,CAAC,oBAAoB,CAAC,KAAK,EAAE;;QAE1C;QACA,IAAI,SAAS,CAAC,aAAa,CAAC,MAAM,GAAG,MAAM,EAAE;AACzC,YAAA,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE;QACnC;;AAGA,QAAA,SAAS,CAAC,cAAc,GAAG,CAAC;AAC5B,QAAA,SAAS,CAAC,kBAAkB,GAAG,CAAC;AAChC,QAAA,SAAS,CAAC,iBAAiB,GAAG,CAAC;AAC/B,QAAA,SAAS,CAAC,qBAAqB,GAAG,CAAC;AACnC,QAAA,SAAS,CAAC,UAAU,GAAG,GAAG;IAC9B;;AAGA,IAAA,gBAAgB,CAAC,SAAS,CAAC,aAAa,EAAE,SAAS,CAAC;AACxD;;;;;;;;"}