- Login page with animated floating stat cards - Executive dashboard with Chart.js KPIs and activity feed - Full asset registry (list, search, filter, bulk actions, QR) - Asset detail page with 6 tabs (financial, maintenance, history…) - 3-step asset creation wizard with category-specific fields - Inventory: stock overview, GRN, location tree, physical audit - Procurement: PR → approval → PO → GRN → asset lifecycle - Maintenance: Kanban board, PM schedule, AMC contracts - Reports: depreciation schedule, utilization, compliance gauge - User management: roles, permission matrix, session control - Settings: 8 config sections (org, depreciation, security, integrations) - Premium dark UI with CSS variables, Chart.js 4, toast system
333 lines
20 KiB
HTML
333 lines
20 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||
<title>Reports & Audit | AMS</title>
|
||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap" rel="stylesheet">
|
||
<link rel="stylesheet" href="css/styles.css">
|
||
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script>
|
||
</head>
|
||
<body>
|
||
<div class="app-layout">
|
||
<aside class="sidebar">
|
||
<div class="sidebar-logo"><div class="logo-icon">📦</div><div><div class="logo-title">AMS</div><div class="logo-sub">Asset Management</div></div></div>
|
||
<nav class="sidebar-nav">
|
||
<div class="nav-section-label">Overview</div>
|
||
<a href="dashboard.html" class="nav-item"><span class="nav-icon">📊</span> Dashboard</a>
|
||
<div class="nav-section-label">Assets</div>
|
||
<a href="assets.html" class="nav-item"><span class="nav-icon">📦</span> All Assets</a>
|
||
<a href="asset-create.html" class="nav-item"><span class="nav-icon">➕</span> Add Asset</a>
|
||
<div class="nav-section-label">Supply Chain</div>
|
||
<a href="inventory.html" class="nav-item"><span class="nav-icon">🏪</span> Inventory</a>
|
||
<a href="procurement.html" class="nav-item"><span class="nav-icon">🛒</span> Procurement</a>
|
||
<div class="nav-section-label">Operations</div>
|
||
<a href="maintenance.html" class="nav-item"><span class="nav-icon">🔧</span> Maintenance</a>
|
||
<a href="reports.html" class="nav-item active"><span class="nav-icon">📈</span> Reports & Audit</a>
|
||
<div class="nav-section-label">Administration</div>
|
||
<a href="users.html" class="nav-item"><span class="nav-icon">👥</span> Users</a>
|
||
<a href="settings.html" class="nav-item"><span class="nav-icon">⚙️</span> Settings</a>
|
||
</nav>
|
||
<div class="sidebar-footer"><div class="user-card"><div class="user-av">AS</div><div style="flex:1;min-width:0"><div class="user-name">Arjun Sharma</div><div class="user-role">Asset Manager</div></div></div></div>
|
||
</aside>
|
||
|
||
<div class="main-wrapper">
|
||
<header class="topbar">
|
||
<div class="topbar-left"><div class="topbar-title">Reports & Audit</div></div>
|
||
<div class="topbar-actions">
|
||
<button class="btn btn-secondary btn-sm" onclick="exportAll()">📥 Export All Reports</button>
|
||
<a href="index.html" class="icon-btn">🚪</a>
|
||
</div>
|
||
</header>
|
||
|
||
<main class="content">
|
||
<!-- Report Cards Grid -->
|
||
<div class="grid-3 mb-5" id="reportCards"></div>
|
||
|
||
<!-- Tabs -->
|
||
<div class="tab-container">
|
||
<div class="tabs" data-group="rpt">
|
||
<button class="tab-btn active" data-tab="tab-depreciation" data-group="rpt">💰 Depreciation Schedule</button>
|
||
<button class="tab-btn" data-tab="tab-utilization" data-group="rpt">📊 Utilization</button>
|
||
<button class="tab-btn" data-tab="tab-financial" data-group="rpt">🏦 Financial Summary</button>
|
||
<button class="tab-btn" data-tab="tab-compliance" data-group="rpt">🔍 Compliance</button>
|
||
</div>
|
||
|
||
<!-- Depreciation Schedule -->
|
||
<div class="tab-content active" id="tab-depreciation" data-group="rpt">
|
||
<div class="card mb-4">
|
||
<div class="card-header">
|
||
<span class="card-title">💰 Depreciation Schedule — FY 2025-26</span>
|
||
<div class="flex gap-2">
|
||
<select class="filter-sel"><option>All Methods</option><option>SLM</option><option>WDV</option></select>
|
||
<button class="btn btn-primary btn-sm" onclick="genDepReport()">Generate PDF</button>
|
||
<button class="btn btn-secondary btn-sm" onclick="exportDep()">📥 CSV</button>
|
||
</div>
|
||
</div>
|
||
<div class="card-body">
|
||
<div class="grid-4 mb-4">
|
||
<div class="stat-card" style="--sc-color:var(--primary)"><div class="stat-icon" style="background:var(--primary-glow);color:var(--primary)">📦</div><div class="stat-label">Gross Block</div><div class="stat-value" style="color:var(--primary)">₹4.29Cr</div></div>
|
||
<div class="stat-card" style="--sc-color:var(--danger)"><div class="stat-icon" style="background:var(--danger-bg);color:var(--danger)">📉</div><div class="stat-label">Acc. Depreciation</div><div class="stat-value" style="color:var(--danger)">₹1.28Cr</div></div>
|
||
<div class="stat-card" style="--sc-color:var(--success)"><div class="stat-icon" style="background:var(--success-bg);color:var(--success)">💎</div><div class="stat-label">Net Block</div><div class="stat-value" style="color:var(--success)">₹3.01Cr</div></div>
|
||
<div class="stat-card" style="--sc-color:var(--warning)"><div class="stat-icon" style="background:var(--warning-bg);color:var(--warning)">📅</div><div class="stat-label">FY Dep. Charge</div><div class="stat-value" style="color:var(--warning)">₹52.4L</div></div>
|
||
</div>
|
||
<div class="table-wrapper">
|
||
<table class="data-table">
|
||
<thead><tr><th>Asset ID</th><th>Asset Name</th><th>Category</th><th>Gross Cost</th><th>Method</th><th>Rate</th><th>Acc. Dep.</th><th>Net Value</th><th>Dep. (FY)</th><th>Useful Life Left</th></tr></thead>
|
||
<tbody id="depTbody"></tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Utilization -->
|
||
<div class="tab-content" id="tab-utilization" data-group="rpt">
|
||
<div class="grid-2 mb-4">
|
||
<div class="card">
|
||
<div class="card-header"><span class="card-title">📊 Asset Utilization by Department</span></div>
|
||
<div class="card-body"><canvas id="utilDeptChart" height="240"></canvas></div>
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header"><span class="card-title">📈 Utilization Rate by Category</span></div>
|
||
<div class="card-body"><canvas id="utilCatChart" height="240"></canvas></div>
|
||
</div>
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header"><span class="card-title">😴 Idle Assets Report — 30+ Days</span>
|
||
<button class="btn btn-secondary btn-sm" onclick="showToast('Export','Idle assets list exported','info')">📥 Export</button>
|
||
</div>
|
||
<div class="card-body">
|
||
<div class="table-wrapper">
|
||
<table class="data-table">
|
||
<thead><tr><th>Asset</th><th>Category</th><th>Dept</th><th>Last Assigned</th><th>Idle Since</th><th>Net Value</th><th>Recommendation</th></tr></thead>
|
||
<tbody id="idleTbody"></tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Financial -->
|
||
<div class="tab-content" id="tab-financial" data-group="rpt">
|
||
<div class="grid-2 mb-4">
|
||
<div class="card">
|
||
<div class="card-header"><span class="card-title">💰 Capex vs Opex (Last 12 Months)</span></div>
|
||
<div class="card-body"><canvas id="capexChart" height="240"></canvas></div>
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header"><span class="card-title">📊 Asset Value by Department</span></div>
|
||
<div class="card-body"><canvas id="deptValueChart" height="240"></canvas></div>
|
||
</div>
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header"><span class="card-title">💳 Budget vs Actual Spend</span></div>
|
||
<div class="card-body">
|
||
<div class="table-wrapper">
|
||
<table class="data-table">
|
||
<thead><tr><th>Department</th><th>FY Budget</th><th>Spent YTD</th><th>Balance</th><th>Utilization %</th></tr></thead>
|
||
<tbody id="budgetTbody"></tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Compliance -->
|
||
<div class="tab-content" id="tab-compliance" data-group="rpt">
|
||
<div class="grid-2 mb-4">
|
||
<div class="card">
|
||
<div class="card-header"><span class="card-title">✅ Audit Checklist — Pre-Launch</span></div>
|
||
<div class="card-body" id="auditChecklist"></div>
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header"><span class="card-title">📊 Compliance Score</span></div>
|
||
<div class="card-body" style="text-align:center">
|
||
<div style="position:relative;display:inline-block;margin:20px auto">
|
||
<canvas id="complianceGauge" width="200" height="200"></canvas>
|
||
<div style="position:absolute;top:50%;left:50%;transform:translate(-50%,-40%);text-align:center">
|
||
<div style="font-size:34px;font-weight:800;color:var(--success)">98.4%</div>
|
||
<div style="font-size:12px;color:var(--text-muted)">Compliance Score</div>
|
||
</div>
|
||
</div>
|
||
<div class="info-grid" style="margin-top:12px">
|
||
<div class="info-item"><div class="info-label">Verified Assets</div><div class="info-value" style="color:var(--success)">1,228 / 1,247</div></div>
|
||
<div class="info-item"><div class="info-label">Unverified</div><div class="info-value" style="color:var(--danger)">19</div></div>
|
||
<div class="info-item"><div class="info-label">Warranty Coverage</div><div class="info-value">84.6%</div></div>
|
||
<div class="info-item"><div class="info-label">Insured Assets</div><div class="info-value">62.3%</div></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</main>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="toast-container" id="toastContainer"></div>
|
||
<script src="js/data.js"></script>
|
||
<script src="js/app.js"></script>
|
||
<script>
|
||
const reportDefs = [
|
||
{ icon:'💰', title:'Depreciation Schedule', desc:'SLM/WDV depreciation for all assets. Year-wise breakdown with opening and closing values.', color:'var(--primary)', bg:'var(--primary-glow)', tab:'tab-depreciation' },
|
||
{ icon:'📊', title:'Asset Utilization Report', desc:'Assigned vs idle assets by dept. & category. Highlights under-utilized and idle assets.', color:'var(--cyan)', bg:'var(--cyan-glow)', tab:'tab-utilization' },
|
||
{ icon:'📦', title:'Physical Audit Report', desc:'Comparison of system records vs physical count. Discrepancy list with status.', color:'var(--warning)', bg:'var(--warning-bg)', tab:'tab-compliance' },
|
||
{ icon:'💳', title:'Capital Expenditure Report', desc:'Asset acquisitions by period, vendor, category. Budget vs actual spend analysis.', color:'var(--success)', bg:'var(--success-bg)', tab:'tab-financial' },
|
||
{ icon:'🗑️', title:'Disposal & Write-off Report',desc:'All disposed assets with reason, approval chain, write-off amount, and accounting entries.', color:'var(--danger)', bg:'var(--danger-bg)', tab:'tab-financial' },
|
||
{ icon:'🔧', title:'Maintenance Cost Report', desc:'Ticket-wise maintenance spend, vendor-wise costs, preventive vs reactive breakdown.', color:'var(--purple)', bg:'var(--purple-bg)', tab:'tab-utilization' },
|
||
{ icon:'📅', title:'Warranty Expiry Forecast', desc:'Assets whose warranty expires in next 30/60/90 days. Action alerts.', color:'var(--warning)', bg:'var(--warning-bg)', tab:'tab-compliance' },
|
||
{ icon:'🏦', title:'Asset Register (Trial Balance)',desc:'Complete asset register as required by Companies Act / Income Tax for audit purposes.', color:'var(--info)', bg:'var(--info-bg)', tab:'tab-depreciation' },
|
||
{ icon:'🔄', title:'Asset Movement Report', desc:'All transfers, assignments, and returns in selected period.', color:'var(--cyan)', bg:'var(--cyan-glow)', tab:'tab-utilization' }
|
||
];
|
||
|
||
document.addEventListener('DOMContentLoaded', () => {
|
||
renderReportCards();
|
||
renderDepreciation();
|
||
renderUtilization();
|
||
renderFinancial();
|
||
renderCompliance();
|
||
initCharts();
|
||
initTabs();
|
||
});
|
||
|
||
function renderReportCards() {
|
||
document.getElementById('reportCards').innerHTML = reportDefs.map(r=>`
|
||
<div class="report-card" onclick="jumpToTab('${r.tab}')">
|
||
<div class="report-icon" style="background:${r.bg};color:${r.color}">${r.icon}</div>
|
||
<div class="report-title">${r.title}</div>
|
||
<div class="report-desc">${r.desc}</div>
|
||
<div class="flex gap-2 mt-3">
|
||
<button class="btn btn-ghost btn-sm" style="font-size:11px;color:${r.color}" onclick="event.stopPropagation();genReport('${r.title}')">📄 Generate</button>
|
||
<button class="btn btn-ghost btn-sm" style="font-size:11px" onclick="event.stopPropagation();exportReport('${r.title}')">📥 Export CSV</button>
|
||
</div>
|
||
</div>`).join('');
|
||
}
|
||
|
||
function jumpToTab(tabId) {
|
||
const btn = document.querySelector(`[data-tab="${tabId}"]`);
|
||
if(btn) btn.click();
|
||
window.scrollTo(0,400);
|
||
}
|
||
|
||
function renderDepreciation() {
|
||
document.getElementById('depTbody').innerHTML = AMS.assets.slice(0,15).map(a => {
|
||
const years = Math.floor((new Date()-new Date(a.purchase))/(365.25*24*3600*1000));
|
||
const accDep = a.cost - a.value;
|
||
const fyDep = a.depM==='SLM' ? Math.round(a.cost*a.depR/100) : Math.round(a.value*a.depR/100);
|
||
const lifeLeft = Math.max(0, Math.ceil((a.value - a.cost*0.05) / Math.max(1,fyDep)));
|
||
return `<tr>
|
||
<td><code style="font-size:11px;color:var(--primary-light)">${a.id}</code></td>
|
||
<td><div style="font-weight:600;color:var(--text-primary)">${a.name}</div></td>
|
||
<td><span class="badge badge-neutral" style="font-size:9.5px">${a.cat}</span></td>
|
||
<td>${fmt(a.cost)}</td>
|
||
<td><span class="badge ${a.depM==='SLM'?'badge-info':'badge-purple'}">${a.depM}</span></td>
|
||
<td>${a.depR}%</td>
|
||
<td style="color:var(--danger)">${fmt(accDep)}</td>
|
||
<td style="font-weight:700;color:var(--success)">${fmt(a.value)}</td>
|
||
<td style="color:var(--warning)">${fmt(fyDep)}</td>
|
||
<td>${lifeLeft} yr${lifeLeft!==1?'s':''}</td>
|
||
</tr>`;
|
||
}).join('');
|
||
}
|
||
|
||
function renderUtilization() {
|
||
const idles = AMS.assets.filter(a=>a.status==='Idle');
|
||
document.getElementById('idleTbody').innerHTML = idles.map(a=>`
|
||
<tr>
|
||
<td><div style="font-weight:600;color:var(--text-primary)">${a.name}</div></td>
|
||
<td><span class="badge badge-neutral">${a.cat}</span></td>
|
||
<td>${a.dept}</td>
|
||
<td>${fmtDate(a.purchase)}</td>
|
||
<td style="color:var(--warning)">90+ days</td>
|
||
<td style="font-weight:700">${fmt(a.value)}</td>
|
||
<td><span class="badge badge-info">Reallocate</span></td>
|
||
</tr>`).join('');
|
||
}
|
||
|
||
function renderFinancial() {
|
||
const budgets = [
|
||
{ dept:'IT', budget:1500000, spent:1124000 },
|
||
{ dept:'Finance', budget:400000, spent:287000 },
|
||
{ dept:'HR', budget:350000, spent:198000 },
|
||
{ dept:'Operations',budget:800000, spent:643000 },
|
||
{ dept:'Marketing', budget:600000, spent:524000 },
|
||
{ dept:'Admin', budget:500000, spent:312000 }
|
||
];
|
||
document.getElementById('budgetTbody').innerHTML = budgets.map(b=>{
|
||
const pct = Math.round(b.spent/b.budget*100);
|
||
return `<tr>
|
||
<td style="font-weight:600;color:var(--text-primary)">${b.dept}</td>
|
||
<td>${fmt(b.budget)}</td>
|
||
<td style="color:var(--warning)">${fmt(b.spent)}</td>
|
||
<td style="color:${b.budget-b.spent>0?'var(--success)':'var(--danger)'}">${fmt(b.budget-b.spent)}</td>
|
||
<td>
|
||
<div class="flex items-center gap-2">
|
||
<div class="progress-wrap flex-1" style="height:6px"><div class="progress-fill" style="width:${pct}%;background:${pct>90?'linear-gradient(90deg,var(--warning),var(--danger))':'linear-gradient(90deg,var(--primary),var(--cyan))'}"></div></div>
|
||
<span style="font-size:12px;font-weight:700;min-width:32px">${pct}%</span>
|
||
</div>
|
||
</td>
|
||
</tr>`;
|
||
}).join('');
|
||
}
|
||
|
||
function renderCompliance() {
|
||
const checks = [
|
||
{ label:'All assets have unique Asset IDs', done:true },
|
||
{ label:'All IT assets have serial numbers', done:true },
|
||
{ label:'QR codes generated for all assets', done:true },
|
||
{ label:'Physical audit completed within last 6 months', done:false },
|
||
{ label:'Depreciation schedule up to date', done:true },
|
||
{ label:'All vehicles have valid insurance', done:false },
|
||
{ label:'Warranty tracking active for all assets', done:true },
|
||
{ label:'Disposal records maintained with approvals',done:true },
|
||
{ label:'RBAC roles assigned to all users', done:true },
|
||
{ label:'Backup of asset data taken this month', done:true }
|
||
];
|
||
document.getElementById('auditChecklist').innerHTML = checks.map(c=>`
|
||
<div class="flex items-center gap-3 mb-3">
|
||
<div style="width:22px;height:22px;border-radius:50%;background:${c.done?'var(--success-bg)':'var(--danger-bg)'};color:${c.done?'var(--success)':'var(--danger)'};display:flex;align-items:center;justify-content:center;font-size:12px;flex-shrink:0">${c.done?'✓':'✕'}</div>
|
||
<span style="font-size:13px;color:${c.done?'var(--text-secondary)':'var(--text-primary)'};">${c.label}</span>
|
||
${!c.done?`<span class="badge badge-danger" style="margin-left:auto;font-size:9px">Action Needed</span>`:''}
|
||
</div>`).join('');
|
||
}
|
||
|
||
function initCharts() {
|
||
const gridColor='rgba(255,255,255,.04)', tick={color:'#4B5563',font:{family:'Inter',size:11}};
|
||
|
||
// Dept Utilization
|
||
new Chart(document.getElementById('utilDeptChart'),{type:'bar',data:{labels:['IT','Finance','HR','Operations','Marketing','Admin'],
|
||
datasets:[{label:'Assigned',data:[340,130,98,265,172,95],backgroundColor:'rgba(99,102,241,.7)',borderRadius:4},{label:'Idle',data:[44,26,14,33,15,15],backgroundColor:'rgba(245,158,11,.5)',borderRadius:4}]},
|
||
options:{responsive:true,maintainAspectRatio:false,plugins:{legend:{labels:{color:'#94A3B8',font:{family:'Inter',size:11},usePointStyle:true}}},scales:{x:{stacked:true,grid:{color:gridColor},ticks:tick},y:{stacked:true,grid:{color:gridColor},ticks:tick}}}});
|
||
|
||
// Category Utilization
|
||
new Chart(document.getElementById('utilCatChart'),{type:'bar',data:{labels:AMS.categories.slice(0,7).map(c=>c.name),
|
||
datasets:[{label:'Utilization %',data:[95,87,100,78,92,85,72],backgroundColor:AMS.categories.slice(0,7).map((_,i)=>`hsl(${230+i*15},70%,60%)`),borderRadius:5}]},
|
||
options:{responsive:true,maintainAspectRatio:false,plugins:{legend:{display:false}},scales:{x:{grid:{color:gridColor},ticks:{...tick,maxRotation:45}},y:{grid:{color:gridColor},ticks:{...tick,callback:v=>v+'%'},max:100}}}});
|
||
|
||
// Capex Chart
|
||
const months=['Jun','Jul','Aug','Sep','Oct','Nov','Dec','Jan','Feb','Mar','Apr','May'];
|
||
new Chart(document.getElementById('capexChart'),{type:'line',data:{labels:months,datasets:[
|
||
{label:'Capex',data:[280000,150000,420000,180000,310000,95000,580000,220000,165000,340000,495000,285000],borderColor:'#6366F1',backgroundColor:'rgba(99,102,241,.1)',fill:true,tension:.4,pointRadius:3,borderWidth:2},
|
||
{label:'Opex (Maintenance)',data:[45000,62000,38000,71000,55000,88000,42000,95000,61000,73000,82000,67000],borderColor:'#10B981',backgroundColor:'rgba(16,185,129,.08)',fill:true,tension:.4,pointRadius:3,borderWidth:2}
|
||
]},options:{responsive:true,maintainAspectRatio:false,plugins:{legend:{labels:{color:'#94A3B8',font:{family:'Inter',size:11},usePointStyle:true}}},scales:{x:{grid:{color:gridColor},ticks:tick},y:{grid:{color:gridColor},ticks:{...tick,callback:v=>'₹'+(v/1000).toFixed(0)+'K'}}}}});
|
||
|
||
// Dept Value
|
||
new Chart(document.getElementById('deptValueChart'),{type:'doughnut',data:{labels:['IT','Finance','HR','Operations','Marketing','Admin'],
|
||
datasets:[{data:[15800000,6200000,4100000,8900000,5400000,2700000],backgroundColor:['#6366F1','#06B6D4','#A855F7','#10B981','#F59E0B','#3B82F6'],borderColor:'rgba(19,25,38,0)',hoverOffset:5}]},
|
||
options:{responsive:true,maintainAspectRatio:false,cutout:'60%',plugins:{legend:{position:'right',labels:{color:'#94A3B8',font:{family:'Inter',size:11},usePointStyle:true}}}}});
|
||
|
||
// Compliance Gauge
|
||
const ctx=document.getElementById('complianceGauge').getContext('2d');
|
||
new Chart(ctx,{type:'doughnut',data:{datasets:[{data:[98.4,1.6],backgroundColor:['#10B981','rgba(239,68,68,.2)'],borderColor:'rgba(19,25,38,0)',borderWidth:0}]},
|
||
options:{responsive:false,cutout:'72%',plugins:{legend:{display:false}}}});
|
||
}
|
||
|
||
function genReport(name) { showToast('Generating PDF',`${name} PDF report being prepared…`,'info'); }
|
||
function exportReport(name) { showToast('Export',`${name} exported to CSV`,'success'); }
|
||
function genDepReport() { showToast('PDF Generated','Depreciation Schedule PDF ready for download','success'); }
|
||
function exportDep() { downloadCSV(AMS.assets.map(a=>({ID:a.id,Name:a.name,Cat:a.cat,Cost:a.cost,Method:a.depM,Rate:a.depR+'%',AccDep:a.cost-a.value,NetValue:a.value})),'depreciation_schedule.csv'); }
|
||
function exportAll() { showToast('Bulk Export','All reports being packaged as ZIP…','info'); }
|
||
</script>
|
||
</body>
|
||
</html>
|