{"id":86,"date":"2026-04-13T18:05:48","date_gmt":"2026-04-13T18:05:48","guid":{"rendered":"https:\/\/cashchat.se\/dir\/?page_id=86"},"modified":"2026-04-23T17:12:05","modified_gmt":"2026-04-23T17:12:05","slug":"subscribe","status":"publish","type":"page","link":"https:\/\/cashchat.se\/dir\/subscribe\/","title":{"rendered":"Subscribe"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, viewport-fit=cover\">\n  <title>Adase Ads Ltd | Digital Advertising &#038; SMM<\/title>\n  <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:opsz,wght@14..32,300;400;500;600;700;800&#038;display=swap\" rel=\"stylesheet\">\n  <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.5.0\/css\/all.min.css\">\n  <style>\n    * {\n      margin: 0;\n      padding: 0;\n      box-sizing: border-box;\n      font-family: 'Inter', sans-serif;\n    }\n\n    body {\n      background: radial-gradient(circle at 10% 20%, #f8faff, #eef2ff);\n      color: #1e293b;\n    }\n\n    html {\n      scroll-behavior: smooth;\n    }\n\n    .container {\n      max-width: 1400px;\n      margin: 0 auto;\n      padding: 0 32px;\n    }\n\n    \/* Navbar *\/\n    .navbar {\n      background: rgba(255, 255, 255, 0.92);\n      backdrop-filter: blur(12px);\n      box-shadow: 0 4px 20px rgba(0, 0, 0, 0.02);\n      padding: 16px 0;\n      position: sticky;\n      top: 0;\n      z-index: 100;\n      border-bottom: 1px solid rgba(139, 92, 246, 0.15);\n    }\n\n    .nav-flex {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      flex-wrap: wrap;\n      gap: 20px;\n    }\n\n    \/* Coin Logo *\/\n    .coin-logo {\n      width: 55px;\n      height: 55px;\n      background: radial-gradient(circle at 30% 35%, #f9d976, #f39f86);\n      border-radius: 50%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2), inset 0 1px 2px rgba(255, 255, 255, 0.6);\n      border: 2px solid #eab308;\n      transition: transform 0.2s;\n    }\n    .coin-logo:hover { transform: scale(1.02); }\n    .coin-logo span {\n      font-weight: 800;\n      font-size: 0.7rem;\n      text-align: center;\n      line-height: 1.2;\n      color: #422800;\n      background: rgba(255, 255, 255, 0.85);\n      padding: 4px 6px;\n      border-radius: 20px;\n      width: 85%;\n      letter-spacing: -0.3px;\n    }\n\n    \/* Brand title *\/\n    .brand-title {\n      display: flex;\n      flex-direction: column;\n      margin-left: 8px;\n    }\n    .title-line {\n      display: flex;\n      align-items: baseline;\n      gap: 6px;\n      flex-wrap: wrap;\n    }\n    .brand-adase {\n      font-size: 2.4rem;\n      font-weight: 800;\n      color: #2563eb;  \/* primary blue *\/\n      letter-spacing: -1px;\n      line-height: 1;\n    }\n    .brand-ads-ltd {\n      font-size: 1.2rem;\n      font-weight: 700;\n      color: #84cc16;  \/* lemon green *\/\n      letter-spacing: -0.3px;\n    }\n    .tagline {\n      font-size: 0.85rem;\n      font-weight: 600;\n      background: linear-gradient(135deg, #2563eb, #8b5cf6);\n      -webkit-background-clip: text;\n      background-clip: text;\n      color: transparent;\n      letter-spacing: 1px;\n      margin-top: 2px;\n    }\n\n    \/* Buttons *\/\n    .btn-sm {\n      padding: 8px 22px;\n      border-radius: 60px;\n      font-weight: 600;\n      font-size: 0.85rem;\n      border: none;\n      cursor: pointer;\n      transition: all 0.25s ease;\n      display: inline-flex;\n      align-items: center;\n      gap: 8px;\n    }\n    .btn-primary {\n      background: linear-gradient(135deg, #2563eb, #8b5cf6);\n      color: white;\n      box-shadow: 0 4px 10px rgba(37, 99, 235, 0.3);\n    }\n    .btn-primary:hover {\n      transform: translateY(-2px);\n      box-shadow: 0 8px 20px rgba(37, 99, 235, 0.4);\n    }\n    .btn-lemon {\n      background: #84cc16;\n      color: #1a2c3e;\n      box-shadow: 0 2px 8px rgba(132, 204, 22, 0.3);\n    }\n    .btn-lemon:hover {\n      background: #65a30d;\n      transform: translateY(-2px);\n      color: white;\n      box-shadow: 0 6px 14px rgba(132, 204, 22, 0.4);\n    }\n    .btn-outline {\n      background: transparent;\n      border: 1px solid #2563eb;\n      color: #2563eb;\n    }\n    .btn-outline:hover {\n      background: rgba(37, 99, 235, 0.05);\n      transform: translateY(-1px);\n    }\n\n    \/* Cards *\/\n    .card {\n      background: rgba(255, 255, 255, 0.95);\n      backdrop-filter: blur(2px);\n      border-radius: 32px;\n      padding: 28px;\n      margin-bottom: 28px;\n      border: 1px solid rgba(255, 255, 255, 0.6);\n      box-shadow: 0 20px 35px -12px rgba(0, 0, 0, 0.05);\n      transition: all 0.3s;\n    }\n    .card:hover {\n      transform: translateY(-3px);\n      box-shadow: 0 25px 40px -12px rgba(0, 0, 0, 0.1);\n      border-color: rgba(139, 92, 246, 0.2);\n    }\n\n    .hero {\n      text-align: center;\n      padding: 60px 20px;\n      background: linear-gradient(135deg, rgba(37, 99, 235, 0.05), rgba(139, 92, 246, 0.05));\n      border-radius: 56px;\n      margin: 30px 0;\n    }\n    .hero h2 {\n      font-size: 2.8rem;\n      font-weight: 800;\n      background: linear-gradient(135deg, #2563eb, #8b5cf6, #84cc16);\n      -webkit-background-clip: text;\n      background-clip: text;\n      color: transparent;\n    }\n\n    .grid-2 {\n      display: grid;\n      grid-template-columns: repeat(auto-fit, minmax(340px, 1fr));\n      gap: 28px;\n    }\n\n    .badge {\n      background: linear-gradient(135deg, #eef2ff, #f3e8ff);\n      color: #4c1d95;\n      padding: 6px 14px;\n      border-radius: 60px;\n      font-size: 0.75rem;\n      font-weight: 700;\n      display: inline-flex;\n      align-items: center;\n      gap: 6px;\n    }\n\n    input, select, textarea {\n      width: 100%;\n      padding: 12px 20px;\n      border-radius: 40px;\n      border: 1px solid #e2e8f0;\n      background: #ffffff;\n      font-size: 0.9rem;\n      transition: all 0.2s;\n      margin: 6px 0 14px;\n    }\n    input:focus, select:focus, textarea:focus {\n      outline: none;\n      border-color: #8b5cf6;\n      box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.1);\n    }\n    label {\n      font-weight: 600;\n      font-size: 0.85rem;\n      color: #334155;\n      margin-left: 12px;\n    }\n\n    table {\n      width: 100%;\n      border-collapse: collapse;\n      display: block;\n      overflow-x: auto;\n    }\n    th, td {\n      padding: 14px 12px;\n      text-align: left;\n      border-bottom: 1px solid #eef2ff;\n    }\n    th {\n      font-weight: 700;\n      color: #1e293b;\n      background: #f8fafc;\n    }\n\n    .pagination {\n      display: flex;\n      justify-content: center;\n      gap: 12px;\n      margin-top: 28px;\n      flex-wrap: wrap;\n    }\n    .pagination button {\n      padding: 8px 18px;\n      border-radius: 40px;\n      background: #f1f5f9;\n      border: none;\n      cursor: pointer;\n      font-weight: 500;\n      transition: all 0.2s;\n    }\n    .pagination button:hover:not(:disabled) {\n      background: linear-gradient(135deg, #2563eb, #8b5cf6);\n      color: white;\n    }\n    .pagination button:disabled {\n      opacity: 0.5;\n      cursor: not-allowed;\n    }\n\n    .modal {\n      display: none;\n      position: fixed;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n      background: rgba(0, 0, 0, 0.6);\n      backdrop-filter: blur(4px);\n      z-index: 1000;\n      justify-content: center;\n      align-items: center;\n    }\n    .modal-content {\n      background: white;\n      max-width: 520px;\n      width: 90%;\n      border-radius: 48px;\n      padding: 32px;\n      max-height: 85vh;\n      overflow-y: auto;\n      box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n    }\n    .close-modal {\n      float: right;\n      font-size: 28px;\n      cursor: pointer;\n      transition: 0.2s;\n    }\n    .close-modal:hover {\n      color: #8b5cf6;\n    }\n\n    .flex-between {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      flex-wrap: wrap;\n      gap: 16px;\n    }\n\n    .footer {\n      margin-top: 60px;\n      padding: 40px 0 30px;\n      border-top: 1px solid rgba(139, 92, 246, 0.15);\n      text-align: center;\n      background: rgba(255, 255, 255, 0.5);\n      border-radius: 40px 40px 0 0;\n    }\n    .footer p {\n      color: #475569;\n      font-size: 0.9rem;\n    }\n    .footer .address {\n      font-family: monospace;\n      background: #f1f5f9;\n      display: inline-block;\n      padding: 4px 16px;\n      border-radius: 40px;\n      margin-top: 8px;\n      font-size: 0.8rem;\n    }\n\n    @media (max-width: 768px) {\n      .container {\n        padding: 0 20px;\n      }\n      .nav-flex {\n        flex-direction: column;\n        align-items: stretch;\n      }\n      .logo-area {\n        justify-content: center;\n      }\n      .title-line {\n        justify-content: center;\n      }\n      .brand-adase {\n        font-size: 1.8rem;\n      }\n      .brand-ads-ltd {\n        font-size: 1rem;\n      }\n      .tagline {\n        text-align: center;\n      }\n      .auth-buttons, .nav-flex .btn-lemon {\n        justify-content: center;\n        width: 100%;\n      }\n      .hero h2 {\n        font-size: 1.8rem;\n      }\n    }\n  <\/style>\n<\/head>\n<body>\n<div class=\"navbar\">\n  <div class=\"container nav-flex\">\n    <div style=\"display: flex; align-items: center; gap: 12px;\">\n      <!-- Coin Logo -->\n      <div class=\"coin-logo\">\n        <span>Adase<br>Ads<\/span>\n      <\/div>\n      <!-- Brand Text -->\n      <div class=\"brand-title\">\n        <div class=\"title-line\">\n          <span class=\"brand-adase\">Adase<\/span>\n          <span class=\"brand-ads-ltd\">Ads Ltd<\/span>\n        <\/div>\n        <div class=\"tagline\">\ud83d\udcb0 Monetizing Africa<\/div>\n      <\/div>\n    <\/div>\n    <div style=\"display: flex; gap: 12px; align-items: center; flex-wrap: wrap;\">\n      <a href=\"https:\/\/ai.cashchatapp.com\" target=\"_blank\" class=\"btn-sm btn-lemon\">\n        <i class=\"fas fa-film\"><\/i> Flicks AI\n      <\/a>\n      <div id=\"globalUserArea\" class=\"auth-buttons\"><\/div>\n    <\/div>\n  <\/div>\n<\/div>\n<div class=\"container\" id=\"appMain\"><div id=\"dynamicPanel\">Loading&#8230;<\/div><\/div>\n<div class=\"container footer\">\n  <p>\u00a9 2025 Adase Ads Ltd \u2013 Incorporated in Uganda<\/p>\n  <div class=\"address\">\ud83d\udccd P.O.BOX 207475, Kampala, Uganda<\/div>\n  <p style=\"margin-top: 12px; font-size: 0.75rem;\"><i class=\"fas fa-envelope\"><\/i> ads@cashchat.se | <i class=\"fas fa-phone-alt\"><\/i> +256 775036603<\/p>\n<\/div>\n\n<script>\n  \/\/ ---------- DATA (unchanged) ----------\n  let users = [], ads = [], proofs = [], platformRevenue = 0, sessions = { currentUserId: null };\n  let smmOrders = [], withdrawRequests = [], contacts = [];\n  let contactsCurrentPage = 1, contactsPerPage = 20;\n\n  let dynamicPanel, globalUserArea;\n\n  function loadData() {\n    const stored = (key) => localStorage.getItem(key);\n    users = JSON.parse(stored('adase_users') || '[]');\n    ads = JSON.parse(stored('adase_ads') || '[]');\n    proofs = JSON.parse(stored('adase_proofs') || '[]');\n    platformRevenue = parseFloat(stored('adase_platformRevenue') || '0');\n    smmOrders = JSON.parse(stored('adase_smm_orders') || '[]');\n    withdrawRequests = JSON.parse(stored('adase_withdraw_requests') || '[]');\n    contacts = [];\n    localStorage.setItem('adase_contacts', '[]');\n\n    const adminEmail = \"sales@cashchat.se\", adminPass = \"Justtrade81#\";\n    const existingAdmin = users.find(u => u.email === adminEmail && u.role === 'admin');\n    if (!existingAdmin) {\n      users = users.filter(u => u.role !== 'admin');\n      users.push({ id: Date.now()+1, name:\"Super Admin\", firstName:\"Super\", lastName:\"Admin\", email:adminEmail, password:adminPass, role:\"admin\", wallet:0, advertiserWallet:0, viewedAds:[], phone:\"\", sponsorCode:\"\", country:\"\", gender:\"\", ageGroup:\"\", walletStatus:\"Active\", accountStatus:\"active\" });\n    } else existingAdmin.password = adminPass;\n\n    users = users.map(u => {\n      if(!u.firstName) u.firstName = u.name?.split(' ')[0] || \"\";\n      if(!u.lastName) u.lastName = u.name?.split(' ')[1] || \"\";\n      if(u.phone === undefined) u.phone = \"\";\n      if(u.sponsorCode === undefined) u.sponsorCode = \"\";\n      if(u.country === undefined) u.country = \"\";\n      if(u.gender === undefined) u.gender = \"\";\n      if(u.ageGroup === undefined) u.ageGroup = \"\";\n      if(u.walletStatus === undefined) u.walletStatus = (u.role === 'user' ? \"Not Active\" : \"Active\");\n      if(u.accountStatus === undefined) u.accountStatus = \"active\";\n      if(!u.name && u.firstName) u.name = (u.firstName + \" \" + u.lastName).trim();\n      return u;\n    });\n\n    if(users.length === 1) {\n      users.push({ id:1001, name:\"Demo Advertiser\", firstName:\"Demo\", lastName:\"Advertiser\", email:\"adv@demo.com\", password:\"adv123\", role:\"advertiser\", wallet:0, advertiserWallet:50000, viewedAds:[], phone:\"+256700000000\", sponsorCode:\"DEMO123\", country:\"Uganda\", gender:\"Male\", ageGroup:\"25-34\", walletStatus:\"Active\", accountStatus:\"active\" });\n      users.push({ id:1002, name:\"Alice Viewer\", firstName:\"Alice\", lastName:\"Viewer\", email:\"alice@view.com\", password:\"view123\", role:\"user\", wallet:600, advertiserWallet:0, viewedAds:[], phone:\"+256775036603\", sponsorCode:\"\", country:\"Kenya\", gender:\"Female\", ageGroup:\"18-24\", walletStatus:\"Active\", accountStatus:\"active\" });\n      if(!ads.length) ads.push({ id:201, advertiserId:1001, title:\"Cool Sneakers\", type:\"video\", mediaUrl:\"https:\/\/www.w3schools.com\/html\/mov_bbb.mp4\", dailyCostUGX:2000, specialInstructions:\"Upload receipt\", activeUntil:Date.now()+86400000, isActive:true });\n    }\n    saveAll();\n  }\n\n  function saveAll() {\n    localStorage.setItem('adase_users', JSON.stringify(users));\n    localStorage.setItem('adase_ads', JSON.stringify(ads));\n    localStorage.setItem('adase_proofs', JSON.stringify(proofs));\n    localStorage.setItem('adase_platformRevenue', platformRevenue);\n    localStorage.setItem('adase_smm_orders', JSON.stringify(smmOrders));\n    localStorage.setItem('adase_withdraw_requests', JSON.stringify(withdrawRequests));\n    localStorage.setItem('adase_contacts', JSON.stringify(contacts));\n  }\n\n  function getCurrentUser() { return sessions.currentUserId ? users.find(u => u.id === sessions.currentUserId) : null; }\n\n  function updatePlatformRevenue(amount) { platformRevenue = Math.max(0, platformRevenue + amount); localStorage.setItem('adase_platformRevenue', platformRevenue); }\n\n  function renderApp() {\n    dynamicPanel = document.getElementById('dynamicPanel');\n    globalUserArea = document.getElementById('globalUserArea');\n    if(!sessions.currentUserId) renderAuthScreen();\n    else {\n      const user = getCurrentUser();\n      if(!user || ['suspended','banned'].includes(user.accountStatus)) {\n        sessions.currentUserId = null;\n        alert(\"Account suspended or banned.\");\n        renderAuthScreen();\n        return;\n      }\n      if(user.role === 'advertiser') renderAdvertiserDashboard(user);\n      else if(user.role === 'user') renderUserDashboard(user);\n      else if(user.role === 'admin') renderAdminPanel(user);\n      else renderAuthScreen();\n    }\n    renderGlobalNav();\n  }\n\n  function renderGlobalNav() {\n    if(!globalUserArea) return;\n    if(!sessions.currentUserId) {\n      \/\/ Login and Register buttons in primary colours (blue & lemon green)\n      globalUserArea.innerHTML = `<button class=\"btn-sm btn-primary\" id=\"showLoginBtn\">Login<\/button><button class=\"btn-sm btn-lemon\" id=\"showRegisterBtn\">Register<\/button>`;\n      document.getElementById('showLoginBtn')?.addEventListener('click', () => showLoginForm());\n      document.getElementById('showRegisterBtn')?.addEventListener('click', () => showRegisterForm());\n    } else {\n      const user = getCurrentUser();\n      globalUserArea.innerHTML = `<span style=\"font-weight:500; background:#f0f4fe; padding:6px 14px; border-radius:60px;\">\ud83d\udc4b ${user.name} (${user.role})<\/span><button class=\"btn-sm\" id=\"logoutBtn\">Logout<\/button>`;\n      document.getElementById('logoutBtn')?.addEventListener('click', () => { sessions.currentUserId = null; renderApp(); });\n    }\n  }\n\n  function showLoginForm() {\n    dynamicPanel.innerHTML = `<div class=\"card\" style=\"max-width:500px;margin:auto;\"><h2 style=\"font-size:1.8rem;\">\ud83d\udd10 Welcome Back<\/h2><p style=\"margin-bottom:20px;\">Login to your Adase Ads account<\/p><label>Email<\/label><input id=\"loginEmail\"><label>Password<\/label><input id=\"loginPass\" type=\"password\"><button class=\"btn-primary\" id=\"doLoginBtn\" style=\"width:100%\">Login<\/button><p class=\"mt-2 text-sm\" style=\"margin-top:12px;\">Demo: adv@demo.com \/ adv123 | alice@view.com \/ view123<\/p><\/div>`;\n    document.getElementById('doLoginBtn')?.addEventListener('click', () => {\n      const email = document.getElementById('loginEmail').value, pwd = document.getElementById('loginPass').value;\n      const user = users.find(u => u.email === email && u.password === pwd);\n      if(user && user.accountStatus === 'active') { sessions.currentUserId = user.id; renderApp(); }\n      else if(user && user.accountStatus !== 'active') alert(\"Account suspended\/banned\");\n      else alert(\"Invalid credentials\");\n    });\n  }\n\n  function showRegisterForm() {\n    dynamicPanel.innerHTML = `<div class=\"card\"><h2>\ud83d\udcdd Join Adase Ads<\/h2>\n      <select id=\"regRole\"><option value=\"user\">Viewer (Earn points)<\/option><option value=\"advertiser\">Advertiser (Run campaigns)<\/option><\/select>\n      <div id=\"viewerExtraFields\" style=\"display:none;\">\n        <div style=\"display:flex;gap:16px;\"><div><label>First Name<\/label><input id=\"regFirstName\"><\/div><div><label>Last Name<\/label><input id=\"regLastName\"><\/div><\/div>\n        <label>Phone<\/label><input id=\"regPhone\">\n        <label>Email<\/label><input id=\"regEmail\">\n        <label>Sponsor Code<\/label>\n        <div style=\"display:flex; gap:10px; align-items:center; flex-wrap:wrap;\">\n          <input id=\"regSponsorCode\" placeholder=\"e.g., 23530191 or 200680390\" style=\"flex:1;\">\n          <a href=\"https:\/\/cashchatbank.com\" target=\"_blank\" class=\"btn-sm\" style=\"background:#2E5AFF; color:white; text-decoration:none; display:inline-block; text-align:center;\">Apply for Code<\/a>\n        <\/div>\n        <div style=\"display:flex;gap:16px;\"><div><label>Country<\/label><input id=\"regCountry\"><\/div><div><label>Gender<\/label><select id=\"regGender\"><option>Male<\/option><option>Female<\/option><\/select><\/div><div><label>Age Group<\/label><select id=\"regAgeGroup\"><option>18-24<\/option><option>25-34<\/option><option>35-44<\/option><option>45+<\/option><\/select><\/div><\/div>\n        <label>Wallet Status<\/label><select id=\"regWalletStatus\"><option>Not Active<\/option><option>Active<\/option><\/select>\n      <\/div>\n      <div id=\"advertiserSimpleFields\"><label>Full Name<\/label><input id=\"regNameSimple\"><label>Email<\/label><input id=\"regEmailSimple\"><\/div>\n      <label>Password<\/label><input id=\"regPass\" type=\"password\">\n      <button class=\"btn-primary\" id=\"doRegBtn\">Sign Up<\/button>\n    <\/div>`;\n    const roleSel = document.getElementById('regRole'), viewerDiv = document.getElementById('viewerExtraFields'), advDiv = document.getElementById('advertiserSimpleFields');\n    roleSel.onchange = () => { const isViewer = roleSel.value === 'user'; viewerDiv.style.display = isViewer ? 'block' : 'none'; advDiv.style.display = isViewer ? 'none' : 'block'; };\n    roleSel.dispatchEvent(new Event('change'));\n\n    document.getElementById('doRegBtn').onclick = () => {\n      const role = roleSel.value, pwd = document.getElementById('regPass').value;\n      if(!pwd) return alert(\"Password required\");\n      if(role === 'user') {\n        const fname = document.getElementById('regFirstName').value.trim(), lname = document.getElementById('regLastName').value.trim(), phone = document.getElementById('regPhone').value.trim(), email = document.getElementById('regEmail').value.trim(), sponsor = document.getElementById('regSponsorCode').value.trim(), country = document.getElementById('regCountry').value.trim(), gender = document.getElementById('regGender').value, age = document.getElementById('regAgeGroup').value, walletStat = document.getElementById('regWalletStatus').value;\n        if(!fname || !lname || !phone || !email) return alert(\"All fields required\");\n        if(users.find(u=>u.email===email)) return alert(\"Email exists\");\n        users.push({ id:Date.now(), name:fname+\" \"+lname, firstName:fname, lastName:lname, email, password:pwd, role:\"user\", wallet:0, advertiserWallet:0, viewedAds:[], phone, sponsorCode:sponsor, country, gender, ageGroup:age, walletStatus:walletStat, accountStatus:\"active\" });\n        saveAll(); alert(\"Registered! Login.\"); showLoginForm();\n      } else {\n        const full = document.getElementById('regNameSimple').value.trim(), email = document.getElementById('regEmailSimple').value.trim();\n        if(!full || !email) return alert(\"Fill all fields\");\n        if(users.find(u=>u.email===email)) return alert(\"Email exists\");\n        users.push({ id:Date.now(), name:full, firstName:full.split(' ')[0], lastName:full.split(' ')[1]||\"\", email, password:pwd, role:\"advertiser\", wallet:0, advertiserWallet:0, viewedAds:[], phone:\"\", sponsorCode:\"\", country:\"\", gender:\"\", ageGroup:\"\", walletStatus:\"Active\", accountStatus:\"active\" });\n        saveAll(); alert(\"Advertiser created!\"); showLoginForm();\n      }\n    };\n  }\n\n  function renderAuthScreen() { \n    dynamicPanel.innerHTML = `<div class=\"hero\"><h2>\ud83d\ude80 Adase Ads Ltd<\/h2><p style=\"font-size:1.2rem; max-width:600px; margin:20px auto;\">Africa's leading digital advertising & SMM platform. Grow your brand with real Ugandan engagement.<\/p><button class=\"btn-primary\" id=\"gotoLoginBtn\" style=\"margin-top:16px;\">Get Started \u2192<\/button><\/div>`;\n    document.getElementById('gotoLoginBtn')?.addEventListener('click', showLoginForm);\n  }\n\n  \/\/ ----- USER DASHBOARD (unchanged) -----\n  function renderUserDashboard(user) {\n    if(user.walletStatus !== \"Active\") { dynamicPanel.innerHTML = `<div class=\"card\"><h3>\u26a0\ufe0f Wallet Not Active<\/h3><p>Contact admin to activate.<\/p><\/div>`; return; }\n    const activeAds = ads.filter(ad => ad.isActive && ad.activeUntil > Date.now());\n    const points = Math.floor(user.wallet\/3);\n    const pending = withdrawRequests.filter(r => r.userId === user.id && r.status === 'pending').length;\n    dynamicPanel.innerHTML = `<div class=\"flex-between\"><h2>\ud83c\udfac Watch & Earn<\/h2><span class=\"badge\">\ud83d\udcb0 ${user.wallet} UGX (${points} pts)<\/span><\/div>\n      <div class=\"card\"><div class=\"flex-between\"><span>\u2b50 1 point = UGX 3<\/span><button id=\"requestWithdrawBtn\" class=\"btn-primary\" ${user.wallet<1500?'disabled':''}>Withdraw 1500 UGX<\/button><\/div>${pending?`<p class=\"badge\">${pending} pending<\/p>`:''}<\/div>\n      <div class=\"card\"><h3>\ud83d\udcfa Active Ads<\/h3><div id=\"viewerAdsList\"><\/div><\/div>\n      <div class=\"card\"><h3>\ud83d\udce4 My proofs<\/h3><div id=\"viewerProofHistory\"><\/div><\/div>`;\n    document.getElementById('requestWithdrawBtn')?.addEventListener('click', () => { if(user.wallet>=1500){ withdrawRequests.push({id:Date.now(), userId:user.id, amount:1500, status:'pending', date:new Date().toISOString()}); saveAll(); alert(\"Request submitted.\"); renderUserDashboard(getCurrentUser()); } else alert(\"Insufficient\"); });\n    const container = document.getElementById('viewerAdsList');\n    if(!activeAds.length) container.innerHTML = \"<p>No active ads.<\/p>\";\n    else {\n      container.innerHTML = activeAds.map(ad => `<div style=\"border:1px solid #eef; border-radius:24px; padding:16px; margin-bottom:18px;\"><h4>${ad.title}<\/h4><div>${ad.type==='video'?`<video controls src=\"${ad.mediaUrl}\" style=\"max-width:100%\"><\/video>`:ad.type==='audio'?`<audio controls src=\"${ad.mediaUrl}\"><\/audio>`:`<img decoding=\"async\" src=\"${ad.mediaUrl}\" style=\"max-width:100%; border-radius:12px;\">`}<\/div>${ad.specialInstructions?`<p>\u26a0\ufe0f ${ad.specialInstructions}<\/p>`:''}${!user.viewedAds?.includes(ad.id)?`<button class=\"btn-sm btn-primary\" data-viewad=\"${ad.id}\">\u2705 Earn 3 UGX<\/button>`:`<span class=\"badge\">Claimed<\/span>`} ${ad.specialInstructions?`<button class=\"btn-sm btn-outline\" data-proofad=\"${ad.id}\">\ud83d\udcce Proof<\/button>`:''}<\/div>`).join('');\n      document.querySelectorAll('[data-viewad]').forEach(btn => btn.addEventListener('click', (e) => { const adId = parseInt(btn.dataset.viewad); const ad = ads.find(a=>a.id===adId); if(ad && !user.viewedAds.includes(adId)){ user.viewedAds.push(adId); user.wallet+=3; saveAll(); alert(`+3 UGX`); renderUserDashboard(getCurrentUser()); } else alert(\"Already claimed.\"); }));\n      document.querySelectorAll('[data-proofad]').forEach(btn => btn.addEventListener('click', (e) => { const adId = parseInt(btn.dataset.proofad); const ad = ads.find(a=>a.id===adId); const txt = prompt(`Proof for ${ad.title}:`); if(txt?.trim()){ proofs.push({id:Date.now(), adId, userId:user.id, userName:user.name, proofText:txt.trim(), timestamp:Date.now()}); saveAll(); alert(\"Proof submitted!\"); renderUserDashboard(getCurrentUser()); } }));\n    }\n    const historyDiv = document.getElementById('viewerProofHistory');\n    const userProofs = proofs.filter(p => p.userId === user.id);\n    historyDiv.innerHTML = userProofs.length ? userProofs.map(p=>`<div>${p.proofText}<\/div>`).join('') : \"<p>No proofs.<\/p>\";\n  }\n\n  \/\/ ----- ADMIN PANEL (unchanged) -----\n  function renderAdminPanel(admin) {\n    const allUsers = users.filter(u => u.role !== 'admin');\n    const pendingWithdrawals = withdrawRequests.filter(r => r.status === 'pending');\n    dynamicPanel.innerHTML = `\n      <div class=\"flex-between\"><h2>\ud83d\udee1\ufe0f Admin Console<\/h2><span class=\"badge\">Platform Balance: UGX ${platformRevenue.toFixed(0)}<\/span><\/div>\n      <div class=\"grid-2\">\n        <div class=\"card\"><h3>\ud83d\udc65 User Management<\/h3><div class=\"search-box\"><input id=\"searchUser\" placeholder=\"Search user\"><button id=\"searchUserBtn\" class=\"btn-sm\">\ud83d\udd0d<\/button><\/div><div id=\"usersTableContainer\"><table id=\"usersTable\"><thead><tr><th>ID<\/th><th>Name<\/th><th>Email<\/th><th>Role<\/th><th>Status<\/th><th>Actions<\/th><\/tr><\/thead><tbody><\/tbody><\/table><\/div><\/div>\n        <div class=\"card\"><h3>\ud83d\udcb0 Withdrawal Requests<\/h3><div id=\"withdrawalsList\"><\/div><\/div>\n      <\/div>\n      <div class=\"card\"><h3>\ud83d\udcc1 Contact Manager (CSV: Status,First Name,Last Name,Phone,Email,Sponsor Code)<\/h3>\n        <input type=\"file\" id=\"contactsCsv\" accept=\".csv\"><button id=\"uploadContactsBtn\" class=\"btn-sm\">Upload CSV<\/button> \n        <button id=\"downloadContactsExcel\" class=\"btn-sm\">Excel<\/button> <button id=\"downloadContactsPdf\" class=\"btn-sm\">PDF<\/button>\n        <div style=\"margin:15px 0\"><label>Show entries: <\/label><select id=\"perPageSelect\"><option value=\"20\">20<\/option><option value=\"50\">50<\/option><option value=\"100\">100<\/option><option value=\"200\">200<\/option><\/select><\/div>\n        <div id=\"contactsPreview\"><\/div><div id=\"paginationControls\" class=\"pagination\"><\/div>\n      <\/div>\n      <div class=\"card\"><h3>\u2709\ufe0f Email Broadcast<\/h3><label>Subject<\/label><input id=\"emailSubject\"><label>Message<\/label><textarea id=\"emailMessage\" rows=\"3\"><\/textarea><button id=\"sendEmailBtn\" class=\"btn-primary\">Send to All Users<\/button><\/div>`;\n    \/\/ User table rendering\n    function renderUsersTable(filter=\"\") {\n      const filtered = allUsers.filter(u => u.name.toLowerCase().includes(filter.toLowerCase()) || u.email.toLowerCase().includes(filter.toLowerCase()));\n      const tbody = document.querySelector('#usersTable tbody');\n      if(tbody) {\n        tbody.innerHTML = filtered.map(u => `<tr><td>${u.id}<\/td><td>${u.name}<\/td><td>${u.email}<\/td><td>${u.role}<\/td><td><span class=\"badge\" style=\"background:${u.accountStatus==='active'?'#d1fae5':'#fee2e2'}\">${u.accountStatus}<\/span><\/td><td><button class=\"btn-sm\" data-action=\"edit\" data-id=\"${u.id}\">\u270f\ufe0f<\/button> ${u.accountStatus==='active'?`<button class=\"btn-sm btn-warning\" data-action=\"suspend\" data-id=\"${u.id}\">Suspend<\/button>`:`<button class=\"btn-sm\" data-action=\"unsuspend\" data-id=\"${u.id}\">Unsuspend<\/button>`} ${u.accountStatus!=='banned'?`<button class=\"btn-sm btn-danger\" data-action=\"ban\" data-id=\"${u.id}\">Ban<\/button>`:`<button class=\"btn-sm\" data-action=\"restore\" data-id=\"${u.id}\">Restore<\/button>`} <button class=\"btn-sm\" data-action=\"credit\" data-id=\"${u.id}\">\ud83d\udcb0<\/button><\/td><\/tr>`).join('');\n        document.querySelectorAll('[data-action]').forEach(btn => btn.addEventListener('click', (e) => {\n          const action = btn.dataset.action, userId = parseInt(btn.dataset.id);\n          const target = users.find(u => u.id === userId);\n          if(!target) return;\n          if(action === 'edit') openEditModal(target);\n          else if(action === 'suspend') { target.accountStatus='suspended'; saveAll(); renderUsersTable(filter); }\n          else if(action === 'unsuspend') { target.accountStatus='active'; saveAll(); renderUsersTable(filter); }\n          else if(action === 'ban') { target.accountStatus='banned'; saveAll(); renderUsersTable(filter); }\n          else if(action === 'restore') { target.accountStatus='active'; saveAll(); renderUsersTable(filter); }\n          else if(action === 'credit') { let amt = prompt(\"Add UGX to earnings:\"); if(amt && !isNaN(amt)) { target.wallet += parseFloat(amt); saveAll(); renderUsersTable(filter); } }\n        }));\n      }\n    }\n    renderUsersTable();\n    document.getElementById('searchUserBtn')?.addEventListener('click', () => renderUsersTable(document.getElementById('searchUser').value));\n    \/\/ Withdrawals\n    const withdrawalsDiv = document.getElementById('withdrawalsList');\n    if(pendingWithdrawals.length===0) withdrawalsDiv.innerHTML = \"<p>No pending withdrawals.<\/p>\";\n    else {\n      withdrawalsDiv.innerHTML = pendingWithdrawals.map(w => { const u = users.find(u=>u.id===w.userId); return `<div class=\"flex-between\"><span>${u?.name} (${u?.email}) - UGX ${w.amount}<\/span><div><button class=\"btn-sm btn-primary\" data-wid=\"${w.id}\" data-action=\"approve\">Approve<\/button> <button class=\"btn-sm btn-danger\" data-wid=\"${w.id}\" data-action=\"reject\">Reject<\/button><\/div><\/div>`; }).join('');\n      document.querySelectorAll('[data-wid]').forEach(btn => btn.addEventListener('click', (e) => {\n        const wid = parseInt(btn.dataset.wid), action = btn.dataset.action;\n        const req = withdrawRequests.find(r=>r.id===wid);\n        if(!req) return;\n        const user = users.find(u=>u.id===req.userId);\n        if(action === 'approve') {\n          if(user.wallet >= req.amount) { user.wallet -= req.amount; updatePlatformRevenue(-req.amount); req.status='approved'; alert(\"Approved\"); }\n          else alert(\"Insufficient balance\");\n        } else if(action === 'reject') { req.status='rejected'; alert(\"Rejected\"); }\n        saveAll(); renderAdminPanel(admin);\n      }));\n    }\n    \/\/ Contacts pagination\n    function refreshContactsPreview() {\n      const previewDiv = document.getElementById('contactsPreview');\n      if(!previewDiv) return;\n      if(!contacts.length) { previewDiv.innerHTML = \"<p>No contacts uploaded.<\/p>\"; document.getElementById('paginationControls').innerHTML = ''; return; }\n      const total = contacts.length, totalPages = Math.ceil(total\/contactsPerPage);\n      if(contactsCurrentPage < 1) contactsCurrentPage = 1;\n      if(contactsCurrentPage > totalPages) contactsCurrentPage = totalPages;\n      const start = (contactsCurrentPage-1)*contactsPerPage, pageContacts = contacts.slice(start, start+contactsPerPage);\n      previewDiv.innerHTML = `<table><thead><tr><th>Status<\/th><th>First Name<\/th><th>Last Name<\/th><th>Phone<\/th><th>Email<\/th><th>Sponsor Code<\/th><\/tr><\/thead><tbody>${pageContacts.map(c => `<tr><td>${c.status||''}<\/td><td>${c.firstName}<\/td><td>${c.lastName}<\/td><td>${c.phone}<\/td><td>${c.email}<\/td><td>${c.sponsorCode||''}<\/td><\/tr>`).join('')}<\/tbody><\/table>`;\n      const paginationDiv = document.getElementById('paginationControls');\n      paginationDiv.innerHTML = `<button id=\"firstPage\" ${contactsCurrentPage===1?'disabled':''}>\u00ab First<\/button><button id=\"prevPage\" ${contactsCurrentPage===1?'disabled':''}>\u2039 Prev<\/button><span>Page ${contactsCurrentPage} of ${totalPages}<\/span><button id=\"nextPage\" ${contactsCurrentPage===totalPages?'disabled':''}>Next \u203a<\/button><button id=\"lastPage\" ${contactsCurrentPage===totalPages?'disabled':''}>Last \u00bb<\/button>`;\n      document.getElementById('firstPage')?.addEventListener('click',()=>{ contactsCurrentPage=1; refreshContactsPreview(); });\n      document.getElementById('prevPage')?.addEventListener('click',()=>{ if(contactsCurrentPage>1) contactsCurrentPage--; refreshContactsPreview(); });\n      document.getElementById('nextPage')?.addEventListener('click',()=>{ if(contactsCurrentPage<totalPages) contactsCurrentPage++; refreshContactsPreview(); });\n      document.getElementById('lastPage')?.addEventListener('click',()=>{ contactsCurrentPage=totalPages; refreshContactsPreview(); });\n    }\n    document.getElementById('perPageSelect')?.addEventListener('change', (e) => { contactsPerPage = parseInt(e.target.value); contactsCurrentPage=1; refreshContactsPreview(); });\n    \/\/ Upload CSV\n    document.getElementById('uploadContactsBtn')?.addEventListener('click', () => {\n      const file = document.getElementById('contactsCsv').files[0];\n      if(!file) return alert(\"Select CSV\");\n      const reader = new FileReader();\n      reader.onload = function(e) {\n        const rows = e.target.result.split(\/\\r?\\n\/);\n        let newContacts = [];\n        for(let i=0;i<rows.length;i++) {\n          let line = rows[i].trim();\n          if(!line) continue;\n          let parts = line.split(',');\n          if(parts.length<6) { alert(`Row ${i+1} has <6 columns. Skipping.`); continue; }\n          let [status, firstName, lastName, phone, email, sponsorCode] = parts.map(p=>p.trim());\n          if(!firstName && !lastName && !email) continue;\n          newContacts.push({ id:Date.now()+i, status, firstName, lastName, phone, email, sponsorCode });\n        }\n        contacts.push(...newContacts); saveAll(); alert(`Added ${newContacts.length} contacts.`); contactsCurrentPage=1; refreshContactsPreview();\n      };\n      reader.readAsText(file);\n    });\n    \/\/ Lazy load SheetJS for Excel export\n    document.getElementById('downloadContactsExcel')?.addEventListener('click', () => {\n      if(!window.XLSX) {\n        const script = document.createElement('script');\n        script.src = \"https:\/\/cdn.sheetjs.com\/xlsx-0.20.2\/package\/dist\/xlsx.full.min.js\";\n        script.onload = () => exportExcel();\n        document.head.appendChild(script);\n      } else exportExcel();\n      function exportExcel() {\n        const wsData = contacts.map(c => ({ \"Status\":c.status||'', \"First Name\":c.firstName, \"Last Name\":c.lastName, \"Phone\":c.phone, \"Email\":c.email, \"Sponsor Code\":c.sponsorCode||'' }));\n        const ws = XLSX.utils.json_to_sheet(wsData);\n        const wb = XLSX.utils.book_new();\n        XLSX.utils.book_append_sheet(wb, ws, \"Contacts\");\n        XLSX.writeFile(wb, `contacts_${new Date().toISOString().slice(0,19)}.xlsx`);\n      }\n    });\n    \/\/ Lazy load html2pdf for PDF export\n    document.getElementById('downloadContactsPdf')?.addEventListener('click', () => {\n      if(!window.html2pdf) {\n        const script = document.createElement('script');\n        script.src = \"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/html2pdf.js\/0.10.1\/html2pdf.bundle.min.js\";\n        script.onload = () => exportPdf();\n        document.head.appendChild(script);\n      } else exportPdf();\n      function exportPdf() {\n        const tempDiv = document.createElement('div');\n        tempDiv.innerHTML = `<table border=\"1\" cellpadding=\"5\"><thead><tr><th>Status<\/th><th>First Name<\/th><th>Last Name<\/th><th>Phone<\/th><th>Email<\/th><th>Sponsor Code<\/th><\/tr><\/thead><tbody>${contacts.map(c => `<tr><td>${c.status||''}<\/td><td>${c.firstName}<\/td><td>${c.lastName}<\/td><td>${c.phone}<\/td><td>${c.email}<\/td><td>${c.sponsorCode||''}<\/td><\/tr>`).join('')}<\/tbody><\/table>`;\n        document.body.appendChild(tempDiv);\n        html2pdf().from(tempDiv).set({ margin:0.5, filename:'contacts.pdf', html2canvas:{scale:2} }).save().then(()=>tempDiv.remove());\n      }\n    });\n    \/\/ Email broadcast (simulated)\n    document.getElementById('sendEmailBtn')?.addEventListener('click', () => {\n      const subj = document.getElementById('emailSubject').value, msg = document.getElementById('emailMessage').value;\n      if(!subj || !msg) return alert(\"Fill subject & message\");\n      allUsers.forEach(u => console.log(`To ${u.email}: ${subj} - ${msg.replace(\/{name}\/g, u.name)}`));\n      alert(`Email sent to ${allUsers.length} users (simulated).`);\n    });\n    refreshContactsPreview();\n  }\n\n  function openEditModal(user) {\n    const modal = document.createElement('div'); modal.className = 'modal'; modal.style.display = 'flex';\n    modal.innerHTML = `<div class=\"modal-content\"><span class=\"close-modal\">&times;<\/span><h3>Edit User<\/h3><label>First Name<\/label><input id=\"editFirstName\" value=\"${user.firstName}\"><label>Last Name<\/label><input id=\"editLastName\" value=\"${user.lastName}\"><label>Email<\/label><input id=\"editEmail\" value=\"${user.email}\"><label>Phone<\/label><input id=\"editPhone\" value=\"${user.phone||''}\"><label>Country<\/label><input id=\"editCountry\" value=\"${user.country||''}\"><label>Gender<\/label><select id=\"editGender\"><option ${user.gender==='Male'?'selected':''}>Male<\/option><option ${user.gender==='Female'?'selected':''}>Female<\/option><\/select><label>Age Group<\/label><select id=\"editAgeGroup\"><option ${user.ageGroup==='18-24'?'selected':''}>18-24<\/option><option ${user.ageGroup==='25-34'?'selected':''}>25-34<\/option><option ${user.ageGroup==='35-44'?'selected':''}>35-44<\/option><option ${user.ageGroup==='45+'?'selected':''}>45+<\/option><\/select><label>Wallet Status<\/label><select id=\"editWalletStatus\"><option ${user.walletStatus==='Active'?'selected':''}>Active<\/option><option ${user.walletStatus==='Not Active'?'selected':''}>Not Active<\/option><\/select><button class=\"btn-primary\" id=\"saveUserEdit\">Save<\/button><\/div>`;\n    document.body.appendChild(modal);\n    modal.querySelector('.close-modal').onclick = () => modal.remove();\n    modal.querySelector('#saveUserEdit').onclick = () => {\n      user.firstName = modal.querySelector('#editFirstName').value;\n      user.lastName = modal.querySelector('#editLastName').value;\n      user.name = user.firstName + \" \" + user.lastName;\n      user.email = modal.querySelector('#editEmail').value;\n      user.phone = modal.querySelector('#editPhone').value;\n      user.country = modal.querySelector('#editCountry').value;\n      user.gender = modal.querySelector('#editGender').value;\n      user.ageGroup = modal.querySelector('#editAgeGroup').value;\n      user.walletStatus = modal.querySelector('#editWalletStatus').value;\n      saveAll(); alert(\"Updated\"); modal.remove(); renderAdminPanel(getCurrentUser());\n    };\n  }\n\n  \/\/ ----- ADVERTISER DASHBOARD (unchanged) -----\n  function renderAdvertiserDashboard(user) {\n    const myAds = ads.filter(ad => ad.advertiserId === user.id);\n    dynamicPanel.innerHTML = `<div class=\"flex-between\"><h2>\ud83d\udce2 Advertiser Hub<\/h2><span class=\"badge\">\ud83d\udcb0 Wallet: ${user.advertiserWallet.toFixed(0)} UGX<\/span><\/div>\n      <div class=\"grid-2\"><div class=\"card\"><h3>\u2795 Create Ad Campaign<\/h3><input id=\"adTitle\" placeholder=\"Title\"><select id=\"adType\"><option>video<\/option><option>audio<\/option><option>banner<\/option><\/select><input id=\"adMedia\" placeholder=\"Media URL\"><textarea id=\"adInstructions\" placeholder=\"Special instructions\"><\/textarea><select id=\"dailyCostSelect\"><option value=\"2000\">UGX 2,000 \/ day<\/option><option value=\"3800\">$1 (3800 UGX) \/ day<\/option><\/select><button id=\"createAdBtn\" class=\"btn-primary\">Create Campaign<\/button><\/div>\n      <div class=\"card\"><h3>\ud83d\udcb0 Fund Wallet<\/h3><input id=\"fundAmount\" value=\"10000\"><select id=\"payMethod\"><option>MTN MoMo<\/option><option>Airtel Money<\/option><option>M-Pesa<\/option><option>Visa \/ Mastercard<\/option><option>PayPal<\/option><\/select><button id=\"fundWalletBtn\" class=\"btn-primary\">Add Funds<\/button><hr><h4>Your Active Campaigns<\/h4><div id=\"advertiserAdsList\"><\/div><\/div><\/div>\n      <div id=\"smmServicesContainer\" class=\"card\"><\/div>`;\n    document.getElementById('createAdBtn')?.addEventListener('click', () => {\n      const title = document.getElementById('adTitle').value, type = document.getElementById('adType').value, media = document.getElementById('adMedia').value, inst = document.getElementById('adInstructions').value, cost = document.getElementById('dailyCostSelect').value===\"2000\"?2000:3800;\n      if(!title || !media) return alert(\"Required\");\n      ads.push({ id:Date.now(), advertiserId:user.id, title, type, mediaUrl:media, specialInstructions:inst, dailyCostUGX:cost, activeUntil:null, isActive:false });\n      saveAll(); alert(\"Campaign created\"); renderAdvertiserDashboard(user);\n    });\n    document.getElementById('fundWalletBtn')?.addEventListener('click', () => { let amt = parseFloat(document.getElementById('fundAmount').value); if(amt>0){ user.advertiserWallet+=amt; saveAll(); alert(\"Funds added\"); renderAdvertiserDashboard(user); } });\n    const adsDiv = document.getElementById('advertiserAdsList');\n    adsDiv.innerHTML = myAds.map(ad => `<div><strong>${ad.title}<\/strong> - ${ad.isActive && ad.activeUntil>Date.now() ? 'Active' : 'Inactive'} <button class=\"btn-sm\" data-adid=\"${ad.id}\">Activate (${ad.dailyCostUGX} UGX)<\/button><\/div>`).join('');\n    document.querySelectorAll('[data-adid]').forEach(btn => btn.addEventListener('click', () => {\n      const adId = parseInt(btn.dataset.adid), ad = ads.find(a=>a.id===adId);\n      if(ad && user.advertiserWallet >= ad.dailyCostUGX) { user.advertiserWallet -= ad.dailyCostUGX; ad.isActive=true; ad.activeUntil=Date.now()+86400000; updatePlatformRevenue(ad.dailyCostUGX); saveAll(); alert(\"Activated\"); renderAdvertiserDashboard(user); }\n      else alert(\"Insufficient balance\");\n    }));\n    const smmDiv = document.getElementById('smmServicesContainer');\n    if(smmDiv) {\n      smmDiv.innerHTML = `<h3>SMM Services (Powered by Adase)<\/h3><button class=\"btn-primary\" id=\"buySmmDemo\">Buy Demo (1000 TikTok Views = 10326 UGX)<\/button>`;\n      document.getElementById('buySmmDemo')?.addEventListener('click', () => { if(user.advertiserWallet >= 10326) { user.advertiserWallet -= 10326; updatePlatformRevenue(10326); saveAll(); alert(\"Order placed! 1000 TikTok Views purchased.\"); renderAdvertiserDashboard(user); } else alert(\"Insufficient wallet\"); });\n    }\n  }\n\n  loadData();\n  renderApp();\n<\/script>\n<\/body>\n<\/html>\n\n\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, viewport-fit=cover\">\n    <title>Adase Ads Ltd \u00b7 Serie A Funding Round<\/title>\n    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/html2canvas\/1.4.1\/html2canvas.min.js\"><\/script>\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Alex+Brush&#038;display=swap\" rel=\"stylesheet\">\n    <style>\n        * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n            font-family: 'Inter', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;\n        }\n        body {\n            background: #0c011f;\n            padding: 1.5rem;\n        }\n        .dashboard {\n            max-width: 1400px;\n            margin: 0 auto;\n            background: #fefaf0;\n            border-radius: 2rem;\n            box-shadow: 0 20px 35px -12px rgba(0,0,0,0.4);\n            overflow: hidden;\n            border: 2px solid #c5f82a;\n        }\n        .header {\n            background: #4c1d95;\n            padding: 1rem 2rem;\n            color: white;\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            flex-wrap: wrap;\n            gap: 1rem;\n            border-bottom: 5px solid #d9ff33;\n        }\n        .logo {\n            font-size: 1.8rem;\n            font-weight: 800;\n        }\n        .logo span { color: #d9ff33; }\n        .price-panel {\n            background: #2b0f5e;\n            padding: 0.5rem 1rem;\n            border-radius: 60px;\n            display: flex;\n            gap: 1.5rem;\n            font-weight: bold;\n            flex-wrap: wrap;\n        }\n        .price-panel div { white-space: nowrap; }\n        .ticker-wrap {\n            background: #1e1038;\n            padding: 0.8rem 0;\n            border-bottom: 2px solid #d9ff33;\n            border-top: 2px solid #d9ff33;\n            overflow: hidden;\n            white-space: nowrap;\n            position: relative;\n        }\n        .ticker {\n            display: inline-block;\n            animation: scrollTicker 45s linear infinite;\n            white-space: nowrap;\n        }\n        .ticker-item {\n            display: inline-block;\n            background: #2d204c;\n            margin-right: 2rem;\n            padding: 0.4rem 1.2rem;\n            border-radius: 40px;\n            font-size: 0.9rem;\n            font-weight: 500;\n            color: #f0eef7;\n        }\n        .ticker-item.buy { background: #2b4b2b; border-left: 5px solid #d9ff33; }\n        @keyframes scrollTicker {\n            0% { transform: translateX(0); }\n            100% { transform: translateX(-50%); }\n        }\n        .explanation {\n            background: linear-gradient(135deg, #f3eaff, #ffffff);\n            padding: 2rem;\n            margin: 1rem;\n            border-radius: 1.5rem;\n            border-left: 8px solid #d9ff33;\n            border-right: 8px solid #7c3aed;\n        }\n        .explanation h2 {\n            color: #2d1c4a;\n            margin-bottom: 1rem;\n        }\n        .explanation p {\n            color: #2d2642;\n            line-height: 1.6;\n            margin-bottom: 1rem;\n        }\n        .explanation ul {\n            margin-left: 2rem;\n            color: #2d2642;\n        }\n        .explanation li {\n            margin: 0.5rem 0;\n        }\n        .main-grid {\n            display: flex;\n            flex-wrap: wrap;\n            gap: 1.8rem;\n            padding: 2rem;\n        }\n        .stats-card {\n            flex: 2;\n            background: white;\n            border-radius: 1.5rem;\n            padding: 1.5rem;\n            box-shadow: 0 6px 14px rgba(0,0,0,0.05);\n            border-top: 5px solid #7c3aed;\n        }\n        .admin-card {\n            flex: 1.5;\n            background: white;\n            border-radius: 1.5rem;\n            padding: 1.5rem;\n            box-shadow: 0 6px 14px rgba(0,0,0,0.05);\n            border-top: 5px solid #d9ff33;\n        }\n        h3 {\n            color: #2d1c4a;\n            margin-bottom: 1rem;\n            border-left: 6px solid #d9ff33;\n            padding-left: 0.8rem;\n        }\n        button, .btn-download {\n            background: #7c3aed;\n            border: none;\n            color: white;\n            padding: 0.6rem 1.2rem;\n            border-radius: 40px;\n            font-weight: bold;\n            cursor: pointer;\n            transition: 0.1s linear;\n            margin-top: 0.5rem;\n        }\n        button:active { transform: translateY(2px); }\n        .btn-cert {\n            background: #2c5e2e;\n            font-size: 0.75rem;\n            padding: 0.3rem 0.8rem;\n        }\n        .login-form, .entry-form {\n            display: flex;\n            flex-direction: column;\n            gap: 1rem;\n        }\n        input, select {\n            padding: 0.7rem;\n            border-radius: 30px;\n            border: 1px solid #c5b5e6;\n            background: #fefcf5;\n            font-size: 0.9rem;\n        }\n        .error-msg { color: #cc4444; font-size: 0.8rem; }\n        .success-msg { color: #2d6a2d; }\n        .transaction-table { overflow-x: auto; margin-top: 1rem; }\n        table { width: 100%; border-collapse: collapse; font-size: 0.8rem; }\n        th, td { padding: 0.5rem; text-align: left; border-bottom: 1px solid #e0d6f0; }\n        footer {\n            background: #130b24;\n            color: #a99ad6;\n            text-align: center;\n            padding: 1rem;\n            font-size: 0.8rem;\n        }\n        .certificate-container {\n            position: fixed;\n            top: -1000px;\n            left: -1000px;\n            width: 794px;\n            height: 1123px;\n            background: #fffef7;\n            box-shadow: 0 0 0 8px #d9ff33, 0 0 0 12px #7c3aed;\n            border-radius: 20px;\n            padding: 2rem;\n            font-family: 'Georgia', serif;\n            z-index: -1;\n        }\n        .certificate-inner {\n            border: 2px solid #d9ff33;\n            height: 100%;\n            border-radius: 16px;\n            padding: 2rem;\n            display: flex;\n            flex-direction: column;\n            justify-content: space-between;\n        }\n        .cert-header {\n            text-align: center;\n            border-bottom: 2px solid #7c3aed;\n            padding-bottom: 1rem;\n        }\n        .cert-header h1 {\n            font-size: 2.5rem;\n            color: #4c1d95;\n        }\n        .cert-body {\n            text-align: center;\n            margin: 2rem 0;\n        }\n        .cert-recipient {\n            font-size: 1.8rem;\n            font-weight: bold;\n            color: #2c1a4a;\n            margin: 1rem 0;\n        }\n        .cert-details {\n            font-size: 1.2rem;\n            margin: 1rem 0;\n            line-height: 1.8;\n        }\n        .cert-signature {\n            margin-top: 2rem;\n            text-align: center;\n        }\n        .signature {\n            font-family: 'Alex Brush', cursive;\n            font-size: 2.5rem;\n            font-weight: bold;\n            color: #1e40af;\n            border-top: 1px dashed #7c3aed;\n            display: inline-block;\n            padding-top: 0.5rem;\n        }\n        .ceo-name {\n            font-size: 1rem;\n            margin-top: 0.2rem;\n            color: #2d2a42;\n        }\n        .seal {\n            width: 120px;\n            height: 120px;\n            border-radius: 50%;\n            background: conic-gradient(from 0deg, #7c3aed, #d9ff33, #ffffff, #7c3aed);\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            margin: 1rem auto;\n            box-shadow: 0 0 0 4px white, 0 0 0 8px #d9ff33;\n        }\n        .seal span {\n            background: rgba(255,255,245,0.9);\n            padding: 0.5rem;\n            border-radius: 50%;\n            font-size: 0.9rem;\n            font-weight: 800;\n            text-align: center;\n        }\n        @media (max-width: 700px) {\n            body { padding: 0.8rem; }\n            .header { flex-direction: column; text-align: center; }\n        }\n    <\/style>\n<\/head>\n<body>\n<div class=\"dashboard\">\n    <div class=\"header\">\n        <div class=\"logo\">Adase<span>Ads<\/span> \u00b7 Serie A Funding<\/div>\n        <div class=\"price-panel\">\n            <div>\ud83d\udc9c Share Price: <span id=\"sharePrice\">UGX 100,000<\/span><\/div>\n            <div>\ud83c\udf4b Participants: <span id=\"participantCount\">0<\/span> \/ 77<\/div>\n            <div>\ud83d\udcca Total Shares Issued: <span id=\"totalSharesIssued\">0<\/span><\/div>\n        <\/div>\n    <\/div>\n\n    <!-- Ticker visible to all -->\n    <div class=\"ticker-wrap\">\n        <div class=\"ticker\" id=\"tickerStrip\"><\/div>\n    <\/div>\n\n    <!-- Compelling explanation for all visitors -->\n    <div class=\"explanation\">\n        <h2>\ud83d\ude80 Why invest in Adase Ads Ltd Serie A?<\/h2>\n        <p>Adase Ads is building the next-generation AI-powered advertising network for African SMEs and global brands. With a proprietary ad engine and a growing community of agents, we are poised to disrupt the digital ad market.<\/p>\n        <ul>\n            <li><strong>\ud83d\udc8e Exclusive opportunity:<\/strong> Only 77 investors will ever participate in this Serie A round.<\/li>\n            <li><strong>\ud83d\udcc8 High growth potential:<\/strong> The African digital ad market is projected to grow 300% by 2028.<\/li>\n            <li><strong>\ud83d\udd12 Fixed price:<\/strong> UGX 100,000 per share \u2013 no dilution, no hidden fees.<\/li>\n            <li><strong>\ud83c\udfc6 First-mover advantage:<\/strong> Get equity in a fast-scaling fintech-adtech hybrid.<\/li>\n            <li><strong>\ud83e\udd1d Community ownership:<\/strong> Join a network of visionary backers.<\/li>\n        <\/ul>\n        <p><strong>\u23f3 Limited slots remaining \u2013 invest now to secure your stake in Africa&#8217;s ad revolution.<\/strong><\/p>\n    <\/div>\n\n    <div class=\"main-grid\">\n        <div class=\"stats-card\">\n            <h3>\ud83d\udcc8 Recent investments<\/h3>\n            <div class=\"transaction-table\">\n                <table id=\"txTable\">\n                    <thead>\n                        <tr><th>Name<\/th><th>Shares<\/th><th>Amount (UGX)<\/th><th>Date<\/th><th>Total owned<\/th><th>Certificate<\/th> <\/tr\n                    <\/thead>\n                    <tbody id=\"txTbody\"><\/tbody>\n                <\/table>\n            <\/div>\n            <button id=\"downloadBtn\" class=\"btn-download\" style=\"background:#2c5e2e;\">\u2b07\ufe0f Download CSV (all investments)<\/button>\n        <\/div>\n\n        <div class=\"admin-card\">\n            <h3>\ud83d\udd10 Admin Access (Investment Registration)<\/h3>\n            <div id=\"loginSection\">\n                <div class=\"login-form\">\n                    <input type=\"email\" id=\"loginEmail\" placeholder=\"Admin Email\" autocomplete=\"off\">\n                    <input type=\"password\" id=\"loginPassword\" placeholder=\"Admin Password\" autocomplete=\"off\">\n                    <button id=\"loginBtnAdmin\">Login to Register Investments<\/button>\n                    <div id=\"loginMsg\" class=\"error-msg\"><\/div>\n                <\/div>\n            <\/div>\n            <div id=\"entrySection\" style=\"display: none;\">\n                <h4>\u2795 Register New Investment<\/h4>\n                <div class=\"entry-form\">\n                    <input type=\"text\" id=\"fullName\" placeholder=\"Full name\">\n                    <input type=\"email\" id=\"userEmail\" placeholder=\"Email address\">\n                    <input type=\"text\" id=\"sponsorCode\" placeholder=\"Sponsor \/ Referral Code (optional)\">\n                    <input type=\"number\" id=\"shareAmount\" placeholder=\"Number of shares (min 1)\" step=\"1\" min=\"1\" value=\"1\">\n                    <button id=\"submitTxBtn\">\u2714 Buy Shares (UGX 100,000 each)<\/button>\n                    <div id=\"entryMsg\" class=\"error-msg\"><\/div>\n                    <button id=\"logoutBtn\" style=\"background:#5e4b8b;\">\ud83d\udeaa Logout<\/button>\n                    <div id=\"remainingMsg\" style=\"margin-top:0.5rem; font-size:0.8rem; color:#4c1d95;\"><\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n    <footer>\ud83d\udc9c \ud83c\udf4b Adase Ads Ltd Serie A Funding Round \u2013 Maximum 77 participants. Price per share fixed at UGX 100,000. Admin login required to register investments.<\/footer>\n<\/div>\n\n<div id=\"certificateTemplate\" class=\"certificate-container\" style=\"display: none;\">\n    <div class=\"certificate-inner\">\n        <div class=\"cert-header\">\n            <h1>ADASE ADS LTD<\/h1>\n            <p>Serie A Equity Certificate<\/p>\n        <\/div>\n        <div class=\"cert-body\">\n            <div class=\"seal\"><span>Adase<br>Equity<\/span><\/div>\n            <div class=\"cert-recipient\" id=\"certName\"><\/div>\n            <div class=\"cert-details\" id=\"certDetails\"><\/div>\n            <div class=\"cert-details\" id=\"certSponsor\"><\/div>\n            <div class=\"cert-signature\">\n                <div class=\"signature\" id=\"certSignature\">Verified<\/div>\n                <div class=\"ceo-name\">Asanasio Namanya<br>Chief Executive Officer<\/div>\n            <\/div>\n        <\/div>\n        <div class=\"cert-footer\">\n            <span>This certificate confirms participation in the Serie A Funding Round.<\/span>\n        <\/div>\n    <\/div>\n<\/div>\n\n<script>\n    \/\/ ---------- DATA MODELS ----------\n    let users = [];          \/\/ { email, name, sponsorCode, shares }\n    let transactions = [];   \/\/ { id, name, email, shares, amountUGX, date, totalSharesOwned, sponsorCode }\n    const SHARE_PRICE_UGX = 100000;\n    const MAX_PARTICIPANTS = 77;\n\n    function saveData() {\n        localStorage.setItem('adase_users', JSON.stringify(users));\n        localStorage.setItem('adase_transactions', JSON.stringify(transactions));\n    }\n\n    function loadData() {\n        const storedUsers = localStorage.getItem('adase_users');\n        const storedTx = localStorage.getItem('adase_transactions');\n        if (storedUsers) users = JSON.parse(storedUsers);\n        if (storedTx) transactions = JSON.parse(storedTx);\n\n        if (users.length === 0) {\n            \/\/ Seed demo data with 2 participants\n            users = [\n                { email: \"alice@example.com\", name: \"Alice Wonder\", sponsorCode: \"ALICE01\", shares: 10 },\n                { email: \"bob@builder.com\", name: \"Bob Builder\", sponsorCode: \"BOB22\", shares: 5 }\n            ];\n            const now = new Date().toISOString().slice(0,10);\n            transactions = [\n                { id: Date.now()+1, name: \"Alice Wonder\", email: \"alice@example.com\", shares: 10, amountUGX: 10*SHARE_PRICE_UGX, date: now, totalSharesOwned: 10, sponsorCode: \"ALICE01\" },\n                { id: Date.now()+2, name: \"Bob Builder\", email: \"bob@builder.com\", shares: 5, amountUGX: 5*SHARE_PRICE_UGX, date: now, totalSharesOwned: 5, sponsorCode: \"BOB22\" }\n            ];\n            saveData();\n        }\n        updateUI();\n    }\n\n    function getUserByEmail(email) { return users.find(u => u.email === email); }\n    function addOrUpdateUser(email, name, sponsorCode, sharesToAdd) {\n        let user = users.find(u => u.email === email);\n        if (!user) {\n            if (users.length >= MAX_PARTICIPANTS) return { success: false, msg: `Maximum ${MAX_PARTICIPANTS} participants reached. No new investors allowed.` };\n            user = { email, name, sponsorCode, shares: 0 };\n            users.push(user);\n        } else {\n            user.name = name;\n            if (sponsorCode) user.sponsorCode = sponsorCode;\n        }\n        user.shares += sharesToAdd;\n        saveData();\n        return { success: true, user };\n    }\n\n    function processInvestment(fullName, email, sponsorCode, sharesNum) {\n        if (isNaN(sharesNum) || sharesNum <= 0) return { success: false, msg: \"Shares must be a positive integer\" };\n        \n        let existingUser = getUserByEmail(email);\n        if (!existingUser) {\n            if (users.length >= MAX_PARTICIPANTS) {\n                return { success: false, msg: `Sorry, the maximum of ${MAX_PARTICIPANTS} participants has been reached. No new investors can join.` };\n            }\n        }\n        \n        const result = addOrUpdateUser(email, fullName, sponsorCode, sharesNum);\n        if (!result.success) return result;\n        \n        const user = result.user;\n        const amountUGX = sharesNum * SHARE_PRICE_UGX;\n        const txDate = new Date().toISOString().slice(0,10);\n        const newTx = {\n            id: Date.now(),\n            name: fullName,\n            email,\n            shares: sharesNum,\n            amountUGX: amountUGX,\n            date: txDate,\n            totalSharesOwned: user.shares,\n            sponsorCode: sponsorCode || ''\n        };\n        transactions.unshift(newTx);\n        saveData();\n        updateUI();\n        return { success: true, msg: `${fullName} bought ${sharesNum} share(s) for UGX ${amountUGX.toLocaleString()}. Total shares now: ${user.shares}`, tx: newTx };\n    }\n\n    async function generateCertificate(tx) {\n        const template = document.getElementById('certificateTemplate');\n        const clone = template.cloneNode(true);\n        clone.style.display = 'block';\n        clone.style.position = 'fixed';\n        clone.style.top = '0';\n        clone.style.left = '0';\n        clone.style.zIndex = '9999';\n        document.body.appendChild(clone);\n\n        clone.querySelector('#certName').innerText = tx.name;\n        clone.querySelector('#certDetails').innerHTML = `<strong>${tx.shares} shares<\/strong> at UGX ${SHARE_PRICE_UGX.toLocaleString()} each<br>Total investment: UGX ${tx.amountUGX.toLocaleString()}<br>Total shares now held: <strong>${tx.totalSharesOwned}<\/strong>`;\n        clone.querySelector('#certSponsor').innerHTML = `Sponsor Code: <strong>${tx.sponsorCode || '\u2014'}<\/strong>`;\n        await new Promise(r => setTimeout(r, 200));\n        const canvas = await html2canvas(clone, { scale: 2, backgroundColor: '#fffef7' });\n        const link = document.createElement('a');\n        link.download = `Adase_Certificate_${tx.name.replace(\/\\s\/g,'_')}_${tx.id}.png`;\n        link.href = canvas.toDataURL('image\/png');\n        link.click();\n        document.body.removeChild(clone);\n    }\n\n    function updateUI() {\n        const participantCount = users.length;\n        const totalShares = users.reduce((sum, u) => sum + u.shares, 0);\n        document.getElementById('participantCount').innerText = `${participantCount}`;\n        document.getElementById('totalSharesIssued').innerText = totalShares;\n        document.getElementById('sharePrice').innerText = `UGX ${SHARE_PRICE_UGX.toLocaleString()}`;\n        \n        const remainingSlots = MAX_PARTICIPANTS - participantCount;\n        const remainingMsg = document.getElementById('remainingMsg');\n        if (remainingMsg) {\n            if (remainingSlots > 0) {\n                remainingMsg.innerHTML = `\u2705 ${remainingSlots} slot(s) remaining out of ${MAX_PARTICIPANTS} maximum participants.`;\n                remainingMsg.style.color = \"#2d6a2d\";\n            } else {\n                remainingMsg.innerHTML = `\ud83d\udd34 The maximum of ${MAX_PARTICIPANTS} participants has been reached. No new investors can join.`;\n                remainingMsg.style.color = \"#cc4444\";\n            }\n        }\n\n        const tbody = document.getElementById('txTbody');\n        tbody.innerHTML = '';\n        transactions.slice(0, 30).forEach(tx => {\n            const row = tbody.insertRow();\n            row.insertCell(0).innerText = tx.name;\n            row.insertCell(1).innerText = tx.shares;\n            row.insertCell(2).innerText = `UGX ${tx.amountUGX.toLocaleString()}`;\n            row.insertCell(3).innerText = tx.date;\n            row.insertCell(4).innerText = tx.totalSharesOwned;\n            const certCell = row.insertCell(5);\n            const certBtn = document.createElement('button');\n            certBtn.innerText = '\ud83d\udcc4 Cert';\n            certBtn.className = 'btn-cert';\n            certBtn.onclick = (function(t) { return () => generateCertificate(t); })(tx);\n            certCell.appendChild(certBtn);\n        });\n\n        const tickerDiv = document.getElementById('tickerStrip');\n        tickerDiv.innerHTML = '';\n        transactions.slice(0, 40).forEach(tx => {\n            const span = document.createElement('span');\n            span.className = 'ticker-item buy';\n            span.innerHTML = `\ud83c\udf89 ${tx.name} bought ${tx.shares} share(s) (UGX ${tx.amountUGX.toLocaleString()}) on ${tx.date} \u2192 now owns ${tx.totalSharesOwned} shares`;\n            tickerDiv.appendChild(span);\n            tickerDiv.appendChild(span.cloneNode(true));\n        });\n        if (transactions.length === 0) tickerDiv.innerHTML = '<span class=\"ticker-item\">\u2728 No investments yet \u2014 be the first participant<\/span>';\n    }\n\n    function downloadCSV() {\n        let csvRows = [[\"Name\",\"Email\",\"Shares\",\"Amount (UGX)\",\"Date\",\"Total Shares Owned\",\"Sponsor Code\"]];\n        transactions.forEach(tx => {\n            csvRows.push([tx.name, tx.email, tx.shares, tx.amountUGX, tx.date, tx.totalSharesOwned, tx.sponsorCode || \"\"]);\n        });\n        const csvContent = csvRows.map(row => row.join(\",\")).join(\"\\n\");\n        const blob = new Blob([csvContent], { type: \"text\/csv\" });\n        const link = document.createElement(\"a\");\n        const url = URL.createObjectURL(blob);\n        link.href = url;\n        link.download = `adase_serieA_investments_${new Date().toISOString().slice(0,10)}.csv`;\n        document.body.appendChild(link);\n        link.click();\n        document.body.removeChild(link);\n        URL.revokeObjectURL(url);\n    }\n\n    \/\/ ---------- ADMIN LOGIN (hidden credentials) ----------\n    let loggedIn = false;\n    const adminEmail = \"shares@cashchat.se\";\n    const adminPassword = \"Equity.King2026\";\n\n    function checkLogin() {\n        const emailInput = document.getElementById('loginEmail').value.trim();\n        const passInput = document.getElementById('loginPassword').value;\n        if (emailInput === adminEmail && passInput === adminPassword) {\n            loggedIn = true;\n            document.getElementById('loginSection').style.display = 'none';\n            document.getElementById('entrySection').style.display = 'block';\n            document.getElementById('loginMsg').innerHTML = '<span style=\"color:#2d6a2d;\">\u2705 Login successful. You can now register investments.<\/span>';\n            setTimeout(() => { document.getElementById('loginMsg').innerHTML = ''; }, 2000);\n        } else {\n            document.getElementById('loginMsg').innerText = '\u274c Invalid admin credentials. Access denied.';\n        }\n    }\n\n    function logout() {\n        loggedIn = false;\n        document.getElementById('loginSection').style.display = 'block';\n        document.getElementById('entrySection').style.display = 'none';\n        document.getElementById('loginEmail').value = '';\n        document.getElementById('loginPassword').value = '';\n        document.getElementById('entryMsg').innerText = '';\n        document.getElementById('loginMsg').innerText = '';\n    }\n\n    function submitEntry() {\n        if (!loggedIn) { \n            document.getElementById('entryMsg').innerText = '\u26a0\ufe0f Admin login required to register investments.';\n            return; \n        }\n        const fullName = document.getElementById('fullName').value.trim();\n        const email = document.getElementById('userEmail').value.trim();\n        const sponsor = document.getElementById('sponsorCode').value.trim();\n        const sharesRaw = document.getElementById('shareAmount').value;\n        const sharesNum = Number(sharesRaw);\n        if (!fullName || !email) { document.getElementById('entryMsg').innerText = \"Full name and email required\"; return; }\n        if (isNaN(sharesNum) || sharesNum <= 0 || !Number.isInteger(sharesNum)) { document.getElementById('entryMsg').innerText = \"Enter a positive integer number of shares\"; return; }\n        \n        const result = processInvestment(fullName, email, sponsor, sharesNum);\n        if (result.success) {\n            document.getElementById('entryMsg').innerHTML = `<span class=\"success-msg\">\u2705 ${result.msg}<\/span>`;\n            document.getElementById('fullName').value = '';\n            document.getElementById('userEmail').value = '';\n            document.getElementById('sponsorCode').value = '';\n            document.getElementById('shareAmount').value = '1';\n            updateUI();\n            if (result.tx) generateCertificate(result.tx);\n        } else {\n            document.getElementById('entryMsg').innerText = result.msg;\n        }\n    }\n\n    \/\/ Initialisation\n    loadData();\n\n    const loginBtn = document.getElementById('loginBtnAdmin');\n    const logoutBtn = document.getElementById('logoutBtn');\n    const submitBtn = document.getElementById('submitTxBtn');\n    const downloadBtn = document.getElementById('downloadBtn');\n\n    if (loginBtn) loginBtn.addEventListener('click', checkLogin);\n    if (logoutBtn) logoutBtn.addEventListener('click', logout);\n    if (submitBtn) submitBtn.addEventListener('click', submitEntry);\n    if (downloadBtn) downloadBtn.addEventListener('click', downloadCSV);\n<\/script>\n<\/body>\n<\/html>\n\n\n\n\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=yes\">\n  <title>Mailing List Manager | Secure Bulk Email Platform<\/title>\n  <!-- Bootstrap 5 + Icons + Fonts -->\n  <link href=\"https:\/\/cdn.jsdelivr.net\/npm\/bootstrap@5.3.0-alpha1\/dist\/css\/bootstrap.min.css\" rel=\"stylesheet\">\n  <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.0.0-beta3\/css\/all.min.css\">\n  <style>\n    body {\n      background: #f4f7fc;\n      font-family: 'Inter', system-ui, -apple-system, 'Segoe UI', Roboto;\n    }\n    .card-shadow {\n      border-radius: 1.25rem;\n      box-shadow: 0 12px 28px rgba(0,0,0,0.05), 0 0 1px rgba(0,0,0,0.1);\n      transition: all 0.2s ease;\n    }\n    .admin-card {\n      background: white;\n      border: none;\n    }\n    .login-overlay {\n      background: rgba(0,0,0,0.03);\n    }\n    .table-responsive-custom {\n      overflow-x: auto;\n    }\n    .btn-sm-rounded {\n      border-radius: 40px;\n    }\n    footer {\n      font-size: 0.85rem;\n      border-top: 1px solid #dee2e6;\n    }\n    .spam-safe-badge {\n      background: #e3f7ec;\n      color: #1e7b48;\n      font-size: 0.75rem;\n      font-weight: 500;\n    }\n    @media (max-width: 768px) {\n      .container { padding-left: 1rem; padding-right: 1rem; }\n      h1 { font-size: 1.8rem; }\n    }\n  <\/style>\n<\/head>\n<body>\n\n<div class=\"container py-4 py-md-5\">\n  <!-- Header & Brand -->\n  <div class=\"d-flex flex-wrap justify-content-between align-items-center mb-4\">\n    <div>\n      <h1 class=\"display-6 fw-bold\"><i class=\"fas fa-envelope-open-text text-primary me-2\"><\/i>MailFlow<span class=\"fw-light\"> Manager<\/span><\/h1>\n      <p class=\"text-muted\">GDPR-ready \u2022 Smart delivery \u2022 Never-spam architecture<\/p>\n    <\/div>\n    <div>\n      <span class=\"badge spam-safe-badge p-2\"><i class=\"fas fa-shield-alt me-1\"><\/i> SPF\/DKIM ready | Anti-spam headers<\/span>\n    <\/div>\n  <\/div>\n\n  <!-- Public Subscription & Unsubscribe Cards (visible always) -->\n  <div class=\"row g-4 mb-5\">\n    <div class=\"col-md-6\">\n      <div class=\"card card-shadow h-100 border-0\">\n        <div class=\"card-body p-4\">\n          <h4 class=\"card-title\"><i class=\"fas fa-user-plus text-success me-2\"><\/i>Join Newsletter<\/h4>\n          <p class=\"card-text text-secondary\">Get updates &#038; offers. No spam, unsubscribe anytime.<\/p>\n          <form id=\"subscribeForm\">\n            <div class=\"mb-3\">\n              <label class=\"form-label\">Email address<\/label>\n              <input type=\"email\" class=\"form-control\" id=\"subEmail\" placeholder=\"name@example.com\" required>\n            <\/div>\n            <div class=\"mb-3\">\n              <label class=\"form-label\">Full name (optional)<\/label>\n              <input type=\"text\" class=\"form-control\" id=\"subName\" placeholder=\"Alex Johnson\">\n            <\/div>\n            <button type=\"submit\" class=\"btn btn-success w-100\"><i class=\"fas fa-bell me-2\"><\/i>Subscribe<\/button>\n          <\/form>\n          <div id=\"subMsg\" class=\"mt-3 small\"><\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n    <div class=\"col-md-6\">\n      <div class=\"card card-shadow h-100 border-0\">\n        <div class=\"card-body p-4\">\n          <h4 class=\"card-title\"><i class=\"fas fa-user-slash text-danger me-2\"><\/i>Unsubscribe instantly<\/h4>\n          <p class=\"card-text text-secondary\">Remove your email from our records immediately.<\/p>\n          <form id=\"unsubPublicForm\">\n            <div class=\"mb-3\">\n              <label class=\"form-label\">Email to unsubscribe<\/label>\n              <input type=\"email\" class=\"form-control\" id=\"unsubEmail\" placeholder=\"member@example.com\" required>\n            <\/div>\n            <button type=\"submit\" class=\"btn btn-outline-danger w-100\"><i class=\"fas fa-trash-alt me-2\"><\/i>Unsubscribe<\/button>\n          <\/form>\n          <div id=\"unsubMsg\" class=\"mt-3 small\"><\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- Admin Section: Hidden until login using specific credentials -->\n  <div id=\"adminSection\" style=\"display: none;\">\n    <div class=\"d-flex justify-content-between align-items-center mb-3 flex-wrap\">\n      <h3 class=\"fw-semibold\"><i class=\"fas fa-lock-open me-2 text-warning\"><\/i>Admin Dashboard \u2013 Community Hub<\/h3>\n      <button id=\"logoutBtn\" class=\"btn btn-sm btn-outline-secondary\"><i class=\"fas fa-sign-out-alt me-1\"><\/i>Logout<\/button>\n    <\/div>\n    <!-- Tabs \/ Action row -->\n    <div class=\"row g-4\">\n      <!-- Left: Contact management -->\n      <div class=\"col-lg-8\">\n        <div class=\"card card-shadow admin-card mb-4\">\n          <div class=\"card-header bg-white border-0 pt-4 pb-0\">\n            <h5><i class=\"fas fa-users me-2\"><\/i>Community Members (<span id=\"contactCount\">0<\/span>)<\/h5>\n            <hr class=\"mt-2\">\n          <\/div>\n          <div class=\"card-body\">\n            <div class=\"d-flex flex-wrap gap-2 mb-3\">\n              <input type=\"file\" id=\"csvUpload\" accept=\".csv\" class=\"form-control w-auto d-inline-block\" style=\"max-width: 260px;\">\n              <button id=\"uploadCsvBtn\" class=\"btn btn-sm btn-primary\"><i class=\"fas fa-upload\"><\/i> Upload CSV<\/button>\n              <button id=\"downloadExcelBtn\" class=\"btn btn-sm btn-success\"><i class=\"fas fa-file-excel\"><\/i> Excel<\/button>\n              <button id=\"downloadPdfBtn\" class=\"btn btn-sm btn-danger\"><i class=\"fas fa-file-pdf\"><\/i> PDF<\/button>\n            <\/div>\n            <div class=\"table-responsive-custom\">\n              <table class=\"table table-hover align-middle\" id=\"contactsTable\">\n                <thead class=\"table-light\">\n                  <tr><th>#<\/th><th>Email<\/th><th>Name<\/th><th>Joined (Date)<\/th><th>Action<\/th><\/tr>\n                <\/thead>\n                <tbody id=\"contactsTbody\">\n                  <tr><td colspan=\"5\" class=\"text-center text-muted\">Loading contacts&#8230;<\/td><\/tr>\n                <\/tbody>\n              <\/table>\n            <\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n      <!-- Right: Email sender + best practices -->\n      <div class=\"col-lg-4\">\n        <div class=\"card card-shadow admin-card mb-4\">\n          <div class=\"card-body\">\n            <h5><i class=\"fas fa-paper-plane me-2 text-primary\"><\/i>Broadcast Email<\/h5>\n            <p class=\"small text-muted\">Sends to ALL community members. Includes unsubscribe link &#038; spam-safe headers.<\/p>\n            <form id=\"sendEmailForm\">\n              <div class=\"mb-2\">\n                <label class=\"form-label\">Subject<\/label>\n                <input type=\"text\" id=\"emailSubject\" class=\"form-control\" placeholder=\"Amazing update...\" required>\n              <\/div>\n              <div class=\"mb-2\">\n                <label class=\"form-label\">Message (HTML supported)<\/label>\n                <textarea id=\"emailBody\" rows=\"5\" class=\"form-control\" placeholder=\"<p>Hello {name}, here&#8217;s your content&#8230;<\/p>&#8221; required><\/textarea>\n                <div class=\"form-text\">Use <code>{name}<\/code> to personalize. Unsubscribe link auto-injected.<\/div>\n              <\/div>\n              <button type=\"submit\" class=\"btn btn-dark w-100 mt-2\"><i class=\"fas fa-envelope\"><\/i> Send Campaign<\/button>\n            <\/form>\n            <div id=\"sendStatus\" class=\"mt-2 small fw-semibold\"><\/div>\n          <\/div>\n        <\/div>\n        <div class=\"card card-shadow bg-light border-0\">\n          <div class=\"card-body\">\n            <i class=\"fas fa-chart-line me-1\"><\/i> <strong>Anti-spam Guarantee<\/strong>\n            <ul class=\"small mt-2 ps-3 mb-0\">\n              <li>\u2714 List-Unsubscribe header + one-click link<\/li>\n              <li>\u2714 DKIM\/SPF ready (configure SMTP)<\/li>\n              <li>\u2714 Personalization &#038; plain-text fallback<\/li>\n              <li>\u2714 Permission-based (opt-in only)<\/li>\n            <\/ul>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- Login Card (initially visible, hidden after admin login) -->\n  <div id=\"loginCard\" class=\"row justify-content-center mt-4\">\n    <div class=\"col-md-6 col-lg-5\">\n      <div class=\"card card-shadow border-0\">\n        <div class=\"card-body p-4\">\n          <div class=\"text-center mb-3\"><i class=\"fas fa-user-shield fa-2x text-secondary\"><\/i><\/div>\n          <h5 class=\"text-center fw-semibold\">Administrator Access<\/h5>\n          <p class=\"text-center text-muted small\">Restricted area \u2014 data section hidden<\/p>\n          <form id=\"adminLoginForm\">\n            <div class=\"mb-3\">\n              <label class=\"form-label\">Email<\/label>\n              <input type=\"email\" class=\"form-control\" id=\"loginEmail\" value=\"adaseltd@gmail.com\" readonly disabled>\n              <input type=\"hidden\" id=\"loginEmailHidden\" value=\"adaseltd@gmail.com\">\n            <\/div>\n            <div class=\"mb-3\">\n              <label class=\"form-label\">Password<\/label>\n              <input type=\"password\" class=\"form-control\" id=\"loginPassword\" placeholder=\"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\">\n            <\/div>\n            <button type=\"submit\" class=\"btn btn-primary w-100\"><i class=\"fas fa-key me-2\"><\/i>Unlock Dashboard<\/button>\n            <div id=\"loginError\" class=\"text-danger small mt-2 text-center\"><\/div>\n          <\/form>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<footer class=\"text-center text-muted py-4 mt-3\">\n  <small>\u00a9 MailFlow Manager \u2014 authenticated mailing list. All emails include unsubscribe mechanism. No spam tolerance.<\/small>\n<\/footer>\n\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/bootstrap@5.3.0-alpha1\/dist\/js\/bootstrap.bundle.min.js\"><\/script>\n<script>\n  \/\/ ---------- Frontend logic ----------\n  let isAdmin = false;\n\n  \/\/ DOM elements\n  const loginCard = document.getElementById('loginCard');\n  const adminSection = document.getElementById('adminSection');\n  const loginForm = document.getElementById('adminLoginForm');\n  const loginErrorSpan = document.getElementById('loginError');\n  const logoutBtn = document.getElementById('logoutBtn');\n  const subscribeForm = document.getElementById('subscribeForm');\n  const unsubPublicForm = document.getElementById('unsubPublicForm');\n  const contactsTbody = document.getElementById('contactsTbody');\n  const contactCountSpan = document.getElementById('contactCount');\n  const uploadCsvBtn = document.getElementById('uploadCsvBtn');\n  const csvFileInput = document.getElementById('csvUpload');\n  const downloadExcelBtn = document.getElementById('downloadExcelBtn');\n  const downloadPdfBtn = document.getElementById('downloadPdfBtn');\n  const sendEmailForm = document.getElementById('sendEmailForm');\n  const sendStatusDiv = document.getElementById('sendStatus');\n\n  \/\/ Helper toast-like alerts\n  function showMsg(element, msg, isError = false) {\n    if(element) {\n      element.innerHTML = `<div class=\"alert alert-${isError ? 'danger' : 'success'} alert-dismissible fade show py-2 mt-2\" role=\"alert\">${msg}<button type=\"button\" class=\"btn-close btn-sm\" data-bs-dismiss=\"alert\"><\/button><\/div>`;\n      setTimeout(() => { if(element.innerHTML) element.innerHTML = ''; }, 4000);\n    }\n  }\n\n  \/\/ check session status\n  async function checkAuth() {\n    try {\n      const res = await fetch('\/api\/check-auth', { credentials: 'include' });\n      const data = await res.json();\n      if (data.authenticated) {\n        isAdmin = true;\n        loginCard.style.display = 'none';\n        adminSection.style.display = 'block';\n        loadContacts();\n      } else {\n        isAdmin = false;\n        loginCard.style.display = 'block';\n        adminSection.style.display = 'none';\n      }\n    } catch(e) { console.error(e); }\n  }\n\n  \/\/ load contacts for admin table\n  async function loadContacts() {\n    if(!isAdmin) return;\n    try {\n      const res = await fetch('\/api\/contacts', { credentials: 'include' });\n      if(res.status === 401) { logout(); return; }\n      const contacts = await res.json();\n      contactCountSpan.innerText = contacts.length;\n      if(contacts.length === 0) {\n        contactsTbody.innerHTML = '<tr><td colspan=\"5\" class=\"text-center text-muted\">No members yet. Upload CSV or use subscription form.<\/td><\/tr>';\n        return;\n      }\n      let html = '';\n      contacts.forEach((c, idx) => {\n        const joinDate = c.createdAt ? new Date(c.createdAt).toLocaleDateString() : 'Unknown';\n        html += `<tr>\n          <td>${idx+1}<\/td>\n          <td>${escapeHtml(c.email)}<\/td>\n          <td>${escapeHtml(c.name || '\u2014')}<\/td>\n          <td>${joinDate}<\/td>\n          <td><button class=\"btn btn-sm btn-outline-danger remove-contact\" data-id=\"${c.id}\"><i class=\"fas fa-user-minus\"><\/i> Unsub<\/button><\/td>\n        <\/tr>`;\n      });\n      contactsTbody.innerHTML = html;\n      document.querySelectorAll('.remove-contact').forEach(btn => {\n        btn.addEventListener('click', async (e) => {\n          const id = btn.getAttribute('data-id');\n          if(confirm('Remove this contact from mailing list?')) {\n            await fetch(`\/api\/contacts\/${id}`, { method: 'DELETE', credentials: 'include' });\n            loadContacts();\n          }\n        });\n      });\n    } catch(err) { console.error(err); contactsTbody.innerHTML = '<tr><td colspan=\"5\" class=\"text-danger\">Error loading contacts<\/td><\/tr>'; }\n  }\n\n  function escapeHtml(str) { if(!str) return ''; return str.replace(\/[&<>]\/g, function(m){if(m==='&') return '&amp;'; if(m==='<') return '&lt;'; if(m==='>') return '&gt;'; return m;});}\n\n  \/\/ login\n  loginForm.addEventListener('submit', async (e) => {\n    e.preventDefault();\n    const email = 'adaseltd@gmail.com';\n    const password = document.getElementById('loginPassword').value;\n    try {\n      const res = await fetch('\/api\/login', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json' },\n        body: JSON.stringify({ email, password }),\n        credentials: 'include'\n      });\n      const data = await res.json();\n      if(data.success) {\n        isAdmin = true;\n        loginCard.style.display = 'none';\n        adminSection.style.display = 'block';\n        loadContacts();\n      } else {\n        loginErrorSpan.innerText = 'Invalid credentials. Access denied.';\n      }\n    } catch(err) { loginErrorSpan.innerText = 'Server error'; }\n  });\n\n  async function logout() {\n    await fetch('\/api\/logout', { method: 'POST', credentials: 'include' });\n    isAdmin = false;\n    loginCard.style.display = 'block';\n    adminSection.style.display = 'none';\n    document.getElementById('loginPassword').value = '';\n    loginErrorSpan.innerText = '';\n  }\n  logoutBtn.addEventListener('click', logout);\n\n  \/\/ public subscribe\n  subscribeForm.addEventListener('submit', async (e) => {\n    e.preventDefault();\n    const email = document.getElementById('subEmail').value.trim();\n    const name = document.getElementById('subName').value.trim();\n    if(!email) return;\n    try {\n      const res = await fetch('\/api\/subscribe', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json' },\n        body: JSON.stringify({ email, name }),\n        credentials: 'include'\n      });\n      const data = await res.json();\n      const msgDiv = document.getElementById('subMsg');\n      if(res.ok) showMsg(msgDiv, data.message || 'Subscribed successfully!', false);\n      else showMsg(msgDiv, data.error || 'Subscription failed', true);\n      document.getElementById('subEmail').value = '';\n      document.getElementById('subName').value = '';\n      if(isAdmin) loadContacts();\n    } catch(e) { showMsg(document.getElementById('subMsg'), 'Network error', true); }\n  });\n\n  \/\/ public unsubscribe\n  unsubPublicForm.addEventListener('submit', async (e) => {\n    e.preventDefault();\n    const email = document.getElementById('unsubEmail').value.trim();\n    if(!email) return;\n    try {\n      const res = await fetch('\/api\/unsubscribe', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json' },\n        body: JSON.stringify({ email }),\n        credentials: 'include'\n      });\n      const data = await res.json();\n      const msgDiv = document.getElementById('unsubMsg');\n      if(res.ok) showMsg(msgDiv, data.message || 'Removed from list.', false);\n      else showMsg(msgDiv, data.error || 'Email not found', true);\n      document.getElementById('unsubEmail').value = '';\n      if(isAdmin) loadContacts();\n    } catch(e) { showMsg(document.getElementById('unsubMsg'), 'Error', true); }\n  });\n\n  \/\/ upload CSV\n  uploadCsvBtn.addEventListener('click', async () => {\n    const file = csvFileInput.files[0];\n    if(!file) { alert('Please select a CSV file'); return; }\n    const formData = new FormData();\n    formData.append('csvfile', file);\n    try {\n      const res = await fetch('\/api\/contacts\/upload', { method: 'POST', body: formData, credentials: 'include' });\n      const data = await res.json();\n      if(res.ok) { alert(`Uploaded: ${data.added} new members`); loadContacts(); }\n      else alert(data.error || 'Upload failed');\n    } catch(e) { alert('Upload error'); }\n    csvFileInput.value = '';\n  });\n\n  \/\/ download excel\n  downloadExcelBtn.addEventListener('click', async () => {\n    window.open('\/api\/download\/contacts\/excel', '_blank');\n  });\n  downloadPdfBtn.addEventListener('click', async () => {\n    window.open('\/api\/download\/contacts\/pdf', '_blank');\n  });\n\n  \/\/ send email campaign\n  sendEmailForm.addEventListener('submit', async (e) => {\n    e.preventDefault();\n    const subject = document.getElementById('emailSubject').value.trim();\n    const htmlContent = document.getElementById('emailBody').value;\n    if(!subject || !htmlContent) { alert('Subject and message required'); return; }\n    sendStatusDiv.innerHTML = '<span class=\"text-info\"><i class=\"fas fa-spinner fa-pulse\"><\/i> Sending emails...<\/span>';\n    try {\n      const res = await fetch('\/api\/send-email', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json' },\n        body: JSON.stringify({ subject, htmlContent }),\n        credentials: 'include'\n      });\n      const data = await res.json();\n      if(res.ok) sendStatusDiv.innerHTML = `<span class=\"text-success\">\u2705 ${data.message} (${data.sentCount} sent)<\/span>`;\n      else sendStatusDiv.innerHTML = `<span class=\"text-danger\">\u274c ${data.error}<\/span>`;\n    } catch(e) { sendStatusDiv.innerHTML = `<span class=\"text-danger\">Network error<\/span>`; }\n    setTimeout(()=>{ sendStatusDiv.innerHTML = ''; }, 5000);\n  });\n\n  \/\/ init session check & reload contacts on admin visible\n  checkAuth();\n  setInterval(() => { if(isAdmin) loadContacts(); }, 30000);\n<\/script>\n<\/body>\n<\/html>\n\n<!-- BACKEND (Node.js + Express) -->\n<!-- To run this full app, save as server.js and run: npm install express express-session multer csv-parser nodemailer exceljs pdfkit fs-extra -->\n<!-- Ensure you have proper SMTP settings for real email sending (configure .env) -->\n<script type=\"text\/javascript\">\n\/\/ This is a meta backend section. The actual backend code is below in the final answer's full implementation.\n\/\/ In the final answer the full server code will be included.\n<\/script>\n\n\n","protected":false},"excerpt":{"rendered":"<p>Adase Ads Ltd | Digital Advertising &#038; SMM AdaseAds Adase Ads Ltd \ud83d\udcb0 Monetizing Africa Flicks AI Loading&#8230; \u00a9 2025 Adase Ads Ltd \u2013 Incorporated in Uganda \ud83d\udccd P.O.BOX 207475, Kampala, Uganda ads@cashchat.se | +256 775036603 Adase Ads Ltd \u00b7 Serie A Funding Round AdaseAds \u00b7 Serie A Funding \ud83d\udc9c Share Price: UGX 100,000 \ud83c\udf4b [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"pagelayer_contact_templates":[],"_pagelayer_content":"","footnotes":""},"class_list":["post-86","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cashchat.se\/dir\/wp-json\/wp\/v2\/pages\/86","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cashchat.se\/dir\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cashchat.se\/dir\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cashchat.se\/dir\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cashchat.se\/dir\/wp-json\/wp\/v2\/comments?post=86"}],"version-history":[{"count":7,"href":"https:\/\/cashchat.se\/dir\/wp-json\/wp\/v2\/pages\/86\/revisions"}],"predecessor-version":[{"id":132,"href":"https:\/\/cashchat.se\/dir\/wp-json\/wp\/v2\/pages\/86\/revisions\/132"}],"wp:attachment":[{"href":"https:\/\/cashchat.se\/dir\/wp-json\/wp\/v2\/media?parent=86"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}