/** * Phoenix Digital Forensics Suite * Evidence Chain, Timeline Analysis, Hash Verification */ class PhoenixForensics extends HTMLElement { constructor() { super(); this.attachShadow({ mode: 'open' }); this.evidence = [ { id: 'EV-001', type: 'Memory Dump', size: '8.4 GB', hash: 'a1b2c3d4e5f6789...', status: 'VERIFIED', time: Date.now() - 3600000 }, { id: 'EV-002', type: 'Disk Image', size: '512 GB', hash: 'd4e5f6a1b2c3789...', status: 'ANALYZING', progress: 67, time: Date.now() - 7200000 }, { id: 'EV-003', type: 'Network PCAP', size: '2.1 GB', hash: 'g7h8i9j0k1l2789...', status: 'QUEUED', progress: 0, time: Date.now() - 10800000 }, { id: 'EV-004', type: 'Windows Logs', size: '124 MB', hash: 'm3n4o5p6q7r8789...', status: 'VERIFIED', time: Date.now() - 14400000 } ]; this.timeline = [ { time: '14:32:15', event: 'Initial Compromise', source: 'Proxy Logs', confidence: 99 }, { time: '14:35:42', event: 'Privilege Escalation', source: 'EDR Alert', confidence: 97 }, { time: '14:41:08', event: 'Lateral Movement', source: 'NetFlow', confidence: 94 }, { time: '14:48:33', event: 'Data Staging', source: 'DLP', confidence: 91 }, { time: '14:55:17', event: 'Exfiltration Attempt', source: 'Firewall', confidence: 88 } ]; } connectedCallback() { this.render(); this.startAnalysisSimulation(); } startAnalysisSimulation() { setInterval(() => { const analyzing = this.evidence.find(e => e.status === 'ANALYZING'); if (analyzing && analyzing.progress < 100) { analyzing.progress = Math.min(100, analyzing.progress + Math.floor(Math.random() * 5)); this.updateEvidence(); } }, 3000); } updateEvidence() { const container = this.shadowRoot.getElementById('evidence-list'); if (container) container.innerHTML = this.renderEvidenceItems(); } timeAgo(ms) { const m = Math.floor((Date.now() - ms) / 60000); if (m < 60) return `${m}m ago`; return `${Math.floor(m / 60)}h ago`; } renderEvidenceItems() { return this.evidence.map(ev => `