Spaces:
Sleeping
Sleeping
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>DashX - Modern API Dashboard</title> | |
| <meta name="description" content="DashX is a modern REST API dashboard platform that allows you to manage, monitor, and utilize various API tools with ease. Fully featured for developers with an intuitive interface and powerful analytics."> | |
| <meta name="keywords" content="API Dashboard, REST API, DashX, API Management, Developer Tools, API Analytics"> | |
| <meta name="author" content="DashX Team"> | |
| <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet"> | |
| <link rel="icon" type="image/webp" href="/icon.webp"> | |
| <link href="https://cdnjs.cloudflare.com/ajax/libs/sweetalert2/11.10.8/sweetalert2.min.css" rel="stylesheet"> | |
| <link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.0/css/bootstrap.min.css" rel="stylesheet"> | |
| <link href="styles.css" rel="stylesheet"> | |
| <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script> | |
| <style> | |
| i.fas, i.fa, i.far, i.fab, i.fal, | |
| .fas, .fa, .far, .fab, .fal, | |
| i[class*="fa-"] { | |
| font-family: "Font Awesome 6 Free", "Font Awesome 6 Pro", "FontAwesome" ; | |
| font-weight: 900 ; | |
| font-style: normal ; | |
| font-variant: normal ; | |
| text-rendering: auto ; | |
| line-height: 1 ; | |
| -webkit-font-smoothing: antialiased ; | |
| -moz-osx-font-smoothing: grayscale ; | |
| display: inline-block ; | |
| } | |
| .stat-item { | |
| text-align: center; | |
| padding: 1.5rem; | |
| background: rgba(255, 255, 255, 0.05); | |
| border-radius: 12px; | |
| border: 1px solid rgba(255, 255, 255, 0.1); | |
| } | |
| .stat-item .stat-value { | |
| display: block; | |
| font-size: 1.8rem; | |
| font-weight: 700; | |
| color: rgba(133, 48, 48, 0.9); | |
| margin-bottom: 0.5rem; | |
| } | |
| .stat-item .stat-label { | |
| display: block; | |
| font-size: 0.9rem; | |
| color: rgba(255, 255, 255, 0.7); | |
| } | |
| .stat-icon { | |
| font-size: 3rem ; | |
| color: rgba(255, 168, 168, 0.9) ; | |
| min-width: 80px ; | |
| text-align: center ; | |
| display: flex ; | |
| align-items: center ; | |
| justify-content: center ; | |
| } | |
| .stat-icon i { | |
| font-size: 3rem ; | |
| display: block ; | |
| } | |
| .stat-info { | |
| flex: 1; | |
| } | |
| .stat-number { | |
| font-size: 2rem; | |
| font-weight: 700; | |
| color: rgba(255, 255, 255, 0.9); | |
| margin-bottom: 0.25rem; | |
| word-break: break-all; | |
| } | |
| .stat-label { | |
| font-size: 0.9rem; | |
| color: rgba(255, 255, 255, 0.7); | |
| } | |
| .section h2 i { | |
| color: #e74c3c ; | |
| } | |
| .navbar { | |
| background: rgba(44, 62, 80, 0.95) ; | |
| backdrop-filter: blur(10px); | |
| border-bottom: 1px solid rgba(255, 255, 255, 0.1); | |
| box-shadow: 0 2px 20px rgba(0, 0, 0, 0.2); | |
| } | |
| .navbar-brand { | |
| font-size: 1.5rem; | |
| font-weight: 700; | |
| color: #fff ; | |
| } | |
| .navbar-brand i { | |
| color: #e74c3c; | |
| font-size: 1.8rem; | |
| margin-right: 0.5rem; | |
| } | |
| .nav-link { | |
| color: #ecf0f1 ; | |
| font-weight: 500; | |
| transition: all 0.3s ease; | |
| padding: 0.5rem 1rem ; | |
| border-radius: 8px; | |
| margin: 0 0.25rem; | |
| } | |
| .nav-link:hover { | |
| background: rgba(255, 255, 255, 0.1); | |
| transform: translateY(-1px); | |
| } | |
| .nav-link.text-danger { | |
| color: #e74c3c ; | |
| } | |
| .nav-link.text-danger:hover { | |
| background: rgba(231, 76, 60, 0.1); | |
| color: #ff6b6b ; | |
| } | |
| .glassmorphism { | |
| background: rgba(255, 255, 255, 0.1); | |
| backdrop-filter: blur(10px); | |
| -webkit-backdrop-filter: blur(10px); | |
| border: 1px solid rgba(255, 255, 255, 0.2); | |
| border-radius: 16px; | |
| box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37); | |
| } | |
| .reset-timer-card { | |
| margin-top: 2rem; | |
| padding: 1.5rem; | |
| border-radius: 12px; | |
| background: rgba(255, 255, 255, 0.05); | |
| backdrop-filter: blur(10px); | |
| border: 1px solid rgba(255, 255, 255, 0.1); | |
| box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1); | |
| } | |
| .timer-header { | |
| display: flex; | |
| align-items: center; | |
| gap: 1rem; | |
| margin-bottom: 1rem; | |
| } | |
| .timer-header i { | |
| font-size: 1.5rem; | |
| color: #853030; | |
| } | |
| .timer-header h3 { | |
| margin: 0; | |
| font-size: 1.2rem; | |
| color: rgba(255, 255, 255, 0.9); | |
| } | |
| .timer-header p { | |
| margin: 0; | |
| opacity: 0.7; | |
| font-size: 0.9rem; | |
| } | |
| .countdown-display { | |
| text-align: center; | |
| padding: 2rem 1rem; | |
| } | |
| .countdown-time { | |
| font-size: 3rem; | |
| font-weight: bold; | |
| color: #853030; | |
| font-family: 'Courier New', monospace; | |
| letter-spacing: 0.1em; | |
| text-shadow: 0 0 20px rgba(133, 48, 48, 0.3); | |
| } | |
| .countdown-label { | |
| margin-top: 0.5rem; | |
| opacity: 0.6; | |
| font-size: 0.9rem; | |
| color: rgba(255, 255, 255, 0.8); | |
| } | |
| .reset-progress-container { | |
| width: 100%; | |
| height: 8px; | |
| background: rgba(255, 255, 255, 0.1); | |
| border-radius: 4px; | |
| overflow: hidden; | |
| margin-top: 1rem; | |
| } | |
| .reset-progress { | |
| height: 100%; | |
| background: linear-gradient(90deg, #853030, #ff6b6b); | |
| transition: width 1s linear; | |
| width: 0%; | |
| box-shadow: 0 0 10px rgba(133, 48, 48, 0.5); | |
| } | |
| .reset-info { | |
| margin-top: 1rem; | |
| padding: 1rem; | |
| background: rgba(255, 255, 255, 0.05); | |
| border-radius: 8px; | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| } | |
| .reset-info i { | |
| color: #853030; | |
| margin-right: 0.5rem; | |
| } | |
| .reset-info span { | |
| font-size: 0.9rem; | |
| color: rgba(255, 255, 255, 0.8); | |
| } | |
| .reset-info div:last-child { | |
| font-weight: bold; | |
| color: #853030; | |
| } | |
| @keyframes pulse { | |
| 0%, 100% { opacity: 1; } | |
| 50% { opacity: 0.7; } | |
| } | |
| .reset-countdown { | |
| animation: pulse 2s ease-in-out infinite; | |
| } | |
| .usage-overview { | |
| display: grid; | |
| grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); | |
| gap: 1.5rem; | |
| margin-top: 1rem; | |
| } | |
| .usage-section { | |
| background: rgba(255, 255, 255, 0.05); | |
| backdrop-filter: blur(10px); | |
| -webkit-backdrop-filter: blur(10px); | |
| border: 1px solid rgba(255, 255, 255, 0.1); | |
| padding: 1.5rem; | |
| border-radius: 16px; | |
| box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.2); | |
| transition: all 0.3s ease; | |
| } | |
| .usage-section:hover { | |
| background: rgba(255, 255, 255, 0.08); | |
| transform: translateY(-2px); | |
| box-shadow: 0 12px 40px 0 rgba(31, 38, 135, 0.3); | |
| } | |
| .usage-section h4 { | |
| margin-bottom: 1rem; | |
| color: rgba(255, 255, 255, 0.9); | |
| font-size: 1.1rem; | |
| font-weight: 600; | |
| display: flex; | |
| align-items: center; | |
| gap: 0.5rem; | |
| } | |
| .usage-section h4 i { | |
| color: rgba(133, 48, 48, 0.8); | |
| } | |
| .endpoint-list, .ip-list { | |
| display: flex; | |
| flex-direction: column; | |
| gap: 0.5rem; | |
| } | |
| .endpoint-item, .ip-item { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| padding: 0.75rem; | |
| background: rgba(255, 255, 255, 0.08); | |
| backdrop-filter: blur(5px); | |
| border-radius: 8px; | |
| border: 1px solid rgba(255, 255, 255, 0.1); | |
| transition: all 0.3s ease; | |
| } | |
| .endpoint-item:hover, .ip-item:hover { | |
| background: rgba(255, 255, 255, 0.12); | |
| transform: translateX(4px); | |
| } | |
| .endpoint-name, .ip-address { | |
| font-family: 'Courier New', monospace; | |
| font-weight: 500; | |
| color: rgba(255, 255, 255, 0.8); | |
| font-size: 0.9rem; | |
| } | |
| .endpoint-count, .ip-count { | |
| color: rgba(133, 48, 48, 0.9); | |
| font-weight: 600; | |
| background: rgba(133, 48, 48, 0.1); | |
| padding: 0.25rem 0.5rem; | |
| border-radius: 12px; | |
| font-size: 0.8rem; | |
| } | |
| .ip-time { | |
| font-size: 0.75rem; | |
| color: rgba(255, 255, 255, 0.6); | |
| font-style: italic; | |
| } | |
| .daily-usage { | |
| display: flex; | |
| flex-direction: column; | |
| gap: 0.75rem; | |
| } | |
| .usage-day { | |
| display: grid; | |
| grid-template-columns: 70px 1fr 50px; | |
| align-items: center; | |
| gap: 1rem; | |
| padding: 0.5rem; | |
| border-radius: 8px; | |
| transition: all 0.3s ease; | |
| } | |
| .usage-day:hover { | |
| background: rgba(255, 255, 255, 0.05); | |
| } | |
| .usage-date { | |
| font-size: 0.85rem; | |
| font-weight: 500; | |
| color: rgba(255, 255, 255, 0.8); | |
| } | |
| .usage-bar-container { | |
| background: rgba(255, 255, 255, 0.1); | |
| border-radius: 10px; | |
| height: 8px; | |
| overflow: hidden; | |
| position: relative; | |
| } | |
| .usage-bar { | |
| height: 100%; | |
| background: linear-gradient(90deg, rgba(133, 48, 48, 0.8), rgba(166, 69, 69, 0.9)); | |
| border-radius: 10px; | |
| transition: width 0.6s ease; | |
| position: relative; | |
| } | |
| .usage-bar::after { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| bottom: 0; | |
| background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent); | |
| animation: shimmer 2s infinite; | |
| } | |
| @keyframes shimmer { | |
| 0% { transform: translateX(-100%); } | |
| 100% { transform: translateX(100%); } | |
| } | |
| .usage-count { | |
| font-size: 0.85rem; | |
| font-weight: 600; | |
| color: rgba(133, 48, 48, 0.9); | |
| text-align: center; | |
| } | |
| .no-data { | |
| text-align: center; | |
| padding: 2rem; | |
| color: rgba(255, 255, 255, 0.5); | |
| font-style: italic; | |
| } | |
| .no-data-state, .error-state { | |
| text-align: center; | |
| padding: 3rem 2rem; | |
| color: rgba(255, 255, 255, 0.6); | |
| } | |
| .error-state i { | |
| color: #ff6b6b; | |
| font-size: 2.5rem; | |
| margin-bottom: 1rem; | |
| } | |
| .search-container { | |
| margin-bottom: 2rem; | |
| position: relative; | |
| } | |
| .search-input { | |
| width: 100%; | |
| padding: 1rem 1rem 1rem 3rem; | |
| border: 1px solid rgba(255, 255, 255, 0.2); | |
| border-radius: 16px; | |
| background: rgba(255, 255, 255, 0.05); | |
| backdrop-filter: blur(10px); | |
| font-size: 1rem; | |
| transition: all 0.3s ease; | |
| color: rgba(255, 255, 255, 0.9); | |
| } | |
| .search-input::placeholder { | |
| color: rgba(255, 255, 255, 0.5); | |
| } | |
| .search-input:focus { | |
| outline: none; | |
| border-color: rgba(133, 48, 48, 0.8); | |
| background: rgba(255, 255, 255, 0.08); | |
| box-shadow: 0 0 0 3px rgba(133, 48, 48, 0.1); | |
| } | |
| .search-icon { | |
| position: absolute; | |
| left: 1rem; | |
| top: 50%; | |
| transform: translateY(-50%); | |
| color: rgba(133, 48, 48, 0.8); | |
| font-size: 1.2rem; | |
| } | |
| .plugin-card { | |
| background: rgba(255, 255, 255, 0.05); | |
| backdrop-filter: blur(10px); | |
| -webkit-backdrop-filter: blur(10px); | |
| border: 1px solid rgba(255, 255, 255, 0.1); | |
| border-radius: 16px; | |
| overflow: hidden; | |
| transition: all 0.3s ease; | |
| margin-bottom: 1rem; | |
| } | |
| .plugin-card:hover { | |
| background: rgba(255, 255, 255, 0.08); | |
| transform: translateY(-2px); | |
| box-shadow: 0 12px 40px 0 rgba(31, 38, 135, 0.3); | |
| } | |
| .plugin-info { | |
| margin-top: 0.5rem; | |
| font-size: 0.85rem; | |
| } | |
| .limit-info { | |
| background: rgba(133, 48, 48, 0.1); | |
| color: #853030; | |
| padding: 0.25rem 0.5rem; | |
| border-radius: 4px; | |
| font-weight: 500; | |
| } | |
| .user-item { | |
| background: rgba(255, 255, 255, 0.05); | |
| backdrop-filter: blur(10px); | |
| -webkit-backdrop-filter: blur(10px); | |
| border: 1px solid rgba(255, 255, 255, 0.1); | |
| padding: 1.5rem; | |
| border-radius: 16px; | |
| margin-bottom: 1rem; | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: flex-start; | |
| transition: all 0.3s ease; | |
| } | |
| .user-item:hover { | |
| background: rgba(255, 255, 255, 0.08); | |
| transform: translateY(-2px); | |
| box-shadow: 0 12px 40px 0 rgba(31, 38, 135, 0.3); | |
| } | |
| .user-item.temp-banned { | |
| border-left: 4px solid rgba(255, 193, 7, 0.8); | |
| background: rgba(255, 193, 7, 0.05); | |
| } | |
| .user-item.banned { | |
| border-left: 4px solid rgba(220, 53, 69, 0.8); | |
| background: rgba(220, 53, 69, 0.05); | |
| } | |
| .user-info { | |
| flex: 1; | |
| } | |
| .user-name { | |
| font-size: 1.2rem; | |
| font-weight: 600; | |
| color: rgba(255, 255, 255, 0.9); | |
| margin-bottom: 0.5rem; | |
| } | |
| .user-details { | |
| display: flex; | |
| flex-wrap: wrap; | |
| gap: 0.75rem; | |
| margin-bottom: 0.75rem; | |
| } | |
| .user-email { | |
| color: rgba(255, 255, 255, 0.7); | |
| font-size: 0.9rem; | |
| } | |
| .user-role { | |
| background: rgba(255, 255, 255, 0.1); | |
| backdrop-filter: blur(5px); | |
| color: rgba(255, 255, 255, 0.8); | |
| padding: 0.25rem 0.75rem; | |
| border-radius: 12px; | |
| font-size: 0.8rem; | |
| font-weight: 500; | |
| border: 1px solid rgba(255, 255, 255, 0.1); | |
| } | |
| .premium-badge { | |
| background: linear-gradient(45deg, rgba(255, 215, 0, 0.3), rgba(255, 237, 78, 0.3)); | |
| backdrop-filter: blur(5px); | |
| color: rgba(255, 215, 0, 1); | |
| padding: 0.25rem 0.75rem; | |
| border-radius: 12px; | |
| font-size: 0.8rem; | |
| font-weight: 600; | |
| border: 1px solid rgba(255, 215, 0, 0.3); | |
| box-shadow: 0 0 10px rgba(255, 215, 0, 0.2); | |
| } | |
| .user-stats { | |
| display: flex; | |
| flex-wrap: wrap; | |
| gap: 1rem; | |
| font-size: 0.85rem; | |
| color: rgba(255, 255, 255, 0.7); | |
| margin-bottom: 0.75rem; | |
| } | |
| .ban-info { | |
| background: rgba(255, 193, 7, 0.1); | |
| backdrop-filter: blur(5px); | |
| border: 1px solid rgba(255, 193, 7, 0.3); | |
| padding: 0.75rem; | |
| border-radius: 8px; | |
| font-size: 0.85rem; | |
| color: rgba(255, 193, 7, 0.9); | |
| margin-top: 0.5rem; | |
| } | |
| .user-actions { | |
| display: flex; | |
| gap: 0.5rem; | |
| flex-wrap: wrap; | |
| } | |
| .pagination-controls { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| padding: 1rem; | |
| margin-top: 1rem; | |
| background: rgba(255, 255, 255, 0.05); | |
| backdrop-filter: blur(10px); | |
| border-radius: 12px; | |
| border: 1px solid rgba(255, 255, 255, 0.1); | |
| } | |
| .page-info { | |
| color: rgba(255, 255, 255, 0.8); | |
| font-weight: 500; | |
| } | |
| .users-pagination-info { | |
| color: rgba(255, 255, 255, 0.6); | |
| font-size: 0.9rem; | |
| margin-bottom: 1rem; | |
| text-align: center; | |
| padding: 0.5rem; | |
| background: rgba(255, 255, 255, 0.05); | |
| border-radius: 8px; | |
| backdrop-filter: blur(5px); | |
| } | |
| .btn { | |
| padding: 0.5rem 1rem; | |
| border: none; | |
| border-radius: 8px; | |
| font-weight: 500; | |
| cursor: pointer; | |
| transition: all 0.3s ease; | |
| text-decoration: none; | |
| display: inline-flex; | |
| align-items: center; | |
| gap: 0.5rem; | |
| font-size: 0.9rem; | |
| backdrop-filter: blur(10px); | |
| border: 1px solid rgba(255, 255, 255, 0.1); | |
| } | |
| .btn:disabled { | |
| opacity: 0.5; | |
| cursor: not-allowed; | |
| transform: none ; | |
| } | |
| .btn-primary { | |
| background: rgba(133, 48, 48, 0.8); | |
| color: white; | |
| border: 1px solid rgba(133, 48, 48, 0.3); | |
| } | |
| .btn-primary:hover:not(:disabled) { | |
| background: rgba(133, 48, 48, 1); | |
| transform: translateY(-1px); | |
| box-shadow: 0 4px 12px rgba(133, 48, 48, 0.3); | |
| } | |
| .btn-secondary { | |
| background: rgba(108, 117, 125, 0.8); | |
| color: white; | |
| border: 1px solid rgba(108, 117, 125, 0.3); | |
| } | |
| .btn-secondary:hover:not(:disabled) { | |
| background: rgba(108, 117, 125, 1); | |
| transform: translateY(-1px); | |
| } | |
| .btn-warning { | |
| background: rgba(255, 193, 7, 0.8); | |
| color: rgba(133, 100, 4, 1); | |
| border: 1px solid rgba(255, 193, 7, 0.3); | |
| } | |
| .btn-warning:hover:not(:disabled) { | |
| background: rgba(255, 193, 7, 1); | |
| transform: translateY(-1px); | |
| box-shadow: 0 4px 12px rgba(255, 193, 7, 0.3); | |
| } | |
| .btn-success { | |
| background: rgba(40, 167, 69, 0.8); | |
| color: white; | |
| border: 1px solid rgba(40, 167, 69, 0.3); | |
| } | |
| .btn-success:hover:not(:disabled) { | |
| background: rgba(40, 167, 69, 1); | |
| transform: translateY(-1px); | |
| box-shadow: 0 4px 12px rgba(40, 167, 69, 0.3); | |
| } | |
| .btn-danger { | |
| background: rgba(220, 53, 69, 0.8); | |
| color: white; | |
| border: 1px solid rgba(220, 53, 69, 0.3); | |
| } | |
| .btn-danger:hover:not(:disabled) { | |
| background: rgba(220, 53, 69, 1); | |
| transform: translateY(-1px); | |
| box-shadow: 0 4px 12px rgba(220, 53, 69, 0.3); | |
| } | |
| .no-users-state { | |
| text-align: center; | |
| padding: 3rem; | |
| color: rgba(255, 255, 255, 0.6); | |
| } | |
| .admin-card { | |
| background: rgba(255, 255, 255, 0.05); | |
| backdrop-filter: blur(10px); | |
| -webkit-backdrop-filter: blur(10px); | |
| border: 1px solid rgba(255, 255, 255, 0.1); | |
| border-radius: 16px; | |
| padding: 2rem; | |
| margin-bottom: 2rem; | |
| transition: all 0.3s ease; | |
| } | |
| .admin-card:hover { | |
| background: rgba(255, 255, 255, 0.08); | |
| transform: translateY(-2px); | |
| box-shadow: 0 12px 40px 0 rgba(31, 38, 135, 0.3); | |
| } | |
| .admin-card h3 { | |
| color: rgba(255, 255, 255, 0.9); | |
| margin-bottom: 1.5rem; | |
| display: flex; | |
| align-items: center; | |
| gap: 0.5rem; | |
| } | |
| .admin-card h3 i { | |
| color: rgba(133, 48, 48, 0.8); | |
| } | |
| .stats-cards { | |
| display: grid; | |
| grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); | |
| gap: 1.5rem; | |
| margin-bottom: 2rem; | |
| } | |
| .stat-card { | |
| background: rgba(255, 255, 255, 0.05); | |
| backdrop-filter: blur(10px); | |
| -webkit-backdrop-filter: blur(10px); | |
| border: 1px solid rgba(255, 255, 255, 0.1); | |
| padding: 2rem; | |
| border-radius: 16px; | |
| display: flex; | |
| align-items: center; | |
| gap: 1rem; | |
| transition: all 0.3s ease; | |
| } | |
| .stat-card:hover { | |
| background: rgba(255, 255, 255, 0.08); | |
| transform: translateY(-3px); | |
| box-shadow: 0 15px 50px 0 rgba(31, 38, 135, 0.4); | |
| } | |
| .form-row { | |
| display: grid; | |
| grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); | |
| gap: 1rem; | |
| margin-bottom: 1.5rem; | |
| } | |
| .form-group { | |
| display: flex; | |
| flex-direction: column; | |
| } | |
| .form-group label { | |
| color: rgba(255, 255, 255, 0.9); | |
| margin-bottom: 0.5rem; | |
| font-weight: 500; | |
| font-size: 0.9rem; | |
| } | |
| .form-group .required { | |
| color: #ff6b6b; | |
| margin-left: 0.25rem; | |
| } | |
| .form-group input, | |
| .form-group select { | |
| padding: 0.75rem; | |
| border: 1px solid rgba(255, 255, 255, 0.2); | |
| border-radius: 8px; | |
| background: rgba(255, 255, 255, 0.05); | |
| color: rgba(255, 255, 255, 0.9); | |
| font-size: 0.95rem; | |
| transition: all 0.3s ease; | |
| } | |
| .form-group input:focus, | |
| .form-group select:focus { | |
| outline: none; | |
| border-color: rgba(133, 48, 48, 0.8); | |
| background: rgba(255, 255, 255, 0.08); | |
| box-shadow: 0 0 0 3px rgba(133, 48, 48, 0.1); | |
| } | |
| .form-group input::placeholder { | |
| color: rgba(255, 255, 255, 0.4); | |
| } | |
| .form-group small { | |
| color: rgba(255, 255, 255, 0.5); | |
| font-size: 0.8rem; | |
| margin-top: 0.25rem; | |
| } | |
| @media (max-width: 768px) { | |
| .countdown-time { | |
| font-size: 2rem; | |
| } | |
| .reset-timer-card { | |
| padding: 1rem; | |
| } | |
| .usage-overview { | |
| grid-template-columns: 1fr; | |
| } | |
| .usage-day { | |
| grid-template-columns: 60px 1fr 40px; | |
| gap: 0.5rem; | |
| } | |
| .user-item { | |
| flex-direction: column; | |
| gap: 1rem; | |
| } | |
| .user-actions { | |
| width: 100%; | |
| justify-content: flex-end; | |
| } | |
| .pagination-controls { | |
| flex-direction: column; | |
| gap: 1rem; | |
| } | |
| .dashboard-container { | |
| flex-direction: column; | |
| } | |
| .sidebar { | |
| width: 100%; | |
| position: static; | |
| height: auto; | |
| } | |
| .form-row { | |
| grid-template-columns: 1fr; | |
| } | |
| .stats-cards { | |
| grid-template-columns: 1fr; | |
| } | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <nav class="navbar navbar-expand-lg navbar-dark"> | |
| <div class="container"> | |
| <a class="navbar-brand" href="/"> | |
| <i class="fas fa-bolt"></i> DashX | |
| </a> | |
| <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav"> | |
| <span class="navbar-toggler-icon"></span> | |
| </button> | |
| <div class="collapse navbar-collapse" id="navbarNav"> | |
| <ul class="navbar-nav ms-auto"> | |
| <li class="nav-item"> | |
| <a class="nav-link" href="/profile" onclick="goToProfile()"> | |
| <i class="fas fa-user"></i> Profile | |
| </a> | |
| </li> | |
| <li class="nav-item"> | |
| <a class="nav-link text-danger" href="#" onclick="logout()"> | |
| <i class="fas fa-sign-out-alt"></i> Logout | |
| </a> | |
| </li> | |
| </ul> | |
| </div> | |
| </div> | |
| </nav> | |
| <div class="dashboard-container"> | |
| <div class="sidebar"> | |
| <div class="sidebar-menu"> | |
| <a href="#overview" class="menu-item active" onclick="showSection('overview')"> | |
| <i class="fas fa-chart-line"></i> Overview | |
| </a> | |
| <a href="#api-stats" class="menu-item" onclick="showSection('api-stats')"> | |
| <i class="fas fa-chart-area"></i> API Stats | |
| </a> | |
| <a href="#plugins" class="menu-item" onclick="showSection('plugins')"> | |
| <i class="fas fa-plug"></i> API Plugins | |
| </a> | |
| <a href="#server-stats" class="menu-item" onclick="showSection('server-stats')"> | |
| <i class="fas fa-server"></i> Server Stats | |
| </a> | |
| <a href="#events" class="menu-item" onclick="showSection('events')"> | |
| <i class="fas fa-calendar"></i> Events | |
| </a> | |
| <a href="#settings" class="menu-item" onclick="showSection('settings')"> | |
| <i class="fas fa-cog"></i> Settings | |
| </a> | |
| <div id="adminMenu" style="display: none;"> | |
| <a href="#management" class="menu-item" onclick="showSection('management')"> | |
| <i class="fas fa-users-cog"></i> Management | |
| </a> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="main-content"> | |
| <div id="overview" class="section active"> | |
| <h2><i class="fas fa-tachometer-alt"></i> Dashboard Overview</h2> | |
| <div class="stats-cards"> | |
| <div class="stat-card"> | |
| <div class="stat-icon"> | |
| <img src="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.4.0/svgs/solid/key.svg" alt="key" style="width: 3rem; height: 3rem; filter: invert(78%) sepia(45%) saturate(548%) hue-rotate(314deg) brightness(101%) contrast(101%);"> | |
| </div> | |
| <div class="stat-info"> | |
| <div class="stat-number" id="userApiKey">Loading...</div> | |
| <div class="stat-label">API Key</div> | |
| </div> | |
| </div> | |
| <div class="stat-card"> | |
| <div class="stat-icon"> | |
| <img src="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.4.0/svgs/solid/chart-pie.svg" alt="chart" style="width: 3rem; height: 3rem; filter: invert(78%) sepia(45%) saturate(548%) hue-rotate(314deg) brightness(101%) contrast(101%);"> | |
| </div> | |
| <div class="stat-info"> | |
| <div class="stat-number" id="userRequests">0</div> | |
| <div class="stat-label">Total Requests</div> | |
| </div> | |
| </div> | |
| <div class="stat-card"> | |
| <div class="stat-icon"> | |
| <img src="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.4.0/svgs/solid/cloud.svg" alt="cloud" style="width: 3rem; height: 3rem; filter: invert(78%) sepia(45%) saturate(548%) hue-rotate(314deg) brightness(101%) contrast(101%);"> | |
| </div> | |
| <div class="stat-info"> | |
| <div class="stat-number" id="userRequestsToday">0</div> | |
| <div class="stat-label">Today's Requests</div> | |
| </div> | |
| </div> | |
| <div class="stat-card"> | |
| <div class="stat-icon"> | |
| <img src="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.4.0/svgs/solid/gauge-high.svg" alt="gauge" style="width: 3rem; height: 3rem; filter: invert(78%) sepia(45%) saturate(548%) hue-rotate(314deg) brightness(101%) contrast(101%);"> | |
| </div> | |
| <div class="stat-info"> | |
| <div class="stat-number" id="userLimit">30</div> | |
| <div class="stat-label">Daily Limit</div> | |
| </div> | |
| </div> | |
| <div class="stat-card"> | |
| <div class="stat-icon"> | |
| <img src="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.4.0/svgs/solid/battery-three-quarters.svg" alt="battery" style="width: 3rem; height: 3rem; filter: invert(78%) sepia(45%) saturate(548%) hue-rotate(314deg) brightness(101%) contrast(101%);"> | |
| </div> | |
| <div class="stat-info"> | |
| <div class="stat-number" id="userLimitToday">30</div> | |
| <div class="stat-label">Remaining Limit (Personal)</div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="reset-timer-card glassmorphism"> | |
| <div class="timer-header"> | |
| <i class="fas fa-clock"></i> | |
| <div> | |
| <h3>Next Reset</h3> | |
| <p>Daily limit resets at 00:00</p> | |
| </div> | |
| </div> | |
| <div class="countdown-display"> | |
| <div class="countdown-time"> | |
| <span class="reset-countdown">00:00:00</span> | |
| </div> | |
| <div class="countdown-label"> | |
| Hours : Minutes : Seconds | |
| </div> | |
| </div> | |
| <div class="reset-progress-container"> | |
| <div class="reset-progress"></div> | |
| </div> | |
| <div class="reset-info"> | |
| <div> | |
| <i class="fas fa-info-circle"></i> | |
| <span>Your limit will be restored to maximum</span> | |
| </div> | |
| <div> | |
| <i class="fas fa-sync-alt"></i> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="usage-overview"> | |
| <div class="usage-section"> | |
| <h4><i class="fas fa-chart-bar"></i> API Usage Overview</h4> | |
| <div class="endpoint-list"> | |
| <div class="endpoint-item"> | |
| <span class="endpoint-name">Loading...</span> | |
| <span class="endpoint-count">0 requests</span> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="usage-section"> | |
| <h4><i class="fas fa-calendar-alt"></i> Daily Usage (Last 7 Days)</h4> | |
| <div class="daily-usage"> | |
| <div class="usage-day"> | |
| <span class="usage-date">Loading...</span> | |
| <div class="usage-bar-container"> | |
| <div class="usage-bar" style="width: 0%;"></div> | |
| </div> | |
| <span class="usage-count">0</span> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="usage-section"> | |
| <h4><i class="fas fa-network-wired"></i> Recent IP Addresses</h4> | |
| <div class="ip-list"> | |
| <div class="ip-item"> | |
| <div> | |
| <span class="ip-address">Loading...</span> | |
| <div class="ip-time">Just now</div> | |
| </div> | |
| <span class="ip-count">0 requests</span> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <div id="plugins" class="section"> | |
| <h2><i class="fas fa-plug"></i> Available API Plugins</h2> | |
| <p style="margin-bottom: 2rem; opacity: 0.8;">Discover and test our API endpoints with interactive documentation</p> | |
| <div class="search-container"> | |
| <i class="fas fa-search search-icon"></i> | |
| <input type="text" | |
| class="search-input" | |
| placeholder="Search plugins by name, description, or tags..." | |
| oninput="searchPlugins(this.value)" | |
| id="pluginSearch"> | |
| </div> | |
| <div class="plugins-grid" id="pluginsGrid"> | |
| <div class="loading"> | |
| <i class="fas fa-spinner fa-spin" style="margin-right: 0.5rem;"></i> | |
| Loading plugins... | |
| </div> | |
| </div> | |
| </div> | |
| <!----- KENTOD ---> | |
| <div id="server-stats" class="section"> | |
| <h2><i class="fas fa-server"></i> Server Statistics</h2> | |
| <!--- APA LIAT LIAT ---> | |
| <div class="stats-cards"> | |
| <div class="stat-card"> | |
| <div class="stat-icon"> | |
| <img src="https://api.iconify.design/mdi/account-group.svg?color=%23ba68c8&width=48&height=48" alt="users"> | |
| </div> | |
| <div class="stat-info"> | |
| <div class="stat-number" id="totalUsersCount">0</div> | |
| <div class="stat-label">Total Users</div> | |
| </div> | |
| </div> | |
| <div class="stat-card"> | |
| <div class="stat-icon"> | |
| <img src="https://api.iconify.design/mdi/account.svg?color=%23ce93d8&width=48&height=48" alt="user"> | |
| </div> | |
| <div class="stat-info"> | |
| <div class="stat-number" id="regularUsersCount">0</div> | |
| <div class="stat-label">Regular Users</div> | |
| </div> | |
| </div> | |
| <div class="stat-card"> | |
| <div class="stat-icon"> | |
| <img src="https://api.iconify.design/mdi/crown.svg?color=%23ba68c8&width=48&height=48" alt="crown"> | |
| </div> | |
| <div class="stat-info"> | |
| <div class="stat-number" id="premiumUsersCount">0</div> | |
| <div class="stat-label">Premium Users</div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="admin-card"> | |
| <h3><i class="fas fa-chart-pie"></i> User Role Distribution</h3> | |
| <canvas id="roleChart" style="max-height: 300px;"></canvas> | |
| </div> | |
| <div class="admin-card"> | |
| <h3><i class="fas fa-database"></i> Database Statistics</h3> | |
| <div class="stats-grid" style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1.5rem;"> | |
| <div class="stat-item"> | |
| <i class="fas fa-hdd" style="font-size: 2rem; color: rgba(133, 48, 48, 0.8); margin-bottom: 0.5rem;"></i> | |
| <span class="stat-value" id="dbSize">0 MB</span> | |
| <span class="stat-label">Database Size</span> | |
| </div> | |
| <div class="stat-item"> | |
| <i class="fas fa-memory" style="font-size: 2rem; color: rgba(133, 48, 48, 0.8); margin-bottom: 0.5rem;"></i> | |
| <span class="stat-value" id="ramUsage">0 MB</span> | |
| <span class="stat-label">RAM Usage</span> | |
| </div> | |
| <div class="stat-item"> | |
| <i class="fas fa-microchip" style="font-size: 2rem; color: rgba(133, 48, 48, 0.8); margin-bottom: 0.5rem;"></i> | |
| <span class="stat-value" id="cpuUsage">0%</span> | |
| <span class="stat-label">CPU Usage</span> | |
| </div> | |
| <div class="stat-item"> | |
| <i class="fas fa-server" style="font-size: 2rem; color: rgba(133, 48, 48, 0.8); margin-bottom: 0.5rem;"></i> | |
| <span class="stat-value" id="storageUsed">0 GB</span> | |
| <span class="stat-label">Storage Used</span> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="admin-card"> | |
| <h3><i class="fas fa-chart-bar"></i> Role Distribution Details</h3> | |
| <div class="stats-grid" style="display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem;"> | |
| <div class="stat-item"> | |
| <span class="stat-value" id="cheapCount">0</span> | |
| <span class="stat-label">Cheap Role</span> | |
| </div> | |
| <div class="stat-item"> | |
| <span class="stat-value" id="premiumCount">0</span> | |
| <span class="stat-label">Premium Role</span> | |
| </div> | |
| <div class="stat-item"> | |
| <span class="stat-value" id="vipCount">0</span> | |
| <span class="stat-label">VIP Role</span> | |
| </div> | |
| <div class="stat-item"> | |
| <span class="stat-value" id="supremeCount">0</span> | |
| <span class="stat-label">Supreme Role</span> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <div id="api-stats" class="section"> | |
| <h2><i class="fas fa-chart-area"></i> API Statistics</h2> | |
| <p style="margin-bottom: 2rem; opacity: 0.8;">Global API usage statistics and analytics</p> | |
| <div class="stats-cards"> | |
| <div class="stat-card"> | |
| <div class="stat-icon"> | |
| <i class="fas fa-globe"></i> | |
| </div> | |
| <div class="stat-info"> | |
| <div class="stat-number" id="globalTotalRequests">0</div> | |
| <div class="stat-label">Total Requests (All Users)</div> | |
| </div> | |
| </div> | |
| <div class="stat-card"> | |
| <div class="stat-icon"> | |
| <i class="fas fa-calendar-day"></i> | |
| </div> | |
| <div class="stat-info"> | |
| <div class="stat-number" id="globalTodayRequests">0</div> | |
| <div class="stat-label">Today's Requests (All Users)</div> | |
| </div> | |
| </div> | |
| <div class="stat-card"> | |
| <div class="stat-icon"> | |
| <i class="fas fa-check-circle"></i> | |
| </div> | |
| <div class="stat-info"> | |
| <div class="stat-number" id="successRate">0%</div> | |
| <div class="stat-label">Success Rate</div> | |
| </div> | |
| </div> | |
| <div class="stat-card"> | |
| <div class="stat-icon"> | |
| <i class="fas fa-times-circle"></i> | |
| </div> | |
| <div class="stat-info"> | |
| <div class="stat-number" id="failRate">0%</div> | |
| <div class="stat-label">Fail Rate</div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="charts-grid" style="display: grid; grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); gap: 2rem; margin-top: 2rem;"> | |
| <div class="admin-card"> | |
| <h3><i class="fas fa-chart-pie"></i> Top Endpoints Distribution</h3> | |
| <canvas id="topEndpointsChart" style="max-height: 350px;"></canvas> | |
| </div> | |
| <div class="admin-card"> | |
| <h3><i class="fas fa-percentage"></i> Success vs Fail Rate</h3> | |
| <canvas id="successFailChart" style="max-height: 350px;"></canvas> | |
| </div> | |
| </div> | |
| <div class="admin-card" style="margin-top: 2rem;"> | |
| <h3><i class="fas fa-chart-bar"></i> Daily Request Statistics (Last 7 Days)</h3> | |
| <canvas id="dailyRequestsChart" style="max-height: 400px;"></canvas> | |
| </div> | |
| <div class="admin-card" style="margin-top: 2rem;"> | |
| <h3><i class="fas fa-chart-line"></i> Hourly Trends (Last 24 Hours)</h3> | |
| <canvas id="hourlyTrendsChart" style="max-height: 400px;"></canvas> | |
| </div> | |
| <div class="admin-card" style="margin-top: 2rem;"> | |
| <h3><i class="fas fa-list-ol"></i> Top 10 Most Used Endpoints</h3> | |
| <div id="topEndpointsList"> | |
| <div class="loading"> | |
| <i class="fas fa-spinner fa-spin"></i> Loading... | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <div id="events" class="section"> | |
| <h2><i class="fas fa-calendar"></i> Events & Rewards</h2> | |
| <div class="events-container"> | |
| <div class="redeem-section"> | |
| <h3><i class="fas fa-gift"></i> Redeem Code</h3> | |
| <p style="margin-bottom: 1.5rem; opacity: 0.8;">Enter a redeem code to unlock premium features or additional limits</p> | |
| <div class="form-group"> | |
| <input type="text" id="redeemCode" placeholder="Enter your redeem code" style="text-transform: uppercase;"> | |
| <button onclick="redeemCode()" class="btn btn-primary"> | |
| <i class="fas fa-magic"></i> Redeem | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <div id="settings" class="section"> | |
| <h2><i class="fas fa-cog"></i> Settings</h2> | |
| <div class="settings-container"> | |
| <div class="setting-card"> | |
| <h3><i class="fas fa-user-edit"></i> Profile Settings</h3> | |
| <div class="form-group"> | |
| <label>Username</label> | |
| <input type="text" id="usernameInput" placeholder="Enter new username"> | |
| </div> | |
| <button onclick="updateProfile()" class="btn btn-primary"> | |
| <i class="fas fa-save"></i> Update Profile | |
| </button> | |
| </div> | |
| <div class="setting-card" id="premiumSettings" style="display: none;"> | |
| <h3><i class="fas fa-crown"></i> Premium Features</h3> | |
| <button onclick="regenerateApiKey()" class="btn btn-warning"> | |
| <i class="fas fa-sync"></i> Regenerate API Key | |
| </button> | |
| <p class="text-muted">Generate a new API key (Premium only)</p> | |
| </div> | |
| <div class="setting-card danger-zone"> | |
| <h3><i class="fas fa-exclamation-triangle"></i> Danger Zone</h3> | |
| <button onclick="deleteAccount()" class="btn btn-danger"> | |
| <i class="fas fa-trash"></i> Delete Account | |
| </button> | |
| <p class="text-muted">This action cannot be undone</p> | |
| </div> | |
| </div> | |
| </div> | |
| <div id="management" class="section"> | |
| <h2><i class="fas fa-users-cog"></i> Admin Management</h2> | |
| <div class="admin-container"> | |
| <div class="admin-card"> | |
| <h3><i class="fas fa-users"></i> User Management</h3> | |
| <div id="adminUsersList"> | |
| <div class="loading"> | |
| <i class="fas fa-spinner fa-spin"></i> Loading users... | |
| </div> | |
| </div> | |
| </div> | |
| <div class="admin-card"> | |
| <h3><i class="fas fa-user-tag"></i> Set User Role</h3> | |
| <div class="form-row"> | |
| <div class="form-group" style="grid-column: 1 / -1;"> | |
| <label>Search User <span class="required">*</span></label> | |
| <input type="text" id="searchUserInput" placeholder="Search by username or email" oninput="searchUsersForRole(this.value)"> | |
| <div id="userSearchResults" style="display: none; margin-top: 0.5rem; background: rgba(255,255,255,0.05); border-radius: 8px; max-height: 200px; overflow-y: auto;"></div> | |
| </div> | |
| <div class="form-group"> | |
| <label>Selected User</label> | |
| <input type="text" id="selectedUserDisplay" placeholder="No user selected" readonly> | |
| <input type="hidden" id="selectedUserId"> | |
| </div> | |
| <div class="form-group"> | |
| <label>Role <span class="required">*</span></label> | |
| <select id="assignRoleType"> | |
| <option value="cheap">Cheap (Limit 500)</option> | |
| <option value="premium">Premium (Limit 1500)</option> | |
| <option value="vip">VIP (Limit 2500)</option> | |
| <option value="supreme">Supreme (Limit 3000)</option> | |
| </select> | |
| </div> | |
| <div class="form-group"> | |
| <label>Custom API Key <span style="color: #666; font-size: 0.85em;">(Optional)</span></label> | |
| <input type="text" id="customApiKey" placeholder="Leave empty for current key"> | |
| <small>All roles support custom API keys</small> | |
| </div> | |
| </div> | |
| <button onclick="assignUserRole()" class="btn btn-primary"> | |
| <i class="fas fa-user-check"></i> Assign Role | |
| </button> | |
| </div> | |
| <div class="admin-card"> | |
| <h3><i class="fas fa-ticket-alt"></i> Create Redeem Code</h3> | |
| <div class="form-row"> | |
| <div class="form-group"> | |
| <label>Type <span class="required">*</span></label> | |
| <select id="redeemType"> | |
| <option value="limit">Limit Only</option> | |
| <option value="premium">Premium Only</option> | |
| <option value="both">Both</option> | |
| </select> | |
| </div> | |
| <div class="form-group" id="limitContainer" style="display: none;"> | |
| <label>Limit Value</label> | |
| <input type="number" id="limitValue" min="0" placeholder="Additional limit"> | |
| <small>Optional for Premium Only</small> | |
| </div> | |
| <div class="form-group" id="codeExpiredContainer" style="display: none;"> | |
| <label>Code Expired <span class="required">*</span></label> | |
| <input type="datetime-local" id="codeExpired" required> | |
| <small>When the code expires</small> | |
| </div> | |
| <div class="form-group" id="premiumExpiredContainer" style="display: none;"> | |
| <label>Premium Expired <span class="required">*</span></label> | |
| <input type="datetime-local" id="premiumExpired"> | |
| <small>When premium access expires</small> | |
| </div> | |
| </div> | |
| <button onclick="createRedeemCode()" class="btn btn-primary"> | |
| <i class="fas fa-plus"></i> Create Code | |
| </button> | |
| </div> | |
| <div class="admin-card"> | |
| <h3><i class="fas fa-chart-pie"></i> System Statistics</h3> | |
| <div class="stats-grid"> | |
| <div class="stat-item"> | |
| <span class="stat-value" id="adminTotalUsers">0</span> | |
| <span class="stat-label">Total Users</span> | |
| </div> | |
| <div class="stat-item"> | |
| <span class="stat-value" id="adminTotalRequests">0</span> | |
| <span class="stat-label">Total Requests</span> | |
| </div> | |
| <div class="stat-item"> | |
| <span class="stat-value" id="adminTodayRequests">0</span> | |
| <span class="stat-label">Today's Requests</span> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <script> | |
| (function(){ | |
| function detectDevTools(){ | |
| const threshold = 160; | |
| const widthThreshold = window.outerWidth - window.innerWidth > threshold; | |
| const heightThreshold = window.outerHeight - window.innerHeight > threshold; | |
| if(widthThreshold || heightThreshold) window.location.href = "/denied"; | |
| } | |
| document.addEventListener("contextmenu", e => e.preventDefault()); | |
| document.onkeydown = function(e){ | |
| if(e.keyCode === 123 || (e.ctrlKey && e.shiftKey && ['I','C','J'].includes(e.key?.toUpperCase())) || (e.ctrlKey && e.key?.toUpperCase() === 'U')){ | |
| e.preventDefault(); | |
| window.location.href = "/denied"; | |
| } | |
| }; | |
| setInterval(() => { | |
| if(window.eruda) window.location.href = "/denied"; | |
| detectDevTools(); | |
| try{ | |
| console.profile(); | |
| console.profileEnd(); | |
| }catch(e){} | |
| try{ | |
| if(console.clear.toString().length > 100) window.location.href = "/denied"; | |
| }catch(e){} | |
| }, 1000); | |
| })(); | |
| </script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/sweetalert2/11.10.8/sweetalert2.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.0/js/bootstrap.bundle.min.js"></script> | |
| <script src="dashboard.js"></script> | |
| </body> | |
| </html> |