Application Logs staging-log-20260730.txt 200 entries
All ERR WRN INF DBG
Activity 150
2026-07-30 20:03:16.827 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /robots.txt responded 401 in 0.5586 ms
2026-07-30 19:59:37.570 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /etc/ssl/private/server.key responded 401 in 0.4874 ms
2026-07-30 19:59:37.474 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /.bash_history responded 401 in 0.5543 ms
2026-07-30 19:59:37.447 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /secrets.json responded 401 in 0.4314 ms
2026-07-30 19:59:37.420 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /.npmrc responded 401 in 0.4620 ms
2026-07-30 19:59:37.393 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /config/production.json responded 401 in 0.4592 ms
2026-07-30 19:59:37.365 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /server.key responded 401 in 0.4634 ms
2026-07-30 19:59:37.338 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /.vscode/sftp.json responded 401 in 0.4105 ms
2026-07-30 19:59:37.312 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /.ssh/id_rsa responded 401 in 0.2697 ms
2026-07-30 19:59:37.311 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /.ssh/id_ecdsa responded 401 in 0.3761 ms
2026-07-30 19:59:37.284 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /.ssh/id_ed25519 responded 401 in 0.2759 ms
2026-07-30 19:59:37.282 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /backup.tar.gz responded 401 in 0.3292 ms
2026-07-30 19:59:37.255 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /.svn/wc.db responded 401 in 0.3312 ms
2026-07-30 19:59:37.253 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /actuator/heapdump responded 401 in 0.4594 ms
2026-07-30 19:59:37.227 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /backup.zip responded 401 in 0.3501 ms
2026-07-30 19:59:37.226 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /wp-config.php responded 401 in 0.4019 ms
2026-07-30 19:59:37.200 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /database.sql responded 401 in 0.3329 ms
2026-07-30 19:59:37.199 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /database_backup.sql responded 401 in 0.4407 ms
2026-07-30 19:59:37.173 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /backup.sql responded 401 in 0.3257 ms
2026-07-30 19:59:37.172 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /dump.sql responded 401 in 0.4707 ms
2026-07-30 19:59:37.146 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /config.php responded 401 in 0.3187 ms
2026-07-30 19:59:37.142 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /user_secrets.yml responded 401 in 0.4622 ms
2026-07-30 19:59:37.120 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /docker-compose.yml responded 401 in 0.3599 ms
2026-07-30 19:59:37.113 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /phpinfo.php responded 401 in 0.3934 ms
2026-07-30 19:59:37.094 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /api/.env responded 401 in 0.3781 ms
2026-07-30 19:59:37.086 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /.env responded 401 in 0.7441 ms
2026-07-30 19:59:37.068 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /.git/HEAD responded 401 in 0.4092 ms
2026-07-30 19:59:37.057 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /wp-admin/setup-config.php responded 401 in 0.4575 ms
2026-07-30 19:59:37.041 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /storage/logs/laravel.log responded 401 in 0.5089 ms
2026-07-30 19:59:37.011 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /config.xml responded 401 in 0.5325 ms
2026-07-30 19:59:36.984 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /.env.production responded 401 in 0.4265 ms
2026-07-30 19:59:36.958 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /_vti_pvt/service.pwd responded 401 in 0.4104 ms
2026-07-30 19:59:36.942 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP POST / responded 200 in 1.0066 ms
2026-07-30 19:59:36.942 +00:00 [INF] [HTTP] [U:-] [E:-] [C:cf825119b591] HTTP POST / 200
Req: [non-JSON body] Res: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Home — WM Policy Documents</title> <link rel="stylesheet" href="/lib/bootstrap/dist/css/bootstrap.min.css" /> <link rel="stylesheet" href="/css/site.css?v=xQHUTQJdpYJFKIjDlFCI1X8KDqtO5qaSSeJFSoCP3pA" /> <link rel="stylesheet" href="/css/commissions.css?v=ZRMXSlMSxdLsHmJCZzq1LopWaopJSbVXKu57gvUJG3w" /> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css" /> <style> /* ---- Hover-expand left sidebar -------------------------------------- */ :root { --sb-collapsed: 64px; --sb-expanded: 240px; } body.has-sidebar { /* Reserve space for the collapsed rail; the expanded panel overlays the content on hover, so the content never shifts. */ padding-left: var(--sb-collapsed); } .app-sidebar { position: fixed; top: 0; left: 0; height: 100vh; width: var(--sb-collapsed); overflow-x: hidden; overflow-y: auto; display: flex; flex-direction: column; z-index: 1045; transition: width 0.2s ease; } .app-sidebar:hover, .app-sidebar:focus-within { width: var(--sb-expanded); box-shadow: 0 0 24px rgba(0,0,0,0.35); } .app-sidebar .sb-label { white-space: nowrap; opacity: 0; transition: opacity 0.15s ease; } .app-sidebar:hover .sb-label, .app-sidebar:focus-within .sb-label { opacity: 1; } .sb-link { display: flex; align-items: center; gap: 0.85rem; padding: 0.65rem 0; color: rgba(255,255,255,0.75); text-decoration: none; border-left: 3px solid transparent; } .sb-link:hover { color: #fff; background: rgba(255,255,255,0.08); } .sb-link.active { color: #fff; background: rgba(255,255,255,0.12); border-left-color: #0d6efd; } .sb-link > i:first-child { min-width: var(--sb-collapsed); text-align: center; font-size: 1.15rem; flex-shrink: 0; } .sb-brand { display: flex; align-items: center; gap: 0.85rem; padding: 0.9rem 0; color: #fff; text-decoration: none; font-weight: 700; } .sb-brand > i:first-child { min-width: var(--sb-collapsed); text-align: center; font-size: 1.3rem; flex-shrink: 0; } /* Sub-menu (Fact-Find) */ .sb-submenu .sb-link { font-size: 0.9rem; padding-left: 0; } .sb-submenu .sb-link > i:first-child { font-size: 1rem; } .sb-caret { margin-left: auto; margin-right: 0.9rem; transition: transform 0.15s ease; } .sb-link[aria-expanded="true"] .sb-caret { transform: rotate(180deg); } </style> </head> <body class="d-flex flex-column min-vh-100 has-sidebar"> <nav b-yjl2sbey1b class="app-sidebar navbar-dark bg-dark shadow-sm"> <a class="sb-brand" href="/UI"> <i b-yjl2sbey1b class="bi bi-file-earmark-text"></i> <span b-yjl2sbey1b class="sb-label">Wealthmax</span> </a> <div b-yjl2sbey1b class="d-flex flex-column flex-grow-1"> <a class="sb-link " href="/UI/Dashboard/Index"> <i b-yjl2sbey1b class="bi bi-speedometer2"></i><span b-yjl2sbey1b class="sb-label">Dashboard</span> </a> <a class="sb-link " href="/UI/Templates/Index"> <i b-yjl2sbey1b class="bi bi-collection"></i><span b-yjl2sbey1b class="sb-label">Templates</span> </a> <a class="sb-link " href="/UI/Tokens/Index"> <i b-yjl2sbey1b class="bi bi-braces"></i><span b-yjl2sbey1b class="sb-label">Token Registry</span> </a> <a class="sb-link " href="/UI/Clients/Index"> <i b-yjl2sbey1b class="bi bi-people"></i><span b-yjl2sbey1b class="sb-label">Clients</span> </a> <a class="sb-link " href="/UI/Cases/Index"> <i b-yjl2sbey1b class="bi bi-briefcase"></i><span b-yjl2sbey1b class="sb-label">Cases</span> </a> <a class="sb-link " href="/UI/Reporting/Index"> <i b-yjl2sbey1b class="bi bi-graph-up"></i><span b-yjl2sbey1b class="sb-label">Reports</span> </a> <a class="sb-link " href="/UI/Commissions/Management"> <i b-yjl2sbey1b class="bi bi-cash-coin"></i><span b-yjl2sbey1b class="sb-label">Commissions</span> </a> <!-- User Management --> <a class="sb-link " href="/UI/Users/Index"> <i b-yjl2sbey1b class="bi bi-person-gear"></i><span b-yjl2sbey1b class="sb-label">User Management</span> </a> <!-- Fact-Find (expandable sub-menu) --> <a b-yjl2sbey1b class="sb-link " href="#ffSubmenu" role="button" data-bs-toggle="collapse" aria-expanded="false"> <i b-yjl2sbey1b class="bi bi-file-earmark-text"></i><span b-yjl2sbey1b class="sb-label">Fact-Find</span> <i b-yjl2sbey1b class="bi bi-chevron-down sb-caret sb-label"></i> </a> <div b-yjl2sbey1b class="collapse sb-submenu " id="ffSubmenu"> <a class="sb-link " href="/UI/FactFindFormatters/Index"> <i b-yjl2sbey1b class="bi bi-grid"></i><span b-yjl2sbey1b class="sb-label">Formatters</span> </a> <a class="sb-link " href="/UI/FactFindTemplates/Index"> <i b-yjl2sbey1b class="bi bi-layers"></i><span b-yjl2sbey1b class="sb-label">Templates</span> </a> <a class="sb-link " href="/UI/FactFindGenerate"> <i b-yjl2sbey1b class="bi bi-lightning-charge"></i><span b-yjl2sbey1b class="sb-label">Generate &amp; Preview</span> </a> </div> </div> <!-- Auth (pinned to bottom) --> <div b-yjl2sbey1b class="mt-auto border-top border-secondary"> <a b-yjl2sbey1b class="sb-link" href="/UI/business/login"> <i b-yjl2sbey1b class="bi bi-box-arrow-in-right"></i><span b-yjl2sbey1b class="sb-label">Business login</span> </a> </div> </nav> <main b-yjl2sbey1b class="flex-grow-1 py-4"> <div b-yjl2sbey1b class="container-fluid px-4"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css"> <style> body > nav.navbar { position: sticky; top: 0; z-index: 1030; } .dash-hero { background: linear-gradient(135deg, #212529 0%, #343a40 100%); color: #fff; } .dash-card { border: none; border-radius: 12px; transition: transform 0.15s ease, box-shadow 0.15s ease; } .dash-card:hover { transform: translateY(-3px); box-shadow: 0 8px 24px rgba(0,0,0,0.10) !important; } .dash-icon { width: 48px; height: 48px; border-radius: 12px; display: flex; align-items: center; justify-content: center; font-size: 1.4rem; } .dash-stat-value { font-size: 2rem; font-weight: 700; line-height: 1; } .dash-card-title { font-size: 0.95rem; font-weight: 600; } .dash-card-text { font-size: 0.78rem; } /* Discreet business-login link pinned to the bottom-right corner. */ .home-login-link { position: fixed; bottom: 1rem; right: 1.25rem; z-index: 1040; } </style> <!-- Hero --> <div class="dash-hero py-4 mb-4"> <div class="container text-center"> <h1 class="display-6 fw-bold mb-2">Wealthmax PM CRM</h1> <p class="lead text-white-50 mb-0" style="max-width: 640px; margin: 0 auto;"> Testing harness dashboard &mdash; system tools, integrations, and live service health at a glance. </p> </div> </div> <div class="container pb-5"> <!-- Tool / Integration cards --> <div class="row g-3 mb-4"> <!-- Tenants Created --> <div class="col-6 col-md-4 col-lg-3"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="d-flex align-items-start justify-content-between mb-2"> <div class="dash-icon bg-primary bg-opacity-10 text-primary"> <i class="bi bi-building-fill"></i> </div> <span class="badge bg-secondary bg-opacity-10 text-secondary">Sample</span> </div> <div class="dash-stat-value text-dark">12</div> <div class="dash-card-title text-dark mt-1">Tenants Created</div> <p class="dash-card-text text-muted mb-0">Total onboarded tenants in this environment.</p> </div> </div> </div> <!-- Build Logs --> <div class="col-6 col-md-4 col-lg-3"> <a href="/UI/DevLogs" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-dark bg-opacity-10 text-dark mb-2"> <i class="bi bi-terminal-fill"></i> </div> <div class="dash-card-title text-dark">Build &amp; App Logs</div> <p class="dash-card-text text-muted mb-0">Browse structured application logs by date and level.</p> </div> </div> </a> </div> <!-- Swagger --> <div class="col-6 col-md-4 col-lg-3"> <a href="/swagger" target="_blank" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="d-flex align-items-start justify-content-between mb-2"> <div class="dash-icon bg-success bg-opacity-10 text-success"> <i class="bi bi-braces"></i> </div> <i class="bi bi-box-arrow-up-right text-muted small"></i> </div> <div class="dash-card-title text-dark">Swagger / API Docs</div> <p class="dash-card-text text-muted mb-0">Explore and try the REST API via OpenAPI UI.</p> </div> </div> </a> </div> <!-- SignalR --> <div class="col-6 col-md-4 col-lg-3"> <a href="/test-signalr.html" target="_blank" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="d-flex align-items-start justify-content-between mb-2"> <div class="dash-icon bg-info bg-opacity-10 text-info"> <i class="bi bi-broadcast"></i> </div> <i class="bi bi-box-arrow-up-right text-muted small"></i> </div> <div class="dash-card-title text-dark">SignalR Hub</div> <p class="dash-card-text text-muted mb-0">Test real-time notifications over the SignalR hub.</p> </div> </div> </a> </div> <!-- iPipeline --> <div class="col-6 col-md-4 col-lg-3"> <a href="/demo/solution-builder" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-warning bg-opacity-10 text-warning mb-2"> <i class="bi bi-plug-fill"></i> </div> <div class="dash-card-title text-dark">iPipeline</div> <p class="dash-card-text text-muted mb-0">Launch the iPipeline Solution Builder integration.</p> </div> </div> </a> </div> <!-- Fetch Quotes --> <div class="col-6 col-md-4 col-lg-3"> <a href="/demo/solution-builder/events" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-danger bg-opacity-10 text-danger mb-2"> <i class="bi bi-receipt"></i> </div> <div class="dash-card-title text-dark">Fetch Quotes</div> <p class="dash-card-text text-muted mb-0">View quote-notification events returned from the pipeline.</p> </div> </div> </a> </div> <!-- CRM Dashboard --> <div class="col-6 col-md-4 col-lg-3"> <a class="text-decoration-none" href="/UI/Dashboard/Index"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-primary bg-opacity-10 text-primary mb-2"> <i class="bi bi-speedometer2"></i> </div> <div class="dash-card-title text-dark">CRM Dashboard</div> <p class="dash-card-text text-muted mb-0">Cases, clients, and commission overview metrics.</p> </div> </div> </a> </div> <!-- Clients --> <div class="col-6 col-md-4 col-lg-3"> <a class="text-decoration-none" href="/UI/Clients/Index"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-success bg-opacity-10 text-success mb-2"> <i class="bi bi-people-fill"></i> </div> <div class="dash-card-title text-dark">Clients &amp; Cases</div> <p class="dash-card-text text-muted mb-0">Manage client records and advisory cases.</p> </div> </div> </a> </div> </div> <!-- System Health --> <div id="health-card" class="card dash-card shadow-sm mb-4"> <div class="card-body p-3"> <!-- Loading state --> <div id="health-loading" class="text-center py-3"> <div class="spinner-border spinner-border-sm text-primary" role="status"> <span class="visually-hidden">Loading...</span> </div> <span class="ms-2 text-muted">Checking system health...</span> </div> <!-- Error state --> <div id="health-error" class="d-none text-center py-3"> <i class="bi bi-exclamation-triangle fs-4 text-danger d-block mb-2"></i> <p class="text-muted mb-1">Unable to reach the health endpoint.</p> <button class="btn btn-sm btn-outline-secondary" onclick="fetchHealth()"> <i class="bi bi-arrow-clockwise me-1"></i>Retry </button> </div> <!-- Success state --> <div id="health-content" class="d-none"> <div class="d-flex align-items-center mb-3"> <i class="bi bi-heart-pulse fs-4 text-primary me-2"></i> <h5 class="fw-semibold mb-0 me-auto">System Health</h5> <span id="health-status-badge" class="badge"></span> </div> <hr class="my-3"> <div class="row g-2 small"> <div class="col-sm-6"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-clock me-2"></i> <span>Checked: <span id="health-timestamp" class="text-body"></span></span> </div> </div> <div class="col-sm-6"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-speedometer2 me-2"></i> <span>Response: <span id="health-duration" class="text-body"></span></span> </div> </div> <div class="col-sm-6 d-none" id="health-db-row"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-database me-2"></i> <span>Database: <span id="health-database" class="text-body"></span></span> </div> </div> <div class="col-sm-6 d-none" id="health-build-row"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-git me-2"></i> <span>Build: <code id="health-commit"></code> <span id="health-build-date" class="text-muted"></span></span> </div> </div> </div> </div> </div> </div> <!-- Tech Stack --> <div class="text-center"> <div class="d-flex flex-wrap justify-content-center gap-3 text-muted small"> <span><i class="bi bi-gear me-1"></i>.NET 10</span> <span class="text-black-50">|</span> <span><i class="bi bi-database me-1"></i>PostgreSQL</span> <span class="text-black-50">|</span> <span><i class="bi bi-layers me-1"></i>Entity Framework Core</span> <span class="text-black-50">|</span> <span><i class="bi bi-lock me-1"></i>JWT Authentication</span> <span class="text-black-50">|</span> <span><i class="bi bi-book me-1"></i>OpenAPI / Swagger</span> </div> </div> </div> </content> </div> </main> <footer b-yjl2sbey1b class="bg-light border-top py-2 text-center text-muted small"> Wealthmax PM CRM &mdash; Policy Document Testing UI </footer> <script src="/lib/jquery/dist/jquery.min.js"></script> <script src="/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script src="/js/site.js?v=y_Ngd8W21UpuCUhEqGbUKDEqFnNfTjAfb24GhJJGUyM"></script> <script> function escapeHtml(text) { var div = document.createElement('div'); div.appendChild(document.createTextNode(text)); return div.innerHTML; } function statusBadgeClass(status) { switch ((status || '').toLowerCase()) { case 'healthy': return 'bg-success'; case 'degraded': return 'bg-warning text-dark'; default: return 'bg-danger'; } } function fetchHealth() { document.getElementById('health-loading').classList.remove('d-none'); document.getElementById('health-error').classList.add('d-none'); document.getElementById('health-content').classList.add('d-none'); fetch('/api/health') .then(function (response) { if (response.ok || response.status === 503) { return response.json(); } throw new Error('Unexpected status: ' + response.status); }) .then(function (response) { var health = response.data || response; renderHealth(health); document.getElementById('health-loading').classList.add('d-none'); document.getElementById('health-content').classList.remove('d-none'); }) .catch(function () { document.getElementById('health-loading').classList.add('d-none'); document.getElementById('health-error').classList.remove('d-none'); }); } function renderHealth(data) { var badge = document.getElementById('health-status-badge'); badge.textContent = data.status; badge.className = 'badge ' + statusBadgeClass(data.status); document.getElementById('health-timestamp').textContent = new Date(data.timestamp).toLocaleString(); document.getElementById('health-duration').textContent = data.totalDurationMs + ' ms'; var dbRow = document.getElementById('health-db-row'); if (data.databaseName || data.databaseProvider) { var parts = []; if (data.databaseName) parts.push(data.databaseName); if (data.databaseProvider) parts.push(data.databaseProvider); document.getElementById('health-database').textContent = parts.join(' on '); dbRow.classList.remove('d-none'); } else { dbRow.classList.add('d-none'); } var buildRow = document.getElementById('health-build-row'); if (data.commitHash || data.lastBuildDate) { document.getElementById('health-commit').textContent = data.commitHash || ''; document.getElementById('health-build-date').textContent = data.lastBuildDate ? '(' + new Date(data.lastBuildDate).toLocaleDateString() + ')' : ''; buildRow.classList.remove('d-none'); } else { buildRow.classList.add('d-none'); } } fetchHealth(); </script> </body> </html>
2026-07-30 19:59:36.937 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET / responded 200 in 2.0472 ms
2026-07-30 19:59:36.937 +00:00 [INF] [HTTP] [U:-] [E:-] [C:cf58d651f469] HTTP GET / 200
Req: [no body] Res: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Home — WM Policy Documents</title> <link rel="stylesheet" href="/lib/bootstrap/dist/css/bootstrap.min.css" /> <link rel="stylesheet" href="/css/site.css?v=xQHUTQJdpYJFKIjDlFCI1X8KDqtO5qaSSeJFSoCP3pA" /> <link rel="stylesheet" href="/css/commissions.css?v=ZRMXSlMSxdLsHmJCZzq1LopWaopJSbVXKu57gvUJG3w" /> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css" /> <style> /* ---- Hover-expand left sidebar -------------------------------------- */ :root { --sb-collapsed: 64px; --sb-expanded: 240px; } body.has-sidebar { /* Reserve space for the collapsed rail; the expanded panel overlays the content on hover, so the content never shifts. */ padding-left: var(--sb-collapsed); } .app-sidebar { position: fixed; top: 0; left: 0; height: 100vh; width: var(--sb-collapsed); overflow-x: hidden; overflow-y: auto; display: flex; flex-direction: column; z-index: 1045; transition: width 0.2s ease; } .app-sidebar:hover, .app-sidebar:focus-within { width: var(--sb-expanded); box-shadow: 0 0 24px rgba(0,0,0,0.35); } .app-sidebar .sb-label { white-space: nowrap; opacity: 0; transition: opacity 0.15s ease; } .app-sidebar:hover .sb-label, .app-sidebar:focus-within .sb-label { opacity: 1; } .sb-link { display: flex; align-items: center; gap: 0.85rem; padding: 0.65rem 0; color: rgba(255,255,255,0.75); text-decoration: none; border-left: 3px solid transparent; } .sb-link:hover { color: #fff; background: rgba(255,255,255,0.08); } .sb-link.active { color: #fff; background: rgba(255,255,255,0.12); border-left-color: #0d6efd; } .sb-link > i:first-child { min-width: var(--sb-collapsed); text-align: center; font-size: 1.15rem; flex-shrink: 0; } .sb-brand { display: flex; align-items: center; gap: 0.85rem; padding: 0.9rem 0; color: #fff; text-decoration: none; font-weight: 700; } .sb-brand > i:first-child { min-width: var(--sb-collapsed); text-align: center; font-size: 1.3rem; flex-shrink: 0; } /* Sub-menu (Fact-Find) */ .sb-submenu .sb-link { font-size: 0.9rem; padding-left: 0; } .sb-submenu .sb-link > i:first-child { font-size: 1rem; } .sb-caret { margin-left: auto; margin-right: 0.9rem; transition: transform 0.15s ease; } .sb-link[aria-expanded="true"] .sb-caret { transform: rotate(180deg); } </style> </head> <body class="d-flex flex-column min-vh-100 has-sidebar"> <nav b-yjl2sbey1b class="app-sidebar navbar-dark bg-dark shadow-sm"> <a class="sb-brand" href="/UI"> <i b-yjl2sbey1b class="bi bi-file-earmark-text"></i> <span b-yjl2sbey1b class="sb-label">Wealthmax</span> </a> <div b-yjl2sbey1b class="d-flex flex-column flex-grow-1"> <a class="sb-link " href="/UI/Dashboard/Index"> <i b-yjl2sbey1b class="bi bi-speedometer2"></i><span b-yjl2sbey1b class="sb-label">Dashboard</span> </a> <a class="sb-link " href="/UI/Templates/Index"> <i b-yjl2sbey1b class="bi bi-collection"></i><span b-yjl2sbey1b class="sb-label">Templates</span> </a> <a class="sb-link " href="/UI/Tokens/Index"> <i b-yjl2sbey1b class="bi bi-braces"></i><span b-yjl2sbey1b class="sb-label">Token Registry</span> </a> <a class="sb-link " href="/UI/Clients/Index"> <i b-yjl2sbey1b class="bi bi-people"></i><span b-yjl2sbey1b class="sb-label">Clients</span> </a> <a class="sb-link " href="/UI/Cases/Index"> <i b-yjl2sbey1b class="bi bi-briefcase"></i><span b-yjl2sbey1b class="sb-label">Cases</span> </a> <a class="sb-link " href="/UI/Reporting/Index"> <i b-yjl2sbey1b class="bi bi-graph-up"></i><span b-yjl2sbey1b class="sb-label">Reports</span> </a> <a class="sb-link " href="/UI/Commissions/Management"> <i b-yjl2sbey1b class="bi bi-cash-coin"></i><span b-yjl2sbey1b class="sb-label">Commissions</span> </a> <!-- User Management --> <a class="sb-link " href="/UI/Users/Index"> <i b-yjl2sbey1b class="bi bi-person-gear"></i><span b-yjl2sbey1b class="sb-label">User Management</span> </a> <!-- Fact-Find (expandable sub-menu) --> <a b-yjl2sbey1b class="sb-link " href="#ffSubmenu" role="button" data-bs-toggle="collapse" aria-expanded="false"> <i b-yjl2sbey1b class="bi bi-file-earmark-text"></i><span b-yjl2sbey1b class="sb-label">Fact-Find</span> <i b-yjl2sbey1b class="bi bi-chevron-down sb-caret sb-label"></i> </a> <div b-yjl2sbey1b class="collapse sb-submenu " id="ffSubmenu"> <a class="sb-link " href="/UI/FactFindFormatters/Index"> <i b-yjl2sbey1b class="bi bi-grid"></i><span b-yjl2sbey1b class="sb-label">Formatters</span> </a> <a class="sb-link " href="/UI/FactFindTemplates/Index"> <i b-yjl2sbey1b class="bi bi-layers"></i><span b-yjl2sbey1b class="sb-label">Templates</span> </a> <a class="sb-link " href="/UI/FactFindGenerate"> <i b-yjl2sbey1b class="bi bi-lightning-charge"></i><span b-yjl2sbey1b class="sb-label">Generate &amp; Preview</span> </a> </div> </div> <!-- Auth (pinned to bottom) --> <div b-yjl2sbey1b class="mt-auto border-top border-secondary"> <a b-yjl2sbey1b class="sb-link" href="/UI/business/login"> <i b-yjl2sbey1b class="bi bi-box-arrow-in-right"></i><span b-yjl2sbey1b class="sb-label">Business login</span> </a> </div> </nav> <main b-yjl2sbey1b class="flex-grow-1 py-4"> <div b-yjl2sbey1b class="container-fluid px-4"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css"> <style> body > nav.navbar { position: sticky; top: 0; z-index: 1030; } .dash-hero { background: linear-gradient(135deg, #212529 0%, #343a40 100%); color: #fff; } .dash-card { border: none; border-radius: 12px; transition: transform 0.15s ease, box-shadow 0.15s ease; } .dash-card:hover { transform: translateY(-3px); box-shadow: 0 8px 24px rgba(0,0,0,0.10) !important; } .dash-icon { width: 48px; height: 48px; border-radius: 12px; display: flex; align-items: center; justify-content: center; font-size: 1.4rem; } .dash-stat-value { font-size: 2rem; font-weight: 700; line-height: 1; } .dash-card-title { font-size: 0.95rem; font-weight: 600; } .dash-card-text { font-size: 0.78rem; } /* Discreet business-login link pinned to the bottom-right corner. */ .home-login-link { position: fixed; bottom: 1rem; right: 1.25rem; z-index: 1040; } </style> <!-- Hero --> <div class="dash-hero py-4 mb-4"> <div class="container text-center"> <h1 class="display-6 fw-bold mb-2">Wealthmax PM CRM</h1> <p class="lead text-white-50 mb-0" style="max-width: 640px; margin: 0 auto;"> Testing harness dashboard &mdash; system tools, integrations, and live service health at a glance. </p> </div> </div> <div class="container pb-5"> <!-- Tool / Integration cards --> <div class="row g-3 mb-4"> <!-- Tenants Created --> <div class="col-6 col-md-4 col-lg-3"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="d-flex align-items-start justify-content-between mb-2"> <div class="dash-icon bg-primary bg-opacity-10 text-primary"> <i class="bi bi-building-fill"></i> </div> <span class="badge bg-secondary bg-opacity-10 text-secondary">Sample</span> </div> <div class="dash-stat-value text-dark">12</div> <div class="dash-card-title text-dark mt-1">Tenants Created</div> <p class="dash-card-text text-muted mb-0">Total onboarded tenants in this environment.</p> </div> </div> </div> <!-- Build Logs --> <div class="col-6 col-md-4 col-lg-3"> <a href="/UI/DevLogs" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-dark bg-opacity-10 text-dark mb-2"> <i class="bi bi-terminal-fill"></i> </div> <div class="dash-card-title text-dark">Build &amp; App Logs</div> <p class="dash-card-text text-muted mb-0">Browse structured application logs by date and level.</p> </div> </div> </a> </div> <!-- Swagger --> <div class="col-6 col-md-4 col-lg-3"> <a href="/swagger" target="_blank" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="d-flex align-items-start justify-content-between mb-2"> <div class="dash-icon bg-success bg-opacity-10 text-success"> <i class="bi bi-braces"></i> </div> <i class="bi bi-box-arrow-up-right text-muted small"></i> </div> <div class="dash-card-title text-dark">Swagger / API Docs</div> <p class="dash-card-text text-muted mb-0">Explore and try the REST API via OpenAPI UI.</p> </div> </div> </a> </div> <!-- SignalR --> <div class="col-6 col-md-4 col-lg-3"> <a href="/test-signalr.html" target="_blank" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="d-flex align-items-start justify-content-between mb-2"> <div class="dash-icon bg-info bg-opacity-10 text-info"> <i class="bi bi-broadcast"></i> </div> <i class="bi bi-box-arrow-up-right text-muted small"></i> </div> <div class="dash-card-title text-dark">SignalR Hub</div> <p class="dash-card-text text-muted mb-0">Test real-time notifications over the SignalR hub.</p> </div> </div> </a> </div> <!-- iPipeline --> <div class="col-6 col-md-4 col-lg-3"> <a href="/demo/solution-builder" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-warning bg-opacity-10 text-warning mb-2"> <i class="bi bi-plug-fill"></i> </div> <div class="dash-card-title text-dark">iPipeline</div> <p class="dash-card-text text-muted mb-0">Launch the iPipeline Solution Builder integration.</p> </div> </div> </a> </div> <!-- Fetch Quotes --> <div class="col-6 col-md-4 col-lg-3"> <a href="/demo/solution-builder/events" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-danger bg-opacity-10 text-danger mb-2"> <i class="bi bi-receipt"></i> </div> <div class="dash-card-title text-dark">Fetch Quotes</div> <p class="dash-card-text text-muted mb-0">View quote-notification events returned from the pipeline.</p> </div> </div> </a> </div> <!-- CRM Dashboard --> <div class="col-6 col-md-4 col-lg-3"> <a class="text-decoration-none" href="/UI/Dashboard/Index"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-primary bg-opacity-10 text-primary mb-2"> <i class="bi bi-speedometer2"></i> </div> <div class="dash-card-title text-dark">CRM Dashboard</div> <p class="dash-card-text text-muted mb-0">Cases, clients, and commission overview metrics.</p> </div> </div> </a> </div> <!-- Clients --> <div class="col-6 col-md-4 col-lg-3"> <a class="text-decoration-none" href="/UI/Clients/Index"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-success bg-opacity-10 text-success mb-2"> <i class="bi bi-people-fill"></i> </div> <div class="dash-card-title text-dark">Clients &amp; Cases</div> <p class="dash-card-text text-muted mb-0">Manage client records and advisory cases.</p> </div> </div> </a> </div> </div> <!-- System Health --> <div id="health-card" class="card dash-card shadow-sm mb-4"> <div class="card-body p-3"> <!-- Loading state --> <div id="health-loading" class="text-center py-3"> <div class="spinner-border spinner-border-sm text-primary" role="status"> <span class="visually-hidden">Loading...</span> </div> <span class="ms-2 text-muted">Checking system health...</span> </div> <!-- Error state --> <div id="health-error" class="d-none text-center py-3"> <i class="bi bi-exclamation-triangle fs-4 text-danger d-block mb-2"></i> <p class="text-muted mb-1">Unable to reach the health endpoint.</p> <button class="btn btn-sm btn-outline-secondary" onclick="fetchHealth()"> <i class="bi bi-arrow-clockwise me-1"></i>Retry </button> </div> <!-- Success state --> <div id="health-content" class="d-none"> <div class="d-flex align-items-center mb-3"> <i class="bi bi-heart-pulse fs-4 text-primary me-2"></i> <h5 class="fw-semibold mb-0 me-auto">System Health</h5> <span id="health-status-badge" class="badge"></span> </div> <hr class="my-3"> <div class="row g-2 small"> <div class="col-sm-6"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-clock me-2"></i> <span>Checked: <span id="health-timestamp" class="text-body"></span></span> </div> </div> <div class="col-sm-6"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-speedometer2 me-2"></i> <span>Response: <span id="health-duration" class="text-body"></span></span> </div> </div> <div class="col-sm-6 d-none" id="health-db-row"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-database me-2"></i> <span>Database: <span id="health-database" class="text-body"></span></span> </div> </div> <div class="col-sm-6 d-none" id="health-build-row"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-git me-2"></i> <span>Build: <code id="health-commit"></code> <span id="health-build-date" class="text-muted"></span></span> </div> </div> </div> </div> </div> </div> <!-- Tech Stack --> <div class="text-center"> <div class="d-flex flex-wrap justify-content-center gap-3 text-muted small"> <span><i class="bi bi-gear me-1"></i>.NET 10</span> <span class="text-black-50">|</span> <span><i class="bi bi-database me-1"></i>PostgreSQL</span> <span class="text-black-50">|</span> <span><i class="bi bi-layers me-1"></i>Entity Framework Core</span> <span class="text-black-50">|</span> <span><i class="bi bi-lock me-1"></i>JWT Authentication</span> <span class="text-black-50">|</span> <span><i class="bi bi-book me-1"></i>OpenAPI / Swagger</span> </div> </div> </div> </content> </div> </main> <footer b-yjl2sbey1b class="bg-light border-top py-2 text-center text-muted small"> Wealthmax PM CRM &mdash; Policy Document Testing UI </footer> <script src="/lib/jquery/dist/jquery.min.js"></script> <script src="/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script src="/js/site.js?v=y_Ngd8W21UpuCUhEqGbUKDEqFnNfTjAfb24GhJJGUyM"></script> <script> function escapeHtml(text) { var div = document.createElement('div'); div.appendChild(document.createTextNode(text)); return div.innerHTML; } function statusBadgeClass(status) { switch ((status || '').toLowerCase()) { case 'healthy': return 'bg-success'; case 'degraded': return 'bg-warning text-dark'; default: return 'bg-danger'; } } function fetchHealth() { document.getElementById('health-loading').classList.remove('d-none'); document.getElementById('health-error').classList.add('d-none'); document.getElementById('health-content').classList.add('d-none'); fetch('/api/health') .then(function (response) { if (response.ok || response.status === 503) { return response.json(); } throw new Error('Unexpected status: ' + response.status); }) .then(function (response) { var health = response.data || response; renderHealth(health); document.getElementById('health-loading').classList.add('d-none'); document.getElementById('health-content').classList.remove('d-none'); }) .catch(function () { document.getElementById('health-loading').classList.add('d-none'); document.getElementById('health-error').classList.remove('d-none'); }); } function renderHealth(data) { var badge = document.getElementById('health-status-badge'); badge.textContent = data.status; badge.className = 'badge ' + statusBadgeClass(data.status); document.getElementById('health-timestamp').textContent = new Date(data.timestamp).toLocaleString(); document.getElementById('health-duration').textContent = data.totalDurationMs + ' ms'; var dbRow = document.getElementById('health-db-row'); if (data.databaseName || data.databaseProvider) { var parts = []; if (data.databaseName) parts.push(data.databaseName); if (data.databaseProvider) parts.push(data.databaseProvider); document.getElementById('health-database').textContent = parts.join(' on '); dbRow.classList.remove('d-none'); } else { dbRow.classList.add('d-none'); } var buildRow = document.getElementById('health-build-row'); if (data.commitHash || data.lastBuildDate) { document.getElementById('health-commit').textContent = data.commitHash || ''; document.getElementById('health-build-date').textContent = data.lastBuildDate ? '(' + new Date(data.lastBuildDate).toLocaleDateString() + ')' : ''; buildRow.classList.remove('d-none'); } else { buildRow.classList.add('d-none'); } } fetchHealth(); </script> </body> </html>
2026-07-30 19:59:36.932 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP HEAD / responded 200 in 5.0673 ms
2026-07-30 19:59:36.931 +00:00 [INF] [HTTP] [U:-] [E:-] [C:2e0aa0e3a2fe] HTTP HEAD / 200
Req: [non-JSON body] Res: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Home — WM Policy Documents</title> <link rel="stylesheet" href="/lib/bootstrap/dist/css/bootstrap.min.css" /> <link rel="stylesheet" href="/css/site.css?v=xQHUTQJdpYJFKIjDlFCI1X8KDqtO5qaSSeJFSoCP3pA" /> <link rel="stylesheet" href="/css/commissions.css?v=ZRMXSlMSxdLsHmJCZzq1LopWaopJSbVXKu57gvUJG3w" /> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css" /> <style> /* ---- Hover-expand left sidebar -------------------------------------- */ :root { --sb-collapsed: 64px; --sb-expanded: 240px; } body.has-sidebar { /* Reserve space for the collapsed rail; the expanded panel overlays the content on hover, so the content never shifts. */ padding-left: var(--sb-collapsed); } .app-sidebar { position: fixed; top: 0; left: 0; height: 100vh; width: var(--sb-collapsed); overflow-x: hidden; overflow-y: auto; display: flex; flex-direction: column; z-index: 1045; transition: width 0.2s ease; } .app-sidebar:hover, .app-sidebar:focus-within { width: var(--sb-expanded); box-shadow: 0 0 24px rgba(0,0,0,0.35); } .app-sidebar .sb-label { white-space: nowrap; opacity: 0; transition: opacity 0.15s ease; } .app-sidebar:hover .sb-label, .app-sidebar:focus-within .sb-label { opacity: 1; } .sb-link { display: flex; align-items: center; gap: 0.85rem; padding: 0.65rem 0; color: rgba(255,255,255,0.75); text-decoration: none; border-left: 3px solid transparent; } .sb-link:hover { color: #fff; background: rgba(255,255,255,0.08); } .sb-link.active { color: #fff; background: rgba(255,255,255,0.12); border-left-color: #0d6efd; } .sb-link > i:first-child { min-width: var(--sb-collapsed); text-align: center; font-size: 1.15rem; flex-shrink: 0; } .sb-brand { display: flex; align-items: center; gap: 0.85rem; padding: 0.9rem 0; color: #fff; text-decoration: none; font-weight: 700; } .sb-brand > i:first-child { min-width: var(--sb-collapsed); text-align: center; font-size: 1.3rem; flex-shrink: 0; } /* Sub-menu (Fact-Find) */ .sb-submenu .sb-link { font-size: 0.9rem; padding-left: 0; } .sb-submenu .sb-link > i:first-child { font-size: 1rem; } .sb-caret { margin-left: auto; margin-right: 0.9rem; transition: transform 0.15s ease; } .sb-link[aria-expanded="true"] .sb-caret { transform: rotate(180deg); } </style> </head> <body class="d-flex flex-column min-vh-100 has-sidebar"> <nav b-yjl2sbey1b class="app-sidebar navbar-dark bg-dark shadow-sm"> <a class="sb-brand" href="/UI"> <i b-yjl2sbey1b class="bi bi-file-earmark-text"></i> <span b-yjl2sbey1b class="sb-label">Wealthmax</span> </a> <div b-yjl2sbey1b class="d-flex flex-column flex-grow-1"> <a class="sb-link " href="/UI/Dashboard/Index"> <i b-yjl2sbey1b class="bi bi-speedometer2"></i><span b-yjl2sbey1b class="sb-label">Dashboard</span> </a> <a class="sb-link " href="/UI/Templates/Index"> <i b-yjl2sbey1b class="bi bi-collection"></i><span b-yjl2sbey1b class="sb-label">Templates</span> </a> <a class="sb-link " href="/UI/Tokens/Index"> <i b-yjl2sbey1b class="bi bi-braces"></i><span b-yjl2sbey1b class="sb-label">Token Registry</span> </a> <a class="sb-link " href="/UI/Clients/Index"> <i b-yjl2sbey1b class="bi bi-people"></i><span b-yjl2sbey1b class="sb-label">Clients</span> </a> <a class="sb-link " href="/UI/Cases/Index"> <i b-yjl2sbey1b class="bi bi-briefcase"></i><span b-yjl2sbey1b class="sb-label">Cases</span> </a> <a class="sb-link " href="/UI/Reporting/Index"> <i b-yjl2sbey1b class="bi bi-graph-up"></i><span b-yjl2sbey1b class="sb-label">Reports</span> </a> <a class="sb-link " href="/UI/Commissions/Management"> <i b-yjl2sbey1b class="bi bi-cash-coin"></i><span b-yjl2sbey1b class="sb-label">Commissions</span> </a> <!-- User Management --> <a class="sb-link " href="/UI/Users/Index"> <i b-yjl2sbey1b class="bi bi-person-gear"></i><span b-yjl2sbey1b class="sb-label">User Management</span> </a> <!-- Fact-Find (expandable sub-menu) --> <a b-yjl2sbey1b class="sb-link " href="#ffSubmenu" role="button" data-bs-toggle="collapse" aria-expanded="false"> <i b-yjl2sbey1b class="bi bi-file-earmark-text"></i><span b-yjl2sbey1b class="sb-label">Fact-Find</span> <i b-yjl2sbey1b class="bi bi-chevron-down sb-caret sb-label"></i> </a> <div b-yjl2sbey1b class="collapse sb-submenu " id="ffSubmenu"> <a class="sb-link " href="/UI/FactFindFormatters/Index"> <i b-yjl2sbey1b class="bi bi-grid"></i><span b-yjl2sbey1b class="sb-label">Formatters</span> </a> <a class="sb-link " href="/UI/FactFindTemplates/Index"> <i b-yjl2sbey1b class="bi bi-layers"></i><span b-yjl2sbey1b class="sb-label">Templates</span> </a> <a class="sb-link " href="/UI/FactFindGenerate"> <i b-yjl2sbey1b class="bi bi-lightning-charge"></i><span b-yjl2sbey1b class="sb-label">Generate &amp; Preview</span> </a> </div> </div> <!-- Auth (pinned to bottom) --> <div b-yjl2sbey1b class="mt-auto border-top border-secondary"> <a b-yjl2sbey1b class="sb-link" href="/UI/business/login"> <i b-yjl2sbey1b class="bi bi-box-arrow-in-right"></i><span b-yjl2sbey1b class="sb-label">Business login</span> </a> </div> </nav> <main b-yjl2sbey1b class="flex-grow-1 py-4"> <div b-yjl2sbey1b class="container-fluid px-4"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css"> <style> body > nav.navbar { position: sticky; top: 0; z-index: 1030; } .dash-hero { background: linear-gradient(135deg, #212529 0%, #343a40 100%); color: #fff; } .dash-card { border: none; border-radius: 12px; transition: transform 0.15s ease, box-shadow 0.15s ease; } .dash-card:hover { transform: translateY(-3px); box-shadow: 0 8px 24px rgba(0,0,0,0.10) !important; } .dash-icon { width: 48px; height: 48px; border-radius: 12px; display: flex; align-items: center; justify-content: center; font-size: 1.4rem; } .dash-stat-value { font-size: 2rem; font-weight: 700; line-height: 1; } .dash-card-title { font-size: 0.95rem; font-weight: 600; } .dash-card-text { font-size: 0.78rem; } /* Discreet business-login link pinned to the bottom-right corner. */ .home-login-link { position: fixed; bottom: 1rem; right: 1.25rem; z-index: 1040; } </style> <!-- Hero --> <div class="dash-hero py-4 mb-4"> <div class="container text-center"> <h1 class="display-6 fw-bold mb-2">Wealthmax PM CRM</h1> <p class="lead text-white-50 mb-0" style="max-width: 640px; margin: 0 auto;"> Testing harness dashboard &mdash; system tools, integrations, and live service health at a glance. </p> </div> </div> <div class="container pb-5"> <!-- Tool / Integration cards --> <div class="row g-3 mb-4"> <!-- Tenants Created --> <div class="col-6 col-md-4 col-lg-3"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="d-flex align-items-start justify-content-between mb-2"> <div class="dash-icon bg-primary bg-opacity-10 text-primary"> <i class="bi bi-building-fill"></i> </div> <span class="badge bg-secondary bg-opacity-10 text-secondary">Sample</span> </div> <div class="dash-stat-value text-dark">12</div> <div class="dash-card-title text-dark mt-1">Tenants Created</div> <p class="dash-card-text text-muted mb-0">Total onboarded tenants in this environment.</p> </div> </div> </div> <!-- Build Logs --> <div class="col-6 col-md-4 col-lg-3"> <a href="/UI/DevLogs" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-dark bg-opacity-10 text-dark mb-2"> <i class="bi bi-terminal-fill"></i> </div> <div class="dash-card-title text-dark">Build &amp; App Logs</div> <p class="dash-card-text text-muted mb-0">Browse structured application logs by date and level.</p> </div> </div> </a> </div> <!-- Swagger --> <div class="col-6 col-md-4 col-lg-3"> <a href="/swagger" target="_blank" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="d-flex align-items-start justify-content-between mb-2"> <div class="dash-icon bg-success bg-opacity-10 text-success"> <i class="bi bi-braces"></i> </div> <i class="bi bi-box-arrow-up-right text-muted small"></i> </div> <div class="dash-card-title text-dark">Swagger / API Docs</div> <p class="dash-card-text text-muted mb-0">Explore and try the REST API via OpenAPI UI.</p> </div> </div> </a> </div> <!-- SignalR --> <div class="col-6 col-md-4 col-lg-3"> <a href="/test-signalr.html" target="_blank" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="d-flex align-items-start justify-content-between mb-2"> <div class="dash-icon bg-info bg-opacity-10 text-info"> <i class="bi bi-broadcast"></i> </div> <i class="bi bi-box-arrow-up-right text-muted small"></i> </div> <div class="dash-card-title text-dark">SignalR Hub</div> <p class="dash-card-text text-muted mb-0">Test real-time notifications over the SignalR hub.</p> </div> </div> </a> </div> <!-- iPipeline --> <div class="col-6 col-md-4 col-lg-3"> <a href="/demo/solution-builder" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-warning bg-opacity-10 text-warning mb-2"> <i class="bi bi-plug-fill"></i> </div> <div class="dash-card-title text-dark">iPipeline</div> <p class="dash-card-text text-muted mb-0">Launch the iPipeline Solution Builder integration.</p> </div> </div> </a> </div> <!-- Fetch Quotes --> <div class="col-6 col-md-4 col-lg-3"> <a href="/demo/solution-builder/events" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-danger bg-opacity-10 text-danger mb-2"> <i class="bi bi-receipt"></i> </div> <div class="dash-card-title text-dark">Fetch Quotes</div> <p class="dash-card-text text-muted mb-0">View quote-notification events returned from the pipeline.</p> </div> </div> </a> </div> <!-- CRM Dashboard --> <div class="col-6 col-md-4 col-lg-3"> <a class="text-decoration-none" href="/UI/Dashboard/Index"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-primary bg-opacity-10 text-primary mb-2"> <i class="bi bi-speedometer2"></i> </div> <div class="dash-card-title text-dark">CRM Dashboard</div> <p class="dash-card-text text-muted mb-0">Cases, clients, and commission overview metrics.</p> </div> </div> </a> </div> <!-- Clients --> <div class="col-6 col-md-4 col-lg-3"> <a class="text-decoration-none" href="/UI/Clients/Index"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-success bg-opacity-10 text-success mb-2"> <i class="bi bi-people-fill"></i> </div> <div class="dash-card-title text-dark">Clients &amp; Cases</div> <p class="dash-card-text text-muted mb-0">Manage client records and advisory cases.</p> </div> </div> </a> </div> </div> <!-- System Health --> <div id="health-card" class="card dash-card shadow-sm mb-4"> <div class="card-body p-3"> <!-- Loading state --> <div id="health-loading" class="text-center py-3"> <div class="spinner-border spinner-border-sm text-primary" role="status"> <span class="visually-hidden">Loading...</span> </div> <span class="ms-2 text-muted">Checking system health...</span> </div> <!-- Error state --> <div id="health-error" class="d-none text-center py-3"> <i class="bi bi-exclamation-triangle fs-4 text-danger d-block mb-2"></i> <p class="text-muted mb-1">Unable to reach the health endpoint.</p> <button class="btn btn-sm btn-outline-secondary" onclick="fetchHealth()"> <i class="bi bi-arrow-clockwise me-1"></i>Retry </button> </div> <!-- Success state --> <div id="health-content" class="d-none"> <div class="d-flex align-items-center mb-3"> <i class="bi bi-heart-pulse fs-4 text-primary me-2"></i> <h5 class="fw-semibold mb-0 me-auto">System Health</h5> <span id="health-status-badge" class="badge"></span> </div> <hr class="my-3"> <div class="row g-2 small"> <div class="col-sm-6"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-clock me-2"></i> <span>Checked: <span id="health-timestamp" class="text-body"></span></span> </div> </div> <div class="col-sm-6"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-speedometer2 me-2"></i> <span>Response: <span id="health-duration" class="text-body"></span></span> </div> </div> <div class="col-sm-6 d-none" id="health-db-row"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-database me-2"></i> <span>Database: <span id="health-database" class="text-body"></span></span> </div> </div> <div class="col-sm-6 d-none" id="health-build-row"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-git me-2"></i> <span>Build: <code id="health-commit"></code> <span id="health-build-date" class="text-muted"></span></span> </div> </div> </div> </div> </div> </div> <!-- Tech Stack --> <div class="text-center"> <div class="d-flex flex-wrap justify-content-center gap-3 text-muted small"> <span><i class="bi bi-gear me-1"></i>.NET 10</span> <span class="text-black-50">|</span> <span><i class="bi bi-database me-1"></i>PostgreSQL</span> <span class="text-black-50">|</span> <span><i class="bi bi-layers me-1"></i>Entity Framework Core</span> <span class="text-black-50">|</span> <span><i class="bi bi-lock me-1"></i>JWT Authentication</span> <span class="text-black-50">|</span> <span><i class="bi bi-book me-1"></i>OpenAPI / Swagger</span> </div> </div> </div> </content> </div> </main> <footer b-yjl2sbey1b class="bg-light border-top py-2 text-center text-muted small"> Wealthmax PM CRM &mdash; Policy Document Testing UI </footer> <script src="/lib/jquery/dist/jquery.min.js"></script> <script src="/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script src="/js/site.js?v=y_Ngd8W21UpuCUhEqGbUKDEqFnNfTjAfb24GhJJGUyM"></script> <script> function escapeHtml(text) { var div = document.createElement('div'); div.appendChild(document.createTextNode(text)); return div.innerHTML; } function statusBadgeClass(status) { switch ((status || '').toLowerCase()) { case 'healthy': return 'bg-success'; case 'degraded': return 'bg-warning text-dark'; default: return 'bg-danger'; } } function fetchHealth() { document.getElementById('health-loading').classList.remove('d-none'); document.getElementById('health-error').classList.add('d-none'); document.getElementById('health-content').classList.add('d-none'); fetch('/api/health') .then(function (response) { if (response.ok || response.status === 503) { return response.json(); } throw new Error('Unexpected status: ' + response.status); }) .then(function (response) { var health = response.data || response; renderHealth(health); document.getElementById('health-loading').classList.add('d-none'); document.getElementById('health-content').classList.remove('d-none'); }) .catch(function () { document.getElementById('health-loading').classList.add('d-none'); document.getElementById('health-error').classList.remove('d-none'); }); } function renderHealth(data) { var badge = document.getElementById('health-status-badge'); badge.textContent = data.status; badge.className = 'badge ' + statusBadgeClass(data.status); document.getElementById('health-timestamp').textContent = new Date(data.timestamp).toLocaleString(); document.getElementById('health-duration').textContent = data.totalDurationMs + ' ms'; var dbRow = document.getElementById('health-db-row'); if (data.databaseName || data.databaseProvider) { var parts = []; if (data.databaseName) parts.push(data.databaseName); if (data.databaseProvider) parts.push(data.databaseProvider); document.getElementById('health-database').textContent = parts.join(' on '); dbRow.classList.remove('d-none'); } else { dbRow.classList.add('d-none'); } var buildRow = document.getElementById('health-build-row'); if (data.commitHash || data.lastBuildDate) { document.getElementById('health-commit').textContent = data.commitHash || ''; document.getElementById('health-build-date').textContent = data.lastBuildDate ? '(' + new Date(data.lastBuildDate).toLocaleDateString() + ')' : ''; buildRow.classList.remove('d-none'); } else { buildRow.classList.add('d-none'); } } fetchHealth(); </script> </body> </html>
2026-07-30 19:53:45.670 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /lib/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.min.js responded 200 in 1.0652 ms
2026-07-30 19:53:45.669 +00:00 [INF] [HTTP] [U:-] [E:-] [C:-] HTTP GET /lib/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.min.js 200
Req: [no body] Res: /** * @license * Unobtrusive validation support library for jQuery and jQuery Validate * Copyright (c) .NET Foundation. All rights reserved. * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. * @version v4.0.0 */ !function(a){"function"==typeof define&&define.amd?define("jquery.validate.unobtrusive",["jquery-validation"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery-validation")):jQuery.validator.unobtrusive=a(jQuery)}(function(s){var a,o=s.validator,d="unobtrusiveValidation";function l(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function u(a){return a.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function n(a){return a.substr(0,a.lastIndexOf(".")+1)}function m(a,e){return a=0===a.indexOf("*.")?a.replace("*.",e):a}function f(a){var e=s(this),n="__jquery_unobtrusive_validation_form_reset";if(!e.data(n)){e.data(n,!0);try{e.data("validator").resetForm()}finally{e.removeData(n)}e.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),e.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function p(n){function a(a,e){(a=r[a])&&s.isFunction(a)&&a.apply(n,e)}var e=s(n),t=e.data(d),i=s.proxy(f,n),r=o.unobtrusive.options||{};return t||(t={options:{errorClass:r.errorClass||"input-validation-error",errorElement:r.errorElement||"span",errorPlacement:function(){!function(a,e){var e=s(this).find("[data-valmsg-for='"+u(e[0].name)+"']"),n=(n=e.attr("data-valmsg-replace"))?!1!==s.parseJSON(n):null;e.removeClass("field-validation-valid").addClass("field-validation-error"),a.data("unobtrusiveContainer",e),n?(e.empty(),a.removeClass("input-validation-error").appendTo(e)):a.hide()}.apply(n,arguments),a("errorPlacement",arguments)},invalidHandler:function(){!function(a,e){var n=s(this).find("[data-valmsg-summary=true]"),t=n.find("ul");t&&t.length&&e.errorList.length&&(t.empty(),n.addClass("validation-summary-errors").removeClass("validation-summary-valid"),s.each(e.errorList,function(){s("<li />").html(this.message).appendTo(t)}))}.apply(n,arguments),a("invalidHandler",arguments)},messages:{},rules:{},success:function(){!function(a){var e,n=a.data("unobtrusiveContainer");n&&(e=(e=n.attr("data-valmsg-replace"))?s.parseJSON(e):null,n.addClass("field-validation-valid").removeClass("field-validation-error"),a.removeData("unobtrusiveContainer"),e&&n.empty())}.apply(n,arguments),a("success",arguments)}},attachValidation:function(){e.off("reset."+d,i).on("reset."+d,i).validate(this.options)},validate:function(){return e.validate(),e.valid()}},e.data(d,t)),t}return o.unobtrusive={adapters:[],parseElement:function(t,a){var e,i,r,o=s(t),d=o.parents("form")[0];d&&((e=p(d)).options.rules[t.name]=i={},e.options.messages[t.name]=r={},s.each(this.adapters,function(){var a="data-val-"+this.name,e=o.attr(a),n={};void 0!==e&&(a+="-",s.each(this.params,function(){n[this]=o.attr(a+this)}),this.adapt({element:t,form:d,message:e,params:n,rules:i,messages:r}))}),s.extend(i,{__dummy__:!0}),a||e.attachValidation())},parse:function(a){var a=s(a),e=a.parents().addBack().filter("form").add(a.find("form")).has("[data-val=true]");a.find("[data-val=true]").each(function(){o.unobtrusive.parseElement(this,!0)}),e.each(function(){var a=p(this);a&&a.attachValidation()})}},(a=o.unobtrusive.adapters).add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},a.addBool=function(e,n){return this.add(e,function(a){l(a,n||e,!0)})},a.addMinMax=function(a,t,i,r,e,n){return this.add(a,[e||"min",n||"max"],function(a){var e=a.params.min,n=a.params.max;e&&n?l(a,r,[e,n]):e?l(a,t,e):n&&l(a,i,n)})},a.addSingleVal=function(e,n,t){return this.add(e,[n||"val"],function(a){l(a,t||e,a.params[n])})},o.addMethod("__dummy__",function(a,e,n){return!0}),o.addMethod("regex",function(a,e,n){return!!this.optional(e)||(e=new RegExp(n).exec(a))&&0===e.index&&e[0].length===a.length}),o.addMethod("nonalphamin",function(a,e,n){var t;return t=n?(t=a.match(/\W/g))&&t.length>=n:t}),o.methods.extension?(a.addSingleVal("accept","mimtype"),a.addSingleVal("extension","extension")):a.addSingleVal("extension","extension","accept"),a.addSingleVal("regex","pattern"),a.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),a.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),a.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),a.add("equalto",["other"],function(a){var e=n(a.element.name),e=m(a.params.other,e);l(a,"equalTo",s(a.form).find(":input").filter("[name='"+u(e)+"']")[0])}),a.add("required",function(a){"INPUT"===a.element.tagName.toUpperCase()&&"CHECKBOX"===a.element.type.toUpperCase()||l(a,"required",!0)}),a.add("remote",["url","type","additionalfields"],function(t){var i={url:t.params.url,type:t.params.type||"GET",data:{}},r=n(t.element.name);s.each((t.params.additionalfields||t.element.name).replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g),function(a,e){var n=m(e,r);i.data[n]=function(){var a=s(t.form).find(":input").filter("[name='"+u(n)+"']");return a.is(":checkbox")?a.filter(":checked").val()||a.filter(":hidden").val()||"":a.is(":radio")?a.filter(":checked").val()||"":a.val()}}),l(t,"remote",i)}),a.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&l(a,"minlength",a.params.min),a.params.nonalphamin&&l(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&l(a,"regex",a.params.regex)}),a.add("fileextensions",["extensions"],function(a){l(a,"extension",a.params.extensions)}),s(function(){o.unobtrusive.parse(document)}),o.unobtrusive});
2026-07-30 19:53:17.740 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /lib/jquery-validation/dist/jquery.validate.min.js responded 200 in 1.1381 ms
2026-07-30 19:53:17.739 +00:00 [INF] [HTTP] [U:-] [E:-] [C:-] HTTP GET /lib/jquery-validation/dist/jquery.validate.min.js 200
Req: [no body] Res: /*! jQuery Validation Plugin - v1.21.0 - 7/17/2024 * https://jqueryvalidation.org/ * Copyright (c) 2024 Jörn Zaefferer; Licensed MIT */ !function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.fn,{validate:function(b){if(!this.length)return void(b&&b.debug&&window.console&&console.warn("Nothing selected, can't validate, returning nothing."));var c=a.data(this[0],"validator");return c?c:(this.attr("novalidate","novalidate"),c=new a.validator(b,this[0]),a.data(this[0],"validator",c),c.settings.onsubmit&&(this.on("click.validate",":submit",function(b){c.submitButton=b.currentTarget,a(this).hasClass("cancel")&&(c.cancelSubmit=!0),void 0!==a(this).attr("formnovalidate")&&(c.cancelSubmit=!0)}),this.on("submit.validate",function(b){function d(){var d,e;return c.submitButton&&(c.settings.submitHandler||c.formSubmitted)&&(d=a("<input type='hidden'/>").attr("name",c.submitButton.name).val(a(c.submitButton).val()).appendTo(c.currentForm)),!(c.settings.submitHandler&&!c.settings.debug)||(e=c.settings.submitHandler.call(c,c.currentForm,b),d&&d.remove(),void 0!==e&&e)}return c.settings.debug&&b.preventDefault(),c.cancelSubmit?(c.cancelSubmit=!1,d()):c.form()?c.pendingRequest?(c.formSubmitted=!0,!1):d():(c.focusInvalid(),!1)})),c)},valid:function(){var b,c,d;return a(this[0]).is("form")?b=this.validate().form():(d=[],b=!0,c=a(this[0].form).validate(),this.each(function(){b=c.element(this)&&b,b||(d=d.concat(c.errorList))}),c.errorList=d),b},rules:function(b,c){var d,e,f,g,h,i,j=this[0],k="undefined"!=typeof this.attr("contenteditable")&&"false"!==this.attr("contenteditable");if(null!=j&&(!j.form&&k&&(j.form=this.closest("form")[0],j.name=this.attr("name")),null!=j.form)){if(b)switch(d=a.data(j.form,"validator").settings,e=d.rules,f=a.validator.staticRules(j),b){case"add":a.extend(f,a.validator.normalizeRule(c)),delete f.messages,e[j.name]=f,c.messages&&(d.messages[j.name]=a.extend(d.messages[j.name],c.messages));break;case"remove":return c?(i={},a.each(c.split(/\s/),function(a,b){i[b]=f[b],delete f[b]}),i):(delete e[j.name],f)}return g=a.validator.normalizeRules(a.extend({},a.validator.classRules(j),a.validator.attributeRules(j),a.validator.dataRules(j),a.validator.staticRules(j)),j),g.required&&(h=g.required,delete g.required,g=a.extend({required:h},g)),g.remote&&(h=g.remote,delete g.remote,g=a.extend(g,{remote:h})),g}}});var b=function(a){return a.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")};a.extend(a.expr.pseudos||a.expr[":"],{blank:function(c){return!b(""+a(c).val())},filled:function(c){var d=a(c).val();return null!==d&&!!b(""+d)},unchecked:function(b){return!a(b).prop("checked")}}),a.validator=function(b,c){this.settings=a.extend(!0,{},a.validator.defaults,b),this.currentForm=c,this.init()},a.validator.format=function(b,c){return 1===arguments.length?function(){var c=a.makeArray(arguments);return c.unshift(b),a.validator.format.apply(this,c)}:void 0===c?b:(arguments.length>2&&c.constructor!==Array&&(c=a.makeArray(arguments).slice(1)),c.constructor!==Array&&(c=[c]),a.each(c,function(a,c){b=b.replace(new RegExp("\\{"+a+"\\}","g"),function(){return c})}),b)},a.extend(a.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",pendingClass:"pending",validClass:"valid",errorElement:"label",focusCleanup:!1,focusInvalid:!0,errorContainer:a([]),errorLabelContainer:a([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,customElements:[],onfocusin:function(a){this.lastActive=a,this.settings.focusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(a)))},onfocusout:function(a){this.checkable(a)||!(a.name in this.submitted)&&this.optional(a)||this.element(a)},onkeyup:function(b,c){var d=[16,17,18,20,35,36,37,38,39,40,45,144,225];9===c.which&&""===this.elementValue(b)||a.inArray(c.keyCode,d)!==-1||(b.name in this.submitted||b.name in this.invalid)&&this.element(b)},onclick:function(a){a.name in this.submitted?this.element(a):a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).addClass(c).removeClass(d):a(b).addClass(c).removeClass(d)},unhighlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).removeClass(c).addClass(d):a(b).removeClass(c).addClass(d)}},setDefaults:function(b){a.extend(a.validator.defaults,b)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",equalTo:"Please enter the same value again.",maxlength:a.validator.format("Please enter no more than {0} characters."),minlength:a.validator.format("Please enter at least {0} characters."),rangelength:a.validator.format("Please enter a value between {0} and {1} characters long."),range:a.validator.format("Please enter a value between {0} and {1}."),max:a.validator.format("Please enter a value less than or equal to {0}."),min:a.validator.format("Please enter a value greater than or equal to {0}."),step:a.validator.format("Please enter a multiple of {0}.")},autoCreateRanges:!1,prototype:{init:function(){function b(b){var c="undefined"!=typeof a(this).attr("contenteditable")&&"false"!==a(this).attr("contenteditable");if(!this.form&&c&&(this.form=a(this).closest("form")[0],this.name=a(this).attr("name")),d===this.form){var e=a.data(this.form,"validator"),f="on"+b.type.replace(/^validate/,""),g=e.settings;g[f]&&!a(this).is(g.ignore)&&g[f].call(e,this,b)}}this.labelContainer=a(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||a(this.currentForm),this.containers=a(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var c,d=this.currentForm,e=this.groups={};a.each(this.settings.groups,function(b,c){"string"==typeof c&&(c=c.split(/\s/)),a.each(c,function(a,c){e[c]=b})}),c=this.settings.rules,a.each(c,function(b,d){c[b]=a.validator.normalizeRule(d)});var f=[":text","[type='password']","[type='file']","select","textarea","[type='number']","[type='search']","[type='tel']","[type='url']","[type='email']","[type='datetime']","[type='date']","[type='month']","[type='week']","[type='time']","[type='datetime-local']","[type='range']","[type='color']","[type='radio']","[type='checkbox']","[contenteditable]","[type='button']"],g=["select","option","[type='radio']","[type='checkbox']"];a(this.currentForm).on("focusin.validate focusout.validate keyup.validate",f.concat(this.settings.customElements).join(", "),b).on("click.validate",g.concat(this.settings.customElements).join(", "),b),this.settings.invalidHandler&&a(this.currentForm).on("invalid-form.validate",this.settings.invalidHandler)},form:function(){return this.checkForm(),a.extend(this.submitted,this.errorMap),this.invalid=a.extend({},this.errorMap),this.valid()||a(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(b){var c,d,e=this.clean(b),f=this.validationTargetFor(e),g=this,h=!0;return void 0===f?delete this.invalid[e.name]:(this.prepareElement(f),this.currentElements=a(f),d=this.groups[f.name],d&&a.each(this.groups,function(a,b){b===d&&a!==f.name&&(e=g.validationTargetFor(g.clean(g.findByName(a))),e&&e.name in g.invalid&&(g.currentElements.push(e),h=g.check(e)&&h))}),c=this.check(f)!==!1,h=h&&c,c?this.invalid[f.name]=!1:this.invalid[f.name]=!0,this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),a(b).attr("aria-invalid",!c)),h},showErrors:function(b){if(b){var c=this;a.extend(this.errorMap,b),this.errorList=a.map(this.errorMap,function(a,b){return{message:a,element:c.findByName(b)[0]}}),this.successList=a.grep(this.successList,function(a){return!(a.name in b)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){a.fn.resetForm&&a(this.currentForm).resetForm(),this.invalid={},this.submitted={},this.prepareForm(),this.hideErrors();var b=this.elements().removeData("previousValue").removeAttr("aria-invalid");this.resetElements(b)},resetElements:function(a){var b;if(this.settings.unhighlight)for(b=0;a[b];b++)this.settings.unhighlight.call(this,a[b],this.settings.errorClass,""),this.findByName(a[b].name).removeClass(this.settings.validClass);else a.removeClass(this.settings.errorClass).removeClass(this.settings.validClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b,c=0;for(b in a)void 0!==a[b]&&null!==a[b]&&a[b]!==!1&&c++;return c},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(a){a.not(this.containers).text(""),this.addWrapper(a).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{a(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").trigger("focus").trigger("focusin")}catch(b){}},findLastActive:function(){var b=this.lastActive;return b&&1===a.grep(this.errorList,function(a){return a.element.name===b.name}).length&&b},elements:function(){var b=this,c={},d=["input","select","textarea","[contenteditable]"];return a(this.currentForm).find(d.concat(this.settings.customElements).join(", ")).not(":submit, :reset, :image, :disabled").not(this.settings.ignore).filter(function(){var d=this.name||a(this).attr("name"),e="undefined"!=typeof a(this).attr("contenteditable")&&"false"!==a(this).attr("contenteditable");return!d&&b.settings.debug&&window.console&&console.error("%o has no name assigned",this),e&&(this.form=a(this).closest("form")[0],this.name=d),this.form===b.currentForm&&(!(d in c||!b.objectLength(a(this).rules()))&&(c[d]=!0,!0))})},clean:function(b){return a(b)[0]},errors:function(){var b=this.settings.errorClass.split(" ").join(".");return a(this.settings.errorElement+"."+b,this.errorContext)},resetInternals:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=a([]),this.toHide=a([])},reset:function(){this.resetInternals(),this.currentElements=a([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(a){this.reset(),this.toHide=this.errorsFor(a)},elementValue:function(b){var c,d,e=a(b),f=b.type,g="undefined"!=typeof e.attr("contenteditable")&&"false"!==e.attr("contenteditable");return"radio"===f||"checkbox"===f?this.findByName(b.name).filter(":checked").val():"number"===f&&"undefined"!=typeof b.validity?b.validity.badInput?"NaN":e.val():(c=g?e.text():e.val(),"file"===f?"C:\\fakepath\\"===c.substr(0,12)?c.substr(12):(d=c.lastIndexOf("/"),d>=0?c.substr(d+1):(d=c.lastIndexOf("\\"),d>=0?c.substr(d+1):c)):"string"==typeof c?c.replace(/\r/g,""):c)},check:function(b){b=this.validationTargetFor(this.clean(b));var c,d,e,f,g=a(b).rules(),h=a.map(g,function(a,b){return b}).length,i=!1,j=this.elementValue(b);this.abortRequest(b),"function"==typeof g.normalizer?f=g.normalizer:"function"==typeof this.settings.normalizer&&(f=this.settings.normalizer),f&&(j=f.call(b,j),delete g.normalizer);for(d in g){e={method:d,parameters:g[d]};try{if(c=a.validator.methods[d].call(this,j,b,e.parameters),"dependency-mismatch"===c&&1===h){i=!0;continue}if(i=!1,"pending"===c)return void(this.toHide=this.toHide.not(this.errorsFor(b)));if(!c)return this.formatAndAdd(b,e),!1}catch(k){throw this.settings.debug&&window.console&&console.log("Exception occurred when checking element "+b.id+", check the '"+e.method+"' method.",k),k instanceof TypeError&&(k.message+=". Exception occurred when checking element "+b.id+", check the '"+e.method+"' method."),k}}if(!i)return this.objectLength(g)&&this.successList.push(b),!0},customDataMessage:function(b,c){return a(b).data("msg"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase())||a(b).data("msg")},customMessage:function(a,b){var c=this.settings.messages[a];return c&&(c.constructor===String?c:c[b])},findDefined:function(){for(var a=0;a<arguments.length;a++)if(void 0!==arguments[a])return arguments[a]},defaultMessage:function(b,c){"string"==typeof c&&(c={method:c});var d=this.findDefined(this.customMessage(b.name,c.method),this.customDataMessage(b,c.method),!this.settings.ignoreTitle&&b.title||void 0,a.validator.messages[c.method],"<strong>Warning: No message defined for "+b.name+"</strong>"),e=/\$?\{(\d+)\}/g;return"function"==typeof d?d=d.call(this,c.parameters,b):e.test(d)&&(d=a.validator.format(d.replace(e,"{$1}"),c.parameters)),d},formatAndAdd:function(a,b){var c=this.defaultMessage(a,b);this.errorList.push({message:c,element:a,method:b.method}),this.errorMap[a.name]=c,this.submitted[a.name]=c},addWrapper:function(a){return this.settings.wrapper&&(a=a.add(a.parent(this.settings.wrapper))),a},defaultShowErrors:function(){var a,b,c;for(a=0;this.errorList[a];a++)c=this.errorList[a],this.settings.highlight&&this.settings.highlight.call(this,c.element,this.settings.errorClass,this.settings.validClass),this.showLabel(c.element,c.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight)for(a=0,b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return a(this.errorList).map(function(){return this.element})},showLabel:function(b,c){var d,e,f,g,h=this.errorsFor(b),i=this.idOrName(b),j=a(b).attr("aria-describedby");h.length?(h.removeClass(this.settings.validClass).addClass(this.settings.errorClass),this.settings&&this.settings.escapeHtml?h.text(c||""):h.html(c||"")):(h=a("<"+this.settings.errorElement+">").attr("id",i+"-error").addClass(this.settings.errorClass),this.settings&&this.settings.escapeHtml?h.text(c||""):h.html(c||""),d=h,this.settings.wrapper&&(d=h.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.length?this.labelContainer.append(d):this.settings.errorPlacement?this.settings.errorPlacement.call(this,d,a(b)):d.insertAfter(b),h.is("label")?h.attr("for",i):0===h.parents("label[for='"+this.escapeCssMeta(i)+"']").length&&(f=h.attr("id"),j?j.match(new RegExp("\\b"+this.escapeCssMeta(f)+"\\b"))||(j+=" "+f):j=f,a(b).attr("aria-describedby",j),e=this.groups[b.name],e&&(g=this,a.each(g.groups,function(b,c){c===e&&a("[name='"+g.escapeCssMeta(b)+"']",g.currentForm).attr("aria-describedby",h.attr("id"))})))),!c&&this.settings.success&&(h.text(""),"string"==typeof this.settings.success?h.addClass(this.settings.success):this.settings.success(h,b)),this.toShow=this.toShow.add(h)},errorsFor:function(b){var c=this.escapeCssMeta(this.idOrName(b)),d=a(b).attr("aria-describedby"),e="label[for='"+c+"'], label[for='"+c+"'] *";return d&&(e=e+", #"+this.escapeCssMeta(d).replace(/\s+/g,", #")),this.errors().filter(e)},escapeCssMeta:function(a){return void 0===a?"":a.replace(/([\\!"#$%&'()*+,./:;<=>?@\[\]^`{|}~])/g,"\\$1")},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},validationTargetFor:function(b){return this.checkable(b)&&(b=this.findByName(b.name)),a(b).not(this.settings.ignore)[0]},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(b){return a(this.currentForm).find("[name='"+this.escapeCssMeta(b)+"']")},getLength:function(b,c){switch(c.nodeName.toLowerCase()){case"select":return a("option:selected",c).length;case"input":if(this.checkable(c))return this.findByName(c.name).filter(":checked").length}return b.length},depend:function(a,b){return!this.dependTypes[typeof a]||this.dependTypes[typeof a](a,b)},dependTypes:{"boolean":function(a){return a},string:function(b,c){return!!a(b,c.form).length},"function":function(a,b){return a(b)}},optional:function(b){var c=this.elementValue(b);return!a.validator.methods.required.call(this,c,b)&&"dependency-mismatch"},elementAjaxPort:function(a){return"validate"+a.name},startRequest:function(b){this.pending[b.name]||(this.pendingRequest++,a(b).addClass(this.settings.pendingClass),this.pending[b.name]=!0)},stopRequest:function(b,c){this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],a(b).removeClass(this.settings.pendingClass),c&&0===this.pendingRequest&&this.formSubmitted&&this.form()&&0===this.pendingRequest?(a(this.currentForm).trigger("submit"),this.submitButton&&a("input:hidden[name='"+this.submitButton.name+"']",this.currentForm).remove(),this.formSubmitted=!1):!c&&0===this.pendingRequest&&this.formSubmitted&&(a(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},abortRequest:function(b){var c;this.pending[b.name]&&(c=this.elementAjaxPort(b),a.ajaxAbort(c),this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],a(b).removeClass(this.settings.pendingClass))},previousValue:function(b,c){return c="string"==typeof c&&c||"remote",a.data(b,"previousValue")||a.data(b,"previousValue",{old:null,valid:!0,message:this.defaultMessage(b,{method:c})})},destroy:function(){this.resetForm(),a(this.currentForm).off(".validate").removeData("validator").find(".validate-equalTo-blur").off(".validate-equalTo").removeClass("validate-equalTo-blur").find(".validate-lessThan-blur").off(".validate-lessThan").removeClass("validate-lessThan-blur").find(".validate-lessThanEqual-blur").off(".validate-lessThanEqual").removeClass("validate-lessThanEqual-blur").find(".validate-greaterThanEqual-blur").off(".validate-greaterThanEqual").removeClass("validate-greaterThanEqual-blur").find(".validate-greaterThan-blur").off(".validate-greaterThan").removeClass("validate-greaterThan-blur")}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(b,c){b.constructor===String?this.classRuleSettings[b]=c:a.extend(this.classRuleSettings,b)},classRules:function(b){var c={},d=a(b).attr("class");return d&&a.each(d.split(" "),function(){this in a.validator.classRuleSettings&&a.extend(c,a.validator.classRuleSettings[this])}),c},normalizeAttributeRule:function(a,b,c,d){/min|max|step/.test(c)&&(null===b||/number|range|text/.test(b))&&(d=Number(d),isNaN(d)&&(d=void 0)),d||0===d?a[c]=d:b===c&&"range"!==b&&(a["date"===b?"dateISO":c]=!0)},attributeRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)"required"===c?(d=b.getAttribute(c),""===d&&(d=!0),d=!!d):d=f.attr(c),this.normalizeAttributeRule(e,g,c,d);return e.maxlength&&/-1|2147483647|524288/.test(e.maxlength)&&delete e.maxlength,e},dataRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)d=f.data("rule"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase()),""===d&&(d=!0),this.normalizeAttributeRule(e,g,c,d);return e},staticRules:function(b){var c={},d=a.data(b.form,"validator");return d.settings.rules&&(c=a.validator.normalizeRule(d.settings.rules[b.name])||{}),c},normalizeRules:function(b,c){return a.each(b,function(d,e){if(e===!1)return void delete b[d];if(e.param||e.depends){var f=!0;switch(typeof e.depends){case"string":f=!!a(e.depends,c.form).length;break;case"function":f=e.depends.call(c,c)}f?b[d]=void 0===e.param||e.param:(a.data(c.form,"validator").resetElements(a(c)),delete b[d])}}),a.each(b,function(a,d){b[a]="function"==typeof d&&"normalizer"!==a?d(c):d}),a.each(["minlength","maxlength"],function(){b[this]&&(b[this]=Number(b[this]))}),a.each(["rangelength","range"],function(){var a;b[this]&&(Array.isArray(b[this])?b[this]=[Number(b[this][0]),Number(b[this][1])]:"string"==typeof b[this]&&(a=b[this].replace(/[\[\]]/g,"").split(/[\s,]+/),b[this]=[Number(a[0]),Number(a[1])]))}),a.validator.autoCreateRanges&&(null!=b.min&&null!=b.max&&(b.range=[b.min,b.max],delete b.min,delete b.max),null!=b.minlength&&null!=b.maxlength&&(b.rangelength=[b.minlength,b.maxlength],delete b.minlength,delete b.maxlength)),b},normalizeRule:function(b){if("string"==typeof b){var c={};a.each(b.split(/\s/),function(){c[this]=!0}),b=c}return b},addMethod:function(b,c,d){a.validator.methods[b]=c,a.validator.messages[b]=void 0!==d?d:a.validator.messages[b],c.length<3&&a.validator.addClassRules(b,a.validator.normalizeRule(b))},methods:{required:function(b,c,d){if(!this.depend(d,c))return"dependency-mismatch";if("select"===c.nodeName.toLowerCase()){var e=a(c).val();return e&&e.length>0}return this.checkable(c)?this.getLength(b,c)>0:void 0!==b&&null!==b&&b.length>0},email:function(a,b){return this.optional(b)||/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(a)},url:function(a,b){return this.optional(b)||/^(?:(?:(?:https?|ftp):)?\/\/)(?:(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})+(?::(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?))(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(a)},date:function(){var a=!1;return function(b,c){return a||(a=!0,this.settings.debug&&window.console&&console.warn("The `date` method is deprecated and will be removed in version '2.0.0'.\nPlease don't use it, since it relies on the Date constructor, which\nbehaves very differently across browsers and locales. Use `dateISO`\ninstead or one of the locale specific methods in `localizations/`\nand `additional-methods.js`.")),this.optional(c)||!/Invalid|NaN/.test(new Date(b).toString())}}(),dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(a)},number:function(a,b){return this.optional(b)||/^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:-?\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},minlength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d>=c},maxlength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d<=c},rangelength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d>=c[0]&&d<=c[1]},min:function(a,b,c){return this.optional(b)||a>=c},max:function(a,b,c){return this.optional(b)||a<=c},range:function(a,b,c){return this.optional(b)||a>=c[0]&&a<=c[1]},step:function(b,c,d){var e,f=a(c).attr("type"),g="Step attribute on input type "+f+" is not supported.",h=["text","number","range"],i=new RegExp("\\b"+f+"\\b"),j=f&&!i.test(h.join()),k=function(a){var b=(""+a).match(/(?:\.(\d+))?$/);return b&&b[1]?b[1].length:0},l=function(a){return Math.round(a*Math.pow(10,e))},m=!0;if(j)throw new Error(g);return e=k(d),(k(b)>e||l(b)%l(d)!==0)&&(m=!1),this.optional(c)||m},equalTo:function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(".validate-equalTo-blur").length&&e.addClass("validate-equalTo-blur").on("blur.validate-equalTo",function(){a(c).valid()}),b===e.val()},remote:function(b,c,d,e){if(this.optional(c))return"dependency-mismatch";e="string"==typeof e&&e||"remote";var f,g,h,i=this.previousValue(c,e);return this.settings.messages[c.name]||(this.settings.messages[c.name]={}),i.originalMessage=i.originalMessage||this.settings.messages[c.name][e],this.settings.messages[c.name][e]=i.message,d="string"==typeof d&&{url:d}||d,h=a.param(a.extend({data:b},d.data)),null!==i.valid&&i.old===h?i.valid:(i.old=h,i.valid=null,f=this,this.startRequest(c),g={},g[c.name]=b,a.ajax(a.extend(!0,{mode:"abort",port:this.elementAjaxPort(c),dataType:"json",data:g,context:f.currentForm,success:function(a){var d,g,h,j=a===!0||"true"===a;f.settings.messages[c.name][e]=i.originalMessage,j?(h=f.formSubmitted,f.toHide=f.errorsFor(c),f.formSubmitted=h,f.successList.push(c),f.invalid[c.name]=!1,f.showErrors()):(d={},g=a||f.defaultMessage(c,{method:e,parameters:b}),d[c.name]=i.message=g,f.invalid[c.name]=!0,f.showErrors(d)),i.valid=j,f.stopRequest(c,j)}},d)),"pending")}}});var c,d={};return a.ajaxPrefilter?a.ajaxPrefilter(function(b,c,e){var f=b.port;"abort"===b.mode&&(a.ajaxAbort(f),d[f]=e)}):(c=a.ajax,a.ajax=function(b){var e=("mode"in b?b:a.ajaxSettings).mode,f=("port"in b?b:a.ajaxSettings).port;return"abort"===e?(a.ajaxAbort(f),d[f]=c.apply(this,arguments),d[f]):c.apply(this,arguments)}),a.ajaxAbort=function(a){d[a]&&(d[a].abort(),delete d[a])},a});
2026-07-30 19:51:03.031 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /UI/business/forgot-password responded 200 in 4.8117 ms
2026-07-30 19:51:03.031 +00:00 [INF] [HTTP] [U:-] [E:-] [C:1f374825acee] HTTP GET /UI/business/forgot-password 200
Req: [no body] Res: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Forgot Password - Wealthmax</title> <link rel="stylesheet" href="/lib/bootstrap/dist/css/bootstrap.min.css" /> <link rel="stylesheet" href="/css/site.css?v=xQHUTQJdpYJFKIjDlFCI1X8KDqtO5qaSSeJFSoCP3pA" /> <style> html, body { height: 100%; } body { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 100vh; background-color: #f5f7fa; } .login-wrapper { display: flex; flex-direction: column; align-items: center; width: 100%; padding: 1.5rem; } .brand-logo { margin-bottom: 1.75rem; text-align: center; } .brand-logo span { font-size: 1.4rem; font-weight: 700; color: #1a1a2e; letter-spacing: -0.5px; } .brand-logo small { display: block; font-size: 0.7rem; color: #6c757d; font-weight: 500; text-transform: uppercase; letter-spacing: 1px; margin-top: 2px; } </style> </head> <body> <div class="login-wrapper"> <div class="brand-logo"> <span>Wealthmax</span> <small>PM CRM</small> </div> <div class="card shadow-sm" style="width: 100%; max-width: 400px;"> <div class="card-body p-4"> <h4 class="card-title mb-1 fw-semibold">Forgot Password</h4> <p class="text-muted small mb-4">Enter your email and we'll send you a reset link.</p> <div id="error-msg" class="alert alert-danger d-none" role="alert"></div> <div id="success-msg" class="alert alert-success d-none" role="alert"></div> <form id="forgot-form" novalidate> <div class="mb-4"> <label for="email" class="form-label">Email</label> <input type="email" class="form-control" id="email" placeholder="you@example.com" required autofocus /> </div> <button type="submit" class="btn btn-primary w-100" id="submit-btn"> Send Reset Link </button> </form> <div class="mt-3 text-center"> <a href="/UI/business/login" class="small text-decoration-none">← Back to Sign In</a> </div> </div> </div> <script> document.getElementById('forgot-form').addEventListener('submit', async (e) => { e.preventDefault(); const email = document.getElementById('email').value.trim(); const errorMsg = document.getElementById('error-msg'); const successMsg = document.getElementById('success-msg'); const submitBtn = document.getElementById('submit-btn'); const form = document.getElementById('forgot-form'); errorMsg.classList.add('d-none'); errorMsg.textContent = ''; successMsg.classList.add('d-none'); submitBtn.disabled = true; submitBtn.textContent = 'Sending…'; try { const res = await fetch('/api/auth/forgot-password', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email }) }); if (res.ok || res.status === 404) { // Absorb 404 to prevent user enumeration — always show generic message form.classList.add('d-none'); successMsg.textContent = 'If an account with that email exists, a reset link has been sent. Check your inbox.'; successMsg.classList.remove('d-none'); } else { const result = await res.json().catch(() => ({})); const message = result.message || result.error?.message || 'Something went wrong. Please try again.'; errorMsg.textContent = message; errorMsg.classList.remove('d-none'); submitBtn.disabled = false; submitBtn.textContent = 'Send Reset Link'; } } catch { errorMsg.textContent = 'Unable to reach the server. Please try again.'; errorMsg.classList.remove('d-none'); submitBtn.disabled = false; submitBtn.textContent = 'Send Reset Link'; } }); </script> </div> <script src="/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> </body> </html>
2026-07-30 19:36:10.705 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /sitemaps.xml responded 401 in 0.5698 ms
2026-07-30 19:02:34.214 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /UI responded 200 in 5.1355 ms
2026-07-30 19:02:34.214 +00:00 [INF] [HTTP] [U:-] [E:-] [C:ab35972c6841] HTTP GET /UI 200
Req: [no body] Res: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Home — WM Policy Documents</title> <link rel="stylesheet" href="/lib/bootstrap/dist/css/bootstrap.min.css" /> <link rel="stylesheet" href="/css/site.css?v=xQHUTQJdpYJFKIjDlFCI1X8KDqtO5qaSSeJFSoCP3pA" /> <link rel="stylesheet" href="/css/commissions.css?v=ZRMXSlMSxdLsHmJCZzq1LopWaopJSbVXKu57gvUJG3w" /> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css" /> <style> /* ---- Hover-expand left sidebar -------------------------------------- */ :root { --sb-collapsed: 64px; --sb-expanded: 240px; } body.has-sidebar { /* Reserve space for the collapsed rail; the expanded panel overlays the content on hover, so the content never shifts. */ padding-left: var(--sb-collapsed); } .app-sidebar { position: fixed; top: 0; left: 0; height: 100vh; width: var(--sb-collapsed); overflow-x: hidden; overflow-y: auto; display: flex; flex-direction: column; z-index: 1045; transition: width 0.2s ease; } .app-sidebar:hover, .app-sidebar:focus-within { width: var(--sb-expanded); box-shadow: 0 0 24px rgba(0,0,0,0.35); } .app-sidebar .sb-label { white-space: nowrap; opacity: 0; transition: opacity 0.15s ease; } .app-sidebar:hover .sb-label, .app-sidebar:focus-within .sb-label { opacity: 1; } .sb-link { display: flex; align-items: center; gap: 0.85rem; padding: 0.65rem 0; color: rgba(255,255,255,0.75); text-decoration: none; border-left: 3px solid transparent; } .sb-link:hover { color: #fff; background: rgba(255,255,255,0.08); } .sb-link.active { color: #fff; background: rgba(255,255,255,0.12); border-left-color: #0d6efd; } .sb-link > i:first-child { min-width: var(--sb-collapsed); text-align: center; font-size: 1.15rem; flex-shrink: 0; } .sb-brand { display: flex; align-items: center; gap: 0.85rem; padding: 0.9rem 0; color: #fff; text-decoration: none; font-weight: 700; } .sb-brand > i:first-child { min-width: var(--sb-collapsed); text-align: center; font-size: 1.3rem; flex-shrink: 0; } /* Sub-menu (Fact-Find) */ .sb-submenu .sb-link { font-size: 0.9rem; padding-left: 0; } .sb-submenu .sb-link > i:first-child { font-size: 1rem; } .sb-caret { margin-left: auto; margin-right: 0.9rem; transition: transform 0.15s ease; } .sb-link[aria-expanded="true"] .sb-caret { transform: rotate(180deg); } </style> </head> <body class="d-flex flex-column min-vh-100 has-sidebar"> <nav b-yjl2sbey1b class="app-sidebar navbar-dark bg-dark shadow-sm"> <a class="sb-brand" href="/UI"> <i b-yjl2sbey1b class="bi bi-file-earmark-text"></i> <span b-yjl2sbey1b class="sb-label">Wealthmax</span> </a> <div b-yjl2sbey1b class="d-flex flex-column flex-grow-1"> <a class="sb-link " href="/UI/Dashboard/Index"> <i b-yjl2sbey1b class="bi bi-speedometer2"></i><span b-yjl2sbey1b class="sb-label">Dashboard</span> </a> <a class="sb-link " href="/UI/Templates/Index"> <i b-yjl2sbey1b class="bi bi-collection"></i><span b-yjl2sbey1b class="sb-label">Templates</span> </a> <a class="sb-link " href="/UI/Tokens/Index"> <i b-yjl2sbey1b class="bi bi-braces"></i><span b-yjl2sbey1b class="sb-label">Token Registry</span> </a> <a class="sb-link " href="/UI/Clients/Index"> <i b-yjl2sbey1b class="bi bi-people"></i><span b-yjl2sbey1b class="sb-label">Clients</span> </a> <a class="sb-link " href="/UI/Cases/Index"> <i b-yjl2sbey1b class="bi bi-briefcase"></i><span b-yjl2sbey1b class="sb-label">Cases</span> </a> <a class="sb-link " href="/UI/Reporting/Index"> <i b-yjl2sbey1b class="bi bi-graph-up"></i><span b-yjl2sbey1b class="sb-label">Reports</span> </a> <a class="sb-link " href="/UI/Commissions/Management"> <i b-yjl2sbey1b class="bi bi-cash-coin"></i><span b-yjl2sbey1b class="sb-label">Commissions</span> </a> <!-- User Management --> <a class="sb-link " href="/UI/Users/Index"> <i b-yjl2sbey1b class="bi bi-person-gear"></i><span b-yjl2sbey1b class="sb-label">User Management</span> </a> <!-- Fact-Find (expandable sub-menu) --> <a b-yjl2sbey1b class="sb-link " href="#ffSubmenu" role="button" data-bs-toggle="collapse" aria-expanded="false"> <i b-yjl2sbey1b class="bi bi-file-earmark-text"></i><span b-yjl2sbey1b class="sb-label">Fact-Find</span> <i b-yjl2sbey1b class="bi bi-chevron-down sb-caret sb-label"></i> </a> <div b-yjl2sbey1b class="collapse sb-submenu " id="ffSubmenu"> <a class="sb-link " href="/UI/FactFindFormatters/Index"> <i b-yjl2sbey1b class="bi bi-grid"></i><span b-yjl2sbey1b class="sb-label">Formatters</span> </a> <a class="sb-link " href="/UI/FactFindTemplates/Index"> <i b-yjl2sbey1b class="bi bi-layers"></i><span b-yjl2sbey1b class="sb-label">Templates</span> </a> <a class="sb-link " href="/UI/FactFindGenerate"> <i b-yjl2sbey1b class="bi bi-lightning-charge"></i><span b-yjl2sbey1b class="sb-label">Generate &amp; Preview</span> </a> </div> </div> <!-- Auth (pinned to bottom) --> <div b-yjl2sbey1b class="mt-auto border-top border-secondary"> <a b-yjl2sbey1b class="sb-link" href="/UI/business/login"> <i b-yjl2sbey1b class="bi bi-box-arrow-in-right"></i><span b-yjl2sbey1b class="sb-label">Business login</span> </a> </div> </nav> <main b-yjl2sbey1b class="flex-grow-1 py-4"> <div b-yjl2sbey1b class="container-fluid px-4"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css"> <style> body > nav.navbar { position: sticky; top: 0; z-index: 1030; } .dash-hero { background: linear-gradient(135deg, #212529 0%, #343a40 100%); color: #fff; } .dash-card { border: none; border-radius: 12px; transition: transform 0.15s ease, box-shadow 0.15s ease; } .dash-card:hover { transform: translateY(-3px); box-shadow: 0 8px 24px rgba(0,0,0,0.10) !important; } .dash-icon { width: 48px; height: 48px; border-radius: 12px; display: flex; align-items: center; justify-content: center; font-size: 1.4rem; } .dash-stat-value { font-size: 2rem; font-weight: 700; line-height: 1; } .dash-card-title { font-size: 0.95rem; font-weight: 600; } .dash-card-text { font-size: 0.78rem; } /* Discreet business-login link pinned to the bottom-right corner. */ .home-login-link { position: fixed; bottom: 1rem; right: 1.25rem; z-index: 1040; } </style> <!-- Hero --> <div class="dash-hero py-4 mb-4"> <div class="container text-center"> <h1 class="display-6 fw-bold mb-2">Wealthmax PM CRM</h1> <p class="lead text-white-50 mb-0" style="max-width: 640px; margin: 0 auto;"> Testing harness dashboard &mdash; system tools, integrations, and live service health at a glance. </p> </div> </div> <div class="container pb-5"> <!-- Tool / Integration cards --> <div class="row g-3 mb-4"> <!-- Tenants Created --> <div class="col-6 col-md-4 col-lg-3"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="d-flex align-items-start justify-content-between mb-2"> <div class="dash-icon bg-primary bg-opacity-10 text-primary"> <i class="bi bi-building-fill"></i> </div> <span class="badge bg-secondary bg-opacity-10 text-secondary">Sample</span> </div> <div class="dash-stat-value text-dark">12</div> <div class="dash-card-title text-dark mt-1">Tenants Created</div> <p class="dash-card-text text-muted mb-0">Total onboarded tenants in this environment.</p> </div> </div> </div> <!-- Build Logs --> <div class="col-6 col-md-4 col-lg-3"> <a href="/UI/DevLogs" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-dark bg-opacity-10 text-dark mb-2"> <i class="bi bi-terminal-fill"></i> </div> <div class="dash-card-title text-dark">Build &amp; App Logs</div> <p class="dash-card-text text-muted mb-0">Browse structured application logs by date and level.</p> </div> </div> </a> </div> <!-- Swagger --> <div class="col-6 col-md-4 col-lg-3"> <a href="/swagger" target="_blank" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="d-flex align-items-start justify-content-between mb-2"> <div class="dash-icon bg-success bg-opacity-10 text-success"> <i class="bi bi-braces"></i> </div> <i class="bi bi-box-arrow-up-right text-muted small"></i> </div> <div class="dash-card-title text-dark">Swagger / API Docs</div> <p class="dash-card-text text-muted mb-0">Explore and try the REST API via OpenAPI UI.</p> </div> </div> </a> </div> <!-- SignalR --> <div class="col-6 col-md-4 col-lg-3"> <a href="/test-signalr.html" target="_blank" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="d-flex align-items-start justify-content-between mb-2"> <div class="dash-icon bg-info bg-opacity-10 text-info"> <i class="bi bi-broadcast"></i> </div> <i class="bi bi-box-arrow-up-right text-muted small"></i> </div> <div class="dash-card-title text-dark">SignalR Hub</div> <p class="dash-card-text text-muted mb-0">Test real-time notifications over the SignalR hub.</p> </div> </div> </a> </div> <!-- iPipeline --> <div class="col-6 col-md-4 col-lg-3"> <a href="/demo/solution-builder" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-warning bg-opacity-10 text-warning mb-2"> <i class="bi bi-plug-fill"></i> </div> <div class="dash-card-title text-dark">iPipeline</div> <p class="dash-card-text text-muted mb-0">Launch the iPipeline Solution Builder integration.</p> </div> </div> </a> </div> <!-- Fetch Quotes --> <div class="col-6 col-md-4 col-lg-3"> <a href="/demo/solution-builder/events" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-danger bg-opacity-10 text-danger mb-2"> <i class="bi bi-receipt"></i> </div> <div class="dash-card-title text-dark">Fetch Quotes</div> <p class="dash-card-text text-muted mb-0">View quote-notification events returned from the pipeline.</p> </div> </div> </a> </div> <!-- CRM Dashboard --> <div class="col-6 col-md-4 col-lg-3"> <a class="text-decoration-none" href="/UI/Dashboard/Index"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-primary bg-opacity-10 text-primary mb-2"> <i class="bi bi-speedometer2"></i> </div> <div class="dash-card-title text-dark">CRM Dashboard</div> <p class="dash-card-text text-muted mb-0">Cases, clients, and commission overview metrics.</p> </div> </div> </a> </div> <!-- Clients --> <div class="col-6 col-md-4 col-lg-3"> <a class="text-decoration-none" href="/UI/Clients/Index"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-success bg-opacity-10 text-success mb-2"> <i class="bi bi-people-fill"></i> </div> <div class="dash-card-title text-dark">Clients &amp; Cases</div> <p class="dash-card-text text-muted mb-0">Manage client records and advisory cases.</p> </div> </div> </a> </div> </div> <!-- System Health --> <div id="health-card" class="card dash-card shadow-sm mb-4"> <div class="card-body p-3"> <!-- Loading state --> <div id="health-loading" class="text-center py-3"> <div class="spinner-border spinner-border-sm text-primary" role="status"> <span class="visually-hidden">Loading...</span> </div> <span class="ms-2 text-muted">Checking system health...</span> </div> <!-- Error state --> <div id="health-error" class="d-none text-center py-3"> <i class="bi bi-exclamation-triangle fs-4 text-danger d-block mb-2"></i> <p class="text-muted mb-1">Unable to reach the health endpoint.</p> <button class="btn btn-sm btn-outline-secondary" onclick="fetchHealth()"> <i class="bi bi-arrow-clockwise me-1"></i>Retry </button> </div> <!-- Success state --> <div id="health-content" class="d-none"> <div class="d-flex align-items-center mb-3"> <i class="bi bi-heart-pulse fs-4 text-primary me-2"></i> <h5 class="fw-semibold mb-0 me-auto">System Health</h5> <span id="health-status-badge" class="badge"></span> </div> <hr class="my-3"> <div class="row g-2 small"> <div class="col-sm-6"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-clock me-2"></i> <span>Checked: <span id="health-timestamp" class="text-body"></span></span> </div> </div> <div class="col-sm-6"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-speedometer2 me-2"></i> <span>Response: <span id="health-duration" class="text-body"></span></span> </div> </div> <div class="col-sm-6 d-none" id="health-db-row"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-database me-2"></i> <span>Database: <span id="health-database" class="text-body"></span></span> </div> </div> <div class="col-sm-6 d-none" id="health-build-row"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-git me-2"></i> <span>Build: <code id="health-commit"></code> <span id="health-build-date" class="text-muted"></span></span> </div> </div> </div> </div> </div> </div> <!-- Tech Stack --> <div class="text-center"> <div class="d-flex flex-wrap justify-content-center gap-3 text-muted small"> <span><i class="bi bi-gear me-1"></i>.NET 10</span> <span class="text-black-50">|</span> <span><i class="bi bi-database me-1"></i>PostgreSQL</span> <span class="text-black-50">|</span> <span><i class="bi bi-layers me-1"></i>Entity Framework Core</span> <span class="text-black-50">|</span> <span><i class="bi bi-lock me-1"></i>JWT Authentication</span> <span class="text-black-50">|</span> <span><i class="bi bi-book me-1"></i>OpenAPI / Swagger</span> </div> </div> </div> </content> </div> </main> <footer b-yjl2sbey1b class="bg-light border-top py-2 text-center text-muted small"> Wealthmax PM CRM &mdash; Policy Document Testing UI </footer> <script src="/lib/jquery/dist/jquery.min.js"></script> <script src="/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script src="/js/site.js?v=y_Ngd8W21UpuCUhEqGbUKDEqFnNfTjAfb24GhJJGUyM"></script> <script> function escapeHtml(text) { var div = document.createElement('div'); div.appendChild(document.createTextNode(text)); return div.innerHTML; } function statusBadgeClass(status) { switch ((status || '').toLowerCase()) { case 'healthy': return 'bg-success'; case 'degraded': return 'bg-warning text-dark'; default: return 'bg-danger'; } } function fetchHealth() { document.getElementById('health-loading').classList.remove('d-none'); document.getElementById('health-error').classList.add('d-none'); document.getElementById('health-content').classList.add('d-none'); fetch('/api/health') .then(function (response) { if (response.ok || response.status === 503) { return response.json(); } throw new Error('Unexpected status: ' + response.status); }) .then(function (response) { var health = response.data || response; renderHealth(health); document.getElementById('health-loading').classList.add('d-none'); document.getElementById('health-content').classList.remove('d-none'); }) .catch(function () { document.getElementById('health-loading').classList.add('d-none'); document.getElementById('health-error').classList.remove('d-none'); }); } function renderHealth(data) { var badge = document.getElementById('health-status-badge'); badge.textContent = data.status; badge.className = 'badge ' + statusBadgeClass(data.status); document.getElementById('health-timestamp').textContent = new Date(data.timestamp).toLocaleString(); document.getElementById('health-duration').textContent = data.totalDurationMs + ' ms'; var dbRow = document.getElementById('health-db-row'); if (data.databaseName || data.databaseProvider) { var parts = []; if (data.databaseName) parts.push(data.databaseName); if (data.databaseProvider) parts.push(data.databaseProvider); document.getElementById('health-database').textContent = parts.join(' on '); dbRow.classList.remove('d-none'); } else { dbRow.classList.add('d-none'); } var buildRow = document.getElementById('health-build-row'); if (data.commitHash || data.lastBuildDate) { document.getElementById('health-commit').textContent = data.commitHash || ''; document.getElementById('health-build-date').textContent = data.lastBuildDate ? '(' + new Date(data.lastBuildDate).toLocaleDateString() + ')' : ''; buildRow.classList.remove('d-none'); } else { buildRow.classList.add('d-none'); } } fetchHealth(); </script> </body> </html>
2026-07-30 19:02:34.045 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /UI/business/login responded 200 in 2.3954 ms
2026-07-30 19:02:34.044 +00:00 [INF] [HTTP] [U:-] [E:-] [C:574aa384226f] HTTP GET /UI/business/login 200
Req: [no body] Res: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Sign In - Wealthmax</title> <link rel="stylesheet" href="/lib/bootstrap/dist/css/bootstrap.min.css" /> <link rel="stylesheet" href="/css/site.css?v=xQHUTQJdpYJFKIjDlFCI1X8KDqtO5qaSSeJFSoCP3pA" /> <style> html, body { height: 100%; } body { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 100vh; background-color: #f5f7fa; } .login-wrapper { display: flex; flex-direction: column; align-items: center; width: 100%; padding: 1.5rem; } .brand-logo { margin-bottom: 1.75rem; text-align: center; } .brand-logo span { font-size: 1.4rem; font-weight: 700; color: #1a1a2e; letter-spacing: -0.5px; } .brand-logo small { display: block; font-size: 0.7rem; color: #6c757d; font-weight: 500; text-transform: uppercase; letter-spacing: 1px; margin-top: 2px; } </style> </head> <body> <div class="login-wrapper"> <div class="brand-logo"> <span>Wealthmax</span> <small>PM CRM</small> </div> <div class="card shadow-sm" style="width: 100%; max-width: 400px;"> <div class="card-body p-4"> <h4 class="card-title mb-1 fw-semibold">Sign In</h4> <p class="text-muted small mb-4">Enter your credentials to access the portal.</p> <form method="post" novalidate action="/UI/business/login"> <div class="mb-3"> <label class="form-label" for="Email">Email</label> <input class="form-control" placeholder="you@example.com" autofocus type="email" data-val="true" data-val-email="The Email field is not a valid e-mail address." data-val-required="The Email field is required." id="Email" name="Email" value="" /> <span class="text-danger small field-validation-valid" data-valmsg-for="Email" data-valmsg-replace="true"></span> </div> <div class="mb-4"> <label class="form-label" for="Password">Password</label> <input type="password" class="form-control" placeholder="••••••••" data-val="true" data-val-minlength="The field Password must be a string or array type with a minimum length of &#x27;8&#x27;." data-val-minlength-min="8" data-val-required="The Password field is required." id="Password" name="Password" /> <span class="text-danger small field-validation-valid" data-valmsg-for="Password" data-valmsg-replace="true"></span> </div> <button type="submit" class="btn btn-primary w-100">Sign In</button> <input name="__RequestVerificationToken" type="hidden" value="CfDJ8PkPKADDi0hCi7-PdeVDOzocG5Tu5tvSa24j6RUj_YCX8EyaTH_UmImkZIVnTqf8c9SzLPOBPor0YifH1KhmqzrDsOcdA-400JKqymhV8ROiqTTa7Xdup4fSv3yiybOoV4JAV-TArVmRUDuUw2buRxw" /></form> <div class="mt-3 text-center"> <a href="/UI/business/forgot-password" class="small text-decoration-none">Forgot password?</a> </div> </div> </div> </div> <script src="/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script src="/lib/jquery/dist/jquery.min.js"></script> <script src="/lib/jquery-validation/dist/jquery.validate.min.js"></script> <script src="/lib/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.min.js"></script> </body> </html>
2026-07-30 19:02:33.952 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /UI/Dashboard/Index responded 302 in 0.5266 ms
2026-07-30 19:02:33.951 +00:00 [INF] [HTTP] [U:-] [E:-] [C:02bd6e02cac1] HTTP GET /UI/Dashboard/Index 302
Req: [no body] Res: [empty response]
2026-07-30 19:01:54.547 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /UI/business/login responded 200 in 1.4145 ms
2026-07-30 19:01:54.547 +00:00 [INF] [HTTP] [U:-] [E:-] [C:43f2ba5742fc] HTTP GET /UI/business/login 200
Req: [no body] Res: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Sign In - Wealthmax</title> <link rel="stylesheet" href="/lib/bootstrap/dist/css/bootstrap.min.css" /> <link rel="stylesheet" href="/css/site.css?v=xQHUTQJdpYJFKIjDlFCI1X8KDqtO5qaSSeJFSoCP3pA" /> <style> html, body { height: 100%; } body { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 100vh; background-color: #f5f7fa; } .login-wrapper { display: flex; flex-direction: column; align-items: center; width: 100%; padding: 1.5rem; } .brand-logo { margin-bottom: 1.75rem; text-align: center; } .brand-logo span { font-size: 1.4rem; font-weight: 700; color: #1a1a2e; letter-spacing: -0.5px; } .brand-logo small { display: block; font-size: 0.7rem; color: #6c757d; font-weight: 500; text-transform: uppercase; letter-spacing: 1px; margin-top: 2px; } </style> </head> <body> <div class="login-wrapper"> <div class="brand-logo"> <span>Wealthmax</span> <small>PM CRM</small> </div> <div class="card shadow-sm" style="width: 100%; max-width: 400px;"> <div class="card-body p-4"> <h4 class="card-title mb-1 fw-semibold">Sign In</h4> <p class="text-muted small mb-4">Enter your credentials to access the portal.</p> <form method="post" novalidate action="/UI/business/login"> <div class="mb-3"> <label class="form-label" for="Email">Email</label> <input class="form-control" placeholder="you@example.com" autofocus type="email" data-val="true" data-val-email="The Email field is not a valid e-mail address." data-val-required="The Email field is required." id="Email" name="Email" value="" /> <span class="text-danger small field-validation-valid" data-valmsg-for="Email" data-valmsg-replace="true"></span> </div> <div class="mb-4"> <label class="form-label" for="Password">Password</label> <input type="password" class="form-control" placeholder="••••••••" data-val="true" data-val-minlength="The field Password must be a string or array type with a minimum length of &#x27;8&#x27;." data-val-minlength-min="8" data-val-required="The Password field is required." id="Password" name="Password" /> <span class="text-danger small field-validation-valid" data-valmsg-for="Password" data-valmsg-replace="true"></span> </div> <button type="submit" class="btn btn-primary w-100">Sign In</button> <input name="__RequestVerificationToken" type="hidden" value="CfDJ8PkPKADDi0hCi7-PdeVDOzrnvuj4QofMS24C6CI9zzKJD-TOUj6ZlVmlxxp8NGwCJcGOZvHQr9_JcgBYvASZCWYt80gNhGbmDbv7VJMXKYEZAc0YVVC762Z_qrPL6pobDAKL6sEV2u6TjyCHFG32cB8" /></form> <div class="mt-3 text-center"> <a href="/UI/business/forgot-password" class="small text-decoration-none">Forgot password?</a> </div> </div> </div> </div> <script src="/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script src="/lib/jquery/dist/jquery.min.js"></script> <script src="/lib/jquery-validation/dist/jquery.validate.min.js"></script> <script src="/lib/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.min.js"></script> </body> </html>
2026-07-30 19:01:54.450 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /UI/FactFindTemplates/Index responded 302 in 0.7207 ms
2026-07-30 19:01:54.450 +00:00 [INF] [HTTP] [U:-] [E:-] [C:6c515fcd6b00] HTTP GET /UI/FactFindTemplates/Index 302
Req: [no body] Res: [empty response]
2026-07-30 19:01:30.729 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /UI/business/login responded 200 in 1.3684 ms
2026-07-30 19:01:30.729 +00:00 [INF] [HTTP] [U:-] [E:-] [C:5de9458eeeab] HTTP GET /UI/business/login 200
Req: [no body] Res: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Sign In - Wealthmax</title> <link rel="stylesheet" href="/lib/bootstrap/dist/css/bootstrap.min.css" /> <link rel="stylesheet" href="/css/site.css?v=xQHUTQJdpYJFKIjDlFCI1X8KDqtO5qaSSeJFSoCP3pA" /> <style> html, body { height: 100%; } body { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 100vh; background-color: #f5f7fa; } .login-wrapper { display: flex; flex-direction: column; align-items: center; width: 100%; padding: 1.5rem; } .brand-logo { margin-bottom: 1.75rem; text-align: center; } .brand-logo span { font-size: 1.4rem; font-weight: 700; color: #1a1a2e; letter-spacing: -0.5px; } .brand-logo small { display: block; font-size: 0.7rem; color: #6c757d; font-weight: 500; text-transform: uppercase; letter-spacing: 1px; margin-top: 2px; } </style> </head> <body> <div class="login-wrapper"> <div class="brand-logo"> <span>Wealthmax</span> <small>PM CRM</small> </div> <div class="card shadow-sm" style="width: 100%; max-width: 400px;"> <div class="card-body p-4"> <h4 class="card-title mb-1 fw-semibold">Sign In</h4> <p class="text-muted small mb-4">Enter your credentials to access the portal.</p> <form method="post" novalidate action="/UI/business/login"> <div class="mb-3"> <label class="form-label" for="Email">Email</label> <input class="form-control" placeholder="you@example.com" autofocus type="email" data-val="true" data-val-email="The Email field is not a valid e-mail address." data-val-required="The Email field is required." id="Email" name="Email" value="" /> <span class="text-danger small field-validation-valid" data-valmsg-for="Email" data-valmsg-replace="true"></span> </div> <div class="mb-4"> <label class="form-label" for="Password">Password</label> <input type="password" class="form-control" placeholder="••••••••" data-val="true" data-val-minlength="The field Password must be a string or array type with a minimum length of &#x27;8&#x27;." data-val-minlength-min="8" data-val-required="The Password field is required." id="Password" name="Password" /> <span class="text-danger small field-validation-valid" data-valmsg-for="Password" data-valmsg-replace="true"></span> </div> <button type="submit" class="btn btn-primary w-100">Sign In</button> <input name="__RequestVerificationToken" type="hidden" value="CfDJ8PkPKADDi0hCi7-PdeVDOzoZ6c42lfkZhiHEApfoVGbATC2Hqtjy3qDtUTfwzr9iovh5gcqMNg79egCQyA77sgPwXyJptIXxKvS2PngJa-bDJ5cFSQJEfyfdDPzU5EFhlgmM9B17SFLHTvowk7QD2qc" /></form> <div class="mt-3 text-center"> <a href="/UI/business/forgot-password" class="small text-decoration-none">Forgot password?</a> </div> </div> </div> </div> <script src="/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script src="/lib/jquery/dist/jquery.min.js"></script> <script src="/lib/jquery-validation/dist/jquery.validate.min.js"></script> <script src="/lib/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.min.js"></script> </body> </html>
2026-07-30 19:01:30.635 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /UI/Reporting/Index responded 302 in 0.4982 ms
2026-07-30 19:01:30.635 +00:00 [INF] [HTTP] [U:-] [E:-] [C:405fceae8778] HTTP GET /UI/Reporting/Index 302
Req: [no body] Res: [empty response]
2026-07-30 19:00:10.748 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /UI/business/login responded 200 in 5.2236 ms
2026-07-30 19:00:10.747 +00:00 [INF] [HTTP] [U:-] [E:-] [C:83e8dc732098] HTTP GET /UI/business/login 200
Req: [no body] Res: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Sign In - Wealthmax</title> <link rel="stylesheet" href="/lib/bootstrap/dist/css/bootstrap.min.css" /> <link rel="stylesheet" href="/css/site.css?v=xQHUTQJdpYJFKIjDlFCI1X8KDqtO5qaSSeJFSoCP3pA" /> <style> html, body { height: 100%; } body { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 100vh; background-color: #f5f7fa; } .login-wrapper { display: flex; flex-direction: column; align-items: center; width: 100%; padding: 1.5rem; } .brand-logo { margin-bottom: 1.75rem; text-align: center; } .brand-logo span { font-size: 1.4rem; font-weight: 700; color: #1a1a2e; letter-spacing: -0.5px; } .brand-logo small { display: block; font-size: 0.7rem; color: #6c757d; font-weight: 500; text-transform: uppercase; letter-spacing: 1px; margin-top: 2px; } </style> </head> <body> <div class="login-wrapper"> <div class="brand-logo"> <span>Wealthmax</span> <small>PM CRM</small> </div> <div class="card shadow-sm" style="width: 100%; max-width: 400px;"> <div class="card-body p-4"> <h4 class="card-title mb-1 fw-semibold">Sign In</h4> <p class="text-muted small mb-4">Enter your credentials to access the portal.</p> <form method="post" novalidate action="/UI/business/login"> <div class="mb-3"> <label class="form-label" for="Email">Email</label> <input class="form-control" placeholder="you@example.com" autofocus type="email" data-val="true" data-val-email="The Email field is not a valid e-mail address." data-val-required="The Email field is required." id="Email" name="Email" value="" /> <span class="text-danger small field-validation-valid" data-valmsg-for="Email" data-valmsg-replace="true"></span> </div> <div class="mb-4"> <label class="form-label" for="Password">Password</label> <input type="password" class="form-control" placeholder="••••••••" data-val="true" data-val-minlength="The field Password must be a string or array type with a minimum length of &#x27;8&#x27;." data-val-minlength-min="8" data-val-required="The Password field is required." id="Password" name="Password" /> <span class="text-danger small field-validation-valid" data-valmsg-for="Password" data-valmsg-replace="true"></span> </div> <button type="submit" class="btn btn-primary w-100">Sign In</button> <input name="__RequestVerificationToken" type="hidden" value="CfDJ8PkPKADDi0hCi7-PdeVDOzqDMZHXRDYz56DWNj2Qr2JFqq135Y3BUjSaZmzH_ZbSlztAYDNQoHbZo-PlpFV_05vuTHYR0fRM2U6-xRO96BZkQPZpLV-nkjQlkSysH0OjXe396bRk3C6LnkqljqK_7WA" /></form> <div class="mt-3 text-center"> <a href="/UI/business/forgot-password" class="small text-decoration-none">Forgot password?</a> </div> </div> </div> </div> <script src="/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script src="/lib/jquery/dist/jquery.min.js"></script> <script src="/lib/jquery-validation/dist/jquery.validate.min.js"></script> <script src="/lib/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.min.js"></script> </body> </html>
2026-07-30 19:00:10.645 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /UI/FactFindGenerate responded 302 in 0.5132 ms
2026-07-30 19:00:10.645 +00:00 [INF] [HTTP] [U:-] [E:-] [C:ddff5d1c79a4] HTTP GET /UI/FactFindGenerate 302
Req: [no body] Res: [empty response]
2026-07-30 19:00:10.236 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /UI/business/login responded 200 in 1.8532 ms
2026-07-30 19:00:10.236 +00:00 [INF] [HTTP] [U:-] [E:-] [C:ca399e7f1b9f] HTTP GET /UI/business/login 200
Req: [no body] Res: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Sign In - Wealthmax</title> <link rel="stylesheet" href="/lib/bootstrap/dist/css/bootstrap.min.css" /> <link rel="stylesheet" href="/css/site.css?v=xQHUTQJdpYJFKIjDlFCI1X8KDqtO5qaSSeJFSoCP3pA" /> <style> html, body { height: 100%; } body { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 100vh; background-color: #f5f7fa; } .login-wrapper { display: flex; flex-direction: column; align-items: center; width: 100%; padding: 1.5rem; } .brand-logo { margin-bottom: 1.75rem; text-align: center; } .brand-logo span { font-size: 1.4rem; font-weight: 700; color: #1a1a2e; letter-spacing: -0.5px; } .brand-logo small { display: block; font-size: 0.7rem; color: #6c757d; font-weight: 500; text-transform: uppercase; letter-spacing: 1px; margin-top: 2px; } </style> </head> <body> <div class="login-wrapper"> <div class="brand-logo"> <span>Wealthmax</span> <small>PM CRM</small> </div> <div class="card shadow-sm" style="width: 100%; max-width: 400px;"> <div class="card-body p-4"> <h4 class="card-title mb-1 fw-semibold">Sign In</h4> <p class="text-muted small mb-4">Enter your credentials to access the portal.</p> <form method="post" novalidate action="/UI/business/login"> <div class="mb-3"> <label class="form-label" for="Email">Email</label> <input class="form-control" placeholder="you@example.com" autofocus type="email" data-val="true" data-val-email="The Email field is not a valid e-mail address." data-val-required="The Email field is required." id="Email" name="Email" value="" /> <span class="text-danger small field-validation-valid" data-valmsg-for="Email" data-valmsg-replace="true"></span> </div> <div class="mb-4"> <label class="form-label" for="Password">Password</label> <input type="password" class="form-control" placeholder="••••••••" data-val="true" data-val-minlength="The field Password must be a string or array type with a minimum length of &#x27;8&#x27;." data-val-minlength-min="8" data-val-required="The Password field is required." id="Password" name="Password" /> <span class="text-danger small field-validation-valid" data-valmsg-for="Password" data-valmsg-replace="true"></span> </div> <button type="submit" class="btn btn-primary w-100">Sign In</button> <input name="__RequestVerificationToken" type="hidden" value="CfDJ8PkPKADDi0hCi7-PdeVDOzpf8GwnhdU-YC_DS7vEP1fFWA1LUI6MvxudlMfqyEaC_myKKesi0pkG6MhoWnt1Np1Qb0NlX9d0PhBLU5NH5HeLPXtwowe_uICVKLyKRxPmb-v2npD6OQvwVKS6CXDfn68" /></form> <div class="mt-3 text-center"> <a href="/UI/business/forgot-password" class="small text-decoration-none">Forgot password?</a> </div> </div> </div> </div> <script src="/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script src="/lib/jquery/dist/jquery.min.js"></script> <script src="/lib/jquery-validation/dist/jquery.validate.min.js"></script> <script src="/lib/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.min.js"></script> </body> </html>
2026-07-30 19:00:10.144 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /UI/Cases/Index responded 302 in 0.5080 ms
2026-07-30 19:00:10.144 +00:00 [INF] [HTTP] [U:-] [E:-] [C:fcbe294e41c0] HTTP GET /UI/Cases/Index 302
Req: [no body] Res: [empty response]
2026-07-30 19:00:09.705 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /UI/business/login responded 200 in 1.4541 ms
2026-07-30 19:00:09.705 +00:00 [INF] [HTTP] [U:-] [E:-] [C:0e440951bb45] HTTP GET /UI/business/login 200
Req: [no body] Res: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Sign In - Wealthmax</title> <link rel="stylesheet" href="/lib/bootstrap/dist/css/bootstrap.min.css" /> <link rel="stylesheet" href="/css/site.css?v=xQHUTQJdpYJFKIjDlFCI1X8KDqtO5qaSSeJFSoCP3pA" /> <style> html, body { height: 100%; } body { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 100vh; background-color: #f5f7fa; } .login-wrapper { display: flex; flex-direction: column; align-items: center; width: 100%; padding: 1.5rem; } .brand-logo { margin-bottom: 1.75rem; text-align: center; } .brand-logo span { font-size: 1.4rem; font-weight: 700; color: #1a1a2e; letter-spacing: -0.5px; } .brand-logo small { display: block; font-size: 0.7rem; color: #6c757d; font-weight: 500; text-transform: uppercase; letter-spacing: 1px; margin-top: 2px; } </style> </head> <body> <div class="login-wrapper"> <div class="brand-logo"> <span>Wealthmax</span> <small>PM CRM</small> </div> <div class="card shadow-sm" style="width: 100%; max-width: 400px;"> <div class="card-body p-4"> <h4 class="card-title mb-1 fw-semibold">Sign In</h4> <p class="text-muted small mb-4">Enter your credentials to access the portal.</p> <form method="post" novalidate action="/UI/business/login"> <div class="mb-3"> <label class="form-label" for="Email">Email</label> <input class="form-control" placeholder="you@example.com" autofocus type="email" data-val="true" data-val-email="The Email field is not a valid e-mail address." data-val-required="The Email field is required." id="Email" name="Email" value="" /> <span class="text-danger small field-validation-valid" data-valmsg-for="Email" data-valmsg-replace="true"></span> </div> <div class="mb-4"> <label class="form-label" for="Password">Password</label> <input type="password" class="form-control" placeholder="••••••••" data-val="true" data-val-minlength="The field Password must be a string or array type with a minimum length of &#x27;8&#x27;." data-val-minlength-min="8" data-val-required="The Password field is required." id="Password" name="Password" /> <span class="text-danger small field-validation-valid" data-valmsg-for="Password" data-valmsg-replace="true"></span> </div> <button type="submit" class="btn btn-primary w-100">Sign In</button> <input name="__RequestVerificationToken" type="hidden" value="CfDJ8PkPKADDi0hCi7-PdeVDOzqYoYaJm9ZrM2LdI7DtUS6QvhrQN873AX1mdcLU9lvGL1Kv5eAtGweay9MEVcF3iPlHOKJdPPIK61r7zVKNIiAuqnVkS45iMl-uZdS2HW-3ViXP3DNntJgbhSdiHK9Kdu4" /></form> <div class="mt-3 text-center"> <a href="/UI/business/forgot-password" class="small text-decoration-none">Forgot password?</a> </div> </div> </div> </div> <script src="/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script src="/lib/jquery/dist/jquery.min.js"></script> <script src="/lib/jquery-validation/dist/jquery.validate.min.js"></script> <script src="/lib/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.min.js"></script> </body> </html>
2026-07-30 19:00:09.614 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /UI/Templates/Index responded 302 in 0.6270 ms
2026-07-30 19:00:09.614 +00:00 [INF] [HTTP] [U:-] [E:-] [C:994a61ace1df] HTTP GET /UI/Templates/Index 302
Req: [no body] Res: [empty response]
2026-07-30 19:00:09.511 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /robots.txt responded 401 in 0.5356 ms
2026-07-30 18:58:44.251 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /swagger/index.html responded 200 in 0.7009 ms
2026-07-30 18:58:44.129 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /swagger responded 301 in 0.0704 ms
2026-07-30 18:58:25.180 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /UI/business/login responded 200 in 1.5917 ms
2026-07-30 18:58:25.180 +00:00 [INF] [HTTP] [U:-] [E:-] [C:30e219cee61b] HTTP GET /UI/business/login 200
Req: [no body] Res: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Sign In - Wealthmax</title> <link rel="stylesheet" href="/lib/bootstrap/dist/css/bootstrap.min.css" /> <link rel="stylesheet" href="/css/site.css?v=xQHUTQJdpYJFKIjDlFCI1X8KDqtO5qaSSeJFSoCP3pA" /> <style> html, body { height: 100%; } body { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 100vh; background-color: #f5f7fa; } .login-wrapper { display: flex; flex-direction: column; align-items: center; width: 100%; padding: 1.5rem; } .brand-logo { margin-bottom: 1.75rem; text-align: center; } .brand-logo span { font-size: 1.4rem; font-weight: 700; color: #1a1a2e; letter-spacing: -0.5px; } .brand-logo small { display: block; font-size: 0.7rem; color: #6c757d; font-weight: 500; text-transform: uppercase; letter-spacing: 1px; margin-top: 2px; } </style> </head> <body> <div class="login-wrapper"> <div class="brand-logo"> <span>Wealthmax</span> <small>PM CRM</small> </div> <div class="card shadow-sm" style="width: 100%; max-width: 400px;"> <div class="card-body p-4"> <h4 class="card-title mb-1 fw-semibold">Sign In</h4> <p class="text-muted small mb-4">Enter your credentials to access the portal.</p> <form method="post" novalidate action="/UI/business/login"> <div class="mb-3"> <label class="form-label" for="Email">Email</label> <input class="form-control" placeholder="you@example.com" autofocus type="email" data-val="true" data-val-email="The Email field is not a valid e-mail address." data-val-required="The Email field is required." id="Email" name="Email" value="" /> <span class="text-danger small field-validation-valid" data-valmsg-for="Email" data-valmsg-replace="true"></span> </div> <div class="mb-4"> <label class="form-label" for="Password">Password</label> <input type="password" class="form-control" placeholder="••••••••" data-val="true" data-val-minlength="The field Password must be a string or array type with a minimum length of &#x27;8&#x27;." data-val-minlength-min="8" data-val-required="The Password field is required." id="Password" name="Password" /> <span class="text-danger small field-validation-valid" data-valmsg-for="Password" data-valmsg-replace="true"></span> </div> <button type="submit" class="btn btn-primary w-100">Sign In</button> <input name="__RequestVerificationToken" type="hidden" value="CfDJ8PkPKADDi0hCi7-PdeVDOzrmeN9mKUKvgrHaoAg5d44m6Wjxich4wSZZOuvcdD6xL7AYk6eFks0PJW6Mb0pkcFwxwI3JSAM2D7emf78Xo5xsXVZqPvaTXA5i1rq1bXgDPM4Md1yaeSpRbB3_WHD3iNQ" /></form> <div class="mt-3 text-center"> <a href="/UI/business/forgot-password" class="small text-decoration-none">Forgot password?</a> </div> </div> </div> </div> <script src="/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script src="/lib/jquery/dist/jquery.min.js"></script> <script src="/lib/jquery-validation/dist/jquery.validate.min.js"></script> <script src="/lib/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.min.js"></script> </body> </html>
2026-07-30 18:58:25.086 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /UI/Commissions/Management responded 302 in 0.5176 ms
2026-07-30 18:58:25.086 +00:00 [INF] [HTTP] [U:-] [E:-] [C:6a885dba67c5] HTTP GET /UI/Commissions/Management 302
Req: [no body] Res: [empty response]
2026-07-30 18:58:24.773 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /test-signalr.html responded 200 in 0.6924 ms
2026-07-30 18:58:24.773 +00:00 [INF] [HTTP] [U:-] [E:-] [C:-] HTTP GET /test-signalr.html 200
Req: [no body] Res: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>SignalR Notification Hub Test</title> <style> body { font-family: Arial, sans-serif; max-width: 1000px; margin: 20px auto; padding: 20px; background: #f5f5f5; } .container { background: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); margin-bottom: 20px; } h1 { color: #333; margin-top: 0; } h2 { color: #666; font-size: 18px; margin-top: 20px; border-bottom: 2px solid #e0e0e0; padding-bottom: 5px; } .input-group { margin: 15px 0; } label { display: block; margin-bottom: 5px; color: #555; font-weight: bold; } input[type="text"], input[type="password"], select { width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 4px; box-sizing: border-box; font-size: 14px; } select { background: white; cursor: pointer; } button { background: #007bff; color: white; border: none; padding: 10px 20px; border-radius: 4px; cursor: pointer; font-size: 14px; margin-right: 10px; } button:hover { background: #0056b3; } button:disabled { background: #ccc; cursor: not-allowed; } button.disconnect { background: #dc3545; } button.disconnect:hover { background: #c82333; } button.success-btn { background: #28a745; } button.success-btn:hover { background: #1e7e34; } .status { padding: 10px; border-radius: 4px; margin: 10px 0; font-weight: bold; } .status.disconnected { background: #f8d7da; color: #721c24; } .status.connected { background: #d4edda; color: #155724; } .status.connecting { background: #fff3cd; color: #856404; } #messages { max-height: 400px; overflow-y: auto; border: 1px solid #ddd; padding: 15px; background: #fafafa; border-radius: 4px; } .message { padding: 10px; margin: 5px 0; border-radius: 4px; background: white; border-left: 4px solid #007bff; } .message.error { border-left-color: #dc3545; background: #fff5f5; } .message.success { border-left-color: #28a745; background: #f0fff4; } .message.notification { background: #e7f3ff; border-left-color: #17a2b8; } .message-time { font-size: 11px; color: #999; margin-bottom: 5px; } .message-content { color: #333; } code { background: #f4f4f4; padding: 2px 6px; border-radius: 3px; font-family: 'Courier New', monospace; font-size: 13px; } .info-box { background: #e7f3ff; border-left: 4px solid #17a2b8; padding: 15px; margin: 15px 0; border-radius: 4px; } .info-box strong { color: #0c5460; } .otp-section { background: #fff3cd; border: 1px solid #ffc107; border-radius: 6px; padding: 15px; margin-top: 15px; } .otp-section h3 { margin-top: 0; color: #856404; font-size: 16px; } .badge { display: inline-block; padding: 2px 8px; border-radius: 12px; font-size: 12px; font-weight: bold; margin-left: 8px; } .badge.platform { background: #cfe2ff; color: #084298; } .badge.business { background: #d1e7dd; color: #0a3622; } .type-selector { display: flex; gap: 10px; margin: 15px 0; } .type-btn { flex: 1; padding: 12px; border: 2px solid #ddd; border-radius: 6px; background: white; color: #555; font-size: 15px; font-weight: bold; cursor: pointer; } .type-btn.active.platform { border-color: #084298; background: #cfe2ff; color: #084298; } .type-btn.active.business { border-color: #0a3622; background: #d1e7dd; color: #0a3622; } .type-btn:hover:not(.active) { border-color: #999; background: #f8f9fa; } </style> </head> <body> <div class="container"> <h1>🔔 SignalR Notification Hub Test</h1> <div class="info-box"> <strong>How to connect:</strong> <ol style="margin: 10px 0 0 0; padding-left: 20px;"> <li>Select your user type: <strong>Platform</strong> (super-admin) or <strong>Business</strong> (adviser/tenant user)</li> <li>Enter the API URL, email, and password then click <strong>Login &amp; Send OTP</strong></li> <li>Check your email for the 6-digit OTP code</li> <li>Enter the OTP and click <strong>Verify OTP &amp; Get Token</strong> — the JWT is auto-filled</li> <li>Click <strong>Connect to Hub</strong> to open the SignalR connection</li> <li>Trigger events in the system and watch real-time notifications appear below</li> </ol> </div> <h2>Step 1: Choose User Type</h2> <div class="type-selector"> <button class="type-btn platform" id="btnPlatform" onclick="setUserType('platform')"> 🏢 Platform User<br><small style="font-weight:normal">Super-admin / platform staff</small> </button> <button class="type-btn business" id="btnBusiness" onclick="setUserType('business')"> 👤 Business User<br><small style="font-weight:normal">Adviser / tenant user</small> </button> </div> <div id="userTypeBadge" style="margin-bottom:10px; font-size:14px; color:#555;"> Selected: <span id="selectedTypeLabel"><em>none</em></span> </div> <h2>Step 2: Login &amp; Get OTP</h2> <div class="input-group"> <label>API Base URL:</label> <input type="text" id="apiUrl" value="http://localhost:8099" placeholder="http://localhost:[port]"> </div> <div class="input-group"> <label>Email:</label> <input type="text" id="email" placeholder="example@wealthmax.co.uk"> </div> <div class="input-group"> <label>Password:</label> <input type="password" id="password" placeholder="Enter password"> </div> <button onclick="login()" id="loginBtn">Login &amp; Send OTP</button> <div id="otpSection" class="otp-section" style="display:none;"> <h3>📧 OTP Sent — Check Your Email</h3> <p style="margin:0 0 10px 0; color:#856404;">Enter the 6-digit code from your email:</p> <div class="input-group" style="margin:0;"> <input type="text" id="otpCode" maxlength="6" placeholder="000000" style="letter-spacing:6px; font-size:22px; text-align:center;"> </div> <br> <button class="success-btn" onclick="verifyOtp()" id="verifyBtn">Verify OTP &amp; Get Token</button> <button onclick="login()" style="background:#6c757d;">Resend OTP</button> <p id="challengeInfo" style="font-size:12px; color:#999; margin-top:8px;"></p> </div> <h2>Step 3: Connect to SignalR Hub</h2> <div class="input-group"> <label>JWT Token: <span style="font-weight:normal; font-size:12px; color:#999;">(auto-filled after OTP verify, or paste manually)</span></label> <input type="text" id="token" placeholder="Paste your JWT token here (or complete login above)"> </div> <div id="status" class="status disconnected">⚫ Disconnected</div> <button id="connectBtn" onclick="connect()">Connect to Hub</button> <button id="disconnectBtn" onclick="disconnect()" class="disconnect" disabled>Disconnect</button> <button onclick="clearMessages()">Clear Messages</button> <h2>Connection Log &amp; Notifications</h2> <div id="messages"></div> </div> <script src="https://cdn.jsdelivr.net/npm/@microsoft/signalr@latest/dist/browser/signalr.min.js"></script> <script> let connection = null; let currentUserType = null; // 'platform' | 'business' let currentChallengeToken = null; const messagesDiv = document.getElementById('messages'); const statusDiv = document.getElementById('status'); const connectBtn = document.getElementById('connectBtn'); const disconnectBtn = document.getElementById('disconnectBtn'); const tokenInput = document.getElementById('token'); const otpSection = document.getElementById('otpSection'); function setUserType(type) { currentUserType = type; document.getElementById('btnPlatform').classList.toggle('active', type === 'platform'); document.getElementById('btnBusiness').classList.toggle('active', type === 'business'); document.getElementById('selectedTypeLabel').textContent = type === 'platform' ? 'Platform User (super-admin)' : 'Business User (adviser/tenant)'; otpSection.style.display = 'none'; currentChallengeToken = null; } // Default to platform on load setUserType('platform'); function addMessage(text, type = 'info') { const messageDiv = document.createElement('div'); messageDiv.className = `message ${type}`; const timeDiv = document.createElement('div'); timeDiv.className = 'message-time'; timeDiv.textContent = new Date().toLocaleTimeString(); const contentDiv = document.createElement('div'); contentDiv.className = 'message-content'; if (typeof text === 'object') { contentDiv.innerHTML = `<pre>${JSON.stringify(text, null, 2)}</pre>`; } else { contentDiv.textContent = text; } messageDiv.appendChild(timeDiv); messageDiv.appendChild(contentDiv); messagesDiv.insertBefore(messageDiv, messagesDiv.firstChild); } function updateStatus(text, state) { statusDiv.textContent = text; statusDiv.className = `status ${state}`; } async function login() { if (!currentUserType) { addMessage('❌ Please select a user type first (Platform or Business)', 'error'); return; } const apiUrl = document.getElementById('apiUrl').value.trim(); const email = document.getElementById('email').value.trim(); const password = document.getElementById('password').value; if (!apiUrl || !email || !password) { addMessage('❌ Please fill in API URL, email, and password', 'error'); return; } const endpoint = currentUserType === 'platform' ? `${apiUrl}/api/Auth/login` : `${apiUrl}/api/v1/business/auth/login`; addMessage(`🔑 [${currentUserType.toUpperCase()}] Sending login request for ${email}...`, 'info'); try { const response = await fetch(endpoint, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email, password }) }); const data = await response.json(); if (!response.ok || !data.success) { addMessage(`❌ Login failed: ${data.error?.message || data.message || 'Unknown error'}`, 'error'); return; } currentChallengeToken = data.data.challengeToken; const expiresIn = data.data.otpExpiresInSeconds ?? data.data.oTPExpiresInSeconds ?? '?'; addMessage(`✅ Login accepted — OTP sent to ${email}`, 'success'); addMessage(`⏱️ OTP expires in ${expiresIn} seconds`, 'info'); document.getElementById('challengeInfo').textContent = `Challenge token received. OTP expires in ${expiresIn}s.`; document.getElementById('otpCode').value = ''; otpSection.style.display = 'block'; document.getElementById('otpCode').focus(); } catch (error) { addMessage(`❌ Login error: ${error.message}`, 'error'); } } async function verifyOtp() { if (!currentChallengeToken) { addMessage('❌ No active login session — click "Login & Send OTP" first', 'error'); return; } const apiUrl = document.getElementById('apiUrl').value.trim(); const otp = document.getElementById('otpCode').value.trim(); if (otp.length !== 6 || !/^\d{6}$/.test(otp)) { addMessage('❌ OTP must be exactly 6 digits', 'error'); return; } const endpoint = currentUserType === 'platform' ? `${apiUrl}/api/Auth/verify-2fa` : `${apiUrl}/api/v1/business/auth/verify-2fa`; // Field name differs: platform uses "code", business uses "otp" const body = currentUserType === 'platform' ? { challengeToken: currentChallengeToken, code: otp } : { challengeToken: currentChallengeToken, otp }; addMessage(`🔐 Verifying OTP...`, 'info'); try { const response = await fetch(endpoint, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) }); const data = await response.json(); if (!response.ok || !data.success) { addMessage(`❌ OTP verification failed: ${data.error?.message || data.message || 'Invalid OTP'}`, 'error'); return; } const accessToken = data.data.accessToken; if (!accessToken) { addMessage('❌ Token not found in response', 'error'); return; } tokenInput.value = accessToken; currentChallengeToken = null; otpSection.style.display = 'none'; const userName = data.data.user?.fullName ?? data.data.user?.email ?? email; addMessage(`✅ OTP verified! Token auto-filled for ${userName}`, 'success'); addMessage(`ℹ️ Click "Connect to Hub" to open the SignalR connection`, 'info'); } catch (error) { addMessage(`❌ OTP verify error: ${error.message}`, 'error'); } } // Allow pressing Enter in OTP field to submit document.getElementById('otpCode').addEventListener('keydown', e => { if (e.key === 'Enter') verifyOtp(); }); async function connect() { const token = tokenInput.value.trim(); const apiUrl = document.getElementById('apiUrl').value.trim(); if (!token) { addMessage('❌ Please complete login first to get a JWT token', 'error'); return; } try { updateStatus('🟡 Connecting...', 'connecting'); connectBtn.disabled = true; const hubUrl = `${apiUrl}/hubs/notifications`; addMessage(`📡 Connecting to ${hubUrl}...`, 'info'); connection = new signalR.HubConnectionBuilder() .withUrl(hubUrl, { accessTokenFactory: () => token }) .withAutomaticReconnect() .configureLogging(signalR.LogLevel.Information) .build(); connection.onclose((error) => { updateStatus('⚫ Disconnected', 'disconnected'); connectBtn.disabled = false; disconnectBtn.disabled = true; if (error) addMessage(`❌ Connection closed with error: ${error}`, 'error'); else addMessage('🔌 Connection closed', 'info'); }); connection.onreconnecting((error) => { updateStatus('🟡 Reconnecting...', 'connecting'); addMessage(`🔄 Reconnecting... ${error || ''}`, 'info'); }); connection.onreconnected((connectionId) => { updateStatus('🟢 Connected', 'connected'); addMessage(`✅ Reconnected! Connection ID: ${connectionId}`, 'success'); }); connection.on("ReceiveNotification", (notification) => { addMessage({ type: 'NOTIFICATION', title: notification.title, message: notification.message, audienceType: notification.audienceType, metadata: notification.metadata }, 'notification'); }); connection.on("ReceiveNotificationCount", (count) => { addMessage(`📊 Unread notification count: ${count}`, 'info'); }); await connection.start(); updateStatus('🟢 Connected', 'connected'); connectBtn.disabled = true; disconnectBtn.disabled = false; addMessage(`✅ Successfully connected to SignalR hub!`, 'success'); addMessage(`🎯 Connection ID: ${connection.connectionId}`, 'success'); addMessage(`👂 Listening for notifications...`, 'info'); } catch (error) { updateStatus('⚫ Connection Failed', 'disconnected'); connectBtn.disabled = false; disconnectBtn.disabled = true; addMessage(`❌ Connection error: ${error.message}`, 'error'); if (error.message.includes('401')) { addMessage('🔐 Authentication failed — your token may be expired. Try logging in again.', 'error'); } } } async function disconnect() { if (connection) { try { await connection.stop(); addMessage('🔌 Disconnected from hub', 'info'); updateStatus('⚫ Disconnected', 'disconnected'); connectBtn.disabled = false; disconnectBtn.disabled = true; } catch (error) { addMessage(`❌ Disconnect error: ${error.message}`, 'error'); } } } function clearMessages() { messagesDiv.innerHTML = ''; addMessage('🗑️ Messages cleared', 'info'); } window.addEventListener('load', () => { addMessage('👋 SignalR Hub Test Client Ready', 'info'); addMessage('ℹ️ Select a user type and follow the steps above to connect', 'info'); }); </script> </body> </html>
2026-07-30 18:58:19.245 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /UI/business/login responded 200 in 1.4297 ms
2026-07-30 18:58:19.245 +00:00 [INF] [HTTP] [U:-] [E:-] [C:239a93bff65b] HTTP GET /UI/business/login 200
Req: [no body] Res: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Sign In - Wealthmax</title> <link rel="stylesheet" href="/lib/bootstrap/dist/css/bootstrap.min.css" /> <link rel="stylesheet" href="/css/site.css?v=xQHUTQJdpYJFKIjDlFCI1X8KDqtO5qaSSeJFSoCP3pA" /> <style> html, body { height: 100%; } body { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 100vh; background-color: #f5f7fa; } .login-wrapper { display: flex; flex-direction: column; align-items: center; width: 100%; padding: 1.5rem; } .brand-logo { margin-bottom: 1.75rem; text-align: center; } .brand-logo span { font-size: 1.4rem; font-weight: 700; color: #1a1a2e; letter-spacing: -0.5px; } .brand-logo small { display: block; font-size: 0.7rem; color: #6c757d; font-weight: 500; text-transform: uppercase; letter-spacing: 1px; margin-top: 2px; } </style> </head> <body> <div class="login-wrapper"> <div class="brand-logo"> <span>Wealthmax</span> <small>PM CRM</small> </div> <div class="card shadow-sm" style="width: 100%; max-width: 400px;"> <div class="card-body p-4"> <h4 class="card-title mb-1 fw-semibold">Sign In</h4> <p class="text-muted small mb-4">Enter your credentials to access the portal.</p> <form method="post" novalidate action="/UI/business/login"> <div class="mb-3"> <label class="form-label" for="Email">Email</label> <input class="form-control" placeholder="you@example.com" autofocus type="email" data-val="true" data-val-email="The Email field is not a valid e-mail address." data-val-required="The Email field is required." id="Email" name="Email" value="" /> <span class="text-danger small field-validation-valid" data-valmsg-for="Email" data-valmsg-replace="true"></span> </div> <div class="mb-4"> <label class="form-label" for="Password">Password</label> <input type="password" class="form-control" placeholder="••••••••" data-val="true" data-val-minlength="The field Password must be a string or array type with a minimum length of &#x27;8&#x27;." data-val-minlength-min="8" data-val-required="The Password field is required." id="Password" name="Password" /> <span class="text-danger small field-validation-valid" data-valmsg-for="Password" data-valmsg-replace="true"></span> </div> <button type="submit" class="btn btn-primary w-100">Sign In</button> <input name="__RequestVerificationToken" type="hidden" value="CfDJ8PkPKADDi0hCi7-PdeVDOzoGfrC3m4b8mLoE9FvcI-x2TQ_i2PYFpbzu4uZYocGkIJLk0fC9lGICm-PzQaLkxW27q_VTI46Yw_29OpFu3xL_wnlb6PstwrDtZICB56GUNotgnwByAn0A7RrCvTWfq-Y" /></form> <div class="mt-3 text-center"> <a href="/UI/business/forgot-password" class="small text-decoration-none">Forgot password?</a> </div> </div> </div> </div> <script src="/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script src="/lib/jquery/dist/jquery.min.js"></script> <script src="/lib/jquery-validation/dist/jquery.validate.min.js"></script> <script src="/lib/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.min.js"></script> </body> </html>
2026-07-30 18:58:19.133 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /UI/FactFindFormatters/Index responded 302 in 0.5180 ms
2026-07-30 18:58:19.133 +00:00 [INF] [HTTP] [U:-] [E:-] [C:2c135f7bca40] HTTP GET /UI/FactFindFormatters/Index 302
Req: [no body] Res: [empty response]
2026-07-30 18:58:05.630 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /css/commissions.css responded 200 in 0.9636 ms
2026-07-30 18:58:05.629 +00:00 [INF] [HTTP] [U:-] [E:-] [C:-] HTTP GET /css/commissions.css 200
Req: [no body] Res: /* ============================================================ Wealthmax UI — scoped clean-fintech light theme Applies under .commissions-area (Commissions module) and .wm-ui-area (all other modernised UI pages) so that the design tokens and cm-* components are shared across the app without leaking into legacy Bootstrap pages. ============================================================ */ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap'); /* ── Design tokens ─────────────────────────────────────────── */ .commissions-area, .wm-ui-area { --cm-canvas: #f4f6fb; --cm-surface: #ffffff; --cm-border: #e8ecf4; --cm-border-light: #f0f3f9; --cm-radius: 14px; --cm-radius-sm: 8px; --cm-shadow: 0 1px 3px rgba(30,41,80,.06), 0 4px 16px rgba(30,41,80,.07); --cm-shadow-hover: 0 4px 12px rgba(30,41,80,.10), 0 12px 32px rgba(30,41,80,.10); --cm-font: 'Inter', system-ui, -apple-system, sans-serif; --cm-accent: #4361ee; --cm-accent-muted: #eef1fc; --cm-text: #1a2035; --cm-text-muted: #7b8ab8; --cm-text-light: #a8b4d0; --cm-green: #10b981; --cm-green-muted: #ecfdf5; --cm-amber: #f59e0b; --cm-amber-muted: #fffbeb; --cm-red: #ef4444; --cm-red-muted: #fef2f2; --cm-blue: #3b82f6; --cm-blue-muted: #eff6ff; --cm-violet: #8b5cf6; --cm-violet-muted: #f5f3ff; --cm-slate: #64748b; --cm-slate-muted: #f8fafc; font-family: var(--cm-font); background-color: var(--cm-canvas); color: var(--cm-text); } /* ── Page background (full main viewport) ───────────────────── */ .commissions-area .page-bg-fix { background: var(--cm-canvas); } /* ── Page header ────────────────────────────────────────────── */ .cm-page-head { margin-bottom: 1.75rem; } .cm-page-head h3, .cm-page-head .cm-title { font-size: 1.5rem; font-weight: 700; color: var(--cm-text); letter-spacing: -0.02em; margin: 0; } .cm-page-head .cm-subtitle { font-size: 0.8125rem; color: var(--cm-text-muted); margin-top: 0.2rem; } /* ── Preview badge (replaces the stock warning badge) ───────── */ .cm-preview-badge { display: inline-flex; align-items: center; gap: 4px; font-size: 0.7rem; font-weight: 600; letter-spacing: 0.04em; text-transform: uppercase; padding: 2px 8px; border-radius: 20px; background: #fff8e6; color: #b45309; border: 1px solid #fcd34d; vertical-align: middle; } /* ── KPI tiles ───────────────────────────────────────────────── */ .cm-kpi { background: var(--cm-surface); border-radius: var(--cm-radius); box-shadow: var(--cm-shadow); padding: 1.25rem 1.375rem; position: relative; overflow: hidden; transition: box-shadow .18s, transform .18s; border: 1px solid var(--cm-border-light); } .cm-kpi:hover { box-shadow: var(--cm-shadow-hover); transform: translateY(-2px); } .cm-kpi::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 3px; border-radius: var(--cm-radius) var(--cm-radius) 0 0; } .cm-kpi-green::before { background: linear-gradient(90deg, #10b981, #34d399); } .cm-kpi-amber::before { background: linear-gradient(90deg, #f59e0b, #fbbf24); } .cm-kpi-blue::before { background: linear-gradient(90deg, #3b82f6, #60a5fa); } .cm-kpi-red::before { background: linear-gradient(90deg, #ef4444, #f87171); } .cm-kpi-violet::before { background: linear-gradient(90deg, #8b5cf6, #a78bfa); } .cm-kpi-slate::before { background: linear-gradient(90deg, #64748b, #94a3b8); } .cm-kpi-icon { width: 36px; height: 36px; border-radius: 10px; display: flex; align-items: center; justify-content: center; font-size: 1rem; margin-bottom: 0.875rem; flex-shrink: 0; } .cm-kpi-green .cm-kpi-icon { background: var(--cm-green-muted); color: var(--cm-green); } .cm-kpi-amber .cm-kpi-icon { background: var(--cm-amber-muted); color: var(--cm-amber); } .cm-kpi-blue .cm-kpi-icon { background: var(--cm-blue-muted); color: var(--cm-blue); } .cm-kpi-red .cm-kpi-icon { background: var(--cm-red-muted); color: var(--cm-red); } .cm-kpi-violet .cm-kpi-icon { background: var(--cm-violet-muted); color: var(--cm-violet); } .cm-kpi-slate .cm-kpi-icon { background: var(--cm-slate-muted); color: var(--cm-slate); } .cm-kpi-label { font-size: 0.7rem; font-weight: 600; letter-spacing: 0.07em; text-transform: uppercase; color: var(--cm-text-muted); margin-bottom: 0.25rem; } .cm-kpi-value { font-size: 1.625rem; font-weight: 700; color: var(--cm-text); letter-spacing: -0.025em; line-height: 1.1; } .cm-kpi-sub { font-size: 0.75rem; color: var(--cm-text-muted); margin-top: 0.3rem; } /* ── Cards ───────────────────────────────────────────────────── */ .cm-card { background: var(--cm-surface); border-radius: var(--cm-radius); box-shadow: var(--cm-shadow); border: 1px solid var(--cm-border-light); overflow: hidden; } .cm-card-header { padding: 1rem 1.375rem; border-bottom: 1px solid var(--cm-border); display: flex; align-items: center; justify-content: space-between; gap: 1rem; background: var(--cm-surface); } .cm-card-header-title { font-size: 0.875rem; font-weight: 600; color: var(--cm-text); display: flex; align-items: center; gap: 0.5rem; } .cm-card-header-title i { color: var(--cm-accent); font-size: 1rem; } .cm-card-header-meta { font-size: 0.75rem; color: var(--cm-text-muted); } .cm-card-body { padding: 1.25rem 1.375rem; } /* Nav cards (dashboard) */ .cm-nav-card { background: var(--cm-surface); border-radius: var(--cm-radius); box-shadow: var(--cm-shadow); border: 1px solid var(--cm-border-light); padding: 1.25rem 1.375rem; display: flex; align-items: flex-start; gap: 1rem; text-decoration: none; transition: box-shadow .18s, transform .18s, border-color .18s; height: 100%; } .cm-nav-card:hover { box-shadow: var(--cm-shadow-hover); transform: translateY(-3px); border-color: var(--cm-accent); text-decoration: none; } .cm-nav-card-icon { width: 44px; height: 44px; border-radius: 12px; background: var(--cm-accent-muted); color: var(--cm-accent); display: flex; align-items: center; justify-content: center; font-size: 1.25rem; flex-shrink: 0; } .cm-nav-card-title { font-size: 0.9rem; font-weight: 600; color: var(--cm-text); margin-bottom: 0.25rem; } .cm-nav-card-desc { font-size: 0.78rem; color: var(--cm-text-muted); line-height: 1.4; margin: 0; } /* ── Tables ──────────────────────────────────────────────────── */ .commissions-area .cm-table, .wm-ui-area .cm-table { margin: 0; font-size: 0.8375rem; color: var(--cm-text); border-collapse: collapse; width: 100%; } .commissions-area .cm-table thead th, .wm-ui-area .cm-table thead th { background: var(--cm-canvas); color: var(--cm-text-muted); font-size: 0.7rem; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; padding: 0.75rem 1rem; border-bottom: 1px solid var(--cm-border); border-top: none; white-space: nowrap; } .commissions-area .cm-table tbody td, .wm-ui-area .cm-table tbody td { padding: 0.75rem 1rem; border-bottom: 1px solid var(--cm-border-light); vertical-align: middle; } .commissions-area .cm-table tbody tr:last-child td, .wm-ui-area .cm-table tbody tr:last-child td { border-bottom: none; } .commissions-area .cm-table tbody tr:hover td, .wm-ui-area .cm-table tbody tr:hover td { background: var(--cm-canvas); } .commissions-area .cm-table tfoot td, .wm-ui-area .cm-table tfoot td { padding: 0.75rem 1rem; border-top: 2px solid var(--cm-border); background: var(--cm-canvas); font-weight: 600; font-size: 0.8375rem; } /* ── Badges / pills ──────────────────────────────────────────── */ .cm-pill { display: inline-flex; align-items: center; gap: 3px; font-size: 0.7rem; font-weight: 600; letter-spacing: 0.02em; padding: 2px 9px; border-radius: 20px; line-height: 1.6; white-space: nowrap; } .cm-pill-green { background: var(--cm-green-muted); color: #065f46; } .cm-pill-amber { background: var(--cm-amber-muted); color: #92400e; } .cm-pill-blue { background: var(--cm-blue-muted); color: #1e40af; } .cm-pill-red { background: var(--cm-red-muted); color: #991b1b; } .cm-pill-violet { background: var(--cm-violet-muted); color: #5b21b6; } .cm-pill-slate { background: var(--cm-slate-muted); color: #334155; border: 1px solid #e2e8f0; } .cm-pill-info { background: #eff6ff; color: #1e40af; } .cm-pill-warn { background: var(--cm-amber-muted); color: #92400e; } /* ── Buttons ─────────────────────────────────────────────────── */ .commissions-area .cm-btn-back, .wm-ui-area .cm-btn-back { font-size: 0.8125rem; font-weight: 500; padding: 0.375rem 0.875rem; border-radius: var(--cm-radius-sm); border: 1px solid var(--cm-border); background: var(--cm-surface); color: var(--cm-text-muted); text-decoration: none; display: inline-flex; align-items: center; gap: 0.35rem; transition: border-color .14s, color .14s, background .14s; } .commissions-area .cm-btn-back:hover, .wm-ui-area .cm-btn-back:hover { border-color: var(--cm-accent); color: var(--cm-accent); background: var(--cm-accent-muted); text-decoration: none; } .commissions-area .cm-btn-primary, .wm-ui-area .cm-btn-primary { font-size: 0.8125rem; font-weight: 500; padding: 0.375rem 0.875rem; border-radius: var(--cm-radius-sm); border: 1px solid var(--cm-accent); background: var(--cm-accent); color: #fff; text-decoration: none; display: inline-flex; align-items: center; gap: 0.35rem; transition: opacity .14s; } .commissions-area .cm-btn-primary:hover, .wm-ui-area .cm-btn-primary:hover { opacity: 0.88; color: #fff; text-decoration: none; } .commissions-area .cm-btn-action, .wm-ui-area .cm-btn-action { font-size: 0.75rem; font-weight: 500; padding: 0.25rem 0.625rem; border-radius: 6px; border: 1px solid var(--cm-border); background: var(--cm-surface); color: var(--cm-text-muted); text-decoration: none; display: inline-flex; align-items: center; gap: 0.25rem; transition: border-color .14s, color .14s; white-space: nowrap; } .commissions-area .cm-btn-action:hover, .wm-ui-area .cm-btn-action:hover { border-color: var(--cm-accent); color: var(--cm-accent); text-decoration: none; } .commissions-area .cm-btn-action.cm-btn-action-primary, .wm-ui-area .cm-btn-action.cm-btn-action-primary { border-color: var(--cm-accent); color: var(--cm-accent); } .commissions-area .cm-btn-action.cm-btn-action-primary:hover, .wm-ui-area .cm-btn-action.cm-btn-action-primary:hover { background: var(--cm-accent-muted); } /* ── Form controls inside tables ─────────────────────────────── */ .commissions-area .cm-table .form-control, .wm-ui-area .cm-table .form-control { font-size: 0.8125rem; border-radius: 6px; border-color: var(--cm-border); background: var(--cm-canvas); color: var(--cm-text); } .commissions-area .cm-table .input-group-text, .wm-ui-area .cm-table .input-group-text { font-size: 0.8125rem; background: var(--cm-border-light); border-color: var(--cm-border); color: var(--cm-text-muted); } /* ── Info callout ────────────────────────────────────────────── */ .cm-callout { display: flex; align-items: flex-start; gap: 0.6rem; padding: 0.875rem 1rem; border-radius: var(--cm-radius-sm); font-size: 0.8rem; line-height: 1.5; border: 1px solid; } .cm-callout-info { background: var(--cm-blue-muted); border-color: #bfdbfe; color: #1e40af; } .cm-callout-warn { background: var(--cm-amber-muted); border-color: #fde68a; color: #92400e; } .cm-callout-success { background: var(--cm-green-muted); border-color: #a7f3d0; color: #065f46; } .cm-callout-danger { background: var(--cm-red-muted); border-color: #fecaca; color: #991b1b; } .cm-callout i { margin-top: 1px; flex-shrink: 0; font-size: 0.95rem; } /* ── Audit / event stream ────────────────────────────────────── */ .cm-event-list { list-style: none; padding: 0; margin: 0; } .cm-event-item { padding: 0.875rem 0; border-bottom: 1px solid var(--cm-border-light); display: flex; flex-direction: column; gap: 0.25rem; } .cm-event-item:last-child { border-bottom: none; } .cm-event-header { display: flex; justify-content: space-between; align-items: center; gap: 1rem; flex-wrap: wrap; } .cm-event-type { font-size: 0.8375rem; font-weight: 600; color: var(--cm-text); display: flex; align-items: center; gap: 0.375rem; } .cm-event-ref { font-size: 0.7rem; font-weight: 500; padding: 1px 7px; border-radius: 4px; background: var(--cm-canvas); border: 1px solid var(--cm-border); color: var(--cm-text-muted); font-family: ui-monospace, 'Cascadia Code', monospace; } .cm-event-meta { font-size: 0.75rem; color: var(--cm-text-light); white-space: nowrap; } .cm-event-detail { font-size: 0.78rem; color: var(--cm-text-muted); } /* ── Metadata row (key/value pairs) ─────────────────────────── */ .cm-meta-row { display: flex; justify-content: space-between; align-items: center; padding: 0.45rem 0; border-bottom: 1px solid var(--cm-border-light); font-size: 0.8125rem; } .cm-meta-row:last-child { border-bottom: none; } .cm-meta-label { color: var(--cm-text-muted); } .cm-meta-value { font-weight: 600; color: var(--cm-text); } /* ── Total banner (Profile page) ────────────────────────────── */ .cm-total-banner { border-radius: var(--cm-radius-sm); padding: 0.75rem 1rem; display: flex; align-items: center; gap: 0.5rem; font-size: 0.8375rem; font-weight: 500; border: 1px solid; margin-top: 1rem; } .cm-total-banner.ok { background: var(--cm-green-muted); border-color: #a7f3d0; color: #065f46; } .cm-total-banner.err { background: var(--cm-red-muted); border-color: #fecaca; color: #991b1b; } /* ── Section divider label ───────────────────────────────────── */ .cm-section-label { font-size: 0.7rem; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; color: var(--cm-text-muted); margin-bottom: 0.75rem; padding-bottom: 0.4rem; border-bottom: 1px solid var(--cm-border-light); } /* ── Tabbed output card (shared by AllocationDetail + Lifecycle) ─ */ .commissions-area .sim-tabs-card, .wm-ui-area .sim-tabs-card { overflow: visible; } .commissions-area .sim-tabnav, .wm-ui-area .sim-tabnav { display: flex; gap: 2px; padding: 0 0.5rem; border-bottom: 1px solid var(--cm-border); background: var(--cm-canvas); border-radius: var(--cm-radius) var(--cm-radius) 0 0; flex-wrap: wrap; } .commissions-area .sim-tab, .wm-ui-area .sim-tab { position: relative; border: none; background: transparent; cursor: pointer; font-size: 0.8125rem; font-weight: 600; color: var(--cm-text-muted); padding: 0.75rem 0.95rem; display: inline-flex; align-items: center; gap: 0.4rem; border-bottom: 2px solid transparent; margin-bottom: -1px; transition: color .14s, border-color .14s; } .commissions-area .sim-tab i, .wm-ui-area .sim-tab i { font-size: 0.9rem; } .commissions-area .sim-tab:hover, .wm-ui-area .sim-tab:hover { color: var(--cm-text); } .commissions-area .sim-tab.is-active, .wm-ui-area .sim-tab.is-active { color: var(--cm-accent); border-bottom-color: var(--cm-accent); } .commissions-area .sim-tab-sub, .wm-ui-area .sim-tab-sub { font-weight: 400; color: var(--cm-text-muted); font-size: 0.75rem; } .commissions-area .sim-tab-count, .wm-ui-area .sim-tab-count { font-size: 0.68rem; font-weight: 700; line-height: 1; padding: 2px 6px; border-radius: 20px; background: var(--cm-accent-muted); color: var(--cm-accent); } .commissions-area .sim-tabpanel, .wm-ui-area .sim-tabpanel { display: none; } .commissions-area .sim-tabpanel.is-active, .wm-ui-area .sim-tabpanel.is-active { display: block; } /* Toolbar strip inside a panel (legend / heading row) */ .commissions-area .sim-panel-toolbar, .wm-ui-area .sim-panel-toolbar { padding: 0.75rem 1.375rem; border-bottom: 1px solid var(--cm-border-light); background: var(--cm-surface); } .commissions-area .sim-panel-toolbar-between, .wm-ui-area .sim-panel-toolbar-between { display: flex; align-items: center; justify-content: space-between; gap: 1rem; flex-wrap: wrap; } .commissions-area .sim-panel-heading, .wm-ui-area .sim-panel-heading { font-size: 0.8rem; font-weight: 600; color: var(--cm-text); } /* Stronger totals band in a ledger footer */ .commissions-area .cm-table.cm-table-totals tfoot td, .wm-ui-area .cm-table.cm-table-totals tfoot td { border-top: 2px solid var(--cm-accent); background: var(--cm-accent-muted); color: var(--cm-text); } .commissions-area .cm-table.cm-table-totals tfoot td:first-child, .wm-ui-area .cm-table.cm-table-totals tfoot td:first-child { text-transform: uppercase; letter-spacing: 0.05em; font-size: 0.72rem; color: var(--cm-accent); } /* Bounded event-log items so entries don't blend together */ .commissions-area .cm-event-list.cm-event-list-cards .cm-event-item, .wm-ui-area .cm-event-list.cm-event-list-cards .cm-event-item { padding: 0.75rem 0.85rem; margin-bottom: 0.55rem; border: 1px solid var(--cm-border-light); border-left-width: 3px; border-radius: var(--cm-radius-sm); background: var(--cm-surface); } .commissions-area .cm-event-list.cm-event-list-cards .cm-event-item:last-child, .wm-ui-area .cm-event-list.cm-event-list-cards .cm-event-item:last-child { margin-bottom: 0; } /* ── Chart legend ────────────────────────────────────────────── */ .cm-legend { display: flex; gap: 1.25rem; flex-wrap: wrap; font-size: 0.75rem; color: var(--cm-text-muted); align-items: center; } .cm-legend-item { display: flex; align-items: center; gap: 5px; } .cm-legend-dot { width: 10px; height: 10px; border-radius: 3px; display: inline-block; flex-shrink: 0; } .cm-legend-dot-circle { border-radius: 50%; } /* ── Form controls (wm-ui-area pages: Reporting, Templates, etc.) */ .wm-ui-area .form-control, .wm-ui-area .form-select { font-size: 0.8375rem; border-color: var(--cm-border); border-radius: var(--cm-radius-sm); background: var(--cm-surface); color: var(--cm-text); } .wm-ui-area .form-control:focus, .wm-ui-area .form-select:focus { border-color: var(--cm-accent); box-shadow: 0 0 0 3px rgba(67,97,238,.12); } .wm-ui-area .form-label { font-size: 0.8rem; font-weight: 600; color: var(--cm-text-muted); letter-spacing: 0.02em; } .wm-ui-area .form-check-input:checked { background-color: var(--cm-accent); border-color: var(--cm-accent); } /* ── Status badge override (replaces Bootstrap badge) ─────────── */ .wm-ui-area .cm-status-active { background: var(--cm-green-muted); color: #065f46; } .wm-ui-area .cm-status-inactive { background: var(--cm-slate-muted); color: #334155; border: 1px solid #e2e8f0; } .wm-ui-area .cm-status-system { background: var(--cm-blue-muted); color: #1e40af; } /* ── Pagination ─────────────────────────────────────────────── */ .wm-ui-area .pagination .page-link { font-size: 0.8rem; color: var(--cm-text-muted); border-color: var(--cm-border); background: var(--cm-surface); } .wm-ui-area .pagination .page-item.active .page-link { background: var(--cm-accent); border-color: var(--cm-accent); color: #fff; } /* ── Upload Commission Statement modal ─────────────────────────── */ .cm-upload-modal { border-radius: var(--cm-radius); border: 1px solid var(--cm-border); } .cm-upload-icon { width: 44px; height: 44px; flex-shrink: 0; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: var(--cm-accent-muted); color: var(--cm-accent); font-size: 1.1rem; } .cm-upload-template-card { display: flex; align-items: center; gap: 0.75rem; padding: 0.875rem 1rem; margin: 1rem 0; border-radius: var(--cm-radius-sm); background: var(--cm-canvas); border: 1px solid var(--cm-border-light); } .cm-upload-template-icon { width: 34px; height: 34px; flex-shrink: 0; border-radius: var(--cm-radius-sm); display: flex; align-items: center; justify-content: center; background: var(--cm-green-muted); color: var(--cm-green); } .cm-upload-template-text { flex: 1 1 auto; } .cm-upload-template-title { font-size: 0.8375rem; font-weight: 600; color: var(--cm-text); } .cm-upload-template-desc { font-size: 0.75rem; color: var(--cm-text-muted); } .cm-upload-segment { display: flex; gap: 0.5rem; margin-bottom: 1rem; } .cm-upload-segment-btn { display: inline-flex; align-items: center; gap: 0.4rem; font-size: 0.8125rem; font-weight: 600; padding: 0.4rem 1rem; border-radius: 20px; border: 1px solid var(--cm-border); background: var(--cm-surface); color: var(--cm-text-muted); transition: border-color .14s, color .14s, background .14s; } .cm-upload-segment-btn.is-active { background: var(--cm-accent); border-color: var(--cm-accent); color: #fff; } .cm-upload-segment-btn:disabled { opacity: 0.55; cursor: not-allowed; } .cm-upload-dropzone { border: 2px dashed var(--cm-border); border-radius: var(--cm-radius-sm); background: var(--cm-canvas); padding: 2rem 1rem; text-align: center; cursor: pointer; transition: border-color .14s, background .14s; margin-bottom: 1rem; } .cm-upload-dropzone.is-dragover { border-color: var(--cm-accent); background: var(--cm-accent-muted); } .cm-upload-dropzone-icon { display: inline-flex; width: 44px; height: 44px; align-items: center; justify-content: center; border-radius: 50%; background: var(--cm-accent-muted); color: var(--cm-accent); font-size: 1.25rem; margin-bottom: 0.6rem; } .cm-upload-dropzone-text { font-size: 0.8375rem; color: var(--cm-text); } .cm-upload-link { background: none; border: none; padding: 0; color: var(--cm-accent); font-weight: 600; font-size: 0.8375rem; } .cm-upload-dropzone-hint { font-size: 0.72rem; color: var(--cm-text-light); margin-top: 0.3rem; } .cm-upload-file { display: flex; align-items: flex-start; gap: 0.75rem; padding: 0.875rem 1rem; margin-bottom: 1rem; border-radius: var(--cm-radius-sm); background: var(--cm-surface); border: 1px solid var(--cm-border); } .cm-upload-file-icon { width: 34px; height: 34px; flex-shrink: 0; border-radius: var(--cm-radius-sm); display: flex; align-items: center; justify-content: center; background: var(--cm-green-muted); color: var(--cm-green); } .cm-upload-file-info { flex: 1 1 auto; min-width: 0; } .cm-upload-file-name { font-size: 0.8375rem; font-weight: 600; color: var(--cm-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .cm-upload-file-size { font-size: 0.72rem; color: var(--cm-text-muted); margin-bottom: 0.4rem; } .cm-upload-file-actions { display: flex; gap: 0.5rem; flex-shrink: 0; } .cm-upload-remove-btn:hover { border-color: var(--cm-red) !important; color: var(--cm-red) !important; background: var(--cm-red-muted) !important; } .cm-upload-progress { height: 6px; border-radius: 4px; background: var(--cm-border-light); overflow: hidden; } .cm-upload-progress-bar { height: 100%; width: 0%; background: var(--cm-accent); border-radius: 4px; transition: width .2s ease; } /* ── State panels ────────────────────────────────────────────── */ .cm-upload-alert { border-radius: var(--cm-radius-sm); border: 1px solid; padding: 1rem; margin-bottom: 1rem; } .cm-upload-alert--error { background: var(--cm-red-muted); border-color: #fecaca; } .cm-upload-alert--warning { background: var(--cm-amber-muted); border-color: #fde68a; } .cm-upload-alert--success { background: var(--cm-green-muted); border-color: #a7f3d0; display: flex; align-items: center; gap: 0.6rem; color: #065f46; font-size: 0.8375rem; font-weight: 500; } .cm-upload-alert--success i { font-size: 1.1rem; } .cm-upload-alert-header { display: flex; align-items: center; gap: 0.5rem; font-size: 0.8375rem; font-weight: 600; color: var(--cm-text); margin-bottom: 0.5rem; } .cm-upload-alert--error .cm-upload-alert-header i { color: var(--cm-red); } .cm-upload-alert--warning .cm-upload-alert-header i { color: var(--cm-amber); } .cm-upload-warning-list { margin: 0 0 0.85rem; padding-left: 1.1rem; font-size: 0.8rem; color: #92400e; } .cm-upload-warning-list li { margin-bottom: 0.2rem; } .cm-upload-review-btn { font-size: 0.8125rem; } .cm-upload-stats { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 0.6rem; margin-bottom: 0.85rem; } .cm-upload-stat { background: var(--cm-surface); border: 1px solid var(--cm-border-light); border-radius: var(--cm-radius-sm); padding: 0.6rem 0.7rem; text-align: center; } .cm-upload-stat-label { font-size: 0.65rem; color: var(--cm-text-muted); text-transform: uppercase; letter-spacing: 0.03em; margin-bottom: 0.2rem; } .cm-upload-stat-value { font-size: 1.15rem; font-weight: 700; color: var(--cm-text); margin-bottom: 0.3rem; } .cm-upload-section-label { font-size: 0.75rem; font-weight: 600; color: var(--cm-text); margin-bottom: 0.5rem; } /* ── Warning review table ────────────────────────────────────── */ .cm-upload-review { border-radius: var(--cm-radius-sm); border: 1px solid #fde68a; background: var(--cm-amber-muted); padding: 1rem; margin-bottom: 1rem; } .cm-upload-review-header { display: flex; justify-content: space-between; align-items: flex-start; gap: 1rem; flex-wrap: wrap; margin-bottom: 0.75rem; } .cm-upload-review-actions { display: flex; gap: 0.5rem; flex-shrink: 0; } .cm-upload-skipall-btn:hover { border-color: var(--cm-red) !important; color: var(--cm-red) !important; } .cm-upload-review-progress { display: flex; align-items: center; gap: 0.75rem; font-size: 0.75rem; color: #92400e; font-weight: 500; margin-bottom: 0.85rem; } .cm-upload-review-progress .cm-upload-progress { flex: 1 1 auto; background: rgba(255,255,255,.6); } .cm-upload-review .cm-table { background: var(--cm-surface); } .cm-upload-muted { color: var(--cm-text-light); } .cm-upload-subtext { font-size: 0.7rem; color: var(--cm-text-muted); margin-top: 1px; } .cm-upload-kebab-btn { width: 28px; height: 28px; display: inline-flex; align-items: center; justify-content: center; border-radius: 6px; border: 1px solid var(--cm-border); background: var(--cm-surface); color: var(--cm-text-muted); } .cm-upload-kebab-btn:hover { border-color: var(--cm-accent); color: var(--cm-accent); } .cm-upload-fix-row input.form-control { font-size: 0.8125rem; } .cm-upload-fix-inputs { display: flex; gap: 0.4rem; } .cm-upload-fix-inputs input.form-control { flex: 1 1 0; min-width: 0; } .cm-upload-fix-error { margin-top: 0.3rem; font-size: 0.75rem; color: var(--cm-red); } .cm-upload-fix-actions { display: flex; gap: 0.35rem; justify-content: flex-end; } .cm-upload-fix-actions button { width: 28px; height: 28px; display: inline-flex; align-items: center; justify-content: center; border-radius: 6px; border: 1px solid var(--cm-border); background: var(--cm-surface); color: var(--cm-text-muted); } .cm-upload-fix-confirm:hover { border-color: var(--cm-green); color: var(--cm-green); } .cm-upload-fix-cancel:hover { border-color: var(--cm-red); color: var(--cm-red); } .cm-upload-fix-trigger:hover { border-color: var(--cm-accent); color: var(--cm-accent); } .cm-upload-skip-trigger:hover { border-color: var(--cm-red); color: var(--cm-red); } .cm-upload-tips { margin-top: 0.25rem; } @media (max-width: 640px) { .cm-upload-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); } .cm-upload-review-header { flex-direction: column; } } /* ============================================================ Commission Allocation Management page (tabs, bulk-action bar, filters, expandable rows, pagination, Overwrite modal) ============================================================ */ /* ── Segment toggle (Protection / Mortgage) ─────────────────── */ .cm-segment-toggle { display: inline-flex; gap: 0.35rem; background: var(--cm-slate-muted); border: 1px solid var(--cm-border); border-radius: 999px; padding: 3px; } .cm-segment-btn { display: inline-flex; align-items: center; gap: 0.35rem; border: none; background: transparent; color: var(--cm-text-muted); font-size: 0.8125rem; font-weight: 600; padding: 0.4rem 0.9rem; border-radius: 999px; white-space: nowrap; } .cm-segment-btn.is-active { background: var(--cm-surface); color: var(--cm-accent); box-shadow: var(--cm-shadow); } .cm-segment-btn:disabled { opacity: 0.5; cursor: not-allowed; } /* ── Tab strip ───────────────────────────────────────────────── */ .cm-tabstrip { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 0.75rem; background: var(--cm-surface); border: 1px solid var(--cm-border); border-radius: var(--cm-radius-sm); padding: 0.5rem; margin-bottom: 0.75rem; } .cm-tabstrip-tabs { display: flex; flex-wrap: wrap; gap: 0.3rem; } .cm-tab-btn { display: inline-flex; align-items: center; gap: 0.4rem; border: none; background: transparent; color: var(--cm-text-muted); font-size: 0.8125rem; font-weight: 600; padding: 0.5rem 0.9rem; border-radius: var(--cm-radius-sm); } .cm-tab-btn:hover { background: var(--cm-slate-muted); color: var(--cm-text); } .cm-tab-btn.is-active { background: var(--cm-accent); color: #fff; } .cm-tab-count { display: inline-flex; align-items: center; justify-content: center; min-width: 20px; height: 20px; padding: 0 5px; border-radius: 999px; background: rgba(255,255,255,.25); font-size: 0.7rem; font-weight: 700; } .cm-tab-btn:not(.is-active) .cm-tab-count { background: var(--cm-accent-muted); color: var(--cm-accent); } /* ── Bulk-allocate action bar (Unallocated tab) ─────────────── */ .cm-bulk-bar { display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap; } .cm-bulk-bar label { font-size: 0.8125rem; font-weight: 600; color: var(--cm-text-muted); white-space: nowrap; } .cm-bulk-bar .form-control, .cm-bulk-bar .form-select { font-size: 0.8125rem; padding: 0.4rem 0.65rem; } /* ── Filter row ──────────────────────────────────────────────── */ .cm-filter-row { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; margin-bottom: 0.75rem; } .cm-filter-row .form-control, .cm-filter-row .form-select { font-size: 0.8125rem; padding: 0.45rem 0.75rem; border-color: var(--cm-border); } .cm-filter-search { position: relative; flex: 1 1 220px; max-width: 280px; } .cm-filter-search i { position: absolute; left: 0.7rem; top: 50%; transform: translateY(-50%); color: var(--cm-text-light); font-size: 0.8rem; } .cm-filter-search input { padding-left: 2rem; } .cm-reset-link { color: var(--cm-red); font-size: 0.8125rem; font-weight: 600; background: none; border: none; display: inline-flex; align-items: center; gap: 0.3rem; } /* ── Expandable line rows ───────────────────────────────────── */ .cm-expand-toggle { border: none; background: none; color: var(--cm-accent); display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px; border-radius: 6px; } .cm-expand-toggle:hover { background: var(--cm-accent-muted); } .cm-expand-toggle i { transition: transform .15s ease; } .cm-expand-toggle.is-open i { transform: rotate(90deg); } .cm-row-subtext { font-size: 0.7rem; color: var(--cm-text-muted); margin-top: 1px; } .cm-row-link { color: var(--cm-accent); font-weight: 600; text-decoration: none; } .cm-breakdown-row td { background: var(--cm-slate-muted); padding: 0 !important; } .cm-breakdown-panel { padding: 0.9rem 1.1rem 1.1rem; } .cm-breakdown-title { font-size: 0.75rem; font-weight: 700; color: var(--cm-text-muted); text-transform: uppercase; letter-spacing: .03em; margin-bottom: 0.5rem; } /* ── Pagination footer ──────────────────────────────────────── */ .cm-pagination-footer { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 0.5rem; padding: 0.85rem 1.1rem; font-size: 0.8125rem; color: var(--cm-text-muted); } .cm-pagination-pages { display: flex; align-items: center; gap: 0.25rem; } .cm-page-btn { min-width: 30px; height: 30px; padding: 0 0.4rem; border-radius: 7px; border: 1px solid var(--cm-border); background: var(--cm-surface); color: var(--cm-text-muted); font-size: 0.8125rem; font-weight: 600; } .cm-page-btn:hover:not(:disabled) { border-color: var(--cm-accent); color: var(--cm-accent); } .cm-page-btn.is-active { background: var(--cm-accent); border-color: var(--cm-accent); color: #fff; } .cm-page-btn:disabled { opacity: 0.4; cursor: not-allowed; } /* ── Overwrite modal ─────────────────────────────────────────── */ .cm-overwrite-list { border: 1px solid var(--cm-blue); border-radius: var(--cm-radius-sm); overflow: hidden; } .cm-overwrite-row { display: grid; grid-template-columns: 1fr 1.4fr 0.9fr; gap: 0.75rem; align-items: center; padding: 0.6rem 0.9rem; border-bottom: 1px dashed var(--cm-border); } .cm-overwrite-row:last-child { border-bottom: none; } .cm-overwrite-row-label { font-size: 0.8125rem; font-weight: 600; color: var(--cm-text); } .cm-overwrite-pct-input { position: relative; } .cm-overwrite-pct-input input { padding-right: 1.75rem; } .cm-overwrite-pct-input i { position: absolute; right: 0.65rem; top: 50%; transform: translateY(-50%); color: var(--cm-text-light); font-size: 0.75rem; } .cm-overwrite-total { font-size: 0.75rem; font-weight: 600; margin-top: 0.5rem; text-align: right; } .cm-overwrite-total.is-invalid { color: var(--cm-red); } .cm-overwrite-total.is-valid { color: var(--cm-green); } .cm-empty-state { text-align: center; padding: 2.5rem 1rem; color: var(--cm-text-muted); font-size: 0.8125rem; } .cm-checkbox { width: 16px; height: 16px; cursor: pointer; } @media (max-width: 992px) { .cm-overwrite-row { grid-template-columns: 1fr; gap: 0.35rem; } } /* ── Responsive tweaks ───────────────────────────────────────── */ @media (max-width: 576px) { .cm-kpi-value { font-size: 1.25rem; } .cm-page-head h3, .cm-page-head .cm-title { font-size: 1.25rem; } }
2026-07-30 18:58:05.225 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /UI/business/login responded 200 in 2.4414 ms
2026-07-30 18:58:05.225 +00:00 [INF] [HTTP] [U:-] [E:-] [C:4daa5d0e5a21] HTTP GET /UI/business/login 200
Req: [no body] Res: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Sign In - Wealthmax</title> <link rel="stylesheet" href="/lib/bootstrap/dist/css/bootstrap.min.css" /> <link rel="stylesheet" href="/css/site.css?v=xQHUTQJdpYJFKIjDlFCI1X8KDqtO5qaSSeJFSoCP3pA" /> <style> html, body { height: 100%; } body { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 100vh; background-color: #f5f7fa; } .login-wrapper { display: flex; flex-direction: column; align-items: center; width: 100%; padding: 1.5rem; } .brand-logo { margin-bottom: 1.75rem; text-align: center; } .brand-logo span { font-size: 1.4rem; font-weight: 700; color: #1a1a2e; letter-spacing: -0.5px; } .brand-logo small { display: block; font-size: 0.7rem; color: #6c757d; font-weight: 500; text-transform: uppercase; letter-spacing: 1px; margin-top: 2px; } </style> </head> <body> <div class="login-wrapper"> <div class="brand-logo"> <span>Wealthmax</span> <small>PM CRM</small> </div> <div class="card shadow-sm" style="width: 100%; max-width: 400px;"> <div class="card-body p-4"> <h4 class="card-title mb-1 fw-semibold">Sign In</h4> <p class="text-muted small mb-4">Enter your credentials to access the portal.</p> <form method="post" novalidate action="/UI/business/login"> <div class="mb-3"> <label class="form-label" for="Email">Email</label> <input class="form-control" placeholder="you@example.com" autofocus type="email" data-val="true" data-val-email="The Email field is not a valid e-mail address." data-val-required="The Email field is required." id="Email" name="Email" value="" /> <span class="text-danger small field-validation-valid" data-valmsg-for="Email" data-valmsg-replace="true"></span> </div> <div class="mb-4"> <label class="form-label" for="Password">Password</label> <input type="password" class="form-control" placeholder="••••••••" data-val="true" data-val-minlength="The field Password must be a string or array type with a minimum length of &#x27;8&#x27;." data-val-minlength-min="8" data-val-required="The Password field is required." id="Password" name="Password" /> <span class="text-danger small field-validation-valid" data-valmsg-for="Password" data-valmsg-replace="true"></span> </div> <button type="submit" class="btn btn-primary w-100">Sign In</button> <input name="__RequestVerificationToken" type="hidden" value="CfDJ8PkPKADDi0hCi7-PdeVDOzqFhJne93UgtxCHnqYYZ0YnYBcgXYCVbzMVfFzbteT0_4WdwMixsMioTnVO6WNVBvyLeidHWHWCzum7pKDr18xbz0em9nuf4_JFmZaWMPtF4bkUIzIxZM3wtKEK1KyfHUc" /></form> <div class="mt-3 text-center"> <a href="/UI/business/forgot-password" class="small text-decoration-none">Forgot password?</a> </div> </div> </div> </div> <script src="/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script src="/lib/jquery/dist/jquery.min.js"></script> <script src="/lib/jquery-validation/dist/jquery.validate.min.js"></script> <script src="/lib/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.min.js"></script> </body> </html>
2026-07-30 18:58:05.129 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /UI/Users/Index responded 302 in 0.5748 ms
2026-07-30 18:58:05.128 +00:00 [INF] [HTTP] [U:-] [E:-] [C:f77f6df73a04] HTTP GET /UI/Users/Index 302
Req: [no body] Res: [empty response]
2026-07-30 18:58:04.630 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /demo/solution-builder/events responded 200 in 2.9943 ms
2026-07-30 18:58:04.629 +00:00 [INF] [HTTP] [U:-] [E:-] [C:4bbbfc388a14] HTTP GET /demo/solution-builder/events 200
Req: [no body] Res: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <title>iPipeline Event Notifications — Wealthmax CRM</title> <style> *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: #f1f5f9; color: #1e293b; min-height: 100vh; } .demo-header { background: #fff; border-bottom: 1px solid #e2e8f0; padding: .875rem 2rem; display: flex; align-items: center; gap: .875rem; } .demo-header h1 { font-size: 1.1rem; font-weight: 700; color: #0f172a; } .badge-demo { background: #f59e0b; color: #fff; font-size: .6rem; font-weight: 800; letter-spacing: .07em; padding: .2rem .5rem; border-radius: 9999px; text-transform: uppercase; } .demo-header p { margin-left: auto; font-size: .78rem; color: #94a3b8; } .demo-body { max-width: 980px; margin: 2rem auto; padding: 0 1.5rem 3rem; display: flex; flex-direction: column; gap: 1.25rem; } .card { background: #fff; border: 1px solid #e2e8f0; border-radius: 10px; padding: 1.25rem 1.5rem; display: flex; flex-direction: column; gap: 1rem; } .section-label { font-size: .7rem; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; color: #6366f1; padding-bottom: .4rem; border-bottom: 1px solid #e2e8f0; } .field-group { display: flex; flex-direction: column; gap: .3rem; } .field-group label { font-size: .73rem; color: #64748b; font-weight: 500; } .field-group select { background: #fff; color: #0f172a; border: 1px solid #cbd5e1; border-radius: 6px; padding: .48rem .7rem; font-size: .875rem; transition: border-color .15s; width: 100%; } .field-group select:focus { outline: none; border-color: #6366f1; box-shadow: 0 0 0 3px rgba(99,102,241,.12); } .quote-btn { width: 100%; background: #6366f1; color: #fff; border: none; border-radius: 8px; padding: .78rem 1rem; font-size: .9rem; font-weight: 600; cursor: pointer; transition: background .15s, transform .1s; display: flex; align-items: center; justify-content: center; gap: .5rem; } .quote-btn:hover { background: #4f46e5; } .quote-btn:active { transform: scale(.98); } .quote-btn:disabled { background: #c7d2fe; cursor: not-allowed; } .hint { font-size: .72rem; color: #94a3b8; } .status { font-size: .8rem; color: #475569; min-height: 1.1rem; } .status.error { color: #dc2626; } /* ── Results ── */ .event-card { background: #fff; border: 1px solid #e2e8f0; border-radius: 10px; padding: 1.1rem 1.3rem; display: flex; flex-direction: column; gap: .9rem; } .event-top { display: flex; align-items: center; gap: .6rem; flex-wrap: wrap; } .badge { font-size: .62rem; font-weight: 800; letter-spacing: .06em; padding: .2rem .5rem; border-radius: 9999px; text-transform: uppercase; color: #fff; } .badge.like { background: #0ea5e9; } .badge.apply { background: #16a34a; } .event-meta { font-size: .73rem; color: #64748b; } .event-meta b { color: #334155; font-weight: 600; } .group-label { font-size: .68rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: #6366f1; margin-top: .3rem; } .comparison { border: 1px solid #e2e8f0; border-radius: 8px; padding: .8rem .9rem; display: flex; flex-direction: column; gap: .6rem; background: #f8fafc; } .comparison-head { font-size: .74rem; color: #475569; display: flex; gap: 1rem; flex-wrap: wrap; } table.quotes { width: 100%; border-collapse: collapse; font-size: .76rem; } table.quotes th, table.quotes td { text-align: left; padding: .4rem .55rem; border-bottom: 1px solid #e2e8f0; } table.quotes th { color: #64748b; font-weight: 600; background: #fff; } table.quotes td.num { text-align: right; font-variant-numeric: tabular-nums; } .benefit { font-size: .74rem; color: #334155; border-left: 3px solid #c7d2fe; padding: .25rem .6rem; background: #fff; border-radius: 4px; } .benefit .bt { font-weight: 700; color: #4f46e5; } .benefit .pairs { color: #64748b; } .empty { text-align: center; color: #94a3b8; font-size: .85rem; padding: 2rem; border: 1px dashed #cbd5e1; border-radius: 10px; background: #fff; } </style> </head> <body> <header class="demo-header"> <h1>iPipeline Event Notifications <span class="badge-demo">Demo</span></h1> <nav style="margin-left:auto;display:flex;gap:1rem;font-size:.8rem;"> <a href="/" style="color:#6366f1;text-decoration:none;">Home</a> <a href="/demo/solution-builder" style="color:#6366f1;text-decoration:none;">← Solution Builder</a> </nav> </header> <div class="demo-body"> <div class="card"> <div class="section-label">Get Quotes</div> <div class="field-group"> <label for="caseSelect">Demo Case</label> <select id="caseSelect"> <option value="">— All recent notifications —</option> <option value="WM-DEMO-001">James Wilson &#x2014; Single, Male, Non-Smoker (35 yrs) (WM-DEMO-001)</option> <option value="WM-DEMO-002">Sarah Mitchell &#x2014; Single, Female, Smoker (33 yrs) (WM-DEMO-002)</option> <option value="WM-DEMO-003">Robert &amp; Emma Clarke &#x2014; Joint Life, Non-Smokers (WM-DEMO-003)</option> <option value="WM-DEMO-004">David Thompson &#x2014; Single, Male, Smoker (51 yrs) (WM-DEMO-004)</option> <option value="WM-DEMO-005">Michael &amp; Lisa Brown &#x2014; Joint Life, Both Smokers (WM-DEMO-005)</option> </select> </div> <button id="getQuotesBtn" class="quote-btn" onclick="getQuotes()"> <svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="2"> <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/> </svg> Get Quotes </button> <div id="status" class="status"></div> <p class="hint">The selected case ref is sent to iPipeline as the External Client Reference filter. Choose “All recent notifications” to fetch everything for the demo account (last 30 days).</p> </div> <div id="results"></div> </div> <script> const $ = id => document.getElementById(id); const esc = s => (s ?? '').toString().replace(/[&<>"']/g, m => ({ '&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;' }[m])); function fmtDate(s) { if (!s) return '—'; const d = new Date(s); return isNaN(d) ? s : d.toLocaleString(); } function fmtMoney(v) { if (v === null || v === undefined) return '—'; return '£' + Number(v).toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 }); } async function getQuotes() { const caseRef = $('caseSelect').value; const btn = $('getQuotesBtn'); const status = $('status'); const results = $('results'); btn.disabled = true; status.className = 'status'; status.textContent = 'Contacting iPipeline…'; results.innerHTML = ''; try { const res = await fetch('/demo/solution-builder/events/data?caseRef=' + encodeURIComponent(caseRef)); const body = await res.json(); if (!body.success) { status.className = 'status error'; status.textContent = (body.errorCode || 'ERROR') + ': ' + (body.errorMessage || 'Request failed.'); return; } const events = body.data || []; status.textContent = events.length + ' notification(s) returned.'; renderEvents(events); } catch (e) { status.className = 'status error'; status.textContent = 'Request failed: ' + e.message; } finally { btn.disabled = false; } } function renderEvents(events) { const results = $('results'); if (!events.length) { results.innerHTML = '<div class="empty">No event notifications found for this selection.</div>'; return; } results.innerHTML = events.map(renderEvent).join(''); } function renderEvent(ev) { const cls = (ev.eventType || '').toLowerCase() === 'like' ? 'like' : 'apply'; const meta = [ ['Client', ev.sbClientId], ['External Ref', ev.externalClientReference], ['User', ev.userId], ['Request No', ev.requestNo], ['Event Key', ev.eventKey] ].filter(p => p[1] !== null && p[1] !== undefined && p[1] !== '') .map(p => `<b>${esc(p[0])}:</b> ${esc(p[1])}`).join(' &nbsp;·&nbsp; '); const applies = (ev.applies || []).map(a => renderApply(a)).join(''); const likes = (ev.likes || []).map(l => renderLike(l)).join(''); let body = ''; if (applies) body += `<div class="group-label">Applies</div>${applies}`; if (likes) body += `<div class="group-label">Likes</div>${likes}`; if (!applies && !likes) body += `<div class="event-meta">No model detail (likes/applies) returned for this event.</div>`; return ` <div class="event-card"> <div class="event-top"> <span class="badge ${cls}">${esc(ev.eventType)}</span> <span class="event-meta">${fmtDate(ev.eventTimeUtc)}</span> </div> <div class="event-meta">${meta}</div> ${body} </div>`; } function renderApply(a) { const head = `<b>Apply #${esc(a.applyId)}</b> · ${esc(a.applicationType)} · ${fmtDate(a.dateTimeApplied)}`; return wrapComparisons(head, a.comparisons); } function renderLike(l) { const head = `<b>Solution #${esc(l.solutionId)}</b> · ${esc(l.solutionType)} · ${fmtDate(l.dateTimeLiked)}`; return wrapComparisons(head, l.comparisons); } function wrapComparisons(head, comparisons) { const inner = (comparisons || []).map(renderComparison).join('') || '<div class="event-meta">No comparisons.</div>'; return `<div class="comparison"><div class="comparison-head">${head}</div>${inner}</div>`; } function renderComparison(c) { const head = [ ['Service', c.serviceId], ['IFA Ref', c.ifaReference], ['Expires', fmtDate(c.comparisonExpiryDate)] ].filter(p => p[1]).map(p => `${esc(p[0])}: ${esc(p[1])}`).join(' &nbsp;·&nbsp; '); const quotes = (c.quotes || []); const quotesTable = quotes.length ? ` <table class="quotes"> <thead><tr> <th>Quote ID</th><th>Product</th><th>Provider</th> <th class="num">Premium</th><th class="num">Commission</th> <th>Underwriting</th><th>Expiry</th> </tr></thead> <tbody> ${quotes.map(q => `<tr> <td><code>${esc(q.quoteId)}</code></td> <td>${esc(q.productName) || ('#' + esc(q.productId))}</td> <td>${esc(q.providerName)}</td> <td class="num">${fmtMoney(q.premium)}</td> <td class="num">${fmtMoney(q.commissionAmount)}</td> <td>${esc(q.overallUnderwritingDecision) || '—'}</td> <td>${fmtDate(q.expiryDate)}</td> </tr>`).join('')} </tbody> </table>` : ''; const benefits = (c.benefits || []).map(renderBenefit).join(''); return `<div style="display:flex;flex-direction:column;gap:.5rem;margin-top:.4rem"> ${head ? `<div class="comparison-head">${head}</div>` : ''} ${quotesTable} ${benefits} </div>`; } function renderBenefit(b) { const d = b.details || {}; const pairs = Object.entries(d) .filter(([, v]) => v !== null && v !== undefined && v !== '') .map(([k, v]) => `${esc(prettyKey(k))}: ${esc(v)}`) .join(' · '); return `<div class="benefit"><span class="bt">${esc(b.benefitType)}</span> ${pairs ? `<span class="pairs"> — ${pairs}</span>` : ''}</div>`; } function prettyKey(k) { return k.replace(/([A-Z])/g, ' $1').replace(/^./, s => s.toUpperCase()).trim(); } </script> </body> </html>
2026-07-30 18:58:04.021 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /UI/business/login responded 200 in 2.9221 ms
2026-07-30 18:58:04.020 +00:00 [INF] [HTTP] [U:-] [E:-] [C:1ae2b067eb56] HTTP GET /UI/business/login 200
Req: [no body] Res: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Sign In - Wealthmax</title> <link rel="stylesheet" href="/lib/bootstrap/dist/css/bootstrap.min.css" /> <link rel="stylesheet" href="/css/site.css?v=xQHUTQJdpYJFKIjDlFCI1X8KDqtO5qaSSeJFSoCP3pA" /> <style> html, body { height: 100%; } body { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 100vh; background-color: #f5f7fa; } .login-wrapper { display: flex; flex-direction: column; align-items: center; width: 100%; padding: 1.5rem; } .brand-logo { margin-bottom: 1.75rem; text-align: center; } .brand-logo span { font-size: 1.4rem; font-weight: 700; color: #1a1a2e; letter-spacing: -0.5px; } .brand-logo small { display: block; font-size: 0.7rem; color: #6c757d; font-weight: 500; text-transform: uppercase; letter-spacing: 1px; margin-top: 2px; } </style> </head> <body> <div class="login-wrapper"> <div class="brand-logo"> <span>Wealthmax</span> <small>PM CRM</small> </div> <div class="card shadow-sm" style="width: 100%; max-width: 400px;"> <div class="card-body p-4"> <h4 class="card-title mb-1 fw-semibold">Sign In</h4> <p class="text-muted small mb-4">Enter your credentials to access the portal.</p> <form method="post" novalidate action="/UI/business/login"> <div class="mb-3"> <label class="form-label" for="Email">Email</label> <input class="form-control" placeholder="you@example.com" autofocus type="email" data-val="true" data-val-email="The Email field is not a valid e-mail address." data-val-required="The Email field is required." id="Email" name="Email" value="" /> <span class="text-danger small field-validation-valid" data-valmsg-for="Email" data-valmsg-replace="true"></span> </div> <div class="mb-4"> <label class="form-label" for="Password">Password</label> <input type="password" class="form-control" placeholder="••••••••" data-val="true" data-val-minlength="The field Password must be a string or array type with a minimum length of &#x27;8&#x27;." data-val-minlength-min="8" data-val-required="The Password field is required." id="Password" name="Password" /> <span class="text-danger small field-validation-valid" data-valmsg-for="Password" data-valmsg-replace="true"></span> </div> <button type="submit" class="btn btn-primary w-100">Sign In</button> <input name="__RequestVerificationToken" type="hidden" value="CfDJ8PkPKADDi0hCi7-PdeVDOzok9YVNcXV8wwc8ZrJZlQrjQHBdZW3uXAsl7vZaHcXIzhOASDnuBnIZstNpKkAqhIhHrr-qOtwZpr-D360ZWSuAWZjnJTf13_tU9jG3urY3nGiYV7a13xGgHwrZTjmpCdI" /></form> <div class="mt-3 text-center"> <a href="/UI/business/forgot-password" class="small text-decoration-none">Forgot password?</a> </div> </div> </div> </div> <script src="/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script src="/lib/jquery/dist/jquery.min.js"></script> <script src="/lib/jquery-validation/dist/jquery.validate.min.js"></script> <script src="/lib/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.min.js"></script> </body> </html>
2026-07-30 18:57:04.222 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /UI/business/login responded 200 in 1.6320 ms
2026-07-30 18:57:04.222 +00:00 [INF] [HTTP] [U:-] [E:-] [C:09c67d7b16c6] HTTP GET /UI/business/login 200
Req: [no body] Res: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Sign In - Wealthmax</title> <link rel="stylesheet" href="/lib/bootstrap/dist/css/bootstrap.min.css" /> <link rel="stylesheet" href="/css/site.css?v=xQHUTQJdpYJFKIjDlFCI1X8KDqtO5qaSSeJFSoCP3pA" /> <style> html, body { height: 100%; } body { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 100vh; background-color: #f5f7fa; } .login-wrapper { display: flex; flex-direction: column; align-items: center; width: 100%; padding: 1.5rem; } .brand-logo { margin-bottom: 1.75rem; text-align: center; } .brand-logo span { font-size: 1.4rem; font-weight: 700; color: #1a1a2e; letter-spacing: -0.5px; } .brand-logo small { display: block; font-size: 0.7rem; color: #6c757d; font-weight: 500; text-transform: uppercase; letter-spacing: 1px; margin-top: 2px; } </style> </head> <body> <div class="login-wrapper"> <div class="brand-logo"> <span>Wealthmax</span> <small>PM CRM</small> </div> <div class="card shadow-sm" style="width: 100%; max-width: 400px;"> <div class="card-body p-4"> <h4 class="card-title mb-1 fw-semibold">Sign In</h4> <p class="text-muted small mb-4">Enter your credentials to access the portal.</p> <form method="post" novalidate action="/UI/business/login"> <div class="mb-3"> <label class="form-label" for="Email">Email</label> <input class="form-control" placeholder="you@example.com" autofocus type="email" data-val="true" data-val-email="The Email field is not a valid e-mail address." data-val-required="The Email field is required." id="Email" name="Email" value="" /> <span class="text-danger small field-validation-valid" data-valmsg-for="Email" data-valmsg-replace="true"></span> </div> <div class="mb-4"> <label class="form-label" for="Password">Password</label> <input type="password" class="form-control" placeholder="••••••••" data-val="true" data-val-minlength="The field Password must be a string or array type with a minimum length of &#x27;8&#x27;." data-val-minlength-min="8" data-val-required="The Password field is required." id="Password" name="Password" /> <span class="text-danger small field-validation-valid" data-valmsg-for="Password" data-valmsg-replace="true"></span> </div> <button type="submit" class="btn btn-primary w-100">Sign In</button> <input name="__RequestVerificationToken" type="hidden" value="CfDJ8PkPKADDi0hCi7-PdeVDOzo_0C3KV-V51H_GTsVXG0QwDsV1IMg3_xxulb2-NsYjNppHNCPuFo9IH8Pyt13PMzIegndbBs5Adtftejpza9ovRCWyzcQXki3yhX8HJhEyJghLm2pmMJFw9Y9a5OoJZW4" /></form> <div class="mt-3 text-center"> <a href="/UI/business/forgot-password" class="small text-decoration-none">Forgot password?</a> </div> </div> </div> </div> <script src="/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script src="/lib/jquery/dist/jquery.min.js"></script> <script src="/lib/jquery-validation/dist/jquery.validate.min.js"></script> <script src="/lib/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.min.js"></script> </body> </html>
2026-07-30 18:57:04.044 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /UI/business/login responded 200 in 8.2120 ms
2026-07-30 18:57:04.044 +00:00 [INF] [HTTP] [U:-] [E:-] [C:6fb90ba5b6d8] HTTP GET /UI/business/login 200
Req: [no body] Res: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Sign In - Wealthmax</title> <link rel="stylesheet" href="/lib/bootstrap/dist/css/bootstrap.min.css" /> <link rel="stylesheet" href="/css/site.css?v=xQHUTQJdpYJFKIjDlFCI1X8KDqtO5qaSSeJFSoCP3pA" /> <style> html, body { height: 100%; } body { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 100vh; background-color: #f5f7fa; } .login-wrapper { display: flex; flex-direction: column; align-items: center; width: 100%; padding: 1.5rem; } .brand-logo { margin-bottom: 1.75rem; text-align: center; } .brand-logo span { font-size: 1.4rem; font-weight: 700; color: #1a1a2e; letter-spacing: -0.5px; } .brand-logo small { display: block; font-size: 0.7rem; color: #6c757d; font-weight: 500; text-transform: uppercase; letter-spacing: 1px; margin-top: 2px; } </style> </head> <body> <div class="login-wrapper"> <div class="brand-logo"> <span>Wealthmax</span> <small>PM CRM</small> </div> <div class="card shadow-sm" style="width: 100%; max-width: 400px;"> <div class="card-body p-4"> <h4 class="card-title mb-1 fw-semibold">Sign In</h4> <p class="text-muted small mb-4">Enter your credentials to access the portal.</p> <form method="post" novalidate action="/UI/business/login"> <div class="mb-3"> <label class="form-label" for="Email">Email</label> <input class="form-control" placeholder="you@example.com" autofocus type="email" data-val="true" data-val-email="The Email field is not a valid e-mail address." data-val-required="The Email field is required." id="Email" name="Email" value="" /> <span class="text-danger small field-validation-valid" data-valmsg-for="Email" data-valmsg-replace="true"></span> </div> <div class="mb-4"> <label class="form-label" for="Password">Password</label> <input type="password" class="form-control" placeholder="••••••••" data-val="true" data-val-minlength="The field Password must be a string or array type with a minimum length of &#x27;8&#x27;." data-val-minlength-min="8" data-val-required="The Password field is required." id="Password" name="Password" /> <span class="text-danger small field-validation-valid" data-valmsg-for="Password" data-valmsg-replace="true"></span> </div> <button type="submit" class="btn btn-primary w-100">Sign In</button> <input name="__RequestVerificationToken" type="hidden" value="CfDJ8PkPKADDi0hCi7-PdeVDOzpiNmh_HKPJdQ8I1y5b7S5dDN0VFd10HJCBiYWu8SrD3qS-yfT9UnY8J2Yd38D8MjHFbUZlu-93b4wDpULv3qs_fI_7qpOeLWbHeesITCOnUVI3PKE-VMzc0O1dTFI64oQ" /></form> <div class="mt-3 text-center"> <a href="/UI/business/forgot-password" class="small text-decoration-none">Forgot password?</a> </div> </div> </div> </div> <script src="/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script src="/lib/jquery/dist/jquery.min.js"></script> <script src="/lib/jquery-validation/dist/jquery.validate.min.js"></script> <script src="/lib/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.min.js"></script> </body> </html>
2026-07-30 18:57:03.921 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /UI/Tokens/Index responded 302 in 0.5176 ms
2026-07-30 18:57:03.921 +00:00 [INF] [HTTP] [U:-] [E:-] [C:c051e5e7f329] HTTP GET /UI/Tokens/Index 302
Req: [no body] Res: [empty response]
2026-07-30 18:57:03.823 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /UI/Clients/Index responded 302 in 1.0189 ms
2026-07-30 18:57:03.822 +00:00 [INF] [HTTP] [U:-] [E:-] [C:045f6b01ab28] HTTP GET /UI/Clients/Index 302
Req: [no body] Res: [empty response]
2026-07-30 18:56:11.760 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /demo/solution-builder responded 200 in 3.3381 ms
2026-07-30 18:56:11.760 +00:00 [INF] [HTTP] [U:-] [E:-] [C:0b8ceaee09f1] HTTP GET /demo/solution-builder 200
Req: [no body] Res: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <title>iPipeline Demo — Wealthmax CRM</title> <style> *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: #f8fafc; color: #1e293b; min-height: 100vh; } /* ── Header ── */ .page-header { background: #fff; border-bottom: 1px solid #e2e8f0; padding: 1rem 2rem; display: flex; align-items: center; gap: 1rem; } .page-header h1 { font-size: 1rem; font-weight: 700; color: #0f172a; letter-spacing: -.01em; } .badge { font-size: .6rem; font-weight: 800; letter-spacing: .08em; text-transform: uppercase; padding: .18rem .5rem; border-radius: 9999px; } .badge-demo { background: #fef3c7; color: #92400e; } .page-header nav { margin-left: auto; display: flex; gap: 1.25rem; font-size: .8rem; } .page-header nav a { color: #6366f1; text-decoration: none; font-weight: 500; } .page-header nav a:hover { text-decoration: underline; } /* ── Page layout ── */ .page-body { max-width: 820px; margin: 2rem auto; padding: 0 1.5rem 4rem; display: flex; flex-direction: column; gap: 1rem; } /* ── Card ── */ .card { background: #fff; border: 1px solid #e2e8f0; border-radius: 12px; box-shadow: 0 1px 3px rgba(0,0,0,.04), 0 1px 2px rgba(0,0,0,.03); overflow: hidden; } .card-header { padding: .875rem 1.5rem; border-bottom: 1px solid #f1f5f9; display: flex; align-items: center; gap: .6rem; background: #fafafa; } .card-header h2 { font-size: .8rem; font-weight: 700; color: #374151; letter-spacing: .04em; text-transform: uppercase; } .card-body { padding: 1.25rem 1.5rem; display: flex; flex-direction: column; gap: 1rem; } /* ── Sub-section divider inside a card ── */ .sub-section { padding-top: 1rem; border-top: 1px solid #f1f5f9; display: flex; flex-direction: column; gap: .85rem; } .sub-label { font-size: .68rem; font-weight: 700; letter-spacing: .09em; text-transform: uppercase; color: #6366f1; } /* ── Field grid ── */ .field-row { display: grid; grid-template-columns: 1fr 1fr; gap: .875rem; } .field-row.single { grid-template-columns: 1fr; } .field-row.triple { grid-template-columns: 1fr 1fr 1fr; } .field-group { display: flex; flex-direction: column; gap: .3rem; } .field-group label { font-size: .72rem; font-weight: 600; color: #475569; } .field-hint { font-size: .68rem; font-weight: 400; color: #94a3b8; margin-left: .2rem; } .field-group input, .field-group select { background: #fff; color: #0f172a; border: 1px solid #d1d5db; border-radius: 7px; padding: .52rem .75rem; font-size: .875rem; width: 100%; transition: border-color .15s, box-shadow .15s; appearance: auto; } .field-group input::placeholder { color: #c8d1db; } .field-group input:focus, .field-group select:focus { outline: none; border-color: #818cf8; box-shadow: 0 0 0 3px rgba(99,102,241,.1); } /* ── Second-life toggle ── */ .toggle-card { background: #fff; border: 1px solid #e2e8f0; border-radius: 12px; box-shadow: 0 1px 3px rgba(0,0,0,.04); } .toggle-card label { display: flex; align-items: center; gap: .75rem; padding: .95rem 1.5rem; cursor: pointer; user-select: none; } .toggle-card input[type=checkbox] { accent-color: #6366f1; width: 16px; height: 16px; cursor: pointer; flex-shrink: 0; } .toggle-card .toggle-text { font-size: .85rem; font-weight: 500; color: #374151; } .toggle-card .toggle-sub { font-size: .75rem; color: #94a3b8; margin-left: auto; } /* ── Second life collapsible ── */ .second-life-section { display: none; flex-direction: column; gap: 1rem; } .second-life-section.visible { display: flex; } /* ── Policy settings card accent ── */ .card.settings .card-header { background: #f5f3ff; border-bottom-color: #ede9fe; } .card.settings .card-header h2 { color: #5b21b6; } /* ── Launch button ── */ .launch-wrap { display: flex; flex-direction: column; gap: .6rem; padding-top: .25rem; } .launch-btn { width: 100%; background: #4f46e5; color: #fff; border: none; border-radius: 10px; padding: .85rem 1rem; font-size: .925rem; font-weight: 600; cursor: pointer; transition: background .15s, transform .1s, box-shadow .15s; display: flex; align-items: center; justify-content: center; gap: .5rem; box-shadow: 0 2px 8px rgba(79,70,229,.25); } .launch-btn:hover { background: #4338ca; box-shadow: 0 4px 12px rgba(79,70,229,.35); } .launch-btn:active { transform: scale(.985); } .launch-btn svg { width: 15px; height: 15px; flex-shrink: 0; } .launch-hint { font-size: .72rem; color: #94a3b8; text-align: center; } </style> </head> <body> <!-- ── Header ── --> <header class="page-header"> <h1>iPipeline Solution Builder</h1> <span class="badge badge-demo">Demo</span> <nav> <a href="/">Home</a> <a href="/demo/solution-builder/events">Fetch Quotes →</a> </nav> </header> <div class="page-body"> <form id="demoForm" method="post" action="/demo/solution-builder/launch" target="_blank"> <!-- ── Case selector ── --> <div class="card"> <div class="card-body"> <div class="field-group"> <label for="caseSelect">Select Demo Case</label> <select id="caseSelect" name="CaseRef" onchange="loadCase(this.value)"> <option value="">— Choose a case to pre-fill the form —</option> <option value="WM-DEMO-001">James Wilson &#x2014; Single, Male, Non-Smoker (35 yrs)</option> <option value="WM-DEMO-002">Sarah Mitchell &#x2014; Single, Female, Smoker (33 yrs)</option> <option value="WM-DEMO-003">Robert &amp; Emma Clarke &#x2014; Joint Life, Non-Smokers</option> <option value="WM-DEMO-004">David Thompson &#x2014; Single, Male, Smoker (51 yrs)</option> <option value="WM-DEMO-005">Michael &amp; Lisa Brown &#x2014; Joint Life, Both Smokers</option> </select> </div> </div> </div> <!-- ── First Life ── --> <div class="card"> <div class="card-header"> <h2>First Life</h2> </div> <div class="card-body"> <div class="field-row"> <div class="field-group"> <label>First Name</label> <input id="firstFirstName" name="FirstFirstName" type="text" placeholder="e.g. James" required /> </div> <div class="field-group"> <label>Last Name</label> <input id="firstLastName" name="FirstLastName" type="text" placeholder="e.g. Wilson" required /> </div> </div> <div class="field-row"> <div class="field-group"> <label>Date of Birth</label> <input id="firstDateOfBirth" name="FirstDateOfBirth" type="date" required /> </div> <div class="field-group"> <label>Gender</label> <select id="firstGender" name="FirstGender"> <option value="Male">Male</option> <option value="Female">Female</option> </select> </div> </div> <div class="field-row single"> <div class="field-group"> <label>Smoker Status</label> <select id="firstIsSmoker" name="FirstIsSmoker"> <option value="false">Non-Smoker</option> <option value="true">Smoker</option> </select> </div> </div> <!-- Cover details --> <div class="sub-section"> <div class="sub-label">Cover Details</div> <div class="field-row"> <div class="field-group"> <label>Life Cover Amount (£)</label> <input id="lifeCoverAmount" name="LifeCoverAmount" type="number" value="300000" /> </div> <div class="field-group"> <label>Life Cover Up to Age <span class="field-hint">46 – 99</span></label> <input id="lifeToAge" name="LifeToAge" type="number" value="85" min="46" max="99" /> </div> </div> <div class="field-row"> <div class="field-group"> <label>Critical Illness Amount (£)</label> <input id="ciCoverAmount" name="CiCoverAmount" type="number" value="30000" /> </div> <div class="field-group"> <label>CI Cover Up to Age <span class="field-hint">43 – 99</span></label> <input id="ciToAge" name="CiToAge" type="number" value="70" min="43" max="99" /> </div> </div> <div class="field-row single"> <div class="field-group"> <label>Waiver of Premium</label> <select id="waiverOfPremium" name="WaiverOfPremium"> <option value="None" selected>None</option> <option value="FirstLife">FirstLife</option> </select> </div> </div> </div> </div> </div> <!-- ── Second Life toggle ── --> <div class="toggle-card"> <label for="hasSecondLife"> <input type="checkbox" id="hasSecondLife" name="HasSecondLife" value="true" onchange="toggleSecondLife(this.checked)" /> <span class="toggle-text">Add Second Life</span> <span class="toggle-sub">Joint Policy</span> </label> </div> <!-- ── Second Life ── --> <div id="secondLifeSection" class="second-life-section"> <div class="card"> <div class="card-header"> <h2>Second Life</h2> </div> <div class="card-body"> <div class="field-row"> <div class="field-group"> <label>First Name</label> <input id="secondFirstName" name="SecondFirstName" type="text" placeholder="e.g. Emma" /> </div> <div class="field-group"> <label>Last Name</label> <input id="secondLastName" name="SecondLastName" type="text" placeholder="e.g. Clarke" /> </div> </div> <div class="field-row"> <div class="field-group"> <label>Date of Birth</label> <input id="secondDateOfBirth" name="SecondDateOfBirth" type="date" /> </div> <div class="field-group"> <label>Gender</label> <select id="secondGender" name="SecondGender"> <option value="Male">Male</option> <option value="Female">Female</option> </select> </div> </div> <div class="field-row single"> <div class="field-group"> <label>Smoker Status</label> <select id="secondIsSmoker" name="SecondIsSmoker"> <option value="false">Non-Smoker</option> <option value="true">Smoker</option> </select> </div> </div> <!-- Second life cover details --> <div class="sub-section"> <div class="sub-label">Cover Details</div> <div class="field-row"> <div class="field-group"> <label>Life Cover Amount (£)</label> <input id="secondLifeCoverAmount" name="SecondLifeCoverAmount" type="number" value="300000" /> </div> <div class="field-group"> <label>Life Cover Up to Age <span class="field-hint">46 – 99</span></label> <input id="secondLifeToAge" name="SecondLifeToAge" type="number" value="85" min="46" max="99" /> </div> </div> <div class="field-row"> <div class="field-group"> <label>Critical Illness Amount (£)</label> <input id="secondCiCoverAmount" name="SecondCiCoverAmount" type="number" value="30000" /> </div> <div class="field-group"> <label>CI Cover Up to Age <span class="field-hint">43 – 99</span></label> <input id="secondCiToAge" name="SecondCiToAge" type="number" value="70" min="43" max="99" /> </div> </div> <div class="field-row single"> <div class="field-group"> <label>Waiver of Premium</label> <select id="secondWaiverOfPremium" name="SecondWaiverOfPremium"> <option value="None" selected>None</option> <option value="SecondLife">SecondLife</option> </select> </div> </div> </div> </div> </div> </div> <!-- ── Policy Settings (shared) ── --> <div class="card settings"> <div class="card-header"> <h2>Policy Settings</h2> </div> <div class="card-body"> <div class="field-row triple"> <div class="field-group"> <label>Premium Type</label> <select id="premiumType" name="PremiumType"> <option value="Guaranteed" selected>Guaranteed</option> <option value="Reviewable">Reviewable</option> </select> </div> <div class="field-group"> <label>Indexation</label> <select id="indexation" name="Indexation"> <option value="Level" selected>Level</option> <option value="RPI">RPI</option> <option value="AWEI">AWEI</option> <option value="One">1%</option> <option value="Two">2%</option> <option value="Three">3%</option> <option value="Four">4%</option> <option value="Five">5%</option> <option value="Six">6%</option> <option value="Seven">7%</option> <option value="Eight">8%</option> <option value="Nine">9%</option> <option value="Ten">10%</option> </select> </div> <div class="field-group"> <label>Exclude Low Start</label> <select name="ExcludeLowStart"> <option value="False" selected>No</option> <option value="True">Yes</option> </select> </div> </div> </div> </div> <!-- ── Launch ── --> <div class="launch-wrap"> <button type="submit" class="launch-btn"> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"> <path d="M15 3h6v6M10 14L21 3M9 21H3v-6"/> </svg> Launch in iPipeline Solution Builder </button> <p class="launch-hint">Encrypts the payload into a 5-minute one-time token and auto-submits to iPipeline.</p> </div> </form> </div> <script> const CASES = [{"caseId":"WM-DEMO-001","displayName":"James Wilson \u2014 Single, Male, Non-Smoker (35 yrs)","firstLife":{"firstName":"James","lastName":"Wilson","dateOfBirth":"1989-03-15","gender":"Male","isSmoker":false},"secondLife":null},{"caseId":"WM-DEMO-002","displayName":"Sarah Mitchell \u2014 Single, Female, Smoker (33 yrs)","firstLife":{"firstName":"Sarah","lastName":"Mitchell","dateOfBirth":"1991-07-22","gender":"Female","isSmoker":true},"secondLife":null},{"caseId":"WM-DEMO-003","displayName":"Robert \u0026 Emma Clarke \u2014 Joint Life, Non-Smokers","firstLife":{"firstName":"Robert","lastName":"Clarke","dateOfBirth":"1978-11-08","gender":"Male","isSmoker":false},"secondLife":{"firstName":"Emma","lastName":"Clarke","dateOfBirth":"1980-05-14","gender":"Female","isSmoker":false}},{"caseId":"WM-DEMO-004","displayName":"David Thompson \u2014 Single, Male, Smoker (51 yrs)","firstLife":{"firstName":"David","lastName":"Thompson","dateOfBirth":"1972-09-30","gender":"Male","isSmoker":true},"secondLife":null},{"caseId":"WM-DEMO-005","displayName":"Michael \u0026 Lisa Brown \u2014 Joint Life, Both Smokers","firstLife":{"firstName":"Michael","lastName":"Brown","dateOfBirth":"1982-04-17","gender":"Male","isSmoker":true},"secondLife":{"firstName":"Lisa","lastName":"Brown","dateOfBirth":"1984-12-03","gender":"Female","isSmoker":true}}]; function loadCase(caseId) { const c = CASES.find(x => x.caseId === caseId); if (!c) return; setVal('firstFirstName', c.firstLife.firstName); setVal('firstLastName', c.firstLife.lastName); setVal('firstDateOfBirth', c.firstLife.dateOfBirth); setVal('firstGender', c.firstLife.gender); setVal('firstIsSmoker', c.firstLife.isSmoker ? 'true' : 'false'); const hasSecond = c.secondLife !== null; document.getElementById('hasSecondLife').checked = hasSecond; toggleSecondLife(hasSecond); if (hasSecond) { setVal('secondFirstName', c.secondLife.firstName); setVal('secondLastName', c.secondLife.lastName); setVal('secondDateOfBirth', c.secondLife.dateOfBirth); setVal('secondGender', c.secondLife.gender); setVal('secondIsSmoker', c.secondLife.isSmoker ? 'true' : 'false'); } } function setVal(id, val) { const el = document.getElementById(id); if (el) el.value = val ?? ''; } function toggleSecondLife(show) { document.getElementById('secondLifeSection').classList.toggle('visible', show); } </script> </body> </html>
2026-07-30 18:32:17.841 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET / responded 200 in 5.0825 ms
2026-07-30 18:32:17.841 +00:00 [INF] [HTTP] [U:-] [E:-] [C:f595446918c9] HTTP GET / 200
Req: [no body] Res: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Home — WM Policy Documents</title> <link rel="stylesheet" href="/lib/bootstrap/dist/css/bootstrap.min.css" /> <link rel="stylesheet" href="/css/site.css?v=xQHUTQJdpYJFKIjDlFCI1X8KDqtO5qaSSeJFSoCP3pA" /> <link rel="stylesheet" href="/css/commissions.css?v=ZRMXSlMSxdLsHmJCZzq1LopWaopJSbVXKu57gvUJG3w" /> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css" /> <style> /* ---- Hover-expand left sidebar -------------------------------------- */ :root { --sb-collapsed: 64px; --sb-expanded: 240px; } body.has-sidebar { /* Reserve space for the collapsed rail; the expanded panel overlays the content on hover, so the content never shifts. */ padding-left: var(--sb-collapsed); } .app-sidebar { position: fixed; top: 0; left: 0; height: 100vh; width: var(--sb-collapsed); overflow-x: hidden; overflow-y: auto; display: flex; flex-direction: column; z-index: 1045; transition: width 0.2s ease; } .app-sidebar:hover, .app-sidebar:focus-within { width: var(--sb-expanded); box-shadow: 0 0 24px rgba(0,0,0,0.35); } .app-sidebar .sb-label { white-space: nowrap; opacity: 0; transition: opacity 0.15s ease; } .app-sidebar:hover .sb-label, .app-sidebar:focus-within .sb-label { opacity: 1; } .sb-link { display: flex; align-items: center; gap: 0.85rem; padding: 0.65rem 0; color: rgba(255,255,255,0.75); text-decoration: none; border-left: 3px solid transparent; } .sb-link:hover { color: #fff; background: rgba(255,255,255,0.08); } .sb-link.active { color: #fff; background: rgba(255,255,255,0.12); border-left-color: #0d6efd; } .sb-link > i:first-child { min-width: var(--sb-collapsed); text-align: center; font-size: 1.15rem; flex-shrink: 0; } .sb-brand { display: flex; align-items: center; gap: 0.85rem; padding: 0.9rem 0; color: #fff; text-decoration: none; font-weight: 700; } .sb-brand > i:first-child { min-width: var(--sb-collapsed); text-align: center; font-size: 1.3rem; flex-shrink: 0; } /* Sub-menu (Fact-Find) */ .sb-submenu .sb-link { font-size: 0.9rem; padding-left: 0; } .sb-submenu .sb-link > i:first-child { font-size: 1rem; } .sb-caret { margin-left: auto; margin-right: 0.9rem; transition: transform 0.15s ease; } .sb-link[aria-expanded="true"] .sb-caret { transform: rotate(180deg); } </style> </head> <body class="d-flex flex-column min-vh-100 has-sidebar"> <nav b-yjl2sbey1b class="app-sidebar navbar-dark bg-dark shadow-sm"> <a class="sb-brand" href="/UI"> <i b-yjl2sbey1b class="bi bi-file-earmark-text"></i> <span b-yjl2sbey1b class="sb-label">Wealthmax</span> </a> <div b-yjl2sbey1b class="d-flex flex-column flex-grow-1"> <a class="sb-link " href="/UI/Dashboard/Index"> <i b-yjl2sbey1b class="bi bi-speedometer2"></i><span b-yjl2sbey1b class="sb-label">Dashboard</span> </a> <a class="sb-link " href="/UI/Templates/Index"> <i b-yjl2sbey1b class="bi bi-collection"></i><span b-yjl2sbey1b class="sb-label">Templates</span> </a> <a class="sb-link " href="/UI/Tokens/Index"> <i b-yjl2sbey1b class="bi bi-braces"></i><span b-yjl2sbey1b class="sb-label">Token Registry</span> </a> <a class="sb-link " href="/UI/Clients/Index"> <i b-yjl2sbey1b class="bi bi-people"></i><span b-yjl2sbey1b class="sb-label">Clients</span> </a> <a class="sb-link " href="/UI/Cases/Index"> <i b-yjl2sbey1b class="bi bi-briefcase"></i><span b-yjl2sbey1b class="sb-label">Cases</span> </a> <a class="sb-link " href="/UI/Reporting/Index"> <i b-yjl2sbey1b class="bi bi-graph-up"></i><span b-yjl2sbey1b class="sb-label">Reports</span> </a> <a class="sb-link " href="/UI/Commissions/Management"> <i b-yjl2sbey1b class="bi bi-cash-coin"></i><span b-yjl2sbey1b class="sb-label">Commissions</span> </a> <!-- User Management --> <a class="sb-link " href="/UI/Users/Index"> <i b-yjl2sbey1b class="bi bi-person-gear"></i><span b-yjl2sbey1b class="sb-label">User Management</span> </a> <!-- Fact-Find (expandable sub-menu) --> <a b-yjl2sbey1b class="sb-link " href="#ffSubmenu" role="button" data-bs-toggle="collapse" aria-expanded="false"> <i b-yjl2sbey1b class="bi bi-file-earmark-text"></i><span b-yjl2sbey1b class="sb-label">Fact-Find</span> <i b-yjl2sbey1b class="bi bi-chevron-down sb-caret sb-label"></i> </a> <div b-yjl2sbey1b class="collapse sb-submenu " id="ffSubmenu"> <a class="sb-link " href="/UI/FactFindFormatters/Index"> <i b-yjl2sbey1b class="bi bi-grid"></i><span b-yjl2sbey1b class="sb-label">Formatters</span> </a> <a class="sb-link " href="/UI/FactFindTemplates/Index"> <i b-yjl2sbey1b class="bi bi-layers"></i><span b-yjl2sbey1b class="sb-label">Templates</span> </a> <a class="sb-link " href="/UI/FactFindGenerate"> <i b-yjl2sbey1b class="bi bi-lightning-charge"></i><span b-yjl2sbey1b class="sb-label">Generate &amp; Preview</span> </a> </div> </div> <!-- Auth (pinned to bottom) --> <div b-yjl2sbey1b class="mt-auto border-top border-secondary"> <a b-yjl2sbey1b class="sb-link" href="/UI/business/login"> <i b-yjl2sbey1b class="bi bi-box-arrow-in-right"></i><span b-yjl2sbey1b class="sb-label">Business login</span> </a> </div> </nav> <main b-yjl2sbey1b class="flex-grow-1 py-4"> <div b-yjl2sbey1b class="container-fluid px-4"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css"> <style> body > nav.navbar { position: sticky; top: 0; z-index: 1030; } .dash-hero { background: linear-gradient(135deg, #212529 0%, #343a40 100%); color: #fff; } .dash-card { border: none; border-radius: 12px; transition: transform 0.15s ease, box-shadow 0.15s ease; } .dash-card:hover { transform: translateY(-3px); box-shadow: 0 8px 24px rgba(0,0,0,0.10) !important; } .dash-icon { width: 48px; height: 48px; border-radius: 12px; display: flex; align-items: center; justify-content: center; font-size: 1.4rem; } .dash-stat-value { font-size: 2rem; font-weight: 700; line-height: 1; } .dash-card-title { font-size: 0.95rem; font-weight: 600; } .dash-card-text { font-size: 0.78rem; } /* Discreet business-login link pinned to the bottom-right corner. */ .home-login-link { position: fixed; bottom: 1rem; right: 1.25rem; z-index: 1040; } </style> <!-- Hero --> <div class="dash-hero py-4 mb-4"> <div class="container text-center"> <h1 class="display-6 fw-bold mb-2">Wealthmax PM CRM</h1> <p class="lead text-white-50 mb-0" style="max-width: 640px; margin: 0 auto;"> Testing harness dashboard &mdash; system tools, integrations, and live service health at a glance. </p> </div> </div> <div class="container pb-5"> <!-- Tool / Integration cards --> <div class="row g-3 mb-4"> <!-- Tenants Created --> <div class="col-6 col-md-4 col-lg-3"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="d-flex align-items-start justify-content-between mb-2"> <div class="dash-icon bg-primary bg-opacity-10 text-primary"> <i class="bi bi-building-fill"></i> </div> <span class="badge bg-secondary bg-opacity-10 text-secondary">Sample</span> </div> <div class="dash-stat-value text-dark">12</div> <div class="dash-card-title text-dark mt-1">Tenants Created</div> <p class="dash-card-text text-muted mb-0">Total onboarded tenants in this environment.</p> </div> </div> </div> <!-- Build Logs --> <div class="col-6 col-md-4 col-lg-3"> <a href="/UI/DevLogs" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-dark bg-opacity-10 text-dark mb-2"> <i class="bi bi-terminal-fill"></i> </div> <div class="dash-card-title text-dark">Build &amp; App Logs</div> <p class="dash-card-text text-muted mb-0">Browse structured application logs by date and level.</p> </div> </div> </a> </div> <!-- Swagger --> <div class="col-6 col-md-4 col-lg-3"> <a href="/swagger" target="_blank" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="d-flex align-items-start justify-content-between mb-2"> <div class="dash-icon bg-success bg-opacity-10 text-success"> <i class="bi bi-braces"></i> </div> <i class="bi bi-box-arrow-up-right text-muted small"></i> </div> <div class="dash-card-title text-dark">Swagger / API Docs</div> <p class="dash-card-text text-muted mb-0">Explore and try the REST API via OpenAPI UI.</p> </div> </div> </a> </div> <!-- SignalR --> <div class="col-6 col-md-4 col-lg-3"> <a href="/test-signalr.html" target="_blank" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="d-flex align-items-start justify-content-between mb-2"> <div class="dash-icon bg-info bg-opacity-10 text-info"> <i class="bi bi-broadcast"></i> </div> <i class="bi bi-box-arrow-up-right text-muted small"></i> </div> <div class="dash-card-title text-dark">SignalR Hub</div> <p class="dash-card-text text-muted mb-0">Test real-time notifications over the SignalR hub.</p> </div> </div> </a> </div> <!-- iPipeline --> <div class="col-6 col-md-4 col-lg-3"> <a href="/demo/solution-builder" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-warning bg-opacity-10 text-warning mb-2"> <i class="bi bi-plug-fill"></i> </div> <div class="dash-card-title text-dark">iPipeline</div> <p class="dash-card-text text-muted mb-0">Launch the iPipeline Solution Builder integration.</p> </div> </div> </a> </div> <!-- Fetch Quotes --> <div class="col-6 col-md-4 col-lg-3"> <a href="/demo/solution-builder/events" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-danger bg-opacity-10 text-danger mb-2"> <i class="bi bi-receipt"></i> </div> <div class="dash-card-title text-dark">Fetch Quotes</div> <p class="dash-card-text text-muted mb-0">View quote-notification events returned from the pipeline.</p> </div> </div> </a> </div> <!-- CRM Dashboard --> <div class="col-6 col-md-4 col-lg-3"> <a class="text-decoration-none" href="/UI/Dashboard/Index"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-primary bg-opacity-10 text-primary mb-2"> <i class="bi bi-speedometer2"></i> </div> <div class="dash-card-title text-dark">CRM Dashboard</div> <p class="dash-card-text text-muted mb-0">Cases, clients, and commission overview metrics.</p> </div> </div> </a> </div> <!-- Clients --> <div class="col-6 col-md-4 col-lg-3"> <a class="text-decoration-none" href="/UI/Clients/Index"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-success bg-opacity-10 text-success mb-2"> <i class="bi bi-people-fill"></i> </div> <div class="dash-card-title text-dark">Clients &amp; Cases</div> <p class="dash-card-text text-muted mb-0">Manage client records and advisory cases.</p> </div> </div> </a> </div> </div> <!-- System Health --> <div id="health-card" class="card dash-card shadow-sm mb-4"> <div class="card-body p-3"> <!-- Loading state --> <div id="health-loading" class="text-center py-3"> <div class="spinner-border spinner-border-sm text-primary" role="status"> <span class="visually-hidden">Loading...</span> </div> <span class="ms-2 text-muted">Checking system health...</span> </div> <!-- Error state --> <div id="health-error" class="d-none text-center py-3"> <i class="bi bi-exclamation-triangle fs-4 text-danger d-block mb-2"></i> <p class="text-muted mb-1">Unable to reach the health endpoint.</p> <button class="btn btn-sm btn-outline-secondary" onclick="fetchHealth()"> <i class="bi bi-arrow-clockwise me-1"></i>Retry </button> </div> <!-- Success state --> <div id="health-content" class="d-none"> <div class="d-flex align-items-center mb-3"> <i class="bi bi-heart-pulse fs-4 text-primary me-2"></i> <h5 class="fw-semibold mb-0 me-auto">System Health</h5> <span id="health-status-badge" class="badge"></span> </div> <hr class="my-3"> <div class="row g-2 small"> <div class="col-sm-6"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-clock me-2"></i> <span>Checked: <span id="health-timestamp" class="text-body"></span></span> </div> </div> <div class="col-sm-6"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-speedometer2 me-2"></i> <span>Response: <span id="health-duration" class="text-body"></span></span> </div> </div> <div class="col-sm-6 d-none" id="health-db-row"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-database me-2"></i> <span>Database: <span id="health-database" class="text-body"></span></span> </div> </div> <div class="col-sm-6 d-none" id="health-build-row"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-git me-2"></i> <span>Build: <code id="health-commit"></code> <span id="health-build-date" class="text-muted"></span></span> </div> </div> </div> </div> </div> </div> <!-- Tech Stack --> <div class="text-center"> <div class="d-flex flex-wrap justify-content-center gap-3 text-muted small"> <span><i class="bi bi-gear me-1"></i>.NET 10</span> <span class="text-black-50">|</span> <span><i class="bi bi-database me-1"></i>PostgreSQL</span> <span class="text-black-50">|</span> <span><i class="bi bi-layers me-1"></i>Entity Framework Core</span> <span class="text-black-50">|</span> <span><i class="bi bi-lock me-1"></i>JWT Authentication</span> <span class="text-black-50">|</span> <span><i class="bi bi-book me-1"></i>OpenAPI / Swagger</span> </div> </div> </div> </content> </div> </main> <footer b-yjl2sbey1b class="bg-light border-top py-2 text-center text-muted small"> Wealthmax PM CRM &mdash; Policy Document Testing UI </footer> <script src="/lib/jquery/dist/jquery.min.js"></script> <script src="/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script src="/js/site.js?v=y_Ngd8W21UpuCUhEqGbUKDEqFnNfTjAfb24GhJJGUyM"></script> <script> function escapeHtml(text) { var div = document.createElement('div'); div.appendChild(document.createTextNode(text)); return div.innerHTML; } function statusBadgeClass(status) { switch ((status || '').toLowerCase()) { case 'healthy': return 'bg-success'; case 'degraded': return 'bg-warning text-dark'; default: return 'bg-danger'; } } function fetchHealth() { document.getElementById('health-loading').classList.remove('d-none'); document.getElementById('health-error').classList.add('d-none'); document.getElementById('health-content').classList.add('d-none'); fetch('/api/health') .then(function (response) { if (response.ok || response.status === 503) { return response.json(); } throw new Error('Unexpected status: ' + response.status); }) .then(function (response) { var health = response.data || response; renderHealth(health); document.getElementById('health-loading').classList.add('d-none'); document.getElementById('health-content').classList.remove('d-none'); }) .catch(function () { document.getElementById('health-loading').classList.add('d-none'); document.getElementById('health-error').classList.remove('d-none'); }); } function renderHealth(data) { var badge = document.getElementById('health-status-badge'); badge.textContent = data.status; badge.className = 'badge ' + statusBadgeClass(data.status); document.getElementById('health-timestamp').textContent = new Date(data.timestamp).toLocaleString(); document.getElementById('health-duration').textContent = data.totalDurationMs + ' ms'; var dbRow = document.getElementById('health-db-row'); if (data.databaseName || data.databaseProvider) { var parts = []; if (data.databaseName) parts.push(data.databaseName); if (data.databaseProvider) parts.push(data.databaseProvider); document.getElementById('health-database').textContent = parts.join(' on '); dbRow.classList.remove('d-none'); } else { dbRow.classList.add('d-none'); } var buildRow = document.getElementById('health-build-row'); if (data.commitHash || data.lastBuildDate) { document.getElementById('health-commit').textContent = data.commitHash || ''; document.getElementById('health-build-date').textContent = data.lastBuildDate ? '(' + new Date(data.lastBuildDate).toLocaleDateString() + ')' : ''; buildRow.classList.remove('d-none'); } else { buildRow.classList.add('d-none'); } } fetchHealth(); </script> </body> </html>
2026-07-30 18:05:47.377 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET / responded 200 in 1.4047 ms
2026-07-30 18:05:47.376 +00:00 [INF] [HTTP] [U:-] [E:-] [C:9a6464f69067] HTTP GET / 200
Req: [no body] Res: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Home — WM Policy Documents</title> <link rel="stylesheet" href="/lib/bootstrap/dist/css/bootstrap.min.css" /> <link rel="stylesheet" href="/css/site.css?v=xQHUTQJdpYJFKIjDlFCI1X8KDqtO5qaSSeJFSoCP3pA" /> <link rel="stylesheet" href="/css/commissions.css?v=ZRMXSlMSxdLsHmJCZzq1LopWaopJSbVXKu57gvUJG3w" /> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css" /> <style> /* ---- Hover-expand left sidebar -------------------------------------- */ :root { --sb-collapsed: 64px; --sb-expanded: 240px; } body.has-sidebar { /* Reserve space for the collapsed rail; the expanded panel overlays the content on hover, so the content never shifts. */ padding-left: var(--sb-collapsed); } .app-sidebar { position: fixed; top: 0; left: 0; height: 100vh; width: var(--sb-collapsed); overflow-x: hidden; overflow-y: auto; display: flex; flex-direction: column; z-index: 1045; transition: width 0.2s ease; } .app-sidebar:hover, .app-sidebar:focus-within { width: var(--sb-expanded); box-shadow: 0 0 24px rgba(0,0,0,0.35); } .app-sidebar .sb-label { white-space: nowrap; opacity: 0; transition: opacity 0.15s ease; } .app-sidebar:hover .sb-label, .app-sidebar:focus-within .sb-label { opacity: 1; } .sb-link { display: flex; align-items: center; gap: 0.85rem; padding: 0.65rem 0; color: rgba(255,255,255,0.75); text-decoration: none; border-left: 3px solid transparent; } .sb-link:hover { color: #fff; background: rgba(255,255,255,0.08); } .sb-link.active { color: #fff; background: rgba(255,255,255,0.12); border-left-color: #0d6efd; } .sb-link > i:first-child { min-width: var(--sb-collapsed); text-align: center; font-size: 1.15rem; flex-shrink: 0; } .sb-brand { display: flex; align-items: center; gap: 0.85rem; padding: 0.9rem 0; color: #fff; text-decoration: none; font-weight: 700; } .sb-brand > i:first-child { min-width: var(--sb-collapsed); text-align: center; font-size: 1.3rem; flex-shrink: 0; } /* Sub-menu (Fact-Find) */ .sb-submenu .sb-link { font-size: 0.9rem; padding-left: 0; } .sb-submenu .sb-link > i:first-child { font-size: 1rem; } .sb-caret { margin-left: auto; margin-right: 0.9rem; transition: transform 0.15s ease; } .sb-link[aria-expanded="true"] .sb-caret { transform: rotate(180deg); } </style> </head> <body class="d-flex flex-column min-vh-100 has-sidebar"> <nav b-yjl2sbey1b class="app-sidebar navbar-dark bg-dark shadow-sm"> <a class="sb-brand" href="/UI"> <i b-yjl2sbey1b class="bi bi-file-earmark-text"></i> <span b-yjl2sbey1b class="sb-label">Wealthmax</span> </a> <div b-yjl2sbey1b class="d-flex flex-column flex-grow-1"> <a class="sb-link " href="/UI/Dashboard/Index"> <i b-yjl2sbey1b class="bi bi-speedometer2"></i><span b-yjl2sbey1b class="sb-label">Dashboard</span> </a> <a class="sb-link " href="/UI/Templates/Index"> <i b-yjl2sbey1b class="bi bi-collection"></i><span b-yjl2sbey1b class="sb-label">Templates</span> </a> <a class="sb-link " href="/UI/Tokens/Index"> <i b-yjl2sbey1b class="bi bi-braces"></i><span b-yjl2sbey1b class="sb-label">Token Registry</span> </a> <a class="sb-link " href="/UI/Clients/Index"> <i b-yjl2sbey1b class="bi bi-people"></i><span b-yjl2sbey1b class="sb-label">Clients</span> </a> <a class="sb-link " href="/UI/Cases/Index"> <i b-yjl2sbey1b class="bi bi-briefcase"></i><span b-yjl2sbey1b class="sb-label">Cases</span> </a> <a class="sb-link " href="/UI/Reporting/Index"> <i b-yjl2sbey1b class="bi bi-graph-up"></i><span b-yjl2sbey1b class="sb-label">Reports</span> </a> <a class="sb-link " href="/UI/Commissions/Management"> <i b-yjl2sbey1b class="bi bi-cash-coin"></i><span b-yjl2sbey1b class="sb-label">Commissions</span> </a> <!-- User Management --> <a class="sb-link " href="/UI/Users/Index"> <i b-yjl2sbey1b class="bi bi-person-gear"></i><span b-yjl2sbey1b class="sb-label">User Management</span> </a> <!-- Fact-Find (expandable sub-menu) --> <a b-yjl2sbey1b class="sb-link " href="#ffSubmenu" role="button" data-bs-toggle="collapse" aria-expanded="false"> <i b-yjl2sbey1b class="bi bi-file-earmark-text"></i><span b-yjl2sbey1b class="sb-label">Fact-Find</span> <i b-yjl2sbey1b class="bi bi-chevron-down sb-caret sb-label"></i> </a> <div b-yjl2sbey1b class="collapse sb-submenu " id="ffSubmenu"> <a class="sb-link " href="/UI/FactFindFormatters/Index"> <i b-yjl2sbey1b class="bi bi-grid"></i><span b-yjl2sbey1b class="sb-label">Formatters</span> </a> <a class="sb-link " href="/UI/FactFindTemplates/Index"> <i b-yjl2sbey1b class="bi bi-layers"></i><span b-yjl2sbey1b class="sb-label">Templates</span> </a> <a class="sb-link " href="/UI/FactFindGenerate"> <i b-yjl2sbey1b class="bi bi-lightning-charge"></i><span b-yjl2sbey1b class="sb-label">Generate &amp; Preview</span> </a> </div> </div> <!-- Auth (pinned to bottom) --> <div b-yjl2sbey1b class="mt-auto border-top border-secondary"> <a b-yjl2sbey1b class="sb-link" href="/UI/business/login"> <i b-yjl2sbey1b class="bi bi-box-arrow-in-right"></i><span b-yjl2sbey1b class="sb-label">Business login</span> </a> </div> </nav> <main b-yjl2sbey1b class="flex-grow-1 py-4"> <div b-yjl2sbey1b class="container-fluid px-4"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css"> <style> body > nav.navbar { position: sticky; top: 0; z-index: 1030; } .dash-hero { background: linear-gradient(135deg, #212529 0%, #343a40 100%); color: #fff; } .dash-card { border: none; border-radius: 12px; transition: transform 0.15s ease, box-shadow 0.15s ease; } .dash-card:hover { transform: translateY(-3px); box-shadow: 0 8px 24px rgba(0,0,0,0.10) !important; } .dash-icon { width: 48px; height: 48px; border-radius: 12px; display: flex; align-items: center; justify-content: center; font-size: 1.4rem; } .dash-stat-value { font-size: 2rem; font-weight: 700; line-height: 1; } .dash-card-title { font-size: 0.95rem; font-weight: 600; } .dash-card-text { font-size: 0.78rem; } /* Discreet business-login link pinned to the bottom-right corner. */ .home-login-link { position: fixed; bottom: 1rem; right: 1.25rem; z-index: 1040; } </style> <!-- Hero --> <div class="dash-hero py-4 mb-4"> <div class="container text-center"> <h1 class="display-6 fw-bold mb-2">Wealthmax PM CRM</h1> <p class="lead text-white-50 mb-0" style="max-width: 640px; margin: 0 auto;"> Testing harness dashboard &mdash; system tools, integrations, and live service health at a glance. </p> </div> </div> <div class="container pb-5"> <!-- Tool / Integration cards --> <div class="row g-3 mb-4"> <!-- Tenants Created --> <div class="col-6 col-md-4 col-lg-3"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="d-flex align-items-start justify-content-between mb-2"> <div class="dash-icon bg-primary bg-opacity-10 text-primary"> <i class="bi bi-building-fill"></i> </div> <span class="badge bg-secondary bg-opacity-10 text-secondary">Sample</span> </div> <div class="dash-stat-value text-dark">12</div> <div class="dash-card-title text-dark mt-1">Tenants Created</div> <p class="dash-card-text text-muted mb-0">Total onboarded tenants in this environment.</p> </div> </div> </div> <!-- Build Logs --> <div class="col-6 col-md-4 col-lg-3"> <a href="/UI/DevLogs" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-dark bg-opacity-10 text-dark mb-2"> <i class="bi bi-terminal-fill"></i> </div> <div class="dash-card-title text-dark">Build &amp; App Logs</div> <p class="dash-card-text text-muted mb-0">Browse structured application logs by date and level.</p> </div> </div> </a> </div> <!-- Swagger --> <div class="col-6 col-md-4 col-lg-3"> <a href="/swagger" target="_blank" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="d-flex align-items-start justify-content-between mb-2"> <div class="dash-icon bg-success bg-opacity-10 text-success"> <i class="bi bi-braces"></i> </div> <i class="bi bi-box-arrow-up-right text-muted small"></i> </div> <div class="dash-card-title text-dark">Swagger / API Docs</div> <p class="dash-card-text text-muted mb-0">Explore and try the REST API via OpenAPI UI.</p> </div> </div> </a> </div> <!-- SignalR --> <div class="col-6 col-md-4 col-lg-3"> <a href="/test-signalr.html" target="_blank" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="d-flex align-items-start justify-content-between mb-2"> <div class="dash-icon bg-info bg-opacity-10 text-info"> <i class="bi bi-broadcast"></i> </div> <i class="bi bi-box-arrow-up-right text-muted small"></i> </div> <div class="dash-card-title text-dark">SignalR Hub</div> <p class="dash-card-text text-muted mb-0">Test real-time notifications over the SignalR hub.</p> </div> </div> </a> </div> <!-- iPipeline --> <div class="col-6 col-md-4 col-lg-3"> <a href="/demo/solution-builder" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-warning bg-opacity-10 text-warning mb-2"> <i class="bi bi-plug-fill"></i> </div> <div class="dash-card-title text-dark">iPipeline</div> <p class="dash-card-text text-muted mb-0">Launch the iPipeline Solution Builder integration.</p> </div> </div> </a> </div> <!-- Fetch Quotes --> <div class="col-6 col-md-4 col-lg-3"> <a href="/demo/solution-builder/events" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-danger bg-opacity-10 text-danger mb-2"> <i class="bi bi-receipt"></i> </div> <div class="dash-card-title text-dark">Fetch Quotes</div> <p class="dash-card-text text-muted mb-0">View quote-notification events returned from the pipeline.</p> </div> </div> </a> </div> <!-- CRM Dashboard --> <div class="col-6 col-md-4 col-lg-3"> <a class="text-decoration-none" href="/UI/Dashboard/Index"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-primary bg-opacity-10 text-primary mb-2"> <i class="bi bi-speedometer2"></i> </div> <div class="dash-card-title text-dark">CRM Dashboard</div> <p class="dash-card-text text-muted mb-0">Cases, clients, and commission overview metrics.</p> </div> </div> </a> </div> <!-- Clients --> <div class="col-6 col-md-4 col-lg-3"> <a class="text-decoration-none" href="/UI/Clients/Index"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-success bg-opacity-10 text-success mb-2"> <i class="bi bi-people-fill"></i> </div> <div class="dash-card-title text-dark">Clients &amp; Cases</div> <p class="dash-card-text text-muted mb-0">Manage client records and advisory cases.</p> </div> </div> </a> </div> </div> <!-- System Health --> <div id="health-card" class="card dash-card shadow-sm mb-4"> <div class="card-body p-3"> <!-- Loading state --> <div id="health-loading" class="text-center py-3"> <div class="spinner-border spinner-border-sm text-primary" role="status"> <span class="visually-hidden">Loading...</span> </div> <span class="ms-2 text-muted">Checking system health...</span> </div> <!-- Error state --> <div id="health-error" class="d-none text-center py-3"> <i class="bi bi-exclamation-triangle fs-4 text-danger d-block mb-2"></i> <p class="text-muted mb-1">Unable to reach the health endpoint.</p> <button class="btn btn-sm btn-outline-secondary" onclick="fetchHealth()"> <i class="bi bi-arrow-clockwise me-1"></i>Retry </button> </div> <!-- Success state --> <div id="health-content" class="d-none"> <div class="d-flex align-items-center mb-3"> <i class="bi bi-heart-pulse fs-4 text-primary me-2"></i> <h5 class="fw-semibold mb-0 me-auto">System Health</h5> <span id="health-status-badge" class="badge"></span> </div> <hr class="my-3"> <div class="row g-2 small"> <div class="col-sm-6"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-clock me-2"></i> <span>Checked: <span id="health-timestamp" class="text-body"></span></span> </div> </div> <div class="col-sm-6"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-speedometer2 me-2"></i> <span>Response: <span id="health-duration" class="text-body"></span></span> </div> </div> <div class="col-sm-6 d-none" id="health-db-row"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-database me-2"></i> <span>Database: <span id="health-database" class="text-body"></span></span> </div> </div> <div class="col-sm-6 d-none" id="health-build-row"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-git me-2"></i> <span>Build: <code id="health-commit"></code> <span id="health-build-date" class="text-muted"></span></span> </div> </div> </div> </div> </div> </div> <!-- Tech Stack --> <div class="text-center"> <div class="d-flex flex-wrap justify-content-center gap-3 text-muted small"> <span><i class="bi bi-gear me-1"></i>.NET 10</span> <span class="text-black-50">|</span> <span><i class="bi bi-database me-1"></i>PostgreSQL</span> <span class="text-black-50">|</span> <span><i class="bi bi-layers me-1"></i>Entity Framework Core</span> <span class="text-black-50">|</span> <span><i class="bi bi-lock me-1"></i>JWT Authentication</span> <span class="text-black-50">|</span> <span><i class="bi bi-book me-1"></i>OpenAPI / Swagger</span> </div> </div> </div> </content> </div> </main> <footer b-yjl2sbey1b class="bg-light border-top py-2 text-center text-muted small"> Wealthmax PM CRM &mdash; Policy Document Testing UI </footer> <script src="/lib/jquery/dist/jquery.min.js"></script> <script src="/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script src="/js/site.js?v=y_Ngd8W21UpuCUhEqGbUKDEqFnNfTjAfb24GhJJGUyM"></script> <script> function escapeHtml(text) { var div = document.createElement('div'); div.appendChild(document.createTextNode(text)); return div.innerHTML; } function statusBadgeClass(status) { switch ((status || '').toLowerCase()) { case 'healthy': return 'bg-success'; case 'degraded': return 'bg-warning text-dark'; default: return 'bg-danger'; } } function fetchHealth() { document.getElementById('health-loading').classList.remove('d-none'); document.getElementById('health-error').classList.add('d-none'); document.getElementById('health-content').classList.add('d-none'); fetch('/api/health') .then(function (response) { if (response.ok || response.status === 503) { return response.json(); } throw new Error('Unexpected status: ' + response.status); }) .then(function (response) { var health = response.data || response; renderHealth(health); document.getElementById('health-loading').classList.add('d-none'); document.getElementById('health-content').classList.remove('d-none'); }) .catch(function () { document.getElementById('health-loading').classList.add('d-none'); document.getElementById('health-error').classList.remove('d-none'); }); } function renderHealth(data) { var badge = document.getElementById('health-status-badge'); badge.textContent = data.status; badge.className = 'badge ' + statusBadgeClass(data.status); document.getElementById('health-timestamp').textContent = new Date(data.timestamp).toLocaleString(); document.getElementById('health-duration').textContent = data.totalDurationMs + ' ms'; var dbRow = document.getElementById('health-db-row'); if (data.databaseName || data.databaseProvider) { var parts = []; if (data.databaseName) parts.push(data.databaseName); if (data.databaseProvider) parts.push(data.databaseProvider); document.getElementById('health-database').textContent = parts.join(' on '); dbRow.classList.remove('d-none'); } else { dbRow.classList.add('d-none'); } var buildRow = document.getElementById('health-build-row'); if (data.commitHash || data.lastBuildDate) { document.getElementById('health-commit').textContent = data.commitHash || ''; document.getElementById('health-build-date').textContent = data.lastBuildDate ? '(' + new Date(data.lastBuildDate).toLocaleDateString() + ')' : ''; buildRow.classList.remove('d-none'); } else { buildRow.classList.add('d-none'); } } fetchHealth(); </script> </body> </html>
2026-07-30 18:02:30.572 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /api/health responded 200 in 23.4113 ms
2026-07-30 18:02:29.059 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /css/commissions.css responded 200 in 0.8997 ms
2026-07-30 18:02:29.058 +00:00 [INF] [HTTP] [U:-] [E:-] [C:-] HTTP GET /css/commissions.css 200
Req: [no body] Res: /* ============================================================ Wealthmax UI — scoped clean-fintech light theme Applies under .commissions-area (Commissions module) and .wm-ui-area (all other modernised UI pages) so that the design tokens and cm-* components are shared across the app without leaking into legacy Bootstrap pages. ============================================================ */ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap'); /* ── Design tokens ─────────────────────────────────────────── */ .commissions-area, .wm-ui-area { --cm-canvas: #f4f6fb; --cm-surface: #ffffff; --cm-border: #e8ecf4; --cm-border-light: #f0f3f9; --cm-radius: 14px; --cm-radius-sm: 8px; --cm-shadow: 0 1px 3px rgba(30,41,80,.06), 0 4px 16px rgba(30,41,80,.07); --cm-shadow-hover: 0 4px 12px rgba(30,41,80,.10), 0 12px 32px rgba(30,41,80,.10); --cm-font: 'Inter', system-ui, -apple-system, sans-serif; --cm-accent: #4361ee; --cm-accent-muted: #eef1fc; --cm-text: #1a2035; --cm-text-muted: #7b8ab8; --cm-text-light: #a8b4d0; --cm-green: #10b981; --cm-green-muted: #ecfdf5; --cm-amber: #f59e0b; --cm-amber-muted: #fffbeb; --cm-red: #ef4444; --cm-red-muted: #fef2f2; --cm-blue: #3b82f6; --cm-blue-muted: #eff6ff; --cm-violet: #8b5cf6; --cm-violet-muted: #f5f3ff; --cm-slate: #64748b; --cm-slate-muted: #f8fafc; font-family: var(--cm-font); background-color: var(--cm-canvas); color: var(--cm-text); } /* ── Page background (full main viewport) ───────────────────── */ .commissions-area .page-bg-fix { background: var(--cm-canvas); } /* ── Page header ────────────────────────────────────────────── */ .cm-page-head { margin-bottom: 1.75rem; } .cm-page-head h3, .cm-page-head .cm-title { font-size: 1.5rem; font-weight: 700; color: var(--cm-text); letter-spacing: -0.02em; margin: 0; } .cm-page-head .cm-subtitle { font-size: 0.8125rem; color: var(--cm-text-muted); margin-top: 0.2rem; } /* ── Preview badge (replaces the stock warning badge) ───────── */ .cm-preview-badge { display: inline-flex; align-items: center; gap: 4px; font-size: 0.7rem; font-weight: 600; letter-spacing: 0.04em; text-transform: uppercase; padding: 2px 8px; border-radius: 20px; background: #fff8e6; color: #b45309; border: 1px solid #fcd34d; vertical-align: middle; } /* ── KPI tiles ───────────────────────────────────────────────── */ .cm-kpi { background: var(--cm-surface); border-radius: var(--cm-radius); box-shadow: var(--cm-shadow); padding: 1.25rem 1.375rem; position: relative; overflow: hidden; transition: box-shadow .18s, transform .18s; border: 1px solid var(--cm-border-light); } .cm-kpi:hover { box-shadow: var(--cm-shadow-hover); transform: translateY(-2px); } .cm-kpi::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 3px; border-radius: var(--cm-radius) var(--cm-radius) 0 0; } .cm-kpi-green::before { background: linear-gradient(90deg, #10b981, #34d399); } .cm-kpi-amber::before { background: linear-gradient(90deg, #f59e0b, #fbbf24); } .cm-kpi-blue::before { background: linear-gradient(90deg, #3b82f6, #60a5fa); } .cm-kpi-red::before { background: linear-gradient(90deg, #ef4444, #f87171); } .cm-kpi-violet::before { background: linear-gradient(90deg, #8b5cf6, #a78bfa); } .cm-kpi-slate::before { background: linear-gradient(90deg, #64748b, #94a3b8); } .cm-kpi-icon { width: 36px; height: 36px; border-radius: 10px; display: flex; align-items: center; justify-content: center; font-size: 1rem; margin-bottom: 0.875rem; flex-shrink: 0; } .cm-kpi-green .cm-kpi-icon { background: var(--cm-green-muted); color: var(--cm-green); } .cm-kpi-amber .cm-kpi-icon { background: var(--cm-amber-muted); color: var(--cm-amber); } .cm-kpi-blue .cm-kpi-icon { background: var(--cm-blue-muted); color: var(--cm-blue); } .cm-kpi-red .cm-kpi-icon { background: var(--cm-red-muted); color: var(--cm-red); } .cm-kpi-violet .cm-kpi-icon { background: var(--cm-violet-muted); color: var(--cm-violet); } .cm-kpi-slate .cm-kpi-icon { background: var(--cm-slate-muted); color: var(--cm-slate); } .cm-kpi-label { font-size: 0.7rem; font-weight: 600; letter-spacing: 0.07em; text-transform: uppercase; color: var(--cm-text-muted); margin-bottom: 0.25rem; } .cm-kpi-value { font-size: 1.625rem; font-weight: 700; color: var(--cm-text); letter-spacing: -0.025em; line-height: 1.1; } .cm-kpi-sub { font-size: 0.75rem; color: var(--cm-text-muted); margin-top: 0.3rem; } /* ── Cards ───────────────────────────────────────────────────── */ .cm-card { background: var(--cm-surface); border-radius: var(--cm-radius); box-shadow: var(--cm-shadow); border: 1px solid var(--cm-border-light); overflow: hidden; } .cm-card-header { padding: 1rem 1.375rem; border-bottom: 1px solid var(--cm-border); display: flex; align-items: center; justify-content: space-between; gap: 1rem; background: var(--cm-surface); } .cm-card-header-title { font-size: 0.875rem; font-weight: 600; color: var(--cm-text); display: flex; align-items: center; gap: 0.5rem; } .cm-card-header-title i { color: var(--cm-accent); font-size: 1rem; } .cm-card-header-meta { font-size: 0.75rem; color: var(--cm-text-muted); } .cm-card-body { padding: 1.25rem 1.375rem; } /* Nav cards (dashboard) */ .cm-nav-card { background: var(--cm-surface); border-radius: var(--cm-radius); box-shadow: var(--cm-shadow); border: 1px solid var(--cm-border-light); padding: 1.25rem 1.375rem; display: flex; align-items: flex-start; gap: 1rem; text-decoration: none; transition: box-shadow .18s, transform .18s, border-color .18s; height: 100%; } .cm-nav-card:hover { box-shadow: var(--cm-shadow-hover); transform: translateY(-3px); border-color: var(--cm-accent); text-decoration: none; } .cm-nav-card-icon { width: 44px; height: 44px; border-radius: 12px; background: var(--cm-accent-muted); color: var(--cm-accent); display: flex; align-items: center; justify-content: center; font-size: 1.25rem; flex-shrink: 0; } .cm-nav-card-title { font-size: 0.9rem; font-weight: 600; color: var(--cm-text); margin-bottom: 0.25rem; } .cm-nav-card-desc { font-size: 0.78rem; color: var(--cm-text-muted); line-height: 1.4; margin: 0; } /* ── Tables ──────────────────────────────────────────────────── */ .commissions-area .cm-table, .wm-ui-area .cm-table { margin: 0; font-size: 0.8375rem; color: var(--cm-text); border-collapse: collapse; width: 100%; } .commissions-area .cm-table thead th, .wm-ui-area .cm-table thead th { background: var(--cm-canvas); color: var(--cm-text-muted); font-size: 0.7rem; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; padding: 0.75rem 1rem; border-bottom: 1px solid var(--cm-border); border-top: none; white-space: nowrap; } .commissions-area .cm-table tbody td, .wm-ui-area .cm-table tbody td { padding: 0.75rem 1rem; border-bottom: 1px solid var(--cm-border-light); vertical-align: middle; } .commissions-area .cm-table tbody tr:last-child td, .wm-ui-area .cm-table tbody tr:last-child td { border-bottom: none; } .commissions-area .cm-table tbody tr:hover td, .wm-ui-area .cm-table tbody tr:hover td { background: var(--cm-canvas); } .commissions-area .cm-table tfoot td, .wm-ui-area .cm-table tfoot td { padding: 0.75rem 1rem; border-top: 2px solid var(--cm-border); background: var(--cm-canvas); font-weight: 600; font-size: 0.8375rem; } /* ── Badges / pills ──────────────────────────────────────────── */ .cm-pill { display: inline-flex; align-items: center; gap: 3px; font-size: 0.7rem; font-weight: 600; letter-spacing: 0.02em; padding: 2px 9px; border-radius: 20px; line-height: 1.6; white-space: nowrap; } .cm-pill-green { background: var(--cm-green-muted); color: #065f46; } .cm-pill-amber { background: var(--cm-amber-muted); color: #92400e; } .cm-pill-blue { background: var(--cm-blue-muted); color: #1e40af; } .cm-pill-red { background: var(--cm-red-muted); color: #991b1b; } .cm-pill-violet { background: var(--cm-violet-muted); color: #5b21b6; } .cm-pill-slate { background: var(--cm-slate-muted); color: #334155; border: 1px solid #e2e8f0; } .cm-pill-info { background: #eff6ff; color: #1e40af; } .cm-pill-warn { background: var(--cm-amber-muted); color: #92400e; } /* ── Buttons ─────────────────────────────────────────────────── */ .commissions-area .cm-btn-back, .wm-ui-area .cm-btn-back { font-size: 0.8125rem; font-weight: 500; padding: 0.375rem 0.875rem; border-radius: var(--cm-radius-sm); border: 1px solid var(--cm-border); background: var(--cm-surface); color: var(--cm-text-muted); text-decoration: none; display: inline-flex; align-items: center; gap: 0.35rem; transition: border-color .14s, color .14s, background .14s; } .commissions-area .cm-btn-back:hover, .wm-ui-area .cm-btn-back:hover { border-color: var(--cm-accent); color: var(--cm-accent); background: var(--cm-accent-muted); text-decoration: none; } .commissions-area .cm-btn-primary, .wm-ui-area .cm-btn-primary { font-size: 0.8125rem; font-weight: 500; padding: 0.375rem 0.875rem; border-radius: var(--cm-radius-sm); border: 1px solid var(--cm-accent); background: var(--cm-accent); color: #fff; text-decoration: none; display: inline-flex; align-items: center; gap: 0.35rem; transition: opacity .14s; } .commissions-area .cm-btn-primary:hover, .wm-ui-area .cm-btn-primary:hover { opacity: 0.88; color: #fff; text-decoration: none; } .commissions-area .cm-btn-action, .wm-ui-area .cm-btn-action { font-size: 0.75rem; font-weight: 500; padding: 0.25rem 0.625rem; border-radius: 6px; border: 1px solid var(--cm-border); background: var(--cm-surface); color: var(--cm-text-muted); text-decoration: none; display: inline-flex; align-items: center; gap: 0.25rem; transition: border-color .14s, color .14s; white-space: nowrap; } .commissions-area .cm-btn-action:hover, .wm-ui-area .cm-btn-action:hover { border-color: var(--cm-accent); color: var(--cm-accent); text-decoration: none; } .commissions-area .cm-btn-action.cm-btn-action-primary, .wm-ui-area .cm-btn-action.cm-btn-action-primary { border-color: var(--cm-accent); color: var(--cm-accent); } .commissions-area .cm-btn-action.cm-btn-action-primary:hover, .wm-ui-area .cm-btn-action.cm-btn-action-primary:hover { background: var(--cm-accent-muted); } /* ── Form controls inside tables ─────────────────────────────── */ .commissions-area .cm-table .form-control, .wm-ui-area .cm-table .form-control { font-size: 0.8125rem; border-radius: 6px; border-color: var(--cm-border); background: var(--cm-canvas); color: var(--cm-text); } .commissions-area .cm-table .input-group-text, .wm-ui-area .cm-table .input-group-text { font-size: 0.8125rem; background: var(--cm-border-light); border-color: var(--cm-border); color: var(--cm-text-muted); } /* ── Info callout ────────────────────────────────────────────── */ .cm-callout { display: flex; align-items: flex-start; gap: 0.6rem; padding: 0.875rem 1rem; border-radius: var(--cm-radius-sm); font-size: 0.8rem; line-height: 1.5; border: 1px solid; } .cm-callout-info { background: var(--cm-blue-muted); border-color: #bfdbfe; color: #1e40af; } .cm-callout-warn { background: var(--cm-amber-muted); border-color: #fde68a; color: #92400e; } .cm-callout-success { background: var(--cm-green-muted); border-color: #a7f3d0; color: #065f46; } .cm-callout-danger { background: var(--cm-red-muted); border-color: #fecaca; color: #991b1b; } .cm-callout i { margin-top: 1px; flex-shrink: 0; font-size: 0.95rem; } /* ── Audit / event stream ────────────────────────────────────── */ .cm-event-list { list-style: none; padding: 0; margin: 0; } .cm-event-item { padding: 0.875rem 0; border-bottom: 1px solid var(--cm-border-light); display: flex; flex-direction: column; gap: 0.25rem; } .cm-event-item:last-child { border-bottom: none; } .cm-event-header { display: flex; justify-content: space-between; align-items: center; gap: 1rem; flex-wrap: wrap; } .cm-event-type { font-size: 0.8375rem; font-weight: 600; color: var(--cm-text); display: flex; align-items: center; gap: 0.375rem; } .cm-event-ref { font-size: 0.7rem; font-weight: 500; padding: 1px 7px; border-radius: 4px; background: var(--cm-canvas); border: 1px solid var(--cm-border); color: var(--cm-text-muted); font-family: ui-monospace, 'Cascadia Code', monospace; } .cm-event-meta { font-size: 0.75rem; color: var(--cm-text-light); white-space: nowrap; } .cm-event-detail { font-size: 0.78rem; color: var(--cm-text-muted); } /* ── Metadata row (key/value pairs) ─────────────────────────── */ .cm-meta-row { display: flex; justify-content: space-between; align-items: center; padding: 0.45rem 0; border-bottom: 1px solid var(--cm-border-light); font-size: 0.8125rem; } .cm-meta-row:last-child { border-bottom: none; } .cm-meta-label { color: var(--cm-text-muted); } .cm-meta-value { font-weight: 600; color: var(--cm-text); } /* ── Total banner (Profile page) ────────────────────────────── */ .cm-total-banner { border-radius: var(--cm-radius-sm); padding: 0.75rem 1rem; display: flex; align-items: center; gap: 0.5rem; font-size: 0.8375rem; font-weight: 500; border: 1px solid; margin-top: 1rem; } .cm-total-banner.ok { background: var(--cm-green-muted); border-color: #a7f3d0; color: #065f46; } .cm-total-banner.err { background: var(--cm-red-muted); border-color: #fecaca; color: #991b1b; } /* ── Section divider label ───────────────────────────────────── */ .cm-section-label { font-size: 0.7rem; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; color: var(--cm-text-muted); margin-bottom: 0.75rem; padding-bottom: 0.4rem; border-bottom: 1px solid var(--cm-border-light); } /* ── Tabbed output card (shared by AllocationDetail + Lifecycle) ─ */ .commissions-area .sim-tabs-card, .wm-ui-area .sim-tabs-card { overflow: visible; } .commissions-area .sim-tabnav, .wm-ui-area .sim-tabnav { display: flex; gap: 2px; padding: 0 0.5rem; border-bottom: 1px solid var(--cm-border); background: var(--cm-canvas); border-radius: var(--cm-radius) var(--cm-radius) 0 0; flex-wrap: wrap; } .commissions-area .sim-tab, .wm-ui-area .sim-tab { position: relative; border: none; background: transparent; cursor: pointer; font-size: 0.8125rem; font-weight: 600; color: var(--cm-text-muted); padding: 0.75rem 0.95rem; display: inline-flex; align-items: center; gap: 0.4rem; border-bottom: 2px solid transparent; margin-bottom: -1px; transition: color .14s, border-color .14s; } .commissions-area .sim-tab i, .wm-ui-area .sim-tab i { font-size: 0.9rem; } .commissions-area .sim-tab:hover, .wm-ui-area .sim-tab:hover { color: var(--cm-text); } .commissions-area .sim-tab.is-active, .wm-ui-area .sim-tab.is-active { color: var(--cm-accent); border-bottom-color: var(--cm-accent); } .commissions-area .sim-tab-sub, .wm-ui-area .sim-tab-sub { font-weight: 400; color: var(--cm-text-muted); font-size: 0.75rem; } .commissions-area .sim-tab-count, .wm-ui-area .sim-tab-count { font-size: 0.68rem; font-weight: 700; line-height: 1; padding: 2px 6px; border-radius: 20px; background: var(--cm-accent-muted); color: var(--cm-accent); } .commissions-area .sim-tabpanel, .wm-ui-area .sim-tabpanel { display: none; } .commissions-area .sim-tabpanel.is-active, .wm-ui-area .sim-tabpanel.is-active { display: block; } /* Toolbar strip inside a panel (legend / heading row) */ .commissions-area .sim-panel-toolbar, .wm-ui-area .sim-panel-toolbar { padding: 0.75rem 1.375rem; border-bottom: 1px solid var(--cm-border-light); background: var(--cm-surface); } .commissions-area .sim-panel-toolbar-between, .wm-ui-area .sim-panel-toolbar-between { display: flex; align-items: center; justify-content: space-between; gap: 1rem; flex-wrap: wrap; } .commissions-area .sim-panel-heading, .wm-ui-area .sim-panel-heading { font-size: 0.8rem; font-weight: 600; color: var(--cm-text); } /* Stronger totals band in a ledger footer */ .commissions-area .cm-table.cm-table-totals tfoot td, .wm-ui-area .cm-table.cm-table-totals tfoot td { border-top: 2px solid var(--cm-accent); background: var(--cm-accent-muted); color: var(--cm-text); } .commissions-area .cm-table.cm-table-totals tfoot td:first-child, .wm-ui-area .cm-table.cm-table-totals tfoot td:first-child { text-transform: uppercase; letter-spacing: 0.05em; font-size: 0.72rem; color: var(--cm-accent); } /* Bounded event-log items so entries don't blend together */ .commissions-area .cm-event-list.cm-event-list-cards .cm-event-item, .wm-ui-area .cm-event-list.cm-event-list-cards .cm-event-item { padding: 0.75rem 0.85rem; margin-bottom: 0.55rem; border: 1px solid var(--cm-border-light); border-left-width: 3px; border-radius: var(--cm-radius-sm); background: var(--cm-surface); } .commissions-area .cm-event-list.cm-event-list-cards .cm-event-item:last-child, .wm-ui-area .cm-event-list.cm-event-list-cards .cm-event-item:last-child { margin-bottom: 0; } /* ── Chart legend ────────────────────────────────────────────── */ .cm-legend { display: flex; gap: 1.25rem; flex-wrap: wrap; font-size: 0.75rem; color: var(--cm-text-muted); align-items: center; } .cm-legend-item { display: flex; align-items: center; gap: 5px; } .cm-legend-dot { width: 10px; height: 10px; border-radius: 3px; display: inline-block; flex-shrink: 0; } .cm-legend-dot-circle { border-radius: 50%; } /* ── Form controls (wm-ui-area pages: Reporting, Templates, etc.) */ .wm-ui-area .form-control, .wm-ui-area .form-select { font-size: 0.8375rem; border-color: var(--cm-border); border-radius: var(--cm-radius-sm); background: var(--cm-surface); color: var(--cm-text); } .wm-ui-area .form-control:focus, .wm-ui-area .form-select:focus { border-color: var(--cm-accent); box-shadow: 0 0 0 3px rgba(67,97,238,.12); } .wm-ui-area .form-label { font-size: 0.8rem; font-weight: 600; color: var(--cm-text-muted); letter-spacing: 0.02em; } .wm-ui-area .form-check-input:checked { background-color: var(--cm-accent); border-color: var(--cm-accent); } /* ── Status badge override (replaces Bootstrap badge) ─────────── */ .wm-ui-area .cm-status-active { background: var(--cm-green-muted); color: #065f46; } .wm-ui-area .cm-status-inactive { background: var(--cm-slate-muted); color: #334155; border: 1px solid #e2e8f0; } .wm-ui-area .cm-status-system { background: var(--cm-blue-muted); color: #1e40af; } /* ── Pagination ─────────────────────────────────────────────── */ .wm-ui-area .pagination .page-link { font-size: 0.8rem; color: var(--cm-text-muted); border-color: var(--cm-border); background: var(--cm-surface); } .wm-ui-area .pagination .page-item.active .page-link { background: var(--cm-accent); border-color: var(--cm-accent); color: #fff; } /* ── Upload Commission Statement modal ─────────────────────────── */ .cm-upload-modal { border-radius: var(--cm-radius); border: 1px solid var(--cm-border); } .cm-upload-icon { width: 44px; height: 44px; flex-shrink: 0; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: var(--cm-accent-muted); color: var(--cm-accent); font-size: 1.1rem; } .cm-upload-template-card { display: flex; align-items: center; gap: 0.75rem; padding: 0.875rem 1rem; margin: 1rem 0; border-radius: var(--cm-radius-sm); background: var(--cm-canvas); border: 1px solid var(--cm-border-light); } .cm-upload-template-icon { width: 34px; height: 34px; flex-shrink: 0; border-radius: var(--cm-radius-sm); display: flex; align-items: center; justify-content: center; background: var(--cm-green-muted); color: var(--cm-green); } .cm-upload-template-text { flex: 1 1 auto; } .cm-upload-template-title { font-size: 0.8375rem; font-weight: 600; color: var(--cm-text); } .cm-upload-template-desc { font-size: 0.75rem; color: var(--cm-text-muted); } .cm-upload-segment { display: flex; gap: 0.5rem; margin-bottom: 1rem; } .cm-upload-segment-btn { display: inline-flex; align-items: center; gap: 0.4rem; font-size: 0.8125rem; font-weight: 600; padding: 0.4rem 1rem; border-radius: 20px; border: 1px solid var(--cm-border); background: var(--cm-surface); color: var(--cm-text-muted); transition: border-color .14s, color .14s, background .14s; } .cm-upload-segment-btn.is-active { background: var(--cm-accent); border-color: var(--cm-accent); color: #fff; } .cm-upload-segment-btn:disabled { opacity: 0.55; cursor: not-allowed; } .cm-upload-dropzone { border: 2px dashed var(--cm-border); border-radius: var(--cm-radius-sm); background: var(--cm-canvas); padding: 2rem 1rem; text-align: center; cursor: pointer; transition: border-color .14s, background .14s; margin-bottom: 1rem; } .cm-upload-dropzone.is-dragover { border-color: var(--cm-accent); background: var(--cm-accent-muted); } .cm-upload-dropzone-icon { display: inline-flex; width: 44px; height: 44px; align-items: center; justify-content: center; border-radius: 50%; background: var(--cm-accent-muted); color: var(--cm-accent); font-size: 1.25rem; margin-bottom: 0.6rem; } .cm-upload-dropzone-text { font-size: 0.8375rem; color: var(--cm-text); } .cm-upload-link { background: none; border: none; padding: 0; color: var(--cm-accent); font-weight: 600; font-size: 0.8375rem; } .cm-upload-dropzone-hint { font-size: 0.72rem; color: var(--cm-text-light); margin-top: 0.3rem; } .cm-upload-file { display: flex; align-items: flex-start; gap: 0.75rem; padding: 0.875rem 1rem; margin-bottom: 1rem; border-radius: var(--cm-radius-sm); background: var(--cm-surface); border: 1px solid var(--cm-border); } .cm-upload-file-icon { width: 34px; height: 34px; flex-shrink: 0; border-radius: var(--cm-radius-sm); display: flex; align-items: center; justify-content: center; background: var(--cm-green-muted); color: var(--cm-green); } .cm-upload-file-info { flex: 1 1 auto; min-width: 0; } .cm-upload-file-name { font-size: 0.8375rem; font-weight: 600; color: var(--cm-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .cm-upload-file-size { font-size: 0.72rem; color: var(--cm-text-muted); margin-bottom: 0.4rem; } .cm-upload-file-actions { display: flex; gap: 0.5rem; flex-shrink: 0; } .cm-upload-remove-btn:hover { border-color: var(--cm-red) !important; color: var(--cm-red) !important; background: var(--cm-red-muted) !important; } .cm-upload-progress { height: 6px; border-radius: 4px; background: var(--cm-border-light); overflow: hidden; } .cm-upload-progress-bar { height: 100%; width: 0%; background: var(--cm-accent); border-radius: 4px; transition: width .2s ease; } /* ── State panels ────────────────────────────────────────────── */ .cm-upload-alert { border-radius: var(--cm-radius-sm); border: 1px solid; padding: 1rem; margin-bottom: 1rem; } .cm-upload-alert--error { background: var(--cm-red-muted); border-color: #fecaca; } .cm-upload-alert--warning { background: var(--cm-amber-muted); border-color: #fde68a; } .cm-upload-alert--success { background: var(--cm-green-muted); border-color: #a7f3d0; display: flex; align-items: center; gap: 0.6rem; color: #065f46; font-size: 0.8375rem; font-weight: 500; } .cm-upload-alert--success i { font-size: 1.1rem; } .cm-upload-alert-header { display: flex; align-items: center; gap: 0.5rem; font-size: 0.8375rem; font-weight: 600; color: var(--cm-text); margin-bottom: 0.5rem; } .cm-upload-alert--error .cm-upload-alert-header i { color: var(--cm-red); } .cm-upload-alert--warning .cm-upload-alert-header i { color: var(--cm-amber); } .cm-upload-warning-list { margin: 0 0 0.85rem; padding-left: 1.1rem; font-size: 0.8rem; color: #92400e; } .cm-upload-warning-list li { margin-bottom: 0.2rem; } .cm-upload-review-btn { font-size: 0.8125rem; } .cm-upload-stats { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 0.6rem; margin-bottom: 0.85rem; } .cm-upload-stat { background: var(--cm-surface); border: 1px solid var(--cm-border-light); border-radius: var(--cm-radius-sm); padding: 0.6rem 0.7rem; text-align: center; } .cm-upload-stat-label { font-size: 0.65rem; color: var(--cm-text-muted); text-transform: uppercase; letter-spacing: 0.03em; margin-bottom: 0.2rem; } .cm-upload-stat-value { font-size: 1.15rem; font-weight: 700; color: var(--cm-text); margin-bottom: 0.3rem; } .cm-upload-section-label { font-size: 0.75rem; font-weight: 600; color: var(--cm-text); margin-bottom: 0.5rem; } /* ── Warning review table ────────────────────────────────────── */ .cm-upload-review { border-radius: var(--cm-radius-sm); border: 1px solid #fde68a; background: var(--cm-amber-muted); padding: 1rem; margin-bottom: 1rem; } .cm-upload-review-header { display: flex; justify-content: space-between; align-items: flex-start; gap: 1rem; flex-wrap: wrap; margin-bottom: 0.75rem; } .cm-upload-review-actions { display: flex; gap: 0.5rem; flex-shrink: 0; } .cm-upload-skipall-btn:hover { border-color: var(--cm-red) !important; color: var(--cm-red) !important; } .cm-upload-review-progress { display: flex; align-items: center; gap: 0.75rem; font-size: 0.75rem; color: #92400e; font-weight: 500; margin-bottom: 0.85rem; } .cm-upload-review-progress .cm-upload-progress { flex: 1 1 auto; background: rgba(255,255,255,.6); } .cm-upload-review .cm-table { background: var(--cm-surface); } .cm-upload-muted { color: var(--cm-text-light); } .cm-upload-subtext { font-size: 0.7rem; color: var(--cm-text-muted); margin-top: 1px; } .cm-upload-kebab-btn { width: 28px; height: 28px; display: inline-flex; align-items: center; justify-content: center; border-radius: 6px; border: 1px solid var(--cm-border); background: var(--cm-surface); color: var(--cm-text-muted); } .cm-upload-kebab-btn:hover { border-color: var(--cm-accent); color: var(--cm-accent); } .cm-upload-fix-row input.form-control { font-size: 0.8125rem; } .cm-upload-fix-inputs { display: flex; gap: 0.4rem; } .cm-upload-fix-inputs input.form-control { flex: 1 1 0; min-width: 0; } .cm-upload-fix-error { margin-top: 0.3rem; font-size: 0.75rem; color: var(--cm-red); } .cm-upload-fix-actions { display: flex; gap: 0.35rem; justify-content: flex-end; } .cm-upload-fix-actions button { width: 28px; height: 28px; display: inline-flex; align-items: center; justify-content: center; border-radius: 6px; border: 1px solid var(--cm-border); background: var(--cm-surface); color: var(--cm-text-muted); } .cm-upload-fix-confirm:hover { border-color: var(--cm-green); color: var(--cm-green); } .cm-upload-fix-cancel:hover { border-color: var(--cm-red); color: var(--cm-red); } .cm-upload-fix-trigger:hover { border-color: var(--cm-accent); color: var(--cm-accent); } .cm-upload-skip-trigger:hover { border-color: var(--cm-red); color: var(--cm-red); } .cm-upload-tips { margin-top: 0.25rem; } @media (max-width: 640px) { .cm-upload-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); } .cm-upload-review-header { flex-direction: column; } } /* ============================================================ Commission Allocation Management page (tabs, bulk-action bar, filters, expandable rows, pagination, Overwrite modal) ============================================================ */ /* ── Segment toggle (Protection / Mortgage) ─────────────────── */ .cm-segment-toggle { display: inline-flex; gap: 0.35rem; background: var(--cm-slate-muted); border: 1px solid var(--cm-border); border-radius: 999px; padding: 3px; } .cm-segment-btn { display: inline-flex; align-items: center; gap: 0.35rem; border: none; background: transparent; color: var(--cm-text-muted); font-size: 0.8125rem; font-weight: 600; padding: 0.4rem 0.9rem; border-radius: 999px; white-space: nowrap; } .cm-segment-btn.is-active { background: var(--cm-surface); color: var(--cm-accent); box-shadow: var(--cm-shadow); } .cm-segment-btn:disabled { opacity: 0.5; cursor: not-allowed; } /* ── Tab strip ───────────────────────────────────────────────── */ .cm-tabstrip { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 0.75rem; background: var(--cm-surface); border: 1px solid var(--cm-border); border-radius: var(--cm-radius-sm); padding: 0.5rem; margin-bottom: 0.75rem; } .cm-tabstrip-tabs { display: flex; flex-wrap: wrap; gap: 0.3rem; } .cm-tab-btn { display: inline-flex; align-items: center; gap: 0.4rem; border: none; background: transparent; color: var(--cm-text-muted); font-size: 0.8125rem; font-weight: 600; padding: 0.5rem 0.9rem; border-radius: var(--cm-radius-sm); } .cm-tab-btn:hover { background: var(--cm-slate-muted); color: var(--cm-text); } .cm-tab-btn.is-active { background: var(--cm-accent); color: #fff; } .cm-tab-count { display: inline-flex; align-items: center; justify-content: center; min-width: 20px; height: 20px; padding: 0 5px; border-radius: 999px; background: rgba(255,255,255,.25); font-size: 0.7rem; font-weight: 700; } .cm-tab-btn:not(.is-active) .cm-tab-count { background: var(--cm-accent-muted); color: var(--cm-accent); } /* ── Bulk-allocate action bar (Unallocated tab) ─────────────── */ .cm-bulk-bar { display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap; } .cm-bulk-bar label { font-size: 0.8125rem; font-weight: 600; color: var(--cm-text-muted); white-space: nowrap; } .cm-bulk-bar .form-control, .cm-bulk-bar .form-select { font-size: 0.8125rem; padding: 0.4rem 0.65rem; } /* ── Filter row ──────────────────────────────────────────────── */ .cm-filter-row { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; margin-bottom: 0.75rem; } .cm-filter-row .form-control, .cm-filter-row .form-select { font-size: 0.8125rem; padding: 0.45rem 0.75rem; border-color: var(--cm-border); } .cm-filter-search { position: relative; flex: 1 1 220px; max-width: 280px; } .cm-filter-search i { position: absolute; left: 0.7rem; top: 50%; transform: translateY(-50%); color: var(--cm-text-light); font-size: 0.8rem; } .cm-filter-search input { padding-left: 2rem; } .cm-reset-link { color: var(--cm-red); font-size: 0.8125rem; font-weight: 600; background: none; border: none; display: inline-flex; align-items: center; gap: 0.3rem; } /* ── Expandable line rows ───────────────────────────────────── */ .cm-expand-toggle { border: none; background: none; color: var(--cm-accent); display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px; border-radius: 6px; } .cm-expand-toggle:hover { background: var(--cm-accent-muted); } .cm-expand-toggle i { transition: transform .15s ease; } .cm-expand-toggle.is-open i { transform: rotate(90deg); } .cm-row-subtext { font-size: 0.7rem; color: var(--cm-text-muted); margin-top: 1px; } .cm-row-link { color: var(--cm-accent); font-weight: 600; text-decoration: none; } .cm-breakdown-row td { background: var(--cm-slate-muted); padding: 0 !important; } .cm-breakdown-panel { padding: 0.9rem 1.1rem 1.1rem; } .cm-breakdown-title { font-size: 0.75rem; font-weight: 700; color: var(--cm-text-muted); text-transform: uppercase; letter-spacing: .03em; margin-bottom: 0.5rem; } /* ── Pagination footer ──────────────────────────────────────── */ .cm-pagination-footer { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 0.5rem; padding: 0.85rem 1.1rem; font-size: 0.8125rem; color: var(--cm-text-muted); } .cm-pagination-pages { display: flex; align-items: center; gap: 0.25rem; } .cm-page-btn { min-width: 30px; height: 30px; padding: 0 0.4rem; border-radius: 7px; border: 1px solid var(--cm-border); background: var(--cm-surface); color: var(--cm-text-muted); font-size: 0.8125rem; font-weight: 600; } .cm-page-btn:hover:not(:disabled) { border-color: var(--cm-accent); color: var(--cm-accent); } .cm-page-btn.is-active { background: var(--cm-accent); border-color: var(--cm-accent); color: #fff; } .cm-page-btn:disabled { opacity: 0.4; cursor: not-allowed; } /* ── Overwrite modal ─────────────────────────────────────────── */ .cm-overwrite-list { border: 1px solid var(--cm-blue); border-radius: var(--cm-radius-sm); overflow: hidden; } .cm-overwrite-row { display: grid; grid-template-columns: 1fr 1.4fr 0.9fr; gap: 0.75rem; align-items: center; padding: 0.6rem 0.9rem; border-bottom: 1px dashed var(--cm-border); } .cm-overwrite-row:last-child { border-bottom: none; } .cm-overwrite-row-label { font-size: 0.8125rem; font-weight: 600; color: var(--cm-text); } .cm-overwrite-pct-input { position: relative; } .cm-overwrite-pct-input input { padding-right: 1.75rem; } .cm-overwrite-pct-input i { position: absolute; right: 0.65rem; top: 50%; transform: translateY(-50%); color: var(--cm-text-light); font-size: 0.75rem; } .cm-overwrite-total { font-size: 0.75rem; font-weight: 600; margin-top: 0.5rem; text-align: right; } .cm-overwrite-total.is-invalid { color: var(--cm-red); } .cm-overwrite-total.is-valid { color: var(--cm-green); } .cm-empty-state { text-align: center; padding: 2.5rem 1rem; color: var(--cm-text-muted); font-size: 0.8125rem; } .cm-checkbox { width: 16px; height: 16px; cursor: pointer; } @media (max-width: 992px) { .cm-overwrite-row { grid-template-columns: 1fr; gap: 0.35rem; } } /* ── Responsive tweaks ───────────────────────────────────────── */ @media (max-width: 576px) { .cm-kpi-value { font-size: 1.25rem; } .cm-page-head h3, .cm-page-head .cm-title { font-size: 1.25rem; } }
2026-07-30 18:02:27.541 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /lib/bootstrap/dist/js/bootstrap.bundle.min.js responded 200 in 1.3373 ms
2026-07-30 18:02:27.540 +00:00 [INF] [HTTP] [U:-] [E:-] [C:-] HTTP GET /lib/bootstrap/dist/js/bootstrap.bundle.min.js 200
Req: [no body] Res: /*! * Bootstrap v5.3.3 (https://getbootstrap.com/) * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t=new Map,e={set(e,i,n){t.has(e)||t.set(e,new Map);const s=t.get(e);s.has(i)||0===s.size?s.set(i,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(e,i)=>t.has(e)&&t.get(e).get(i)||null,remove(e,i){if(!t.has(e))return;const n=t.get(e);n.delete(i),0===n.size&&t.delete(e)}},i="transitionend",n=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),s=t=>{t.dispatchEvent(new Event(i))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(n(t)):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,m=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},g=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,_=(t,e,n=!0)=>{if(!n)return void g(t);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let r=!1;const a=({target:n})=>{n===e&&(r=!0,e.removeEventListener(i,a),g(t))};e.addEventListener(i,a),setTimeout((()=>{r||s(e)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=I(t);return C.has(o)||(o=t),[n,s,o]}function S(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return P(s,{delegateTarget:r}),n.oneOff&&N.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return P(n,{delegateTarget:t}),i.oneOff&&N.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function D(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function $(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&D(t,e,i,r.callable,r.delegationSelector)}function I(t){return t=t.replace(y,""),T[t]||t}const N={on(t,e,i,n){S(t,e,i,n,!1)},one(t,e,i,n){S(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))$(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(w,"");a&&!e.includes(s)||D(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;D(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==I(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=P(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function P(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function j(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function M(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const F={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${M(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${M(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=j(t.dataset[n])}return e},getDataAttribute:(t,e)=>j(t.getAttribute(`data-bs-${M(e)}`))};class H{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?F.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?F.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],r=o(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(r))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`)}var i}}class W extends H{constructor(t,i){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(i),e.set(this._element,this.constructor.DATA_KEY,this))}dispose(){e.remove(this._element,this.constructor.DATA_KEY),N.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return e.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.3"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const B=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e?e.split(",").map((t=>n(t))).join(","):null},z={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))},getSelectorFromElement(t){const e=B(t);return e&&z.findOne(e)?e:null},getElementFromSelector(t){const e=B(t);return e?z.findOne(e):null},getMultipleElementsFromSelector(t){const e=B(t);return e?z.find(e):[]}},R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;N.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const s=z.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},q=".bs.alert",V=`close${q}`,K=`closed${q}`;class Q extends W{static get NAME(){return"alert"}close(){if(N.trigger(this._element,V).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),N.trigger(this._element,K),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Q.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(Q,"close"),m(Q);const X='[data-bs-toggle="button"]';class Y extends W{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=Y.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}N.on(document,"click.bs.button.data-api",X,(t=>{t.preventDefault();const e=t.target.closest(X);Y.getOrCreateInstance(e).toggle()})),m(Y);const U=".bs.swipe",G=`touchstart${U}`,J=`touchmove${U}`,Z=`touchend${U}`,tt=`pointerdown${U}`,et=`pointerup${U}`,it={endCallback:null,leftCallback:null,rightCallback:null},nt={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class st extends H{constructor(t,e){super(),this._element=t,t&&st.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return it}static get DefaultType(){return nt}static get NAME(){return"swipe"}dispose(){N.off(this._element,U)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),g(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&g(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(N.on(this._element,tt,(t=>this._start(t))),N.on(this._element,et,(t=>this._end(t))),this._element.classList.add("pointer-event")):(N.on(this._element,G,(t=>this._start(t))),N.on(this._element,J,(t=>this._move(t))),N.on(this._element,Z,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const ot=".bs.carousel",rt=".data-api",at="next",lt="prev",ct="left",ht="right",dt=`slide${ot}`,ut=`slid${ot}`,ft=`keydown${ot}`,pt=`mouseenter${ot}`,mt=`mouseleave${ot}`,gt=`dragstart${ot}`,_t=`load${ot}${rt}`,bt=`click${ot}${rt}`,vt="carousel",yt="active",wt=".active",At=".carousel-item",Et=wt+At,Tt={ArrowLeft:ht,ArrowRight:ct},Ct={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Ot={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class xt extends W{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=z.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===vt&&this.cycle()}static get Default(){return Ct}static get DefaultType(){return Ot}static get NAME(){return"carousel"}next(){this._slide(at)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(lt)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?N.one(this._element,ut,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void N.one(this._element,ut,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?at:lt;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&N.on(this._element,ft,(t=>this._keydown(t))),"hover"===this._config.pause&&(N.on(this._element,pt,(()=>this.pause())),N.on(this._element,mt,(()=>this._maybeEnableCycle()))),this._config.touch&&st.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of z.find(".carousel-item img",this._element))N.on(t,gt,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(ct)),rightCallback:()=>this._slide(this._directionToOrder(ht)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new st(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=Tt[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=z.findOne(wt,this._indicatorsElement);e.classList.remove(yt),e.removeAttribute("aria-current");const i=z.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(yt),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===at,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>N.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(dt).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(yt),i.classList.remove(yt,c,l),this._isSliding=!1,r(ut)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return z.findOne(Et,this._element)}_getItems(){return z.find(At,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===ct?lt:at:t===ct?at:lt}_orderToDirection(t){return p()?t===lt?ct:ht:t===lt?ht:ct}static jQueryInterface(t){return this.each((function(){const e=xt.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}N.on(document,bt,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=z.getElementFromSelector(this);if(!e||!e.classList.contains(vt))return;t.preventDefault();const i=xt.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===F.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),N.on(window,_t,(()=>{const t=z.find('[data-bs-ride="carousel"]');for(const e of t)xt.getOrCreateInstance(e)})),m(xt);const kt=".bs.collapse",Lt=`show${kt}`,St=`shown${kt}`,Dt=`hide${kt}`,$t=`hidden${kt}`,It=`click${kt}.data-api`,Nt="show",Pt="collapse",jt="collapsing",Mt=`:scope .${Pt} .${Pt}`,Ft='[data-bs-toggle="collapse"]',Ht={parent:null,toggle:!0},Wt={parent:"(null|element)",toggle:"boolean"};class Bt extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=z.find(Ft);for(const t of i){const e=z.getSelectorFromElement(t),i=z.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Ht}static get DefaultType(){return Wt}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Bt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(N.trigger(this._element,Lt).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Pt),this._element.classList.add(jt),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(jt),this._element.classList.add(Pt,Nt),this._element.style[e]="",N.trigger(this._element,St)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(N.trigger(this._element,Dt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(jt),this._element.classList.remove(Pt,Nt);for(const t of this._triggerArray){const e=z.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(jt),this._element.classList.add(Pt),N.trigger(this._element,$t)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(Nt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Ft);for(const e of t){const t=z.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=z.find(Mt,this._config.parent);return z.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Bt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}N.on(document,It,Ft,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of z.getMultipleElementsFromSelector(this))Bt.getOrCreateInstance(t,{toggle:!1}).toggle()})),m(Bt);var zt="top",Rt="bottom",qt="right",Vt="left",Kt="auto",Qt=[zt,Rt,qt,Vt],Xt="start",Yt="end",Ut="clippingParents",Gt="viewport",Jt="popper",Zt="reference",te=Qt.reduce((function(t,e){return t.concat([e+"-"+Xt,e+"-"+Yt])}),[]),ee=[].concat(Qt,[Kt]).reduce((function(t,e){return t.concat([e,e+"-"+Xt,e+"-"+Yt])}),[]),ie="beforeRead",ne="read",se="afterRead",oe="beforeMain",re="main",ae="afterMain",le="beforeWrite",ce="write",he="afterWrite",de=[ie,ne,se,oe,re,ae,le,ce,he];function ue(t){return t?(t.nodeName||"").toLowerCase():null}function fe(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function pe(t){return t instanceof fe(t).Element||t instanceof Element}function me(t){return t instanceof fe(t).HTMLElement||t instanceof HTMLElement}function ge(t){return"undefined"!=typeof ShadowRoot&&(t instanceof fe(t).ShadowRoot||t instanceof ShadowRoot)}const _e={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];me(s)&&ue(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});me(n)&&ue(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function be(t){return t.split("-")[0]}var ve=Math.max,ye=Math.min,we=Math.round;function Ae(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function Ee(){return!/^((?!chrome|android).)*safari/i.test(Ae())}function Te(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&me(t)&&(s=t.offsetWidth>0&&we(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&we(n.height)/t.offsetHeight||1);var r=(pe(t)?fe(t):window).visualViewport,a=!Ee()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function Ce(t){var e=Te(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Oe(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&ge(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function xe(t){return fe(t).getComputedStyle(t)}function ke(t){return["table","td","th"].indexOf(ue(t))>=0}function Le(t){return((pe(t)?t.ownerDocument:t.document)||window.document).documentElement}function Se(t){return"html"===ue(t)?t:t.assignedSlot||t.parentNode||(ge(t)?t.host:null)||Le(t)}function De(t){return me(t)&&"fixed"!==xe(t).position?t.offsetParent:null}function $e(t){for(var e=fe(t),i=De(t);i&&ke(i)&&"static"===xe(i).position;)i=De(i);return i&&("html"===ue(i)||"body"===ue(i)&&"static"===xe(i).position)?e:i||function(t){var e=/firefox/i.test(Ae());if(/Trident/i.test(Ae())&&me(t)&&"fixed"===xe(t).position)return null;var i=Se(t);for(ge(i)&&(i=i.host);me(i)&&["html","body"].indexOf(ue(i))<0;){var n=xe(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Ie(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Ne(t,e,i){return ve(t,ye(e,i))}function Pe(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function je(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const Me={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=be(i.placement),l=Ie(a),c=[Vt,qt].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return Pe("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:je(t,Qt))}(s.padding,i),d=Ce(o),u="y"===l?zt:Vt,f="y"===l?Rt:qt,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=$e(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=Ne(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Oe(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Fe(t){return t.split("-")[1]}var He={top:"auto",right:"auto",bottom:"auto",left:"auto"};function We(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,m=void 0===p?0:p,g="function"==typeof h?h({x:f,y:m}):{x:f,y:m};f=g.x,m=g.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=Vt,y=zt,w=window;if(c){var A=$e(i),E="clientHeight",T="clientWidth";A===fe(i)&&"static"!==xe(A=Le(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===zt||(s===Vt||s===qt)&&o===Yt)&&(y=Rt,m-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,m*=l?1:-1),s!==Vt&&(s!==zt&&s!==Rt||o!==Yt)||(v=qt,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&He),x=!0===h?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:we(i*s)/s||0,y:we(n*s)/s||0}}({x:f,y:m},fe(i)):{x:f,y:m};return f=x.x,m=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?m+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const Be={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:be(e.placement),variation:Fe(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,We(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,We(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var ze={passive:!0};const Re={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=fe(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,ze)})),a&&l.addEventListener("resize",i.update,ze),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,ze)})),a&&l.removeEventListener("resize",i.update,ze)}},data:{}};var qe={left:"right",right:"left",bottom:"top",top:"bottom"};function Ve(t){return t.replace(/left|right|bottom|top/g,(function(t){return qe[t]}))}var Ke={start:"end",end:"start"};function Qe(t){return t.replace(/start|end/g,(function(t){return Ke[t]}))}function Xe(t){var e=fe(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Ye(t){return Te(Le(t)).left+Xe(t).scrollLeft}function Ue(t){var e=xe(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ge(t){return["html","body","#document"].indexOf(ue(t))>=0?t.ownerDocument.body:me(t)&&Ue(t)?t:Ge(Se(t))}function Je(t,e){var i;void 0===e&&(e=[]);var n=Ge(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=fe(n),r=s?[o].concat(o.visualViewport||[],Ue(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Je(Se(r)))}function Ze(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function ti(t,e,i){return e===Gt?Ze(function(t,e){var i=fe(t),n=Le(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Ee();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+Ye(t),y:l}}(t,i)):pe(e)?function(t,e){var i=Te(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):Ze(function(t){var e,i=Le(t),n=Xe(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=ve(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=ve(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+Ye(t),l=-n.scrollTop;return"rtl"===xe(s||i).direction&&(a+=ve(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Le(t)))}function ei(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?be(s):null,r=s?Fe(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case zt:e={x:a,y:i.y-n.height};break;case Rt:e={x:a,y:i.y+i.height};break;case qt:e={x:i.x+i.width,y:l};break;case Vt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?Ie(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case Xt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Yt:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ii(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?Ut:a,c=i.rootBoundary,h=void 0===c?Gt:c,d=i.elementContext,u=void 0===d?Jt:d,f=i.altBoundary,p=void 0!==f&&f,m=i.padding,g=void 0===m?0:m,_=Pe("number"!=typeof g?g:je(g,Qt)),b=u===Jt?Zt:Jt,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=Je(Se(t)),i=["absolute","fixed"].indexOf(xe(t).position)>=0&&me(t)?$e(t):t;return pe(i)?e.filter((function(t){return pe(t)&&Oe(t,i)&&"body"!==ue(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=ti(t,i,n);return e.top=ve(s.top,e.top),e.right=ye(s.right,e.right),e.bottom=ye(s.bottom,e.bottom),e.left=ve(s.left,e.left),e}),ti(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(pe(y)?y:y.contextElement||Le(t.elements.popper),l,h,r),A=Te(t.elements.reference),E=ei({reference:A,element:v,strategy:"absolute",placement:s}),T=Ze(Object.assign({},v,E)),C=u===Jt?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===Jt&&x){var k=x[s];Object.keys(O).forEach((function(t){var e=[qt,Rt].indexOf(t)>=0?1:-1,i=[zt,Rt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function ni(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?ee:l,h=Fe(n),d=h?a?te:te.filter((function(t){return Fe(t)===h})):Qt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ii(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[be(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const si={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=be(g),b=l||(_!==g&&p?function(t){if(be(t)===Kt)return[];var e=Ve(t);return[Qe(t),e,Qe(e)]}(g):[Ve(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(be(i)===Kt?ni(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C<v.length;C++){var O=v[C],x=be(O),k=Fe(O)===Xt,L=[zt,Rt].indexOf(x)>=0,S=L?"width":"height",D=ii(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),$=L?k?qt:Vt:k?Rt:zt;y[S]>w[S]&&($=Ve($));var I=Ve($),N=[];if(o&&N.push(D[x]<=0),a&&N.push(D[$]<=0,D[I]<=0),N.every((function(t){return t}))){T=O,E=!1;break}A.set(O,N)}if(E)for(var P=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},j=p?3:1;j>0&&"break"!==P(j);j--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function oi(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function ri(t){return[zt,qt,Rt,Vt].some((function(e){return t[e]>=0}))}const ai={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ii(e,{elementContext:"reference"}),a=ii(e,{altBoundary:!0}),l=oi(r,n),c=oi(a,s,o),h=ri(l),d=ri(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},li={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=ee.reduce((function(t,i){return t[i]=function(t,e,i){var n=be(t),s=[Vt,zt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[Vt,qt].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},ci={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=ei({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},hi={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ii(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=be(e.placement),b=Fe(e.placement),v=!b,y=Ie(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,S="y"===y?zt:Vt,D="y"===y?Rt:qt,$="y"===y?"height":"width",I=A[y],N=I+g[S],P=I-g[D],j=f?-T[$]/2:0,M=b===Xt?E[$]:T[$],F=b===Xt?-T[$]:-E[$],H=e.elements.arrow,W=f&&H?Ce(H):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=B[S],R=B[D],q=Ne(0,E[$],W[$]),V=v?E[$]/2-j-q-z-O.mainAxis:M-q-z-O.mainAxis,K=v?-E[$]/2+j+q+R+O.mainAxis:F+q+R+O.mainAxis,Q=e.elements.arrow&&$e(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=I+K-Y,G=Ne(f?ye(N,I+V-Y-X):N,I,f?ve(P,U):P);A[y]=G,k[y]=G-I}if(a){var J,Z="x"===y?zt:Vt,tt="x"===y?Rt:qt,et=A[w],it="y"===w?"height":"width",nt=et+g[Z],st=et-g[tt],ot=-1!==[zt,Vt].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=Ne(t,e,i);return n>i?i:n}(at,et,lt):Ne(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function di(t,e,i){void 0===i&&(i=!1);var n,s,o=me(e),r=me(e)&&function(t){var e=t.getBoundingClientRect(),i=we(e.width)/t.offsetWidth||1,n=we(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=Le(e),l=Te(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==ue(e)||Ue(a))&&(c=(n=e)!==fe(n)&&me(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:Xe(n)),me(e)?((h=Te(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=Ye(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function ui(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var fi={placement:"bottom",modifiers:[],strategy:"absolute"};function pi(){for(var t=arguments.length,e=new Array(t),i=0;i<t;i++)e[i]=arguments[i];return!e.some((function(t){return!(t&&"function"==typeof t.getBoundingClientRect)}))}function mi(t){void 0===t&&(t={});var e=t,i=e.defaultModifiers,n=void 0===i?[]:i,s=e.defaultOptions,o=void 0===s?fi:s;return function(t,e,i){void 0===i&&(i=o);var s,r,a={placement:"bottom",orderedModifiers:[],options:Object.assign({},fi,o),modifiersData:{},elements:{reference:t,popper:e},attributes:{},styles:{}},l=[],c=!1,h={state:a,setOptions:function(i){var s="function"==typeof i?i(a.options):i;d(),a.options=Object.assign({},o,a.options,s),a.scrollParents={reference:pe(t)?Je(t):t.contextElement?Je(t.contextElement):[],popper:Je(e)};var r,c,u=function(t){var e=ui(t);return de.reduce((function(t,i){return t.concat(e.filter((function(t){return t.phase===i})))}),[])}((r=[].concat(n,a.options.modifiers),c=r.reduce((function(t,e){var i=t[e.name];return t[e.name]=i?Object.assign({},i,e,{options:Object.assign({},i.options,e.options),data:Object.assign({},i.data,e.data)}):e,t}),{}),Object.keys(c).map((function(t){return c[t]}))));return a.orderedModifiers=u.filter((function(t){return t.enabled})),a.orderedModifiers.forEach((function(t){var e=t.name,i=t.options,n=void 0===i?{}:i,s=t.effect;if("function"==typeof s){var o=s({state:a,name:e,instance:h,options:n});l.push(o||function(){})}})),h.update()},forceUpdate:function(){if(!c){var t=a.elements,e=t.reference,i=t.popper;if(pi(e,i)){a.rects={reference:di(e,$e(i),"fixed"===a.options.strategy),popper:Ce(i)},a.reset=!1,a.placement=a.options.placement,a.orderedModifiers.forEach((function(t){return a.modifiersData[t.name]=Object.assign({},t.data)}));for(var n=0;n<a.orderedModifiers.length;n++)if(!0!==a.reset){var s=a.orderedModifiers[n],o=s.fn,r=s.options,l=void 0===r?{}:r,d=s.name;"function"==typeof o&&(a=o({state:a,options:l,name:d,instance:h})||a)}else a.reset=!1,n=-1}}},update:(s=function(){return new Promise((function(t){h.forceUpdate(),t(a)}))},function(){return r||(r=new Promise((function(t){Promise.resolve().then((function(){r=void 0,t(s())}))}))),r}),destroy:function(){d(),c=!0}};if(!pi(t,e))return h;function d(){l.forEach((function(t){return t()})),l=[]}return h.setOptions(i).then((function(t){!c&&i.onFirstUpdate&&i.onFirstUpdate(t)})),h}}var gi=mi(),_i=mi({defaultModifiers:[Re,ci,Be,_e]}),bi=mi({defaultModifiers:[Re,ci,Be,_e,li,si,hi,Me,ai]});const vi=Object.freeze(Object.defineProperty({__proto__:null,afterMain:ae,afterRead:se,afterWrite:he,applyStyles:_e,arrow:Me,auto:Kt,basePlacements:Qt,beforeMain:oe,beforeRead:ie,beforeWrite:le,bottom:Rt,clippingParents:Ut,computeStyles:Be,createPopper:bi,createPopperBase:gi,createPopperLite:_i,detectOverflow:ii,end:Yt,eventListeners:Re,flip:si,hide:ai,left:Vt,main:re,modifierPhases:de,offset:li,placements:ee,popper:Jt,popperGenerator:mi,popperOffsets:ci,preventOverflow:hi,read:ne,reference:Zt,right:qt,start:Xt,top:zt,variationPlacements:te,viewport:Gt,write:ce},Symbol.toStringTag,{value:"Module"})),yi="dropdown",wi=".bs.dropdown",Ai=".data-api",Ei="ArrowUp",Ti="ArrowDown",Ci=`hide${wi}`,Oi=`hidden${wi}`,xi=`show${wi}`,ki=`shown${wi}`,Li=`click${wi}${Ai}`,Si=`keydown${wi}${Ai}`,Di=`keyup${wi}${Ai}`,$i="show",Ii='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',Ni=`${Ii}.${$i}`,Pi=".dropdown-menu",ji=p()?"top-end":"top-start",Mi=p()?"top-start":"top-end",Fi=p()?"bottom-end":"bottom-start",Hi=p()?"bottom-start":"bottom-end",Wi=p()?"left-start":"right-start",Bi=p()?"right-start":"left-start",zi={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},Ri={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class qi extends W{constructor(t,e){super(t,e),this._popper=null,this._parent=this._element.parentNode,this._menu=z.next(this._element,Pi)[0]||z.prev(this._element,Pi)[0]||z.findOne(Pi,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return zi}static get DefaultType(){return Ri}static get NAME(){return yi}toggle(){return this._isShown()?this.hide():this.show()}show(){if(l(this._element)||this._isShown())return;const t={relatedTarget:this._element};if(!N.trigger(this._element,xi,t).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(".navbar-nav"))for(const t of[].concat(...document.body.children))N.on(t,"mouseover",h);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add($i),this._element.classList.add($i),N.trigger(this._element,ki,t)}}hide(){if(l(this._element)||!this._isShown())return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){if(!N.trigger(this._element,Ci,t).defaultPrevented){if("ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.off(t,"mouseover",h);this._popper&&this._popper.destroy(),this._menu.classList.remove($i),this._element.classList.remove($i),this._element.setAttribute("aria-expanded","false"),F.removeDataAttribute(this._menu,"popper"),N.trigger(this._element,Oi,t)}}_getConfig(t){if("object"==typeof(t=super._getConfig(t)).reference&&!o(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${yi.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(){if(void 0===vi)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let t=this._element;"parent"===this._config.reference?t=this._parent:o(this._config.reference)?t=r(this._config.reference):"object"==typeof this._config.reference&&(t=this._config.reference);const e=this._getPopperConfig();this._popper=bi(t,this._menu,e)}_isShown(){return this._menu.classList.contains($i)}_getPlacement(){const t=this._parent;if(t.classList.contains("dropend"))return Wi;if(t.classList.contains("dropstart"))return Bi;if(t.classList.contains("dropup-center"))return"top";if(t.classList.contains("dropdown-center"))return"bottom";const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?Mi:ji:e?Hi:Fi}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(F.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...g(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=z.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Ti,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=z.find(Ni);for(const i of e){const e=qi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ei,Ti].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ii)?this:z.prev(this,Ii)[0]||z.next(this,Ii)[0]||z.findOne(Ii,t.delegateTarget.parentNode),o=qi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}N.on(document,Si,Ii,qi.dataApiKeydownHandler),N.on(document,Si,Pi,qi.dataApiKeydownHandler),N.on(document,Li,qi.clearMenus),N.on(document,Di,qi.clearMenus),N.on(document,Li,Ii,(function(t){t.preventDefault(),qi.getOrCreateInstance(this).toggle()})),m(qi);const Vi="backdrop",Ki="show",Qi=`mousedown.bs.${Vi}`,Xi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Yi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ui extends H{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Xi}static get DefaultType(){return Yi}static get NAME(){return Vi}show(t){if(!this._config.isVisible)return void g(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(Ki),this._emulateAnimation((()=>{g(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Ki),this._emulateAnimation((()=>{this.dispose(),g(t)}))):g(t)}dispose(){this._isAppended&&(N.off(this._element,Qi),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),N.on(t,Qi,(()=>{g(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const Gi=".bs.focustrap",Ji=`focusin${Gi}`,Zi=`keydown.tab${Gi}`,tn="backward",en={autofocus:!0,trapElement:null},nn={autofocus:"boolean",trapElement:"element"};class sn extends H{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return en}static get DefaultType(){return nn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),N.off(document,Gi),N.on(document,Ji,(t=>this._handleFocusin(t))),N.on(document,Zi,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,N.off(document,Gi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=z.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===tn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?tn:"forward")}}const on=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",rn=".sticky-top",an="padding-right",ln="margin-right";class cn{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,an,(e=>e+t)),this._setElementAttributes(on,an,(e=>e+t)),this._setElementAttributes(rn,ln,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,an),this._resetElementAttributes(on,an),this._resetElementAttributes(rn,ln)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&F.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=F.getDataAttribute(t,e);null!==i?(F.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(co [TRUNCATED — original size: 80721 bytes]
2026-07-30 18:02:26.023 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /js/site.js responded 200 in 0.4150 ms
2026-07-30 18:02:26.023 +00:00 [INF] [HTTP] [U:-] [E:-] [C:-] HTTP GET /js/site.js 200
Req: [no body] Res: // Please see documentation at https://learn.microsoft.com/aspnet/core/client-side/bundling-and-minification // for details on configuring this project to bundle and minify static web assets. // Write your JavaScript code.
2026-07-30 18:02:24.512 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /lib/jquery/dist/jquery.min.js responded 200 in 1.8368 ms
2026-07-30 18:02:24.511 +00:00 [INF] [HTTP] [U:-] [E:-] [C:-] HTTP GET /lib/jquery/dist/jquery.min.js 200
Req: [no body] Res: /*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ !function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}function fe(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}ce.fn=ce.prototype={jquery:t,constructor:ce,length:0,toArray:function(){return ae.call(this)},get:function(e){return null==e?ae.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=ce.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return ce.each(this,e)},map:function(n){return this.pushStack(ce.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(ae.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(ce.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(ce.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:s,sort:oe.sort,splice:oe.splice},ce.extend=ce.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||v(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(ce.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||ce.isPlainObject(n)?n:{},i=!1,a[t]=ce.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},ce.extend({expando:"jQuery"+(t+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==i.call(e))&&(!(t=r(e))||"function"==typeof(n=ue.call(t,"constructor")&&t.constructor)&&o.call(n)===a)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){m(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(c(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},text:function(e){var t,n="",r=0,i=e.nodeType;if(!i)while(t=e[r++])n+=ce.text(t);return 1===i||11===i?e.textContent:9===i?e.documentElement.textContent:3===i||4===i?e.nodeValue:n},makeArray:function(e,t){var n=t||[];return null!=e&&(c(Object(e))?ce.merge(n,"string"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:se.call(t,e,n)},isXMLDoc:function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!l.test(t||n&&n.nodeName||"HTML")},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(c(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:le}),"function"==typeof Symbol&&(ce.fn[Symbol.iterator]=oe[Symbol.iterator]),ce.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var pe=oe.pop,de=oe.sort,he=oe.splice,ge="[\\x20\\t\\r\\n\\f]",ve=new RegExp("^"+ge+"+|((?:^|[^\\\\])(?:\\\\.)*)"+ge+"+$","g");ce.contains=function(e,t){var n=t&&t.parentNode;return e===n||!(!n||1!==n.nodeType||!(e.contains?e.contains(n):e.compareDocumentPosition&&16&e.compareDocumentPosition(n)))};var f=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;function p(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e}ce.escapeSelector=function(e){return(e+"").replace(f,p)};var ye=C,me=s;!function(){var e,b,w,o,a,T,r,C,d,i,k=me,S=ce.expando,E=0,n=0,s=W(),c=W(),u=W(),h=W(),l=function(e,t){return e===t&&(a=!0),0},f="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",t="(?:\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",p="\\["+ge+"*("+t+")(?:"+ge+"*([*^$|!~]?=)"+ge+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+t+"))|)"+ge+"*\\]",g=":("+t+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+p+")*)|.*)\\)|)",v=new RegExp(ge+"+","g"),y=new RegExp("^"+ge+"*,"+ge+"*"),m=new RegExp("^"+ge+"*([>+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="<a id='"+S+"' href='' disabled='disabled'></a><select id='"+S+"-\r\\' disabled='disabled'><option selected=''></option></select>",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0<I(t,T,null,[e]).length},I.contains=function(e,t){return(e.ownerDocument||e)!=T&&V(e),ce.contains(e,t)},I.attr=function(e,t){(e.ownerDocument||e)!=T&&V(e);var n=b.attrHandle[t.toLowerCase()],r=n&&ue.call(b.attrHandle,t.toLowerCase())?n(e,t,!C):void 0;return void 0!==r?r:e.getAttribute(t)},I.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},ce.uniqueSort=function(e){var t,n=[],r=0,i=0;if(a=!le.sortStable,o=!le.sortStable&&ae.call(e,0),de.call(e,l),a){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)he.call(e,n[r],1)}return o=null,e},ce.fn.uniqueSort=function(){return this.pushStack(ce.uniqueSort(ae.apply(this)))},(b=ce.expr={cacheLength:50,createPseudo:F,match:D,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(v," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(d,e,t,h,g){var v="nth"!==d.slice(0,3),y="last"!==d.slice(-4),m="of-type"===e;return 1===h&&0===g?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u=v!==y?"nextSibling":"previousSibling",l=e.parentNode,c=m&&e.nodeName.toLowerCase(),f=!n&&!m,p=!1;if(l){if(v){while(u){o=e;while(o=o[u])if(m?fe(o,c):1===o.nodeType)return!1;s=u="only"===d&&!s&&"nextSibling"}return!0}if(s=[y?l.firstChild:l.lastChild],y&&f){p=(a=(r=(i=l[S]||(l[S]={}))[d]||[])[0]===E&&r[1])&&r[2],o=a&&l.childNodes[a];while(o=++a&&o&&o[u]||(p=a=0)||s.pop())if(1===o.nodeType&&++p&&o===e){i[d]=[E,a,p];break}}else if(f&&(p=a=(r=(i=e[S]||(e[S]={}))[d]||[])[0]===E&&r[1]),!1===p)while(o=++a&&o&&o[u]||(p=a=0)||s.pop())if((m?fe(o,c):1===o.nodeType)&&++p&&(f&&((i=o[S]||(o[S]={}))[d]=[E,p]),o===e))break;return(p-=g)===h||p%h==0&&0<=p/h}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||I.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?F(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=se.call(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:F(function(e){var r=[],i=[],s=ne(e.replace(ve,"$1"));return s[S]?F(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:F(function(t){return function(e){return 0<I(t,e).length}}),contains:F(function(t){return t=t.replace(O,P),function(e){return-1<(e.textContent||ce.text(e)).indexOf(t)}}),lang:F(function(n){return A.test(n||"")||I.error("unsupported lang: "+n),n=n.replace(O,P).toLowerCase(),function(e){var t;do{if(t=C?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=ie.location&&ie.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===r},focus:function(e){return e===function(){try{return T.activeElement}catch(e){}}()&&T.hasFocus()&&!!(e.type||e.href||~e.tabIndex)},enabled:z(!1),disabled:z(!0),checked:function(e){return fe(e,"input")&&!!e.checked||fe(e,"option")&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return q.test(e.nodeName)},input:function(e){return N.test(e.nodeName)},button:function(e){return fe(e,"input")&&"button"===e.type||fe(e,"button")},text:function(e){var t;return fe(e,"input")&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:X(function(){return[0]}),last:X(function(e,t){return[t-1]}),eq:X(function(e,t,n){return[n<0?n+t:n]}),even:X(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:X(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:X(function(e,t,n){var r;for(r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:X(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=B(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=_(e);function G(){}function Y(e,t){var n,r,i,o,a,s,u,l=c[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=y.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=m.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace(ve," ")}),a=a.slice(n.length)),b.filter)!(r=D[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?I.error(e):c(e,s).slice(0)}function Q(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function J(a,e,t){var s=e.dir,u=e.next,l=u||s,c=t&&"parentNode"===l,f=n++;return e.first?function(e,t,n){while(e=e[s])if(1===e.nodeType||c)return a(e,t,n);return!1}:function(e,t,n){var r,i,o=[E,f];if(n){while(e=e[s])if((1===e.nodeType||c)&&a(e,t,n))return!0}else while(e=e[s])if(1===e.nodeType||c)if(i=e[S]||(e[S]={}),u&&fe(e,u))e=e[s]||e;else{if((r=i[l])&&r[0]===E&&r[1]===f)return o[2]=r[2];if((i[l]=o)[2]=a(e,t,n))return!0}return!1}}function K(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Z(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function ee(d,h,g,v,y,e){return v&&!v[S]&&(v=ee(v)),y&&!y[S]&&(y=ee(y,e)),F(function(e,t,n,r){var i,o,a,s,u=[],l=[],c=t.length,f=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)I(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),p=!d||!e&&h?f:Z(f,u,d,n,r);if(g?g(p,s=y||(e?d:c||v)?[]:t,n,r):s=p,v){i=Z(s,l),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(s[l[o]]=!(p[l[o]]=a))}if(e){if(y||d){if(y){i=[],o=s.length;while(o--)(a=s[o])&&i.push(p[o]=a);y(null,s=[],i,r)}o=s.length;while(o--)(a=s[o])&&-1<(i=y?se.call(e,a):u[o])&&(e[i]=!(t[i]=a))}}else s=Z(s===t?s.splice(c,s.length):s),y?y(null,t,s,r):k.apply(t,s)})}function te(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=J(function(e){return e===i},a,!0),l=J(function(e){return-1<se.call(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!=w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[J(K(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return ee(1<s&&K(c),1<s&&Q(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(ve,"$1"),t,s<n&&te(e.slice(s,n)),n<r&&te(e=e.slice(n)),n<r&&Q(e))}c.push(t)}return K(c)}function ne(e,t){var n,v,y,m,x,r,i=[],o=[],a=u[e+" "];if(!a){t||(t=Y(e)),n=t.length;while(n--)(a=te(t[n]))[S]?i.push(a):o.push(a);(a=u(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=E+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==T||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==T||(V(o),n=!C);while(s=v[a++])if(s(o,t||T,n)){k.call(r,o);break}i&&(E=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=pe.call(r));f=Z(f)}k.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&ce.uniqueSort(r)}return i&&(E=h,w=p),c},m?F(r):r))).selector=e}return a}function re(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&Y(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&C&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(O,P),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=D.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(O,P),H.test(o[0].type)&&U(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&Q(o)))return k.apply(n,r),n;break}}}return(l||ne(e,c))(r,t,!C,n,!t||H.test(e)&&U(t.parentNode)||t),n}G.prototype=b.filters=b.pseudos,b.setFilters=new G,le.sortStable=S.split("").sort(l).join("")===S,V(),le.sortDetached=$(function(e){return 1&e.compareDocumentPosition(T.createElement("fieldset"))}),ce.find=I,ce.expr[":"]=ce.expr.pseudos,ce.unique=ce.uniqueSort,I.compile=ne,I.select=re,I.setDocument=V,I.tokenize=Y,I.escape=ce.escapeSelector,I.getText=ce.text,I.isXML=ce.isXMLDoc,I.selectors=ce.expr,I.support=ce.support,I.uniqueSort=ce.uniqueSort}();var d=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&ce(e).is(n))break;r.push(e)}return r},h=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},b=ce.expr.match.needsContext,w=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1<se.call(n,e)!==r}):ce.filter(n,e,r)}ce.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?ce.find.matchesSelector(r,e)?[r]:[]:ce.find.matches(e,ce.grep(t,function(e){return 1===e.nodeType}))},ce.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(ce(e).filter(function(){for(t=0;t<r;t++)if(ce.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)ce.find(e,i[t],n);return 1<r?ce.uniqueSort(n):n},filter:function(e){return this.pushStack(T(this,e||[],!1))},not:function(e){return this.pushStack(T(this,e||[],!0))},is:function(e){return!!T(this,"string"==typeof e&&b.test(e)?ce(e):e||[],!1).length}});var k,S=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(ce.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&ce(e);if(!b.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&ce.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?ce.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?se.call(ce(e),this[0]):se.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(ce.uniqueSort(ce.merge(this.get(),ce(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),ce.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return d(e,"parentNode")},parentsUntil:function(e,t,n){return d(e,"parentNode",n)},next:function(e){return A(e,"nextSibling")},prev:function(e){return A(e,"previousSibling")},nextAll:function(e){return d(e,"nextSibling")},prevAll:function(e){return d(e,"previousSibling")},nextUntil:function(e,t,n){return d(e,"nextSibling",n)},prevUntil:function(e,t,n){return d(e,"previousSibling",n)},siblings:function(e){return h((e.parentNode||{}).firstChild,e)},children:function(e){return h(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(fe(e,"template")&&(e=e.content||e),ce.merge([],e.childNodes))}},function(r,i){ce.fn[r]=function(e,t){var n=ce.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=ce.filter(t,n)),1<this.length&&(j[r]||ce.uniqueSort(n),E.test(r)&&n.reverse()),this.pushStack(n)}});var D=/[^\x20\t\r\n\f]+/g;function N(e){return e}function q(e){throw e}function L(e,t,n,r){var i;try{e&&v(i=e.promise)?i.call(e).done(t).fail(n):e&&v(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}ce.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},ce.each(e.match(D)||[],function(e,t){n[t]=!0}),n):ce.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){ce.each(e,function(e,t){v(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==x(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return ce.each(arguments,function(e,t){var n;while(-1<(n=ce.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<ce.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},ce.extend({Deferred:function(e){var o=[["notify","progress",ce.Callbacks("memory"),ce.Callbacks("memory"),2],["resolve","done",ce.Callbacks("once memory"),ce.Callbacks("once memory"),0,"resolved"],["reject","fail",ce.Callbacks("once memory"),ce.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return ce.Deferred(function(r){ce.each(o,function(e,t){var n=v(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&v(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,v(t)?s?t.call(e,l(u,o,N,s),l(u,o,q,s)):(u++,t.call(e,l(u,o,N,s),l(u,o,q,s),l(u,o,N,o.notifyWith))):(a!==N&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){ce.Deferred.exceptionHook&&ce.Deferred.exceptionHook(e,t.error),u<=i+1&&(a!==q&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(ce.Deferred.getErrorHook?t.error=ce.Deferred.getErrorHook():ce.Deferred.getStackHook&&(t.error=ce.Deferred.getStackHook()),ie.setTimeout(t))}}return ce.Deferred(function(e){o[0][3].add(l(0,e,v(r)?r:N,e.notifyWith)),o[1][3].add(l(0,e,v(t)?t:N)),o[2][3].add(l(0,e,v(n)?n:q))}).promise()},promise:function(e){return null!=e?ce.extend(e,a):a}},s={};return ce.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=ae.call(arguments),o=ce.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?ae.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(L(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||v(i[t]&&i[t].then)))return o.then();while(t--)L(i[t],a(t),o.reject);return o.promise()}});var H=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;ce.Deferred.exceptionHook=function(e,t){ie.console&&ie.console.warn&&e&&H.test(e.name)&&ie.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},ce.readyException=function(e){ie.setTimeout(function(){throw e})};var O=ce.Deferred();function P(){C.removeEventListener("DOMContentLoaded",P),ie.removeEventListener("load",P),ce.ready()}ce.fn.ready=function(e){return O.then(e)["catch"](function(e){ce.readyException(e)}),this},ce.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--ce.readyWait:ce.isReady)||(ce.isReady=!0)!==e&&0<--ce.readyWait||O.resolveWith(C,[ce])}}),ce.ready.then=O.then,"complete"===C.readyState||"loading"!==C.readyState&&!C.documentElement.doScroll?ie.setTimeout(ce.ready):(C.addEventListener("DOMContentLoaded",P),ie.addEventListener("load",P));var M=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n))for(s in i=!0,n)M(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,v(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(ce(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},R=/^-ms-/,I=/-([a-z])/g;function W(e,t){return t.toUpperCase()}function F(e){return e.replace(R,"ms-").replace(I,W)}var $=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function B(){this.expando=ce.expando+B.uid++}B.uid=1,B.prototype={cache:function(e){var t=e[this.expando];return t||(t={},$(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[F(t)]=n;else for(r in t)i[F(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][F(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(F):(t=F(t))in r?[t]:t.match(D)||[]).length;while(n--)delete r[t[n]]}(void 0===t||ce.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!ce.isEmptyObject(t)}};var _=new B,z=new B,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,U=/[A-Z]/g;function V(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(U,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:X.test(i)?JSON.parse(i):i)}catch(e){}z.set(e,t,n)}else n=void 0;return n}ce.extend({hasData:function(e){return z.hasData(e)||_.hasData(e)},data:function(e,t,n){return z.access(e,t,n)},removeData:function(e,t){z.remove(e,t)},_data:function(e,t,n){return _.access(e,t,n)},_removeData:function(e,t){_.remove(e,t)}}),ce.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=z.get(o),1===o.nodeType&&!_.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=F(r.slice(5)),V(o,r,i[r]));_.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){z.set(this,n)}):M(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=z.get(o,n))?t:void 0!==(t=V(o,n))?t:void 0;this.each(function(){z.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){z.remove(this,e)})}}),ce.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=_.get(e,t),n&&(!r||Array.isArray(n)?r=_.access(e,t,ce.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=ce.queue(e,t),r=n.length,i=n.shift(),o=ce._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){ce.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return _.get(e,n)||_.access(e,n,{empty:ce.Callbacks("once memory").add(function(){_.remove(e,[t+"queue",n])})})}}),ce.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?ce.queue(this[0],t):void 0===n?this:this.each(function(){var e=ce.queue(this,t,n);ce._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&ce.dequeue(this,t)})},dequeue:function(e){return this.each(function(){ce.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=ce.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=_.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var G=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,Y=new RegExp("^(?:([+-])=|)("+G+")([a-z%]*)$","i"),Q=["Top","Right","Bottom","Left"],J=C.documentElement,K=function(e){return ce.contains(e.ownerDocument,e)},Z={composed:!0};J.getRootNode&&(K=function(e){return ce.contains(e.ownerDocument,e)||e.getRootNode(Z)===e.ownerDocument});var ee=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&K(e)&&"none"===ce.css(e,"display")};function te(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return ce.css(e,t,"")},u=s(),l=n&&n[3]||(ce.cssNumber[t]?"":"px"),c=e.nodeType&&(ce.cssNumber[t]||"px"!==l&&+u)&&Y.exec(ce.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)ce.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,ce.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ne={};function re(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=_.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ee(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ne[s])||(o=a.body.appendChild(a.createElement(s)),u=ce.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ne[s]=u)))):"none"!==n&&(l[c]="none",_.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}ce.fn.extend({show:function(){return re(this,!0)},hide:function(){return re(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ee(this)?ce(this).show():ce(this).hide()})}});var xe,be,we=/^(?:checkbox|radio)$/i,Te=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="<textarea>x</textarea>",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="<option></option>",le.option=!!xe.lastChild;var ke={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n<r;n++)_.set(e[n],"globalEval",!t||_.get(t[n],"globalEval"))}ke.tbody=ke.tfoot=ke.colgroup=ke.caption=ke.thead,ke.th=ke.td,le.option||(ke.optgroup=ke.option=[1,"<select multiple='multiple'>","</select>"]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===x(o))ce.merge(p,o.nodeType?[o]:o);else if(je.test(o)){a=a||f.appendChild(t.createElement("div")),s=(Te.exec(o)||["",""])[1].toLowerCase(),u=ke[s]||ke._default,a.innerHTML=u[1]+ce.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;ce.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<ce.inArray(o,r))i&&i.push(o);else if(l=K(o),a=Se(f.appendChild(o),"script"),l&&Ee(a),n){c=0;while(o=a[c++])Ce.test(o.type||"")&&n.push(o)}return f}var De=/^([^.]*)(?:\.(.+)|)/;function Ne(){return!0}function qe(){return!1}function Le(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Le(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=qe;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return ce().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=ce.guid++)),e.each(function(){ce.event.add(this,t,i,r,n)})}function He(e,r,t){t?(_.set(e,r,!1),ce.event.add(e,r,{namespace:!1,handler:function(e){var t,n=_.get(this,r);if(1&e.isTrigger&&this[r]){if(n)(ce.event.special[r]||{}).delegateType&&e.stopPropagation();else if(n=ae.call(arguments),_.set(this,r,n),this[r](),t=_.get(this,r),_.set(this,r,!1),n!==t)return e.stopImmediatePropagation(),e.preventDefault(),t}else n&&(_.set(this,r,ce.event.trigger(n[0],n.slice(1),this)),e.stopPropagation(),e.isImmediatePropagationStopped=Ne)}})):void 0===_.get(e,r)&&ce.event.add(e,r,Ne)}ce.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=_.get(t);if($(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&ce.find.matchesSelector(J,i),n.guid||(n.guid=ce.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof ce&&ce.event.triggered!==e.type?ce.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(D)||[""]).length;while(l--)d=g=(s=De.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=ce.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=ce.event.special[d]||{},c=ce.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&ce.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),ce.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=_.hasData(e)&&_.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(D)||[""]).length;while(l--)if(d=g=(s=De.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=ce.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||ce.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)ce.event.remove(e,d+t[l],n,r,!0);ce.isEmptyObject(u)&&_.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=ce.event.fix(e),l=(_.get(this,"events")||Object.create(null))[u.type]||[],c=ce.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=ce.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((ce.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<ce(i,this).index(l):ce.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(ce.Event.prototype,t,{enumerable:!0,configurable:!0,get:v(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[ce.expando]?e:new ce.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return we.test(t.type)&&t.click&&fe(t,"input")&&He(t,"click",!0),!1},trigger:function(e){var t=this||e;return we.test(t.type)&&t.click&&fe(t,"input")&&He(t,"click"),!0},_default:function(e){var t=e.target;return we.test(t.type)&&t.click&&fe(t,"input")&&_.get(t,"click")||fe(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},ce.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},ce.Event=function(e,t){if(!(this instanceof ce.Event))return new ce.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ne:qe,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&ce.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[ce.expando]=!0},ce.Event.prototype={constructor:ce.Event,isDefaultPrevented:qe,isPropagationStopped:qe,isImmediatePropagationStopped:qe,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ne,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ne,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ne,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},ce.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},ce.event.addProp),ce.each({focus:"focusin",blur:"focusout"},function(r,i){function o(e){if(C.documentMode){var t=_.get(this,"handle"),n=ce.event.fix(e);n.type="focusin"===e.type?"focus":"blur",n.isSimulated=!0,t(e),n.target===n.currentTarget&&t(n)}else ce.event.simulate(i,e.target,ce.event.fix(e))}ce.event.special[r]={setup:function(){var e;if(He(this,r,!0),!C.documentMode)return!1;(e=_.get(this,i))||this.addEventListener(i,o),_.set(this,i,(e||0)+1)},trigger:function(){return He(this,r),!0},teardown:function(){var e;if(!C.documentMode)return!1;(e=_.get(this,i)-1)?_.set(this,i,e):(this.removeEventListener(i,o),_.remove(this,i))},_default:function(e){return _.get(e.target,r)},delegateType:i},ce.event.special[i]={setup:function(){var e=this.ownerDocument||this.document||this,t=C.documentMode?this:e,n=_.get(t,i);n||(C.documentMode?this.addEventListener(i,o):e.addEventListener(r,o,!0)),_.set(t,i,(n||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=C.documentMode?this:e,n=_.get(t,i)-1;n?_.set(t,i,n):(C.documentMode?this.removeEventListener(i,o):e.removeEventListener(r,o,!0),_.remove(t,i))}}}),ce.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){ce.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||ce.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),ce.fn.extend({on:function(e,t,n,r){return Le(this,e,t,n,r)},one:function(e,t,n,r){return Le(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,ce(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=qe),this.each(function(){ce.event.remove(this,e,n,t)})}});var Oe=/<script|<style|<link/i,Pe=/checked\s*(?:[^=]|=\s*.checked.)/i,Me=/^\s*<!\[CDATA\[|\]\]>\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)ce.event.add(t,i,s[i][n]);z.hasData(e)&&(o=z.access(e),a=ce.extend({},o),z.set(t,a))}}function $e(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=v(d);if(h||1<f&&"string"==typeof d&&!le.checkClone&&Pe.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),$e(t,r,i,o)});if(f&&(t=(e=Ae(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=ce.map(Se(e,"script"),Ie)).length;c<f;c++)u=e,c!==p&&(u=ce.clone(u,!0,!0),s&&ce.merge(a,Se(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,ce.map(a,We),c=0;c<s;c++)u=a[c],Ce.test(u.type||"")&&!_.access(u,"globalEval")&&ce.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?ce._evalUrl&&!u.noModule&&ce._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):m(u.textContent.replace(Me,""),u,l))}return n}function Be(e,t,n){for(var r,i=t?ce.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||ce.cleanData(Se(r)),r.parentNode&&(n&&K(r)&&Ee(Se(r,"script")),r.parentNode.removeChild(r));return e}ce.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=K(e);if(!(le.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||ce.isXMLDoc(e)))for(a=Se(c),r=0,i=(o=Se(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&we.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||Se(e),a=a||Se(c),r=0,i=o.length;r<i;r++)Fe(o[r],a[r]);else Fe(e,c);return 0<(a=Se(c,"script")).length&&Ee(a,!f&&Se(e,"script")),c},cleanData:function(e){for(var t,n,r,i=ce.event.special,o=0;void 0!==(n=e[o]);o++)if($(n)){if(t=n[_.expando]){if(t.events)for(r in t.events)i[r]?ce.event.remove(n,r):ce.removeEvent(n,r,t.handle);n[_.expando]=void 0}n[z.expando]&&(n[z.expando]=void 0)}}}),ce.fn.extend({detach:function(e){return Be(this,e,!0)},remove:function(e){return Be(this,e)},text:function(e){return M(this,function(e){return void 0===e?ce.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return $e(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Re(this,e).appendChild(e)})},prepend:function(){return $e(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Re(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return $e(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return $e(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(ce.cleanData(Se(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return ce.clone(this,e,t)})},html:function(e){return M(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Oe.test(e)&&!ke[(Te.exec(e)||["",""])[1].toLowerCase()]){e=ce.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(ce.cleanData(Se(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return $e(this,arguments,function(e){var t=this.parentNode;ce.inArray(this,n)<0&&(ce.cleanData(Se(this)),t&&t.replaceChild(e,this))},n)}}),ce.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){ce.fn[e]=function(e){for(var t,n=[],r=ce(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),ce(r[o])[a](t),s.apply(n,t.get());return this.pushStack(n)}});var _e=new RegExp("^("+G+")(?!px)[a-z%]+$","i"),ze=/^--/,Xe=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=ie),t.getComputedStyle(e)},Ue=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ve=new RegExp(Q.join("|"),"i");function Ge(e,t,n){var r,i,o,a,s=ze.test(t),u=e.style;return(n=n||Xe(e))&&(a=n.getPropertyValue(t)||n[t],s&&a&&(a=a.replace(ve,"$1")||void 0),""!==a||K(e)||(a=ce.style(e,t)),!le.pixelBoxStyles()&&_e.test(a)&&Ve.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=n.width,u.width=r,u.minWidth=i,u.maxWidth=o)),void 0!==a?a+"":a}function Ye(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",J.appendChild(u).appendChild(l);var e=ie.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),J.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=C.createElement("div"),l=C.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",le.clearCloneStyle="content-box"===l.style.backgroundClip,ce.extend(le,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=C.createElement("table"),t=C.createElement("tr"),n=C.createElement("div"), [TRUNCATED — original size: 87533 bytes]
2026-07-30 18:02:23.717 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /css/site.css responded 200 in 0.4360 ms
2026-07-30 18:02:23.717 +00:00 [INF] [HTTP] [U:-] [E:-] [C:-] HTTP GET /css/site.css 200
Req: [no body] Res: html { font-size: 14px; } @media (min-width: 768px) { html { font-size: 16px; } } .btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus { box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb; } html { position: relative; min-height: 100%; } body { margin-bottom: 60px; } .form-floating > .form-control-plaintext::placeholder, .form-floating > .form-control::placeholder { color: var(--bs-secondary-color); text-align: end; } .form-floating > .form-control-plaintext:focus::placeholder, .form-floating > .form-control:focus::placeholder { text-align: start; }
2026-07-30 18:02:22.212 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /lib/bootstrap/dist/css/bootstrap.min.css responded 200 in 1.7432 ms
2026-07-30 18:02:22.211 +00:00 [INF] [HTTP] [U:-] [E:-] [C:-] HTTP GET /lib/bootstrap/dist/css/bootstrap.min.css 200
Req: [no body] Res: @charset "UTF-8";/*! * Bootstrap v5.3.3 (https://getbootstrap.com/) * Copyright 2011-2024 The Bootstrap Authors * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */:root,[data-bs-theme=light]{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-primary-text-emphasis:#052c65;--bs-secondary-text-emphasis:#2b2f32;--bs-success-text-emphasis:#0a3622;--bs-info-text-emphasis:#055160;--bs-warning-text-emphasis:#664d03;--bs-danger-text-emphasis:#58151c;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#495057;--bs-primary-bg-subtle:#cfe2ff;--bs-secondary-bg-subtle:#e2e3e5;--bs-success-bg-subtle:#d1e7dd;--bs-info-bg-subtle:#cff4fc;--bs-warning-bg-subtle:#fff3cd;--bs-danger-bg-subtle:#f8d7da;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#9ec5fe;--bs-secondary-border-subtle:#c4c8cb;--bs-success-border-subtle:#a3cfbb;--bs-info-border-subtle:#9eeaf9;--bs-warning-border-subtle:#ffe69c;--bs-danger-border-subtle:#f1aeb5;--bs-light-border-subtle:#e9ecef;--bs-dark-border-subtle:#adb5bd;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-color-rgb:33,37,41;--bs-body-bg:#fff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:rgba(33, 37, 41, 0.75);--bs-secondary-color-rgb:33,37,41;--bs-secondary-bg:#e9ecef;--bs-secondary-bg-rgb:233,236,239;--bs-tertiary-color:rgba(33, 37, 41, 0.5);--bs-tertiary-color-rgb:33,37,41;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248,249,250;--bs-heading-color:inherit;--bs-link-color:#0d6efd;--bs-link-color-rgb:13,110,253;--bs-link-decoration:underline;--bs-link-hover-color:#0a58ca;--bs-link-hover-color-rgb:10,88,202;--bs-code-color:#d63384;--bs-highlight-color:#212529;--bs-highlight-bg:#fff3cd;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg:0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width:0.25rem;--bs-focus-ring-opacity:0.25;--bs-focus-ring-color:rgba(13, 110, 253, 0.25);--bs-form-valid-color:#198754;--bs-form-valid-border-color:#198754;--bs-form-invalid-color:#dc3545;--bs-form-invalid-border-color:#dc3545}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color:#dee2e6;--bs-body-color-rgb:222,226,230;--bs-body-bg:#212529;--bs-body-bg-rgb:33,37,41;--bs-emphasis-color:#fff;--bs-emphasis-color-rgb:255,255,255;--bs-secondary-color:rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb:222,226,230;--bs-secondary-bg:#343a40;--bs-secondary-bg-rgb:52,58,64;--bs-tertiary-color:rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb:222,226,230;--bs-tertiary-bg:#2b3035;--bs-tertiary-bg-rgb:43,48,53;--bs-primary-text-emphasis:#6ea8fe;--bs-secondary-text-emphasis:#a7acb1;--bs-success-text-emphasis:#75b798;--bs-info-text-emphasis:#6edff6;--bs-warning-text-emphasis:#ffda6a;--bs-danger-text-emphasis:#ea868f;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#dee2e6;--bs-primary-bg-subtle:#031633;--bs-secondary-bg-subtle:#161719;--bs-success-bg-subtle:#051b11;--bs-info-bg-subtle:#032830;--bs-warning-bg-subtle:#332701;--bs-danger-bg-subtle:#2c0b0e;--bs-light-bg-subtle:#343a40;--bs-dark-bg-subtle:#1a1d20;--bs-primary-border-subtle:#084298;--bs-secondary-border-subtle:#41464b;--bs-success-border-subtle:#0f5132;--bs-info-border-subtle:#087990;--bs-warning-border-subtle:#997404;--bs-danger-border-subtle:#842029;--bs-light-border-subtle:#495057;--bs-dark-border-subtle:#343a40;--bs-heading-color:inherit;--bs-link-color:#6ea8fe;--bs-link-hover-color:#8bb9fe;--bs-link-color-rgb:110,168,254;--bs-link-hover-color-rgb:139,185,254;--bs-code-color:#e685b5;--bs-highlight-color:#dee2e6;--bs-highlight-bg:#664d03;--bs-border-color:#495057;--bs-border-color-translucent:rgba(255, 255, 255, 0.15);--bs-form-valid-color:#75b798;--bs-form-valid-border-color:#75b798;--bs-form-invalid-color:#ea868f;--bs-form-invalid-border-color:#ea868f}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;border:0;border-top:var(--bs-border-width) solid;opacity:.25}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.1875em;color:var(--bs-highlight-color);background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,1));text-decoration:underline}a:hover{--bs-link-color-rgb:var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--bs-body-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:var(--bs-secondary-color)}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}:root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1200px;--bs-breakpoint-xxl:1400px}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-color-type:initial;--bs-table-bg-type:initial;--bs-table-color-state:initial;--bs-table-bg-state:initial;--bs-table-color:var(--bs-emphasis-color);--bs-table-bg:var(--bs-body-bg);--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-emphasis-color);--bs-table-striped-bg:rgba(var(--bs-emphasis-color-rgb), 0.05);--bs-table-active-color:var(--bs-emphasis-color);--bs-table-active-bg:rgba(var(--bs-emphasis-color-rgb), 0.1);--bs-table-hover-color:var(--bs-emphasis-color);--bs-table-hover-bg:rgba(var(--bs-emphasis-color-rgb), 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state,var(--bs-table-color-type,var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:var(--bs-border-width);box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state,var(--bs-table-bg-type,var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--bs-border-width) * 2) solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:var(--bs-border-width) 0}.table-bordered>:not(caption)>*>*{border-width:0 var(--bs-border-width)}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(2n){--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-active{--bs-table-color-state:var(--bs-table-active-color);--bs-table-bg-state:var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state:var(--bs-table-hover-color);--bs-table-bg-state:var(--bs-table-hover-bg)}.table-primary{--bs-table-color:#000;--bs-table-bg:#cfe2ff;--bs-table-border-color:#a6b5cc;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:#e2e3e5;--bs-table-border-color:#b5b6b7;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000;--bs-table-bg:#d1e7dd;--bs-table-border-color:#a7b9b1;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#cff4fc;--bs-table-border-color:#a6c3ca;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000;--bs-table-bg:#fff3cd;--bs-table-border-color:#ccc2a4;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#f8d7da;--bs-table-border-color:#c6acae;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000;--bs-table-bg:#f8f9fa;--bs-table-border-color:#c6c7c8;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#212529;--bs-table-border-color:#4d5154;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + var(--bs-border-width));padding-bottom:calc(.375rem + var(--bs-border-width));margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + var(--bs-border-width));padding-bottom:calc(.5rem + var(--bs-border-width));font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + var(--bs-border-width));padding-bottom:calc(.25rem + var(--bs-border-width));font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:var(--bs-secondary-color)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-clip:padding-box;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:var(--bs-body-color);background-color:var(--bs-body-bg);border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::-moz-placeholder{color:var(--bs-secondary-color);opacity:1}.form-control::placeholder{color:var(--bs-secondary-color);opacity:1}.form-control:disabled{background-color:var(--bs-secondary-bg);opacity:1}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:var(--bs-secondary-bg)}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--bs-secondary-bg)}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:var(--bs-body-color);background-color:transparent;border:solid transparent;border-width:var(--bs-border-width) 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2));padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2))}textarea.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-control-color{width:3rem;height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color::-webkit-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon,none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:var(--bs-secondary-bg)}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--bs-body-color)}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{padding-right:1.5em;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-1.5em;margin-left:0}.form-check-input{--bs-form-check-bg:var(--bs-body-bg);flex-shrink:0;width:1em;height:1em;margin-top:.25em;vertical-align:top;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:var(--bs-border-width) solid var(--bs-border-color);-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;-webkit-appearance:none;appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;-moz-appearance:none;appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:var(--bs-secondary-color)}.form-range:disabled::-moz-range-thumb{background-color:var(--bs-secondary-color)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(var(--bs-border-width) * 2));min-height:calc(3.5rem + calc(var(--bs-border-width) * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:var(--bs-border-width) solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control-plaintext::-moz-placeholder,.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control-plaintext::placeholder,.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control-plaintext:not(:-moz-placeholder-shown),.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:-webkit-autofill,.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label,.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:not(:-moz-placeholder-shown)~label::after{position:absolute;inset:1rem 0.375rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius)}.form-floating>.form-control-plaintext~label::after,.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem 0.375rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius)}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label{border-width:var(--bs-border-width) 0}.form-floating>.form-control:disabled~label,.form-floating>:disabled~label{color:#6c757d}.form-floating>.form-control:disabled~label::after,.form-floating>:disabled~label::after{background-color:var(--bs-secondary-bg)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-floating,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-floating:focus-within,.input-group>.form-select:focus{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);text-align:center;white-space:nowrap;background-color:var(--bs-tertiary-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius)}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select,.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select,.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(var(--bs-border-width) * -1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-valid-color)}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-success);border-radius:var(--bs-border-radius)}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:var(--bs-form-valid-border-color);padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:var(--bs-form-valid-border-color)}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-control-color.is-valid,.was-validated .form-control-color:valid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:var(--bs-form-valid-border-color)}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:var(--bs-form-valid-color)}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:var(--bs-form-valid-color)}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-valid,.input-group>.form-floating:not(:focus-within).is-valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-control:not(:focus):valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.was-validated .input-group>.form-select:not(:focus):valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-invalid-color)}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-danger);border-radius:var(--bs-border-radius)}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:var(--bs-form-invalid-border-color);padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-c [TRUNCATED — original size: 232803 bytes]
2026-07-30 17:59:52.417 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET / responded 200 in 1.4262 ms
2026-07-30 17:59:52.417 +00:00 [INF] [HTTP] [U:-] [E:-] [C:322e9bcd3d00] HTTP GET / 200
Req: [no body] Res: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Home — WM Policy Documents</title> <link rel="stylesheet" href="/lib/bootstrap/dist/css/bootstrap.min.css" /> <link rel="stylesheet" href="/css/site.css?v=xQHUTQJdpYJFKIjDlFCI1X8KDqtO5qaSSeJFSoCP3pA" /> <link rel="stylesheet" href="/css/commissions.css?v=ZRMXSlMSxdLsHmJCZzq1LopWaopJSbVXKu57gvUJG3w" /> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css" /> <style> /* ---- Hover-expand left sidebar -------------------------------------- */ :root { --sb-collapsed: 64px; --sb-expanded: 240px; } body.has-sidebar { /* Reserve space for the collapsed rail; the expanded panel overlays the content on hover, so the content never shifts. */ padding-left: var(--sb-collapsed); } .app-sidebar { position: fixed; top: 0; left: 0; height: 100vh; width: var(--sb-collapsed); overflow-x: hidden; overflow-y: auto; display: flex; flex-direction: column; z-index: 1045; transition: width 0.2s ease; } .app-sidebar:hover, .app-sidebar:focus-within { width: var(--sb-expanded); box-shadow: 0 0 24px rgba(0,0,0,0.35); } .app-sidebar .sb-label { white-space: nowrap; opacity: 0; transition: opacity 0.15s ease; } .app-sidebar:hover .sb-label, .app-sidebar:focus-within .sb-label { opacity: 1; } .sb-link { display: flex; align-items: center; gap: 0.85rem; padding: 0.65rem 0; color: rgba(255,255,255,0.75); text-decoration: none; border-left: 3px solid transparent; } .sb-link:hover { color: #fff; background: rgba(255,255,255,0.08); } .sb-link.active { color: #fff; background: rgba(255,255,255,0.12); border-left-color: #0d6efd; } .sb-link > i:first-child { min-width: var(--sb-collapsed); text-align: center; font-size: 1.15rem; flex-shrink: 0; } .sb-brand { display: flex; align-items: center; gap: 0.85rem; padding: 0.9rem 0; color: #fff; text-decoration: none; font-weight: 700; } .sb-brand > i:first-child { min-width: var(--sb-collapsed); text-align: center; font-size: 1.3rem; flex-shrink: 0; } /* Sub-menu (Fact-Find) */ .sb-submenu .sb-link { font-size: 0.9rem; padding-left: 0; } .sb-submenu .sb-link > i:first-child { font-size: 1rem; } .sb-caret { margin-left: auto; margin-right: 0.9rem; transition: transform 0.15s ease; } .sb-link[aria-expanded="true"] .sb-caret { transform: rotate(180deg); } </style> </head> <body class="d-flex flex-column min-vh-100 has-sidebar"> <nav b-yjl2sbey1b class="app-sidebar navbar-dark bg-dark shadow-sm"> <a class="sb-brand" href="/UI"> <i b-yjl2sbey1b class="bi bi-file-earmark-text"></i> <span b-yjl2sbey1b class="sb-label">Wealthmax</span> </a> <div b-yjl2sbey1b class="d-flex flex-column flex-grow-1"> <a class="sb-link " href="/UI/Dashboard/Index"> <i b-yjl2sbey1b class="bi bi-speedometer2"></i><span b-yjl2sbey1b class="sb-label">Dashboard</span> </a> <a class="sb-link " href="/UI/Templates/Index"> <i b-yjl2sbey1b class="bi bi-collection"></i><span b-yjl2sbey1b class="sb-label">Templates</span> </a> <a class="sb-link " href="/UI/Tokens/Index"> <i b-yjl2sbey1b class="bi bi-braces"></i><span b-yjl2sbey1b class="sb-label">Token Registry</span> </a> <a class="sb-link " href="/UI/Clients/Index"> <i b-yjl2sbey1b class="bi bi-people"></i><span b-yjl2sbey1b class="sb-label">Clients</span> </a> <a class="sb-link " href="/UI/Cases/Index"> <i b-yjl2sbey1b class="bi bi-briefcase"></i><span b-yjl2sbey1b class="sb-label">Cases</span> </a> <a class="sb-link " href="/UI/Reporting/Index"> <i b-yjl2sbey1b class="bi bi-graph-up"></i><span b-yjl2sbey1b class="sb-label">Reports</span> </a> <a class="sb-link " href="/UI/Commissions/Management"> <i b-yjl2sbey1b class="bi bi-cash-coin"></i><span b-yjl2sbey1b class="sb-label">Commissions</span> </a> <!-- User Management --> <a class="sb-link " href="/UI/Users/Index"> <i b-yjl2sbey1b class="bi bi-person-gear"></i><span b-yjl2sbey1b class="sb-label">User Management</span> </a> <!-- Fact-Find (expandable sub-menu) --> <a b-yjl2sbey1b class="sb-link " href="#ffSubmenu" role="button" data-bs-toggle="collapse" aria-expanded="false"> <i b-yjl2sbey1b class="bi bi-file-earmark-text"></i><span b-yjl2sbey1b class="sb-label">Fact-Find</span> <i b-yjl2sbey1b class="bi bi-chevron-down sb-caret sb-label"></i> </a> <div b-yjl2sbey1b class="collapse sb-submenu " id="ffSubmenu"> <a class="sb-link " href="/UI/FactFindFormatters/Index"> <i b-yjl2sbey1b class="bi bi-grid"></i><span b-yjl2sbey1b class="sb-label">Formatters</span> </a> <a class="sb-link " href="/UI/FactFindTemplates/Index"> <i b-yjl2sbey1b class="bi bi-layers"></i><span b-yjl2sbey1b class="sb-label">Templates</span> </a> <a class="sb-link " href="/UI/FactFindGenerate"> <i b-yjl2sbey1b class="bi bi-lightning-charge"></i><span b-yjl2sbey1b class="sb-label">Generate &amp; Preview</span> </a> </div> </div> <!-- Auth (pinned to bottom) --> <div b-yjl2sbey1b class="mt-auto border-top border-secondary"> <a b-yjl2sbey1b class="sb-link" href="/UI/business/login"> <i b-yjl2sbey1b class="bi bi-box-arrow-in-right"></i><span b-yjl2sbey1b class="sb-label">Business login</span> </a> </div> </nav> <main b-yjl2sbey1b class="flex-grow-1 py-4"> <div b-yjl2sbey1b class="container-fluid px-4"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css"> <style> body > nav.navbar { position: sticky; top: 0; z-index: 1030; } .dash-hero { background: linear-gradient(135deg, #212529 0%, #343a40 100%); color: #fff; } .dash-card { border: none; border-radius: 12px; transition: transform 0.15s ease, box-shadow 0.15s ease; } .dash-card:hover { transform: translateY(-3px); box-shadow: 0 8px 24px rgba(0,0,0,0.10) !important; } .dash-icon { width: 48px; height: 48px; border-radius: 12px; display: flex; align-items: center; justify-content: center; font-size: 1.4rem; } .dash-stat-value { font-size: 2rem; font-weight: 700; line-height: 1; } .dash-card-title { font-size: 0.95rem; font-weight: 600; } .dash-card-text { font-size: 0.78rem; } /* Discreet business-login link pinned to the bottom-right corner. */ .home-login-link { position: fixed; bottom: 1rem; right: 1.25rem; z-index: 1040; } </style> <!-- Hero --> <div class="dash-hero py-4 mb-4"> <div class="container text-center"> <h1 class="display-6 fw-bold mb-2">Wealthmax PM CRM</h1> <p class="lead text-white-50 mb-0" style="max-width: 640px; margin: 0 auto;"> Testing harness dashboard &mdash; system tools, integrations, and live service health at a glance. </p> </div> </div> <div class="container pb-5"> <!-- Tool / Integration cards --> <div class="row g-3 mb-4"> <!-- Tenants Created --> <div class="col-6 col-md-4 col-lg-3"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="d-flex align-items-start justify-content-between mb-2"> <div class="dash-icon bg-primary bg-opacity-10 text-primary"> <i class="bi bi-building-fill"></i> </div> <span class="badge bg-secondary bg-opacity-10 text-secondary">Sample</span> </div> <div class="dash-stat-value text-dark">12</div> <div class="dash-card-title text-dark mt-1">Tenants Created</div> <p class="dash-card-text text-muted mb-0">Total onboarded tenants in this environment.</p> </div> </div> </div> <!-- Build Logs --> <div class="col-6 col-md-4 col-lg-3"> <a href="/UI/DevLogs" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-dark bg-opacity-10 text-dark mb-2"> <i class="bi bi-terminal-fill"></i> </div> <div class="dash-card-title text-dark">Build &amp; App Logs</div> <p class="dash-card-text text-muted mb-0">Browse structured application logs by date and level.</p> </div> </div> </a> </div> <!-- Swagger --> <div class="col-6 col-md-4 col-lg-3"> <a href="/swagger" target="_blank" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="d-flex align-items-start justify-content-between mb-2"> <div class="dash-icon bg-success bg-opacity-10 text-success"> <i class="bi bi-braces"></i> </div> <i class="bi bi-box-arrow-up-right text-muted small"></i> </div> <div class="dash-card-title text-dark">Swagger / API Docs</div> <p class="dash-card-text text-muted mb-0">Explore and try the REST API via OpenAPI UI.</p> </div> </div> </a> </div> <!-- SignalR --> <div class="col-6 col-md-4 col-lg-3"> <a href="/test-signalr.html" target="_blank" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="d-flex align-items-start justify-content-between mb-2"> <div class="dash-icon bg-info bg-opacity-10 text-info"> <i class="bi bi-broadcast"></i> </div> <i class="bi bi-box-arrow-up-right text-muted small"></i> </div> <div class="dash-card-title text-dark">SignalR Hub</div> <p class="dash-card-text text-muted mb-0">Test real-time notifications over the SignalR hub.</p> </div> </div> </a> </div> <!-- iPipeline --> <div class="col-6 col-md-4 col-lg-3"> <a href="/demo/solution-builder" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-warning bg-opacity-10 text-warning mb-2"> <i class="bi bi-plug-fill"></i> </div> <div class="dash-card-title text-dark">iPipeline</div> <p class="dash-card-text text-muted mb-0">Launch the iPipeline Solution Builder integration.</p> </div> </div> </a> </div> <!-- Fetch Quotes --> <div class="col-6 col-md-4 col-lg-3"> <a href="/demo/solution-builder/events" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-danger bg-opacity-10 text-danger mb-2"> <i class="bi bi-receipt"></i> </div> <div class="dash-card-title text-dark">Fetch Quotes</div> <p class="dash-card-text text-muted mb-0">View quote-notification events returned from the pipeline.</p> </div> </div> </a> </div> <!-- CRM Dashboard --> <div class="col-6 col-md-4 col-lg-3"> <a class="text-decoration-none" href="/UI/Dashboard/Index"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-primary bg-opacity-10 text-primary mb-2"> <i class="bi bi-speedometer2"></i> </div> <div class="dash-card-title text-dark">CRM Dashboard</div> <p class="dash-card-text text-muted mb-0">Cases, clients, and commission overview metrics.</p> </div> </div> </a> </div> <!-- Clients --> <div class="col-6 col-md-4 col-lg-3"> <a class="text-decoration-none" href="/UI/Clients/Index"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-success bg-opacity-10 text-success mb-2"> <i class="bi bi-people-fill"></i> </div> <div class="dash-card-title text-dark">Clients &amp; Cases</div> <p class="dash-card-text text-muted mb-0">Manage client records and advisory cases.</p> </div> </div> </a> </div> </div> <!-- System Health --> <div id="health-card" class="card dash-card shadow-sm mb-4"> <div class="card-body p-3"> <!-- Loading state --> <div id="health-loading" class="text-center py-3"> <div class="spinner-border spinner-border-sm text-primary" role="status"> <span class="visually-hidden">Loading...</span> </div> <span class="ms-2 text-muted">Checking system health...</span> </div> <!-- Error state --> <div id="health-error" class="d-none text-center py-3"> <i class="bi bi-exclamation-triangle fs-4 text-danger d-block mb-2"></i> <p class="text-muted mb-1">Unable to reach the health endpoint.</p> <button class="btn btn-sm btn-outline-secondary" onclick="fetchHealth()"> <i class="bi bi-arrow-clockwise me-1"></i>Retry </button> </div> <!-- Success state --> <div id="health-content" class="d-none"> <div class="d-flex align-items-center mb-3"> <i class="bi bi-heart-pulse fs-4 text-primary me-2"></i> <h5 class="fw-semibold mb-0 me-auto">System Health</h5> <span id="health-status-badge" class="badge"></span> </div> <hr class="my-3"> <div class="row g-2 small"> <div class="col-sm-6"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-clock me-2"></i> <span>Checked: <span id="health-timestamp" class="text-body"></span></span> </div> </div> <div class="col-sm-6"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-speedometer2 me-2"></i> <span>Response: <span id="health-duration" class="text-body"></span></span> </div> </div> <div class="col-sm-6 d-none" id="health-db-row"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-database me-2"></i> <span>Database: <span id="health-database" class="text-body"></span></span> </div> </div> <div class="col-sm-6 d-none" id="health-build-row"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-git me-2"></i> <span>Build: <code id="health-commit"></code> <span id="health-build-date" class="text-muted"></span></span> </div> </div> </div> </div> </div> </div> <!-- Tech Stack --> <div class="text-center"> <div class="d-flex flex-wrap justify-content-center gap-3 text-muted small"> <span><i class="bi bi-gear me-1"></i>.NET 10</span> <span class="text-black-50">|</span> <span><i class="bi bi-database me-1"></i>PostgreSQL</span> <span class="text-black-50">|</span> <span><i class="bi bi-layers me-1"></i>Entity Framework Core</span> <span class="text-black-50">|</span> <span><i class="bi bi-lock me-1"></i>JWT Authentication</span> <span class="text-black-50">|</span> <span><i class="bi bi-book me-1"></i>OpenAPI / Swagger</span> </div> </div> </div> </content> </div> </main> <footer b-yjl2sbey1b class="bg-light border-top py-2 text-center text-muted small"> Wealthmax PM CRM &mdash; Policy Document Testing UI </footer> <script src="/lib/jquery/dist/jquery.min.js"></script> <script src="/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script src="/js/site.js?v=y_Ngd8W21UpuCUhEqGbUKDEqFnNfTjAfb24GhJJGUyM"></script> <script> function escapeHtml(text) { var div = document.createElement('div'); div.appendChild(document.createTextNode(text)); return div.innerHTML; } function statusBadgeClass(status) { switch ((status || '').toLowerCase()) { case 'healthy': return 'bg-success'; case 'degraded': return 'bg-warning text-dark'; default: return 'bg-danger'; } } function fetchHealth() { document.getElementById('health-loading').classList.remove('d-none'); document.getElementById('health-error').classList.add('d-none'); document.getElementById('health-content').classList.add('d-none'); fetch('/api/health') .then(function (response) { if (response.ok || response.status === 503) { return response.json(); } throw new Error('Unexpected status: ' + response.status); }) .then(function (response) { var health = response.data || response; renderHealth(health); document.getElementById('health-loading').classList.add('d-none'); document.getElementById('health-content').classList.remove('d-none'); }) .catch(function () { document.getElementById('health-loading').classList.add('d-none'); document.getElementById('health-error').classList.remove('d-none'); }); } function renderHealth(data) { var badge = document.getElementById('health-status-badge'); badge.textContent = data.status; badge.className = 'badge ' + statusBadgeClass(data.status); document.getElementById('health-timestamp').textContent = new Date(data.timestamp).toLocaleString(); document.getElementById('health-duration').textContent = data.totalDurationMs + ' ms'; var dbRow = document.getElementById('health-db-row'); if (data.databaseName || data.databaseProvider) { var parts = []; if (data.databaseName) parts.push(data.databaseName); if (data.databaseProvider) parts.push(data.databaseProvider); document.getElementById('health-database').textContent = parts.join(' on '); dbRow.classList.remove('d-none'); } else { dbRow.classList.add('d-none'); } var buildRow = document.getElementById('health-build-row'); if (data.commitHash || data.lastBuildDate) { document.getElementById('health-commit').textContent = data.commitHash || ''; document.getElementById('health-build-date').textContent = data.lastBuildDate ? '(' + new Date(data.lastBuildDate).toLocaleDateString() + ')' : ''; buildRow.classList.remove('d-none'); } else { buildRow.classList.add('d-none'); } } fetchHealth(); </script> </body> </html>
2026-07-30 17:59:52.190 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /robots.txt responded 401 in 0.5315 ms
2026-07-30 17:59:20.437 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET / responded 200 in 1.3648 ms
2026-07-30 17:59:20.436 +00:00 [INF] [HTTP] [U:-] [E:-] [C:4e6c3321a390] HTTP GET / 200
Req: [no body] Res: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Home — WM Policy Documents</title> <link rel="stylesheet" href="/lib/bootstrap/dist/css/bootstrap.min.css" /> <link rel="stylesheet" href="/css/site.css?v=xQHUTQJdpYJFKIjDlFCI1X8KDqtO5qaSSeJFSoCP3pA" /> <link rel="stylesheet" href="/css/commissions.css?v=ZRMXSlMSxdLsHmJCZzq1LopWaopJSbVXKu57gvUJG3w" /> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css" /> <style> /* ---- Hover-expand left sidebar -------------------------------------- */ :root { --sb-collapsed: 64px; --sb-expanded: 240px; } body.has-sidebar { /* Reserve space for the collapsed rail; the expanded panel overlays the content on hover, so the content never shifts. */ padding-left: var(--sb-collapsed); } .app-sidebar { position: fixed; top: 0; left: 0; height: 100vh; width: var(--sb-collapsed); overflow-x: hidden; overflow-y: auto; display: flex; flex-direction: column; z-index: 1045; transition: width 0.2s ease; } .app-sidebar:hover, .app-sidebar:focus-within { width: var(--sb-expanded); box-shadow: 0 0 24px rgba(0,0,0,0.35); } .app-sidebar .sb-label { white-space: nowrap; opacity: 0; transition: opacity 0.15s ease; } .app-sidebar:hover .sb-label, .app-sidebar:focus-within .sb-label { opacity: 1; } .sb-link { display: flex; align-items: center; gap: 0.85rem; padding: 0.65rem 0; color: rgba(255,255,255,0.75); text-decoration: none; border-left: 3px solid transparent; } .sb-link:hover { color: #fff; background: rgba(255,255,255,0.08); } .sb-link.active { color: #fff; background: rgba(255,255,255,0.12); border-left-color: #0d6efd; } .sb-link > i:first-child { min-width: var(--sb-collapsed); text-align: center; font-size: 1.15rem; flex-shrink: 0; } .sb-brand { display: flex; align-items: center; gap: 0.85rem; padding: 0.9rem 0; color: #fff; text-decoration: none; font-weight: 700; } .sb-brand > i:first-child { min-width: var(--sb-collapsed); text-align: center; font-size: 1.3rem; flex-shrink: 0; } /* Sub-menu (Fact-Find) */ .sb-submenu .sb-link { font-size: 0.9rem; padding-left: 0; } .sb-submenu .sb-link > i:first-child { font-size: 1rem; } .sb-caret { margin-left: auto; margin-right: 0.9rem; transition: transform 0.15s ease; } .sb-link[aria-expanded="true"] .sb-caret { transform: rotate(180deg); } </style> </head> <body class="d-flex flex-column min-vh-100 has-sidebar"> <nav b-yjl2sbey1b class="app-sidebar navbar-dark bg-dark shadow-sm"> <a class="sb-brand" href="/UI"> <i b-yjl2sbey1b class="bi bi-file-earmark-text"></i> <span b-yjl2sbey1b class="sb-label">Wealthmax</span> </a> <div b-yjl2sbey1b class="d-flex flex-column flex-grow-1"> <a class="sb-link " href="/UI/Dashboard/Index"> <i b-yjl2sbey1b class="bi bi-speedometer2"></i><span b-yjl2sbey1b class="sb-label">Dashboard</span> </a> <a class="sb-link " href="/UI/Templates/Index"> <i b-yjl2sbey1b class="bi bi-collection"></i><span b-yjl2sbey1b class="sb-label">Templates</span> </a> <a class="sb-link " href="/UI/Tokens/Index"> <i b-yjl2sbey1b class="bi bi-braces"></i><span b-yjl2sbey1b class="sb-label">Token Registry</span> </a> <a class="sb-link " href="/UI/Clients/Index"> <i b-yjl2sbey1b class="bi bi-people"></i><span b-yjl2sbey1b class="sb-label">Clients</span> </a> <a class="sb-link " href="/UI/Cases/Index"> <i b-yjl2sbey1b class="bi bi-briefcase"></i><span b-yjl2sbey1b class="sb-label">Cases</span> </a> <a class="sb-link " href="/UI/Reporting/Index"> <i b-yjl2sbey1b class="bi bi-graph-up"></i><span b-yjl2sbey1b class="sb-label">Reports</span> </a> <a class="sb-link " href="/UI/Commissions/Management"> <i b-yjl2sbey1b class="bi bi-cash-coin"></i><span b-yjl2sbey1b class="sb-label">Commissions</span> </a> <!-- User Management --> <a class="sb-link " href="/UI/Users/Index"> <i b-yjl2sbey1b class="bi bi-person-gear"></i><span b-yjl2sbey1b class="sb-label">User Management</span> </a> <!-- Fact-Find (expandable sub-menu) --> <a b-yjl2sbey1b class="sb-link " href="#ffSubmenu" role="button" data-bs-toggle="collapse" aria-expanded="false"> <i b-yjl2sbey1b class="bi bi-file-earmark-text"></i><span b-yjl2sbey1b class="sb-label">Fact-Find</span> <i b-yjl2sbey1b class="bi bi-chevron-down sb-caret sb-label"></i> </a> <div b-yjl2sbey1b class="collapse sb-submenu " id="ffSubmenu"> <a class="sb-link " href="/UI/FactFindFormatters/Index"> <i b-yjl2sbey1b class="bi bi-grid"></i><span b-yjl2sbey1b class="sb-label">Formatters</span> </a> <a class="sb-link " href="/UI/FactFindTemplates/Index"> <i b-yjl2sbey1b class="bi bi-layers"></i><span b-yjl2sbey1b class="sb-label">Templates</span> </a> <a class="sb-link " href="/UI/FactFindGenerate"> <i b-yjl2sbey1b class="bi bi-lightning-charge"></i><span b-yjl2sbey1b class="sb-label">Generate &amp; Preview</span> </a> </div> </div> <!-- Auth (pinned to bottom) --> <div b-yjl2sbey1b class="mt-auto border-top border-secondary"> <a b-yjl2sbey1b class="sb-link" href="/UI/business/login"> <i b-yjl2sbey1b class="bi bi-box-arrow-in-right"></i><span b-yjl2sbey1b class="sb-label">Business login</span> </a> </div> </nav> <main b-yjl2sbey1b class="flex-grow-1 py-4"> <div b-yjl2sbey1b class="container-fluid px-4"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css"> <style> body > nav.navbar { position: sticky; top: 0; z-index: 1030; } .dash-hero { background: linear-gradient(135deg, #212529 0%, #343a40 100%); color: #fff; } .dash-card { border: none; border-radius: 12px; transition: transform 0.15s ease, box-shadow 0.15s ease; } .dash-card:hover { transform: translateY(-3px); box-shadow: 0 8px 24px rgba(0,0,0,0.10) !important; } .dash-icon { width: 48px; height: 48px; border-radius: 12px; display: flex; align-items: center; justify-content: center; font-size: 1.4rem; } .dash-stat-value { font-size: 2rem; font-weight: 700; line-height: 1; } .dash-card-title { font-size: 0.95rem; font-weight: 600; } .dash-card-text { font-size: 0.78rem; } /* Discreet business-login link pinned to the bottom-right corner. */ .home-login-link { position: fixed; bottom: 1rem; right: 1.25rem; z-index: 1040; } </style> <!-- Hero --> <div class="dash-hero py-4 mb-4"> <div class="container text-center"> <h1 class="display-6 fw-bold mb-2">Wealthmax PM CRM</h1> <p class="lead text-white-50 mb-0" style="max-width: 640px; margin: 0 auto;"> Testing harness dashboard &mdash; system tools, integrations, and live service health at a glance. </p> </div> </div> <div class="container pb-5"> <!-- Tool / Integration cards --> <div class="row g-3 mb-4"> <!-- Tenants Created --> <div class="col-6 col-md-4 col-lg-3"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="d-flex align-items-start justify-content-between mb-2"> <div class="dash-icon bg-primary bg-opacity-10 text-primary"> <i class="bi bi-building-fill"></i> </div> <span class="badge bg-secondary bg-opacity-10 text-secondary">Sample</span> </div> <div class="dash-stat-value text-dark">12</div> <div class="dash-card-title text-dark mt-1">Tenants Created</div> <p class="dash-card-text text-muted mb-0">Total onboarded tenants in this environment.</p> </div> </div> </div> <!-- Build Logs --> <div class="col-6 col-md-4 col-lg-3"> <a href="/UI/DevLogs" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-dark bg-opacity-10 text-dark mb-2"> <i class="bi bi-terminal-fill"></i> </div> <div class="dash-card-title text-dark">Build &amp; App Logs</div> <p class="dash-card-text text-muted mb-0">Browse structured application logs by date and level.</p> </div> </div> </a> </div> <!-- Swagger --> <div class="col-6 col-md-4 col-lg-3"> <a href="/swagger" target="_blank" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="d-flex align-items-start justify-content-between mb-2"> <div class="dash-icon bg-success bg-opacity-10 text-success"> <i class="bi bi-braces"></i> </div> <i class="bi bi-box-arrow-up-right text-muted small"></i> </div> <div class="dash-card-title text-dark">Swagger / API Docs</div> <p class="dash-card-text text-muted mb-0">Explore and try the REST API via OpenAPI UI.</p> </div> </div> </a> </div> <!-- SignalR --> <div class="col-6 col-md-4 col-lg-3"> <a href="/test-signalr.html" target="_blank" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="d-flex align-items-start justify-content-between mb-2"> <div class="dash-icon bg-info bg-opacity-10 text-info"> <i class="bi bi-broadcast"></i> </div> <i class="bi bi-box-arrow-up-right text-muted small"></i> </div> <div class="dash-card-title text-dark">SignalR Hub</div> <p class="dash-card-text text-muted mb-0">Test real-time notifications over the SignalR hub.</p> </div> </div> </a> </div> <!-- iPipeline --> <div class="col-6 col-md-4 col-lg-3"> <a href="/demo/solution-builder" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-warning bg-opacity-10 text-warning mb-2"> <i class="bi bi-plug-fill"></i> </div> <div class="dash-card-title text-dark">iPipeline</div> <p class="dash-card-text text-muted mb-0">Launch the iPipeline Solution Builder integration.</p> </div> </div> </a> </div> <!-- Fetch Quotes --> <div class="col-6 col-md-4 col-lg-3"> <a href="/demo/solution-builder/events" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-danger bg-opacity-10 text-danger mb-2"> <i class="bi bi-receipt"></i> </div> <div class="dash-card-title text-dark">Fetch Quotes</div> <p class="dash-card-text text-muted mb-0">View quote-notification events returned from the pipeline.</p> </div> </div> </a> </div> <!-- CRM Dashboard --> <div class="col-6 col-md-4 col-lg-3"> <a class="text-decoration-none" href="/UI/Dashboard/Index"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-primary bg-opacity-10 text-primary mb-2"> <i class="bi bi-speedometer2"></i> </div> <div class="dash-card-title text-dark">CRM Dashboard</div> <p class="dash-card-text text-muted mb-0">Cases, clients, and commission overview metrics.</p> </div> </div> </a> </div> <!-- Clients --> <div class="col-6 col-md-4 col-lg-3"> <a class="text-decoration-none" href="/UI/Clients/Index"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-success bg-opacity-10 text-success mb-2"> <i class="bi bi-people-fill"></i> </div> <div class="dash-card-title text-dark">Clients &amp; Cases</div> <p class="dash-card-text text-muted mb-0">Manage client records and advisory cases.</p> </div> </div> </a> </div> </div> <!-- System Health --> <div id="health-card" class="card dash-card shadow-sm mb-4"> <div class="card-body p-3"> <!-- Loading state --> <div id="health-loading" class="text-center py-3"> <div class="spinner-border spinner-border-sm text-primary" role="status"> <span class="visually-hidden">Loading...</span> </div> <span class="ms-2 text-muted">Checking system health...</span> </div> <!-- Error state --> <div id="health-error" class="d-none text-center py-3"> <i class="bi bi-exclamation-triangle fs-4 text-danger d-block mb-2"></i> <p class="text-muted mb-1">Unable to reach the health endpoint.</p> <button class="btn btn-sm btn-outline-secondary" onclick="fetchHealth()"> <i class="bi bi-arrow-clockwise me-1"></i>Retry </button> </div> <!-- Success state --> <div id="health-content" class="d-none"> <div class="d-flex align-items-center mb-3"> <i class="bi bi-heart-pulse fs-4 text-primary me-2"></i> <h5 class="fw-semibold mb-0 me-auto">System Health</h5> <span id="health-status-badge" class="badge"></span> </div> <hr class="my-3"> <div class="row g-2 small"> <div class="col-sm-6"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-clock me-2"></i> <span>Checked: <span id="health-timestamp" class="text-body"></span></span> </div> </div> <div class="col-sm-6"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-speedometer2 me-2"></i> <span>Response: <span id="health-duration" class="text-body"></span></span> </div> </div> <div class="col-sm-6 d-none" id="health-db-row"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-database me-2"></i> <span>Database: <span id="health-database" class="text-body"></span></span> </div> </div> <div class="col-sm-6 d-none" id="health-build-row"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-git me-2"></i> <span>Build: <code id="health-commit"></code> <span id="health-build-date" class="text-muted"></span></span> </div> </div> </div> </div> </div> </div> <!-- Tech Stack --> <div class="text-center"> <div class="d-flex flex-wrap justify-content-center gap-3 text-muted small"> <span><i class="bi bi-gear me-1"></i>.NET 10</span> <span class="text-black-50">|</span> <span><i class="bi bi-database me-1"></i>PostgreSQL</span> <span class="text-black-50">|</span> <span><i class="bi bi-layers me-1"></i>Entity Framework Core</span> <span class="text-black-50">|</span> <span><i class="bi bi-lock me-1"></i>JWT Authentication</span> <span class="text-black-50">|</span> <span><i class="bi bi-book me-1"></i>OpenAPI / Swagger</span> </div> </div> </div> </content> </div> </main> <footer b-yjl2sbey1b class="bg-light border-top py-2 text-center text-muted small"> Wealthmax PM CRM &mdash; Policy Document Testing UI </footer> <script src="/lib/jquery/dist/jquery.min.js"></script> <script src="/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script src="/js/site.js?v=y_Ngd8W21UpuCUhEqGbUKDEqFnNfTjAfb24GhJJGUyM"></script> <script> function escapeHtml(text) { var div = document.createElement('div'); div.appendChild(document.createTextNode(text)); return div.innerHTML; } function statusBadgeClass(status) { switch ((status || '').toLowerCase()) { case 'healthy': return 'bg-success'; case 'degraded': return 'bg-warning text-dark'; default: return 'bg-danger'; } } function fetchHealth() { document.getElementById('health-loading').classList.remove('d-none'); document.getElementById('health-error').classList.add('d-none'); document.getElementById('health-content').classList.add('d-none'); fetch('/api/health') .then(function (response) { if (response.ok || response.status === 503) { return response.json(); } throw new Error('Unexpected status: ' + response.status); }) .then(function (response) { var health = response.data || response; renderHealth(health); document.getElementById('health-loading').classList.add('d-none'); document.getElementById('health-content').classList.remove('d-none'); }) .catch(function () { document.getElementById('health-loading').classList.add('d-none'); document.getElementById('health-error').classList.remove('d-none'); }); } function renderHealth(data) { var badge = document.getElementById('health-status-badge'); badge.textContent = data.status; badge.className = 'badge ' + statusBadgeClass(data.status); document.getElementById('health-timestamp').textContent = new Date(data.timestamp).toLocaleString(); document.getElementById('health-duration').textContent = data.totalDurationMs + ' ms'; var dbRow = document.getElementById('health-db-row'); if (data.databaseName || data.databaseProvider) { var parts = []; if (data.databaseName) parts.push(data.databaseName); if (data.databaseProvider) parts.push(data.databaseProvider); document.getElementById('health-database').textContent = parts.join(' on '); dbRow.classList.remove('d-none'); } else { dbRow.classList.add('d-none'); } var buildRow = document.getElementById('health-build-row'); if (data.commitHash || data.lastBuildDate) { document.getElementById('health-commit').textContent = data.commitHash || ''; document.getElementById('health-build-date').textContent = data.lastBuildDate ? '(' + new Date(data.lastBuildDate).toLocaleDateString() + ')' : ''; buildRow.classList.remove('d-none'); } else { buildRow.classList.add('d-none'); } } fetchHealth(); </script> </body> </html>
2026-07-30 17:59:20.343 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /robots.txt responded 401 in 0.5339 ms
2026-07-30 17:57:54.846 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /.env responded 401 in 0.5349 ms
2026-07-30 17:57:54.602 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /.git/config responded 401 in 0.5142 ms
2026-07-30 17:56:44.864 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /settings.js responded 401 in 0.4341 ms
2026-07-30 17:56:44.858 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /js/site.js responded 200 in 0.3323 ms
2026-07-30 17:56:44.858 +00:00 [INF] [HTTP] [U:-] [E:-] [C:-] HTTP GET /js/site.js 200
Req: [no body] Res: // Please see documentation at https://learn.microsoft.com/aspnet/core/client-side/bundling-and-minification // for details on configuring this project to bundle and minify static web assets. // Write your JavaScript code.
2026-07-30 17:56:44.854 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /lib/bootstrap/dist/js/bootstrap.bundle.min.js responded 200 in 2.0314 ms
2026-07-30 17:56:44.853 +00:00 [INF] [HTTP] [U:-] [E:-] [C:-] HTTP GET /lib/bootstrap/dist/js/bootstrap.bundle.min.js 200
Req: [no body] Res: /*! * Bootstrap v5.3.3 (https://getbootstrap.com/) * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t=new Map,e={set(e,i,n){t.has(e)||t.set(e,new Map);const s=t.get(e);s.has(i)||0===s.size?s.set(i,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(e,i)=>t.has(e)&&t.get(e).get(i)||null,remove(e,i){if(!t.has(e))return;const n=t.get(e);n.delete(i),0===n.size&&t.delete(e)}},i="transitionend",n=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),s=t=>{t.dispatchEvent(new Event(i))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(n(t)):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,m=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},g=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,_=(t,e,n=!0)=>{if(!n)return void g(t);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let r=!1;const a=({target:n})=>{n===e&&(r=!0,e.removeEventListener(i,a),g(t))};e.addEventListener(i,a),setTimeout((()=>{r||s(e)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=I(t);return C.has(o)||(o=t),[n,s,o]}function S(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return P(s,{delegateTarget:r}),n.oneOff&&N.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return P(n,{delegateTarget:t}),i.oneOff&&N.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function D(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function $(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&D(t,e,i,r.callable,r.delegationSelector)}function I(t){return t=t.replace(y,""),T[t]||t}const N={on(t,e,i,n){S(t,e,i,n,!1)},one(t,e,i,n){S(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))$(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(w,"");a&&!e.includes(s)||D(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;D(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==I(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=P(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function P(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function j(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function M(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const F={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${M(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${M(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=j(t.dataset[n])}return e},getDataAttribute:(t,e)=>j(t.getAttribute(`data-bs-${M(e)}`))};class H{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?F.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?F.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],r=o(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(r))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`)}var i}}class W extends H{constructor(t,i){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(i),e.set(this._element,this.constructor.DATA_KEY,this))}dispose(){e.remove(this._element,this.constructor.DATA_KEY),N.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return e.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.3"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const B=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e?e.split(",").map((t=>n(t))).join(","):null},z={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))},getSelectorFromElement(t){const e=B(t);return e&&z.findOne(e)?e:null},getElementFromSelector(t){const e=B(t);return e?z.findOne(e):null},getMultipleElementsFromSelector(t){const e=B(t);return e?z.find(e):[]}},R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;N.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const s=z.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},q=".bs.alert",V=`close${q}`,K=`closed${q}`;class Q extends W{static get NAME(){return"alert"}close(){if(N.trigger(this._element,V).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),N.trigger(this._element,K),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Q.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(Q,"close"),m(Q);const X='[data-bs-toggle="button"]';class Y extends W{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=Y.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}N.on(document,"click.bs.button.data-api",X,(t=>{t.preventDefault();const e=t.target.closest(X);Y.getOrCreateInstance(e).toggle()})),m(Y);const U=".bs.swipe",G=`touchstart${U}`,J=`touchmove${U}`,Z=`touchend${U}`,tt=`pointerdown${U}`,et=`pointerup${U}`,it={endCallback:null,leftCallback:null,rightCallback:null},nt={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class st extends H{constructor(t,e){super(),this._element=t,t&&st.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return it}static get DefaultType(){return nt}static get NAME(){return"swipe"}dispose(){N.off(this._element,U)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),g(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&g(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(N.on(this._element,tt,(t=>this._start(t))),N.on(this._element,et,(t=>this._end(t))),this._element.classList.add("pointer-event")):(N.on(this._element,G,(t=>this._start(t))),N.on(this._element,J,(t=>this._move(t))),N.on(this._element,Z,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const ot=".bs.carousel",rt=".data-api",at="next",lt="prev",ct="left",ht="right",dt=`slide${ot}`,ut=`slid${ot}`,ft=`keydown${ot}`,pt=`mouseenter${ot}`,mt=`mouseleave${ot}`,gt=`dragstart${ot}`,_t=`load${ot}${rt}`,bt=`click${ot}${rt}`,vt="carousel",yt="active",wt=".active",At=".carousel-item",Et=wt+At,Tt={ArrowLeft:ht,ArrowRight:ct},Ct={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Ot={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class xt extends W{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=z.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===vt&&this.cycle()}static get Default(){return Ct}static get DefaultType(){return Ot}static get NAME(){return"carousel"}next(){this._slide(at)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(lt)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?N.one(this._element,ut,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void N.one(this._element,ut,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?at:lt;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&N.on(this._element,ft,(t=>this._keydown(t))),"hover"===this._config.pause&&(N.on(this._element,pt,(()=>this.pause())),N.on(this._element,mt,(()=>this._maybeEnableCycle()))),this._config.touch&&st.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of z.find(".carousel-item img",this._element))N.on(t,gt,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(ct)),rightCallback:()=>this._slide(this._directionToOrder(ht)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new st(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=Tt[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=z.findOne(wt,this._indicatorsElement);e.classList.remove(yt),e.removeAttribute("aria-current");const i=z.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(yt),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===at,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>N.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(dt).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(yt),i.classList.remove(yt,c,l),this._isSliding=!1,r(ut)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return z.findOne(Et,this._element)}_getItems(){return z.find(At,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===ct?lt:at:t===ct?at:lt}_orderToDirection(t){return p()?t===lt?ct:ht:t===lt?ht:ct}static jQueryInterface(t){return this.each((function(){const e=xt.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}N.on(document,bt,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=z.getElementFromSelector(this);if(!e||!e.classList.contains(vt))return;t.preventDefault();const i=xt.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===F.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),N.on(window,_t,(()=>{const t=z.find('[data-bs-ride="carousel"]');for(const e of t)xt.getOrCreateInstance(e)})),m(xt);const kt=".bs.collapse",Lt=`show${kt}`,St=`shown${kt}`,Dt=`hide${kt}`,$t=`hidden${kt}`,It=`click${kt}.data-api`,Nt="show",Pt="collapse",jt="collapsing",Mt=`:scope .${Pt} .${Pt}`,Ft='[data-bs-toggle="collapse"]',Ht={parent:null,toggle:!0},Wt={parent:"(null|element)",toggle:"boolean"};class Bt extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=z.find(Ft);for(const t of i){const e=z.getSelectorFromElement(t),i=z.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Ht}static get DefaultType(){return Wt}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Bt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(N.trigger(this._element,Lt).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Pt),this._element.classList.add(jt),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(jt),this._element.classList.add(Pt,Nt),this._element.style[e]="",N.trigger(this._element,St)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(N.trigger(this._element,Dt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(jt),this._element.classList.remove(Pt,Nt);for(const t of this._triggerArray){const e=z.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(jt),this._element.classList.add(Pt),N.trigger(this._element,$t)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(Nt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Ft);for(const e of t){const t=z.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=z.find(Mt,this._config.parent);return z.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Bt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}N.on(document,It,Ft,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of z.getMultipleElementsFromSelector(this))Bt.getOrCreateInstance(t,{toggle:!1}).toggle()})),m(Bt);var zt="top",Rt="bottom",qt="right",Vt="left",Kt="auto",Qt=[zt,Rt,qt,Vt],Xt="start",Yt="end",Ut="clippingParents",Gt="viewport",Jt="popper",Zt="reference",te=Qt.reduce((function(t,e){return t.concat([e+"-"+Xt,e+"-"+Yt])}),[]),ee=[].concat(Qt,[Kt]).reduce((function(t,e){return t.concat([e,e+"-"+Xt,e+"-"+Yt])}),[]),ie="beforeRead",ne="read",se="afterRead",oe="beforeMain",re="main",ae="afterMain",le="beforeWrite",ce="write",he="afterWrite",de=[ie,ne,se,oe,re,ae,le,ce,he];function ue(t){return t?(t.nodeName||"").toLowerCase():null}function fe(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function pe(t){return t instanceof fe(t).Element||t instanceof Element}function me(t){return t instanceof fe(t).HTMLElement||t instanceof HTMLElement}function ge(t){return"undefined"!=typeof ShadowRoot&&(t instanceof fe(t).ShadowRoot||t instanceof ShadowRoot)}const _e={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];me(s)&&ue(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});me(n)&&ue(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function be(t){return t.split("-")[0]}var ve=Math.max,ye=Math.min,we=Math.round;function Ae(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function Ee(){return!/^((?!chrome|android).)*safari/i.test(Ae())}function Te(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&me(t)&&(s=t.offsetWidth>0&&we(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&we(n.height)/t.offsetHeight||1);var r=(pe(t)?fe(t):window).visualViewport,a=!Ee()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function Ce(t){var e=Te(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Oe(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&ge(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function xe(t){return fe(t).getComputedStyle(t)}function ke(t){return["table","td","th"].indexOf(ue(t))>=0}function Le(t){return((pe(t)?t.ownerDocument:t.document)||window.document).documentElement}function Se(t){return"html"===ue(t)?t:t.assignedSlot||t.parentNode||(ge(t)?t.host:null)||Le(t)}function De(t){return me(t)&&"fixed"!==xe(t).position?t.offsetParent:null}function $e(t){for(var e=fe(t),i=De(t);i&&ke(i)&&"static"===xe(i).position;)i=De(i);return i&&("html"===ue(i)||"body"===ue(i)&&"static"===xe(i).position)?e:i||function(t){var e=/firefox/i.test(Ae());if(/Trident/i.test(Ae())&&me(t)&&"fixed"===xe(t).position)return null;var i=Se(t);for(ge(i)&&(i=i.host);me(i)&&["html","body"].indexOf(ue(i))<0;){var n=xe(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Ie(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Ne(t,e,i){return ve(t,ye(e,i))}function Pe(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function je(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const Me={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=be(i.placement),l=Ie(a),c=[Vt,qt].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return Pe("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:je(t,Qt))}(s.padding,i),d=Ce(o),u="y"===l?zt:Vt,f="y"===l?Rt:qt,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=$e(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=Ne(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Oe(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Fe(t){return t.split("-")[1]}var He={top:"auto",right:"auto",bottom:"auto",left:"auto"};function We(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,m=void 0===p?0:p,g="function"==typeof h?h({x:f,y:m}):{x:f,y:m};f=g.x,m=g.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=Vt,y=zt,w=window;if(c){var A=$e(i),E="clientHeight",T="clientWidth";A===fe(i)&&"static"!==xe(A=Le(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===zt||(s===Vt||s===qt)&&o===Yt)&&(y=Rt,m-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,m*=l?1:-1),s!==Vt&&(s!==zt&&s!==Rt||o!==Yt)||(v=qt,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&He),x=!0===h?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:we(i*s)/s||0,y:we(n*s)/s||0}}({x:f,y:m},fe(i)):{x:f,y:m};return f=x.x,m=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?m+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const Be={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:be(e.placement),variation:Fe(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,We(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,We(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var ze={passive:!0};const Re={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=fe(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,ze)})),a&&l.addEventListener("resize",i.update,ze),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,ze)})),a&&l.removeEventListener("resize",i.update,ze)}},data:{}};var qe={left:"right",right:"left",bottom:"top",top:"bottom"};function Ve(t){return t.replace(/left|right|bottom|top/g,(function(t){return qe[t]}))}var Ke={start:"end",end:"start"};function Qe(t){return t.replace(/start|end/g,(function(t){return Ke[t]}))}function Xe(t){var e=fe(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Ye(t){return Te(Le(t)).left+Xe(t).scrollLeft}function Ue(t){var e=xe(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ge(t){return["html","body","#document"].indexOf(ue(t))>=0?t.ownerDocument.body:me(t)&&Ue(t)?t:Ge(Se(t))}function Je(t,e){var i;void 0===e&&(e=[]);var n=Ge(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=fe(n),r=s?[o].concat(o.visualViewport||[],Ue(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Je(Se(r)))}function Ze(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function ti(t,e,i){return e===Gt?Ze(function(t,e){var i=fe(t),n=Le(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Ee();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+Ye(t),y:l}}(t,i)):pe(e)?function(t,e){var i=Te(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):Ze(function(t){var e,i=Le(t),n=Xe(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=ve(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=ve(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+Ye(t),l=-n.scrollTop;return"rtl"===xe(s||i).direction&&(a+=ve(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Le(t)))}function ei(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?be(s):null,r=s?Fe(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case zt:e={x:a,y:i.y-n.height};break;case Rt:e={x:a,y:i.y+i.height};break;case qt:e={x:i.x+i.width,y:l};break;case Vt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?Ie(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case Xt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Yt:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ii(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?Ut:a,c=i.rootBoundary,h=void 0===c?Gt:c,d=i.elementContext,u=void 0===d?Jt:d,f=i.altBoundary,p=void 0!==f&&f,m=i.padding,g=void 0===m?0:m,_=Pe("number"!=typeof g?g:je(g,Qt)),b=u===Jt?Zt:Jt,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=Je(Se(t)),i=["absolute","fixed"].indexOf(xe(t).position)>=0&&me(t)?$e(t):t;return pe(i)?e.filter((function(t){return pe(t)&&Oe(t,i)&&"body"!==ue(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=ti(t,i,n);return e.top=ve(s.top,e.top),e.right=ye(s.right,e.right),e.bottom=ye(s.bottom,e.bottom),e.left=ve(s.left,e.left),e}),ti(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(pe(y)?y:y.contextElement||Le(t.elements.popper),l,h,r),A=Te(t.elements.reference),E=ei({reference:A,element:v,strategy:"absolute",placement:s}),T=Ze(Object.assign({},v,E)),C=u===Jt?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===Jt&&x){var k=x[s];Object.keys(O).forEach((function(t){var e=[qt,Rt].indexOf(t)>=0?1:-1,i=[zt,Rt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function ni(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?ee:l,h=Fe(n),d=h?a?te:te.filter((function(t){return Fe(t)===h})):Qt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ii(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[be(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const si={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=be(g),b=l||(_!==g&&p?function(t){if(be(t)===Kt)return[];var e=Ve(t);return[Qe(t),e,Qe(e)]}(g):[Ve(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(be(i)===Kt?ni(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C<v.length;C++){var O=v[C],x=be(O),k=Fe(O)===Xt,L=[zt,Rt].indexOf(x)>=0,S=L?"width":"height",D=ii(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),$=L?k?qt:Vt:k?Rt:zt;y[S]>w[S]&&($=Ve($));var I=Ve($),N=[];if(o&&N.push(D[x]<=0),a&&N.push(D[$]<=0,D[I]<=0),N.every((function(t){return t}))){T=O,E=!1;break}A.set(O,N)}if(E)for(var P=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},j=p?3:1;j>0&&"break"!==P(j);j--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function oi(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function ri(t){return[zt,qt,Rt,Vt].some((function(e){return t[e]>=0}))}const ai={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ii(e,{elementContext:"reference"}),a=ii(e,{altBoundary:!0}),l=oi(r,n),c=oi(a,s,o),h=ri(l),d=ri(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},li={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=ee.reduce((function(t,i){return t[i]=function(t,e,i){var n=be(t),s=[Vt,zt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[Vt,qt].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},ci={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=ei({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},hi={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ii(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=be(e.placement),b=Fe(e.placement),v=!b,y=Ie(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,S="y"===y?zt:Vt,D="y"===y?Rt:qt,$="y"===y?"height":"width",I=A[y],N=I+g[S],P=I-g[D],j=f?-T[$]/2:0,M=b===Xt?E[$]:T[$],F=b===Xt?-T[$]:-E[$],H=e.elements.arrow,W=f&&H?Ce(H):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=B[S],R=B[D],q=Ne(0,E[$],W[$]),V=v?E[$]/2-j-q-z-O.mainAxis:M-q-z-O.mainAxis,K=v?-E[$]/2+j+q+R+O.mainAxis:F+q+R+O.mainAxis,Q=e.elements.arrow&&$e(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=I+K-Y,G=Ne(f?ye(N,I+V-Y-X):N,I,f?ve(P,U):P);A[y]=G,k[y]=G-I}if(a){var J,Z="x"===y?zt:Vt,tt="x"===y?Rt:qt,et=A[w],it="y"===w?"height":"width",nt=et+g[Z],st=et-g[tt],ot=-1!==[zt,Vt].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=Ne(t,e,i);return n>i?i:n}(at,et,lt):Ne(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function di(t,e,i){void 0===i&&(i=!1);var n,s,o=me(e),r=me(e)&&function(t){var e=t.getBoundingClientRect(),i=we(e.width)/t.offsetWidth||1,n=we(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=Le(e),l=Te(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==ue(e)||Ue(a))&&(c=(n=e)!==fe(n)&&me(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:Xe(n)),me(e)?((h=Te(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=Ye(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function ui(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var fi={placement:"bottom",modifiers:[],strategy:"absolute"};function pi(){for(var t=arguments.length,e=new Array(t),i=0;i<t;i++)e[i]=arguments[i];return!e.some((function(t){return!(t&&"function"==typeof t.getBoundingClientRect)}))}function mi(t){void 0===t&&(t={});var e=t,i=e.defaultModifiers,n=void 0===i?[]:i,s=e.defaultOptions,o=void 0===s?fi:s;return function(t,e,i){void 0===i&&(i=o);var s,r,a={placement:"bottom",orderedModifiers:[],options:Object.assign({},fi,o),modifiersData:{},elements:{reference:t,popper:e},attributes:{},styles:{}},l=[],c=!1,h={state:a,setOptions:function(i){var s="function"==typeof i?i(a.options):i;d(),a.options=Object.assign({},o,a.options,s),a.scrollParents={reference:pe(t)?Je(t):t.contextElement?Je(t.contextElement):[],popper:Je(e)};var r,c,u=function(t){var e=ui(t);return de.reduce((function(t,i){return t.concat(e.filter((function(t){return t.phase===i})))}),[])}((r=[].concat(n,a.options.modifiers),c=r.reduce((function(t,e){var i=t[e.name];return t[e.name]=i?Object.assign({},i,e,{options:Object.assign({},i.options,e.options),data:Object.assign({},i.data,e.data)}):e,t}),{}),Object.keys(c).map((function(t){return c[t]}))));return a.orderedModifiers=u.filter((function(t){return t.enabled})),a.orderedModifiers.forEach((function(t){var e=t.name,i=t.options,n=void 0===i?{}:i,s=t.effect;if("function"==typeof s){var o=s({state:a,name:e,instance:h,options:n});l.push(o||function(){})}})),h.update()},forceUpdate:function(){if(!c){var t=a.elements,e=t.reference,i=t.popper;if(pi(e,i)){a.rects={reference:di(e,$e(i),"fixed"===a.options.strategy),popper:Ce(i)},a.reset=!1,a.placement=a.options.placement,a.orderedModifiers.forEach((function(t){return a.modifiersData[t.name]=Object.assign({},t.data)}));for(var n=0;n<a.orderedModifiers.length;n++)if(!0!==a.reset){var s=a.orderedModifiers[n],o=s.fn,r=s.options,l=void 0===r?{}:r,d=s.name;"function"==typeof o&&(a=o({state:a,options:l,name:d,instance:h})||a)}else a.reset=!1,n=-1}}},update:(s=function(){return new Promise((function(t){h.forceUpdate(),t(a)}))},function(){return r||(r=new Promise((function(t){Promise.resolve().then((function(){r=void 0,t(s())}))}))),r}),destroy:function(){d(),c=!0}};if(!pi(t,e))return h;function d(){l.forEach((function(t){return t()})),l=[]}return h.setOptions(i).then((function(t){!c&&i.onFirstUpdate&&i.onFirstUpdate(t)})),h}}var gi=mi(),_i=mi({defaultModifiers:[Re,ci,Be,_e]}),bi=mi({defaultModifiers:[Re,ci,Be,_e,li,si,hi,Me,ai]});const vi=Object.freeze(Object.defineProperty({__proto__:null,afterMain:ae,afterRead:se,afterWrite:he,applyStyles:_e,arrow:Me,auto:Kt,basePlacements:Qt,beforeMain:oe,beforeRead:ie,beforeWrite:le,bottom:Rt,clippingParents:Ut,computeStyles:Be,createPopper:bi,createPopperBase:gi,createPopperLite:_i,detectOverflow:ii,end:Yt,eventListeners:Re,flip:si,hide:ai,left:Vt,main:re,modifierPhases:de,offset:li,placements:ee,popper:Jt,popperGenerator:mi,popperOffsets:ci,preventOverflow:hi,read:ne,reference:Zt,right:qt,start:Xt,top:zt,variationPlacements:te,viewport:Gt,write:ce},Symbol.toStringTag,{value:"Module"})),yi="dropdown",wi=".bs.dropdown",Ai=".data-api",Ei="ArrowUp",Ti="ArrowDown",Ci=`hide${wi}`,Oi=`hidden${wi}`,xi=`show${wi}`,ki=`shown${wi}`,Li=`click${wi}${Ai}`,Si=`keydown${wi}${Ai}`,Di=`keyup${wi}${Ai}`,$i="show",Ii='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',Ni=`${Ii}.${$i}`,Pi=".dropdown-menu",ji=p()?"top-end":"top-start",Mi=p()?"top-start":"top-end",Fi=p()?"bottom-end":"bottom-start",Hi=p()?"bottom-start":"bottom-end",Wi=p()?"left-start":"right-start",Bi=p()?"right-start":"left-start",zi={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},Ri={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class qi extends W{constructor(t,e){super(t,e),this._popper=null,this._parent=this._element.parentNode,this._menu=z.next(this._element,Pi)[0]||z.prev(this._element,Pi)[0]||z.findOne(Pi,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return zi}static get DefaultType(){return Ri}static get NAME(){return yi}toggle(){return this._isShown()?this.hide():this.show()}show(){if(l(this._element)||this._isShown())return;const t={relatedTarget:this._element};if(!N.trigger(this._element,xi,t).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(".navbar-nav"))for(const t of[].concat(...document.body.children))N.on(t,"mouseover",h);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add($i),this._element.classList.add($i),N.trigger(this._element,ki,t)}}hide(){if(l(this._element)||!this._isShown())return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){if(!N.trigger(this._element,Ci,t).defaultPrevented){if("ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.off(t,"mouseover",h);this._popper&&this._popper.destroy(),this._menu.classList.remove($i),this._element.classList.remove($i),this._element.setAttribute("aria-expanded","false"),F.removeDataAttribute(this._menu,"popper"),N.trigger(this._element,Oi,t)}}_getConfig(t){if("object"==typeof(t=super._getConfig(t)).reference&&!o(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${yi.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(){if(void 0===vi)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let t=this._element;"parent"===this._config.reference?t=this._parent:o(this._config.reference)?t=r(this._config.reference):"object"==typeof this._config.reference&&(t=this._config.reference);const e=this._getPopperConfig();this._popper=bi(t,this._menu,e)}_isShown(){return this._menu.classList.contains($i)}_getPlacement(){const t=this._parent;if(t.classList.contains("dropend"))return Wi;if(t.classList.contains("dropstart"))return Bi;if(t.classList.contains("dropup-center"))return"top";if(t.classList.contains("dropdown-center"))return"bottom";const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?Mi:ji:e?Hi:Fi}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(F.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...g(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=z.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Ti,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=z.find(Ni);for(const i of e){const e=qi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ei,Ti].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ii)?this:z.prev(this,Ii)[0]||z.next(this,Ii)[0]||z.findOne(Ii,t.delegateTarget.parentNode),o=qi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}N.on(document,Si,Ii,qi.dataApiKeydownHandler),N.on(document,Si,Pi,qi.dataApiKeydownHandler),N.on(document,Li,qi.clearMenus),N.on(document,Di,qi.clearMenus),N.on(document,Li,Ii,(function(t){t.preventDefault(),qi.getOrCreateInstance(this).toggle()})),m(qi);const Vi="backdrop",Ki="show",Qi=`mousedown.bs.${Vi}`,Xi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Yi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ui extends H{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Xi}static get DefaultType(){return Yi}static get NAME(){return Vi}show(t){if(!this._config.isVisible)return void g(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(Ki),this._emulateAnimation((()=>{g(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Ki),this._emulateAnimation((()=>{this.dispose(),g(t)}))):g(t)}dispose(){this._isAppended&&(N.off(this._element,Qi),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),N.on(t,Qi,(()=>{g(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const Gi=".bs.focustrap",Ji=`focusin${Gi}`,Zi=`keydown.tab${Gi}`,tn="backward",en={autofocus:!0,trapElement:null},nn={autofocus:"boolean",trapElement:"element"};class sn extends H{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return en}static get DefaultType(){return nn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),N.off(document,Gi),N.on(document,Ji,(t=>this._handleFocusin(t))),N.on(document,Zi,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,N.off(document,Gi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=z.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===tn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?tn:"forward")}}const on=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",rn=".sticky-top",an="padding-right",ln="margin-right";class cn{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,an,(e=>e+t)),this._setElementAttributes(on,an,(e=>e+t)),this._setElementAttributes(rn,ln,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,an),this._resetElementAttributes(on,an),this._resetElementAttributes(rn,ln)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&F.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=F.getDataAttribute(t,e);null!==i?(F.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(co [TRUNCATED — original size: 80721 bytes]
2026-07-30 17:56:44.845 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /js/config.js responded 401 in 0.4927 ms
2026-07-30 17:56:44.844 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /js/env.js responded 401 in 0.3617 ms
2026-07-30 17:56:44.843 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /config.json responded 401 in 0.4023 ms
2026-07-30 17:56:44.838 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /.env.production responded 401 in 0.4568 ms
2026-07-30 17:56:44.817 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /.env.local responded 401 in 0.4117 ms
2026-07-30 17:56:44.816 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /lib/jquery/dist/jquery.min.js responded 200 in 1.4096 ms
2026-07-30 17:56:44.815 +00:00 [INF] [HTTP] [U:-] [E:-] [C:-] HTTP GET /lib/jquery/dist/jquery.min.js 200
Req: [no body] Res: /*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ !function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}function fe(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}ce.fn=ce.prototype={jquery:t,constructor:ce,length:0,toArray:function(){return ae.call(this)},get:function(e){return null==e?ae.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=ce.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return ce.each(this,e)},map:function(n){return this.pushStack(ce.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(ae.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(ce.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(ce.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:s,sort:oe.sort,splice:oe.splice},ce.extend=ce.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||v(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(ce.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||ce.isPlainObject(n)?n:{},i=!1,a[t]=ce.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},ce.extend({expando:"jQuery"+(t+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==i.call(e))&&(!(t=r(e))||"function"==typeof(n=ue.call(t,"constructor")&&t.constructor)&&o.call(n)===a)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){m(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(c(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},text:function(e){var t,n="",r=0,i=e.nodeType;if(!i)while(t=e[r++])n+=ce.text(t);return 1===i||11===i?e.textContent:9===i?e.documentElement.textContent:3===i||4===i?e.nodeValue:n},makeArray:function(e,t){var n=t||[];return null!=e&&(c(Object(e))?ce.merge(n,"string"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:se.call(t,e,n)},isXMLDoc:function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!l.test(t||n&&n.nodeName||"HTML")},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(c(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:le}),"function"==typeof Symbol&&(ce.fn[Symbol.iterator]=oe[Symbol.iterator]),ce.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var pe=oe.pop,de=oe.sort,he=oe.splice,ge="[\\x20\\t\\r\\n\\f]",ve=new RegExp("^"+ge+"+|((?:^|[^\\\\])(?:\\\\.)*)"+ge+"+$","g");ce.contains=function(e,t){var n=t&&t.parentNode;return e===n||!(!n||1!==n.nodeType||!(e.contains?e.contains(n):e.compareDocumentPosition&&16&e.compareDocumentPosition(n)))};var f=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;function p(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e}ce.escapeSelector=function(e){return(e+"").replace(f,p)};var ye=C,me=s;!function(){var e,b,w,o,a,T,r,C,d,i,k=me,S=ce.expando,E=0,n=0,s=W(),c=W(),u=W(),h=W(),l=function(e,t){return e===t&&(a=!0),0},f="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",t="(?:\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",p="\\["+ge+"*("+t+")(?:"+ge+"*([*^$|!~]?=)"+ge+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+t+"))|)"+ge+"*\\]",g=":("+t+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+p+")*)|.*)\\)|)",v=new RegExp(ge+"+","g"),y=new RegExp("^"+ge+"*,"+ge+"*"),m=new RegExp("^"+ge+"*([>+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="<a id='"+S+"' href='' disabled='disabled'></a><select id='"+S+"-\r\\' disabled='disabled'><option selected=''></option></select>",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0<I(t,T,null,[e]).length},I.contains=function(e,t){return(e.ownerDocument||e)!=T&&V(e),ce.contains(e,t)},I.attr=function(e,t){(e.ownerDocument||e)!=T&&V(e);var n=b.attrHandle[t.toLowerCase()],r=n&&ue.call(b.attrHandle,t.toLowerCase())?n(e,t,!C):void 0;return void 0!==r?r:e.getAttribute(t)},I.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},ce.uniqueSort=function(e){var t,n=[],r=0,i=0;if(a=!le.sortStable,o=!le.sortStable&&ae.call(e,0),de.call(e,l),a){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)he.call(e,n[r],1)}return o=null,e},ce.fn.uniqueSort=function(){return this.pushStack(ce.uniqueSort(ae.apply(this)))},(b=ce.expr={cacheLength:50,createPseudo:F,match:D,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(v," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(d,e,t,h,g){var v="nth"!==d.slice(0,3),y="last"!==d.slice(-4),m="of-type"===e;return 1===h&&0===g?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u=v!==y?"nextSibling":"previousSibling",l=e.parentNode,c=m&&e.nodeName.toLowerCase(),f=!n&&!m,p=!1;if(l){if(v){while(u){o=e;while(o=o[u])if(m?fe(o,c):1===o.nodeType)return!1;s=u="only"===d&&!s&&"nextSibling"}return!0}if(s=[y?l.firstChild:l.lastChild],y&&f){p=(a=(r=(i=l[S]||(l[S]={}))[d]||[])[0]===E&&r[1])&&r[2],o=a&&l.childNodes[a];while(o=++a&&o&&o[u]||(p=a=0)||s.pop())if(1===o.nodeType&&++p&&o===e){i[d]=[E,a,p];break}}else if(f&&(p=a=(r=(i=e[S]||(e[S]={}))[d]||[])[0]===E&&r[1]),!1===p)while(o=++a&&o&&o[u]||(p=a=0)||s.pop())if((m?fe(o,c):1===o.nodeType)&&++p&&(f&&((i=o[S]||(o[S]={}))[d]=[E,p]),o===e))break;return(p-=g)===h||p%h==0&&0<=p/h}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||I.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?F(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=se.call(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:F(function(e){var r=[],i=[],s=ne(e.replace(ve,"$1"));return s[S]?F(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:F(function(t){return function(e){return 0<I(t,e).length}}),contains:F(function(t){return t=t.replace(O,P),function(e){return-1<(e.textContent||ce.text(e)).indexOf(t)}}),lang:F(function(n){return A.test(n||"")||I.error("unsupported lang: "+n),n=n.replace(O,P).toLowerCase(),function(e){var t;do{if(t=C?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=ie.location&&ie.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===r},focus:function(e){return e===function(){try{return T.activeElement}catch(e){}}()&&T.hasFocus()&&!!(e.type||e.href||~e.tabIndex)},enabled:z(!1),disabled:z(!0),checked:function(e){return fe(e,"input")&&!!e.checked||fe(e,"option")&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return q.test(e.nodeName)},input:function(e){return N.test(e.nodeName)},button:function(e){return fe(e,"input")&&"button"===e.type||fe(e,"button")},text:function(e){var t;return fe(e,"input")&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:X(function(){return[0]}),last:X(function(e,t){return[t-1]}),eq:X(function(e,t,n){return[n<0?n+t:n]}),even:X(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:X(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:X(function(e,t,n){var r;for(r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:X(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=B(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=_(e);function G(){}function Y(e,t){var n,r,i,o,a,s,u,l=c[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=y.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=m.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace(ve," ")}),a=a.slice(n.length)),b.filter)!(r=D[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?I.error(e):c(e,s).slice(0)}function Q(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function J(a,e,t){var s=e.dir,u=e.next,l=u||s,c=t&&"parentNode"===l,f=n++;return e.first?function(e,t,n){while(e=e[s])if(1===e.nodeType||c)return a(e,t,n);return!1}:function(e,t,n){var r,i,o=[E,f];if(n){while(e=e[s])if((1===e.nodeType||c)&&a(e,t,n))return!0}else while(e=e[s])if(1===e.nodeType||c)if(i=e[S]||(e[S]={}),u&&fe(e,u))e=e[s]||e;else{if((r=i[l])&&r[0]===E&&r[1]===f)return o[2]=r[2];if((i[l]=o)[2]=a(e,t,n))return!0}return!1}}function K(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Z(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function ee(d,h,g,v,y,e){return v&&!v[S]&&(v=ee(v)),y&&!y[S]&&(y=ee(y,e)),F(function(e,t,n,r){var i,o,a,s,u=[],l=[],c=t.length,f=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)I(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),p=!d||!e&&h?f:Z(f,u,d,n,r);if(g?g(p,s=y||(e?d:c||v)?[]:t,n,r):s=p,v){i=Z(s,l),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(s[l[o]]=!(p[l[o]]=a))}if(e){if(y||d){if(y){i=[],o=s.length;while(o--)(a=s[o])&&i.push(p[o]=a);y(null,s=[],i,r)}o=s.length;while(o--)(a=s[o])&&-1<(i=y?se.call(e,a):u[o])&&(e[i]=!(t[i]=a))}}else s=Z(s===t?s.splice(c,s.length):s),y?y(null,t,s,r):k.apply(t,s)})}function te(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=J(function(e){return e===i},a,!0),l=J(function(e){return-1<se.call(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!=w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[J(K(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return ee(1<s&&K(c),1<s&&Q(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(ve,"$1"),t,s<n&&te(e.slice(s,n)),n<r&&te(e=e.slice(n)),n<r&&Q(e))}c.push(t)}return K(c)}function ne(e,t){var n,v,y,m,x,r,i=[],o=[],a=u[e+" "];if(!a){t||(t=Y(e)),n=t.length;while(n--)(a=te(t[n]))[S]?i.push(a):o.push(a);(a=u(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=E+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==T||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==T||(V(o),n=!C);while(s=v[a++])if(s(o,t||T,n)){k.call(r,o);break}i&&(E=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=pe.call(r));f=Z(f)}k.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&ce.uniqueSort(r)}return i&&(E=h,w=p),c},m?F(r):r))).selector=e}return a}function re(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&Y(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&C&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(O,P),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=D.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(O,P),H.test(o[0].type)&&U(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&Q(o)))return k.apply(n,r),n;break}}}return(l||ne(e,c))(r,t,!C,n,!t||H.test(e)&&U(t.parentNode)||t),n}G.prototype=b.filters=b.pseudos,b.setFilters=new G,le.sortStable=S.split("").sort(l).join("")===S,V(),le.sortDetached=$(function(e){return 1&e.compareDocumentPosition(T.createElement("fieldset"))}),ce.find=I,ce.expr[":"]=ce.expr.pseudos,ce.unique=ce.uniqueSort,I.compile=ne,I.select=re,I.setDocument=V,I.tokenize=Y,I.escape=ce.escapeSelector,I.getText=ce.text,I.isXML=ce.isXMLDoc,I.selectors=ce.expr,I.support=ce.support,I.uniqueSort=ce.uniqueSort}();var d=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&ce(e).is(n))break;r.push(e)}return r},h=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},b=ce.expr.match.needsContext,w=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1<se.call(n,e)!==r}):ce.filter(n,e,r)}ce.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?ce.find.matchesSelector(r,e)?[r]:[]:ce.find.matches(e,ce.grep(t,function(e){return 1===e.nodeType}))},ce.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(ce(e).filter(function(){for(t=0;t<r;t++)if(ce.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)ce.find(e,i[t],n);return 1<r?ce.uniqueSort(n):n},filter:function(e){return this.pushStack(T(this,e||[],!1))},not:function(e){return this.pushStack(T(this,e||[],!0))},is:function(e){return!!T(this,"string"==typeof e&&b.test(e)?ce(e):e||[],!1).length}});var k,S=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(ce.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&ce(e);if(!b.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&ce.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?ce.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?se.call(ce(e),this[0]):se.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(ce.uniqueSort(ce.merge(this.get(),ce(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),ce.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return d(e,"parentNode")},parentsUntil:function(e,t,n){return d(e,"parentNode",n)},next:function(e){return A(e,"nextSibling")},prev:function(e){return A(e,"previousSibling")},nextAll:function(e){return d(e,"nextSibling")},prevAll:function(e){return d(e,"previousSibling")},nextUntil:function(e,t,n){return d(e,"nextSibling",n)},prevUntil:function(e,t,n){return d(e,"previousSibling",n)},siblings:function(e){return h((e.parentNode||{}).firstChild,e)},children:function(e){return h(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(fe(e,"template")&&(e=e.content||e),ce.merge([],e.childNodes))}},function(r,i){ce.fn[r]=function(e,t){var n=ce.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=ce.filter(t,n)),1<this.length&&(j[r]||ce.uniqueSort(n),E.test(r)&&n.reverse()),this.pushStack(n)}});var D=/[^\x20\t\r\n\f]+/g;function N(e){return e}function q(e){throw e}function L(e,t,n,r){var i;try{e&&v(i=e.promise)?i.call(e).done(t).fail(n):e&&v(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}ce.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},ce.each(e.match(D)||[],function(e,t){n[t]=!0}),n):ce.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){ce.each(e,function(e,t){v(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==x(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return ce.each(arguments,function(e,t){var n;while(-1<(n=ce.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<ce.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},ce.extend({Deferred:function(e){var o=[["notify","progress",ce.Callbacks("memory"),ce.Callbacks("memory"),2],["resolve","done",ce.Callbacks("once memory"),ce.Callbacks("once memory"),0,"resolved"],["reject","fail",ce.Callbacks("once memory"),ce.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return ce.Deferred(function(r){ce.each(o,function(e,t){var n=v(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&v(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,v(t)?s?t.call(e,l(u,o,N,s),l(u,o,q,s)):(u++,t.call(e,l(u,o,N,s),l(u,o,q,s),l(u,o,N,o.notifyWith))):(a!==N&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){ce.Deferred.exceptionHook&&ce.Deferred.exceptionHook(e,t.error),u<=i+1&&(a!==q&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(ce.Deferred.getErrorHook?t.error=ce.Deferred.getErrorHook():ce.Deferred.getStackHook&&(t.error=ce.Deferred.getStackHook()),ie.setTimeout(t))}}return ce.Deferred(function(e){o[0][3].add(l(0,e,v(r)?r:N,e.notifyWith)),o[1][3].add(l(0,e,v(t)?t:N)),o[2][3].add(l(0,e,v(n)?n:q))}).promise()},promise:function(e){return null!=e?ce.extend(e,a):a}},s={};return ce.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=ae.call(arguments),o=ce.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?ae.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(L(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||v(i[t]&&i[t].then)))return o.then();while(t--)L(i[t],a(t),o.reject);return o.promise()}});var H=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;ce.Deferred.exceptionHook=function(e,t){ie.console&&ie.console.warn&&e&&H.test(e.name)&&ie.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},ce.readyException=function(e){ie.setTimeout(function(){throw e})};var O=ce.Deferred();function P(){C.removeEventListener("DOMContentLoaded",P),ie.removeEventListener("load",P),ce.ready()}ce.fn.ready=function(e){return O.then(e)["catch"](function(e){ce.readyException(e)}),this},ce.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--ce.readyWait:ce.isReady)||(ce.isReady=!0)!==e&&0<--ce.readyWait||O.resolveWith(C,[ce])}}),ce.ready.then=O.then,"complete"===C.readyState||"loading"!==C.readyState&&!C.documentElement.doScroll?ie.setTimeout(ce.ready):(C.addEventListener("DOMContentLoaded",P),ie.addEventListener("load",P));var M=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n))for(s in i=!0,n)M(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,v(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(ce(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},R=/^-ms-/,I=/-([a-z])/g;function W(e,t){return t.toUpperCase()}function F(e){return e.replace(R,"ms-").replace(I,W)}var $=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function B(){this.expando=ce.expando+B.uid++}B.uid=1,B.prototype={cache:function(e){var t=e[this.expando];return t||(t={},$(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[F(t)]=n;else for(r in t)i[F(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][F(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(F):(t=F(t))in r?[t]:t.match(D)||[]).length;while(n--)delete r[t[n]]}(void 0===t||ce.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!ce.isEmptyObject(t)}};var _=new B,z=new B,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,U=/[A-Z]/g;function V(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(U,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:X.test(i)?JSON.parse(i):i)}catch(e){}z.set(e,t,n)}else n=void 0;return n}ce.extend({hasData:function(e){return z.hasData(e)||_.hasData(e)},data:function(e,t,n){return z.access(e,t,n)},removeData:function(e,t){z.remove(e,t)},_data:function(e,t,n){return _.access(e,t,n)},_removeData:function(e,t){_.remove(e,t)}}),ce.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=z.get(o),1===o.nodeType&&!_.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=F(r.slice(5)),V(o,r,i[r]));_.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){z.set(this,n)}):M(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=z.get(o,n))?t:void 0!==(t=V(o,n))?t:void 0;this.each(function(){z.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){z.remove(this,e)})}}),ce.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=_.get(e,t),n&&(!r||Array.isArray(n)?r=_.access(e,t,ce.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=ce.queue(e,t),r=n.length,i=n.shift(),o=ce._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){ce.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return _.get(e,n)||_.access(e,n,{empty:ce.Callbacks("once memory").add(function(){_.remove(e,[t+"queue",n])})})}}),ce.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?ce.queue(this[0],t):void 0===n?this:this.each(function(){var e=ce.queue(this,t,n);ce._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&ce.dequeue(this,t)})},dequeue:function(e){return this.each(function(){ce.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=ce.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=_.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var G=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,Y=new RegExp("^(?:([+-])=|)("+G+")([a-z%]*)$","i"),Q=["Top","Right","Bottom","Left"],J=C.documentElement,K=function(e){return ce.contains(e.ownerDocument,e)},Z={composed:!0};J.getRootNode&&(K=function(e){return ce.contains(e.ownerDocument,e)||e.getRootNode(Z)===e.ownerDocument});var ee=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&K(e)&&"none"===ce.css(e,"display")};function te(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return ce.css(e,t,"")},u=s(),l=n&&n[3]||(ce.cssNumber[t]?"":"px"),c=e.nodeType&&(ce.cssNumber[t]||"px"!==l&&+u)&&Y.exec(ce.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)ce.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,ce.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ne={};function re(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=_.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ee(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ne[s])||(o=a.body.appendChild(a.createElement(s)),u=ce.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ne[s]=u)))):"none"!==n&&(l[c]="none",_.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}ce.fn.extend({show:function(){return re(this,!0)},hide:function(){return re(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ee(this)?ce(this).show():ce(this).hide()})}});var xe,be,we=/^(?:checkbox|radio)$/i,Te=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="<textarea>x</textarea>",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="<option></option>",le.option=!!xe.lastChild;var ke={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n<r;n++)_.set(e[n],"globalEval",!t||_.get(t[n],"globalEval"))}ke.tbody=ke.tfoot=ke.colgroup=ke.caption=ke.thead,ke.th=ke.td,le.option||(ke.optgroup=ke.option=[1,"<select multiple='multiple'>","</select>"]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===x(o))ce.merge(p,o.nodeType?[o]:o);else if(je.test(o)){a=a||f.appendChild(t.createElement("div")),s=(Te.exec(o)||["",""])[1].toLowerCase(),u=ke[s]||ke._default,a.innerHTML=u[1]+ce.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;ce.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<ce.inArray(o,r))i&&i.push(o);else if(l=K(o),a=Se(f.appendChild(o),"script"),l&&Ee(a),n){c=0;while(o=a[c++])Ce.test(o.type||"")&&n.push(o)}return f}var De=/^([^.]*)(?:\.(.+)|)/;function Ne(){return!0}function qe(){return!1}function Le(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Le(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=qe;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return ce().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=ce.guid++)),e.each(function(){ce.event.add(this,t,i,r,n)})}function He(e,r,t){t?(_.set(e,r,!1),ce.event.add(e,r,{namespace:!1,handler:function(e){var t,n=_.get(this,r);if(1&e.isTrigger&&this[r]){if(n)(ce.event.special[r]||{}).delegateType&&e.stopPropagation();else if(n=ae.call(arguments),_.set(this,r,n),this[r](),t=_.get(this,r),_.set(this,r,!1),n!==t)return e.stopImmediatePropagation(),e.preventDefault(),t}else n&&(_.set(this,r,ce.event.trigger(n[0],n.slice(1),this)),e.stopPropagation(),e.isImmediatePropagationStopped=Ne)}})):void 0===_.get(e,r)&&ce.event.add(e,r,Ne)}ce.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=_.get(t);if($(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&ce.find.matchesSelector(J,i),n.guid||(n.guid=ce.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof ce&&ce.event.triggered!==e.type?ce.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(D)||[""]).length;while(l--)d=g=(s=De.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=ce.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=ce.event.special[d]||{},c=ce.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&ce.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),ce.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=_.hasData(e)&&_.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(D)||[""]).length;while(l--)if(d=g=(s=De.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=ce.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||ce.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)ce.event.remove(e,d+t[l],n,r,!0);ce.isEmptyObject(u)&&_.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=ce.event.fix(e),l=(_.get(this,"events")||Object.create(null))[u.type]||[],c=ce.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=ce.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((ce.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<ce(i,this).index(l):ce.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(ce.Event.prototype,t,{enumerable:!0,configurable:!0,get:v(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[ce.expando]?e:new ce.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return we.test(t.type)&&t.click&&fe(t,"input")&&He(t,"click",!0),!1},trigger:function(e){var t=this||e;return we.test(t.type)&&t.click&&fe(t,"input")&&He(t,"click"),!0},_default:function(e){var t=e.target;return we.test(t.type)&&t.click&&fe(t,"input")&&_.get(t,"click")||fe(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},ce.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},ce.Event=function(e,t){if(!(this instanceof ce.Event))return new ce.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ne:qe,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&ce.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[ce.expando]=!0},ce.Event.prototype={constructor:ce.Event,isDefaultPrevented:qe,isPropagationStopped:qe,isImmediatePropagationStopped:qe,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ne,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ne,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ne,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},ce.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},ce.event.addProp),ce.each({focus:"focusin",blur:"focusout"},function(r,i){function o(e){if(C.documentMode){var t=_.get(this,"handle"),n=ce.event.fix(e);n.type="focusin"===e.type?"focus":"blur",n.isSimulated=!0,t(e),n.target===n.currentTarget&&t(n)}else ce.event.simulate(i,e.target,ce.event.fix(e))}ce.event.special[r]={setup:function(){var e;if(He(this,r,!0),!C.documentMode)return!1;(e=_.get(this,i))||this.addEventListener(i,o),_.set(this,i,(e||0)+1)},trigger:function(){return He(this,r),!0},teardown:function(){var e;if(!C.documentMode)return!1;(e=_.get(this,i)-1)?_.set(this,i,e):(this.removeEventListener(i,o),_.remove(this,i))},_default:function(e){return _.get(e.target,r)},delegateType:i},ce.event.special[i]={setup:function(){var e=this.ownerDocument||this.document||this,t=C.documentMode?this:e,n=_.get(t,i);n||(C.documentMode?this.addEventListener(i,o):e.addEventListener(r,o,!0)),_.set(t,i,(n||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=C.documentMode?this:e,n=_.get(t,i)-1;n?_.set(t,i,n):(C.documentMode?this.removeEventListener(i,o):e.removeEventListener(r,o,!0),_.remove(t,i))}}}),ce.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){ce.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||ce.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),ce.fn.extend({on:function(e,t,n,r){return Le(this,e,t,n,r)},one:function(e,t,n,r){return Le(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,ce(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=qe),this.each(function(){ce.event.remove(this,e,n,t)})}});var Oe=/<script|<style|<link/i,Pe=/checked\s*(?:[^=]|=\s*.checked.)/i,Me=/^\s*<!\[CDATA\[|\]\]>\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)ce.event.add(t,i,s[i][n]);z.hasData(e)&&(o=z.access(e),a=ce.extend({},o),z.set(t,a))}}function $e(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=v(d);if(h||1<f&&"string"==typeof d&&!le.checkClone&&Pe.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),$e(t,r,i,o)});if(f&&(t=(e=Ae(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=ce.map(Se(e,"script"),Ie)).length;c<f;c++)u=e,c!==p&&(u=ce.clone(u,!0,!0),s&&ce.merge(a,Se(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,ce.map(a,We),c=0;c<s;c++)u=a[c],Ce.test(u.type||"")&&!_.access(u,"globalEval")&&ce.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?ce._evalUrl&&!u.noModule&&ce._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):m(u.textContent.replace(Me,""),u,l))}return n}function Be(e,t,n){for(var r,i=t?ce.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||ce.cleanData(Se(r)),r.parentNode&&(n&&K(r)&&Ee(Se(r,"script")),r.parentNode.removeChild(r));return e}ce.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=K(e);if(!(le.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||ce.isXMLDoc(e)))for(a=Se(c),r=0,i=(o=Se(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&we.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||Se(e),a=a||Se(c),r=0,i=o.length;r<i;r++)Fe(o[r],a[r]);else Fe(e,c);return 0<(a=Se(c,"script")).length&&Ee(a,!f&&Se(e,"script")),c},cleanData:function(e){for(var t,n,r,i=ce.event.special,o=0;void 0!==(n=e[o]);o++)if($(n)){if(t=n[_.expando]){if(t.events)for(r in t.events)i[r]?ce.event.remove(n,r):ce.removeEvent(n,r,t.handle);n[_.expando]=void 0}n[z.expando]&&(n[z.expando]=void 0)}}}),ce.fn.extend({detach:function(e){return Be(this,e,!0)},remove:function(e){return Be(this,e)},text:function(e){return M(this,function(e){return void 0===e?ce.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return $e(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Re(this,e).appendChild(e)})},prepend:function(){return $e(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Re(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return $e(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return $e(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(ce.cleanData(Se(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return ce.clone(this,e,t)})},html:function(e){return M(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Oe.test(e)&&!ke[(Te.exec(e)||["",""])[1].toLowerCase()]){e=ce.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(ce.cleanData(Se(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return $e(this,arguments,function(e){var t=this.parentNode;ce.inArray(this,n)<0&&(ce.cleanData(Se(this)),t&&t.replaceChild(e,this))},n)}}),ce.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){ce.fn[e]=function(e){for(var t,n=[],r=ce(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),ce(r[o])[a](t),s.apply(n,t.get());return this.pushStack(n)}});var _e=new RegExp("^("+G+")(?!px)[a-z%]+$","i"),ze=/^--/,Xe=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=ie),t.getComputedStyle(e)},Ue=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ve=new RegExp(Q.join("|"),"i");function Ge(e,t,n){var r,i,o,a,s=ze.test(t),u=e.style;return(n=n||Xe(e))&&(a=n.getPropertyValue(t)||n[t],s&&a&&(a=a.replace(ve,"$1")||void 0),""!==a||K(e)||(a=ce.style(e,t)),!le.pixelBoxStyles()&&_e.test(a)&&Ve.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=n.width,u.width=r,u.minWidth=i,u.maxWidth=o)),void 0!==a?a+"":a}function Ye(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",J.appendChild(u).appendChild(l);var e=ie.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),J.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=C.createElement("div"),l=C.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",le.clearCloneStyle="content-box"===l.style.backgroundClip,ce.extend(le,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=C.createElement("table"),t=C.createElement("tr"),n=C.createElement("div"), [TRUNCATED — original size: 87533 bytes]
2026-07-30 17:56:44.752 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /config.js responded 401 in 0.3603 ms
2026-07-30 17:56:44.746 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /.env responded 401 in 0.4393 ms
2026-07-30 17:56:44.728 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /api/env responded 401 in 0.4417 ms
2026-07-30 17:56:44.700 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /api/config responded 401 in 0.3968 ms
2026-07-30 17:56:44.698 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET / responded 200 in 2.3320 ms
2026-07-30 17:56:44.697 +00:00 [INF] [HTTP] [U:-] [E:-] [C:6cec5fb4f183] HTTP GET / 200
Req: [no body] Res: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Home — WM Policy Documents</title> <link rel="stylesheet" href="/lib/bootstrap/dist/css/bootstrap.min.css" /> <link rel="stylesheet" href="/css/site.css?v=xQHUTQJdpYJFKIjDlFCI1X8KDqtO5qaSSeJFSoCP3pA" /> <link rel="stylesheet" href="/css/commissions.css?v=ZRMXSlMSxdLsHmJCZzq1LopWaopJSbVXKu57gvUJG3w" /> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css" /> <style> /* ---- Hover-expand left sidebar -------------------------------------- */ :root { --sb-collapsed: 64px; --sb-expanded: 240px; } body.has-sidebar { /* Reserve space for the collapsed rail; the expanded panel overlays the content on hover, so the content never shifts. */ padding-left: var(--sb-collapsed); } .app-sidebar { position: fixed; top: 0; left: 0; height: 100vh; width: var(--sb-collapsed); overflow-x: hidden; overflow-y: auto; display: flex; flex-direction: column; z-index: 1045; transition: width 0.2s ease; } .app-sidebar:hover, .app-sidebar:focus-within { width: var(--sb-expanded); box-shadow: 0 0 24px rgba(0,0,0,0.35); } .app-sidebar .sb-label { white-space: nowrap; opacity: 0; transition: opacity 0.15s ease; } .app-sidebar:hover .sb-label, .app-sidebar:focus-within .sb-label { opacity: 1; } .sb-link { display: flex; align-items: center; gap: 0.85rem; padding: 0.65rem 0; color: rgba(255,255,255,0.75); text-decoration: none; border-left: 3px solid transparent; } .sb-link:hover { color: #fff; background: rgba(255,255,255,0.08); } .sb-link.active { color: #fff; background: rgba(255,255,255,0.12); border-left-color: #0d6efd; } .sb-link > i:first-child { min-width: var(--sb-collapsed); text-align: center; font-size: 1.15rem; flex-shrink: 0; } .sb-brand { display: flex; align-items: center; gap: 0.85rem; padding: 0.9rem 0; color: #fff; text-decoration: none; font-weight: 700; } .sb-brand > i:first-child { min-width: var(--sb-collapsed); text-align: center; font-size: 1.3rem; flex-shrink: 0; } /* Sub-menu (Fact-Find) */ .sb-submenu .sb-link { font-size: 0.9rem; padding-left: 0; } .sb-submenu .sb-link > i:first-child { font-size: 1rem; } .sb-caret { margin-left: auto; margin-right: 0.9rem; transition: transform 0.15s ease; } .sb-link[aria-expanded="true"] .sb-caret { transform: rotate(180deg); } </style> </head> <body class="d-flex flex-column min-vh-100 has-sidebar"> <nav b-yjl2sbey1b class="app-sidebar navbar-dark bg-dark shadow-sm"> <a class="sb-brand" href="/UI"> <i b-yjl2sbey1b class="bi bi-file-earmark-text"></i> <span b-yjl2sbey1b class="sb-label">Wealthmax</span> </a> <div b-yjl2sbey1b class="d-flex flex-column flex-grow-1"> <a class="sb-link " href="/UI/Dashboard/Index"> <i b-yjl2sbey1b class="bi bi-speedometer2"></i><span b-yjl2sbey1b class="sb-label">Dashboard</span> </a> <a class="sb-link " href="/UI/Templates/Index"> <i b-yjl2sbey1b class="bi bi-collection"></i><span b-yjl2sbey1b class="sb-label">Templates</span> </a> <a class="sb-link " href="/UI/Tokens/Index"> <i b-yjl2sbey1b class="bi bi-braces"></i><span b-yjl2sbey1b class="sb-label">Token Registry</span> </a> <a class="sb-link " href="/UI/Clients/Index"> <i b-yjl2sbey1b class="bi bi-people"></i><span b-yjl2sbey1b class="sb-label">Clients</span> </a> <a class="sb-link " href="/UI/Cases/Index"> <i b-yjl2sbey1b class="bi bi-briefcase"></i><span b-yjl2sbey1b class="sb-label">Cases</span> </a> <a class="sb-link " href="/UI/Reporting/Index"> <i b-yjl2sbey1b class="bi bi-graph-up"></i><span b-yjl2sbey1b class="sb-label">Reports</span> </a> <a class="sb-link " href="/UI/Commissions/Management"> <i b-yjl2sbey1b class="bi bi-cash-coin"></i><span b-yjl2sbey1b class="sb-label">Commissions</span> </a> <!-- User Management --> <a class="sb-link " href="/UI/Users/Index"> <i b-yjl2sbey1b class="bi bi-person-gear"></i><span b-yjl2sbey1b class="sb-label">User Management</span> </a> <!-- Fact-Find (expandable sub-menu) --> <a b-yjl2sbey1b class="sb-link " href="#ffSubmenu" role="button" data-bs-toggle="collapse" aria-expanded="false"> <i b-yjl2sbey1b class="bi bi-file-earmark-text"></i><span b-yjl2sbey1b class="sb-label">Fact-Find</span> <i b-yjl2sbey1b class="bi bi-chevron-down sb-caret sb-label"></i> </a> <div b-yjl2sbey1b class="collapse sb-submenu " id="ffSubmenu"> <a class="sb-link " href="/UI/FactFindFormatters/Index"> <i b-yjl2sbey1b class="bi bi-grid"></i><span b-yjl2sbey1b class="sb-label">Formatters</span> </a> <a class="sb-link " href="/UI/FactFindTemplates/Index"> <i b-yjl2sbey1b class="bi bi-layers"></i><span b-yjl2sbey1b class="sb-label">Templates</span> </a> <a class="sb-link " href="/UI/FactFindGenerate"> <i b-yjl2sbey1b class="bi bi-lightning-charge"></i><span b-yjl2sbey1b class="sb-label">Generate &amp; Preview</span> </a> </div> </div> <!-- Auth (pinned to bottom) --> <div b-yjl2sbey1b class="mt-auto border-top border-secondary"> <a b-yjl2sbey1b class="sb-link" href="/UI/business/login"> <i b-yjl2sbey1b class="bi bi-box-arrow-in-right"></i><span b-yjl2sbey1b class="sb-label">Business login</span> </a> </div> </nav> <main b-yjl2sbey1b class="flex-grow-1 py-4"> <div b-yjl2sbey1b class="container-fluid px-4"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css"> <style> body > nav.navbar { position: sticky; top: 0; z-index: 1030; } .dash-hero { background: linear-gradient(135deg, #212529 0%, #343a40 100%); color: #fff; } .dash-card { border: none; border-radius: 12px; transition: transform 0.15s ease, box-shadow 0.15s ease; } .dash-card:hover { transform: translateY(-3px); box-shadow: 0 8px 24px rgba(0,0,0,0.10) !important; } .dash-icon { width: 48px; height: 48px; border-radius: 12px; display: flex; align-items: center; justify-content: center; font-size: 1.4rem; } .dash-stat-value { font-size: 2rem; font-weight: 700; line-height: 1; } .dash-card-title { font-size: 0.95rem; font-weight: 600; } .dash-card-text { font-size: 0.78rem; } /* Discreet business-login link pinned to the bottom-right corner. */ .home-login-link { position: fixed; bottom: 1rem; right: 1.25rem; z-index: 1040; } </style> <!-- Hero --> <div class="dash-hero py-4 mb-4"> <div class="container text-center"> <h1 class="display-6 fw-bold mb-2">Wealthmax PM CRM</h1> <p class="lead text-white-50 mb-0" style="max-width: 640px; margin: 0 auto;"> Testing harness dashboard &mdash; system tools, integrations, and live service health at a glance. </p> </div> </div> <div class="container pb-5"> <!-- Tool / Integration cards --> <div class="row g-3 mb-4"> <!-- Tenants Created --> <div class="col-6 col-md-4 col-lg-3"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="d-flex align-items-start justify-content-between mb-2"> <div class="dash-icon bg-primary bg-opacity-10 text-primary"> <i class="bi bi-building-fill"></i> </div> <span class="badge bg-secondary bg-opacity-10 text-secondary">Sample</span> </div> <div class="dash-stat-value text-dark">12</div> <div class="dash-card-title text-dark mt-1">Tenants Created</div> <p class="dash-card-text text-muted mb-0">Total onboarded tenants in this environment.</p> </div> </div> </div> <!-- Build Logs --> <div class="col-6 col-md-4 col-lg-3"> <a href="/UI/DevLogs" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-dark bg-opacity-10 text-dark mb-2"> <i class="bi bi-terminal-fill"></i> </div> <div class="dash-card-title text-dark">Build &amp; App Logs</div> <p class="dash-card-text text-muted mb-0">Browse structured application logs by date and level.</p> </div> </div> </a> </div> <!-- Swagger --> <div class="col-6 col-md-4 col-lg-3"> <a href="/swagger" target="_blank" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="d-flex align-items-start justify-content-between mb-2"> <div class="dash-icon bg-success bg-opacity-10 text-success"> <i class="bi bi-braces"></i> </div> <i class="bi bi-box-arrow-up-right text-muted small"></i> </div> <div class="dash-card-title text-dark">Swagger / API Docs</div> <p class="dash-card-text text-muted mb-0">Explore and try the REST API via OpenAPI UI.</p> </div> </div> </a> </div> <!-- SignalR --> <div class="col-6 col-md-4 col-lg-3"> <a href="/test-signalr.html" target="_blank" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="d-flex align-items-start justify-content-between mb-2"> <div class="dash-icon bg-info bg-opacity-10 text-info"> <i class="bi bi-broadcast"></i> </div> <i class="bi bi-box-arrow-up-right text-muted small"></i> </div> <div class="dash-card-title text-dark">SignalR Hub</div> <p class="dash-card-text text-muted mb-0">Test real-time notifications over the SignalR hub.</p> </div> </div> </a> </div> <!-- iPipeline --> <div class="col-6 col-md-4 col-lg-3"> <a href="/demo/solution-builder" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-warning bg-opacity-10 text-warning mb-2"> <i class="bi bi-plug-fill"></i> </div> <div class="dash-card-title text-dark">iPipeline</div> <p class="dash-card-text text-muted mb-0">Launch the iPipeline Solution Builder integration.</p> </div> </div> </a> </div> <!-- Fetch Quotes --> <div class="col-6 col-md-4 col-lg-3"> <a href="/demo/solution-builder/events" class="text-decoration-none"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-danger bg-opacity-10 text-danger mb-2"> <i class="bi bi-receipt"></i> </div> <div class="dash-card-title text-dark">Fetch Quotes</div> <p class="dash-card-text text-muted mb-0">View quote-notification events returned from the pipeline.</p> </div> </div> </a> </div> <!-- CRM Dashboard --> <div class="col-6 col-md-4 col-lg-3"> <a class="text-decoration-none" href="/UI/Dashboard/Index"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-primary bg-opacity-10 text-primary mb-2"> <i class="bi bi-speedometer2"></i> </div> <div class="dash-card-title text-dark">CRM Dashboard</div> <p class="dash-card-text text-muted mb-0">Cases, clients, and commission overview metrics.</p> </div> </div> </a> </div> <!-- Clients --> <div class="col-6 col-md-4 col-lg-3"> <a class="text-decoration-none" href="/UI/Clients/Index"> <div class="card dash-card shadow-sm h-100"> <div class="card-body p-3"> <div class="dash-icon bg-success bg-opacity-10 text-success mb-2"> <i class="bi bi-people-fill"></i> </div> <div class="dash-card-title text-dark">Clients &amp; Cases</div> <p class="dash-card-text text-muted mb-0">Manage client records and advisory cases.</p> </div> </div> </a> </div> </div> <!-- System Health --> <div id="health-card" class="card dash-card shadow-sm mb-4"> <div class="card-body p-3"> <!-- Loading state --> <div id="health-loading" class="text-center py-3"> <div class="spinner-border spinner-border-sm text-primary" role="status"> <span class="visually-hidden">Loading...</span> </div> <span class="ms-2 text-muted">Checking system health...</span> </div> <!-- Error state --> <div id="health-error" class="d-none text-center py-3"> <i class="bi bi-exclamation-triangle fs-4 text-danger d-block mb-2"></i> <p class="text-muted mb-1">Unable to reach the health endpoint.</p> <button class="btn btn-sm btn-outline-secondary" onclick="fetchHealth()"> <i class="bi bi-arrow-clockwise me-1"></i>Retry </button> </div> <!-- Success state --> <div id="health-content" class="d-none"> <div class="d-flex align-items-center mb-3"> <i class="bi bi-heart-pulse fs-4 text-primary me-2"></i> <h5 class="fw-semibold mb-0 me-auto">System Health</h5> <span id="health-status-badge" class="badge"></span> </div> <hr class="my-3"> <div class="row g-2 small"> <div class="col-sm-6"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-clock me-2"></i> <span>Checked: <span id="health-timestamp" class="text-body"></span></span> </div> </div> <div class="col-sm-6"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-speedometer2 me-2"></i> <span>Response: <span id="health-duration" class="text-body"></span></span> </div> </div> <div class="col-sm-6 d-none" id="health-db-row"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-database me-2"></i> <span>Database: <span id="health-database" class="text-body"></span></span> </div> </div> <div class="col-sm-6 d-none" id="health-build-row"> <div class="d-flex align-items-center text-muted mb-2"> <i class="bi bi-git me-2"></i> <span>Build: <code id="health-commit"></code> <span id="health-build-date" class="text-muted"></span></span> </div> </div> </div> </div> </div> </div> <!-- Tech Stack --> <div class="text-center"> <div class="d-flex flex-wrap justify-content-center gap-3 text-muted small"> <span><i class="bi bi-gear me-1"></i>.NET 10</span> <span class="text-black-50">|</span> <span><i class="bi bi-database me-1"></i>PostgreSQL</span> <span class="text-black-50">|</span> <span><i class="bi bi-layers me-1"></i>Entity Framework Core</span> <span class="text-black-50">|</span> <span><i class="bi bi-lock me-1"></i>JWT Authentication</span> <span class="text-black-50">|</span> <span><i class="bi bi-book me-1"></i>OpenAPI / Swagger</span> </div> </div> </div> </content> </div> </main> <footer b-yjl2sbey1b class="bg-light border-top py-2 text-center text-muted small"> Wealthmax PM CRM &mdash; Policy Document Testing UI </footer> <script src="/lib/jquery/dist/jquery.min.js"></script> <script src="/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script src="/js/site.js?v=y_Ngd8W21UpuCUhEqGbUKDEqFnNfTjAfb24GhJJGUyM"></script> <script> function escapeHtml(text) { var div = document.createElement('div'); div.appendChild(document.createTextNode(text)); return div.innerHTML; } function statusBadgeClass(status) { switch ((status || '').toLowerCase()) { case 'healthy': return 'bg-success'; case 'degraded': return 'bg-warning text-dark'; default: return 'bg-danger'; } } function fetchHealth() { document.getElementById('health-loading').classList.remove('d-none'); document.getElementById('health-error').classList.add('d-none'); document.getElementById('health-content').classList.add('d-none'); fetch('/api/health') .then(function (response) { if (response.ok || response.status === 503) { return response.json(); } throw new Error('Unexpected status: ' + response.status); }) .then(function (response) { var health = response.data || response; renderHealth(health); document.getElementById('health-loading').classList.add('d-none'); document.getElementById('health-content').classList.remove('d-none'); }) .catch(function () { document.getElementById('health-loading').classList.add('d-none'); document.getElementById('health-error').classList.remove('d-none'); }); } function renderHealth(data) { var badge = document.getElementById('health-status-badge'); badge.textContent = data.status; badge.className = 'badge ' + statusBadgeClass(data.status); document.getElementById('health-timestamp').textContent = new Date(data.timestamp).toLocaleString(); document.getElementById('health-duration').textContent = data.totalDurationMs + ' ms'; var dbRow = document.getElementById('health-db-row'); if (data.databaseName || data.databaseProvider) { var parts = []; if (data.databaseName) parts.push(data.databaseName); if (data.databaseProvider) parts.push(data.databaseProvider); document.getElementById('health-database').textContent = parts.join(' on '); dbRow.classList.remove('d-none'); } else { dbRow.classList.add('d-none'); } var buildRow = document.getElementById('health-build-row'); if (data.commitHash || data.lastBuildDate) { document.getElementById('health-commit').textContent = data.commitHash || ''; document.getElementById('health-build-date').textContent = data.lastBuildDate ? '(' + new Date(data.lastBuildDate).toLocaleDateString() + ')' : ''; buildRow.classList.remove('d-none'); } else { buildRow.classList.add('d-none'); } } fetchHealth(); </script> </body> </html>
2026-07-30 17:56:44.673 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /.env.example responded 401 in 0.5591 ms
2026-07-30 17:49:57.614 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP POST /aaa responded 401 in 0.4834 ms
2026-07-30 17:49:57.380 +00:00 [INF] [GEN] [U:-] [E:-] [C:-] HTTP GET /.env responded 401 in 0.5187 ms
Errors & Warnings 50
2026-07-30 20:03:16.827 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:e7229ca461fb] HTTP GET /robots.txt 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T20:03:16.8269544Z"}
2026-07-30 19:59:37.570 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:93e1f6854021] HTTP GET /etc/ssl/private/server.key 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:37.5704759Z"}
2026-07-30 19:59:37.474 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:551c60ca2380] HTTP GET /.bash_history 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:37.4739665Z"}
2026-07-30 19:59:37.447 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:41adddd60410] HTTP GET /secrets.json 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:37.4476607Z"}
2026-07-30 19:59:37.420 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:765dc84a3fd0] HTTP GET /.npmrc 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:37.4205765Z"}
2026-07-30 19:59:37.393 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:f054884caeb6] HTTP GET /config/production.json 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:37.3929649Z"}
2026-07-30 19:59:37.365 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:a59cab33501f] HTTP GET /server.key 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:37.3650562Z"}
2026-07-30 19:59:37.338 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:b46b4dea05d6] HTTP GET /.vscode/sftp.json 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:37.3386628Z"}
2026-07-30 19:59:37.312 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:e515c8513761] HTTP GET /.ssh/id_rsa 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:37.3126958Z"}
2026-07-30 19:59:37.311 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:9beed9639fdf] HTTP GET /.ssh/id_ecdsa 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:37.3113548Z"}
2026-07-30 19:59:37.284 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:0fa31cdcb736] HTTP GET /.ssh/id_ed25519 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:37.2848073Z"}
2026-07-30 19:59:37.282 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:a5d50d30488a] HTTP GET /backup.tar.gz 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:37.2828534Z"}
2026-07-30 19:59:37.255 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:88ca9c5d3e52] HTTP GET /.svn/wc.db 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:37.255695Z"}
2026-07-30 19:59:37.253 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:5394c2295467] HTTP GET /actuator/heapdump 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:37.2537716Z"}
2026-07-30 19:59:37.227 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:f638a00adce6] HTTP GET /backup.zip 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:37.2271547Z"}
2026-07-30 19:59:37.225 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:d8af2cff3b70] HTTP GET /wp-config.php 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:37.2259037Z"}
2026-07-30 19:59:37.200 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:2e1a2d49778e] HTTP GET /database.sql 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:37.2000163Z"}
2026-07-30 19:59:37.199 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:edcdc365062a] HTTP GET /database_backup.sql 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:37.1996944Z"}
2026-07-30 19:59:37.173 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:5f69ea41d7bd] HTTP GET /backup.sql 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:37.1731834Z"}
2026-07-30 19:59:37.172 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:e2e528897f75] HTTP GET /dump.sql 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:37.1722872Z"}
2026-07-30 19:59:37.146 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:1cff32868833] HTTP GET /config.php 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:37.1460596Z"}
2026-07-30 19:59:37.141 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:720bf288bdd5] HTTP GET /user_secrets.yml 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:37.1418463Z"}
2026-07-30 19:59:37.120 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:9548a8f8fb96] HTTP GET /docker-compose.yml 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:37.1199966Z"}
2026-07-30 19:59:37.113 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:e9880f6de96c] HTTP GET /phpinfo.php 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:37.1136967Z"}
2026-07-30 19:59:37.094 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:f6dfc51823a2] HTTP GET /api/.env 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:37.0940423Z"}
2026-07-30 19:59:37.085 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:3d8fa7b72f2c] HTTP GET /.env 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:37.0855411Z"}
2026-07-30 19:59:37.068 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:15c95e78cf81] HTTP GET /.git/HEAD 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:37.0681656Z"}
2026-07-30 19:59:37.057 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:b41aedacdebc] HTTP GET /wp-admin/setup-config.php 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:37.0574372Z"}
2026-07-30 19:59:37.041 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:3de82269ace7] HTTP GET /storage/logs/laravel.log 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:37.0414856Z"}
2026-07-30 19:59:37.011 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:4e058597339d] HTTP GET /config.xml 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:37.0116875Z"}
2026-07-30 19:59:36.984 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:43f554fd8a39] HTTP GET /.env.production 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:36.9846836Z"}
2026-07-30 19:59:36.958 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:03080da8a3e8] HTTP GET /_vti_pvt/service.pwd 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:59:36.9585547Z"}
2026-07-30 19:36:10.705 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:31b793a8da7c] HTTP GET /sitemaps.xml 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:36:10.7057661Z"}
2026-07-30 19:00:09.511 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:22dc3169e5e3] HTTP GET /robots.txt 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T19:00:09.5114766Z"}
2026-07-30 17:59:52.190 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:9bbdb79ed79b] HTTP GET /robots.txt 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T17:59:52.1906577Z"}
2026-07-30 17:59:20.342 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:8ac7db7da4c6] HTTP GET /robots.txt 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T17:59:20.3427783Z"}
2026-07-30 17:57:54.846 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:de5b7b47cb47] HTTP GET /.env 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T17:57:54.8461582Z"}
2026-07-30 17:57:54.602 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:127b36dacc38] HTTP GET /.git/config 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T17:57:54.6024669Z"}
2026-07-30 17:56:44.864 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:3d895624022a] HTTP GET /settings.js 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T17:56:44.8646599Z"}
2026-07-30 17:56:44.844 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:a27eb6186eee] HTTP GET /js/config.js 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T17:56:44.8447209Z"}
2026-07-30 17:56:44.844 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:cf22f1956f2f] HTTP GET /js/env.js 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T17:56:44.8447247Z"}
2026-07-30 17:56:44.842 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:134a08528355] HTTP GET /config.json 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T17:56:44.8428477Z"}
2026-07-30 17:56:44.838 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:e5606412f54e] HTTP GET /.env.production 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T17:56:44.8380877Z"}
2026-07-30 17:56:44.816 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:bdeed531a0d3] HTTP GET /.env.local 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T17:56:44.8169332Z"}
2026-07-30 17:56:44.752 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:492596df83e3] HTTP GET /config.js 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T17:56:44.7527478Z"}
2026-07-30 17:56:44.746 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:9e4c40dda75d] HTTP GET /.env 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T17:56:44.7465435Z"}
2026-07-30 17:56:44.728 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:82300a47f107] HTTP GET /api/env 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T17:56:44.7283109Z"}
2026-07-30 17:56:44.700 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:b090fba350ca] HTTP GET /api/config 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T17:56:44.7002504Z"}
2026-07-30 17:56:44.673 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:7139d3dcd9e4] HTTP GET /.env.example 401
Req: [no body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T17:56:44.6729547Z"}
2026-07-30 17:49:57.614 +00:00 [WRN] [HTTP] [U:-] [E:-] [C:971cac845ada] HTTP POST /aaa 401
Req: [non-JSON body] Res: {"success":false,"error":{"code":"UNAUTHORIZED","message":"Authentication is required to access this resource."},"timestamp":"2026-07-30T17:49:57.6139092Z"}