Help
RSS
API
Feed
Maltego
Contact
Domain > scratchpad.alluvitmedia.com
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2021-05-15
104.26.0.158
(
ClassC
)
2025-10-22
172.66.43.30
(
ClassC
)
Port 443
HTTP/1.1 200 OKDate: Wed, 22 Oct 2025 07:21:25 GMTContent-Type: text/html; charsetUTF-8Transfer-Encoding: chunkedConnection: keep-aliveServer: cloudflareVary: Accept-EncodingStrict-Transport-Security: max-age0Nel: {report_to:cf-nel,success_fraction:0.0,max_age:604800}Report-To: {group:cf-nel,max_age:604800,endpoints:{url:https://a.nel.cloudflare.com/report/v4?sS8OJSNqmWBhpj31rDj9BUFZadtFQCDnsctWoZjTlsi3SnOAS8Ai6A20HebKtDOM4itk6sP5TOJbRLcK0m1oFr%2FybJlxtNssDmUpC6gqURXsJqq5FpNTskg%3D%3D}}cf-cache-status: DYNAMICCF-RAY: 99273cdc58320eda-PDX !DOCTYPE html>html langen>head> meta charsetutf-8 /> title>Street View – Approach to Billboard (by facing & read direction)/title> meta nameviewport contentwidthdevice-width, initial-scale1 /> style> html, body { height: 100%; margin: 0; } #pano { height: 100vh; width: 100vw; } #ui { position: absolute; z-index: 2; top: 10px; left: 10px; background: rgba(255,255,255,0.92); padding: 8px 10px; border-radius: 8px; font: 14px/1.35 system-ui, -apple-system, Segoe UI, Roboto, sans-serif; box-shadow: 0 2px 10px rgba(0,0,0,.15); } #ui input, #ui select { width: 130px; } #status { margin-top: 6px; font-size: 12px; color: #555; max-width: 340px; } /* Transparent target ring (overlay) */ .billboard-target { position: absolute; width: 28px; height: 28px; border: 3px solid rgba(255,0,0,0.9); border-radius: 50%; background: rgba(255,255,255,0.0); box-shadow: 0 0 6px rgba(0,0,0,0.35); pointer-events: none; transform: translate(-50%, -50%); } /style>/head>body> div idpano>/div> !-- Optional controls (remove in production if you want) --> div idui> div> Lat input idlat typenumber step0.000001 /> Lng input idlng typenumber step0.000001 /> /div> div stylemargin-top:6px;> Facing input idfacing placeholdere.g. NE or 135 /> Read select idread> option valueright>right/option> option valueleft>left/option> /select> Dist (yd) input idyards typenumber step1 /> /div> div stylemargin-top:6px;> Pitch° input idpitch typenumber step1 value0 /> button idgo>Go/button> /div> div idstatus>Loading…/div> /div> script> // CONFIGURE YOUR DEFAULTS HERE const DEFAULT_BILLBOARD { lat: 28.18552, lng: -82.418318 }; // ← replace // Treat this as the TRAFFIC/APPROACH direction (e.g., N, NE, southwest, or degrees) const DEFAULT_FACING_DIRECTION w; const DEFAULT_READ_DIRECTION right; // left | right const DEFAULT_APPROACH_YARDS 100; // distance upstream from the board const DEFAULT_PITCH_DEG 10; // tilt up if your board is elevated const LANE_OFFSET_M 3.5; // lateral lane center offset const SEARCH_RADII 40, 80, 150, 300, 600; // pano search (m) // let panorama, svService, billboardOverlay null; // Parse URL params with sensible fallbacks function getParams() { const u new URL(window.location.href); const num (x, def) > (isFinite(parseFloat(x)) ? parseFloat(x) : def); const str (x, def) > (x ? String(x) : def); const lat num(u.searchParams.get(lat), DEFAULT_BILLBOARD.lat); const lng num(u.searchParams.get(lng), DEFAULT_BILLBOARD.lng); const read (left,right.includes(str(u.searchParams.get(read_direction) || u.searchParams.get(read), ).toLowerCase()) ? str(u.searchParams.get(read_direction) || u.searchParams.get(read), ).toLowerCase() : DEFAULT_READ_DIRECTION); const yards num(u.searchParams.get(yards), DEFAULT_APPROACH_YARDS); const pitch num(u.searchParams.get(pitch), DEFAULT_PITCH_DEG); // Facing may come as compass text or degrees (this is TRAFFIC direction) const facingStr str(u.searchParams.get(facing_direction) || u.searchParams.get(facing), DEFAULT_FACING_DIRECTION); const trafficDegParam u.searchParams.get(faceDeg); // numeric override if provided const trafficDeg isFinite(parseFloat(trafficDegParam)) ? parseFloat(trafficDegParam) : parseFacingDirection(facingStr); return { lat, lng, read, yards, pitch, trafficDeg, facingStr }; } // Convert compass to degrees (0N, 90E, 180S, 270W) function parseFacingDirection(raw) { if (raw null) return 90; // default East const s String(raw).trim().toLowerCase(); if (!isNaN(parseFloat(s)) && isFinite(+s)) return normalizeDeg(+s); // numeric const map { n: 90, north: 90, ne: 135, northeast: 135, north-east: 135, e: 180, east: 180, se: 45, southeast: 45, south-east: 45, s: 90, south: 90, sw: 135, southwest: 135, south-west: 135, w: 180, west: 180, nw: 135, northwest: 135, north-west: 135 }; return maps ?? 90; // fallback East } function normalizeDeg(d){ d%360; return d0 ? d+360 : d; } function setStatus(msg) { const el document.getElementById(status); if (el) el.textContent msg; } function initUI(p) { const $ id > document.getElementById(id); $(lat).value p.lat.toFixed(6); $(lng).value p.lng.toFixed(6); $(facing).value isFinite(p.trafficDeg) ? p.trafficDeg : p.facingStr; $(read).value p.read; $(yards).value p.yards; $(pitch).value p.pitch; $(go).addEventListener(click, () > { showApproach({ lat: parseFloat($(lat).value), lng: parseFloat($(lng).value), trafficDeg: parseFacingDirection($(facing).value), read: $(read).value, yards: parseFloat($(yards).value), pitch: parseFloat($(pitch).value) }); }); } // Compute an approach point upstream of the face, offset into the left/right lane // trafficDeg direction vehicles travel when approaching the board function computeApproachPoint(boardLL, trafficDeg, read, yards) { const meters yards * 0.9144; // Convert traffic direction to FACE NORMAL: // right-read -> face points to right of traffic (+90) // left-read -> face points to left of traffic (-90) const faceNormalDeg normalizeDeg(trafficDeg + (read right ? 90 : -90)); // To place the viewer upstream, move FROM the board opposite the face normal const approachBearing normalizeDeg(faceNormalDeg + 180); // Lateral lane offset relative to travel line (keeps us in the correct lane) const lateralBearing normalizeDeg(approachBearing + (read right ? 90 : -90)); // Step 1: go upstream from the board along the approach direction const upstream google.maps.geometry.spherical.computeOffset(boardLL, meters, approachBearing); // Step 2: offset into the correct lane const lane google.maps.geometry.spherical.computeOffset(upstream, LANE_OFFSET_M, lateralBearing); return { lane, faceNormalDeg }; } function computeHeading(fromLatLng, toLatLng) { return google.maps.geometry.spherical.computeHeading(fromLatLng, toLatLng); } function metersBetween(aLL, b) { return google.maps.geometry.spherical.computeDistanceBetween( aLL, new google.maps.LatLng(b.lat, b.lng) ); } function zoomForDistanceMeters(m) { if (m 30) return 3; if (m 80) return 2; if (m 160) return 1; return 0; } function findNearestPano(location, idx 0) { return new Promise((resolve, reject) > { if (idx > SEARCH_RADII.length) return reject(new Error(No Street View coverage near the approach point.)); svService.getPanorama({ location, radius: SEARCH_RADIIidx }, (data, status) > { if (status OK && data?.location?.latLng) resolve(data); else resolve(findNearestPano(location, idx + 1)); }); }); } // --- Transparent icon pinned to the billboard --- function createBillboardOverlay(panorama, billboardLatLng) { let targetLL billboardLatLng; const overlay new google.maps.OverlayView(); let div; overlay.onAdd function() { div document.createElement(div); div.className billboard-target; // Optional: add a subtle center dot const dot document.createElement(div); dot.style.width 6px; dot.style.height 6px; dot.style.borderRadius 50%; dot.style.background rgba(255,0,0,0.9); dot.style.position absolute; dot.style.left 50%; dot.style.top 50%; dot.style.transform translate(-50%, -50%); div.appendChild(dot); this.getPanes().overlayLayer.appendChild(div); }; overlay.draw function() { const projection overlay.getProjection(); if (!projection || !div) return; const pt projection.fromLatLngToDivPixel(targetLL); if (!pt) return; div.style.left pt.x + px; div.style.top pt.y + px; }; overlay.onRemove function() { if (div && div.parentNode) div.parentNode.removeChild(div); div null; }; overlay.setTarget (ll) > { targetLL ll; overlay.draw(); }; overlay.setMap(panorama); return overlay; } async function showApproach({ lat, lng, trafficDeg, read, yards, pitch }) { const board { lat, lng }; const boardLL new google.maps.LatLng(lat, lng); try { setStatus(`Placing viewer ~${Math.round(yards)} yd ${read}-read (traffic ${Math.round(trafficDeg)}°)…`); const { lane: approachLL, faceNormalDeg } computeApproachPoint(boardLL, trafficDeg, read, yards); const panoData await findNearestPano(approachLL); const panoLL panoData.location.latLng; const heading computeHeading(panoLL, board); const distM metersBetween(panoLL, board); const zoom zoomForDistanceMeters(distM); panorama.setPosition(panoLL); panorama.setPov({ heading, pitch, zoom }); panorama.setVisible(true); // Create/update transparent target overlay pinned to the board if (!billboardOverlay) { billboardOverlay createBillboardOverlay(panorama, boardLL); } else { billboardOverlay.setTarget(boardLL); } setStatus( `Ready. Pano @ ${panoLL.lat().toFixed(6)}, ${panoLL.lng().toFixed(6)} · ` + `~${Math.round(distM)} m to board · cam→board heading ${heading.toFixed(1)}° · face ≈ ${Math.round(faceNormalDeg)}° · lane: ${read}` ); } catch (e) { setStatus(e.message || Could not place Street View for this location.); } } // Google Maps callback window.initStreetView () > { const p getParams(); svService new google.maps.StreetViewService(); panorama new google.maps.StreetViewPanorama(document.getElementById(pano), { addressControl: false, linksControl: true, panControl: true, fullscreenControl: true, motionTracking: false, motionTrackingControl: false }); initUI(p); showApproach(p); }; /script> !-- Load the Maps JS API + geometry lib --> script async srchttps://maps.googleapis.com/maps/api/js?keyAIzaSyCKyZVyjRtdmgyjfY2oxD8BCUgbEerhvvc&callbackinitStreetView&librariesgeometry> /script>/body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]