<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <title>What Exploits Are Online Advanced</title>
  <!-- Tailwind CSS via CDN -->
  <script src="https://cdn.tailwindcss.com"></script>
  <!-- Chart.js via CDN -->
  <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
  <!-- Tailwind config with custom colors -->
  <script>
    tailwind.config = {
      theme: {
        extend: {
          colors: {
            'theme-black': '#000000',
            'theme-green': '#2f855a'
          }
        }
      }
    }
  </script>
  <style>
    /* Sidebar transition */
    #sidebar {
      transition: transform 0.3s ease-in-out;
    }
    /* Only active section is shown */
    .section { display: none; }
    .section.active { display: block; }
    /* Toast styles */
    #toastContainer {
      position: fixed;
      top: 1rem;
      right: 1rem;
      z-index: 100;
    }
    .toast {
      min-width: 200px;
      margin-bottom: 0.75rem;
      padding: 0.75rem 1rem;
      border-radius: 0.375rem;
      opacity: 0.95;
      animation: fadeInOut 3s forwards;
    }
    @keyframes fadeInOut {
      0% { opacity: 0; transform: translateY(-10px); }
      10%, 90% { opacity: 0.95; transform: translateY(0); }
      100% { opacity: 0; transform: translateY(-10px); }
    }
    /* Settings tab panels */
    .tab-panel { display: none; }
    .tab-panel.active { display: block; }
    /* Light mode overrides for better readability */
    body.light-mode {
      background-color: #f9fafb !important;
      color: #1f2937 !important;
    }
    body.light-mode .bg-theme-black { background-color: #f9fafb !important; }
    body.light-mode .bg-gray-900 { background-color: #e5e7eb !important; }
    body.light-mode .bg-gray-800 { background-color: #ffffff !important; }
    body.light-mode .text-white { color: #1f2937 !important; }
    body.light-mode .text-theme-green { color: #065f46 !important; }
    body.light-mode .border-theme-green { border-color: #065f46 !important; }
  </style>
</head>
<body class="bg-theme-black text-white">
  <!-- Toast Notification Container -->
  <div id="toastContainer"></div>

  <!-- Layout Wrapper -->
  <div class="flex">
    <!-- Sidebar Navigation (Collapsible on Mobile) -->
    <aside id="sidebar" class="w-64 bg-gray-900 border-r border-theme-green min-h-screen fixed md:relative z-40 transform md:translate-x-0">
      <div class="p-4">
        <h2 class="text-2xl font-bold text-theme-green mb-6">Dashboard</h2>
        <nav class="space-y-4">
          <a href="#overview" data-section="overview" class="nav-link block px-3 py-2 rounded hover:bg-gray-800">Overview</a>
          <a href="#versions" data-section="versions" class="nav-link block px-3 py-2 rounded hover:bg-gray-800">Versions</a>
          <a href="#exploits" data-section="exploits" class="nav-link block px-3 py-2 rounded hover:bg-gray-800">Exploits</a>
          <a href="#statistics" data-section="statistics" class="nav-link block px-3 py-2 rounded hover:bg-gray-800">Statistics</a>
          <a href="#activity" data-section="activity" class="nav-link block px-3 py-2 rounded hover:bg-gray-800">Activity</a>
          <a href="#engagement" data-section="engagement" class="nav-link block px-3 py-2 rounded hover:bg-gray-800">Engagement</a>
          <a href="#settings" data-section="settings" class="nav-link block px-3 py-2 rounded hover:bg-gray-800">Settings</a>
        </nav>
      </div>
      <div class="p-4 border-t border-theme-green">
        <button id="toggleSidebar" class="md:hidden bg-theme-green hover:bg-green-700 text-black font-bold py-2 px-4 rounded transition">
          Close Sidebar
        </button>
      </div>
    </aside>
    <!-- Main Content Area -->
    <div class="flex-1 ml-0 md:ml-64">
      <!-- Mobile Header for Sidebar Toggle -->
      <header class="md:hidden bg-gray-900 border-b border-theme-green p-4 flex justify-between items-center">
        <h1 class="text-xl font-bold text-theme-green">Dashboard</h1>
        <button id="openSidebar" class="bg-theme-green hover:bg-green-700 text-black font-bold py-2 px-4 rounded transition">
          Open Menu
        </button>
      </header>
      <main class="p-4 space-y-8">
        <!-- Overview Section -->
        <section id="overview" class="section active">
          <h2 class="text-3xl font-bold mb-4">Overview</h2>
          <div class="grid grid-cols-1 md:grid-cols-3 gap-6">
            <div class="bg-gray-800 border border-gray-700 rounded-lg p-6 shadow-lg">
              <h3 class="text-xl font-bold text-theme-green mb-2">Total Exploits</h3>
              <p id="totalExploits" class="text-3xl">0</p>
            </div>
            <div class="bg-gray-800 border border-gray-700 rounded-lg p-6 shadow-lg">
              <h3 class="text-xl font-bold text-theme-green mb-2">Free Exploits</h3>
              <p id="freeExploits" class="text-3xl">0</p>
            </div>
            <div class="bg-gray-800 border border-gray-700 rounded-lg p-6 shadow-lg">
              <h3 class="text-xl font-bold text-theme-green mb-2">Paid Exploits</h3>
              <p id="paidExploits" class="text-3xl">0</p>
            </div>
          </div>
          <!-- Live New Exploits Marquee -->
          <div class="mt-8 bg-gray-800 p-4 rounded shadow-lg overflow-hidden">
            <div id="liveUpdates" class="whitespace-nowrap animate-marquee">
              <span class="mx-4">Loading new exploits...</span>
            </div>
          </div>
        </section>

        <!-- Versions Section -->
        <section id="versions" class="section">
          <div class="flex justify-between items-center mb-4">
            <h2 class="text-3xl font-bold border-b border-gray-700 pb-2">Roblox Versions</h2>
            <div class="flex items-center space-x-4">
              <span id="refreshTimer" class="text-gray-400"></span>
              <button id="refreshVersions" class="bg-theme-green hover:bg-green-700 text-black font-bold py-2 px-4 rounded transition">
                Refresh Now
              </button>
            </div>
          </div>
          <div class="grid grid-cols-1 md:grid-cols-3 gap-6">
            <!-- Current Versions -->
            <div class="bg-gray-800 border border-gray-700 rounded-lg p-6 shadow-lg">
              <h3 class="text-xl font-bold text-theme-green mb-3">Current Versions</h3>
              <div id="currentVersions"><p class="text-gray-400">Loading...</p></div>
            </div>
            <!-- Future Versions -->
            <div class="bg-gray-800 border border-gray-700 rounded-lg p-6 shadow-lg">
              <h3 class="text-xl font-bold text-theme-green mb-3">Future Versions</h3>
              <div id="futureVersions"><p class="text-gray-400">Loading...</p></div>
            </div>
            <!-- Android Version -->
            <div class="bg-gray-800 border border-gray-700 rounded-lg p-6 shadow-lg">
              <h3 class="text-xl font-bold text-theme-green mb-3">Android Version</h3>
              <div id="androidVersion"><p class="text-gray-400">Loading...</p></div>
            </div>
          </div>
        </section>

        <!-- Exploits Section -->
        <section id="exploits" class="section">
          <div class="flex flex-col md:flex-row justify-between items-center mb-4">
            <h2 class="text-3xl font-bold border-b border-gray-700 pb-2">Exploit Statuses</h2>
            <div class="flex flex-wrap gap-4 mt-4 md:mt-0">
              <input id="searchInput" type="text" placeholder="Search exploits..." class="p-3 bg-gray-700 border border-gray-600 rounded focus:outline-none focus:ring-2 focus:ring-theme-green" />
              <select id="platformFilter" class="p-3 bg-gray-700 border border-gray-600 rounded focus:outline-none focus:ring-2 focus:ring-theme-green"></select>
              <select id="sortOrder" class="p-3 bg-gray-700 border border-gray-600 rounded focus:outline-none focus:ring-2 focus:ring-theme-green">
                <option value="title-asc">Title (A-Z)</option>
                <option value="updated-desc">Latest Updated</option>
                <option value="index-asc">Index</option>
              </select>
              <label class="flex items-center space-x-1">
                <input id="freeOnly" type="checkbox" class="h-4 w-4 text-theme-green focus:ring-theme-green border-gray-600" />
                <span>Free Only</span>
              </label>
              <!-- Date Range Filter -->
              <input id="startDate" type="date" class="p-2 bg-gray-700 border border-gray-600 rounded focus:outline-none focus:ring-2 focus:ring-theme-green" />
              <input id="endDate" type="date" class="p-2 bg-gray-700 border border-gray-600 rounded focus:outline-none focus:ring-2 focus:ring-theme-green" />
              <button id="refreshExploits" class="bg-theme-green hover:bg-green-700 text-black font-bold py-2 px-4 rounded transition">
                Refresh
              </button>
              <!-- Toggle Grid/Table View -->
              <button id="toggleView" class="bg-theme-green hover:bg-green-700 text-black font-bold py-2 px-4 rounded transition">
                Toggle Table View
              </button>
              <!-- Export Buttons -->
              <button id="exportCSV" class="bg-theme-green hover:bg-green-700 text-black font-bold py-2 px-4 rounded transition">
                Export CSV
              </button>
              <button id="exportJSON" class="bg-theme-green hover:bg-green-700 text-black font-bold py-2 px-4 rounded transition">
                Export JSON
              </button>
            </div>
          </div>
          <!-- Exploits Container (Grid or Table) -->
          <div id="exploitsContainer" class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
            <p class="col-span-full text-gray-400">Loading exploits...</p>
          </div>
          <!-- Pagination Controls -->
          <div id="pagination" class="mt-6 flex justify-center space-x-2"></div>
        </section>

        <!-- Statistics Section -->
        <section id="statistics" class="section">
          <div class="flex justify-between items-center mb-4">
            <h2 class="text-3xl font-bold border-b border-gray-700 pb-2">Exploit Statistics</h2>
            <button id="refreshStats" class="bg-theme-green hover:bg-green-700 text-black font-bold py-2 px-4 rounded transition">
              Refresh
            </button>
          </div>
          <div class="grid grid-cols-1 md:grid-cols-4 gap-6">
            <!-- Doughnut Chart: Free vs. Paid -->
            <div class="bg-gray-800 border border-gray-700 rounded-lg p-6 shadow-lg">
              <canvas id="statsChart" class="w-full h-64"></canvas>
            </div>
            <!-- Pie Chart: Platform Distribution -->
            <div class="bg-gray-800 border border-gray-700 rounded-lg p-6 shadow-lg">
              <canvas id="platformChart" class="w-full h-64"></canvas>
            </div>
            <!-- Line Chart: Daily Updates -->
            <div class="bg-gray-800 border border-gray-700 rounded-lg p-6 shadow-lg">
              <canvas id="updatesChart" class="w-full h-64"></canvas>
            </div>
            <!-- Bar Chart: Detection Rates (Simulated) -->
            <div class="bg-gray-800 border border-gray-700 rounded-lg p-6 shadow-lg">
              <canvas id="detectionChart" class="w-full h-64"></canvas>
            </div>
          </div>
        </section>

        <!-- Activity Section -->
        <section id="activity" class="section">
          <h2 class="text-3xl font-bold mb-4">Activity Log</h2>
          <div id="activityLog" class="bg-gray-800 border border-gray-700 rounded-lg p-6 shadow-lg h-64 overflow-y-auto">
            <p class="text-gray-400">No activity yet...</p>
          </div>
        </section>

        <!-- Engagement Section (New!) -->
        <section id="engagement" class="section">
          <h2 class="text-3xl font-bold mb-4">User Engagement</h2>
          <div class="bg-gray-800 border border-gray-700 rounded-lg p-6 shadow-lg">
            <canvas id="engagementChart" class="w-full h-64"></canvas>
          </div>
        </section>

        <!-- Settings Section with Tabs -->
        <section id="settings" class="section">
          <h2 class="text-3xl font-bold mb-4">Settings</h2>
          <div class="bg-gray-800 border border-gray-700 rounded-lg p-6 shadow-lg">
            <!-- Tab Navigation -->
            <div class="flex space-x-4 mb-4">
              <button class="tab-btn px-4 py-2 rounded bg-theme-green text-black font-bold" data-tab="general">General</button>
              <button class="tab-btn px-4 py-2 rounded bg-gray-700 hover:bg-gray-600" data-tab="advanced">Advanced</button>
            </div>
            <!-- Tab Panels -->
            <div id="tabGeneral" class="tab-panel active">
              <div class="mb-4">
                <label class="flex items-center space-x-2">
                  <input type="checkbox" id="toggleCompact" class="h-4 w-4 text-theme-green focus:ring-theme-green border-gray-600" />
                  <span>Compact Exploits View (Table Mode)</span>
                </label>
              </div>
              <div class="mb-4">
                <label class="flex items-center space-x-2">
                  <input type="checkbox" id="enableNotifications" class="h-4 w-4 text-theme-green focus:ring-theme-green border-gray-600" />
                  <span>Enable Toast Notifications</span>
                </label>
              </div>
              <div class="mb-4">
                <label class="flex items-center space-x-2">
                  <span>Theme:</span>
                  <select id="themeToggle" class="p-2 bg-gray-700 border border-gray-600 rounded focus:outline-none focus:ring-2 focus:ring-theme-green">
                    <option value="dark">Dark</option>
                    <option value="light">Light</option>
                  </select>
                </label>
              </div>
              <button id="saveSettings" class="bg-theme-green hover:bg-green-700 text-black font-bold py-2 px-4 rounded transition">
                Save Settings
              </button>
            </div>
            <div id="tabAdvanced" class="tab-panel">
              <p class="text-gray-400">Advanced options coming soon...</p>
            </div>
          </div>
        </section>
      </main>
    </div>
  </div>

  <!-- Modal for Exploit Details -->
  <div id="modal" class="fixed inset-0 bg-black bg-opacity-75 flex items-center justify-center hidden z-50">
    <div class="bg-gray-800 rounded-lg shadow-lg w-11/12 md:w-2/3 lg:w-1/2 relative">
      <button id="modalClose" class="absolute top-2 right-2 text-white text-3xl hover:text-theme-green">&times;</button>
      <div id="modalContent" class="p-6"></div>
    </div>
  </div>

  <!-- JavaScript: Data Fetching, Routing, Filtering, Charts, Toasts, etc. -->
  <script>
    document.addEventListener('DOMContentLoaded', () => {
      let exploitData = [];
      let currentPage = 1;
      const itemsPerPage = 6;
      let statsChart = null, platformChart = null, updatesChart = null, detectionChart = null, engagementChart = null;
      let useTableView = localStorage.getItem('compactView') === 'true';
      
      // Settings object (for notifications, view preferences, theme, etc.)
      const settings = {
        compact: useTableView,
        notifications: localStorage.getItem('enableNotifications') === 'true',
        theme: localStorage.getItem('theme') || 'dark'
      };

      /* ---------- Routing & Sidebar ---------- */
      const navLinks = document.querySelectorAll('.nav-link');
      navLinks.forEach(link => {
        link.addEventListener('click', (e) => {
          e.preventDefault();
          const sectionId = link.getAttribute('data-section');
          document.querySelectorAll('.section').forEach(sec => sec.classList.remove('active'));
          document.getElementById(sectionId).classList.add('active');
          if (window.innerWidth < 768) toggleSidebar();
          logActivity(`Navigated to ${sectionId}`);
        });
      });
      const sidebar = document.getElementById('sidebar');
      document.getElementById('openSidebar').addEventListener('click', () => { sidebar.classList.remove('-translate-x-full'); });
      document.getElementById('toggleSidebar').addEventListener('click', toggleSidebar);
      function toggleSidebar() { sidebar.classList.toggle('-translate-x-full'); }

      /* ---------- Toast Notifications ---------- */
      function showToast(message, type = 'info') {
        if (!settings.notifications) return;
        const toastContainer = document.getElementById('toastContainer');
        const toast = document.createElement('div');
        let bgClass = 'bg-gray-700';
        if (type === 'success') bgClass = 'bg-green-600';
        else if (type === 'error') bgClass = 'bg-red-600';
        toast.className = `toast ${bgClass} text-white`;
        toast.textContent = message;
        toastContainer.appendChild(toast);
        setTimeout(() => { toast.remove(); }, 3000);
      }

      /* ---------- Activity Log ---------- */
      function logActivity(message) {
        const logContainer = document.getElementById('activityLog');
        if (!logContainer) return;
        const p = document.createElement('p');
        const timestamp = new Date().toLocaleTimeString();
        p.textContent = `[${timestamp}] ${message}`;
        logContainer.prepend(p);
      }

      /* ---------- Overview Update ---------- */
      function updateOverview() {
        document.getElementById('totalExploits').textContent = exploitData.length;
        const freeCount = exploitData.filter(item => item.free).length;
        document.getElementById('freeExploits').textContent = freeCount;
        document.getElementById('paidExploits').textContent = exploitData.length - freeCount;
        // Update live marquee with the latest 5 exploit titles
        const liveUpdates = document.getElementById('liveUpdates');
        if (exploitData.length > 0) {
          const latest = exploitData.slice(-5).map(e => e.title).join(' • ');
          liveUpdates.textContent = latest;
        }
      }

      /* ---------- API Fetch Helper ---------- */
      async function fetchAPI(endpoint) {
        try {
          const response = await fetch(endpoint, { headers: { 'User-Agent': 'WEAO-3PService' } });
          if (!response.ok) throw new Error('Network error');
          return await response.json();
        } catch (error) {
          console.error('Error fetching', endpoint, error);
          showToast(`Error fetching data from ${endpoint}`, 'error');
          logActivity(`Error fetching ${endpoint}`);
          return null;
        }
      }

      /* ---------- Load Versions ---------- */
      async function loadVersions() {
        const current = await fetchAPI('https://whatexpsare.online/api/versions/current');
        const future  = await fetchAPI('https://whatexpsare.online/api/versions/future');
        const android = await fetchAPI('https://whatexpsare.online/api/versions/android');
        const currentContainer = document.getElementById('currentVersions');
        const futureContainer  = document.getElementById('futureVersions');
        const androidContainer = document.getElementById('androidVersion');
        if (current) {
          currentContainer.innerHTML = `
            <p class="text-gray-300">
              <strong class="text-theme-green">Windows:</strong> ${current.Windows}<br>
              <small class="text-gray-500">${current.WindowsDate}</small>
            </p>
            <p class="mt-3 text-gray-300">
              <strong class="text-theme-green">Mac:</strong> ${current.Mac}<br>
              <small class="text-gray-500">${current.MacDate}</small>
            </p>
          `;
        } else { currentContainer.innerHTML = '<p class="text-red-500">Failed to load current versions.</p>'; }
        if (future) {
          futureContainer.innerHTML = `
            <p class="text-gray-300">
              <strong class="text-theme-green">Windows:</strong> ${future.Windows}<br>
              <small class="text-gray-500">${future.WindowsDate}</small>
            </p>
            <p class="mt-3 text-gray-300">
              <strong class="text-theme-green">Mac:</strong> ${future.Mac}<br>
              <small class="text-gray-500">${future.MacDate}</small>
            </p>
          `;
        } else { futureContainer.innerHTML = '<p class="text-red-500">Failed to load future versions.</p>'; }
        if (android) {
          androidContainer.innerHTML = `
            <p class="text-gray-300">
              <strong class="text-theme-green">Android:</strong> ${android.Android}<br>
              <small class="text-gray-500">${android.AndroidDate}</small>
            </p>
          `;
        } else { androidContainer.innerHTML = '<p class="text-red-500">Failed to load Android version.</p>'; }
        showToast('Versions refreshed!', 'success');
        logActivity('Versions data refreshed');
      }

      /* ---------- Refresh Timer for Versions ---------- */
      let refreshInterval = 60; // seconds
      function startRefreshTimer() {
        let timeLeft = refreshInterval;
        const timerSpan = document.getElementById('refreshTimer');
        timerSpan.textContent = `Next refresh in ${timeLeft}s`;
        const timer = setInterval(() => {
          timeLeft--;
          timerSpan.textContent = `Next refresh in ${timeLeft}s`;
          if (timeLeft <= 0) {
            clearInterval(timer);
            loadVersions();
            startRefreshTimer();
          }
        }, 1000);
      }

      /* ---------- Load Exploits & Render ---------- */
      async function loadExploits() {
        const data = await fetchAPI('https://whatexpsare.online/api/status/exploits');
        if (data && Array.isArray(data)) {
          exploitData = data;
          currentPage = 1;
          renderExploits();
          updateOverview();
          updateStatistics();
          showToast('Exploits refreshed!', 'success');
          logActivity('Exploits data refreshed');
        } else {
          document.getElementById('exploitsContainer').innerHTML = '<p class="text-red-500">Failed to load exploit statuses.</p>';
        }
      }

      function renderExploits() {
        const container = document.getElementById('exploitsContainer');
        container.innerHTML = '';
        let filtered = [...exploitData];
        // Basic filters: search, platform, free only
        const searchValue = document.getElementById('searchInput').value.toLowerCase();
        if (searchValue) filtered = filtered.filter(item => item.title.toLowerCase().includes(searchValue));
        const platformValue = document.getElementById('platformFilter').value;
        if (platformValue !== 'All') filtered = filtered.filter(item => item.platform === platformValue);
        if (document.getElementById('freeOnly').checked) filtered = filtered.filter(item => item.free === true);
        // Date Range Filter
        const startDate = document.getElementById('startDate').value;
        const endDate = document.getElementById('endDate').value;
        if (startDate) {
          filtered = filtered.filter(item => new Date(item.updatedDate) >= new Date(startDate));
        }
        if (endDate) {
          filtered = filtered.filter(item => new Date(item.updatedDate) <= new Date(endDate));
        }
        // Sorting
        const sortOrder = document.getElementById('sortOrder').value;
        if (sortOrder === 'title-asc') filtered.sort((a, b) => a.title.localeCompare(b.title));
        else if (sortOrder === 'updated-desc') filtered.sort((a, b) => new Date(b.updatedDate) - new Date(a.updatedDate));
        else if (sortOrder === 'index-asc') filtered.sort((a, b) => a.index - b.index);
        // Pagination
        const totalPages = Math.ceil(filtered.length / itemsPerPage);
        if (currentPage > totalPages) currentPage = totalPages;
        const startIndex = (currentPage - 1) * itemsPerPage;
        const paginatedItems = filtered.slice(startIndex, startIndex + itemsPerPage);
        if (paginatedItems.length === 0) {
          container.innerHTML = '<p class="text-gray-400">No exploits found.</p>';
          document.getElementById('pagination').innerHTML = '';
          return;
        }
        // Render in Grid (Card) or Table view based on settings
        if (!settings.compact) {
          paginatedItems.forEach(exploit => {
            const card = document.createElement('div');
            card.className = 'bg-gray-800 border border-gray-700 rounded-lg p-6 shadow-lg transform transition hover:scale-105 cursor-pointer';
            card.setAttribute('data-title', exploit.title.toLowerCase());
            card.innerHTML = `
              <h3 class="text-xl font-bold text-theme-green mb-2">${exploit.title}</h3>
              <p class="text-gray-300"><strong>Version:</strong> ${exploit.version}</p>
              <p class="text-gray-300"><strong>Updated:</strong> ${exploit.updatedDate}</p>
              <p class="text-gray-300"><strong>Platform:</strong> ${exploit.platform}</p>
              <div class="mt-3">
                ${exploit.free
                  ? '<span class="bg-theme-green text-black text-xs font-semibold mr-2 px-2.5 py-0.5 rounded">Free</span>'
                  : '<span class="bg-red-700 text-white text-xs font-semibold mr-2 px-2.5 py-0.5 rounded">Paid</span>'
                }
                ${exploit.detected
                  ? '<span class="bg-yellow-600 text-black text-xs font-semibold mr-2 px-2.5 py-0.5 rounded">Detected</span>'
                  : '<span class="bg-blue-700 text-white text-xs font-semibold mr-2 px-2.5 py-0.5 rounded">Undetected</span>'
                }
              </div>
            `;
            card.addEventListener('click', () => openModal(exploit));
            container.appendChild(card);
          });
        } else {
          // Table View
          const table = document.createElement('table');
          table.className = 'min-w-full divide-y divide-gray-700';
          table.innerHTML = `
            <thead>
              <tr>
                <th class="px-4 py-2 text-left">Title</th>
                <th class="px-4 py-2 text-left">Version</th>
                <th class="px-4 py-2 text-left">Updated</th>
                <th class="px-4 py-2 text-left">Platform</th>
                <th class="px-4 py-2 text-left">Free</th>
              </tr>
            </thead>
            <tbody class="divide-y divide-gray-700"></tbody>
          `;
          const tbody = table.querySelector('tbody');
          paginatedItems.forEach(exploit => {
            const tr = document.createElement('tr');
            tr.className = "hover:bg-gray-700 cursor-pointer";
            tr.innerHTML = `
              <td class="px-4 py-2">${exploit.title}</td>
              <td class="px-4 py-2">${exploit.version}</td>
              <td class="px-4 py-2">${exploit.updatedDate}</td>
              <td class="px-4 py-2">${exploit.platform}</td>
              <td class="px-4 py-2">${exploit.free ? 'Yes' : 'No'}</td>
            `;
            tr.addEventListener('click', () => openModal(exploit));
            tbody.appendChild(tr);
          });
          container.appendChild(table);
        }
        renderPagination(totalPages);
      }

      function renderPagination(totalPages) {
        const pagination = document.getElementById('pagination');
        pagination.innerHTML = '';
        for (let i = 1; i <= totalPages; i++) {
          const btn = document.createElement('button');
          btn.textContent = i;
          btn.className = 'px-3 py-1 rounded ' + (i === currentPage ? 'bg-theme-green text-black' : 'bg-gray-700 hover:bg-gray-600');
          btn.addEventListener('click', () => { currentPage = i; renderExploits(); });
          pagination.appendChild(btn);
        }
      }

      /* ---------- Update Statistics Charts ---------- */
      function updateStatistics() {
        // Doughnut Chart: Free vs. Paid Exploits
        const freeCount = exploitData.filter(item => item.free).length;
        const paidCount = exploitData.filter(item => !item.free).length;
        const ctx1 = document.getElementById('statsChart').getContext('2d');
        if (statsChart) {
          statsChart.data.datasets[0].data = [freeCount, paidCount];
          statsChart.update();
        } else {
          statsChart = new Chart(ctx1, {
            type: 'doughnut',
            data: {
              labels: ['Free', 'Paid'],
              datasets: [{
                data: [freeCount, paidCount],
                backgroundColor: ['#2f855a', '#c53030'],
                borderColor: ['#1a202c', '#1a202c'],
                borderWidth: 2
              }]
            },
            options: { responsive: true, plugins: { legend: { position: 'bottom', labels: { color: settings.theme === 'light' ? '#1f2937' : 'white' } } } }
          });
        }
        // Pie Chart: Platform Distribution
        const platformCounts = exploitData.reduce((acc, item) => {
          acc[item.platform] = (acc[item.platform] || 0) + 1;
          return acc;
        }, {});
        const platforms = Object.keys(platformCounts);
        const counts = Object.values(platformCounts);
        const ctx2 = document.getElementById('platformChart').getContext('2d');
        if (platformChart) {
          platformChart.data.labels = platforms;
          platformChart.data.datasets[0].data = counts;
          platformChart.update();
        } else {
          platformChart = new Chart(ctx2, {
            type: 'pie',
            data: {
              labels: platforms,
              datasets: [{
                data: counts,
                backgroundColor: platforms.map(p => p === 'Windows' ? '#2f855a' : '#c53030'),
                borderColor: ['#1a202c'],
                borderWidth: 2
              }]
            },
            options: { responsive: true, plugins: { legend: { position: 'bottom', labels: { color: settings.theme === 'light' ? '#1f2937' : 'white' } } } }
          });
        }
        // Line Chart: Daily Updates
        const dateCounts = {};
        exploitData.forEach(item => {
          const d = new Date(item.updatedDate);
          if (!isNaN(d)) {
            const key = d.toISOString().split('T')[0];
            dateCounts[key] = (dateCounts[key] || 0) + 1;
          }
        });
        const sortedDates = Object.keys(dateCounts).sort();
        const countsOverTime = sortedDates.map(date => dateCounts[date]);
        const ctx3 = document.getElementById('updatesChart').getContext('2d');
        if (updatesChart) {
          updatesChart.data.labels = sortedDates;
          updatesChart.data.datasets[0].data = countsOverTime;
          updatesChart.update();
        } else {
          updatesChart = new Chart(ctx3, {
            type: 'line',
            data: {
              labels: sortedDates,
              datasets: [{
                label: 'Updates per Day',
                data: countsOverTime,
                borderColor: '#2f855a',
                backgroundColor: 'rgba(47,133,90,0.3)',
                fill: true,
                tension: 0.3
              }]
            },
            options: { responsive: true, plugins: { legend: { display: false } } }
          });
        }
        // Bar Chart: Detection Rates (Simulated)
        const detectedCount = exploitData.filter(item => item.detected).length;
        const undetectedCount = exploitData.filter(item => !item.detected).length;
        const ctx4 = document.getElementById('detectionChart').getContext('2d');
        if (detectionChart) {
          detectionChart.data.datasets[0].data = [detectedCount, undetectedCount];
          detectionChart.update();
        } else {
          detectionChart = new Chart(ctx4, {
            type: 'bar',
            data: {
              labels: ['Detected', 'Undetected'],
              datasets: [{
                data: [detectedCount, undetectedCount],
                backgroundColor: ['#f6ad55', '#718096'],
                borderColor: ['#1a202c', '#1a202c'],
                borderWidth: 2
              }]
            },
            options: { responsive: true, plugins: { legend: { display: false } } }
          });
        }
      }

      /* ---------- Engagement Chart (New!) ---------- */
      function updateEngagement() {
        // Simulate engagement data: Random values for the past 7 days
        const labels = [];
        const dataPoints = [];
        for (let i = 6; i >= 0; i--) {
          const d = new Date();
          d.setDate(d.getDate() - i);
          labels.push(d.toISOString().split('T')[0]);
          // Simulated engagement count between 50 and 150
          dataPoints.push(Math.floor(Math.random() * 100) + 50);
        }
        const ctx = document.getElementById('engagementChart').getContext('2d');
        if (engagementChart) {
          engagementChart.data.labels = labels;
          engagementChart.data.datasets[0].data = dataPoints;
          engagementChart.update();
        } else {
          engagementChart = new Chart(ctx, {
            type: 'line',
            data: {
              labels: labels,
              datasets: [{
                label: 'User Engagement',
                data: dataPoints,
                borderColor: '#2f855a',
                backgroundColor: 'rgba(47,133,90,0.3)',
                fill: true,
                tension: 0.3
              }]
            },
            options: { responsive: true, plugins: { legend: { display: false } } }
          });
        }
        logActivity('Engagement data updated');
      }

      /* ---------- Modal for Exploit Details ---------- */
      function openModal(exploit) {
        const modal = document.getElementById('modal');
        const modalContent = document.getElementById('modalContent');
        modalContent.innerHTML = `
          <h3 class="text-2xl font-bold text-theme-green mb-4">${exploit.title}</h3>
          <p class="mb-2"><strong>Version:</strong> ${exploit.version}</p>
          <p class="mb-2"><strong>Updated:</strong> ${exploit.updatedDate}</p>
          <p class="mb-2"><strong>Platform:</strong> ${exploit.platform}</p>
          <p class="mb-2"><strong>Detected:</strong> ${exploit.detected ? 'Yes' : 'No'}</p>
          <p class="mb-2"><strong>Free:</strong> ${exploit.free ? 'Yes' : 'No'}</p>
          <p class="mb-2"><strong>Update Status:</strong> ${exploit.updateStatus ? 'Updated' : 'Not Updated'}</p>
          ${exploit.beta ? `<p class="mb-2"><strong>Beta:</strong> Yes</p>` : ''}
          ${exploit.indev ? `<p class="mb-2"><strong>In Development:</strong> Yes</p>` : ''}
          ${exploit.rbxversion ? `<p class="mb-2"><strong>RBX Version:</strong> ${exploit.rbxversion}</p>` : ''}
          ${exploit.websitelink ? `<p class="mb-2"><a href="${exploit.websitelink}" target="_blank" class="text-theme-green hover:underline">Website</a></p>` : ''}
          ${exploit.discordlink ? `<p class="mb-2"><a href="${exploit.discordlink}" target="_blank" class="text-theme-green hover:underline">Discord</a></p>` : ''}
          ${exploit.purchaselink ? `<p class="mb-2"><a href="${exploit.purchaselink}" target="_blank" class="text-theme-green hover:underline">Purchase Link</a></p>` : ''}
        `;
        modal.classList.remove('hidden');
      }
      function closeModal() { document.getElementById('modal').classList.add('hidden'); }
      document.getElementById('modalClose').addEventListener('click', closeModal);
      document.getElementById('modal').addEventListener('click', (e) => { if (e.target === document.getElementById('modal')) closeModal(); });

      /* ---------- Export Functions ---------- */
      function exportCSV() {
        let filteredData = [...exploitData];
        const searchValue = document.getElementById('searchInput').value.toLowerCase();
        if (searchValue) filteredData = filteredData.filter(item => item.title.toLowerCase().includes(searchValue));
        const platformValue = document.getElementById('platformFilter').value;
        if (platformValue !== 'All') filteredData = filteredData.filter(item => item.platform === platformValue);
        if (document.getElementById('freeOnly').checked) filteredData = filteredData.filter(item => item.free === true);
        const headers = ["Title", "Version", "Updated", "Platform", "Free", "Detected"];
        const rows = filteredData.map(item => [
          item.title, item.version, item.updatedDate, item.platform, item.free ? "Yes" : "No", item.detected ? "Yes" : "No"
        ]);
        let csvContent = "data:text/csv;charset=utf-8," + headers.join(",") + "\n" + rows.map(e => e.join(",")).join("\n");
        const encodedUri = encodeURI(csvContent);
        const link = document.createElement("a");
        link.setAttribute("href", encodedUri);
        link.setAttribute("download", "exploits.csv");
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
        showToast('CSV exported!', 'success');
        logActivity('Exported CSV');
      }
      function exportJSON() {
        const dataStr = JSON.stringify(exploitData, null, 2);
        const blob = new Blob([dataStr], { type: "application/json" });
        const url = URL.createObjectURL(blob);
        const link = document.createElement("a");
        link.setAttribute("href", url);
        link.setAttribute("download", "exploits.json");
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
        showToast('JSON exported!', 'success');
        logActivity('Exported JSON');
      }

      /* ---------- Settings & Theme Toggle ---------- */
      // Tab switching in settings
      const tabButtons = document.querySelectorAll('.tab-btn');
      tabButtons.forEach(btn => {
        btn.addEventListener('click', () => {
          document.querySelectorAll('.tab-btn').forEach(b => b.classList.replace('bg-theme-green', 'bg-gray-700'));
          btn.classList.replace('bg-gray-700', 'bg-theme-green');
          const target = btn.getAttribute('data-tab');
          document.querySelectorAll('.tab-panel').forEach(panel => panel.classList.remove('active'));
          document.getElementById('tab' + target.charAt(0).toUpperCase() + target.slice(1)).classList.add('active');
        });
      });
      // Save settings and toggle theme
      document.getElementById('saveSettings').addEventListener('click', () => {
        settings.compact = document.getElementById('toggleCompact').checked;
        settings.notifications = document.getElementById('enableNotifications').checked;
        settings.theme = document.getElementById('themeToggle').value;
        localStorage.setItem('compactView', settings.compact);
        localStorage.setItem('enableNotifications', settings.notifications);
        localStorage.setItem('theme', settings.theme);
        applyTheme();
        showToast('Settings saved!', 'success');
        renderExploits();
        logActivity('Settings saved');
      });
      function applyTheme() {
        if (settings.theme === 'light') {
          document.body.classList.add('light-mode');
        } else {
          document.body.classList.remove('light-mode');
        }
      }

      /* ---------- Engagement Chart Update ---------- */
      function updateEngagement() {
        // Simulate engagement data for the past 7 days
        const labels = [];
        const dataPoints = [];
        for (let i = 6; i >= 0; i--) {
          const d = new Date();
          d.setDate(d.getDate() - i);
          labels.push(d.toISOString().split('T')[0]);
          dataPoints.push(Math.floor(Math.random() * 100) + 50);
        }
        const ctx = document.getElementById('engagementChart').getContext('2d');
        if (engagementChart) {
          engagementChart.data.labels = labels;
          engagementChart.data.datasets[0].data = dataPoints;
          engagementChart.update();
        } else {
          engagementChart = new Chart(ctx, {
            type: 'line',
            data: {
              labels: labels,
              datasets: [{
                label: 'User Engagement',
                data: dataPoints,
                borderColor: '#2f855a',
                backgroundColor: 'rgba(47,133,90,0.3)',
                fill: true,
                tension: 0.3
              }]
            },
            options: { responsive: true, plugins: { legend: { display: false } } }
          });
        }
        logActivity('Engagement data updated');
      }

      /* ---------- Event Listeners ---------- */
      document.getElementById('refreshVersions').addEventListener('click', loadVersions);
      document.getElementById('refreshExploits').addEventListener('click', loadExploits);
      document.getElementById('refreshStats').addEventListener('click', updateStatistics);
      document.getElementById('exportCSV').addEventListener('click', exportCSV);
      document.getElementById('exportJSON').addEventListener('click', exportJSON);
      document.getElementById('searchInput').addEventListener('input', renderExploits);
      document.getElementById('platformFilter').addEventListener('change', renderExploits);
      document.getElementById('sortOrder').addEventListener('change', renderExploits);
      document.getElementById('freeOnly').addEventListener('change', renderExploits);
      document.getElementById('toggleView').addEventListener('click', () => {
        settings.compact = !settings.compact;
        localStorage.setItem('compactView', settings.compact);
        renderExploits();
        showToast(`View switched to ${settings.compact ? 'Table' : 'Grid'} view`, 'info');
        logActivity(`View toggled to ${settings.compact ? 'Table' : 'Grid'}`);
      });

      /* ---------- Initialize Platform Filter Options ---------- */
      function initPlatformFilter() {
        const platformSelect = document.getElementById('platformFilter');
        ['All', 'Windows', 'Mac'].forEach(platform => {
          const option = document.createElement('option');
          option.value = platform;
          option.textContent = platform;
          platformSelect.appendChild(option);
        });
      }

      // ---------- Initialization ----------
      initPlatformFilter();
      loadVersions();
      loadExploits();
      startRefreshTimer();
      updateEngagement();
      applyTheme();
      // Set settings controls to saved values
      document.getElementById('toggleCompact').checked = settings.compact;
      document.getElementById('enableNotifications').checked = settings.notifications;
      document.getElementById('themeToggle').value = settings.theme;
    });
  </script>
</body>
</html>