{"id":512,"date":"2026-05-07T12:07:40","date_gmt":"2026-05-07T10:07:40","guid":{"rendered":"https:\/\/flyaerolloydvirtual.com\/?page_id=512"},"modified":"2026-05-07T12:07:40","modified_gmt":"2026-05-07T10:07:40","slug":"live-map","status":"publish","type":"page","link":"https:\/\/flyaerolloydvirtual.com\/de\/live-map\/","title":{"rendered":"Live Map"},"content":{"rendered":"\n<div id=\"aeroLiveWrap\" style=\"font-family:'Segoe UI',Arial,sans-serif;max-width:1600px;margin:0 auto;\">\n\n<style>\n\/* \u2500\u2500 MAP \u2500\u2500 *\/\n#aeroMapWrap{position:relative;border-radius:10px;overflow:hidden;box-shadow:0 8px 32px rgba(0,0,0,.4);margin-bottom:24px;}\n#aeroMapBar{background:linear-gradient(135deg,#2D297A,#1a1836);padding:11px 20px;display:flex;justify-content:space-between;align-items:center;}\n#aeroMapBar .bar-l{display:flex;align-items:center;gap:14px;}\n#aeroMapBar .bar-title{color:#fff;font-size:15px;font-weight:700;letter-spacing:.5px;}\n#aeroMapBar .bar-sub{color:#8A90C0;font-size:11px;margin-top:2px;}\n#aeroMapInfoBox{background:rgba(0,0,0,.65);border-radius:7px;padding:9px 16px;text-align:right;min-width:240px;backdrop-filter:blur(6px);border:1px solid rgba(255,255,255,.07);}\n#mapFlight{color:#F2A900;font-size:17px;font-weight:700;font-family:'Courier New',monospace;}\n#mapRoute{color:#aac4ff;font-size:12px;margin:3px 0;}\n#mapDetail{color:#666;font-size:11px;}\n#aeroMap{height:620px;width:100%;}\n#aeroMapFooter{display:none;}\n#mapStatusDot{display:inline-block;width:8px;height:8px;border-radius:50%;background:#444;margin-right:7px;vertical-align:middle;}\n#mapStatusDot.active{background:#4ade80;box-shadow:0 0 6px #4ade80;animation:pulse 2s infinite;}\n@keyframes pulse{0%,100%{opacity:1;}50%{opacity:.4;}}\n#mapStatusTxt{color:#888;font-size:11px;font-family:'Courier New',monospace;}\n#mapUpdated{color:#555;font-size:10px;font-family:'Courier New',monospace;}\n\n\/* \u2500\u2500 FIDS WRAPPER \u2500\u2500 *\/\n#aeroFIDSWrap{display:grid;grid-template-columns:1fr;gap:20px;}\n\n\/* \u2500\u2500 FIDS BOARD \u2500\u2500 *\/\n.fids{background:#0d0d14;border-radius:10px;overflow:hidden;box-shadow:0 4px 24px rgba(0,0,0,.5);border:1px solid #1a1a2e;}\n.fids-hd{background:#111120;padding:0;border-bottom:3px solid #1a1a2e;}\n.fids-hd-top{display:flex;justify-content:space-between;align-items:center;padding:13px 20px 10px;}\n.fids-hd-label{color:#F2A900;font-size:13px;font-weight:700;letter-spacing:3px;font-family:'Courier New',monospace;}\n.fids-hd-airport{color:#fff;font-size:17px;font-weight:700;font-family:'Courier New',monospace;}\n.fids-hd-time{color:#555;font-size:13px;font-family:'Courier New',monospace;text-align:right;}\n.fids-hd-time span{display:block;color:#888;font-size:11px;}\n.fids-cols-bar{background:#090910;display:grid;padding:6px 20px;font-size:9px;font-weight:700;letter-spacing:.12em;color:#444;font-family:'Courier New',monospace;text-transform:uppercase;}\n.fids-cols-dep{grid-template-columns:90px 1fr 70px 70px 60px 130px;}\n.fids-cols-arr{grid-template-columns:90px 1fr 70px 70px 70px 130px;}\n.fids-rows{max-height:460px;overflow-y:auto;}\n.fids-row{display:grid;padding:11px 20px;border-bottom:1px solid #111;align-items:center;transition:background .15s;}\n.fids-row:hover{background:#0f0f1e;}\n.fids-row-dep{grid-template-columns:90px 1fr 70px 70px 60px 130px;}\n.fids-row-arr{grid-template-columns:90px 1fr 70px 70px 70px 130px;}\n.fids-fn{color:#F2A900;font-weight:700;font-size:13px;font-family:'Courier New',monospace;}\n.fids-cs{color:#3a3a5c;font-size:10px;font-family:'Courier New',monospace;display:block;margin-top:1px;}\n.fids-airport{color:#e0e0ff;font-size:12px;font-family:'Courier New',monospace;font-weight:600;}\n.fids-time{color:#8888aa;font-size:13px;font-family:'Courier New',monospace;}\n.fids-time.actual{color:#fff;}\n.fids-gate{color:#5566aa;font-size:13px;font-family:'Courier New',monospace;font-weight:600;}\n.fids-empty{color:#2a2a3a;text-align:center;padding:30px;font-family:'Courier New',monospace;font-size:12px;letter-spacing:.1em;}\n\n\/* \u2500\u2500 SOLARI SPLIT-FLAP BOARD \u2500\u2500 *\/\n#aeroSolari {\n    background:#0a0a0a;\n    border-radius:10px;\n    overflow:hidden;\n    box-shadow:0 8px 40px rgba(0,0,0,.8);\n    border:2px solid #1a1a1a;\n    margin-top:20px;\n}\n#aeroSolariHd {\n    background:#111;\n    padding:12px 24px;\n    display:flex;justify-content:space-between;align-items:center;\n    border-bottom:3px solid #222;\n}\n#aeroSolariHd .sf-title {\n    color:#F2A900;font-size:12px;font-weight:700;\n    letter-spacing:4px;font-family:'Courier New',monospace;\n}\n#aeroSolariHd .sf-clock {\n    color:#F2A900;font-size:18px;font-weight:700;\n    font-family:'Courier New',monospace;letter-spacing:3px;\n}\n.sf-cols {\n    display:grid;\n    grid-template-columns:22px 100px 80px 140px 55px 1fr 65px 55px 130px;\n    gap:0;padding:6px 24px;\n    font-size:9px;font-weight:700;letter-spacing:.15em;\n    color:#333;font-family:'Courier New',monospace;\n    border-bottom:1px solid #1a1a1a;\n    text-transform:uppercase;\n}\n.sf-rows { min-height:60px; }\n.sf-row {\n    display:grid;\n    grid-template-columns:22px 100px 80px 140px 55px 1fr 65px 55px 130px;\n    gap:0;padding:5px 24px;\n    border-bottom:1px solid #111;\n    align-items:center;\n}\n.sf-row:last-child { border-bottom:none; }\n.sf-row > span[id^=\"sfarr\"],\n.sf-row > span[id^=\"sfeta\"] { justify-self:end; text-align:right; }\n\n\/* LED dot *\/\n.sf-led {\n    width:7px;height:7px;border-radius:50%;\n    display:inline-block;\n    background:#1a1a1a;\n}\n.sf-led.green  { background:#4ade80;box-shadow:0 0 6px #4ade80; }\n.sf-led.grey   { background:#2a2a2a; }\n.sf-led.led-a  { animation:sfBlinkA 1.2s infinite; }\n.sf-led.led-b  { animation:sfBlinkB 1.2s infinite; }\n@keyframes sfBlinkA { 0%,45%{opacity:1;box-shadow:0 0 6px currentColor;} 50%,95%{opacity:.1;box-shadow:none;} 100%{opacity:1;} }\n@keyframes sfBlinkB { 0%,45%{opacity:.1;box-shadow:none;} 50%,95%{opacity:1;box-shadow:0 0 6px currentColor;} 100%{opacity:.1;} }\n@keyframes sfPulse  { 0%,100%{opacity:1;} 50%{opacity:.3;} }\n\n\/* Split-flap characters *\/\n.sf-cell {\n    display:inline-flex;gap:1px;\n}\n.sf-cell.gate-cell {\n    justify-content:flex-end;\n    width:100%;\n}\n.sf-char {\n    display:inline-block;\n    width:13px;height:22px;\n    background:#111;\n    border:1px solid #1e1e1e;\n    border-radius:2px;\n    position:relative;overflow:hidden;\n    font-family:'Courier New',monospace;\n    font-size:14px;font-weight:700;\n    color:#F2A900;\n    text-align:center;line-height:22px;\n    box-shadow:inset 0 1px 0 rgba(255,255,255,.03),0 2px 4px rgba(0,0,0,.5);\n}\n.sf-char::after {\n    content:'';\n    position:absolute;top:50%;left:0;right:0;\n    height:1px;background:rgba(0,0,0,.6);\n    pointer-events:none;\n}\n.sf-char.flipping {\n    animation:sfFlip .35s ease-in-out;\n    transform-origin:center top;\n}\n@keyframes sfFlip {\n    0%   { transform:scaleY(1);  opacity:1; }\n    40%  { transform:scaleY(0);  opacity:0.3; }\n    60%  { transform:scaleY(0);  opacity:0.3; }\n    100% { transform:scaleY(1);  opacity:1; }\n}\n.sf-status {\n    display:flex;align-items:center;justify-content:flex-end;gap:6px;\n}\n.sf-status-txt {\n    font-family:'Courier New',monospace;\n    font-size:12px;font-weight:700;letter-spacing:.1em;\n}\n.sf-empty {\n    color:#222;text-align:center;padding:32px;\n    font-family:'Courier New',monospace;font-size:11px;letter-spacing:.2em;\n}\n\n@media(max-width:900px){\n    #aeroFIDSWrap{grid-template-columns:1fr;}\n    #aeroMap{height:340px;}\n    .sf-cols,.sf-row{grid-template-columns:16px 80px 55px 100px 45px 1fr 55px 45px 90px;}\n}\n<\/style>\n\n<!-- \u2550\u2550 MAP \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n<div id=\"aeroMapWrap\">\n    <div id=\"aeroMapBar\">\n        <div class=\"bar-l\">\n            <div>\n                <div class=\"bar-title\">AERO LLOYD VIRTUAL &nbsp;\u00b7&nbsp; LIVE OPERATIONS<\/div>\n                <div class=\"bar-sub\">Real-time Flight Tracking &nbsp;\u00b7&nbsp; 03 Jun 2026<\/div>\n            <\/div>\n        <\/div>\n        <div style=\"display:flex;align-items:center;gap:10px;\">\n            <!-- Map mode toggle -->\n            <div style=\"display:flex;gap:4px;\">\n                <button id=\"btnNight\"\n                    style=\"background:#2D297A;color:#fff;border:none;border-radius:4px;\n                           padding:4px 10px;font-size:10px;font-weight:700;cursor:pointer;\n                           font-family:'Segoe UI',sans-serif;letter-spacing:.05em;\">\n                    NIGHT\n                <\/button>\n                <button id=\"btnDay\"\n                    style=\"background:#333;color:#aaa;border:none;border-radius:4px;\n                           padding:4px 10px;font-size:10px;font-weight:700;cursor:pointer;\n                           font-family:'Segoe UI',sans-serif;letter-spacing:.05em;\">\n                    DAY\n                <\/button>\n                <button id=\"btnTerrain\"\n                    style=\"background:#333;color:#aaa;border:none;border-radius:4px;\n                           padding:4px 10px;font-size:10px;font-weight:700;cursor:pointer;\n                           font-family:'Segoe UI',sans-serif;letter-spacing:.05em;\">\n                    TERRAIN\n                <\/button>\n            <\/div>\n            <div id=\"aeroMapInfoBox\">\n                <div id=\"mapFlight\">\u2014\u2014<\/div>\n                <div id=\"mapRoute\" style=\"color:#8A90C0;\">Kein aktiver Flug<\/div>\n                <div id=\"mapDetail\">\u2014\u2014<\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n    <div id=\"aeroMap\"><\/div>\n    <div id=\"aeroMapFooter\">\n        <div>\n            <span id=\"mapStatusDot\"><\/span>\n            <span id=\"mapStatusTxt\">No active flight<\/span>\n        <\/div>\n        <div id=\"mapUpdated\">\u2014<\/div>\n    <\/div>\n<\/div>\n\n<!-- \u2550\u2550 SOLARI SPLIT-FLAP BOARD \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n<div id=\"aeroSolari\">\n    <div id=\"aeroSolariHd\">\n        <div class=\"sf-title\">\u2708 &nbsp; AERO LLOYD VIRTUAL &nbsp; \u00b7 &nbsp; TODAY'S OPERATIONS<\/div>\n        <div style=\"text-align:right;\">\n            <div class=\"sf-clock\" id=\"sfClock\" style=\"font-size:14px;color:#888;letter-spacing:2px;\">\u2014\u2014:\u2014\u2014 FRA<\/div>\n            <div style=\"font-family:'Courier New',monospace;color:#F2A900;margin-top:2px;letter-spacing:3px;\">\n                <span id=\"sfUTC\" style=\"font-size:22px;font-weight:700;\">\u2014\u2014:\u2014\u2014<\/span>\n                \n            <\/div>\n            <div style=\"font-family:'Courier New',monospace;font-size:9px;color:#555;margin-top:2px;letter-spacing:2px;\">\n                <span id=\"sfDate\">\u2014<\/span>\n            <\/div>\n        <\/div>\n    <\/div>\n    <div class=\"sf-cols\">\n        <span><\/span>\n        <span>FLIGHT<\/span>\n        <span>REG<\/span>\n        <span>DEPARTURE<\/span>\n        <span>GATE<\/span>\n        <span style=\"text-align:right;\">ARRIVAL<\/span>\n        <span style=\"text-align:right;\">ETA<\/span>\n        <span style=\"text-align:right;\">GATE<\/span>\n        <span style=\"text-align:right;\">STATUS<\/span>\n    <\/div>\n    <div class=\"sf-rows\" id=\"sfBoard\">\n        <div class=\"sf-empty\">NO FLIGHTS TODAY<\/div>\n    <\/div>\n<\/div>\n\n<\/div><!-- end wrap -->\n\n<link rel=\"stylesheet\" href=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.css\"\/>\n<script src=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.js\"><\/script>\n<script>\n(function(){\n\n\/\/ \u2500\u2500 MAP \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nvar map = L.map('aeroMap',{zoomControl:true,attributionControl:false}).setView([50.5,10],5);\n\nvar mapLayers = {\n    NIGHT:   L.tileLayer('https:\/\/{s}.basemaps.cartocdn.com\/dark_all\/{z}\/{x}\/{y}{r}.png',               {subdomains:'abcd',maxZoom:19}),\n    DAY:     L.tileLayer('https:\/\/{s}.basemaps.cartocdn.com\/light_all\/{z}\/{x}\/{y}{r}.png',              {subdomains:'abcd',maxZoom:19}),\n    TERRAIN: L.tileLayer('https:\/\/{s}.basemaps.cartocdn.com\/rastertiles\/voyager\/{z}\/{x}\/{y}{r}.png',    {subdomains:'abcd',maxZoom:19}),\n};\nvar activeMapLayer = mapLayers.NIGHT;\nactiveMapLayer.addTo(map);\nvar currentMode = 'NIGHT';\n\nfunction setMapMode(mode) {\n    if (!mapLayers[mode] || mode === currentMode) return;\n    map.removeLayer(activeMapLayer);\n    activeMapLayer = mapLayers[mode];\n    activeMapLayer.addTo(map);\n    currentMode = mode;\n    ['NIGHT','DAY','TERRAIN'].forEach(function(m){\n        var b = document.getElementById('btn'+m.charAt(0)+m.slice(1).toLowerCase());\n        if(!b) return;\n        b.style.background = m===mode ? '#2D297A' : '#333';\n        b.style.color      = m===mode ? '#fff'    : '#aaa';\n    });\n}\n\nvar planeSvg='<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"30\" height=\"30\" viewBox=\"0 0 64 64\" style=\"filter:drop-shadow(0 2px 8px rgba(247,108,30,.8))\">'\n+'<ellipse cx=\"32\" cy=\"32\" rx=\"5\" ry=\"22\" fill=\"#F76C1E\" stroke=\"white\" stroke-width=\"1.5\"\/>'\n+'<path d=\"M32 28 L4 44 L4 48 L32 40 L60 48 L60 44 Z\" fill=\"#F76C1E\" stroke=\"white\" stroke-width=\"1.5\"\/>'\n+'<path d=\"M32 50 L20 58 L20 60 L32 56 L44 60 L44 58 Z\" fill=\"#F76C1E\" stroke=\"white\" stroke-width=\"1.5\"\/>'\n+'<ellipse cx=\"32\" cy=\"12\" rx=\"4\" ry=\"5\" fill=\"#F2A900\" stroke=\"white\" stroke-width=\"1\"\/>'\n+'<\/svg>';\n\nvar markers = {}, routeLines = {}, trailLines = {}, trailPts = {};\nvar activeRegs = {};\n\nfunction getOrCreateMarker(reg, d) {\n    var ll = [d.latitude, d.longitude];\n    if (!markers[reg]) {\n        var icon = L.divIcon({\n            html:'<div class=\"liveAc\" style=\"transform:rotate(0deg);transform-origin:center;width:30px;height:30px;\">'+planeSvg+'<\/div>',\n            iconSize:[30,30],iconAnchor:[15,15],className:''\n        });\n        var m = L.marker(ll, {icon:icon}).addTo(map);\n        \/\/ Click popup\n        m.on('click', function() {\n            var orig = icaoShort[d.origin]      || d.origin      || '?';\n            var dest = icaoShort[d.destination] || d.destination || '?';\n            var ph   = _phaseNames[d.phase]     || '';\n\n            \/\/ ETA calculation\n            var etaStr = '\u2014';\n            if (d.ground_speed > 10 && airportCoords[d.destination]) {\n                var dc = airportCoords[d.destination];\n                var R  = 6371;\n                var dLat = (dc[0] - d.latitude)  * Math.PI \/ 180;\n                var dLon = (dc[1] - d.longitude) * Math.PI \/ 180;\n                var a = Math.sin(dLat\/2)*Math.sin(dLat\/2)\n                      + Math.cos(d.latitude*Math.PI\/180)*Math.cos(dc[0]*Math.PI\/180)\n                      * Math.sin(dLon\/2)*Math.sin(dLon\/2);\n                var distKm = R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));\n                var distNm = distKm \/ 1.852;\n                var etaMin = (distNm \/ d.ground_speed) * 60;\n                if (etaMin > 0 && etaMin < 1440) {\n                    var etaDt = new Date(Date.now() + etaMin * 60000);\n                    etaStr = etaDt.toUTCString().slice(17,22) + 'Z';\n                }\n            }\n\n            var content = '<div style=\"font-family:\\'Courier New\\',monospace;min-width:220px;\">'\n                + '<div style=\"font-size:14px;font-weight:700;color:#F2A900;margin-bottom:6px;\">'\n                + d.flight + '  &middot;  ' + d.registration + '<\/div>'\n                + '<div style=\"font-size:12px;color:#1a1a2e;margin-bottom:4px;\">'\n                + orig + ' &rarr; ' + dest + '<\/div>'\n                + '<div style=\"font-size:11px;color:#555;\">'\n                + 'FL' + Math.round(d.altitude\/100)\n                + '  &middot;  ' + d.ground_speed + ' kt'\n                + (ph ? '  &middot;  ' + ph : '')\n                + '<\/div>'\n                + '<div style=\"font-size:11px;color:#2D297A;margin-top:4px;font-weight:700;\">'\n                + 'ETA: ' + etaStr\n                + '<\/div>'\n                + '<\/div>';\n            m.bindPopup(content, {maxWidth:280}).openPopup();\n        });\n        markers[reg] = m;\n    }\n    return markers[reg];\n}\n\nfunction updateAircraft(d) {\n    var reg = d.registration;\n    var ll  = [d.latitude, d.longitude];\n    var m   = getOrCreateMarker(reg, d);\n    m.setLatLng(ll);\n    var el = m.getElement();\n    if (el) { var ac = el.querySelector('.liveAc'); if (ac) ac.style.transform = 'rotate('+d.heading+'deg)'; }\n\n    \/\/ Dashed route line (no destination label)\n    if (!routeLines[reg] && d.origin && d.destination && airportCoords[d.origin] && airportCoords[d.destination]) {\n        routeLines[reg] = L.polyline([airportCoords[d.origin], airportCoords[d.destination]],\n            {color:'#2D297A',weight:1.5,dashArray:'6,8',opacity:.5}).addTo(map);\n    }\n\n    if (!trailPts[reg]) trailPts[reg] = [];\n    trailPts[reg].push(ll);\n    if (trailPts[reg].length > 150) trailPts[reg].shift();\n    if (trailLines[reg]) map.removeLayer(trailLines[reg]);\n    trailLines[reg] = L.polyline(trailPts[reg], {color:'#F76C1E',weight:1.5,opacity:.4}).addTo(map);\n    activeRegs[reg] = Date.now();\n}\n\nfunction removeStaleAircraft(currentRegs) {\n    Object.keys(activeRegs).forEach(function(reg) {\n        if (currentRegs.indexOf(reg) === -1) {\n            if (markers[reg])    { map.removeLayer(markers[reg]);    delete markers[reg]; }\n            if (routeLines[reg]) { map.removeLayer(routeLines[reg]); delete routeLines[reg]; }\n            if (trailLines[reg]) { map.removeLayer(trailLines[reg]); delete trailLines[reg]; }\n            delete trailPts[reg];\n            delete activeRegs[reg];\n        }\n    });\n}\n\nvar airportCoords={\n    'EDDF':[50.0264,8.5431],'EDDH':[53.6304,9.9882],'LEPA':[39.5517,2.7388],\n    'LEIB':[38.8729,1.3731],'LEBL':[41.2974,2.0785],'GCFV':[28.4527,-13.8638],\n    'GCRR':[28.9455,-13.6052],'GCTS':[28.0445,-16.5726],'LGIR':[35.3397,25.1803],\n    'LGRP':[36.4054,28.0862],'LGKR':[39.6019,19.9117],'LGSR':[36.3992,25.4793],\n    'EGLL':[51.4775,-0.4614],'EGPH':[55.9500,-3.3725],'LIRN':[40.8860,14.2908],\n    'LFMN':[43.6584,7.2159],'LPMA':[32.6979,-16.7745],\n};\nvar icaoShort={\n    'EDDF':'Frankfurt a.M.','EDDH':'Hamburg','LEPA':'Palma de Mallorca',\n    'LEIB':'Ibiza','LEBL':'Barcelona','GCFV':'Fuerteventura',\n    'GCRR':'Lanzarote','GCTS':'Tenerife Sur','LGIR':'Heraklion',\n    'LGRP':'Rhodos','LGKR':'Korfu','LGSR':'Santorin',\n    'EGLL':'London Heathrow','EGPH':'Edinburgh','LIRN':'Neapel',\n    'LFMN':'Nizza','LPMA':'Funchal',\n};\nvar phaseNames=['Boarding','Taxi Out','Takeoff','Climb','Cruise','Descent','Approach','Landing','Taxi In','On Block'];\n\n\n\n\/\/ \u2500\u2500 Info Card Carousel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nvar _carouselPositions = [];\nvar _carouselIndex     = 0;\nvar _carouselTimer     = null;\nvar _phaseNames = ['Boarding','Taxi Out','Takeoff','Climbing','Cruise',\n                   'Descending','Approach','Landing','Taxi In','On Block'];\n\nfunction showCarouselSlide(idx) {\n    if (!_carouselPositions.length) return;\n    idx = ((idx % _carouselPositions.length) + _carouselPositions.length) % _carouselPositions.length;\n    _carouselIndex = idx;\n    var d    = _carouselPositions[idx];\n    var orig = icaoShort[d.origin]      || d.origin      || '?';\n    var dest = icaoShort[d.destination] || d.destination || '?';\n    var ph   = d.phase >= 0 ? (_phaseNames[d.phase] || '') : '';\n    var n    = _carouselPositions.length;\n    var el   = document.getElementById('mapFlight');\n    var er   = document.getElementById('mapRoute');\n    var ed   = document.getElementById('mapDetail');\n\n    \/\/ Fade out\n    [el, er, ed].forEach(function(e){ if(e) e.style.opacity = '0'; });\n\n    setTimeout(function(){\n        if (el) el.textContent = d.flight + '   ' + d.registration\n            + (n > 1 ? '   (' + (idx+1) + '\/' + n + ')' : '');\n        if (er) er.textContent = orig + ' \\u2192 ' + dest;\n        if (ed) ed.textContent = 'FL' + Math.round(d.altitude\/100)\n            + '  \\u00b7  ' + d.ground_speed + ' kt'\n            + (ph ? '  \\u00b7  ' + ph : '');\n        [el, er, ed].forEach(function(e){ if(e) e.style.transition='opacity .4s'; e.style.opacity='1'; });\n    }, 300);\n}\n\nfunction startCarousel(positions) {\n    _carouselPositions = positions;\n    if (_carouselTimer) clearInterval(_carouselTimer);\n    showCarouselSlide(0);\n    if (positions.length > 1) {\n        _carouselTimer = setInterval(function(){\n            showCarouselSlide(_carouselIndex + 1);\n        }, 10000);\n    }\n}\n\nfunction updateInfoCard(positions) {\n    if (!positions || positions.length === 0) {\n        if (_carouselTimer) { clearInterval(_carouselTimer); _carouselTimer = null; }\n        _carouselPositions = [];\n        document.getElementById('mapFlight').textContent = '\u2014\u2014';\n        document.getElementById('mapRoute').textContent  = 'Kein aktiver Flug';\n        document.getElementById('mapDetail').textContent = '\u2014\u2014';\n        document.getElementById('mapStatusDot').className = '';\n        document.getElementById('mapStatusTxt').textContent = 'No active flight';\n        document.getElementById('mapUpdated').textContent = '\u2014';\n        return;\n    }\n    startCarousel(positions);\n    var n = positions.length;\n    document.getElementById('mapStatusDot').className = 'active';\n    document.getElementById('mapStatusTxt').textContent = n > 1\n        ? n + ' pilots online'\n        : positions[0].flight + '  \\u00b7  '\n            + (icaoShort[positions[0].origin]||positions[0].origin)\n            + ' \\u2192 '\n            + (icaoShort[positions[0].destination]||positions[0].destination);\n    var t = new Date();\n    document.getElementById('mapUpdated').textContent =\n        'Updated ' + t.toLocaleTimeString('de-DE',{hour:'2-digit',minute:'2-digit',second:'2-digit'}) + ' UTC';\n}\n\nfunction fetchLive(){\n    fetch('https:\/\/flyaerolloydvirtual.com\/de\/wp-json\/nexus\/v1\/live')\n        .then(function(r){ return r.json(); })\n        .then(function(data){\n            var positions = data.positions || [];\n            var currentRegs = positions.map(function(p){ return p.registration; });\n            positions.forEach(function(d){\n                if (d.latitude && d.longitude) updateAircraft(d);\n            });\n            removeStaleAircraft(currentRegs);\n            updateInfoCard(positions.filter(function(p){ return p.latitude && p.longitude; }));\n        }).catch(function(){});\n}\n\n\/\/ \u2500\u2500 FIDS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction statusConfig(status){\n    var cfg={\n        'SCHEDULED':  {cls:'status-scheduled', txt:'SCHEDULED',  leds:''},\n        'GATE OPEN':  {cls:'status-gate-open', txt:'GATE OPEN',\n                       leds:'<span class=\"led led-green blink-green\"><\/span><span class=\"led led-green blink-green\"><\/span>'},\n        'BOARDING':   {cls:'status-boarding',  txt:'BOARDING',\n                       leds:'<span class=\"led led-amber blink-amber\"><\/span><span class=\"led led-amber blink-amber\"><\/span>'},\n        'FINAL CALL': {cls:'status-final-call',txt:'FINAL CALL',\n                       leds:'<span class=\"led led-red blink-red\"><\/span><span class=\"led led-red blink-red\"><\/span>'},\n        'IN FLIGHT':  {cls:'status-on-time',   txt:'IN FLIGHT',  leds:''},\n        'ARRIVED':    {cls:'status-landed',    txt:'ARRIVED',    leds:''},\n        'DIVERTED':   {cls:'status-delayed',   txt:'DIVERTED',   leds:''},\n        'DEPARTED':   {cls:'status-departed',  txt:'DEPARTED',   leds:''},\n        'SCHEDULED':  {cls:'status-scheduled', txt:'SCHEDULED',  leds:''},\n        'GATE OPEN':  {cls:'status-gate-open', txt:'GATE OPEN',  leds:''},\n        'BOARDING':   {cls:'status-boarding',  txt:'BOARDING',   leds:''},\n        'FINAL CALL': {cls:'status-final-call',txt:'FINAL CALL', leds:''},\n    };\n    return cfg[status]||{cls:'status-scheduled',txt:status,leds:''};\n}\n\n\/\/ \u2500\u2500 SPLIT-FLAP ENGINE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nvar CHARS = ' ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\u2192\u00b7\/-';\nvar sfState = {}; \/\/ tracks current char per element id\n\nfunction sfMakeCell(id, text, width, cls) {\n    var padded = text.toUpperCase().padEnd(width, ' ').substring(0, width);\n    var html = '<span class=\"sf-cell'+(cls?' '+cls:'')+'\" id=\"sfc-'+id+'\">';\n    for (var i = 0; i < width; i++) {\n        html += '<span class=\"sf-char\" id=\"sfc-'+id+'-'+i+'\">'+escHtml(padded[i])+'<\/span>';\n    }\n    return html + '<\/span>';\n}\n\n\/\/ \u2500\u2500 Solari flip sound (Web Audio API) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nvar _sfAudioCtx = null;\nfunction sfGetAudioCtx() {\n    if (!_sfAudioCtx) {\n        try { _sfAudioCtx = new (window.AudioContext || window.webkitAudioContext)(); } catch(e){}\n    }\n    return _sfAudioCtx;\n}\n\nfunction sfPlayClack(delayMs) {\n    var ctx = sfGetAudioCtx();\n    if (!ctx) return;\n    var when = ctx.currentTime + delayMs \/ 1000;\n    var bufSize = Math.floor(ctx.sampleRate * 0.055); \/\/ 55ms \u2014 slightly longer\n    var buf = ctx.createBuffer(1, bufSize, ctx.sampleRate);\n    var data = buf.getChannelData(0);\n    for (var i = 0; i < bufSize; i++) {\n        data[i] = (Math.random() * 2 - 1) * (1 - i \/ bufSize) * 0.9;\n    }\n    var src = ctx.createBufferSource();\n    src.buffer = buf;\n    var bpf = ctx.createBiquadFilter();\n    bpf.type = 'bandpass';\n    bpf.frequency.value = 1400; \/\/ slightly lower = more mechanical\n    bpf.Q.value = 0.6;\n    var gain = ctx.createGain();\n    gain.gain.value = 0.15;\n    src.connect(bpf);\n    bpf.connect(gain);\n    gain.connect(ctx.destination);\n    src.start(when);\n}\n\nfunction sfUpdate(id, newText, width) {\n    var padded = newText.toUpperCase().padEnd(width, ' ').substring(0, width);\n    var prev   = sfState[id] || ''.padEnd(width, ' ');\n    sfState[id] = padded;\n\n    for (var i = 0; i < width; i++) {\n        (function(idx) {\n            var el = document.getElementById('sfc-'+id+'-'+idx);\n            if (!el) return;\n            if (prev[idx] === padded[idx]) return;\n            var targetChar = padded[idx];\n            var delay = idx * 70; \/\/ slower \u2014 70ms per character\n            sfPlayClack(delay);\n            setTimeout(function() {\n                el.classList.add('flipping');\n                setTimeout(function() {\n                    el.textContent = targetChar;\n                    el.classList.remove('flipping');\n                }, 160); \/\/ match animation duration\n            }, delay);\n        })(i);\n    }\n}\n\nfunction escHtml(c) {\n    if (c === '<') return '&lt;';\n    if (c === '>') return '&gt;';\n    if (c === '&') return '&amp;';\n    return c;\n}\n\n\/\/ Status LED config\nfunction sfLed(status) {\n    var g = '<span class=\"sf-led green led-a\" style=\"margin-right:3px;\"><\/span><span class=\"sf-led green led-b\"><\/span>';\n    var r = '<span class=\"sf-led\" style=\"background:#C8102E;display:inline-block;width:7px;height:7px;border-radius:50%;margin-right:3px;box-shadow:0 0 5px #C8102E;\"><\/span><span class=\"sf-led\" style=\"background:#C8102E;display:inline-block;width:7px;height:7px;border-radius:50%;box-shadow:0 0 5px #C8102E;\"><\/span>';\n    var e = '<span class=\"sf-led grey\" style=\"margin-right:3px;opacity:0;\"><\/span><span class=\"sf-led grey\" style=\"opacity:0;\"><\/span>';\n    if (status === 'BOARDING')   return g;\n    if (status === 'DEPARTING')  return g;\n    if (status === 'GATE OPEN')  return g;\n    if (status === 'FINAL CALL') return g;\n    if (status === 'DIVERTED')   return r;\n    if (status === 'ARRIVED')    return e;\n    return e;\n}\n\nfunction sfStatusColor(status) {\n    var colors = {\n        'IN FLIGHT':  '#4ade80',\n        'ARRIVED':    '#555',\n        'DIVERTED':   '#C8102E',\n        'BOARDING':   '#4ade80',\n        'DEPARTING':  '#4ade80',\n        'GATE OPEN':  '#4ade80',\n        'FINAL CALL': '#F76C1E',\n        'LANDING':    '#4ade80',\n        'TAXI IN':    '#F2A900',\n        'DEPARTED':   '#333',\n        'SCHEDULED':  '#444',\n    };\n    return colors[status] || '#555';\n}\n\nfunction calcETA(f) {\n    if (!f.speed || f.speed < 10 || !f.dest_icao || !airportCoords[f.dest_icao]) return '\u2014';\n    var dc   = airportCoords[f.dest_icao];\n    var R    = 6371;\n    var dLat = (dc[0] - f.lat) * Math.PI \/ 180;\n    var dLon = (dc[1] - f.lon) * Math.PI \/ 180;\n    var a    = Math.sin(dLat\/2)*Math.sin(dLat\/2)\n             + Math.cos(f.lat*Math.PI\/180)*Math.cos(dc[0]*Math.PI\/180)\n             * Math.sin(dLon\/2)*Math.sin(dLon\/2);\n    var distNm = R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)) \/ 1.852;\n    var minLeft = (distNm \/ f.speed) * 60;\n    if (minLeft < 0 || minLeft > 1440) return '\u2014';\n    var eta = new Date(Date.now() + minLeft * 60000);\n    return eta.toUTCString().slice(17,22) + 'Z';\n}\n\nvar sfInitialized = false;\nvar sfLastData    = [];\n\nfunction renderFIDS(data) {\n    var board = document.getElementById('sfBoard');\n    if (!data.flights || !data.flights.length) {\n        board.innerHTML = '<div class=\"sf-empty\">NO FLIGHTS TODAY<\/div>';\n        sfInitialized = false;\n        sfLastData = [];\n        return;\n    }\n\n    if (!sfInitialized) {\n        \/\/ First render \u2014 build DOM with BLANK cells, then animate in\n        var html = '';\n        data.flights.forEach(function(f, i) {\n            html += '<div class=\"sf-row\" id=\"sfrow-'+i+'\">'\n                + '<div id=\"sfled-'+i+'\">' + sfLed('') + '<\/div>'\n                + sfMakeCell('fn'+i,       '', 8)\n                + sfMakeCell('reg'+i,      '', 6)\n                + '<span id=\"sfdep-'+i+'\" style=\"font-family:\\'Courier New\\',monospace;font-size:12px;font-weight:700;color:#F2A900;padding-left:12px;\"><\/span>'\n                + sfMakeCell('depgate'+i,  '', 4, 'gate-cell')\n                + '<span id=\"sfarr-'+i+'\" style=\"font-family:\\'Courier New\\',monospace;font-size:12px;font-weight:700;color:#aac4ff;text-align:right;\"><\/span>'\n                + '<span id=\"sfeta-'+i+'\" style=\"font-family:\\'Courier New\\',monospace;font-size:12px;color:#8888aa;text-align:right;padding-right:12px;\"><\/span>'\n                + sfMakeCell('arrgate'+i,  '', 4, 'gate-cell')\n                + '<div class=\"sf-status\" id=\"sfst-'+i+'\"><\/div>'\n                + '<\/div>';\n        });\n        board.innerHTML = html;\n        sfInitialized = true;\n        sfLastData = [];\n\n        \/\/ Animate each row in with staggered delay\n        data.flights.forEach(function(f, i) {\n            var rowDelay = i * 300;\n            setTimeout(function() {\n                \/\/ Flip in flight number + reg\n                sfUpdate('fn'+i,      f.flight||'',   8);\n                sfUpdate('reg'+i,     f.reg||'',      6);\n                var depEl = document.getElementById('sfdep-'+i);\n                if (depEl) depEl.textContent = f.dep||'';\n                sfUpdate('depgate'+i, f.dep_gate||'', 4);\n                var arrEl = document.getElementById('sfarr-'+i);\n                if (arrEl) arrEl.textContent = f.arr||'';\n                var etaEl = document.getElementById('sfeta-'+i);\n                if (etaEl) etaEl.textContent = calcETA(f);\n                sfUpdate('arrgate'+i, f.arr_gate||'', 4);\n                var ledEl = document.getElementById('sfled-'+i);\n                if (ledEl) ledEl.innerHTML = sfLed(f.status);\n                var stEl = document.getElementById('sfst-'+i);\n                if (stEl) {\n                    stEl.style.color = sfStatusColor(f.status);\n                    stEl.innerHTML = '<span style=\"font-family:\\'Courier New\\',monospace;font-size:12px;font-weight:700;letter-spacing:.1em;\">'+f.status+'<\/span>';\n                }\n            }, rowDelay);\n        });\n        sfLastData = data.flights;\n\n    } else {\n        \/\/ Update \u2014 animate only changed values\n        data.flights.forEach(function(f, i) {\n            var prev = sfLastData[i] || {};\n\n            \/\/ Update LED\n            if (prev.status !== f.status) {\n                var ledEl = document.getElementById('sfled-'+i);\n                if (ledEl) ledEl.innerHTML = sfLed(f.status);\n            }\n\n            \/\/ Update split-flap cells\n            if (prev.flight    !== f.flight)    sfUpdate('fn'+i,      f.flight||'',   8);\n            if (prev.reg       !== f.reg)       sfUpdate('reg'+i,     f.reg||'',      6);\n            if (prev.dep       !== f.dep)  { var de=document.getElementById('sfdep-'+i); if(de) de.textContent=f.dep||''; }\n            if (prev.dep_gate  !== f.dep_gate)  sfUpdate('depgate'+i, f.dep_gate||'', 4);\n            if (prev.arr       !== f.arr)  { var ae=document.getElementById('sfarr-'+i); if(ae) ae.textContent=f.arr||''; }\n            var etaEl = document.getElementById('sfeta-'+i);\n            if (etaEl) etaEl.textContent = calcETA(f);\n            if (prev.arr_gate  !== f.arr_gate)  sfUpdate('arrgate'+i, f.arr_gate||'', 4);\n            if (prev.route  !== f.route) {\n                var rtEl = document.getElementById('sfrt-'+i);\n                if (rtEl) rtEl.textContent = (f.route||'').replace(\/->\/g,'\\u2192');\n            }\n\n            \/\/ Update status\n            if (prev.status !== f.status) {\n                var stEl = document.getElementById('sfst-'+i);\n                if (stEl) {\n                    stEl.style.color = sfStatusColor(f.status);\n                    stEl.innerHTML = '<span style=\"font-family:\\'Courier New\\',monospace;font-size:12px;font-weight:700;letter-spacing:.1em;\">'+f.status+'<\/span>';\n                }\n            }\n        });\n        sfLastData = data.flights;\n    }\n}\n\nfunction fetchFIDS(){\n    fetch('https:\/\/flyaerolloydvirtual.com\/de\/wp-json\/nexus\/v1\/fids')\n        .then(r=>r.json()).then(function(d){ renderFIDS(d); })\n        .catch(function(){});\n}\n\n\/\/ \u2500\u2500 CLOCK \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nsetInterval(function(){\n    var now = new Date();\n    var fra = now.toLocaleTimeString('de-DE',{timeZone:'Europe\/Berlin',hour:'2-digit',minute:'2-digit'});\n    var utc = now.toLocaleTimeString('en-GB',{timeZone:'UTC',hour:'2-digit',minute:'2-digit'});\n    var dat = now.toLocaleDateString('en-GB',{timeZone:'UTC',day:'2-digit',month:'short',year:'numeric'}).toUpperCase();\n    var el  = document.getElementById('sfClock');\n    var eu  = document.getElementById('sfUTC');\n    var ed  = document.getElementById('sfDate');\n    if (el) el.textContent = fra + ' FRA LCL';\n    if (eu) eu.textContent = utc + 'Z';\n    if (ed) ed.textContent = dat;\n},1000);\n\n\/\/ \u2500\u2500 MAP MODE BUTTONS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\ndocument.getElementById('btnNight')  .addEventListener('click', function(){ setMapMode('NIGHT');   });\ndocument.getElementById('btnDay')    .addEventListener('click', function(){ setMapMode('DAY');     });\ndocument.getElementById('btnTerrain').addEventListener('click', function(){ setMapMode('TERRAIN'); });\n\n\/\/ Unlock Web Audio on first user interaction (browser requirement)\ndocument.addEventListener('click', function unlockAudio() {\n    var ctx = sfGetAudioCtx();\n    if (ctx && ctx.state === 'suspended') ctx.resume();\n    document.removeEventListener('click', unlockAudio);\n}, { once: true });\n\n\/\/ \u2500\u2500 INIT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfetchLive();  fetchFIDS();\nsetInterval(fetchLive, 30000);\nsetInterval(fetchFIDS, 60000);\n\n})();\n<\/script>\n    \n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-512","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/flyaerolloydvirtual.com\/de\/wp-json\/wp\/v2\/pages\/512","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/flyaerolloydvirtual.com\/de\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/flyaerolloydvirtual.com\/de\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/flyaerolloydvirtual.com\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/flyaerolloydvirtual.com\/de\/wp-json\/wp\/v2\/comments?post=512"}],"version-history":[{"count":1,"href":"https:\/\/flyaerolloydvirtual.com\/de\/wp-json\/wp\/v2\/pages\/512\/revisions"}],"predecessor-version":[{"id":513,"href":"https:\/\/flyaerolloydvirtual.com\/de\/wp-json\/wp\/v2\/pages\/512\/revisions\/513"}],"wp:attachment":[{"href":"https:\/\/flyaerolloydvirtual.com\/de\/wp-json\/wp\/v2\/media?parent=512"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}